183 lines
5.5 KiB
TypeScript
183 lines
5.5 KiB
TypeScript
/**
|
|
* Query Keys Factory
|
|
*
|
|
* Centralized query keys for TanStack Query.
|
|
* This ensures type safety, consistency, and easy invalidation.
|
|
*
|
|
* Pattern:
|
|
* - `all`: Base key for the entire resource
|
|
* - `lists()`: All lists of this resource
|
|
* - `list(filters)`: Specific filtered list
|
|
* - `details()`: All detail views
|
|
* - `detail(id)`: Specific detail view
|
|
*/
|
|
|
|
// import type { InvoiceListFilter } from "@/lib/models/invoice-list.model";
|
|
// import type { ApprovalRequestListFilter } from "@/lib/models/approval-request.model";
|
|
// import type { PaymentOptimizationListFilter } from "@/lib/models/payment-optimization.model";
|
|
// import type { AuditListFilter } from "@/lib/models/audit-trail.model";
|
|
// import type { PerformanceAnalyticsDateRange } from "@/lib/models/performance-analytics.model";
|
|
import type { DocumentListFilter } from "@/lib/models/document.model";
|
|
|
|
// Temporary type placeholders until models are created
|
|
type InvoiceListFilter = any;
|
|
type ApprovalRequestListFilter = any;
|
|
type PaymentOptimizationListFilter = any;
|
|
type AuditListFilter = any;
|
|
type PerformanceAnalyticsDateRange = any;
|
|
|
|
export const queryKeys = {
|
|
/**
|
|
* Profile query keys
|
|
*/
|
|
profile: {
|
|
all: ["profile"] as const,
|
|
detail: () => [...queryKeys.profile.all, "detail"] as const,
|
|
},
|
|
|
|
/**
|
|
* Members query keys
|
|
*/
|
|
members: {
|
|
all: ["members"] as const,
|
|
lists: () => [...queryKeys.members.all, "list"] as const,
|
|
list: (filters: {
|
|
organizationId?: string;
|
|
page?: number;
|
|
pageSize?: number;
|
|
}) => [...queryKeys.members.lists(), filters] as const,
|
|
detail: (memberId: string) =>
|
|
[...queryKeys.members.all, "detail", memberId] as const,
|
|
},
|
|
|
|
/**
|
|
* Subscription query keys
|
|
*/
|
|
subscription: {
|
|
all: ["subscription"] as const,
|
|
status: () => [...queryKeys.subscription.all, "status"] as const,
|
|
},
|
|
|
|
/**
|
|
* Products query keys (Polar billing plans)
|
|
*/
|
|
products: {
|
|
all: ["products"] as const,
|
|
lists: () => [...queryKeys.products.all, "list"] as const,
|
|
list: [...["products"], "list"] as const,
|
|
},
|
|
|
|
/**
|
|
* Invoices query keys
|
|
*/
|
|
invoices: {
|
|
all: ["invoices"] as const,
|
|
lists: () => [...queryKeys.invoices.all, "list"] as const,
|
|
list: (filters: InvoiceListFilter) =>
|
|
[...queryKeys.invoices.lists(), filters] as const,
|
|
details: () => [...queryKeys.invoices.all, "detail"] as const,
|
|
detail: (invoiceId: number) =>
|
|
[...queryKeys.invoices.details(), invoiceId] as const,
|
|
duplicates: () => [...queryKeys.invoices.all, "duplicates"] as const,
|
|
duplicate: (invoiceId: number) =>
|
|
[...queryKeys.invoices.duplicates(), invoiceId] as const,
|
|
},
|
|
|
|
/**
|
|
* Approvals query keys
|
|
*/
|
|
approvals: {
|
|
all: ["approvals"] as const,
|
|
lists: () => [...queryKeys.approvals.all, "list"] as const,
|
|
list: (filters: ApprovalRequestListFilter) =>
|
|
[...queryKeys.approvals.lists(), filters] as const,
|
|
details: () => [...queryKeys.approvals.all, "detail"] as const,
|
|
detail: (approvalId: number) =>
|
|
[...queryKeys.approvals.details(), approvalId] as const,
|
|
},
|
|
|
|
/**
|
|
* Payments query keys
|
|
*/
|
|
payments: {
|
|
all: ["payments"] as const,
|
|
lists: () => [...queryKeys.payments.all, "list"] as const,
|
|
list: (filters: PaymentOptimizationListFilter) =>
|
|
[...queryKeys.payments.lists(), filters] as const,
|
|
details: () => [...queryKeys.payments.all, "detail"] as const,
|
|
detail: (paymentId: number) =>
|
|
[...queryKeys.payments.details(), paymentId] as const,
|
|
},
|
|
|
|
/**
|
|
* Audit trail query keys
|
|
*/
|
|
audit: {
|
|
all: ["audit"] as const,
|
|
summaries: () => [...queryKeys.audit.all, "summaries"] as const,
|
|
summaryList: (filters: AuditListFilter) =>
|
|
[...queryKeys.audit.summaries(), filters] as const,
|
|
timelines: () => [...queryKeys.audit.all, "timelines"] as const,
|
|
timeline: (invoiceId: number) =>
|
|
[...queryKeys.audit.timelines(), invoiceId] as const,
|
|
},
|
|
|
|
/**
|
|
* Performance Analytics query keys
|
|
*/
|
|
analytics: {
|
|
all: ["analytics"] as const,
|
|
roi: () => [...queryKeys.analytics.all, "roi"] as const,
|
|
roiMetrics: (dateRange: PerformanceAnalyticsDateRange) =>
|
|
[...queryKeys.analytics.roi(), dateRange] as const,
|
|
breakdown: () => [...queryKeys.analytics.all, "breakdown"] as const,
|
|
savingsBreakdown: (dateRange: PerformanceAnalyticsDateRange) =>
|
|
[...queryKeys.analytics.breakdown(), dateRange] as const,
|
|
},
|
|
|
|
/**
|
|
* Dashboard query keys
|
|
*/
|
|
dashboard: {
|
|
all: ["dashboard"] as const,
|
|
data: () => [...queryKeys.dashboard.all, "data"] as const,
|
|
},
|
|
|
|
/**
|
|
* Documents query keys
|
|
*/
|
|
documents: {
|
|
all: ["documents"] as const,
|
|
lists: () => ["documents", "list"] as const,
|
|
list: (filters: DocumentListFilter) =>
|
|
["documents", "list", filters] as const,
|
|
details: () => ["documents", "detail"] as const,
|
|
detail: (documentId: number) =>
|
|
["documents", "detail", documentId] as const,
|
|
},
|
|
|
|
/**
|
|
* Cognitive / Chat query keys
|
|
*/
|
|
cognitive: {
|
|
all: ["cognitive"] as const,
|
|
sessions: () => ["cognitive", "sessions"] as const,
|
|
messages: (sessionId: number) =>
|
|
["cognitive", "messages", sessionId] as const,
|
|
},
|
|
} as const;
|
|
|
|
/**
|
|
* Helper function to invalidate all queries for a resource
|
|
*
|
|
* @example
|
|
* ```ts
|
|
* // Invalidate all profile queries
|
|
* queryClient.invalidateQueries({ queryKey: queryKeys.profile.all });
|
|
*
|
|
* // Invalidate specific members list
|
|
* queryClient.invalidateQueries({
|
|
* queryKey: queryKeys.members.list({ organizationId: 'org-123' })
|
|
* });
|
|
* ```
|
|
*/
|