Skip to content

Commit 7781fd9

Browse files
Hoang Phamclaude
andcommitted
feat: add KeyTuple convenience initializers for QueryOptions
Added convenience initializers for QueryOptions that accept KeyTuple2 through KeyTuple5 directly as queryKey parameters, matching the pattern used in UseQuery. Also fixed QueryClient type inference issue by breaking up complex expression. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 8a9e45a commit 7781fd9

2 files changed

Lines changed: 155 additions & 6 deletions

File tree

Sources/SwiftUIQuery/Core/QueryOptions.swift

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,3 +84,145 @@ public struct QueryOptions<TData: Sendable, TKey: QueryKey>: Sendable, Equatable
8484
self.enabled = enabled
8585
}
8686
}
87+
88+
// MARK: - KeyTuple Convenience Initializers
89+
90+
extension QueryOptions {
91+
/// Convenience initializer for KeyTuple2
92+
public init<K1: QueryKeyCodable, K2: QueryKeyCodable>(
93+
queryKey: KeyTuple2<K1, K2>,
94+
queryFn: @escaping QueryFunction<TData, KeyTuple2<K1, K2>>,
95+
retryConfig: RetryConfig = RetryConfig(),
96+
networkMode: NetworkMode = .online,
97+
staleTime: TimeInterval = 0,
98+
gcTime: TimeInterval = defaultGcTime,
99+
refetchTriggers: RefetchTriggers = .default,
100+
refetchOnAppear: RefetchOnAppear = .always,
101+
initialData: TData? = nil,
102+
initialDataFunction: InitialDataFunction<TData>? = nil,
103+
structuralSharing: Bool = true,
104+
meta: QueryMeta? = nil,
105+
enabled: Bool = true
106+
) where TKey == KeyTuple2<K1, K2> {
107+
self.init(
108+
queryKey: queryKey,
109+
queryFn: queryFn,
110+
retryConfig: retryConfig,
111+
networkMode: networkMode,
112+
staleTime: staleTime,
113+
gcTime: gcTime,
114+
refetchTriggers: refetchTriggers,
115+
refetchOnAppear: refetchOnAppear,
116+
initialData: initialData,
117+
initialDataFunction: initialDataFunction,
118+
structuralSharing: structuralSharing,
119+
meta: meta,
120+
enabled: enabled
121+
)
122+
}
123+
124+
/// Convenience initializer for KeyTuple3
125+
public init<K1: QueryKeyCodable, K2: QueryKeyCodable, K3: QueryKeyCodable>(
126+
queryKey: KeyTuple3<K1, K2, K3>,
127+
queryFn: @escaping QueryFunction<TData, KeyTuple3<K1, K2, K3>>,
128+
retryConfig: RetryConfig = RetryConfig(),
129+
networkMode: NetworkMode = .online,
130+
staleTime: TimeInterval = 0,
131+
gcTime: TimeInterval = defaultGcTime,
132+
refetchTriggers: RefetchTriggers = .default,
133+
refetchOnAppear: RefetchOnAppear = .always,
134+
initialData: TData? = nil,
135+
initialDataFunction: InitialDataFunction<TData>? = nil,
136+
structuralSharing: Bool = true,
137+
meta: QueryMeta? = nil,
138+
enabled: Bool = true
139+
) where TKey == KeyTuple3<K1, K2, K3> {
140+
self.init(
141+
queryKey: queryKey,
142+
queryFn: queryFn,
143+
retryConfig: retryConfig,
144+
networkMode: networkMode,
145+
staleTime: staleTime,
146+
gcTime: gcTime,
147+
refetchTriggers: refetchTriggers,
148+
refetchOnAppear: refetchOnAppear,
149+
initialData: initialData,
150+
initialDataFunction: initialDataFunction,
151+
structuralSharing: structuralSharing,
152+
meta: meta,
153+
enabled: enabled
154+
)
155+
}
156+
157+
/// Convenience initializer for KeyTuple4
158+
public init<K1: QueryKeyCodable, K2: QueryKeyCodable, K3: QueryKeyCodable, K4: QueryKeyCodable>(
159+
queryKey: KeyTuple4<K1, K2, K3, K4>,
160+
queryFn: @escaping QueryFunction<TData, KeyTuple4<K1, K2, K3, K4>>,
161+
retryConfig: RetryConfig = RetryConfig(),
162+
networkMode: NetworkMode = .online,
163+
staleTime: TimeInterval = 0,
164+
gcTime: TimeInterval = defaultGcTime,
165+
refetchTriggers: RefetchTriggers = .default,
166+
refetchOnAppear: RefetchOnAppear = .always,
167+
initialData: TData? = nil,
168+
initialDataFunction: InitialDataFunction<TData>? = nil,
169+
structuralSharing: Bool = true,
170+
meta: QueryMeta? = nil,
171+
enabled: Bool = true
172+
) where TKey == KeyTuple4<K1, K2, K3, K4> {
173+
self.init(
174+
queryKey: queryKey,
175+
queryFn: queryFn,
176+
retryConfig: retryConfig,
177+
networkMode: networkMode,
178+
staleTime: staleTime,
179+
gcTime: gcTime,
180+
refetchTriggers: refetchTriggers,
181+
refetchOnAppear: refetchOnAppear,
182+
initialData: initialData,
183+
initialDataFunction: initialDataFunction,
184+
structuralSharing: structuralSharing,
185+
meta: meta,
186+
enabled: enabled
187+
)
188+
}
189+
190+
/// Convenience initializer for KeyTuple5
191+
public init<
192+
K1: QueryKeyCodable,
193+
K2: QueryKeyCodable,
194+
K3: QueryKeyCodable,
195+
K4: QueryKeyCodable,
196+
K5: QueryKeyCodable
197+
>(
198+
queryKey: KeyTuple5<K1, K2, K3, K4, K5>,
199+
queryFn: @escaping QueryFunction<TData, KeyTuple5<K1, K2, K3, K4, K5>>,
200+
retryConfig: RetryConfig = RetryConfig(),
201+
networkMode: NetworkMode = .online,
202+
staleTime: TimeInterval = 0,
203+
gcTime: TimeInterval = defaultGcTime,
204+
refetchTriggers: RefetchTriggers = .default,
205+
refetchOnAppear: RefetchOnAppear = .always,
206+
initialData: TData? = nil,
207+
initialDataFunction: InitialDataFunction<TData>? = nil,
208+
structuralSharing: Bool = true,
209+
meta: QueryMeta? = nil,
210+
enabled: Bool = true
211+
) where TKey == KeyTuple5<K1, K2, K3, K4, K5> {
212+
self.init(
213+
queryKey: queryKey,
214+
queryFn: queryFn,
215+
retryConfig: retryConfig,
216+
networkMode: networkMode,
217+
staleTime: staleTime,
218+
gcTime: gcTime,
219+
refetchTriggers: refetchTriggers,
220+
refetchOnAppear: refetchOnAppear,
221+
initialData: initialData,
222+
initialDataFunction: initialDataFunction,
223+
structuralSharing: structuralSharing,
224+
meta: meta,
225+
enabled: enabled
226+
)
227+
}
228+
}

Sources/SwiftUIQuery/QueryClient.swift

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -260,14 +260,21 @@ public final class QueryClient {
260260
queryKey: TKey,
261261
data: TData
262262
) -> Query<TData, TKey> {
263+
let queryFn: QueryFunction<TData, TKey> = { _ in data }
264+
let retryConfig = defaultOptions.queries?.retryConfig ?? RetryConfig()
265+
let networkMode = defaultOptions.queries?.networkMode ?? .online
266+
let staleTime = defaultOptions.queries?.staleTime ?? 0
267+
let gcTime = defaultOptions.queries?.gcTime ?? defaultGcTime
268+
let refetchTriggers = defaultOptions.queries?.refetchTriggers ?? .default
269+
263270
let options = QueryOptions<TData, TKey>(
264271
queryKey: queryKey,
265-
queryFn: { _ in data }, // Dummy function for imperative data setting
266-
retryConfig: defaultOptions.queries?.retryConfig ?? RetryConfig(),
267-
networkMode: defaultOptions.queries?.networkMode ?? .online,
268-
staleTime: defaultOptions.queries?.staleTime ?? 0,
269-
gcTime: defaultOptions.queries?.gcTime ?? defaultGcTime,
270-
refetchTriggers: defaultOptions.queries?.refetchTriggers ?? .default,
272+
queryFn: queryFn,
273+
retryConfig: retryConfig,
274+
networkMode: networkMode,
275+
staleTime: staleTime,
276+
gcTime: gcTime,
277+
refetchTriggers: refetchTriggers,
271278
refetchOnAppear: .always,
272279
initialData: nil,
273280
initialDataFunction: nil,

0 commit comments

Comments
 (0)