Files
sass-mohfarawati/lib/marquee-settings.ts
T

129 lines
3.0 KiB
TypeScript

export const MARQUEE_SETTINGS_KEY = "marquee_settings";
export type MarqueeLocaleSettings = {
row1: string;
row2: string;
row3: string;
row4: string;
};
export type MarqueeSettings = {
locales: {
ar: MarqueeLocaleSettings;
en: MarqueeLocaleSettings;
de: MarqueeLocaleSettings;
};
};
const DEFAULT_ROW_1 = [
"Next.js",
"React",
"WordPress",
"Docker",
"Technical SEO",
"Tailwind CSS",
"Google Analytics",
"Framer Motion",
"Cloudflare",
"Performance",
].join("\n");
const DEFAULT_ROW_2 = [
"TypeScript",
"Node.js",
"WooCommerce",
"Schema Markup",
"DevOps",
"Responsive Design",
"Core Web Vitals",
"Plausible Analytics",
"Design Systems",
"Server Infrastructure",
].join("\n");
const DEFAULT_ROW_3 = [
"JavaScript",
"REST APIs",
"Git",
"Linux",
"Search Console",
"Conversion Tracking",
"UI Engineering",
"Accessibility",
"Component Architecture",
"Web Performance",
].join("\n");
const DEFAULT_ROW_4 = [
"Frontend Strategy",
"CMS Integration",
"Motion Design",
"Content Architecture",
"E-Commerce",
"SEO Audits",
"Deployments",
"Scalable UI",
"Analytics Setup",
"Product Pages",
].join("\n");
function buildDefaultLocaleSettings(): MarqueeLocaleSettings {
return {
row1: DEFAULT_ROW_1,
row2: DEFAULT_ROW_2,
row3: DEFAULT_ROW_3,
row4: DEFAULT_ROW_4,
};
}
export function buildDefaultMarqueeSettings(): MarqueeSettings {
return {
locales: {
ar: buildDefaultLocaleSettings(),
en: buildDefaultLocaleSettings(),
de: buildDefaultLocaleSettings(),
},
};
}
function normalizeLocaleSettings(value: unknown, defaults: MarqueeLocaleSettings): MarqueeLocaleSettings {
const candidate = value && typeof value === "object" ? (value as Record<string, unknown>) : {};
return {
row1: typeof candidate.row1 === "string" && candidate.row1.trim() ? candidate.row1.trim() : defaults.row1,
row2: typeof candidate.row2 === "string" && candidate.row2.trim() ? candidate.row2.trim() : defaults.row2,
row3: typeof candidate.row3 === "string" && candidate.row3.trim() ? candidate.row3.trim() : defaults.row3,
row4: typeof candidate.row4 === "string" && candidate.row4.trim() ? candidate.row4.trim() : defaults.row4,
};
}
export function parseMarqueeSettingsValue(rawValue?: string | null): MarqueeSettings {
const defaults = buildDefaultMarqueeSettings();
if (!rawValue) {
return defaults;
}
try {
const parsed = JSON.parse(rawValue) as { locales?: Record<string, unknown> };
const locales = parsed && typeof parsed === "object" ? parsed.locales : undefined;
return {
locales: {
ar: normalizeLocaleSettings(locales?.ar, defaults.locales.ar),
en: normalizeLocaleSettings(locales?.en, defaults.locales.en),
de: normalizeLocaleSettings(locales?.de, defaults.locales.de),
},
};
} catch {
return defaults;
}
}
export function splitMarqueeRowItems(rawValue: string): string[] {
return rawValue
.split(/\r?\n|,/)
.map((item) => item.trim())
.filter(Boolean);
}