tutu/src/platform/anim.ts

48 lines
992 B
TypeScript
Raw Normal View History

import {
createContext,
createRenderEffect,
createSignal,
untrack,
useContext,
type Accessor,
type Signal,
} from "solid-js";
2024-07-14 20:28:44 +08:00
2024-08-05 15:33:00 +08:00
export type HeroSource = {
[key: string | symbol | number]: DOMRect | undefined;
2024-08-05 15:33:00 +08:00
};
2024-07-14 20:28:44 +08:00
const HeroSourceContext = createContext<Signal<HeroSource>>(undefined);
2024-07-14 20:28:44 +08:00
2024-08-05 15:33:00 +08:00
export const HeroSourceProvider = HeroSourceContext.Provider;
2024-07-14 20:28:44 +08:00
function useHeroSource() {
2024-08-05 15:33:00 +08:00
return useContext(HeroSourceContext);
2024-07-14 20:28:44 +08:00
}
export function useHeroSignal(
key: string | symbol | number,
): Accessor<DOMRect | undefined> {
const source = useHeroSource();
if (source) {
const [get, set] = createSignal<DOMRect>();
createRenderEffect(() => {
const value = source[0]();
console.debug("value", value);
if (value[key]) {
set(value[key]);
source[1]((x) => {
const cpy = Object.assign({}, x);
delete cpy[key];
return cpy;
});
}
});
return get;
} else {
return () => undefined;
}
}