'use client'; import { useModals } from '@mantine/modals'; import React, { FC, Ref, useCallback, useEffect, useMemo } from 'react'; import { Input } from '@gitroom/react/form/input'; import { Button } from '@gitroom/react/form/button'; import { Textarea } from '@gitroom/react/form/textarea'; import { FormProvider, useForm } from 'react-hook-form'; import { showMediaBox } from '@gitroom/frontend/components/media/media.component'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; import { classValidatorResolver } from '@hookform/resolvers/class-validator'; import { UserDetailDto } from '@gitroom/nestjs-libraries/dtos/users/user.details.dto'; import { useToaster } from '@gitroom/react/toaster/toaster'; import { useSWRConfig } from 'swr'; import clsx from 'clsx'; import { TeamsComponent } from '@gitroom/frontend/components/settings/teams.component'; import { useUser } from '@gitroom/frontend/components/layout/user.context'; import { LogoutComponent } from '@gitroom/frontend/components/layout/logout.component'; import { useSearchParams } from 'next/navigation'; import { useVariables } from '@gitroom/react/helpers/variable.context'; import { PublicComponent } from '@gitroom/frontend/components/public-api/public.component'; import Link from 'next/link'; import { Webhooks } from '@gitroom/frontend/components/webhooks/webhooks'; import { TopTitle } from '@gitroom/frontend/components/launches/helpers/top.title.component'; import { Tabs } from '@mantine/core'; import { SignaturesComponent } from '@gitroom/frontend/components/settings/signatures.component'; export const SettingsPopup: FC<{ getRef?: Ref }> = (props) => { const { isGeneral } = useVariables(); const { getRef } = props; const fetch = useFetch(); const toast = useToaster(); const swr = useSWRConfig(); const user = useUser(); const resolver = useMemo(() => { return classValidatorResolver(UserDetailDto); }, []); const form = useForm({ resolver }); const picture = form.watch('picture'); const modal = useModals(); const close = useCallback(() => { return modal.closeAll(); }, []); const url = useSearchParams(); const showLogout = !url.get('onboarding') || user?.tier?.current === 'FREE'; const loadProfile = useCallback(async () => { const personal = await (await fetch('/user/personal')).json(); form.setValue('fullname', personal.name || ''); form.setValue('bio', personal.bio || ''); form.setValue('picture', personal.picture); }, []); const openMedia = useCallback(() => { showMediaBox((values) => { form.setValue('picture', values); }); }, []); const remove = useCallback(() => { form.setValue('picture', null); }, []); const submit = useCallback(async (val: any) => { await fetch('/user/personal', { method: 'POST', body: JSON.stringify(val), }); if (getRef) { return; } toast.show('Profile updated'); swr.mutate('/marketplace/account'); close(); }, []); const defaultValueForTabs = useMemo(() => { if (user?.tier?.team_members && isGeneral) { return 'teams'; } if (user?.tier?.webhooks) { return 'webhooks'; } if (user?.tier?.public_api && isGeneral) { return 'api'; } return 'teams'; }, []); useEffect(() => { loadProfile(); }, []); return (
{!!getRef && ( )}
{/* Profile */} {!!user?.tier?.team_members && isGeneral && ( Teams )} {!!user?.tier?.webhooks && ( Webhooks )} Signatures {!!user?.tier?.public_api && isGeneral && showLogout && ( Public API )} {/*
Profile
Add profile information
{!!picture?.path && ( profile )}
Profile Picture