Add admin site settings sections and locale defaults

This commit is contained in:
MOH
2026-03-15 04:06:33 +01:00
parent 3e9edc5873
commit 5d3f77962a
21 changed files with 993 additions and 456 deletions
+33
View File
@@ -13,6 +13,7 @@ export const SITE_NAME_TOKEN = "{siteName}";
export const DEFAULT_SITE_NAME = "moh-sass";
export const DEFAULT_SITE_DESCRIPTION = "Multilingual Next.js base project";
export const DEFAULT_SITE_PRIMARY_COLOR = "#dc5a35";
type SiteLocaleSettings = {
siteName: string;
@@ -21,7 +22,13 @@ type SiteLocaleSettings = {
subhead: string;
};
type SiteBrandSettings = {
primaryColor: string;
};
export type SiteSettings = {
defaultLocale: AppLocale;
brand: SiteBrandSettings;
locales: Record<AppLocale, SiteLocaleSettings>;
};
@@ -64,6 +71,20 @@ function normalizeSiteLocaleSettings(
};
}
export function normalizeSiteDefaultLocale(input: unknown): AppLocale {
return input === "ar" || input === "en" || input === "de" ? input : "de";
}
export function normalizeSitePrimaryColor(input: unknown): string {
if (typeof input !== "string") {
return DEFAULT_SITE_PRIMARY_COLOR;
}
const value = input.trim();
return /^#([0-9a-fA-F]{6})$/.test(value) ? value.toLowerCase() : DEFAULT_SITE_PRIMARY_COLOR;
}
export function getDefaultSiteSettingsMediaBindings(): SiteSettingsMediaBindings {
return {
siteLogoLight: null,
@@ -75,6 +96,10 @@ export function getDefaultSiteSettingsMediaBindings(): SiteSettingsMediaBindings
export function buildDefaultSiteSettings(fallbackName = DEFAULT_SITE_NAME): SiteSettings {
return {
defaultLocale: "de",
brand: {
primaryColor: DEFAULT_SITE_PRIMARY_COLOR,
},
locales: {
ar: {
siteName: fallbackName,
@@ -115,6 +140,14 @@ export function parseSiteSettingsValue(
: {};
const siteSettings: SiteSettings = {
defaultLocale: normalizeSiteDefaultLocale(parsed.defaultLocale),
brand: {
primaryColor: normalizeSitePrimaryColor(
parsed.brand && typeof parsed.brand === "object"
? (parsed.brand as Record<string, unknown>).primaryColor
: undefined,
),
},
locales: {
ar: normalizeSiteLocaleSettings(
locales.ar && typeof locales.ar === "object" ? (locales.ar as Record<string, unknown>) : {},