'use client'; import { useRef } from 'react'; import { useRouter } from 'next/navigation'; import { zodResolver } from '@hookform/resolvers/zod'; import { Copy } from 'lucide-react'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; import type { User } from '@documenso/prisma/client'; import { TRPCClientError } from '@documenso/trpc/client'; import { trpc } from '@documenso/trpc/react'; import { cn } from '@documenso/ui/lib/utils'; import { Button } from '@documenso/ui/primitives/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@documenso/ui/primitives/form/form'; import { Input } from '@documenso/ui/primitives/input'; import { Textarea } from '@documenso/ui/primitives/textarea'; import { useToast } from '@documenso/ui/primitives/use-toast'; export const ZPublicProfileFormSchema = z.object({ profileURL: z.string().trim().min(1, { message: 'Please enter a valid URL slug.' }), profileBio: z .string() .max(256, { message: 'Profile bio must not exceed 256 characters' }) .optional(), }); export type TPublicProfileFormSchema = z.infer; export type PublicProfileFormProps = { className?: string; user: User; }; export const PublicProfileForm = ({ user, className }: PublicProfileFormProps) => { const textRef = useRef(null); const { toast } = useToast(); const router = useRouter(); const form = useForm({ values: { profileURL: user.profileURL || '', }, resolver: zodResolver(ZPublicProfileFormSchema), }); const isSaving = form.formState.isSubmitting; const { mutateAsync: updatePublicProfile, data: profileURL } = trpc.profile.updatePublicProfile.useMutation(); const copyTextToClipboard = async () => { if (textRef.current) { try { await navigator.clipboard.writeText(textRef.current.textContent || ''); } catch (err) { console.log('Failed to copy: ', err); } } }; const onFormSubmit = async ({ profileURL, profileBio }: TPublicProfileFormSchema) => { try { await updatePublicProfile({ profileURL, profileBio: profileBio || '', }); toast({ title: 'Public profile updated', description: 'Your public profile has been updated successfully.', duration: 5000, }); router.refresh(); } catch (err) { if (err instanceof TRPCClientError && err.data?.code === 'BAD_REQUEST') { toast({ title: 'An error occurred', description: err.message, variant: 'destructive', }); } else { toast({ title: 'An unknown error occurred', variant: 'destructive', description: 'We encountered an unknown error while attempting to save your details. Please try again later.', }); } } }; return (
( Public profile URL <> {profileURL && ( {profileURL} )} )} /> ( Bio