Skip to content

Commit 8eb5e23

Browse files
waleedlatif1claude
andcommitted
fix(admin): replace live search with explicit search button
- Split searchInput (controlled input) from searchQuery (committed value) so the hook only fires on Search click or Enter, not every keystroke - Gate table render on searchQuery.length > 0 to prevent stale results showing after input is cleared Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 83fc33a commit 8eb5e23

File tree

1 file changed

+18
-9
lines changed
  • apps/sim/app/workspace/[workspaceId]/settings/components/admin

1 file changed

+18
-9
lines changed

apps/sim/app/workspace/[workspaceId]/settings/components/admin/admin.tsx

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export function Admin() {
3131

3232
const [workflowId, setWorkflowId] = useState('')
3333
const [usersOffset, setUsersOffset] = useState(0)
34+
const [searchInput, setSearchInput] = useState('')
3435
const [searchQuery, setSearchQuery] = useState('')
3536
const [banUserId, setBanUserId] = useState<string | null>(null)
3637
const [banReason, setBanReason] = useState('')
@@ -41,6 +42,11 @@ export function Admin() {
4142
error: usersError,
4243
} = useAdminUsers(usersOffset, PAGE_SIZE, searchQuery)
4344

45+
const handleSearch = () => {
46+
setUsersOffset(0)
47+
setSearchQuery(searchInput.trim())
48+
}
49+
4450
const totalPages = useMemo(
4551
() => Math.ceil((usersData?.total ?? 0) / PAGE_SIZE),
4652
[usersData?.total]
@@ -128,14 +134,17 @@ export function Admin() {
128134

129135
<div className='flex flex-col gap-[12px]'>
130136
<p className='font-medium text-[14px] text-[var(--text-primary)]'>User Management</p>
131-
<EmcnInput
132-
value={searchQuery}
133-
onChange={(e) => {
134-
setSearchQuery(e.target.value)
135-
setUsersOffset(0)
136-
}}
137-
placeholder='Search by email or paste a user ID...'
138-
/>
137+
<div className='flex gap-[8px]'>
138+
<EmcnInput
139+
value={searchInput}
140+
onChange={(e) => setSearchInput(e.target.value)}
141+
onKeyDown={(e) => e.key === 'Enter' && handleSearch()}
142+
placeholder='Search by email or paste a user ID...'
143+
/>
144+
<Button variant='primary' onClick={handleSearch} disabled={usersLoading}>
145+
{usersLoading ? 'Searching...' : 'Search'}
146+
</Button>
147+
</div>
139148

140149
{usersError && (
141150
<p className='text-[13px] text-[var(--text-error)]'>
@@ -158,7 +167,7 @@ export function Admin() {
158167
</div>
159168
)}
160169

161-
{usersData && (
170+
{searchQuery.length > 0 && usersData && (
162171
<>
163172
<div className='flex flex-col gap-[2px]'>
164173
<div className='flex items-center gap-[12px] border-[var(--border-secondary)] border-b px-[12px] py-[8px] text-[12px] text-[var(--text-tertiary)]'>

0 commit comments

Comments
 (0)