@expofp/floorplan
Version:
Interactive floor plan library for expos and events
2 lines (1 loc) • 1.14 kB
JavaScript
import{useCallback as L,useEffect as m,useLayoutEffect as O,useRef as h,useState as x}from"react";import{nextLogoPage as P}from"./logo-page.js";function W(e,t,c){return e.maxWidth===c&&e.next===t.next&&e.fitsAll===t.fitsAll&&e.wrapped===t.wrapped&&e.items.length===t.items.length&&e.items.every((u,a)=>u===t.items[a])}export function useLogoRotation(e){const{ready:t,layoutKey:c,paused:u,delayMs:a,debounceMs:g}=e,[s,K]=x(null),[R,T]=x(0),f=h({options:e,state:s});O(()=>{f.current={options:e,state:s}});const d=h(null),o=L((r,i)=>{const{options:n,state:l}=f.current,p=n.measureWidth(),y=P(n.items,r,n.widthOf,p,n.spacing);if(d.current=n.layoutKey,T(A=>A+1),!i&&l?.start===r&&W(l.page,y,p))return;const w=l?l.page.seq+(i?1:0):0;K({start:r,page:{...y,maxWidth:p,seq:w}})},[]);return m(()=>{t&&o(0,!1)},[t,o]),m(()=>{if(!t)return;const r=setTimeout(()=>{const{options:i,state:n}=f.current;n&&d.current!==i.layoutKey&&o(n.start,!1)},g);return()=>clearTimeout(r)},[t,c,g,o]),m(()=>{if(!s||s.page.fitsAll||!s.page.items.length||u)return;const r=setTimeout(()=>o(s.page.next,!0),a);return()=>clearTimeout(r)},[s,u,a,o]),{page:s?.page??null,pass:R}}