// // Copyright 2020 DXOS.org // import React, { useContext, useState } from 'react'; import Autocomplete from '@material-ui/lab/Autocomplete'; import TextField from '@material-ui/core/TextField'; import { makeStyles } from '@material-ui/core'; import { useQuery } from '@apollo/react-hooks'; import Json from '../../../components/Json'; import { ConsoleContext, useQueryStatusReducer, useRegistry } from '../../../hooks'; import WNS_RECORDS from '../../../gql/wns_records.graphql'; import ButtonGroup from '@material-ui/core/ButtonGroup'; import Button from '@material-ui/core/Button'; const useStyles = makeStyles(theme => ({ root: { display: 'flex', flexDirection: 'column', flex: 1 }, search: { display: 'flex', padding: '2px 8px' }, button: { marginLeft: theme.spacing(2) }, selected: { color: theme.palette.text.primary } })); const types = [ { key: 'authority', label: 'Authority' }, { key: 'wrn', label: 'WRN' } ]; export const LookupType = ({ scope = types[0].key, onChange }) => { const classes = useStyles(); return ( {types.map(t => ( ))} ); }; LookupType.default = types[0].key; const RegistryLookup = ({ scope }) => { const classes = useStyles(); const { config } = useContext(ConsoleContext); const { registry } = useRegistry(config); const [result, setResult] = useState({}); const [inputValue, setInputValue] = useState(''); const data = useQueryStatusReducer(useQuery(WNS_RECORDS, { pollInterval: config.api.intervalQuery })); if (!data) { return null; } const records = JSON.parse(data.wns_records.json); const getNames = () => { let ret; switch (scope) { case 'wrn': { ret = []; records.forEach(item => ret.push(...item.names)); break; } case 'authority': { // Use the known names to come up with a default list of authorities. // TODO(telackey): Should we be able to query WNS for a list of authorities? const names = new Set(); for (const record of records) { for (const name of record.names) { // TODO(telackey): We need a general purpose WRN handling library. names.add(name.replace('wrn://', '').split('/')[0]); } } ret = Array.from(names.values()); break; } } ret.sort(); return ret; }; const handleSubmit = async (newInputValue = inputValue) => { if (!newInputValue) { setResult(''); return; } let result; switch (scope) { case 'wrn': result = await registry.lookupNames([newInputValue], true); break; case 'authority': result = await registry.lookupAuthorities([newInputValue]); break; } setResult(result); }; return (
} onInputChange={async (event, newInputValue) => { setInputValue(newInputValue); await handleSubmit(newInputValue); }} />
); }; export default RegistryLookup;