import { AuthUsersSearchSubmittedEvent } from 'common/telemetry-constants' import { Search, X } from 'lucide-react' import { parseAsString, parseAsStringEnum, useQueryState } from 'nuqs' import { Dispatch, forwardRef, SetStateAction } from 'react' import { Button, cn, Select, SelectContent, SelectGroup, SelectItem, SelectSeparator, SelectTrigger, SelectValue, Tooltip, TooltipContent, TooltipTrigger, } from 'ui' import { Input } from 'ui-patterns/DataInputs/Input' import { PHONE_NUMBER_LEFT_PREFIX_REGEX, SpecificFilterColumn, UUIDV4_LEFT_PREFIX_REGEX, } from './Users.constants' import { onSearchInputEscape } from '@/lib/keyboard' import { useTrack } from '@/lib/telemetry/track' const getSearchPlaceholder = (column: SpecificFilterColumn): string => { switch (column) { case 'id': return 'Search by user ID' case 'email': return 'Search by email' case 'name': return 'Search by name' case 'phone': return 'Search by phone' case 'freeform': return 'Search by user ID, email, phone or name' default: return 'Search users...' } } interface UsersSearchProps { search: string setSearch: Dispatch> improvedSearchEnabled?: boolean telemetryProps: Omit onSelectFilterColumn: (value: SpecificFilterColumn) => void } export const UsersSearch = forwardRef(function UsersSearch( { search, setSearch, improvedSearchEnabled = false, telemetryProps, onSelectFilterColumn }, ref ) { const [, setSelectedId] = useQueryState( 'show', parseAsString.withOptions({ history: 'push', clearOnDefault: true }) ) const [, setFilterKeywords] = useQueryState('keywords', { defaultValue: '' }) const [specificFilterColumn] = useQueryState( 'filter', parseAsStringEnum([ 'id', 'email', 'phone', 'name', 'freeform', ]).withDefault('email') ) const track = useTrack() const searchInvalid = !search || specificFilterColumn === 'freeform' || specificFilterColumn === 'email' || specificFilterColumn === 'name' ? false : specificFilterColumn === 'id' ? !search.match(UUIDV4_LEFT_PREFIX_REGEX) : !search.match(PHONE_NUMBER_LEFT_PREFIX_REGEX) const onSubmitSearch = () => { const s = search.trim().toLocaleLowerCase() setFilterKeywords(s) setSelectedId(null) track('auth_users_search_submitted', { trigger: 'search_input', ...telemetryProps, keywords: s, }) } return (
1 && 'pr-6' )} placeholder={getSearchPlaceholder(specificFilterColumn)} value={search} onChange={(e) => setSearch(e.target.value)} onKeyDown={(e) => { if (e.code === 'Enter' || e.code === 'NumpadEnter') { if (!searchInvalid) onSubmitSearch() return } onSearchInputEscape(search, () => { setSearch('') setFilterKeywords('') })(e) }} actions={ search ? (
) })