/** * Reusable query key factory utilities * Reduces duplication across API hooks and ensures consistent key structure */ /** * Creates a standard query key factory for a resource * Follows React Query best practices for hierarchical keys */ export function createQueryKeyFactory(resourceName: T) { return { all: [resourceName] as const, lists: () => [...[resourceName], 'list'] as const, list: (filters?: Record) => [...[resourceName], 'list', filters] as const, details: () => [...[resourceName], 'detail'] as const, detail: (id: string) => [...[resourceName], 'detail', id] as const, }; } /** * Extended query key factory with additional scopes * Useful for resources with relationships (e.g., byOrganization, bySite) */ export function createExtendedQueryKeyFactory( resourceName: T, additionalScopes?: Record readonly unknown[]> ) { const base = createQueryKeyFactory(resourceName); const extended = { ...base, }; if (additionalScopes) { for (const [scopeName, scopeFn] of Object.entries(additionalScopes)) { (extended as Record)[scopeName] = scopeFn; } } return extended; }