import { Button } from '@gitroom/react/form/button'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; import useSWR from 'swr'; import React, { useCallback, useMemo } from 'react'; import { useUser } from '@gitroom/frontend/components/layout/user.context'; import { capitalize } from 'lodash'; import { useModals } from '@mantine/modals'; import { TopTitle } from '@gitroom/frontend/components/launches/helpers/top.title.component'; import { Input } from '@gitroom/react/form/input'; import { useForm, FormProvider, useWatch } from 'react-hook-form'; import { Select } from '@gitroom/react/form/select'; import { Checkbox } from '@gitroom/react/form/checkbox'; import { classValidatorResolver } from '@hookform/resolvers/class-validator'; import { AddTeamMemberDto } from '@gitroom/nestjs-libraries/dtos/settings/add.team.member.dto'; import { useToaster } from '@gitroom/react/toaster/toaster'; import { deleteDialog } from '@gitroom/react/helpers/delete.dialog'; import copy from 'copy-to-clipboard'; import interClass from '@gitroom/react/helpers/inter.font'; const roles = [ { name: 'User', value: 'USER', }, { name: 'Admin', value: 'ADMIN', }, ]; export const AddMember = () => { const modals = useModals(); const fetch = useFetch(); const toast = useToaster(); const resolver = useMemo(() => { return classValidatorResolver(AddTeamMemberDto); }, []); const form = useForm({ values: { email: '', role: '', sendEmail: true, }, resolver, mode: 'onChange', }); const sendEmail = useWatch({ control: form.control, name: 'sendEmail', }); const submit = useCallback( async (values: { email: string; role: string; sendEmail: boolean }) => { const { url } = await ( await fetch('/settings/team', { method: 'POST', body: JSON.stringify(values), }) ).json(); if (values.sendEmail) { modals.closeAll(); toast.show('Invitation link sent'); return; } copy(url); modals.closeAll(); toast.show('Link copied to clipboard'); }, [] ); const closeModal = useCallback(() => { return modals.closeAll(); }, []); return (
{sendEmail && ( )}
Send invitation via email?
); }; export const TeamsComponent = () => { const fetch = useFetch(); const user = useUser(); const modals = useModals(); const myLevel = user?.role === 'USER' ? 0 : user?.role === 'ADMIN' ? 1 : 2; const getLevel = useCallback( (role: 'USER' | 'ADMIN' | 'SUPERADMIN') => role === 'USER' ? 0 : role === 'ADMIN' ? 1 : 2, [] ); const loadTeam = useCallback(async () => { return (await (await fetch('/settings/team')).json()).users as Array<{ id: string; role: 'SUPERADMIN' | 'ADMIN' | 'USER'; user: { email: string; id: string }; }>; }, []); const addMember = useCallback(() => { modals.openModal({ classNames: { modal: 'bg-transparent text-textColor', }, withCloseButton: false, children: , }); }, []); const { data, mutate } = useSWR('/api/teams', loadTeam, { revalidateOnFocus: false, revalidateOnReconnect: false, revalidateIfStale: false, }); const remove = useCallback( (toRemove: { user: { id: string } }) => async () => { if ( !(await deleteDialog( 'Are you sure you want to remove this team member?' )) ) { return; } await fetch(`/settings/team/${toRemove.user.id}`, { method: 'DELETE', }); await mutate(); }, [] ); return (

Team Members

Account Managers

Invite your assistant or team member to manage your account
{(data || []).map((p) => (
{capitalize(p.user.email.split('@')[0]).split('.')[0]}
{p.role === 'USER' ? 'User' : p.role === 'ADMIN' ? 'Admin' : 'Super Admin'}
{+myLevel > +getLevel(p.role) ? (
) : (
)}
))}
); };