Skip to content

Commit 7c4e275

Browse files
committed
🐛 [useTableRequest]: Fix cache key and filter handling
- Add buildTableRequestCacheKey() to include sorting/filter hash - Remove useLatestRef, use state values directly - Fix setColumnFilter to remove key when value is null
1 parent 4c51f31 commit 7c4e275

1 file changed

Lines changed: 32 additions & 23 deletions

File tree

hooks/src/commonMain/kotlin/xyz/junerver/compose/hooks/userequest/UseTableRequest.kt

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import androidx.compose.runtime.derivedStateOf
66
import androidx.compose.runtime.remember
77
import xyz.junerver.compose.hooks._useState
88
import xyz.junerver.compose.hooks.useEffect
9-
import xyz.junerver.compose.hooks.useLatestRef
109
import xyz.junerver.compose.hooks.userequest.utils.CachedData
1110
import xyz.junerver.compose.hooks.utils.CacheManager
1211
import xyz.junerver.compose.hooks.usetable.state.SortDescriptor
@@ -25,6 +24,19 @@ data class TableRequestParams(
2524
val columnFilters: Map<String, Any?> = emptyMap()
2625
)
2726

27+
private fun buildTableRequestCacheKey(baseKey: String, params: TableRequestParams): String {
28+
val sortingKey = params.sorting.joinToString("|") { sort ->
29+
"${sort.columnId}:${if (sort.desc) 1 else 0}"
30+
}
31+
val columnFiltersKey = params.columnFilters.entries
32+
.sortedBy { it.key }
33+
.joinToString("|") { (key, value) -> "$key=$value" }
34+
val filterHash = listOf(sortingKey, params.globalFilter, columnFiltersKey)
35+
.joinToString("#")
36+
.hashCode()
37+
return "${baseKey}_p${params.page}_s${params.pageSize}_f$filterHash"
38+
}
39+
2840
/**
2941
* Standard table result container.
3042
*
@@ -193,23 +205,16 @@ fun <T> useTableRequest(
193205
val globalFilterDep = if (options.triggerOnFilteringChange) currentGlobalFilter else null
194206
val columnFiltersDep = if (options.triggerOnFilteringChange) currentColumnFilters else null
195207

196-
// 3. Use refs for latest values
197-
val latestPage = useLatestRef(currentPage)
198-
val latestPageSize = useLatestRef(currentPageSize)
199-
val latestSorting = useLatestRef(currentSorting)
200-
val latestGlobalFilter = useLatestRef(currentGlobalFilter)
201-
val latestColumnFilters = useLatestRef(currentColumnFilters)
202-
203-
val requestParams = TableRequestParams(
204-
page = latestPage.current,
205-
pageSize = latestPageSize.current,
206-
sorting = latestSorting.current,
207-
globalFilter = latestGlobalFilter.current,
208-
columnFilters = latestColumnFilters.current
208+
val requestParamsState = _useState(
209+
TableRequestParams(
210+
page = currentPage,
211+
pageSize = currentPageSize,
212+
sorting = currentSorting,
213+
globalFilter = currentGlobalFilter,
214+
columnFilters = currentColumnFilters
215+
)
209216
)
210217

211-
val requestParamsState = _useState(requestParams)
212-
213218
// 4. Use useRequest with manual mode (force manual to avoid duplicate auto-run)
214219
val requestHolder = useRequest<TableRequestParams, TableResult<T>>(
215220
requestFn = requestFn,
@@ -236,7 +241,7 @@ fun <T> useTableRequest(
236241
val mergeFullKey = options.mergeCacheKey
237242
val resolveKey: (TableRequestParams) -> String = { params ->
238243
mergeFullKey?.invoke(baseCacheKey, params)
239-
?: "${baseCacheKey}_p${params.page}_s${params.pageSize}"
244+
?: buildTableRequestCacheKey(baseCacheKey, params)
240245
}
241246
val fallbackSetCache = setCache
242247
val fallbackGetCache = getCache
@@ -266,11 +271,11 @@ fun <T> useTableRequest(
266271
// 5. Auto-fetch when pagination/sorting/filtering changes
267272
useEffect(currentPage, currentPageSize, sortingDeps, globalFilterDep, columnFiltersDep) {
268273
val newParams = TableRequestParams(
269-
page = latestPage.current,
270-
pageSize = latestPageSize.current,
271-
sorting = latestSorting.current,
272-
globalFilter = latestGlobalFilter.current,
273-
columnFilters = latestColumnFilters.current
274+
page = currentPage,
275+
pageSize = currentPageSize,
276+
sorting = currentSorting,
277+
globalFilter = currentGlobalFilter,
278+
columnFilters = currentColumnFilters
274279
)
275280
requestParamsState.value = newParams
276281
options.onRequestParams?.invoke(newParams)
@@ -310,7 +315,11 @@ fun <T> useTableRequest(
310315
}
311316

312317
val setColumnFilter: (String, Any?) -> Unit = { columnId, value ->
313-
columnFiltersState.value = columnFiltersState.value + (columnId to value)
318+
columnFiltersState.value = if (value == null) {
319+
columnFiltersState.value - columnId
320+
} else {
321+
columnFiltersState.value + (columnId to value)
322+
}
314323
}
315324

316325
val clearFilters: () -> Unit = {

0 commit comments

Comments
 (0)