import { Box, Checkbox, Container, Link, Stack, Text, useDisclosure, useToast, } from '@chakra-ui/react'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { __ } from '@wordpress/i18n'; import React, { useEffect, useState } from 'react'; import { useSearchParams } from 'react-router-dom'; import { Table, Tbody, Th, Thead, Tr } from 'react-super-responsive-table'; import ActionDialog from '../../../../../../assets/js/back-end/components/common/ActionDialog'; import CustomAlert from '../../../../../../assets/js/back-end/components/common/CustomAlert'; import EmptyInfo from '../../../../../../assets/js/back-end/components/common/EmptyInfo'; import FilterTabs from '../../../../../../assets/js/back-end/components/common/FilterTabs'; import FloatingBulkAction from '../../../../../../assets/js/back-end/components/common/FloatingBulkAction'; import { Header, HeaderLeftSection, HeaderLogo, HeaderTop, } from '../../../../../../assets/js/back-end/components/common/Header'; import MasteriyoPagination from '../../../../../../assets/js/back-end/components/common/MasteriyoPagination'; import { Gear } from '../../../../../../assets/js/back-end/constants/images'; import Sorting from '../../../../../../assets/js/back-end/screens/courses/components/Sorting'; import API from '../../../../../../assets/js/back-end/utils/api'; import { deepMerge, isEmpty, removeOperationInCache, } from '../../../../../../assets/js/back-end/utils/utils'; import { urls } from '../../constants/urls'; import { GroupSchema } from '../../types/group'; import GroupList from './GroupList'; import SkeletonList from './Skeleton/SkeletonList'; import GroupFilter from './elements/GroupFilter'; interface FilterParams { search?: string; status?: string; per_page?: number; page?: number; orderby: string; order: 'asc' | 'desc'; author_id?: string; } export const tabButtons: FilterTabs = [ { status: 'any', name: __('All Groups', 'learning-management-system'), }, { status: 'publish', name: __('Published', 'learning-management-system'), }, { status: 'draft', name: __('Draft', 'learning-management-system'), }, { status: 'trash', name: __('Trash', 'learning-management-system'), }, { status: 'settings', name: __('Settings', 'learning-management-system'), link: '/groups-settings', icon: , }, ]; const shareYourIdeaLink = 'https://masteriyo.com/support/?utm_source=masteriyo&utm_medium=plugin&utm_campaign=sell+to+group+feature+improvement&utm_content=contact+us'; type FilterTabs = FilterTab[]; const AllGroups = () => { const groupAPI = new API(urls.groups); const toast = useToast(); const [filterParams, setFilterParams] = useState({ order: 'desc', orderby: 'date', }); const [searchParams] = useSearchParams(); const currentTab = searchParams.get('status'); useEffect(() => { if (currentTab) { setFilterParams((prevState) => ({ ...prevState, status: currentTab, })); setActive(currentTab); } }, [currentTab]); const [deleteGroupId, setDeleteGroupId] = useState(); const queryClient = useQueryClient(); const { onClose, onOpen, isOpen } = useDisclosure(); const [active, setActive] = useState('any'); const [bulkAction, setBulkAction] = useState(''); const [bulkIds, setBulkIds] = useState([]); const groupQuery = useQuery({ queryKey: ['groupsList', filterParams], queryFn: () => groupAPI.list(filterParams), ...{ keepPreviousData: true, }, }); const deleteGroup = useMutation({ mutationFn: (id: number) => groupAPI.delete(id, { force: true }), ...{ onSuccess: (data: any) => { removeOperationInCache( queryClient, ['groupsList', { order: 'desc', orderby: 'date' }], data?.id, ); queryClient.invalidateQueries({ queryKey: ['groupsList'] }); onClose(); toast({ title: __( 'Group deleted successfully.', 'learning-management-system', ), isClosable: true, status: 'success', }); }, onError: (err: any) => { toast({ title: err?.message || __('Something went wrong', 'learning-management-system'), status: 'error', isClosable: true, }); }, }, }); const restoreGroup = useMutation({ mutationFn: (id: number) => groupAPI.restore(id), ...{ onSuccess: () => { toast({ title: __( 'Group restored successfully.', 'learning-management-system', ), isClosable: true, status: 'success', }); queryClient.invalidateQueries({ queryKey: ['groupsList'] }); }, onError: (err: any) => { toast({ title: err?.message || __('Something went wrong', 'learning-management-system'), status: 'error', isClosable: true, }); }, }, }); const trashGroup = useMutation({ mutationFn: (id: number) => groupAPI.delete(id), ...{ onSuccess: (data: any) => { removeOperationInCache( queryClient, ['groupsList', { order: 'desc', orderby: 'date' }], data?.id, ); queryClient.invalidateQueries({ queryKey: ['groupsList'] }); toast({ title: __( 'Group trashed successfully.', 'learning-management-system', ), isClosable: true, status: 'success', }); }, onError: (err: any) => { toast({ title: err?.message || __('Something went wrong', 'learning-management-system'), status: 'error', isClosable: true, }); }, }, }); const onTrashPress = (groupId: number) => { groupId && trashGroup.mutate(groupId); }; const onDeletePress = (groupId: number) => { onOpen(); setBulkAction(''); setDeleteGroupId(groupId); }; const onDeleteConfirm = () => { deleteGroupId ? deleteGroup.mutate(deleteGroupId) : null; }; const onRestorePress = (groupId: number) => { groupId ? restoreGroup.mutate(groupId) : null; }; const filterGroupsBy = (order: 'asc' | 'desc', orderBy: string) => setFilterParams( deepMerge({ ...filterParams, order: order, orderby: orderBy, }), ); const onBulkActionApply = { delete: useMutation({ mutationFn: (data: any) => groupAPI.bulkDelete('delete', { ids: data, force: true, }), ...{ onSuccess() { queryClient.invalidateQueries({ queryKey: ['groupsList'] }); onClose(); setBulkIds([]); toast({ title: __( 'Groups deleted successfully.', 'learning-management-system', ), isClosable: true, status: 'success', }); }, onError: (err: any) => { toast({ title: err?.message || __('Something went wrong', 'learning-management-system'), status: 'error', isClosable: true, }); }, }, }), trash: useMutation({ mutationFn: (data: any) => groupAPI.bulkDelete('delete', { ids: data }), ...{ onSuccess() { queryClient.invalidateQueries({ queryKey: ['groupsList'] }); onClose(); setBulkIds([]); toast({ title: __( 'Groups trashed successfully.', 'learning-management-system', ), isClosable: true, status: 'success', }); }, onError: (err: any) => { toast({ title: err?.message || __('Something went wrong', 'learning-management-system'), status: 'error', isClosable: true, }); }, }, }), restore: useMutation({ mutationFn: (data: any) => groupAPI.bulkRestore('restore', { ids: data }), ...{ onSuccess() { queryClient.invalidateQueries({ queryKey: ['groupsList'] }); onClose(); setBulkIds([]); toast({ title: __( 'Groups restored successfully.', 'learning-management-system', ), isClosable: true, status: 'success', }); }, onError: (err: any) => { toast({ title: err?.message || __('Something went wrong', 'learning-management-system'), status: 'error', isClosable: true, }); }, }, }), }; const onChangeCourseStatus = (status: string) => { setActive(status); setFilterParams( deepMerge(filterParams, { status: status, }), ); setBulkIds([]); setBulkAction(''); }; return (
{/* navigate(groupsBackendRoutes.add)} leftIcon={min360px ? : undefined} > {__('Add New Group', 'learning-management-system')} */}
{' '} {__( 'Now when someone buys a course for a group, the group is created instantly, no extra setup required. We’re working to make ‘Sell to Groups’ even better, and we’d love your input.', 'learning-management-system', )} {__(' Share your ideas', 'learning-management-system')} {groupQuery.isLoading || !groupQuery.isFetched ? ( ) : groupQuery.isSuccess && isEmpty(groupQuery?.data?.data) ? ( ) : ( <> {groupQuery?.data?.data?.map((group: GroupSchema) => ( ))} )}
0 } isChecked={ groupQuery?.data?.data?.length === bulkIds.length && !isEmpty(groupQuery?.data?.data as boolean) } onChange={(e) => setBulkIds( e.target.checked ? groupQuery?.data?.data?.map((group: any) => group.id.toString(), ) : [], ) } /> {__('Group Name', 'learning-management-system')} {__('Group Leader', 'learning-management-system')} {__('Members', 'learning-management-system')} {__('Date', 'learning-management-system')} {__('Actions', 'learning-management-system')}
{groupQuery.isSuccess && !isEmpty(groupQuery?.data?.data) && ( )}
{ onBulkActionApply[bulkAction].mutate(bulkIds); } } action={bulkAction} isLoading={ '' === bulkAction ? deleteGroup.isPending : (onBulkActionApply?.[bulkAction]?.isLoading ?? false) } dialogTexts={{ default: { header: __('Deleting Group', 'learning-management-system'), body: __( 'Are you sure? You can’t restore after deleting.', 'learning-management-system', ), confirm: __('Delete', 'learning-management-system'), }, trash: { header: __('Moving Groups to Trash', 'learning-management-system'), body: __( 'Are you sure? The selected groups will be moved to trash.', 'learning-management-system', ), confirm: __('Move to Trash', 'learning-management-system'), }, delete: { header: __('Deleting Groups', 'learning-management-system'), body: __( 'Are you sure? You can’t restore after deleting.', 'learning-management-system', ), confirm: __('Delete', 'learning-management-system'), }, restore: { header: __('Restoring Groups', 'learning-management-system'), body: __( 'Are you sure? The selected groups will be restored from the trash.', 'learning-management-system', ), confirm: __('Restore', 'learning-management-system'), }, }} />
); }; export default AllGroups;