import { Alert, AlertIcon, Box, Button, ButtonGroup, Container, Flex, Heading, Stack, useBreakpointValue, useMediaQuery, useToast, } from '@chakra-ui/react'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { __, _x, sprintf } from '@wordpress/i18n'; import React, { useEffect } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { useNavigate } from 'react-router'; import { Link, NavLink, useParams } from 'react-router-dom'; import BackButton from '../../../../../../assets/js/back-end/components/common/BackButton'; import { Header, HeaderLeftSection, HeaderLogo, } from '../../../../../../assets/js/back-end/components/common/Header'; import { NavMenu, NavMenuLink, } from '../../../../../../assets/js/back-end/components/common/Nav'; import { navActiveStyles, navLinkStyles, } from '../../../../../../assets/js/back-end/config/styles'; import routes from '../../../../../../assets/js/back-end/constants/routes'; import { useWarnUnsavedChanges } from '../../../../../../assets/js/back-end/hooks/useWarnUnSavedChanges'; import API from '../../../../../../assets/js/back-end/utils/api'; import { deepClean, editOperationInCache, } from '../../../../../../assets/js/back-end/utils/utils'; import LinkedCourses from '../../common/components/LinkedCourses'; import Name from '../../common/components/Name'; import { urls } from '../../constants/urls'; import { groupsBackendRoutes } from '../../routes/routes'; import { GroupSchema } from '../../types/group'; import SkeletonEdit from './Skeleton/SkeletonEdit'; import Author from './elements/Author'; import Description from './elements/Description'; import Emails from './elements/Emails'; import GroupActionBtn from './elements/GroupActionBtn'; const headerTabStyles = { mr: '10', py: '6', d: 'flex', gap: 1, justifyContent: 'flex-start', alignItems: 'center', fontWeight: 'medium', fontSize: ['xs', null, 'sm'], }; const EditGroup: React.FC = () => { const { groupId }: any = useParams(); const toast = useToast(); const queryClient = useQueryClient(); const methods = useForm(); const navigate = useNavigate(); const groupAPI = new API(urls.groups); const [isLargerThan992] = useMediaQuery('(min-width: 992px)'); const buttonSize = useBreakpointValue(['sm', 'md']); const groupQuery = useQuery({ queryKey: [`group${groupId}`, groupId], queryFn: () => groupAPI.get(groupId, 'edit'), }); useEffect(() => { if (groupQuery?.isError) { navigate(routes.notFound); } }, [groupQuery?.isError, navigate]); const updateGroup = useMutation({ mutationFn: (data) => groupAPI.update(groupId, data), ...{ onSuccess: (data: any) => { editOperationInCache( queryClient, ['groupsList', { order: 'desc', orderby: 'date' }], data, ); queryClient.invalidateQueries({ queryKey: [`group${groupId}`] }); queryClient.invalidateQueries({ queryKey: [`groupsList`] }); toast({ title: __( 'Group updated successfully.', 'learning-management-system', ), isClosable: true, status: 'success', }); navigate(groupsBackendRoutes.list); }, onError: (error: any) => { const message: any = error?.message ? error?.message : error?.data?.message; toast({ title: __( 'Failed to update the group.', 'learning-management-system', ), description: message ? `${message}` : undefined, status: 'error', isClosable: true, }); }, }, }); const onSubmit = (data: any) => { // Ensure emails field is preserved even if empty const cleanedData = deepClean(data); if (!cleanedData.hasOwnProperty('emails')) { cleanedData.emails = []; } updateGroup.mutate(cleanedData); }; useWarnUnsavedChanges(methods.formState.isDirty); useEffect(() => { if (groupQuery?.isSuccess && groupQuery?.data) { // Convert emails array to the format expected by the select component const formData = { ...groupQuery.data, emails: groupQuery.data.emails?.map((email: string) => ({ value: email, label: email, })) || [], }; methods.reset(formData); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [groupQuery?.data]); const FormButton = () => ( ); return (
{__('Edit Group', 'learning-management-system')}
{groupQuery.isSuccess ? (
{__('Edit Group', 'learning-management-system')} {/* Show edit order link if group is draft and order is incomplete */} {groupQuery?.data?.status === 'draft' && groupQuery?.data?.order && groupQuery?.data?.order?.status !== 'completed' && ( {__( 'This group is in draft status because the associated order is not completed.', 'learning-management-system', )}{' '} {sprintf( /* translators: %d: order ID */ _x( 'Edit Order #%d', 'Edit order action label', 'learning-management-system', ), groupQuery.data.order.id, )} {' '} {__( 'to complete the purchase and publish this group.', 'learning-management-system', )} )} {isLargerThan992 ? : null} {' '} {!isLargerThan992 ? : null}
) : ( )}
); }; export default EditGroup;