import React, { FC, useCallback, useState, useMemo, } from 'react'; import { TFunctionResult } from 'i18next'; import { useTranslation } from 'next-i18next'; import { Modal, ModalHeader, ModalBody, ModalFooter, } from 'reactstrap'; import { IUserGroupHasId } from '~/interfaces/user'; import { CustomWindow } from '~/interfaces/global'; import Xss from '~/services/xss'; /** * Delete User Group Select component * * @export * @class GrantSelector * @extends {React.Component} */ type Props = { userGroups: IUserGroupHasId[], deleteUserGroup?: IUserGroupHasId, onDelete?: (deleteGroupId: string, actionName: string, transferToUserGroupId: string) => Promise | void, isShow: boolean, onHide?: () => Promise | void, }; type AvailableOption = { id: number, actionForPages: string, iconClass: string, styleClass: string, label: TFunctionResult, }; // actionName master constants const actionForPages = { public: 'public', delete: 'delete', transfer: 'transfer', }; const UserGroupDeleteModal: FC = (props: Props) => { const xss: Xss = (window as CustomWindow).xss; const { t } = useTranslation(); const availableOptions = useMemo(() => { return [ { id: 1, actionForPages: actionForPages.public, iconClass: 'icon-people', styleClass: '', label: t('admin:user_group_management.delete_modal.publish_pages'), }, { id: 2, actionForPages: actionForPages.delete, iconClass: 'icon-trash', styleClass: 'text-danger', label: t('admin:user_group_management.delete_modal.delete_pages'), }, { id: 3, actionForPages: actionForPages.transfer, iconClass: 'icon-options', styleClass: '', label: t('admin:user_group_management.delete_modal.transfer_pages'), }, ]; }, []); /* * State */ const [actionName, setActionName] = useState(''); const [transferToUserGroupId, setTransferToUserGroupId] = useState(''); /* * Function */ const resetStates = useCallback(() => { setActionName(''); setTransferToUserGroupId(''); }, []); const onHide = useCallback(() => { if (props.onHide == null) { return; } resetStates(); props.onHide(); }, [props.onHide]); const handleActionChange = useCallback((e) => { const actionName = e.target.value; setActionName(actionName); }, [setActionName]); const handleGroupChange = useCallback((e) => { const transferToUserGroupId = e.target.value; setTransferToUserGroupId(transferToUserGroupId); }, []); const handleSubmit = useCallback((e) => { if (props.onDelete == null || props.deleteUserGroup == null) { return; } e.preventDefault(); props.onDelete( props.deleteUserGroup._id, actionName, transferToUserGroupId, ); }, [props.onDelete, props.deleteUserGroup, actionName, transferToUserGroupId]); const renderPageActionSelector = useCallback(() => { const options = availableOptions.map((opt) => { const dataContent = ` ${opt.label}`; return ; }); return ( ); }, [handleActionChange, actionName, availableOptions]); const renderGroupSelector = useCallback(() => { const { deleteUserGroup } = props; if (deleteUserGroup == null) { return; } const groups = props.userGroups.filter((group) => { return group._id !== deleteUserGroup._id; }); const options = groups.map((group) => { const dataContent = ` ${xss.process(group.name)}`; return ; }); const defaultOptionText = groups.length === 0 ? t('admin:user_group_management.delete_modal.no_groups') : t('admin:user_group_management.delete_modal.select_group'); return ( ); }, [actionName, transferToUserGroupId, props.userGroups, props.deleteUserGroup]); const validateForm = useCallback(() => { let isValid = true; if (actionName === '') { isValid = false; } else if (actionName === actionForPages.transfer) { isValid = transferToUserGroupId !== ''; } return isValid; }, [actionName, transferToUserGroupId]); return ( {t('admin:user_group_management.delete_modal.header')}
{t('admin:user_group_management.group_name')} : "{props?.deleteUserGroup?.name || ''}"
{t('admin:user_group_management.delete_modal.desc')}
{renderPageActionSelector()} {renderGroupSelector()}
); }; export default UserGroupDeleteModal;