import React, { useEffect, useMemo, useState } from "react"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import { __, sprintf } from "../../lib/i18n"; import { Modal } from "../ui/modal"; import { Button } from "../ui/button"; import { Input } from "../ui/input"; import { Label } from "../ui/label"; import { SearchableSelect } from "../ui/searchable-select"; import { MultiSelect } from "../ui/multi-select"; import { useToast } from "../ui/toast"; import { decodeTargets, describeTargets, encodeTargets, hasTargets, useTripTargets, type TripTargets, } from "../../hooks/useTripTargets"; import { createEmailTemplateOverride } from "../../api/email-automation-api"; import type { UnifiedEmailTemplate } from "../../lib/email-templates-catalog"; /** * "Add an override" — the first step of creating a trip-specific version of a * global email template (Pro Email Automation). Asks WHICH trips first so an * override can never exist without a target, suggests a name from the * selection, then opens the new override in the editor. */ interface EmailOverrideCreateModalProps { isOpen: boolean; onClose: () => void; /** Global templates the operator may override (overridable, not overrides). */ globals: UnifiedEmailTemplate[]; /** Preselected global template; when omitted the modal asks which one. */ parent?: UnifiedEmailTemplate | null; } export const EmailOverrideCreateModal: React.FC< EmailOverrideCreateModalProps > = ({ isOpen, onClose, globals, parent }) => { const { showToast } = useToast(); const queryClient = useQueryClient(); const [parentId, setParentId] = useState(""); const [targets, setTargets] = useState({}); const [name, setName] = useState(""); const [nameTouched, setNameTouched] = useState(false); const [copy, setCopy] = useState(true); const { options } = useTripTargets(isOpen); useEffect(() => { if (!isOpen) return; setParentId(parent ? String(parent.id) : String(globals[0]?.id ?? "")); setTargets({}); setName(""); setNameTouched(false); setCopy(true); }, [isOpen, parent, globals]); const selectedParent = useMemo( () => globals.find((g) => String(g.id) === parentId) || parent || null, [globals, parentId, parent], ); const suggestedName = useMemo(() => { if (!selectedParent) return ""; const where = describeTargets(targets, options); return where ? `${selectedParent.name} — ${where}` : ""; }, [selectedParent, targets, options]); const createMutation = useMutation({ mutationFn: async () => { if (!selectedParent) throw new Error(__("Pick a global template.", "yatra")); const response: any = await createEmailTemplateOverride( selectedParent.id, { targets, name: (nameTouched ? name : suggestedName).trim(), copy, }, ); if (response && response.success === false) { throw new Error( response.message || __("Failed to create override.", "yatra"), ); } return response; }, onSuccess: (response: any) => { queryClient.invalidateQueries({ queryKey: ["email-templates"] }); const newId = response?.data?.id; showToast( __("Override created — now edit the wording.", "yatra"), "success", ); onClose(); if (newId) { window.location.href = `admin.php?page=yatra&subpage=email-automation&tab=templates&action=edit&id=${newId}`; } }, onError: (error: any) => { showToast( error?.message || __("Failed to create override.", "yatra"), "error", ); }, }); const canSubmit = !!selectedParent && hasTargets(targets) && !createMutation.isPending; return ( } >
{!parent && (
setParentId(value)} options={globals.map((g) => ({ value: String(g.id), label: `${g.name} · ${g.event_key}`, }))} placeholder={__("Pick a global template…", "yatra")} searchPlaceholder={__("Search templates…", "yatra")} />
)}
setTargets(decodeTargets(vals))} options={options} placeholder={__("Search trips, categories, trip types…", "yatra")} className="mt-1" />

{__( "Trips, whole categories (sub-categories included) or a trip type. You can change this later.", "yatra", )}

{ setNameTouched(true); setName(e.target.value); }} placeholder={ selectedParent ? `${selectedParent.name} — …` : __("Name", "yatra") } className="mt-1" data-testid="override-name" />

{__( "Suggested from what you picked; shown in the list and in Email logs.", "yatra", )}

); }; export default EmailOverrideCreateModal;