import { useCallback, useState } from 'react' import { useLocation, useNavigate, useParams } from 'react-router-dom' import { Button, IconButton, Menu, MenuButton, MenuItem, MenuList, Portal, Table, Tbody, Td, Th, Thead, Tr, useToast, } from '@chakra-ui/react' import cx from 'classnames' import { Helmet } from 'react-helmet-async' import InvitationAPI, { SortBy, SortOrder } from '@/client/api/invitation' import OrganizationAPI from '@/client/api/organization' import { geEditorPermission } from '@/client/api/permission' import { swrConfig } from '@/client/options' import OrganizationInviteMembers from '@/components/organization/organization-invite-members' import OrganizationStatus from '@/components/organization/organization-status' import prettyDate from '@/helpers/pretty-date' import { outgoingInvitationPaginationStorage } from '@/infra/pagination' import { IconMoreVert, IconSend, IconDelete, IconPersonAdd, SectionSpinner, PagePagination, usePagePagination, } from '@/lib' const OrganizationInvitationsPage = () => { const navigate = useNavigate() const location = useLocation() const { id } = useParams() const toast = useToast() const { data: org, error: orgError } = OrganizationAPI.useGetById( id, swrConfig(), ) const { page, size, steps, setPage, setSize } = usePagePagination({ navigate, location, storage: outgoingInvitationPaginationStorage(), }) const { data: list, error: invitationsError, mutate, } = InvitationAPI.useGetOutgoing( { organizationId: id, page, size, sortBy: SortBy.DateCreated, sortOrder: SortOrder.Desc, }, swrConfig(), ) const [isInviteMembersModalOpen, setIsInviteMembersModalOpen] = useState(false) const handleResend = useCallback( async (invitationId: string) => { await InvitationAPI.resend(invitationId) toast({ title: 'Invitation resent', status: 'success', isClosable: true, }) }, [toast], ) const handleDelete = useCallback( async (invitationId: string) => { await InvitationAPI.delete(invitationId) mutate() }, [mutate], ) if (invitationsError || orgError) { return null } if (!list || !org) { return } return ( <> {org.name} {list && list.data.length === 0 ? ( <>
This organization has no invitations. {geEditorPermission(org.permission) && ( )}
setIsInviteMembersModalOpen(false)} /> ) : null} {list && list.data.length > 0 ? (
{list.data.map((i) => ( ))}
Email Status Date
{i.email} {prettyDate(i.createTime)} } variant="ghost" aria-label="" /> {i.status === 'pending' && ( } onClick={() => handleResend(i.id)} > Resend )} } className={cx('text-red-500')} onClick={() => handleDelete(i.id)} > Delete
{list && ( )}
) : null} ) } export default OrganizationInvitationsPage