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; | null;
dismiss?: Omit<BannerControlButton, 'framed'> | null; dismiss?: Omit<BannerControlButton, 'framed'> | null;
/** if true, accept and decline buttons are swapped with more info */ /** if true, accept and decline buttons are swapped with more info */
swap?: boolean; swap?: boolean | null;
}; };
const defaultBannerControls: BannerControls = { const defaultBannerControls: BannerControls = {
@@ -61,17 +61,34 @@
const mergeBannerControls = ( const mergeBannerControls = (
defaults: BannerControls, defaults: BannerControls,
overrides: BannerControls | null | undefined overrides?: BannerControls | null
): BannerControls => { ): BannerControls => {
if (!overrides) return defaults; if (overrides == null) return { ...defaults };
return { const result: BannerControls = { ...defaults };
accept: overrides.accept ?? defaults.accept,
decline: overrides.decline ?? defaults.decline, const keys: (keyof BannerControls)[] = ['accept', 'decline', 'moreInfo', 'dismiss', 'swap'];
moreInfo: overrides.moreInfo ?? defaults.moreInfo,
dismiss: overrides.dismiss ?? defaults.dismiss, for (const key of keys) {
swap: overrides.swap ?? defaults.swap 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> </script>

View File

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