Infinite Query for Vue and Supabase
supabase-ui-library/infinite-query-composableFreeComponent
Vue Composable for infinite lists, fetching data from Supabase.
Install it
npx shadcn@latest add https://raw.githubusercontent.com/supabase/supabase/master/apps/ui-library/public/r/infinite-query-composable.jsonSource
1import { PostgrestQueryBuilder, type PostgrestClientOptions } from '@supabase/postgrest-js'2import { type SupabaseClient } from '@supabase/supabase-js'3import { computed, onMounted, reactive, toRefs, watch } from 'vue'45// @ts-ignore6import { createClient } from '@/lib/supabase/client'78const supabase = createClient()910type SupabaseClientType = typeof supabase1112type IfAny<T, Y, N> = 0 extends 1 & T ? Y : N1314type Database =15 SupabaseClientType extends SupabaseClient<infer U>16 ? IfAny<17 U,18 {19 public: {20 Tables: Record<string, any>21 Views: Record<string, any>22 Functions: Record<string, any>23 }24 },25 U26 >27 : {28 public: {29 Tables: Record<string, any>30 Views: Record<string, any>31 Functions: Record<string, any>32 }33 }3435type DatabaseSchema = Database['public']36type SupabaseTableName = keyof DatabaseSchema['Tables']37type SupabaseTableData<T extends SupabaseTableName> = DatabaseSchema['Tables'][T]['Row']3839type DefaultClientOptions = PostgrestClientOptions4041type SupabaseSelectBuilder<T extends SupabaseTableName> = ReturnType<42 PostgrestQueryBuilder<43 DefaultClientOptions,44 DatabaseSchema,45 DatabaseSchema['Tables'][T],46 T47 >['select']48>4950export type SupabaseQueryHandler<T extends SupabaseTableName> = (51 query: SupabaseSelectBuilder<T>52) => SupabaseSelectBuilder<T>5354export interface UseInfiniteQueryProps<T extends SupabaseTableName> {55 tableName: T56 columns?: string57 pageSize?: number58 trailingQuery?: SupabaseQueryHandler<T>59}6061interface State<TData> {62 data: TData[]63 count: number64 isSuccess: boolean65 isLoading: boolean66 isFetching: boolean67 error: Error | null68 hasInitialFetch: boolean69 requestCounter: number70}7172// --------------------73// Composable74// --------------------7576export function useInfiniteQuery<77 TData extends SupabaseTableData<T>,78 T extends SupabaseTableName = SupabaseTableName,79>(props: UseInfiniteQueryProps<T>) {80 const state = reactive<State<TData>>({81 data: [],82 count: 0,83 isSuccess: false,84 isLoading: false,85 isFetching: false,86 error: null,87 hasInitialFetch: false,88 requestCounter: 0,89 })9091 const pageSize = computed(() => props.pageSize ?? 20)92 const columns = computed(() => props.columns ?? '*')9394 const fetchPage = async (skip: number) => {95 // Capture the current request token to validate this request later96// … truncated
What it pulls in
npm packages
Files it writes
More from Supabase UI Library
All 37 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Current User Avatarcurrent-user-avatar-nextjs | Supabase UI Library | Components | Unverified | 2 deps · 6 files | |
| Current User Avatarcurrent-user-avatar-react | Supabase UI Library | Components | Unverified | 1 dep · 4 files | |
| Current User Avatarcurrent-user-avatar-react-router | Supabase UI Library | Components | Unverified | 2 deps · 5 files | |
| Current User Avatarcurrent-user-avatar-tanstack | Supabase UI Library | Components | Unverified | 2 deps · 5 files | |
| Dropzone (File Upload)dropzone-nextjs | Supabase UI Library | Components | Unverified | 4 deps · 5 files | |
| Dropzone (File Upload)dropzone-react | Supabase UI Library | Components | Unverified | 3 deps · 3 files | |
| Dropzone (File Upload)dropzone-react-router | Supabase UI Library | Components | Unverified | 4 deps · 4 files | |
| Dropzone (File Upload)dropzone-tanstack | Supabase UI Library | Components | Unverified | 4 deps · 4 files |
