import ReactDOM from 'react-dom/client' import { QueryClient, QueryClientProvider, queryOptions, useQueries, } from '@tanstack/react-query' import { ReactQueryDevtools } from '@tanstack/react-query-devtools' import { useState } from 'react' import { loadCharacter } from './character-loader' const queryClient = new QueryClient({ defaultOptions: { queries: { retry: 0, }, }, }) const characterQueryOptions = (id: number) => queryOptions({ queryKey: ['character', id], queryFn: () => loadCharacter(id), staleTime: 60 * 1000, }) function Characters({ ids }: { ids: Array }) { const characters = useQueries({ queries: ids.map((id) => characterQueryOptions(id)), }) return characters.map((character, index) => { if (character.status === 'pending') { return 'Loading...' } if (character.status === 'error') { return 'Error...' } if (character.data === null) { return 'Not found ...' } return (
{character.data.image}
{character.data.name} (#{character.data.id})

Status: {character.status}

Species: {character.data.species}

Gender: {character.data.gender}

) }) } function App() { const [ids, setIds] = useState>([]) const [idsToLoad, setIdsToLoad] = useState>([]) const [error, setError] = useState('') return (

Character fetcher

{ const text = event.target.value.replace(' ', '') const ids = text.split(',').map((id) => parseInt(id, 10)) const allValid = ids.reduce( (valid, id) => valid && !isNaN(id), true, ) if (allValid) { setIds(ids) setError('') } else { setError('Invalid.. only use numbers and comma') } }} />
{error ?

{error}

: null}

Characters:

) } function Root() { return ( ) } const rootElement = document.getElementById('root') if (!rootElement) throw new Error('Missing #root element') ReactDOM.createRoot(rootElement).render()