All files / src/components/whatsapp TemplateParameterFields.tsx

100% Statements 13/13
78.57% Branches 11/14
100% Functions 3/3
100% Lines 12/12

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87                                            15x 15x   15x 15x 15x   15x   14x     15x       15x                 19x 19x                           1x                                                
import { WhatsAppMessagePreview } from "./WhatsAppMessagePreview";
import type { WaTemplate } from "../../lib/api/whatsapp";
import {
	parseTemplateComponents,
	extractParameterSlots,
	renderPreviewText,
	getTemplateBodyText,
	getTemplateHeaderText,
	getTemplateFooterText,
} from "./template-utils";
 
type TemplateParameterFieldsProps = {
	template: WaTemplate;
	paramValues: Record<string, string>;
	onParamChange: (key: string, value: string) => void;
};
 
export function TemplateParameterFields({
	template,
	paramValues,
	onParamChange,
}: TemplateParameterFieldsProps) {
	const components = parseTemplateComponents(template.components);
	const slots = extractParameterSlots(components);
 
	const bodyText = getTemplateBodyText(components);
	const headerText = getTemplateHeaderText(components);
	const footerText = getTemplateFooterText(components);
 
	if (slots.length === 0 && !bodyText) return null;
 
	const previewHeader = headerText
		? renderPreviewText(headerText, "HEADER", paramValues)
		: null;
	const previewBody = bodyText
		? renderPreviewText(bodyText, "BODY", paramValues)
		: "";
 
	return (
		<div className="space-y-3">
			{/* Parameter inputs */}
			{slots.length > 0 && (
				<div className="space-y-2">
					<p className="text-xs font-medium text-foreground-muted uppercase tracking-wide">
						Template Variables
					</p>
					{slots.map((slot) => {
						const key = `${slot.componentType}_${slot.index}`;
						return (
							<div key={key}>
								<label
									htmlFor={`param-${key}`}
									className="block text-xs text-foreground-muted mb-0.5"
								>
									{slot.componentType === "HEADER" ? "Header" : "Body"} {"{{"}
									{slot.index}
									{"}}"}
								</label>
								<input
									id={`param-${key}`}
									type="text"
									value={paramValues[key] || ""}
									onChange={(e) => onParamChange(key, e.target.value)}
									placeholder={`Value for {{${slot.index}}}`}
									className="w-full rounded-md border border-border-default px-3 py-1.5 text-sm focus:outline-none focus:ring-2 focus:ring-green-500"
								/>
							</div>
						);
					})}
				</div>
			)}
 
			{/* Live preview */}
			<div>
				<p className="text-xs font-medium text-foreground-muted uppercase tracking-wide mb-1">
					Preview
				</p>
				<WhatsAppMessagePreview
					headerText={previewHeader}
					bodyText={previewBody}
					footerText={footerText}
				/>
			</div>
		</div>
	);
}