mirror of
https://github.com/carbon-design-system/carbon-components-svelte.git
synced 2025-09-19 03:49:34 +00:00
36 lines
1 KiB
JavaScript
36 lines
1 KiB
JavaScript
import { onMount } from "svelte";
|
|
import { get, writable } from "svelte/store";
|
|
|
|
/** A set of stores indicating whether a modal is open. */
|
|
const stores = new Set();
|
|
|
|
/** Store for the number of open modals. */
|
|
const modalsOpen = writable(0);
|
|
|
|
const updateModalsOpen = () =>
|
|
modalsOpen.set([...stores].filter((open) => get(open)).length);
|
|
|
|
/**
|
|
* Adds a modal's store to the open modal tracking.
|
|
* Has to be called during component initialization.
|
|
* Modal is automatically removed on destroy.
|
|
* @param {import('svelte/store').Readable<boolean>} openStore
|
|
* Store that indicates whether the modal is opened.
|
|
*/
|
|
export const trackModal = (openStore) =>
|
|
onMount(() => {
|
|
stores.add(openStore);
|
|
const unsubscribe = openStore.subscribe(updateModalsOpen);
|
|
|
|
return () => {
|
|
unsubscribe();
|
|
stores.delete(openStore);
|
|
|
|
updateModalsOpen();
|
|
};
|
|
});
|
|
|
|
modalsOpen.subscribe((openCount) => {
|
|
if (typeof document !== "undefined")
|
|
document.body.classList.toggle("bx--body--with-modal-open", openCount > 0);
|
|
});
|