@supabase-kit/react
Version:
> Hooks by management data from supabase and fetch data by react.
4 lines (2 loc) • 8.67 kB
JavaScript
import{useQuery as S}from"@tanstack/react-query";import{useMemo as w}from"react";import{useInfiniteQuery as k,useQuery as D}from"@tanstack/react-query";var T=({table:x,queryKey:V})=>{return[x,...V].join("_")};var j={match:(x,V={})=>{return x.match(V)},or:(x,V=[])=>{for(let $ of V)x=x.or($);return x},filter:(x,V={})=>{for(let[$,U]of Object.entries(V))x.filter($,...U);return x},not:(x,V={})=>{for(let $ of Object.keys(V)){let{text:U,options:W}=V[$];x=x.textSearch($,U,W)}return x},limit:(x,V)=>{return x.limit(V)},single:(x)=>{return x=x.single()},maybeSingle:(x)=>{return x.maybeSingle()},csv:(x)=>{return x.csv()},explain:(x,V={})=>{return x.explain(V)},order:(x,V)=>{for(let[$,U]of Object.entries(V))x=x.order($,U);return x},range:(x,V)=>{let $=(U)=>{return x.range(U.from,U.to,U.options)};if(!Array.isArray(V))return $(V);for(let U of V)x=$(U);return x}},_=({where:x={},...V},$)=>{let U={...x,...V},W=["eq","neq","in","is","lt","lte","gt","gte","like","ilike","contains","containedBy","rangeGt","rangeGte","rangeLt","rangeLte","rangeAdjacent","contains","containedBy","rangeGt","rangeGte","rangeLt","rangeLte","rangeAdjacent","overlaps"];for(let[F,H]of Object.entries(U)){let J=F,I=j[J];if(I){$=I($,H);continue}if(!W.includes(J))continue;for(let[z,R]of Object.entries(H))$=$[J](z,R)}return $};var f=(x)=>{function V({table:U,schema:W="public",column:F="*",count:H,options:J={},single:I,enabled:z,...R}){let G=async(L)=>{let Z=(!W?x:x.schema(W)).from(U).select(F,{count:H}),B=_(R,Z),{data:N,error:P,count:A}=await B.abortSignal(L);if(P)throw P;return{count:A??0,payload:I?N??{}:N??[]}},{queryKey:M=[],...X}=J,Y=T({table:U,queryKey:M});return D({queryKey:[Y,R.where,R.limit,I,H,U,F,H,J,I,z],queryFn:({signal:L})=>G(L),enabled:z,...X})}return{useSupaInfiniteQuery:({table:U,schema:W="public",column:F="*",options:H,enabled:J,count:I="exact",...z})=>{let R=async(L)=>{let Z=(!W?x:x.schema(W)).from(U).select(F,{count:I}),B=_(z,Z),{data:N,error:P,count:A}=await B.abortSignal(L);if(P)throw P;return{count:A??0,payload:N??[]}},{initialData:G,queryKey:M=[],...X}=H,Y=T({table:U,queryKey:["infinite",...M]});return k({queryKey:[Y,z.where,z.limit],queryFn:({signal:L})=>R(L),enabled:J,...X})},useSupaQuery:V,QueryBuilder:_}};import{useCallback as O,useEffect as E,useMemo as v}from"react";import{REALTIME_POSTGRES_CHANGES_LISTEN_EVENT as C}from"@supabase/supabase-js";import{useQueryClient as q}from"@tanstack/react-query";var m=(x,V)=>{let $=({table:W,schema:F,event:H="*",where:J,type:I="postgres_changes",channel:z="general",callback:R=(G)=>console.log(G)})=>{let G=v(()=>{if(!J)return"";let Y=`${J?.key}=${J?.operator}`;if(J?.operator==="in")return`${Y}.(${J?.value.toString()})`;return`${Y}.${J?.value}`},[J]),M=v(()=>{if(!G)return{event:H,schema:F,table:W};return{event:H,schema:F,table:W,filter:G}},[H,F,W,G]),X=O((Y)=>{if(console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"),console.log("\uD83D\uDD25 REALTIME EVENT RECEIVED FROM BACKEND"),console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"),console.log("\uD83D\uDCCA Event Type:",Y.eventType),console.log("\uD83D\uDCCB Table:",Y.table),console.log("\uD83C\uDFF7️ Schema:",Y.schema),console.log("⏰ Timestamp:",new Date(Y.commit_timestamp).toLocaleString()),Y.eventType==="INSERT")console.log("✅ INSERT - New Record:"),console.log(" → New Data:",Y.new);else if(Y.eventType==="UPDATE")console.log("\uD83D\uDD04 UPDATE - Record Modified:"),console.log(" → Old Data:",Y.old),console.log(" → New Data:",Y.new);else if(Y.eventType==="DELETE")console.log("❌ DELETE - Record Removed:"),console.log(" → Old Data:",Y.old);console.log("\uD83D\uDCE6 Full Payload:",Y),console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"),R(Y)},[R]);E(()=>{console.log("\uD83D\uDD27 Setting up Supabase subscription:",{channel:z,type:I,table:W,schema:F,filter:G,configQuery:M});let Y=x.channel(z).on(I,M,X).subscribe((L)=>{if(console.log("\uD83D\uDCE1 Subscription status:",L),L==="SUBSCRIBED")console.log("✅ Successfully subscribed to channel:",z),console.log("\uD83D\uDC42 Listening for events on table:",W),console.log("\uD83D\uDD0D Filter:",G||"No filter (all records)");else if(L==="CHANNEL_ERROR")console.error("❌ Subscription error on channel:",z);else if(L==="TIMED_OUT")console.error("⏱️ Subscription timed out on channel:",z);else if(L==="CLOSED")console.warn("\uD83D\uDD12 Channel closed:",z)});return()=>{console.log("\uD83D\uDD0C Unsubscribing from channel:",z),Y.unsubscribe()}},[X,M,I,z,W,F,G])};return{useSupaSubscription:$,useSupaRealtime:({table:W,where:F,channel:H="general",schema:J="public"})=>{let I=q(),z=v(()=>F?{[F.operator]:{[F.key]:F.value}}:{},[F]);console.log("\uD83D\uDD0D useSupaRealtime queryConfig:",z),console.log("\uD83D\uDD0D useSupaRealtime where:",F);let R=v(()=>{return[[W,"subscription"].join("_"),z,void 0,void 0,"estimated",W,"*","estimated",{queryKey:["subscription"]},void 0,void 0]},[W,z]);console.log("\uD83D\uDD0D useSupaRealtime QueryKey:",R);let G=V({table:W,schema:J,where:z,options:{queryKey:["subscription"]},count:"estimated"});console.log("\uD83D\uDD0D useSupaRealtime query result:",G.data);let M=O((X)=>{console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"),console.log("\uD83D\uDD25 REALTIME EVENT IN handleRealtimeEvent"),console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"),console.log("\uD83D\uDCCA Event Type:",X.eventType),console.log("\uD83D\uDCE6 Payload:",X),console.log("\uD83D\uDD11 Current QueryKey:",R);let Y=I.getQueryData(R);console.log("\uD83D\uDCBE Current Cache Data BEFORE update:",Y);let K={[C.DELETE]:()=>{console.log("\uD83D\uDDD1️ Processing DELETE event"),I.setQueryData(R,(Z)=>{if(console.log(" → oldData in DELETE:",Z),!Z)return console.log(" ⚠️ No oldData, returning null"),Z;let B=Array.isArray(Z.payload)?Z.payload.filter((A)=>A.id!==X.old.id):[],P={count:B.length,payload:B};return console.log(" ✅ DELETE result:",P),P})},[C.INSERT]:()=>{console.log("➕ Processing INSERT event"),I.setQueryData(R,(Z)=>{if(console.log(" → oldData in INSERT:",Z),!Z){let A={count:1,payload:[X.new]};return console.log(" ✅ INSERT result (no oldData):",A),A}let B=Array.isArray(Z.payload)?[...Z.payload,X.new]:[X.new],P={count:B.length,payload:B};return console.log(" ✅ INSERT result:",P),P})},[C.UPDATE]:()=>{console.log("\uD83D\uDD04 Processing UPDATE event"),console.log(" → payload.old:",X.old),console.log(" → payload.new:",X.new),console.log(" → payload.new.state:",X.new.state),console.log(" → payload.new.state is Array?",Array.isArray(X.new.state)),console.log(" → payload.new.state length:",X.new.state?.length),I.setQueryData(R,(Z)=>{if(console.log(" → oldData in UPDATE:",Z),console.log(" → oldData.payload type:",typeof Z?.payload),console.log(" → oldData.payload length:",Z?.payload?.length),!Z)return console.log(" ⚠️ No oldData, returning null"),Z;let B=Array.isArray(Z.payload)?Z.payload.map((A)=>{if(A.id===X.old.id)return console.log(" \uD83C\uDFAF Found matching record, updating:",A.id),console.log(" \uD83C\uDFAF Old record:",A),console.log(" \uD83C\uDFAF New record:",X.new),X.new;return A}):[],P={count:B.length,payload:B};return console.log(" ✅ UPDATE result:",P),console.log(" ✅ Updated record state:",P.payload?.[0]?.state),P})}}[X.eventType];if(K){console.log("✅ Handler found, executing..."),K();let Z=I.getQueryData(R);console.log("\uD83D\uDCBE Cache Data AFTER update:",Z),console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")}else console.log("❌ No handler found for event type:",X.eventType),console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━")},[I,R]);return $({table:W,schema:J,event:"*",where:F,type:"postgres_changes",channel:H,callback:M}),G}}};var Ux=(x)=>{let V=()=>w(()=>x,[]),$=()=>{return S({queryKey:["supa_session",x],initialData:null,queryFn:async()=>{let{data:H,error:J}=await x.auth.getSession();if(J)throw J;return H.session}})},U=f(x),W=m(x,U.useSupaQuery);return{useSupabase:V,useSupaSession:$,getSupaQueryName:({table:H,queryKey:J})=>T({table:H,queryKey:J}),...U,...W}};export{Ux as createSupabaseTools,f as createSupabaseQuery,_ as QueryBuilder};
//# debugId=067191A8BEC22FCA64756E2164756E21