UNPKG

resig.js

Version:

Universal reactive signal library with complete platform features: signals, animations, CRDTs, scheduling, DOM integration. Works identically across React, SolidJS, Svelte, Vue, and Qwik.

290 lines 24.4 kB
import { useSyncExternalStore, useRef } from 'react'; import { signal } from '../core/signal'; import { effect } from '../core/effect'; import { machine } from '../algebras/state'; import { fetch } from '../algebras/fetch'; /** * React Hooks for Signal-Σ - NO dependency arrays needed! * All hooks use useSyncExternalStore for automatic re-renders */ // Hook for basic signals - replaces useState completely export function useSignal(initialValue) { const sigRef = useRef(); if (!sigRef.current) { sigRef.current = signal(initialValue); } const value = useSyncExternalStore(sigRef.current.subscribe, sigRef.current.value); return [value, sigRef.current._set]; } // Hook for computed signals - NO dependency arrays! // React's re-rendering handles the reactivity automatically export function useComputed(compute) { return compute(); } // Hook for effects - monadic composition export function useEffect(initialValue) { const effRef = useRef(); if (!effRef.current) { effRef.current = effect(initialValue); } const value = useSyncExternalStore(effRef.current.subscribe, effRef.current.value); return [value, effRef.current._set, effRef.current]; } // Hook for state machines - replaces complex useState patterns export function useMachine(initialState, reducer) { const machineRef = useRef(); if (!machineRef.current) { machineRef.current = machine(initialState, reducer); } const state = useSyncExternalStore(machineRef.current.subscribe, () => machineRef.current.state); return [state, machineRef.current.send]; } // Hook for async data fetching - replaces React Query export function useFetch(fetcher) { const fetchRef = useRef(); if (!fetchRef.current) { fetchRef.current = fetch(fetcher); } const state = useSyncExternalStore(fetchRef.current.subscribe, fetchRef.current.value); return [ state, fetchRef.current.refetch, (n) => { const retryFetch = fetchRef.current.retry(n); // Subscribe to retry results retryFetch.subscribe((retryState) => { fetchRef.current._set(retryState); }); } ]; } // Hook for derived/computed values from multiple signals // React's re-rendering handles the reactivity automatically export function useDerived(derive) { return derive(); } // Hook for signal with validation export function useValidatedSignal(initialValue, validator, onError) { const sigRef = useRef(); const isValidRef = useRef(); if (!sigRef.current) { sigRef.current = signal(initialValue); } if (!isValidRef.current) { isValidRef.current = signal(validator(initialValue)); } const setValue = (value) => { const valid = validator(value); if (valid) { sigRef.current._set(value); isValidRef.current._set(true); } else { isValidRef.current._set(false); onError?.(value); } }; const value = useSyncExternalStore(sigRef.current.subscribe, sigRef.current.value); const valid = useSyncExternalStore(isValidRef.current.subscribe, isValidRef.current.value); return [value, setValue, valid]; } // Hook for debounced signals export function useDebouncedSignal(initialValue, delay) { const immediateRef = useRef(); const debouncedRef = useRef(); const timeoutRef = useRef(); if (!immediateRef.current) { immediateRef.current = signal(initialValue); } if (!debouncedRef.current) { debouncedRef.current = signal(initialValue); } const setValue = (value) => { immediateRef.current._set(value); clearTimeout(timeoutRef.current); timeoutRef.current = setTimeout(() => { debouncedRef.current._set(value); }, delay); }; const immediateValue = useSyncExternalStore(immediateRef.current.subscribe, immediateRef.current.value); const debouncedValue = useSyncExternalStore(debouncedRef.current.subscribe, debouncedRef.current.value); return [immediateValue, setValue, debouncedValue]; } // Hook for persistent signals (localStorage) export function usePersistentSignal(key, initialValue) { const sigRef = useRef(); if (!sigRef.current) { // Try to load from localStorage let storedValue = initialValue; try { const stored = localStorage.getItem(key); if (stored) { storedValue = JSON.parse(stored); } } catch (e) { // Use initial value if parsing fails } sigRef.current = signal(storedValue); // Subscribe to changes and persist them sigRef.current.subscribe(() => { try { localStorage.setItem(key, JSON.stringify(sigRef.current.value())); } catch (e) { // Ignore storage errors } }); } const value = useSyncExternalStore(sigRef.current.subscribe, sigRef.current.value); return [value, sigRef.current._set]; } // Hook for async signals - handles Promise-based values export function useAsyncSignal(asyncFn, initialValue) { const stateRef = useRef(); const abortControllerRef = useRef(); if (!stateRef.current) { stateRef.current = signal({ data: initialValue, loading: false, error: undefined, }); } const refetch = () => { // Cancel previous request if (abortControllerRef.current) { abortControllerRef.current.abort(); } abortControllerRef.current = new AbortController(); stateRef.current._set({ data: stateRef.current.value().data, loading: true, error: undefined, }); asyncFn() .then((data) => { if (!abortControllerRef.current?.signal.aborted) { stateRef.current._set({ data, loading: false, error: undefined }); } }) .catch((error) => { if (!abortControllerRef.current?.signal.aborted) { stateRef.current._set({ data: stateRef.current.value().data, loading: false, error: error instanceof Error ? error : new Error(String(error)), }); } }); }; const setValue = (value) => { stateRef.current._set({ data: value, loading: false, error: undefined }); }; const state = useSyncExternalStore(stateRef.current.subscribe, stateRef.current.value); return [state, refetch, setValue]; } // Hook for async computed values - Simplified approach to avoid infinite loops // Use manual trigger pattern for now until we can implement proper dependency tracking export function useAsyncComputed(asyncCompute, deps = []) { const stateRef = useRef(); const abortControllerRef = useRef(); const lastDepsRef = useRef([]); const isInitializedRef = useRef(false); if (!stateRef.current) { stateRef.current = signal({ data: undefined, loading: false, error: undefined, }); } // Check if dependencies changed const depsChanged = !isInitializedRef.current || deps.length !== lastDepsRef.current.length || deps.some((dep, index) => dep !== lastDepsRef.current[index]); if (depsChanged) { isInitializedRef.current = true; lastDepsRef.current = [...deps]; // Cancel previous computation if (abortControllerRef.current) { abortControllerRef.current.abort(); } abortControllerRef.current = new AbortController(); // Defer state update to avoid render-time updates setTimeout(() => { stateRef.current._set({ data: stateRef.current.value().data, loading: true, error: undefined, }); asyncCompute() .then((data) => { if (!abortControllerRef.current?.signal.aborted) { stateRef.current._set({ data, loading: false, error: undefined }); } }) .catch((error) => { if (!abortControllerRef.current?.signal.aborted) { stateRef.current._set({ data: stateRef.current.value().data, loading: false, error: error instanceof Error ? error : new Error(String(error)), }); } }); }, 0); } const state = useSyncExternalStore(stateRef.current.subscribe, stateRef.current.value); return state; } // Hook for async computed signals - returns a signal that can be used in other computations export function useAsyncComputedSignal(asyncCompute, deps = []) { const stateRef = useRef(); const abortControllerRef = useRef(); const lastDepsRef = useRef([]); const isInitializedRef = useRef(false); if (!stateRef.current) { stateRef.current = signal({ data: undefined, loading: false, error: undefined, }); } // Check if dependencies changed const depsChanged = !isInitializedRef.current || deps.length !== lastDepsRef.current.length || deps.some((dep, index) => dep !== lastDepsRef.current[index]); if (depsChanged) { isInitializedRef.current = true; lastDepsRef.current = [...deps]; // Cancel previous computation if (abortControllerRef.current) { abortControllerRef.current.abort(); } abortControllerRef.current = new AbortController(); // Defer state update to avoid render-time updates setTimeout(() => { stateRef.current._set({ data: stateRef.current.value().data, loading: true, error: undefined, }); asyncCompute() .then((data) => { if (!abortControllerRef.current?.signal.aborted) { stateRef.current._set({ data, loading: false, error: undefined }); } }) .catch((error) => { if (!abortControllerRef.current?.signal.aborted) { stateRef.current._set({ data: stateRef.current.value().data, loading: false, error: error instanceof Error ? error : new Error(String(error)), }); } }); }, 0); } return stateRef.current; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvcmVhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUNyRCxPQUFPLEVBQTJCLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pFLE9BQU8sRUFBVSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQWdCLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFELE9BQU8sRUFBUyxLQUFLLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRDs7O0dBR0c7QUFFSCx3REFBd0Q7QUFDeEQsTUFBTSxVQUFVLFNBQVMsQ0FBSSxZQUFlO0lBQzFDLE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBYSxDQUFDO0lBQ25DLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEIsTUFBTSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELE1BQU0sS0FBSyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkYsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRCxvREFBb0Q7QUFDcEQsNERBQTREO0FBQzVELE1BQU0sVUFBVSxXQUFXLENBQUksT0FBZ0I7SUFDN0MsT0FBTyxPQUFPLEVBQUUsQ0FBQztBQUNuQixDQUFDO0FBRUQseUNBQXlDO0FBQ3pDLE1BQU0sVUFBVSxTQUFTLENBQUksWUFBZTtJQUMxQyxNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQWEsQ0FBQztJQUNuQyxJQUFJLENBQUMsTUFBTSxD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