156 lines
4.2 KiB
JavaScript
156 lines
4.2 KiB
JavaScript
"use client";
|
|
|
|
// packages/react/src/provider.tsx
|
|
import Lenis from "lenis";
|
|
import {
|
|
createContext,
|
|
forwardRef,
|
|
useCallback,
|
|
useEffect as useEffect2,
|
|
useImperativeHandle,
|
|
useRef,
|
|
useState as useState2
|
|
} from "react";
|
|
|
|
// packages/react/src/store.ts
|
|
import { useEffect, useState } from "react";
|
|
var Store = class {
|
|
constructor(state) {
|
|
this.state = state;
|
|
}
|
|
listeners = [];
|
|
set(state) {
|
|
this.state = state;
|
|
for (let listener of this.listeners) {
|
|
listener(this.state);
|
|
}
|
|
}
|
|
subscribe(listener) {
|
|
this.listeners = [...this.listeners, listener];
|
|
return () => {
|
|
this.listeners = this.listeners.filter((l) => l !== listener);
|
|
};
|
|
}
|
|
get() {
|
|
return this.state;
|
|
}
|
|
};
|
|
function useStore(store) {
|
|
const [state, setState] = useState(store.get());
|
|
useEffect(() => {
|
|
return store.subscribe((state2) => setState(state2));
|
|
}, [store]);
|
|
return state;
|
|
}
|
|
|
|
// packages/react/src/provider.tsx
|
|
import { jsx } from "react/jsx-runtime";
|
|
var LenisContext = createContext(null);
|
|
var rootLenisContextStore = new Store(null);
|
|
var ReactLenis = forwardRef(
|
|
({
|
|
children,
|
|
root = false,
|
|
options = {},
|
|
autoRaf = true,
|
|
...props
|
|
}, ref) => {
|
|
const wrapperRef = useRef(null);
|
|
const contentRef = useRef(null);
|
|
const [lenis, setLenis] = useState2(void 0);
|
|
useImperativeHandle(
|
|
ref,
|
|
() => ({
|
|
wrapper: wrapperRef.current,
|
|
content: contentRef.current,
|
|
lenis
|
|
}),
|
|
[lenis]
|
|
);
|
|
useEffect2(() => {
|
|
const lenis2 = new Lenis({
|
|
...options,
|
|
...wrapperRef.current && contentRef.current && {
|
|
wrapper: wrapperRef.current,
|
|
content: contentRef.current
|
|
},
|
|
autoRaf: options?.autoRaf ?? autoRaf
|
|
// this is to avoid breaking the autoRaf prop if it's still used (require breaking change)
|
|
});
|
|
setLenis(lenis2);
|
|
return () => {
|
|
lenis2.destroy();
|
|
setLenis(void 0);
|
|
};
|
|
}, [root, JSON.stringify({ ...options, wrapper: null, content: null })]);
|
|
const callbacksRefs = useRef([]);
|
|
const addCallback = useCallback(
|
|
(callback, priority) => {
|
|
callbacksRefs.current.push({ callback, priority });
|
|
callbacksRefs.current.sort((a, b) => a.priority - b.priority);
|
|
},
|
|
[]
|
|
);
|
|
const removeCallback = useCallback(
|
|
(callback) => {
|
|
callbacksRefs.current = callbacksRefs.current.filter(
|
|
(cb) => cb.callback !== callback
|
|
);
|
|
},
|
|
[]
|
|
);
|
|
useEffect2(() => {
|
|
if (root && lenis) {
|
|
rootLenisContextStore.set({ lenis, addCallback, removeCallback });
|
|
return () => rootLenisContextStore.set(null);
|
|
}
|
|
}, [root, lenis, addCallback, removeCallback]);
|
|
useEffect2(() => {
|
|
if (!lenis) return;
|
|
const onScroll = (data) => {
|
|
for (let i = 0; i < callbacksRefs.current.length; i++) {
|
|
callbacksRefs.current[i]?.callback(data);
|
|
}
|
|
};
|
|
lenis.on("scroll", onScroll);
|
|
return () => {
|
|
lenis.off("scroll", onScroll);
|
|
};
|
|
}, [lenis]);
|
|
if (!children) return null;
|
|
return /* @__PURE__ */ jsx(
|
|
LenisContext.Provider,
|
|
{
|
|
value: { lenis, addCallback, removeCallback },
|
|
children: root && root !== "asChild" ? children : /* @__PURE__ */ jsx("div", { ref: wrapperRef, ...props, children: /* @__PURE__ */ jsx("div", { ref: contentRef, children }) })
|
|
}
|
|
);
|
|
}
|
|
);
|
|
|
|
// packages/react/src/use-lenis.ts
|
|
import { useContext, useEffect as useEffect3 } from "react";
|
|
var fallbackContext = {};
|
|
function useLenis(callback, deps = [], priority = 0) {
|
|
const localContext = useContext(LenisContext);
|
|
const rootContext = useStore(rootLenisContextStore);
|
|
const currentContext = localContext ?? rootContext ?? fallbackContext;
|
|
const { lenis, addCallback, removeCallback } = currentContext;
|
|
useEffect3(() => {
|
|
if (!callback || !addCallback || !removeCallback || !lenis) return;
|
|
addCallback(callback, priority);
|
|
callback(lenis);
|
|
return () => {
|
|
removeCallback(callback);
|
|
};
|
|
}, [lenis, addCallback, removeCallback, priority, ...deps]);
|
|
return lenis;
|
|
}
|
|
export {
|
|
ReactLenis as Lenis,
|
|
LenisContext,
|
|
ReactLenis,
|
|
ReactLenis as default,
|
|
useLenis
|
|
};
|
|
//# sourceMappingURL=lenis-react.mjs.map
|