/** * External dependencies */ import { __, _n, sprintf } from '@wordpress/i18n'; import { Fragment, useMemo, useState } from '@wordpress/element'; import classNames from 'classnames'; import { CheckboxControl } from '@woocommerce/blocks-checkout'; /** * Internal dependencies */ import './style.scss'; interface CheckboxListOptions { label: React.ReactNode; value: string; } interface CheckboxListProps { className?: string | undefined; isLoading?: boolean | undefined; isDisabled?: boolean | undefined; limit?: number | undefined; checked?: string[] | undefined; onChange: ( value: string ) => void | undefined; options?: CheckboxListOptions[] | undefined; } /** * Component used to show a list of checkboxes in a group. * * @param {Object} props Incoming props for the component. * @param {string} props.className CSS class used. * @param {function(string):any} props.onChange Function called when inputs change. * @param {Array} props.options Options for list. * @param {Array} props.checked Which items are checked. * @param {boolean} props.isLoading If loading or not. * @param {boolean} props.isDisabled If inputs are disabled or not. * @param {number} props.limit Whether to limit the number of inputs showing. */ const CheckboxList = ( { className, onChange, options = [], checked = [], isLoading = false, isDisabled = false, limit = 10, }: CheckboxListProps ): JSX.Element => { const [ showExpanded, setShowExpanded ] = useState( false ); const placeholder = useMemo( () => { return [ ...Array( 5 ) ].map( ( x, i ) => (
) ); }, [] ); const renderedShowMore = useMemo( () => { const optionCount = options.length; const remainingOptionsCount = optionCount - limit; return ( ! showExpanded && (