Skip to content

Commit 16e66aa

Browse files
author
Hoang Pham
committed
Add more tuples
1 parent b768948 commit 16e66aa

4 files changed

Lines changed: 532 additions & 0 deletions

File tree

Sources/SwiftUIQuery/Core/QueryKey.swift

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,70 @@ public struct KeyTuple4<K1: QueryKeyCodable, K2: QueryKeyCodable, K3: QueryKeyCo
8686
self.key4 = key4
8787
}
8888
}
89+
90+
public struct KeyTuple5<
91+
K1: QueryKeyCodable,
92+
K2: QueryKeyCodable,
93+
K3: QueryKeyCodable,
94+
K4: QueryKeyCodable,
95+
K5: QueryKeyCodable
96+
>: QueryKey,
97+
QueryKeyCodable {
98+
public let key1: K1
99+
public let key2: K2
100+
public let key3: K3
101+
public let key4: K4
102+
public let key5: K5
103+
104+
public init(_ key1: K1, _ key2: K2, _ key3: K3, _ key4: K4, _ key5: K5) {
105+
self.key1 = key1
106+
self.key2 = key2
107+
self.key3 = key3
108+
self.key4 = key4
109+
self.key5 = key5
110+
}
111+
112+
public init(_ key1: (some Any).Type, _ key2: K2, _ key3: K3, _ key4: K4, _ key5: K5) where K1 == String {
113+
self.key1 = String(describing: key1)
114+
self.key2 = key2
115+
self.key3 = key3
116+
self.key4 = key4
117+
self.key5 = key5
118+
}
119+
}
120+
121+
public struct KeyTuple6<
122+
K1: QueryKeyCodable,
123+
K2: QueryKeyCodable,
124+
K3: QueryKeyCodable,
125+
K4: QueryKeyCodable,
126+
K5: QueryKeyCodable,
127+
K6: QueryKeyCodable
128+
>: QueryKey,
129+
QueryKeyCodable {
130+
public let key1: K1
131+
public let key2: K2
132+
public let key3: K3
133+
public let key4: K4
134+
public let key5: K5
135+
public let key6: K6
136+
137+
public init(_ key1: K1, _ key2: K2, _ key3: K3, _ key4: K4, _ key5: K5, _ key6: K6) {
138+
self.key1 = key1
139+
self.key2 = key2
140+
self.key3 = key3
141+
self.key4 = key4
142+
self.key5 = key5
143+
self.key6 = key6
144+
}
145+
146+
public init(_ key1: (some Any).Type, _ key2: K2, _ key3: K3, _ key4: K4, _ key5: K5, _ key6: K6)
147+
where K1 == String {
148+
self.key1 = String(describing: key1)
149+
self.key2 = key2
150+
self.key3 = key3
151+
self.key4 = key4
152+
self.key5 = key5
153+
self.key6 = key6
154+
}
155+
}

Sources/SwiftUIQuery/UseInfiniteQuery.swift

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,4 +492,143 @@ extension UseInfiniteQuery {
492492
content: content
493493
)
494494
}
495+
496+
/// Create UseInfiniteQuery with KeyTuple5-based query key
497+
/// - Parameters:
498+
/// - queryKey: KeyTuple5 identifier for the query
499+
/// - queryFn: Function that fetches page data
500+
/// - getNextPageParam: Function to get next page parameter from pages
501+
/// - getPreviousPageParam: Function to determine the previous page parameter
502+
/// - initialPageParam: Initial page parameter for the first page
503+
/// - maxPages: Maximum number of pages to retain
504+
/// - retryConfig: Configuration for retry behavior (default: RetryConfig())
505+
/// - networkMode: Network behavior configuration (default: .online)
506+
/// - staleTime: Time before data is considered stale (default: 0)
507+
/// - gcTime: Time before unused data is garbage collected (default: 5 minutes)
508+
/// - refetchTriggers: Configuration for automatic refetching triggers (default: .default)
509+
/// - refetchOnAppear: When to refetch data on view appear (default: .ifStale)
510+
/// - structuralSharing: Whether to use structural sharing for performance (default: true)
511+
/// - meta: Arbitrary metadata for this query
512+
/// - enabled: Whether the query should execute automatically (default: true)
513+
/// - queryClient: Optional query client (uses shared instance if nil)
514+
/// - content: View builder that receives the query result
515+
public init<
516+
K1: QueryKeyCodable,
517+
K2: QueryKeyCodable,
518+
K3: QueryKeyCodable,
519+
K4: QueryKeyCodable,
520+
K5: QueryKeyCodable
521+
>(
522+
queryKey: KeyTuple5<K1, K2, K3, K4, K5>,
523+
queryFn: @escaping @Sendable (KeyTuple5<K1, K2, K3, K4, K5>, TPageParam?) async throws -> TData,
524+
getNextPageParam: @escaping GetNextPageParamFunction<TData, TPageParam>,
525+
getPreviousPageParam: GetPreviousPageParamFunction<TData, TPageParam>? = nil,
526+
initialPageParam: TPageParam? = nil,
527+
maxPages: Int? = nil,
528+
retryConfig: RetryConfig = RetryConfig(),
529+
networkMode: NetworkMode = .online,
530+
staleTime: TimeInterval = 0,
531+
gcTime: TimeInterval = defaultGcTime,
532+
refetchTriggers: RefetchTriggers = .default,
533+
refetchOnAppear: RefetchOnAppear = .ifStale,
534+
structuralSharing: Bool = true,
535+
meta: QueryMeta? = nil,
536+
enabled: Bool = true,
537+
queryClient: QueryClient? = nil,
538+
@ViewBuilder content: @escaping (UseInfiniteQueryResult<TData, TPageParam>) -> Content
539+
) where TKey == KeyTuple5<K1, K2, K3, K4, K5> {
540+
let options = InfiniteQueryOptions<TData, QueryError, KeyTuple5<K1, K2, K3, K4, K5>, TPageParam>(
541+
queryKey: queryKey,
542+
queryFn: queryFn,
543+
getNextPageParam: getNextPageParam,
544+
getPreviousPageParam: getPreviousPageParam,
545+
initialPageParam: initialPageParam,
546+
maxPages: maxPages,
547+
retryConfig: retryConfig,
548+
networkMode: networkMode,
549+
staleTime: staleTime,
550+
gcTime: gcTime,
551+
refetchTriggers: refetchTriggers,
552+
refetchOnAppear: refetchOnAppear,
553+
structuralSharing: structuralSharing,
554+
meta: meta,
555+
enabled: enabled
556+
)
557+
558+
self.init(
559+
options: options,
560+
queryClient: queryClient,
561+
content: content
562+
)
563+
}
564+
565+
/// Create UseInfiniteQuery with KeyTuple6-based query key
566+
/// - Parameters:
567+
/// - queryKey: KeyTuple6 identifier for the query
568+
/// - queryFn: Function that fetches page data
569+
/// - getNextPageParam: Function to get next page parameter from pages
570+
/// - getPreviousPageParam: Function to determine the previous page parameter
571+
/// - initialPageParam: Initial page parameter for the first page
572+
/// - maxPages: Maximum number of pages to retain
573+
/// - retryConfig: Configuration for retry behavior (default: RetryConfig())
574+
/// - networkMode: Network behavior configuration (default: .online)
575+
/// - staleTime: Time before data is considered stale (default: 0)
576+
/// - gcTime: Time before unused data is garbage collected (default: 5 minutes)
577+
/// - refetchTriggers: Configuration for automatic refetching triggers (default: .default)
578+
/// - refetchOnAppear: When to refetch data on view appear (default: .ifStale)
579+
/// - structuralSharing: Whether to use structural sharing for performance (default: true)
580+
/// - meta: Arbitrary metadata for this query
581+
/// - enabled: Whether the query should execute automatically (default: true)
582+
/// - queryClient: Optional query client (uses shared instance if nil)
583+
/// - content: View builder that receives the query result
584+
public init<
585+
K1: QueryKeyCodable,
586+
K2: QueryKeyCodable,
587+
K3: QueryKeyCodable,
588+
K4: QueryKeyCodable,
589+
K5: QueryKeyCodable,
590+
K6: QueryKeyCodable
591+
>(
592+
queryKey: KeyTuple6<K1, K2, K3, K4, K5, K6>,
593+
queryFn: @escaping @Sendable (KeyTuple6<K1, K2, K3, K4, K5, K6>, TPageParam?) async throws -> TData,
594+
getNextPageParam: @escaping GetNextPageParamFunction<TData, TPageParam>,
595+
getPreviousPageParam: GetPreviousPageParamFunction<TData, TPageParam>? = nil,
596+
initialPageParam: TPageParam? = nil,
597+
maxPages: Int? = nil,
598+
retryConfig: RetryConfig = RetryConfig(),
599+
networkMode: NetworkMode = .online,
600+
staleTime: TimeInterval = 0,
601+
gcTime: TimeInterval = defaultGcTime,
602+
refetchTriggers: RefetchTriggers = .default,
603+
refetchOnAppear: RefetchOnAppear = .ifStale,
604+
structuralSharing: Bool = true,
605+
meta: QueryMeta? = nil,
606+
enabled: Bool = true,
607+
queryClient: QueryClient? = nil,
608+
@ViewBuilder content: @escaping (UseInfiniteQueryResult<TData, TPageParam>) -> Content
609+
) where TKey == KeyTuple6<K1, K2, K3, K4, K5, K6> {
610+
let options = InfiniteQueryOptions<TData, QueryError, KeyTuple6<K1, K2, K3, K4, K5, K6>, TPageParam>(
611+
queryKey: queryKey,
612+
queryFn: queryFn,
613+
getNextPageParam: getNextPageParam,
614+
getPreviousPageParam: getPreviousPageParam,
615+
initialPageParam: initialPageParam,
616+
maxPages: maxPages,
617+
retryConfig: retryConfig,
618+
networkMode: networkMode,
619+
staleTime: staleTime,
620+
gcTime: gcTime,
621+
refetchTriggers: refetchTriggers,
622+
refetchOnAppear: refetchOnAppear,
623+
structuralSharing: structuralSharing,
624+
meta: meta,
625+
enabled: enabled
626+
)
627+
628+
self.init(
629+
options: options,
630+
queryClient: queryClient,
631+
content: content
632+
)
633+
}
495634
}

Sources/SwiftUIQuery/UseQuery.swift

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,135 @@ extension UseQuery {
364364
self._observer = StateObject(wrappedValue: QueryObserver(client: client, options: options))
365365
self.content = content
366366
}
367+
368+
/// Create UseQuery with KeyTuple5-based query key
369+
/// - Parameters:
370+
/// - queryKey: KeyTuple5 identifier for the query
371+
/// - queryFn: Function that fetches the data
372+
/// - retryConfig: Configuration for retry behavior (default: RetryConfig())
373+
/// - networkMode: Network behavior configuration (default: .online)
374+
/// - staleTime: Time before data is considered stale (default: 0)
375+
/// - gcTime: Time before unused data is garbage collected (default: 5 minutes)
376+
/// - refetchTriggers: Configuration for automatic refetching triggers (default: .default)
377+
/// - refetchOnAppear: When to refetch data on view appear (default: .ifStale)
378+
/// - initialData: Initial data to show while the query loads
379+
/// - initialDataFunction: Function to provide initial data
380+
/// - structuralSharing: Whether to use structural sharing for performance (default: true)
381+
/// - meta: Arbitrary metadata for this query
382+
/// - enabled: Whether the query should execute automatically (default: true)
383+
/// - queryClient: Optional query client (uses shared instance if nil)
384+
/// - content: View builder that receives the query result
385+
public init<
386+
K1: QueryKeyCodable,
387+
K2: QueryKeyCodable,
388+
K3: QueryKeyCodable,
389+
K4: QueryKeyCodable,
390+
K5: QueryKeyCodable
391+
>(
392+
queryKey: KeyTuple5<K1, K2, K3, K4, K5>,
393+
queryFn: @escaping @Sendable (KeyTuple5<K1, K2, K3, K4, K5>) async throws -> TData,
394+
retryConfig: RetryConfig = RetryConfig(),
395+
networkMode: NetworkMode = .online,
396+
staleTime: TimeInterval = 0,
397+
gcTime: TimeInterval = defaultGcTime,
398+
refetchTriggers: RefetchTriggers = .default,
399+
refetchOnAppear: RefetchOnAppear = .ifStale,
400+
initialData: TData? = nil,
401+
initialDataFunction: InitialDataFunction<TData>? = nil,
402+
structuralSharing: Bool = true,
403+
meta: QueryMeta? = nil,
404+
enabled: Bool = true,
405+
queryClient: QueryClient? = nil,
406+
@ViewBuilder content: @escaping (UseQueryResult<TData>) -> Content
407+
) where TKey == KeyTuple5<K1, K2, K3, K4, K5> {
408+
let options = QueryOptions<TData, KeyTuple5<K1, K2, K3, K4, K5>>(
409+
queryKey: queryKey,
410+
queryFn: queryFn,
411+
retryConfig: retryConfig,
412+
networkMode: networkMode,
413+
staleTime: staleTime,
414+
gcTime: gcTime,
415+
refetchTriggers: refetchTriggers,
416+
refetchOnAppear: refetchOnAppear,
417+
initialData: initialData,
418+
initialDataFunction: initialDataFunction,
419+
structuralSharing: structuralSharing,
420+
meta: meta,
421+
enabled: enabled
422+
)
423+
424+
// Store options and client for later use
425+
self.options = options
426+
self.queryClient = queryClient
427+
let client = queryClient ?? QueryClientProvider.shared.queryClient
428+
self._observer = StateObject(wrappedValue: QueryObserver(client: client, options: options))
429+
self.content = content
430+
}
431+
432+
/// Create UseQuery with KeyTuple6-based query key
433+
/// - Parameters:
434+
/// - queryKey: KeyTuple6 identifier for the query
435+
/// - queryFn: Function that fetches the data
436+
/// - retryConfig: Configuration for retry behavior (default: RetryConfig())
437+
/// - networkMode: Network behavior configuration (default: .online)
438+
/// - staleTime: Time before data is considered stale (default: 0)
439+
/// - gcTime: Time before unused data is garbage collected (default: 5 minutes)
440+
/// - refetchTriggers: Configuration for automatic refetching triggers (default: .default)
441+
/// - refetchOnAppear: When to refetch data on view appear (default: .ifStale)
442+
/// - initialData: Initial data to show while the query loads
443+
/// - initialDataFunction: Function to provide initial data
444+
/// - structuralSharing: Whether to use structural sharing for performance (default: true)
445+
/// - meta: Arbitrary metadata for this query
446+
/// - enabled: Whether the query should execute automatically (default: true)
447+
/// - queryClient: Optional query client (uses shared instance if nil)
448+
/// - content: View builder that receives the query result
449+
public init<
450+
K1: QueryKeyCodable,
451+
K2: QueryKeyCodable,
452+
K3: QueryKeyCodable,
453+
K4: QueryKeyCodable,
454+
K5: QueryKeyCodable,
455+
K6: QueryKeyCodable
456+
>(
457+
queryKey: KeyTuple6<K1, K2, K3, K4, K5, K6>,
458+
queryFn: @escaping @Sendable (KeyTuple6<K1, K2, K3, K4, K5, K6>) async throws -> TData,
459+
retryConfig: RetryConfig = RetryConfig(),
460+
networkMode: NetworkMode = .online,
461+
staleTime: TimeInterval = 0,
462+
gcTime: TimeInterval = defaultGcTime,
463+
refetchTriggers: RefetchTriggers = .default,
464+
refetchOnAppear: RefetchOnAppear = .ifStale,
465+
initialData: TData? = nil,
466+
initialDataFunction: InitialDataFunction<TData>? = nil,
467+
structuralSharing: Bool = true,
468+
meta: QueryMeta? = nil,
469+
enabled: Bool = true,
470+
queryClient: QueryClient? = nil,
471+
@ViewBuilder content: @escaping (UseQueryResult<TData>) -> Content
472+
) where TKey == KeyTuple6<K1, K2, K3, K4, K5, K6> {
473+
let options = QueryOptions<TData, KeyTuple6<K1, K2, K3, K4, K5, K6>>(
474+
queryKey: queryKey,
475+
queryFn: queryFn,
476+
retryConfig: retryConfig,
477+
networkMode: networkMode,
478+
staleTime: staleTime,
479+
gcTime: gcTime,
480+
refetchTriggers: refetchTriggers,
481+
refetchOnAppear: refetchOnAppear,
482+
initialData: initialData,
483+
initialDataFunction: initialDataFunction,
484+
structuralSharing: structuralSharing,
485+
meta: meta,
486+
enabled: enabled
487+
)
488+
489+
// Store options and client for later use
490+
self.options = options
491+
self.queryClient = queryClient
492+
let client = queryClient ?? QueryClientProvider.shared.queryClient
493+
self._observer = StateObject(wrappedValue: QueryObserver(client: client, options: options))
494+
self.content = content
495+
}
367496
}
368497

369498
// MARK: - Preview Helpers

0 commit comments

Comments
 (0)