"use client"; /** * Figma: Overlay / Modal / Card (24973:1852) with Has Text off and Has Steps * on. A value opens a card of meaning + signals rows; each row opens that * field's Step Modal (23746:49780) with Generate draft on an empty field. */ import { memo, useCallback, useEffect, useState, type ReactNode } from "react"; import Create from "../../../components/modals/Create"; import { useMessages } from "../../../contexts/MessagesContext"; import type { ModalHeaderMenuItem } from "../../../components/modals/ModalHeader/ModalHeader.types"; import type { CoreValueDetailEntry } from "../types"; import ModalTextAreaField from "./ModalTextAreaField"; import { ValueDialogStepCard } from "./ValueDialogStepCard"; export type ValueDialogSession = "pending" | "editing"; export type ValueDialogStep = "meaning" | "signals"; export type ValueDialogProps = { isOpen: boolean; valueLabel: string; session: ValueDialogSession | null; draft: CoreValueDetailEntry; onDraftChange: (_next: CoreValueDetailEntry) => void; generateDraft?: CoreValueDetailEntry; onClose: () => void; onConfirm: () => void; onDeselect?: () => void; nextButtonDisabled?: boolean; kebabTriggerAriaLabel?: string; kebabMenuAriaLabel?: string; kebabMenuItems?: ModalHeaderMenuItem[]; ariaLabel?: string; /** Customized field-blocks body. Replaces the meaning/signals step cards. */ children?: ReactNode; }; function ValueDialogComponent({ isOpen, valueLabel, session, draft, onDraftChange, generateDraft, onClose, onConfirm, onDeselect, nextButtonDisabled = false, kebabTriggerAriaLabel, kebabMenuAriaLabel, kebabMenuItems, ariaLabel, children, }: ValueDialogProps) { const m = useMessages(); const t = m.create.customRule.coreValues.detailModal; const draftField = m.create.draftField; const [activeStep, setActiveStep] = useState(null); useEffect(() => { if (!isOpen) { setActiveStep(null); } }, [isOpen]); const handleRequestClose = useCallback(() => { if (activeStep != null) { setActiveStep(null); return; } onClose(); }, [activeStep, onClose]); const meaningDone = draft.meaning.trim().length > 0; const signalsDone = draft.signals.trim().length > 0; const useCustomBody = Boolean(children); const showSteps = !useCustomBody && activeStep == null; const editing = session === "editing"; const primaryLabel = editing ? t.save : t.addToRule; const stepTitle = activeStep === "meaning" ? t.meaningStepTitle.replace("{value}", valueLabel) : activeStep === "signals" ? t.signalsLabel : valueLabel; const stepDescription = activeStep === "meaning" ? t.meaningDescription : activeStep === "signals" ? t.signalsStepDescription.replace("{value}", valueLabel) : undefined; return ( 0 ? kebabMenuItems : undefined } ariaLabel={ariaLabel || valueLabel} > {useCustomBody ? ( children ) : showSteps ? (
setActiveStep("meaning")} /> setActiveStep("signals")} />
) : activeStep === "meaning" ? ( onDraftChange({ ...draft, meaning })} placeholder={t.placeholder} generateDraftText={generateDraft?.meaning} generateDraftLabel={draftField.generateDraft} generateDraftHint={t.generateDraftHint} filledHint={t.filledHint} autoFocus /> ) : ( onDraftChange({ ...draft, signals })} placeholder={t.placeholder} generateDraftText={generateDraft?.signals} generateDraftLabel={draftField.generateDraft} generateDraftHint={t.generateDraftHint} filledHint={t.filledHint} autoFocus /> )}
); } ValueDialogComponent.displayName = "ValueDialog"; export const ValueDialog = memo(ValueDialogComponent);