import { useNavigate } from '@tanstack/react-router'; import clsx from 'clsx'; import React, { useState } from 'react'; import { defineMessages, useIntl } from 'react-intl'; import AutosuggestAccountInput from '@/components/autosuggest-account-input'; import SvgIcon from '@/components/ui/svg-icon'; import { useAppDispatch } from '@/hooks/use-app-dispatch'; import { selectAccount } from '@/selectors'; const messages = defineMessages({ placeholder: { id: 'search.placeholder', defaultMessage: 'Search' }, clear: { id: 'search.clear', defaultMessage: 'Clear input' }, action: { id: 'search.action', defaultMessage: 'Search for “{query}”' }, }); const SearchInput = React.memo(() => { const [value, setValue] = useState(''); const dispatch = useAppDispatch(); const navigate = useNavigate(); const intl = useIntl(); const handleChange = (event: React.ChangeEvent) => { const { value } = event.target; setValue(value); }; const handleClear = (event: React.MouseEvent) => { setValue(''); }; const handleSubmit = () => { setValue(''); const guessedType = /^(?:\/statuses\/|\/notice\/|\/objects\/|\/@[\w.-]+\/\d+)/.test(value) ? 'statuses' : 'accounts'; navigate({ to: '/search', search: { q: value, type: guessedType } }); }; const handleKeyDown = (event: React.KeyboardEvent) => { if (event.key === 'Enter') { event.preventDefault(); handleSubmit(); } else if (event.key === 'Escape') { document.querySelector('.ui')?.parentElement?.focus(); } }; const handleSelected = (accountId: string) => { setValue(''); dispatch((_, getState) => navigate({ to: '/@{$username}', params: { username: selectAccount(getState(), accountId)!.acct }, }), ); }; const makeMenu = () => [ { text: intl.formatMessage(messages.action, { query: value }), icon: require('@phosphor-icons/core/regular/magnifying-glass.svg'), action: handleSubmit, }, ]; const hasValue = value.length > 0; return (
); }); export { SearchInput as default };