refactor: use Convex skip sentinel in query args

This commit is contained in:
Esdras Renan 2025-11-01 02:31:17 -03:00
parent 3de7eccaa8
commit bd2f22d046
32 changed files with 167 additions and 157 deletions

View file

@ -46,10 +46,10 @@ export default function NewTicketPage() {
const router = useRouter() const router = useRouter()
const { convexUserId, isStaff, role } = useAuth() const { convexUserId, isStaff, role } = useAuth()
const queuesEnabled = Boolean(isStaff && convexUserId) const queuesEnabled = Boolean(isStaff && convexUserId)
const queueArgs = queuesEnabled const queuesRemote = useQuery(
? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } api.queues.summary,
: undefined queuesEnabled ? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } : "skip"
const queuesRemote = useQuery(queuesEnabled ? api.queues.summary : undefined, queueArgs) )
const queues = useMemo( const queues = useMemo(
() => (Array.isArray(queuesRemote) ? (queuesRemote as TicketQueueSummary[]) : []), () => (Array.isArray(queuesRemote) ? (queuesRemote as TicketQueueSummary[]) : []),
[queuesRemote] [queuesRemote]
@ -63,10 +63,10 @@ export default function NewTicketPage() {
) )
const directoryQueryEnabled = queuesEnabled && Boolean(convexUserId) const directoryQueryEnabled = queuesEnabled && Boolean(convexUserId)
const companiesArgs = directoryQueryEnabled const companiesRemote = useQuery(
? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } api.companies.list,
: undefined directoryQueryEnabled ? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } : "skip"
const companiesRemote = useQuery(directoryQueryEnabled ? api.companies.list : undefined, companiesArgs) )
const companies = useMemo( const companies = useMemo(
() => () =>
(Array.isArray(companiesRemote) ? companiesRemote : []).map((company) => ({ (Array.isArray(companiesRemote) ? companiesRemote : []).map((company) => ({
@ -77,10 +77,10 @@ export default function NewTicketPage() {
[companiesRemote] [companiesRemote]
) )
const customersArgs = directoryQueryEnabled const customersRemote = useQuery(
? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } api.users.listCustomers,
: undefined directoryQueryEnabled ? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } : "skip"
const customersRemote = useQuery(directoryQueryEnabled ? api.users.listCustomers : undefined, customersArgs) )
const customers = useMemo( const customers = useMemo(
() => (Array.isArray(customersRemote) ? (customersRemote as CustomerOption[]) : []), () => (Array.isArray(customersRemote) ? (customersRemote as CustomerOption[]) : []),
[customersRemote] [customersRemote]

View file

@ -375,8 +375,8 @@ export function AdminUsersManager({
linkedUsers?: Array<{ id: string; email: string; name: string }> linkedUsers?: Array<{ id: string; email: string; name: string }>
} }
const machinesList = useQuery( const machinesList = useQuery(
convexUserId ? api.machines.listByTenant : undefined, api.machines.listByTenant,
convexUserId ? { tenantId: defaultTenantId, includeMetadata: true } : undefined convexUserId ? { tenantId: defaultTenantId, includeMetadata: true } : "skip"
) as MachinesListItem[] | undefined ) as MachinesListItem[] | undefined
const machinesByUserEmail = useMemo(() => { const machinesByUserEmail = useMemo(() => {

View file

@ -25,7 +25,7 @@ export function AdminAlertsManager() {
}, [range]) }, [range])
const alertsRaw = useQuery( const alertsRaw = useQuery(
convexUserId ? api.alerts.list : undefined, api.alerts.list,
convexUserId convexUserId
? ({ ? ({
tenantId, tenantId,
@ -34,7 +34,7 @@ export function AdminAlertsManager() {
end, end,
companyId: companyId === "all" ? undefined : (companyId as Id<"companies">), companyId: companyId === "all" ? undefined : (companyId as Id<"companies">),
}) })
: undefined : "skip"
) as Doc<"alerts">[] | undefined ) as Doc<"alerts">[] | undefined
const alerts = useMemo(() => { const alerts = useMemo(() => {
@ -43,8 +43,8 @@ export function AdminAlertsManager() {
}, [alertsRaw]) }, [alertsRaw])
const companies = useQuery( const companies = useQuery(
convexUserId ? api.companies.list : undefined, api.companies.list,
convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as Array<{ id: Id<"companies">; name: string }> | undefined ) as Array<{ id: Id<"companies">; name: string }> | undefined
return ( return (

View file

@ -44,8 +44,8 @@ export function FieldsManager() {
const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID
const fields = useQuery( const fields = useQuery(
convexUserId ? api.fields.list : undefined, api.fields.list,
convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as Field[] | undefined ) as Field[] | undefined
const createField = useMutation(api.fields.create) const createField = useMutation(api.fields.create)

View file

@ -22,11 +22,13 @@ export function AdminMachineDetailsClient({ tenantId: _tenantId, machineId }: {
const effectiveMachineId = machineId ?? routeMachineId ?? "" const effectiveMachineId = machineId ?? routeMachineId ?? ""
const canLoadMachine = Boolean(effectiveMachineId) const canLoadMachine = Boolean(effectiveMachineId)
const queryArgs = canLoadMachine
? ({ id: effectiveMachineId as Id<"machines">, includeMetadata: true } as const)
: undefined
const single = useQuery(canLoadMachine ? api.machines.getById : undefined, queryArgs) const single = useQuery(
api.machines.getById,
canLoadMachine
? ({ id: effectiveMachineId as Id<"machines">, includeMetadata: true } as const)
: "skip"
)
// Fallback via HTTP in caso de o Convex React demorar/ficar preso em loading // Fallback via HTTP in caso de o Convex React demorar/ficar preso em loading
const [fallback, setFallback] = useState<Record<string, unknown> | null | undefined>(undefined) const [fallback, setFallback] = useState<Record<string, unknown> | null | undefined>(undefined)

View file

@ -1206,8 +1206,8 @@ export function AdminMachinesOverview({ tenantId, initialCompanyFilterSlug = "al
const [exportError, setExportError] = useState<string | null>(null) const [exportError, setExportError] = useState<string | null>(null)
const { convexUserId } = useAuth() const { convexUserId } = useAuth()
const companies = useQuery( const companies = useQuery(
convexUserId ? api.companies.list : undefined, api.companies.list,
convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as Array<{ id: string; name: string; slug?: string }> | undefined ) as Array<{ id: string; name: string; slug?: string }> | undefined
const companyNameBySlug = useMemo(() => { const companyNameBySlug = useMemo(() => {
const map = new Map<string, string>() const map = new Map<string, string>()
@ -1698,13 +1698,13 @@ export function MachineDetails({ machine }: MachineDetailsProps) {
const [isActiveLocal, setIsActiveLocal] = useState<boolean>(machine?.isActive ?? true) const [isActiveLocal, setIsActiveLocal] = useState<boolean>(machine?.isActive ?? true)
const isDeactivated = !isActiveLocal || effectiveStatus === "deactivated" const isDeactivated = !isActiveLocal || effectiveStatus === "deactivated"
const alertsHistory = useQuery( const alertsHistory = useQuery(
machine ? api.machines.listAlerts : undefined, api.machines.listAlerts,
machine ? { machineId: machine.id as Id<"machines">, limit: 50 } : undefined machine ? { machineId: machine.id as Id<"machines">, limit: 50 } : "skip"
) as MachineAlertEntry[] | undefined ) as MachineAlertEntry[] | undefined
const machineAlertsHistory = alertsHistory ?? [] const machineAlertsHistory = alertsHistory ?? []
const openTickets = useQuery( const openTickets = useQuery(
machine ? api.machines.listOpenTickets : undefined, api.machines.listOpenTickets,
machine ? { machineId: machine.id as Id<"machines">, limit: 6 } : undefined machine ? { machineId: machine.id as Id<"machines">, limit: 6 } : "skip"
) as MachineOpenTicketsSummary | undefined ) as MachineOpenTicketsSummary | undefined
const machineTickets = openTickets?.tickets ?? [] const machineTickets = openTickets?.tickets ?? []
const totalOpenTickets = openTickets?.totalOpen ?? machineTickets.length const totalOpenTickets = openTickets?.totalOpen ?? machineTickets.length

View file

@ -22,11 +22,12 @@ type MachineBreadcrumbsProps = {
export function MachineBreadcrumbs({ tenantId: _tenantId, machineId, machineHref, extra }: MachineBreadcrumbsProps) { export function MachineBreadcrumbs({ tenantId: _tenantId, machineId, machineHref, extra }: MachineBreadcrumbsProps) {
const { convexUserId } = useAuth() const { convexUserId } = useAuth()
const canLoadMachine = Boolean(machineId && convexUserId) const canLoadMachine = Boolean(machineId && convexUserId)
const queryArgs = canLoadMachine const item = useQuery(
? ({ id: machineId as Id<"machines">, includeMetadata: false } as const) api.machines.getById,
: undefined canLoadMachine
? ({ id: machineId as Id<"machines">, includeMetadata: false } as const)
const item = useQuery(canLoadMachine ? api.machines.getById : undefined, queryArgs) : "skip"
)
const hostname = useMemo(() => item?.hostname ?? "Detalhe", [item]) const hostname = useMemo(() => item?.hostname ?? "Detalhe", [item])
const segments = useMemo(() => { const segments = useMemo(() => {
const trail: BreadcrumbSegment[] = [ const trail: BreadcrumbSegment[] = [

View file

@ -38,12 +38,12 @@ export function QueuesManager() {
const NO_TEAM_VALUE = "__none__" const NO_TEAM_VALUE = "__none__"
const queues = useQuery( const queues = useQuery(
convexUserId ? api.queues.list : undefined, api.queues.list,
convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as Queue[] | undefined ) as Queue[] | undefined
const teams = useQuery( const teams = useQuery(
convexUserId ? api.teams.list : undefined, api.teams.list,
convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as TeamOption[] | undefined ) as TeamOption[] | undefined
const createQueue = useMutation(api.queues.create) const createQueue = useMutation(api.queues.create)

View file

@ -37,8 +37,8 @@ export function SlasManager() {
const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID
const slas = useQuery( const slas = useQuery(
convexUserId ? api.slas.list : undefined, api.slas.list,
convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as SlaPolicy[] | undefined ) as SlaPolicy[] | undefined
const createSla = useMutation(api.slas.create) const createSla = useMutation(api.slas.create)

View file

@ -39,12 +39,12 @@ export function TeamsManager() {
const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID
const teams = useQuery( const teams = useQuery(
convexUserId ? api.teams.list : undefined, api.teams.list,
convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as Team[] | undefined ) as Team[] | undefined
const directory = useQuery( const directory = useQuery(
convexUserId ? api.teams.directory : undefined, api.teams.directory,
convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as DirectoryUser[] | undefined ) as DirectoryUser[] | undefined
const createTeam = useMutation(api.teams.create) const createTeam = useMutation(api.teams.create)

View file

@ -64,14 +64,14 @@ export function ChartAreaInteractive() {
const reportsEnabled = Boolean(isStaff && convexUserId) const reportsEnabled = Boolean(isStaff && convexUserId)
const report = useQuery( const report = useQuery(
reportsEnabled ? api.reports.ticketsByChannel : undefined, api.reports.ticketsByChannel,
reportsEnabled reportsEnabled
? ({ tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) }) ? ({ tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) })
: undefined : "skip"
) )
const companies = useQuery( const companies = useQuery(
reportsEnabled ? api.companies.list : undefined, api.companies.list,
reportsEnabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined reportsEnabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as Array<{ id: Id<"companies">; name: string }> | undefined ) as Array<{ id: Id<"companies">; name: string }> | undefined
const filteredCompanies = React.useMemo(() => { const filteredCompanies = React.useMemo(() => {
const q = companyQuery.trim().toLowerCase() const q = companyQuery.trim().toLowerCase()

View file

@ -47,7 +47,7 @@ export function ChartOpenByPriority() {
const enabled = Boolean(isStaff && convexUserId) const enabled = Boolean(isStaff && convexUserId)
const report = useQuery( const report = useQuery(
enabled ? api.reports.backlogOverview : undefined, api.reports.backlogOverview,
enabled enabled
? ({ ? ({
tenantId, tenantId,
@ -55,12 +55,12 @@ export function ChartOpenByPriority() {
range: timeRange, range: timeRange,
companyId: companyId === "all" ? undefined : (companyId as Id<"companies">), companyId: companyId === "all" ? undefined : (companyId as Id<"companies">),
}) })
: undefined : "skip"
) as { priorityCounts: Record<string, number> } | undefined ) as { priorityCounts: Record<string, number> } | undefined
const companies = useQuery( const companies = useQuery(
enabled ? api.companies.list : undefined, api.companies.list,
enabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined enabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as Array<{ id: Id<"companies">; name: string }> | undefined ) as Array<{ id: Id<"companies">; name: string }> | undefined
if (!report) { if (!report) {

View file

@ -31,7 +31,7 @@ export function ChartOpenedResolved() {
const reportsEnabled = Boolean(isStaff && convexUserId) const reportsEnabled = Boolean(isStaff && convexUserId)
const data = useQuery( const data = useQuery(
reportsEnabled ? api.reports.openedResolvedByDay : undefined, api.reports.openedResolvedByDay,
reportsEnabled reportsEnabled
? ({ ? ({
tenantId, tenantId,
@ -39,12 +39,12 @@ export function ChartOpenedResolved() {
range: timeRange, range: timeRange,
companyId: companyId === "all" ? undefined : (companyId as Id<"companies">), companyId: companyId === "all" ? undefined : (companyId as Id<"companies">),
}) })
: undefined : "skip"
) as { rangeDays: number; series: SeriesPoint[] } | undefined ) as { rangeDays: number; series: SeriesPoint[] } | undefined
const companies = useQuery( const companies = useQuery(
reportsEnabled ? api.companies.list : undefined, api.companies.list,
reportsEnabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined reportsEnabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as Array<{ id: Id<"companies">; name: string }> | undefined ) as Array<{ id: Id<"companies">; name: string }> | undefined
if (!data) { if (!data) {

View file

@ -29,14 +29,14 @@ function BacklogPriorityPie() {
const { session, convexUserId, isStaff } = useAuth() const { session, convexUserId, isStaff } = useAuth()
const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID
const data = useQuery( const data = useQuery(
isStaff && convexUserId ? api.reports.backlogOverview : undefined, api.reports.backlogOverview,
isStaff && convexUserId isStaff && convexUserId
? ({ tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) }) ? ({ tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) })
: undefined : "skip"
) as { priorityCounts: Record<string, number> } | undefined ) as { priorityCounts: Record<string, number> } | undefined
const companies = useQuery( const companies = useQuery(
isStaff && convexUserId ? api.companies.list : undefined, api.companies.list,
isStaff && convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined isStaff && convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as Array<{ id: Id<"companies">; name: string }> | undefined ) as Array<{ id: Id<"companies">; name: string }> | undefined
if (!data) return <Skeleton className="h-[300px] w-full" /> if (!data) return <Skeleton className="h-[300px] w-full" />
@ -112,14 +112,14 @@ function QueuesOpenBar() {
const { session, convexUserId, isStaff } = useAuth() const { session, convexUserId, isStaff } = useAuth()
const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID
const data = useQuery( const data = useQuery(
isStaff && convexUserId ? api.reports.slaOverview : undefined, api.reports.slaOverview,
isStaff && convexUserId isStaff && convexUserId
? ({ tenantId, viewerId: convexUserId as Id<"users">, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) }) ? ({ tenantId, viewerId: convexUserId as Id<"users">, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) })
: undefined : "skip"
) as { queueBreakdown: { id: string; name: string; open: number }[] } | undefined ) as { queueBreakdown: { id: string; name: string; open: number }[] } | undefined
const companies = useQuery( const companies = useQuery(
isStaff && convexUserId ? api.companies.list : undefined, api.companies.list,
isStaff && convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined isStaff && convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as Array<{ id: Id<"companies">; name: string }> | undefined ) as Array<{ id: Id<"companies">; name: string }> | undefined
if (!data) return <Skeleton className="h-[300px] w-full" /> if (!data) return <Skeleton className="h-[300px] w-full" />

View file

@ -73,14 +73,14 @@ export function PortalTicketDetail({ ticketId }: PortalTicketDetailProps) {
const machineInactive = machineContext?.isActive === false const machineInactive = machineContext?.isActive === false
const ticketRaw = useQuery( const ticketRaw = useQuery(
convexUserId ? api.tickets.getById : undefined, api.tickets.getById,
convexUserId convexUserId
? { ? {
tenantId: session?.user.tenantId ?? DEFAULT_TENANT_ID, tenantId: session?.user.tenantId ?? DEFAULT_TENANT_ID,
id: ticketId as Id<"tickets">, id: ticketId as Id<"tickets">,
viewerId: convexUserId as Id<"users">, viewerId: convexUserId as Id<"users">,
} }
: undefined : "skip"
) )
const ticket = useMemo(() => { const ticket = useMemo(() => {

View file

@ -21,14 +21,14 @@ export function PortalTicketList() {
const viewerId = (convexUserId ?? machineContext?.assignedUserId ?? null) as Id<"users"> | null const viewerId = (convexUserId ?? machineContext?.assignedUserId ?? null) as Id<"users"> | null
const ticketsRaw = useQuery( const ticketsRaw = useQuery(
viewerId ? api.tickets.list : undefined, api.tickets.list,
viewerId viewerId
? { ? {
tenantId: session?.user.tenantId ?? DEFAULT_TENANT_ID, tenantId: session?.user.tenantId ?? DEFAULT_TENANT_ID,
viewerId, viewerId,
limit: 100, limit: 100,
} }
: undefined : "skip"
) )
const tickets = useMemo(() => { const tickets = useMemo(() => {

View file

@ -44,12 +44,12 @@ export function BacklogReport() {
const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID
const enabled = Boolean(isStaff && convexUserId) const enabled = Boolean(isStaff && convexUserId)
const data = useQuery( const data = useQuery(
enabled ? api.reports.backlogOverview : undefined, api.reports.backlogOverview,
enabled ? { tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) } : undefined enabled ? { tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) } : "skip"
) )
const companies = useQuery( const companies = useQuery(
enabled ? api.companies.list : undefined, api.companies.list,
enabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined enabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as Array<{ id: Id<"companies">; name: string }> | undefined ) as Array<{ id: Id<"companies">; name: string }> | undefined
const mostCriticalPriority = useMemo(() => { const mostCriticalPriority = useMemo(() => {

View file

@ -63,8 +63,8 @@ export function CompanyReport() {
const [timeRange, setTimeRange] = useState<"7d" | "30d" | "90d">("30d") const [timeRange, setTimeRange] = useState<"7d" | "30d" | "90d">("30d")
const companies = useQuery( const companies = useQuery(
isStaff && convexUserId ? api.companies.list : undefined, api.companies.list,
isStaff && convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined isStaff && convexUserId ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as CompanyRecord[] | undefined ) as CompanyRecord[] | undefined
useEffect(() => { useEffect(() => {
@ -74,7 +74,7 @@ export function CompanyReport() {
}, [companies, selectedCompany]) }, [companies, selectedCompany])
const report = useQuery( const report = useQuery(
selectedCompany && convexUserId && isStaff ? api.reports.companyOverview : undefined, api.reports.companyOverview,
selectedCompany && convexUserId && isStaff selectedCompany && convexUserId && isStaff
? { ? {
tenantId, tenantId,
@ -82,7 +82,7 @@ export function CompanyReport() {
companyId: selectedCompany as Id<"companies">, companyId: selectedCompany as Id<"companies">,
range: timeRange, range: timeRange,
} }
: undefined : "skip"
) )
const isLoading = selectedCompany !== "" && report === undefined const isLoading = selectedCompany !== "" && report === undefined

View file

@ -29,14 +29,14 @@ export function CsatReport() {
const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID
const enabled = Boolean(isStaff && convexUserId) const enabled = Boolean(isStaff && convexUserId)
const data = useQuery( const data = useQuery(
enabled ? api.reports.csatOverview : undefined, api.reports.csatOverview,
enabled enabled
? ({ tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) }) ? ({ tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) })
: undefined : "skip"
) )
const companies = useQuery( const companies = useQuery(
enabled ? api.companies.list : undefined, api.companies.list,
enabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined enabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as Array<{ id: Id<"companies">; name: string }> | undefined ) as Array<{ id: Id<"companies">; name: string }> | undefined
if (!data) { if (!data) {

View file

@ -50,13 +50,13 @@ export function HoursReport() {
const enabled = Boolean(isStaff && convexUserId) const enabled = Boolean(isStaff && convexUserId)
const data = useQuery( const data = useQuery(
enabled ? api.reports.hoursByClient : undefined, api.reports.hoursByClient,
enabled ? { tenantId, viewerId: convexUserId as Id<"users">, range: timeRange } : undefined enabled ? { tenantId, viewerId: convexUserId as Id<"users">, range: timeRange } : "skip"
) as { rangeDays: number; items: HoursItem[] } | undefined ) as { rangeDays: number; items: HoursItem[] } | undefined
const companies = useQuery( const companies = useQuery(
enabled ? api.companies.list : undefined, api.companies.list,
enabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined enabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as Array<{ id: Id<"companies">; name: string }> | undefined ) as Array<{ id: Id<"companies">; name: string }> | undefined
const filtered = useMemo(() => { const filtered = useMemo(() => {
const items = data?.items ?? [] const items = data?.items ?? []

View file

@ -41,34 +41,34 @@ export function SlaReport() {
const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID const tenantId = session?.user.tenantId ?? DEFAULT_TENANT_ID
const enabled = Boolean(isStaff && convexUserId) const enabled = Boolean(isStaff && convexUserId)
const data = useQuery( const data = useQuery(
enabled ? api.reports.slaOverview : undefined, api.reports.slaOverview,
enabled enabled
? ({ tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) }) ? ({ tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) })
: undefined : "skip"
) )
const agents = useQuery( const agents = useQuery(
enabled ? api.reports.agentProductivity : undefined, api.reports.agentProductivity,
enabled enabled
? ({ tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) }) ? ({ tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) })
: undefined : "skip"
) as { rangeDays: number; items: Array<{ agentId: string; name: string | null; email: string | null; open: number; resolved: number; avgFirstResponseMinutes: number | null; avgResolutionMinutes: number | null; workedHours: number }> } | undefined ) as { rangeDays: number; items: Array<{ agentId: string; name: string | null; email: string | null; open: number; resolved: number; avgFirstResponseMinutes: number | null; avgResolutionMinutes: number | null; workedHours: number }> } | undefined
const openedResolved = useQuery( const openedResolved = useQuery(
enabled ? api.reports.openedResolvedByDay : undefined, api.reports.openedResolvedByDay,
enabled enabled
? ({ tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) }) ? ({ tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) })
: undefined : "skip"
) as { rangeDays: number; series: Array<{ date: string; opened: number; resolved: number }> } | undefined ) as { rangeDays: number; series: Array<{ date: string; opened: number; resolved: number }> } | undefined
const channelsSeries = useQuery( const channelsSeries = useQuery(
enabled ? api.reports.ticketsByChannel : undefined, api.reports.ticketsByChannel,
enabled enabled
? ({ tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) }) ? ({ tenantId, viewerId: convexUserId as Id<"users">, range: timeRange, companyId: companyId === "all" ? undefined : (companyId as Id<"companies">) })
: undefined : "skip"
) as { rangeDays: number; channels: string[]; points: Array<{ date: string; values: Record<string, number> }> } | undefined ) as { rangeDays: number; channels: string[]; points: Array<{ date: string; values: Record<string, number> }> } | undefined
const companies = useQuery( const companies = useQuery(
enabled ? api.companies.list : undefined, api.companies.list,
enabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined enabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) as Array<{ id: Id<"companies">; name: string }> | undefined ) as Array<{ id: Id<"companies">; name: string }> | undefined
const queueTotal = useMemo( const queueTotal = useMemo(

View file

@ -34,8 +34,8 @@ export function SectionCards() {
const dashboardEnabled = Boolean(isStaff && convexUserId) const dashboardEnabled = Boolean(isStaff && convexUserId)
const dashboard = useQuery( const dashboard = useQuery(
dashboardEnabled ? api.reports.dashboardOverview : undefined, api.reports.dashboardOverview,
dashboardEnabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined dashboardEnabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
) )
const inProgressSummary = useMemo(() => { const inProgressSummary = useMemo(() => {

View file

@ -24,8 +24,8 @@ export function CommentTemplatesManager() {
const [activeKind, setActiveKind] = useState<"comment" | "closing">("comment") const [activeKind, setActiveKind] = useState<"comment" | "closing">("comment")
const templates = useQuery( const templates = useQuery(
viewerId ? api.commentTemplates.list : undefined, api.commentTemplates.list,
viewerId ? { tenantId, viewerId, kind: activeKind } : undefined viewerId ? { tenantId, viewerId, kind: activeKind } : "skip"
) as ) as
| { | {
id: Id<"commentTemplates"> id: Id<"commentTemplates">

View file

@ -135,8 +135,8 @@ export function CloseTicketDialog({
const closingTemplateArgs = const closingTemplateArgs =
actorId && open ? { tenantId, viewerId: actorId, kind: "closing" as const } : undefined actorId && open ? { tenantId, viewerId: actorId, kind: "closing" as const } : undefined
const closingTemplatesRemote = useQuery( const closingTemplatesRemote = useQuery(
actorId && open ? api.commentTemplates.list : undefined, api.commentTemplates.list,
closingTemplateArgs closingTemplateArgs ?? "skip"
) )
const closingTemplates = Array.isArray(closingTemplatesRemote) const closingTemplates = Array.isArray(closingTemplatesRemote)
? (closingTemplatesRemote as { id: string; title: string; body: string }[]) ? (closingTemplatesRemote as { id: string; title: string; body: string }[])

View file

@ -126,12 +126,11 @@ export function NewTicketDialog({ triggerClassName }: { triggerClassName?: strin
}) })
const { convexUserId, isStaff, role } = useAuth() const { convexUserId, isStaff, role } = useAuth()
const queuesEnabled = Boolean(isStaff && convexUserId) const queuesEnabled = Boolean(isStaff && convexUserId)
const queueArgs = queuesEnabled
? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> }
: undefined
useDefaultQueues(DEFAULT_TENANT_ID) useDefaultQueues(DEFAULT_TENANT_ID)
const queuesRemote = useQuery(queuesEnabled ? api.queues.summary : undefined, queueArgs) const queuesRemote = useQuery(
api.queues.summary,
queuesEnabled ? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } : "skip"
)
const queues = useMemo( const queues = useMemo(
() => (Array.isArray(queuesRemote) ? (queuesRemote as TicketQueueSummary[]) : []), () => (Array.isArray(queuesRemote) ? (queuesRemote as TicketQueueSummary[]) : []),
[queuesRemote] [queuesRemote]
@ -145,10 +144,10 @@ export function NewTicketDialog({ triggerClassName }: { triggerClassName?: strin
) )
const directoryQueryEnabled = queuesEnabled && Boolean(convexUserId) const directoryQueryEnabled = queuesEnabled && Boolean(convexUserId)
const companiesArgs = directoryQueryEnabled const companiesRemote = useQuery(
? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } api.companies.list,
: undefined directoryQueryEnabled ? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } : "skip"
const companiesRemote = useQuery(directoryQueryEnabled ? api.companies.list : undefined, companiesArgs) )
const companies = useMemo( const companies = useMemo(
() => () =>
(Array.isArray(companiesRemote) ? companiesRemote : []).map((company) => ({ (Array.isArray(companiesRemote) ? companiesRemote : []).map((company) => ({
@ -159,10 +158,10 @@ export function NewTicketDialog({ triggerClassName }: { triggerClassName?: strin
[companiesRemote] [companiesRemote]
) )
const customersArgs = directoryQueryEnabled const customersRemote = useQuery(
? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } api.users.listCustomers,
: undefined directoryQueryEnabled ? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } : "skip"
const customersRemote = useQuery(directoryQueryEnabled ? api.users.listCustomers : undefined, customersArgs) )
const customers = useMemo( const customers = useMemo(
() => (Array.isArray(customersRemote) ? (customersRemote as CustomerOption[]) : []), () => (Array.isArray(customersRemote) ? (customersRemote as CustomerOption[]) : []),
[customersRemote] [customersRemote]

View file

@ -32,14 +32,16 @@ export function PlayNextTicketCard({ context }: PlayNextTicketCardProps) {
const router = useRouter() const router = useRouter()
const { convexUserId, isStaff } = useAuth() const { convexUserId, isStaff } = useAuth()
const queuesEnabled = Boolean(isStaff && convexUserId) const queuesEnabled = Boolean(isStaff && convexUserId)
const queueArgs = queuesEnabled ? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } : undefined const queueSummaryResult = useQuery(
const queueSummaryResult = useQuery(queuesEnabled ? api.queues.summary : undefined, queueArgs) api.queues.summary,
queuesEnabled ? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } : "skip"
)
const queueSummary: TicketQueueSummary[] = Array.isArray(queueSummaryResult) ? queueSummaryResult : [] const queueSummary: TicketQueueSummary[] = Array.isArray(queueSummaryResult) ? queueSummaryResult : []
const playNext = useMutation(api.tickets.playNext) const playNext = useMutation(api.tickets.playNext)
const [selectedQueueId, setSelectedQueueId] = useState<string | undefined>(undefined) const [selectedQueueId, setSelectedQueueId] = useState<string | undefined>(undefined)
const nextTicketFromServer = useQuery( const nextTicketFromServer = useQuery(
convexUserId ? api.tickets.list : undefined, api.tickets.list,
convexUserId convexUserId
? { ? {
tenantId: DEFAULT_TENANT_ID, tenantId: DEFAULT_TENANT_ID,
@ -50,7 +52,7 @@ export function PlayNextTicketCard({ context }: PlayNextTicketCardProps) {
queueId: (selectedQueueId as Id<"queues">) || undefined, queueId: (selectedQueueId as Id<"queues">) || undefined,
limit: 1, limit: 1,
} }
: undefined : "skip"
)?.[0] )?.[0]
const nextTicketUi = nextTicketFromServer ? mapTicketFromServer(nextTicketFromServer as unknown) : null const nextTicketUi = nextTicketFromServer ? mapTicketFromServer(nextTicketFromServer as unknown) : null

View file

@ -74,10 +74,12 @@ function TicketRow({ ticket, entering }: { ticket: Ticket; entering: boolean })
export function RecentTicketsPanel() { export function RecentTicketsPanel() {
const { convexUserId } = useAuth() const { convexUserId } = useAuth()
const ticketsArgs = convexUserId const ticketsResult = useQuery(
? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users">, limit: 12 } api.tickets.list,
: undefined convexUserId
const ticketsResult = useQuery(convexUserId ? api.tickets.list : undefined, ticketsArgs) ? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users">, limit: 12 }
: "skip"
)
const [enteringId, setEnteringId] = useState<string | null>(null) const [enteringId, setEnteringId] = useState<string | null>(null)
const previousIdsRef = useRef<string[]>([]) const previousIdsRef = useRef<string[]>([])

View file

@ -73,8 +73,8 @@ export function TicketComments({ ticket }: TicketCommentsProps) {
const templateArgs = const templateArgs =
convexUserId && isStaff convexUserId && isStaff
? { tenantId: ticket.tenantId, viewerId: convexUserId as Id<"users">, kind: "comment" as const } ? { tenantId: ticket.tenantId, viewerId: convexUserId as Id<"users">, kind: "comment" as const }
: undefined : "skip"
const templatesResult = useQuery(convexUserId && isStaff ? api.commentTemplates.list : undefined, templateArgs) const templatesResult = useQuery(api.commentTemplates.list, templateArgs)
const templates = Array.isArray(templatesResult) const templates = Array.isArray(templatesResult)
? (templatesResult as { id: string; title: string; body: string }[]) ? (templatesResult as { id: string; title: string; body: string }[])
: [] : []

View file

@ -17,14 +17,16 @@ import { useAuth } from "@/lib/auth-client";
export function TicketDetailView({ id }: { id: string }) { export function TicketDetailView({ id }: { id: string }) {
const { convexUserId } = useAuth(); const { convexUserId } = useAuth();
const canLoadTicket = Boolean(convexUserId); const canLoadTicket = Boolean(convexUserId);
const queryArgs = canLoadTicket const t = useQuery(
? { api.tickets.getById,
tenantId: DEFAULT_TENANT_ID, canLoadTicket
id: id as Id<"tickets">, ? {
viewerId: convexUserId as Id<"users">, tenantId: DEFAULT_TENANT_ID,
} id: id as Id<"tickets">,
: undefined; viewerId: convexUserId as Id<"users">,
const t = useQuery(canLoadTicket ? api.tickets.getById : undefined, queryArgs); }
: "skip"
);
const isLoading = !convexUserId || t === undefined; const isLoading = !convexUserId || t === undefined;
if (isLoading) { if (isLoading) {

View file

@ -16,10 +16,11 @@ interface TicketQueueSummaryProps {
export function TicketQueueSummaryCards({ queues }: TicketQueueSummaryProps) { export function TicketQueueSummaryCards({ queues }: TicketQueueSummaryProps) {
const { convexUserId, isStaff } = useAuth() const { convexUserId, isStaff } = useAuth()
const enabled = Boolean(isStaff && convexUserId) const enabled = Boolean(isStaff && convexUserId)
const queueArgs = enabled ? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } : undefined const fromServer = useQuery(
const fromServer = useQuery(enabled ? api.queues.summary : undefined, queueArgs) api.queues.summary,
const serverData = Array.isArray(fromServer) ? fromServer : undefined enabled ? { tenantId: DEFAULT_TENANT_ID, viewerId: convexUserId as Id<"users"> } : "skip"
const data: TicketQueueSummary[] = queues ?? serverData ?? [] ) as TicketQueueSummary[] | undefined
const data: TicketQueueSummary[] = queues ?? fromServer ?? []
if (!queues && fromServer === undefined) { if (!queues && fromServer === undefined) {
return ( return (

View file

@ -167,10 +167,10 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
const updateCategories = useMutation(api.tickets.updateCategories) const updateCategories = useMutation(api.tickets.updateCategories)
const agents = (useQuery(api.users.listAgents, { tenantId: ticket.tenantId }) as Doc<"users">[] | undefined) ?? [] const agents = (useQuery(api.users.listAgents, { tenantId: ticket.tenantId }) as Doc<"users">[] | undefined) ?? []
const queuesEnabled = Boolean(isStaff && convexUserId) const queuesEnabled = Boolean(isStaff && convexUserId)
const companiesArgs = convexUserId const companiesRemote = useQuery(
? { tenantId: ticket.tenantId, viewerId: convexUserId as Id<"users"> } api.companies.list,
: undefined convexUserId ? { tenantId: ticket.tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
const companiesRemote = useQuery(convexUserId ? api.companies.list : undefined, companiesArgs) )
const companies = useMemo( const companies = useMemo(
() => () =>
(Array.isArray(companiesRemote) ? companiesRemote : []).map((company) => ({ (Array.isArray(companiesRemote) ? companiesRemote : []).map((company) => ({
@ -181,27 +181,26 @@ export function TicketSummaryHeader({ ticket }: TicketHeaderProps) {
[companiesRemote] [companiesRemote]
) )
const customersArgs = convexUserId const customersRemote = useQuery(
? { tenantId: ticket.tenantId, viewerId: convexUserId as Id<"users"> } api.users.listCustomers,
: undefined convexUserId ? { tenantId: ticket.tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
const customersRemote = useQuery(convexUserId ? api.users.listCustomers : undefined, customersArgs) )
const customers = useMemo( const customers = useMemo(
() => (Array.isArray(customersRemote) ? (customersRemote as CustomerOption[]) : []), () => (Array.isArray(customersRemote) ? (customersRemote as CustomerOption[]) : []),
[customersRemote] [customersRemote]
) )
const queueArgs = queuesEnabled const queuesResult = useQuery(
? { tenantId: ticket.tenantId, viewerId: convexUserId as Id<"users"> } api.queues.summary,
: undefined queuesEnabled ? { tenantId: ticket.tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
const queuesResult = useQuery(queuesEnabled ? api.queues.summary : undefined, queueArgs) )
const queues: TicketQueueSummary[] = Array.isArray(queuesResult) ? queuesResult : [] const queues: TicketQueueSummary[] = Array.isArray(queuesResult) ? queuesResult : []
const { categories, isLoading: categoriesLoading } = useTicketCategories(ticket.tenantId) const { categories, isLoading: categoriesLoading } = useTicketCategories(ticket.tenantId)
const workSummaryArgs = convexUserId
? { ticketId: ticket.id as Id<"tickets">, viewerId: convexUserId as Id<"users"> }
: undefined
const workSummaryRemote = useQuery( const workSummaryRemote = useQuery(
convexUserId ? api.tickets.workSummary : undefined, api.tickets.workSummary,
workSummaryArgs convexUserId
? { ticketId: ticket.id as Id<"tickets">, viewerId: convexUserId as Id<"users"> }
: "skip"
) as ) as
| { | {
ticketId: Id<"tickets"> ticketId: Id<"tickets">

View file

@ -65,8 +65,10 @@ export function TicketsView({ initialFilters }: TicketsViewProps = {}) {
useDefaultQueues(tenantId) useDefaultQueues(tenantId)
const queuesEnabled = Boolean(isStaff && convexUserId) const queuesEnabled = Boolean(isStaff && convexUserId)
const queueArgs = queuesEnabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : undefined const queuesResult = useQuery(
const queuesResult = useQuery(queuesEnabled ? api.queues.summary : undefined, queueArgs) api.queues.summary,
queuesEnabled ? { tenantId, viewerId: convexUserId as Id<"users"> } : "skip"
)
const queues: TicketQueueSummary[] = Array.isArray(queuesResult) ? queuesResult : [] const queues: TicketQueueSummary[] = Array.isArray(queuesResult) ? queuesResult : []
const agents = useQuery(api.users.listAgents, { tenantId }) as { _id: string; name: string }[] | undefined const agents = useQuery(api.users.listAgents, { tenantId }) as { _id: string; name: string }[] | undefined
const ticketsArgs = convexUserId const ticketsArgs = convexUserId
@ -80,8 +82,8 @@ export function TicketsView({ initialFilters }: TicketsViewProps = {}) {
assigneeId: filters.assigneeId ? (filters.assigneeId as unknown as Id<"users">) : undefined, assigneeId: filters.assigneeId ? (filters.assigneeId as unknown as Id<"users">) : undefined,
search: filters.search || undefined, search: filters.search || undefined,
} }
: undefined : "skip"
const ticketsRaw = useQuery(convexUserId ? api.tickets.list : undefined, ticketsArgs) const ticketsRaw = useQuery(api.tickets.list, ticketsArgs)
const tickets = useMemo( const tickets = useMemo(
() => mapTicketsFromServerList(Array.isArray(ticketsRaw) ? (ticketsRaw as unknown[]) : []), () => mapTicketsFromServerList(Array.isArray(ticketsRaw) ? (ticketsRaw as unknown[]) : []),