import React, { memo, useCallback } from 'react'; import { useField } from 'formik'; import TitledGreyBox from '@/components/elements/TitledGreyBox'; import tw from 'twin.macro'; import Input from '@/components/elements/Input'; import isEqual from 'react-fast-compare'; interface Props { isEditable: boolean; title: string; permissions: string[]; className?: string; } const PermissionTitleBox: React.FC<Props> = memo(({ isEditable, title, permissions, className, children }) => { const [ { value }, , { setValue } ] = useField<string[]>('permissions'); const onCheckboxClicked = useCallback((e: React.ChangeEvent<HTMLInputElement>) => { if (e.currentTarget.checked) { setValue([ ...value, ...permissions.filter(p => !value.includes(p)), ]); } else { setValue(value.filter(p => !permissions.includes(p))); } }, [ permissions, value ]); return ( <TitledGreyBox title={ <div css={tw`flex items-center`}> <p css={tw`text-sm uppercase flex-1`}>{title}</p> {isEditable && <Input type={'checkbox'} checked={permissions.every(p => value.includes(p))} onChange={onCheckboxClicked} /> } </div> } className={className} > {children} </TitledGreyBox> ); }, isEqual); export default PermissionTitleBox;