import { UseQueryOptions } from '@tanstack/react-query' import { ExecuteSqlData, ExecuteSqlError, useExecuteSqlQuery } from 'data/sql/execute-sql-query' import { Filter } from './users-infinite-query' import { authKeys } from './keys' type UsersCountVariables = { projectRef?: string connectionString?: string keywords?: string filter?: Filter providers?: string[] } const getUsersCountSQl = ({ verified, keywords, providers, }: { verified?: Filter keywords?: string providers?: string[] }) => { const hasValidKeywords = keywords && keywords !== '' const conditions: string[] = [] const baseQueryCount = `select count(*) from auth.users` if (hasValidKeywords) { conditions.push( `id::text ilike '%${keywords}%' or email ilike '%${keywords}%' or phone ilike '%${keywords}%` ) } if (verified === 'verified') { conditions.push(`email_confirmed_at IS NOT NULL or phone_confirmed_at IS NOT NULL`) } else if (verified === 'anonymous') { conditions.push(`is_anonymous is true`) } else if (verified === 'unverified') { conditions.push(`email_confirmed_at IS NULL AND phone_confirmed_at IS NULL`) } if (providers && providers.length > 0) { conditions.push( `(raw_app_meta_data->>'providers')::jsonb ?| array[${providers.map((p) => `'${p}'`).join(', ')}]` ) } const combinedConditions = conditions.map((x) => `(${x})`).join(' and ') return `${baseQueryCount}${conditions.length > 0 ? ` where ${combinedConditions}` : ''};` } export type UsersCountData = { result: [{ count: number }] } export type UsersCountError = ExecuteSqlError export const useUsersCountQuery = ( { projectRef, connectionString, keywords, filter, providers }: UsersCountVariables, options: UseQueryOptions = {} ) => useExecuteSqlQuery( { projectRef, connectionString, sql: getUsersCountSQl({ keywords, verified: filter, providers }), queryKey: authKeys.usersCount(projectRef, { keywords, filter, providers }), }, options )