@tanstack/react-db
Version:
React integration for @tanstack/db
1 lines • 2.8 kB
Source Map (JSON)
{"version":3,"file":"useLiveQueryEffect.cjs","sources":["../../src/useLiveQueryEffect.ts"],"sourcesContent":["import { useEffect, useRef } from 'react'\nimport { createEffect } from '@tanstack/db'\nimport type { Effect, EffectConfig } from '@tanstack/db'\n\n/**\n * React hook for creating a reactive effect that fires handlers when rows\n * enter, exit, or update within a query result.\n *\n * The effect is created on mount and disposed on unmount. If `deps` change,\n * the previous effect is disposed and a new one is created.\n *\n * @example\n * ```tsx\n * function ChatComponent() {\n * useLiveQueryEffect(\n * {\n * query: (q) => q.from({ msg: messages }).where(({ msg }) => eq(msg.role, 'user')),\n * skipInitial: true,\n * onEnter: async (event) => {\n * await generateResponse(event.value)\n * },\n * },\n * []\n * )\n *\n * return <div>...</div>\n * }\n * ```\n */\nexport function useLiveQueryEffect<\n TRow extends object = Record<string, unknown>,\n TKey extends string | number = string | number,\n>(config: EffectConfig<TRow, TKey>, deps: React.DependencyList = []): void {\n const configRef = useRef<EffectConfig<TRow, TKey>>(config)\n configRef.current = config\n\n useEffect(() => {\n const effect: Effect = createEffect<TRow, TKey>({\n id: config.id,\n query: config.query,\n skipInitial: config.skipInitial,\n onEnter: (event, ctx) => configRef.current.onEnter?.(event, ctx),\n onUpdate: (event, ctx) => configRef.current.onUpdate?.(event, ctx),\n onExit: (event, ctx) => configRef.current.onExit?.(event, ctx),\n onBatch: (events, ctx) => configRef.current.onBatch?.(events, ctx),\n onError: config.onError\n ? (error, event) => configRef.current.onError?.(error, event)\n : undefined,\n onSourceError: config.onSourceError\n ? (error) => configRef.current.onSourceError?.(error)\n : undefined,\n })\n\n return () => {\n // Fire-and-forget disposal; AbortSignal cancels in-flight work\n effect.dispose()\n }\n }, deps)\n}\n"],"names":["useRef","useEffect","createEffect"],"mappings":";;;;AA6BO,SAAS,mBAGd,QAAkC,OAA6B,IAAU;AACzE,QAAM,YAAYA,MAAAA,OAAiC,MAAM;AACzD,YAAU,UAAU;AAEpBC,QAAAA,UAAU,MAAM;AACd,UAAM,SAAiBC,GAAAA,aAAyB;AAAA,MAC9C,IAAI,OAAO;AAAA,MACX,OAAO,OAAO;AAAA,MACd,aAAa,OAAO;AAAA,MACpB,SAAS,CAAC,OAAO,QAAQ,UAAU,QAAQ,UAAU,OAAO,GAAG;AAAA,MAC/D,UAAU,CAAC,OAAO,QAAQ,UAAU,QAAQ,WAAW,OAAO,GAAG;AAAA,MACjE,QAAQ,CAAC,OAAO,QAAQ,UAAU,QAAQ,SAAS,OAAO,GAAG;AAAA,MAC7D,SAAS,CAAC,QAAQ,QAAQ,UAAU,QAAQ,UAAU,QAAQ,GAAG;AAAA,MACjE,SAAS,OAAO,UACZ,CAAC,OAAO,UAAU,UAAU,QAAQ,UAAU,OAAO,KAAK,IAC1D;AAAA,MACJ,eAAe,OAAO,gBAClB,CAAC,UAAU,UAAU,QAAQ,gBAAgB,KAAK,IAClD;AAAA,IAAA,CACL;AAED,WAAO,MAAM;AAEX,aAAO,QAAA;AAAA,IACT;AAAA,EACF,GAAG,IAAI;AACT;;"}