banner: fix control config merge behaviour
This commit is contained in:
@@ -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>
|
||||
|
||||
|
||||
@@ -84,6 +84,7 @@
|
||||
title="Manage Cookies"
|
||||
controls={{
|
||||
moreInfo: { label: 'More Info', type: 'link', href: '#!' },
|
||||
dismiss: null,
|
||||
swap: true
|
||||
}}
|
||||
onaccept={() => console.log('Cookies accepted!')}
|
||||
|
||||
Reference in New Issue
Block a user