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 '@gitroom/frontend/components/layout/new-modal'; 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 { useT } from '@gitroom/react/translation/get.transation.service.client'; 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 t = useT(); return (
{sendEmail && ( )}
{t('send_invitation_via_email', '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', }, title: 'Add Team Member', withCloseButton: true, 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(); }, [] ); const t = useT(); return (

{t('team_members', 'Team Members')}

{t( 'invite_your_assistant_or_team_member_to_manage_your_account', '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) ? (
) : (
)}
))}
); };