import {ReactElement, useState, useTransition} from "react" import {AxiosError} from "axios" import {MdSearch} from "react-icons/md" import {useTranslation} from "react-i18next" import {useCopyToClipboard, useKeyPress, useUpdateEffect} from "react-use" import {useQuery} from "@tanstack/react-query" import { Alert, Chip, Divider, Grid, InputAdornment, List, Snackbar, TextField, ToggleButton, } from "@mui/material" import {AliasList, AliasType, PaginationResult} from "~/server-types" import { ALIAS_TYPE_ICON_MAP, ErrorSnack, NoSearchResults, QueryResult, SimplePage, SuccessSnack, } from "~/components" import {useIsAnyInputFocused} from "~/hooks" import {CreateAliasButton} from "~/route-widgets/AliasesRoute/CreateAliasButton" import AliasesListItem from "~/route-widgets/AliasesRoute/AliasesListItem" import EmptyStateScreen from "~/route-widgets/AliasesRoute/EmptyStateScreen" import getAliases from "~/apis/get-aliases" enum SearchFilter { All = "all", Active = "active", Inactive = "inactive", } enum TypeFilter { All = "all", Custom = "custom", Random = "random", } export default function AliasesRoute(): ReactElement { const {t} = useTranslation() const [searchValue, setSearchValue] = useState("") const [queryValue, setQueryValue] = useState("") const [, startTransition] = useTransition() const [showSearch, setShowSearch] = useState(false) const [searchFilter, setSearchFilter] = useState(SearchFilter.All) const [typeFilter, setTypeFilter] = useState(TypeFilter.All) const [{value, error}, copyToClipboard] = useCopyToClipboard() const [isPressingControl] = useKeyPress("Shift") const isAnyInputFocused = useIsAnyInputFocused() const [lockDisabledCopyMode, setLockDisabledCopyMode] = useState(false) const isInCopyAddressMode = !isAnyInputFocused && !lockDisabledCopyMode && isPressingControl const query = useQuery, AxiosError>( ["get_aliases", {queryValue, searchFilter, typeFilter}], () => getAliases({ query: queryValue, active: (() => { switch (searchFilter) { case SearchFilter.All: return undefined case SearchFilter.Active: return true case SearchFilter.Inactive: return false } })(), type: (() => { switch (typeFilter) { case TypeFilter.All: return undefined case TypeFilter.Custom: return AliasType.CUSTOM case TypeFilter.Random: return AliasType.RANDOM } })(), }), { onSuccess: ({items}) => { if (items.length) { setShowSearch(true) setSearchFilter(SearchFilter.All) setTypeFilter(TypeFilter.All) } }, }, ) useUpdateEffect(() => { if (!isPressingControl) { setLockDisabledCopyMode(false) } }, [isPressingControl]) return ( { setSearchValue(event.target.value) startTransition(() => { setQueryValue(event.target.value) }) }} label={t("routes.AliasesRoute.pageActions.search.label")} placeholder={t( "routes.AliasesRoute.pageActions.search.placeholder", )} id="search" InputProps={{ startAdornment: ( ), }} /> setSearchFilter(value => { if (value === SearchFilter.Active) { return SearchFilter.All } return SearchFilter.Active }) } /> setSearchFilter(value => { if (value === SearchFilter.Inactive) { return SearchFilter.All } return SearchFilter.Inactive }) } /> setTypeFilter(value => { if (value === TypeFilter.Custom) { return TypeFilter.All } return TypeFilter.Custom }) } /> setTypeFilter(value => { if (value === TypeFilter.Random) { return TypeFilter.All } return TypeFilter.Random }) } /> ) } > , AxiosError> query={query}> {({items: aliases}) => ( <> {(() => { if (aliases.length === 0) { if ( searchValue === "" && searchFilter === SearchFilter.All && typeFilter === TypeFilter.All ) { return } else { return } } return ( {aliases.map(alias => ( { copyToClipboard(alias) setLockDisabledCopyMode(true) } : undefined } /> ))} ) })()} {t("routes.AliasesRoute.isInCopyMode")} )} ) }