banner: fix control config merge behaviour

This commit is contained in:
Elijah Duffy
2025-12-15 17:14:22 -08:00
parent ed48b404d4
commit 42c9bc0bcc
2 changed files with 28 additions and 10 deletions

View File

@@ -39,7 +39,7 @@
| null;
dismiss?: Omit<BannerControlButton, 'framed'> | null;
/** if true, accept and decline buttons are swapped with more info */
swap?: boolean;
swap?: boolean | null;
};
const defaultBannerControls: BannerControls = {
@@ -61,17 +61,34 @@
const mergeBannerControls = (
defaults: BannerControls,
overrides: BannerControls | null | undefined
overrides?: BannerControls | null
): BannerControls => {
if (!overrides) return defaults;
if (overrides == null) return { ...defaults };
return {
accept: overrides.accept ?? defaults.accept,
decline: overrides.decline ?? defaults.decline,
moreInfo: overrides.moreInfo ?? defaults.moreInfo,
dismiss: overrides.dismiss ?? defaults.dismiss,
swap: overrides.swap ?? defaults.swap
};
const result: BannerControls = { ...defaults };
const keys: (keyof BannerControls)[] = ['accept', 'decline', 'moreInfo', 'dismiss', 'swap'];
for (const key of keys) {
const ov = overrides[key];
if (ov === null) {
// explicit disable
result[key] = null;
continue;
}
if (ov === undefined) continue; // keep default
if (key === 'swap') {
result.swap = ov as boolean;
continue;
}
// shallow merge individual control fields
result[key] = {
...(defaults[key] ?? {}),
...(ov as any)
} as any;
}
return result;
};
</script>

View File

@@ -84,6 +84,7 @@
title="Manage Cookies"
controls={{
moreInfo: { label: 'More Info', type: 'link', href: '#!' },
dismiss: null,
swap: true
}}
onaccept={() => console.log('Cookies accepted!')}