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 { isGeneral } from '@gitroom/react/helpers/is.general'; import { useUser } from '@gitroom/frontend/components/layout/user.context'; import { LogoutComponent } from '@gitroom/frontend/components/layout/logout.component'; import { useSearchParams } from 'next/navigation'; export const SettingsPopup: FC<{ getRef?: Ref }> = (props) => { 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'); 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(); }, []); useEffect(() => { loadProfile(); }, []); return (
{!!getRef && ( )}
{!getRef && ( )} {!getRef && (
Profile Settings
)}
Profile
Add profile information
{!!picture?.path && ( profile )}
Profile Picture