import React, { FC, useMemo, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; import { SupportedActionType, SupportedActionCategoryType, SupportedActionCategory, PageActions, CommentActions, TagActions, ShareLinkActions, AttachmentActions, InAppNotificationActions, SearchActions, UserActions, AdminActions, } from '~/interfaces/activity'; type Props = { actionMap: Map availableActions: SupportedActionType[] onChangeAction: (action: SupportedActionType) => void onChangeMultipleAction: (actions: SupportedActionType[], isChecked: boolean) => void } export const SelectActionDropdown: FC = (props: Props) => { const { t } = useTranslation(); const { actionMap, availableActions, onChangeAction, onChangeMultipleAction, } = props; const dropdownItems = useMemo>(() => { return ( [ { actionCategory: SupportedActionCategory.PAGE, actions: PageActions.filter(action => availableActions.includes(action)), }, { actionCategory: SupportedActionCategory.COMMENT, actions: CommentActions.filter(action => availableActions.includes(action)), }, { actionCategory: SupportedActionCategory.TAG, actions: TagActions.filter(action => availableActions.includes(action)), }, { actionCategory: SupportedActionCategory.ATTACHMENT, actions: AttachmentActions.filter(action => availableActions.includes(action)), }, { actionCategory: SupportedActionCategory.SHARE_LINK, actions: ShareLinkActions.filter(action => availableActions.includes(action)), }, { actionCategory: SupportedActionCategory.IN_APP_NOTIFICATION, actions: InAppNotificationActions.filter(action => availableActions.includes(action)), }, { actionCategory: SupportedActionCategory.SEARCH, actions: SearchActions.filter(action => availableActions.includes(action)), }, { actionCategory: SupportedActionCategory.USER, actions: UserActions.filter(action => availableActions.includes(action)), }, { actionCategory: SupportedActionCategory.ADMIN, actions: AdminActions.filter(action => availableActions.includes(action)), }, ] ); }, [availableActions]).filter(item => item.actions.length !== 0); const actionCheckboxChangedHandler = useCallback((action) => { if (onChangeAction != null) { onChangeAction(action); } }, [onChangeAction]); const multipleActionCheckboxChangedHandler = useCallback((actions, isChecked) => { if (onChangeMultipleAction != null) { onChangeMultipleAction(actions, isChecked); } }, [onChangeMultipleAction]); return (
    {dropdownItems.map(item => (
    { multipleActionCheckboxChangedHandler(item.actions, e.target.checked) }} />
    { item.actions.map(action => (
    { actionCheckboxChangedHandler(action) }} checked={actionMap.get(action)} />
    )) }
    ))}
); };