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;