import { useState } from "react"; import { FileSignature, Loader2 } from "lucide-react"; import { useMutation, useQuery } from "@tanstack/react-query"; import toast from "react-hot-toast"; import { api } from "@/services/api"; import { ContractSignaturePad } from "@/components/bookings/ContractSignaturePad"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { useAuth } from "@/auth/useAuth"; import { Button, Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, Input, Label, } from "@edr/ui-common"; /** * Lets the signed-in user view and update the reusable signature stored on * their profile. The same signature is offered for approval when signing a * booking contract. */ export function MySignatureCard() { const { user } = useAuth(); const { data: saved, isLoading } = useQuery( api.signatures.mySignature.queryOptions({ staleTime: 60_000 }), ); const saveMutation = useMutation(api.signatures.save.mutationOptions()); const [open, setOpen] = useState(false); const [signerName, setSignerName] = useState(""); const [signatureData, setSignatureData] = useState(null); const defaultName = user?.name?.en || user?.username || user?.email || ""; const openDialog = () => { setSignerName(saved?.signerDisplayName ?? defaultName); setSignatureData(null); setOpen(true); }; const save = () => { if (!signatureData || !signerName.trim()) return; saveMutation.mutate( { signerDisplayName: signerName.trim(), signatureImageBase64: signatureData, }, { onSuccess: () => { toast.success("Signature saved"); setOpen(false); }, onError: () => toast.error("Failed to save signature"), }, ); }; return ( My signature This signature can be reused to sign booking contracts. {isLoading ? (
) : saved?.signatureImageUrl ? (
My saved signature

Saved as {saved.signerDisplayName}

) : (

You have not saved a signature yet.

)}
Save your signature Draw your signature below. It will be stored on your profile for future contracts.
setSignerName(e.target.value)} placeholder="As shown on contracts" />
); }