blob: c1678b59b55b08e9e747fb3631c4e3d40b7a3927 [file] [log] [blame]
simon07b4eb02022-09-29 17:50:26 -04001import { SearchRounded } from '@mui/icons-material';
2import { InputAdornment, TextField } from '@mui/material';
simond47ef9e2022-09-28 22:24:28 -04003import { useEffect, useState } from 'react';
4import usePromise from 'react-fetch-hook/usePromise';
simon07b4eb02022-09-29 17:50:26 -04005
simond47ef9e2022-09-28 22:24:28 -04006import authManager from '../AuthManager';
Adrien Béraud88a52442021-04-26 12:11:41 -04007
simond47ef9e2022-09-28 22:24:28 -04008const isInputValid = (input) => input && input.length > 2;
Adrien Béraud88a52442021-04-26 12:11:41 -04009
simon80b7b3b2022-09-28 17:50:10 -040010export default function UsernameChooser({ setName, ...props }) {
simond47ef9e2022-09-28 22:24:28 -040011 const [query, setQuery] = useState('');
Adrien Béraud88a52442021-04-26 12:11:41 -040012
simond47ef9e2022-09-28 22:24:28 -040013 const { isLoading, data, error } = usePromise(
14 () =>
15 isInputValid(query)
16 ? authManager.fetch(`/api/ns/name/${query}`).then((res) => {
17 if (res.status === 200) return res.json();
18 else throw res.status;
19 })
20 : new Promise((res, rej) => rej(400)),
21 [query]
22 );
Adrien Béraud88a52442021-04-26 12:11:41 -040023
24 useEffect(() => {
25 if (!isLoading) {
simon80b7b3b2022-09-28 17:50:10 -040026 if (error === 404) setName(query);
27 else setName('');
Adrien Béraud88a52442021-04-26 12:11:41 -040028 }
simon80b7b3b2022-09-28 17:50:10 -040029 }, [setName, query, isLoading, data, error]);
Adrien Béraud88a52442021-04-26 12:11:41 -040030
simond47ef9e2022-09-28 22:24:28 -040031 const handleChange = (event) => setQuery(event.target.value);
Adrien Béraud88a52442021-04-26 12:11:41 -040032
33 return (
simond47ef9e2022-09-28 22:24:28 -040034 <TextField
35 className="main-search-input"
36 type="search"
37 placeholder="Register a unique name"
38 error={!error}
39 label={
40 isLoading
41 ? 'Searching...'
42 : error && error !== 400
43 ? 'This name is available'
44 : data && data.address
45 ? 'This name is not available'
46 : ''
47 }
48 value={query}
49 disabled={props.disabled}
50 onChange={handleChange}
51 InputProps={{
52 startAdornment: (
53 <InputAdornment position="start">
54 <SearchRounded />
55 </InputAdornment>
56 ),
57 }}
58 />
59 );
Adrien Béraud88a52442021-04-26 12:11:41 -040060}