import { writable } from "svelte/store";
export default (
sizes = { phone: 0, tablet: 768, desktop: 1024, xxl: 1749 },
) => {
const defaultValue = { name: null, width: null, nodeWidth: null, rect: null };
const { subscribe, unsubscribe, set } = writable(defaultValue);
let ro = null;
let node = null;
const unobserve = () => {
if (!node) return;
ro.unobserve(node);
node = null;
};
const observe = (nodeToObserve) => {
if (!nodeToObserve) return null;
if (node) unobserve();
node = nodeToObserve;
let lastWidth = null;
ro = new ResizeObserver(() => {
const rect = node.getBoundingClientRect();
const nodeWidth = rect.width;
if (lastWidth === nodeWidth) return;
lastWidth = nodeWidth;
set(
Object.entries(sizes)
.sort((a, b) => a[1] - b[1])
.reduce(
(cum, item) =>
item[1] <= nodeWidth
? { name: item[0], width: item[1], nodeWidth, rect }
: cum,
defaultValue,
),
);
});
ro.observe(node);
return node;
return {
subscribe,
unsubscribe,
observe,
unobserve,