"use client" import { useMemo, useState } from "react" import { PenLine, Plus, Trash2 } from "lucide-react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { SettingsSectionHeader } from "@/components/gmail/settings/settings-section-header" import { SettingsSyncBanner } from "@/components/gmail/settings/settings-sync-banner" import { MAIL_SETTINGS_PAGE_MASONRY_CLASS, MAIL_SETTINGS_PAGE_MASONRY_ITEM_CLASS, } from "@/lib/mail-chrome-classes" import { cn } from "@/lib/utils" import { useAuthReady } from "@/lib/api/use-auth-ready" import { useMailAccounts } from "@/lib/api/hooks/use-mail-queries" import { useIdentities } from "@/lib/api/hooks/use-folder-label-queries" import { useCreateMailSignature, useDeleteMailSignature, useMailSignatures, useUpdateMailSignature, } from "@/lib/api/hooks/use-mail-signatures" import { useUpdateIdentity } from "@/lib/api/hooks/use-identity-mutations" import type { ApiIdentity, ApiMailSignature } from "@/lib/api/types" const NONE_SIGNATURE = "__none__" export function SignaturesSettingsSection() { const { ready, authenticated } = useAuthReady() const { data: signatures = [], isFetching, isError, refetch, isPending, } = useMailSignatures() const showInitialLoad = ready && authenticated && isPending && signatures.length === 0 return ( <> refetch()} /> > ) } function SignatureLibrary({ signatures, showInitialLoad, }: { signatures: ApiMailSignature[] showInitialLoad: boolean }) { const createSignature = useCreateMailSignature() const updateSignature = useUpdateMailSignature() const deleteSignature = useDeleteMailSignature() const [showAddForm, setShowAddForm] = useState(false) const [draft, setDraft] = useState({ name: "", html: "" }) function handleCreate() { const name = draft.name.trim() if (!name) return createSignature.mutate( { name, html: draft.html }, { onSuccess: () => { setShowAddForm(false) setDraft({ name: "", html: "" }) }, } ) } return ( Bibliothèque Créez des signatures nommées que vous pourrez réutiliser sur plusieurs identités. {showInitialLoad ? null : signatures.length === 0 ? ( Aucune signature enregistrée. ) : ( {signatures.map((signature) => ( Nom { const next = e.target.value.trim() if (!next || next === signature.name) return updateSignature.mutate({ signatureId: signature.id, name: next, html: signature.html, }) }} /> deleteSignature.mutate(signature.id)} > Contenu HTML { if (e.target.value === signature.html) return updateSignature.mutate({ signatureId: signature.id, name: signature.name, html: e.target.value, }) }} /> {signature.html?.trim() ? ( Aperçu ) : null} ))} )} {showAddForm ? ( Nom setDraft({ ...draft, name: e.target.value })} /> Contenu HTML setDraft({ ...draft, html: e.target.value })} /> Enregistrer { setShowAddForm(false) setDraft({ name: "", html: "" }) }} > Annuler ) : ( setShowAddForm(true)} > Ajouter une signature )} ) } function IdentitySignatureAssignments({ signatures, }: { signatures: ApiMailSignature[] }) { const { data: accounts = [] } = useMailAccounts() if (accounts.length === 0) { return ( Attribution par identité Ajoutez un compte mail pour configurer les signatures par défaut. ) } return ( Attribution par identité Choisissez la signature insérée par défaut pour chaque adresse d'envoi. {accounts.map((account) => ( ))} ) } function AccountIdentitySignatures({ accountId, accountLabel, signatures, }: { accountId: string accountLabel: string signatures: ApiMailSignature[] }) { const { data: identities = [] } = useIdentities(accountId) const updateIdentity = useUpdateIdentity(accountId) const signatureOptions = useMemo( () => [ { value: NONE_SIGNATURE, label: "Aucune" }, ...signatures.map((s) => ({ value: s.id, label: s.name })), ], [signatures] ) if (identities.length === 0) { return ( {accountLabel} Aucune identité d'envoi. ) } return ( {accountLabel} {identities.map((identity) => ( updateIdentity.mutate({ identityId: identity.id, email: identity.email, name: identity.name, is_default: identity.is_default, signature_html: identity.signature_html ?? "", default_signature_id: defaultSignatureId, reply_to_addrs: identity.reply_to_addrs, }) } /> ))} ) } function IdentitySignatureRow({ identity, options, pending, onAssign, }: { identity: ApiIdentity options: Array<{ value: string; label: string }> pending: boolean onAssign: (defaultSignatureId: string) => void }) { const current = identity.default_signature_id && identity.default_signature_id !== "" ? identity.default_signature_id : NONE_SIGNATURE return ( {identity.name} {identity.email} {identity.is_default ? ( Identité par défaut ) : null} Signature par défaut onAssign(value === NONE_SIGNATURE ? "" : value) } > {options.map((opt) => ( {opt.label} ))} ) }
Aucune signature enregistrée.
Aperçu
{accountLabel}
Aucune identité d'envoi.
{identity.name}
{identity.email}
Identité par défaut