refactor: use Convex skip sentinel in query args
This commit is contained in:
parent
3de7eccaa8
commit
bd2f22d046
32 changed files with 167 additions and 157 deletions
|
|
@ -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]
|
||||||
|
|
|
||||||
|
|
@ -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(() => {
|
||||||
|
|
|
||||||
|
|
@ -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 (
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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[] = [
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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" />
|
||||||
|
|
|
||||||
|
|
@ -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(() => {
|
||||||
|
|
|
||||||
|
|
@ -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(() => {
|
||||||
|
|
|
||||||
|
|
@ -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(() => {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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 ?? []
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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(() => {
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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 }[])
|
||||||
|
|
|
||||||
|
|
@ -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]
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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[]>([])
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 }[])
|
||||||
: []
|
: []
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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 (
|
||||||
|
|
|
||||||
|
|
@ -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">
|
||||||
|
|
|
||||||
|
|
@ -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[]) : []),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue