← Files WixARCHIVED FILE

skills/wix-headless-templates/donations/project/src/hooks/donations/useCampaigns.ts

1.03 KB · Oct 8, 2026 · 12:02 UTC

↓ Download file

See the change to this file →

// React binding of the campaigns store (wix/donations/campaigns-store.ts) — the listing logic lives
// there, framework-free; this hook subscribes to one instance per mounted listing. SSR-friendly:
// pass server-fetched data as `initialCampaigns` (Astro frontmatter / server component) and no
// client fetch happens; a SPA passes nothing.
import { useEffect, useRef, useSyncExternalStore } from "react";
import { createCampaignsStore, type CampaignsState, type CampaignsStore, type CampaignsStoreOptions } from "../../wix/donations/campaigns-store";

export type UseCampaignsOptions = CampaignsStoreOptions;

export type UseCampaigns = CampaignsState;

export function useCampaigns(options: UseCampaignsOptions = {}): UseCampaigns {
  const ref = useRef<CampaignsStore | null>(null);
  if (!ref.current) ref.current = createCampaignsStore(options);
  const store = ref.current;
  useEffect(() => {
    store.start();
    return () => store.stop();
  }, [store]);
  return useSyncExternalStore(store.subscribe, store.getState, store.getState);
}

SHA-256: 84ea615d69b77aa3381142b9ff1ffb851037aa9102f3bbd6b22975fec829486e