@@ -55,7 +55,13 @@ export function useLogFilterLogic({
55
55
} ) , [ ] ) ;
56
56
57
57
const [ filters , setFilters ] = useState < LogFilterState > ( defaultFilters ) ;
58
- const [ filteredLogs , setFilteredLogs ] = useState < PaginatedResponse > ( logs ) ;
58
+ const [ backendFilteredLogs , setBackendFilteredLogs ] = useState < PaginatedResponse > ( {
59
+ data : [ ] ,
60
+ total : 0 ,
61
+ page : 1 ,
62
+ page_size : 50 ,
63
+ total_pages : 0
64
+ } ) ;
59
65
const lastSearchTimestamp = useRef ( 0 ) ;
60
66
const performSearch = useCallback ( async ( filters : LogFilterState , page = 1 ) => {
61
67
if ( ! accessToken ) return ;
@@ -87,7 +93,7 @@ export function useLogFilterLogic({
87
93
) ;
88
94
89
95
if ( currentTimestamp === lastSearchTimestamp . current && response . data ) {
90
- setFilteredLogs ( response ) ;
96
+ setBackendFilteredLogs ( response ) ;
91
97
}
92
98
} catch ( error ) {
93
99
console . error ( "Error searching users:" , error ) ;
@@ -113,34 +119,36 @@ export function useLogFilterLogic({
113
119
} ) ;
114
120
const allKeyAliases = queryAllKeysQuery . data || [ ]
115
121
116
- // Apply filters to keys whenever logs or filters change
117
- useEffect ( ( ) => {
122
+ // Determine when backend filters are active (server-side filtering)
123
+ const hasBackendFilters = useMemo ( ( ) => (
124
+ ! ! (
125
+ filters [ FILTER_KEYS . KEY_ALIAS ] ||
126
+ filters [ FILTER_KEYS . KEY_HASH ] ||
127
+ filters [ FILTER_KEYS . REQUEST_ID ] ||
128
+ filters [ FILTER_KEYS . USER_ID ] ||
129
+ filters [ FILTER_KEYS . END_USER ]
130
+ )
131
+ ) , [ filters ] ) ;
132
+
133
+ // Compute client-side filtered logs directly from incoming logs and filters
134
+ const clientDerivedFilteredLogs : PaginatedResponse = useMemo ( ( ) => {
118
135
if ( ! logs || ! logs . data ) {
119
- setFilteredLogs ( {
136
+ return {
120
137
data : [ ] ,
121
138
total : 0 ,
122
139
page : 1 ,
123
140
page_size : 50 ,
124
141
total_pages : 0
125
- } ) ;
126
- return ;
142
+ } ;
127
143
}
128
144
129
- // Only do client-side filtering if no backend filters are active
130
- const hasBackendFilters =
131
- filters [ FILTER_KEYS . KEY_ALIAS ] ||
132
- filters [ FILTER_KEYS . KEY_HASH ] ||
133
- filters [ FILTER_KEYS . REQUEST_ID ] ||
134
- filters [ FILTER_KEYS . USER_ID ] ||
135
- filters [ FILTER_KEYS . END_USER ] ;
136
-
145
+ // If backend filters are on, don't perform client-side filtering here
137
146
if ( hasBackendFilters ) {
138
- // Backend is handling filtering, don't override the results
139
- return ;
147
+ return logs ;
140
148
}
141
-
149
+
142
150
let filteredData = [ ...logs . data ] ;
143
-
151
+
144
152
if ( filters [ FILTER_KEYS . TEAM_ID ] ) {
145
153
filteredData = filteredData . filter (
146
154
log => log . team_id === filters [ FILTER_KEYS . TEAM_ID ]
@@ -163,7 +171,7 @@ export function useLogFilterLogic({
163
171
log => log . model === filters [ FILTER_KEYS . MODEL ]
164
172
) ;
165
173
}
166
-
174
+
167
175
if ( filters [ FILTER_KEYS . KEY_HASH ] ) {
168
176
filteredData = filteredData . filter (
169
177
log => log . api_key === filters [ FILTER_KEYS . KEY_HASH ]
@@ -175,21 +183,33 @@ export function useLogFilterLogic({
175
183
log => log . end_user === filters [ FILTER_KEYS . END_USER ]
176
184
) ;
177
185
}
178
-
179
- const newFilteredLogs : PaginatedResponse = {
186
+
187
+ return {
180
188
data : filteredData ,
181
189
total : logs . total ,
182
190
page : logs . page ,
183
191
page_size : logs . page_size ,
184
192
total_pages : logs . total_pages ,
185
193
} ;
186
-
187
- if ( JSON . stringify ( newFilteredLogs ) !== JSON . stringify ( filteredLogs ) ) {
188
- setFilteredLogs ( newFilteredLogs ) ;
189
- }
190
- } , [ logs , filters , filteredLogs , accessToken ] ) ;
194
+ } , [ logs , filters , hasBackendFilters ] ) ;
191
195
192
-
196
+ // Choose which filtered logs to expose: backend result when active, otherwise client-derived
197
+ const filteredLogs : PaginatedResponse = useMemo ( ( ) => {
198
+ if ( hasBackendFilters ) {
199
+ // Prefer backend result if present; otherwise fall back to latest logs
200
+ if ( backendFilteredLogs && backendFilteredLogs . data && backendFilteredLogs . data . length > 0 ) {
201
+ return backendFilteredLogs ;
202
+ }
203
+ return logs || {
204
+ data : [ ] ,
205
+ total : 0 ,
206
+ page : 1 ,
207
+ page_size : 50 ,
208
+ total_pages : 0
209
+ } ;
210
+ }
211
+ return clientDerivedFilteredLogs ;
212
+ } , [ hasBackendFilters , backendFilteredLogs , clientDerivedFilteredLogs , logs ] ) ;
193
213
194
214
// Fetch all teams and users for potential filter dropdowns (optional, can be adapted)
195
215
const { data : allTeams } = useQuery < Team [ ] , Error > ( {
0 commit comments