2.4 KiB
notifications
Teksty powiadomień (wyniki akcji) konfigurowane w panelu, per język, z
fallbackiem. Na dziś obsługuje komunikaty wyników formularza (submitForm),
z miejscem na przyszłe konteksty. Global Notifications, budowany zawsze.
Zasada
Plugin daje KOD wyniku (submitForm zwraca reason), nie tekst. Ten moduł
mapuje kod → tekst z panelu (localized), z fallbackiem angielskim per pole.
Front dostaje gotowy string i styluje go jak chce (toast, inline, banner).
Dzięki temu żaden komunikat nie jest zaszyty w kodzie — wszystko przez panel.
Config
Brak opcji — global Notifications jest zawsze budowany. Edytor zarządza
tekstami w panelu (karta Notifications), grupowane per kontekst. Grupa form:
success, error, rateLimited, turnstile, validation, consent,
notFound. Każde pole puste → fallback (NOTIFICATION_FALLBACK).
Helper — getNotificationTexts
Pobiera teksty z globala per język, fallback per pole. Analog getConsentTexts:
import { getNotificationTexts } from '@intecion/ipal-kit'
const notifications = await getNotificationTexts({ payload, locale })
// notifications.form.error, notifications.form.success, ...
Mapowanie wyniku — resolveFormMessage
Most między submitForm a UI: bierze wynik i teksty, zwraca jeden komunikat.
Interpoluje {field} w walidacji. NIGDY nie pokazuje surowego wyjątku
(error → generyczny tekst, nie treść błędu backendu).
import { resolveFormMessage } from '@intecion/ipal-kit'
const result = await submitFormAction(...)
if (!result.success) {
setError(resolveFormMessage(result, notifications.form))
}
To zastępuje sztywne Błąd: ${result.reason} — teraz przyjazny tekst z panelu,
per język.
Interpolacja {field}
Tekst validation może zawierać {field} — podstawia się nazwa pola z błędem:
Panel: "Sprawdź pole {field} i spróbuj ponownie."
Wynik: "Sprawdź pole email i spróbuj ponownie."
Rozszerzanie o nowe konteksty
Grupa form to pierwszy kontekst. Kolejne (newsletter, system) dodaje się
tak samo — nowa grupa w globals/Notifications/fields.ts + pole w typach +
fallback. getNotificationTexts resolwuje, co istnieje.
Dostęp
Global ma read: () => true — teksty są publiczne (pokazywane użytkownikom
końcowym), więc front czyta je bez sesji. Inaczej niż SiteIntegrations
(read: isAdmin — tam sekrety).