import { useOrg } from '@components/Contexts/OrgContext' import PageLoading from '@components/Objects/Loaders/PageLoading' import ConfirmationModal from '@components/StyledElements/ConfirmationModal/ConfirmationModal' import { getAPIUrl, getUriWithOrg } from '@services/config/config' import { swrFetcher } from '@services/utils/ts/requests' import { Globe, Ticket, UserSquare, Users, X } from 'lucide-react' import Link from 'next/link' import React, { useEffect } from 'react' import useSWR, { mutate } from 'swr' import dayjs from 'dayjs' import { changeSignupMechanism, deleteInviteCode, } from '@services/organizations/invites' import toast from 'react-hot-toast' import { useRouter } from 'next/navigation' import Modal from '@components/StyledElements/Modal/Modal' import OrgInviteCodeGenerate from '@components/Objects/Modals/Dash/OrgAccess/OrgInviteCodeGenerate' import { useLHSession } from '@components/Contexts/LHSessionContext' function OrgAccess() { const org = useOrg() as any const session = useLHSession() as any const access_token = session?.data?.tokens?.access_token; const { data: invites } = useSWR( org ? `${getAPIUrl()}orgs/${org?.id}/invites` : null, (url) => swrFetcher(url, access_token) ) const [isLoading, setIsLoading] = React.useState(false) const [joinMethod, setJoinMethod] = React.useState('closed') const [invitesModal, setInvitesModal] = React.useState(false) const router = useRouter() async function getOrgJoinMethod() { if (org) { if (org.config.config.GeneralConfig.users.signup_mechanism == 'open') { setJoinMethod('open') } else { setJoinMethod('inviteOnly') } } } async function deleteInvite(invite: any) { let res = await deleteInviteCode(org.id, invite.invite_code_uuid, access_token) if (res.status == 200) { mutate(`${getAPIUrl()}orgs/${org.id}/invites`) } else { toast.error('Error ' + res.status + ': ' + res.data.detail) } } async function changeJoinMethod(method: 'open' | 'inviteOnly') { let res = await changeSignupMechanism(org.id, method, access_token) if (res.status == 200) { router.refresh() mutate(`${getAPIUrl()}orgs/slug/${org?.slug}`) } else { toast.error('Error ' + res.status + ': ' + res.data.detail) } } useEffect(() => { if (invites && org) { getOrgJoinMethod() setIsLoading(false) } }, [org, invites]) return ( <> {!isLoading ? ( <>

Join method

{' '} Choose how users can join your organization{' '}

{joinMethod == 'open' ? (
Active
) : null}
Open
Users can join freely from the signup page
} functionToExecute={() => { changeJoinMethod('open') }} status="info" > {joinMethod == 'inviteOnly' ? (
Active
) : null}
Closed
Users can join only by invitation
} functionToExecute={() => { changeJoinMethod('inviteOnly') }} status="info" >

Invite codes

Invite codes can be copied and used to join your organization{' '}

<> {invites?.map((invite: any) => ( ))}
Code Signup link Type Expiration date Actions
{invite.invite_code} {getUriWithOrg( org?.slug, `/signup?inviteCode=${invite.invite_code}` )} {invite.usergroup_id ? (
Linked to a UserGroup
) : (
Normal
)}
{dayjs(invite.expiration_date) .add(1, 'year') .format('DD/MM/YYYY')}{' '} Delete code } functionToExecute={() => { deleteInvite(invite) }} status="warning" >
setInvitesModal(!invitesModal) } minHeight="no-min" minWidth='lg' dialogContent={ } dialogTitle="Generate Invite Code" dialogDescription={ 'Generate a new invite code for your organization' } dialogTrigger={ } />
) : ( )} ) } export default OrgAccess