// Copyright: © 2026 TWWIM UG. All rights reserved. (www.twwim.com) /** * Wire-shape normaliser for plugin settings. * * Trims each phrase, drops empty ones. Does not mutate input. * * @layer Presentation */ import type { UpdatePluginSettingsRequest } from '@archer/api-interface'; import type { FormState } from './constants'; function normaliseMap(m: Record): Record { const out: Record = {}; for (const [locale, phrases] of Object.entries(m)) { out[locale] = phrases.map((p) => p.trim()).filter((p) => p.length > 0); } return out; } export function normaliseForWire(form: FormState): UpdatePluginSettingsRequest { const scenarioRaw = form.snippet.scenario; const scenarioTrimmed = typeof scenarioRaw === 'string' ? scenarioRaw.trim() : ''; const scenario = scenarioRaw === null || scenarioTrimmed.length === 0 ? null : scenarioTrimmed; return { visibility: { ...form.visibility }, snippet: { theme: form.snippet.theme.trim(), dock: form.snippet.dock, uiCacheTTL: form.snippet.uiCacheTTL, scenario, domIndexer: form.snippet.domIndexer, deploymentTarget: form.snippet.deploymentTarget, }, attention: { enabled: form.attention.enabled, welcome: { ...form.attention.welcome, messages: normaliseMap(form.attention.welcome.messages), }, idle: { ...form.attention.idle, messages: normaliseMap(form.attention.idle.messages), }, }, }; }