@@ -6,7 +6,6 @@ import androidx.compose.runtime.derivedStateOf
66import androidx.compose.runtime.remember
77import xyz.junerver.compose.hooks._useState
88import xyz.junerver.compose.hooks.useEffect
9- import xyz.junerver.compose.hooks.useLatestRef
109import xyz.junerver.compose.hooks.userequest.utils.CachedData
1110import xyz.junerver.compose.hooks.utils.CacheManager
1211import 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