Spaces:
Running
Running
| import { useState, useEffect } from 'react' | |
| import { PrimeReactProvider } from 'primereact/api' | |
| import 'primereact/resources/themes/lara-light-cyan/theme.css' | |
| import ModelTable from './components/ModelTable' | |
| import LanguageTable from './components/LanguageTable' | |
| import DatasetTable from './components/DatasetTable' | |
| import WorldMap from './components/WorldMap' | |
| import AutoComplete from './components/AutoComplete' | |
| import LanguagePlot from './components/LanguagePlot' | |
| import { Carousel } from 'primereact/carousel' | |
| function App () { | |
| const [data, setData] = useState(null) | |
| const [loading, setLoading] = useState(true) | |
| const [error, setError] = useState(null) | |
| const [allSuggestions, setAllSuggestions] = useState([]) | |
| const [filters, setFilters] = useState([]) | |
| useEffect(() => { | |
| fetch('/results.json') | |
| .then(response => { | |
| if (!response.ok) { | |
| throw new Error('Network response was not ok') | |
| } | |
| return response.json() | |
| }) | |
| .then(jsonData => { | |
| setData(jsonData) | |
| setLoading(false) | |
| }) | |
| .catch(err => { | |
| setError(err.message) | |
| setLoading(false) | |
| }) | |
| }, []) | |
| useEffect(() => { | |
| if (data) { | |
| const models = data.model_table.map(item => ({ | |
| type: 'Model', | |
| value: item.model, | |
| detail: item.provider, | |
| searchText: item.provider.toLowerCase() + ' ' + item.model.toLowerCase() | |
| })) | |
| const languages = data.language_table.map(item => ({ | |
| type: 'Language', | |
| value: item.autonym, | |
| detail: item.language_name, | |
| searchText: | |
| item.language_name.toLowerCase() + ' ' + item.autonym.toLowerCase() | |
| })) | |
| const datasets = data.dataset_table.map(item => ({ | |
| type: 'Dataset', | |
| value: item.name, | |
| detail: item.tasks, | |
| searchText: | |
| item.author.toLowerCase() + | |
| ' ' + | |
| item.name.toLowerCase() + | |
| ' ' + | |
| item.tasks.map(task => task.toLowerCase()).join(' ') | |
| })) | |
| const allSuggestions = [...models, ...languages, ...datasets] | |
| setAllSuggestions(allSuggestions) | |
| } | |
| }, [data]) | |
| return ( | |
| <PrimeReactProvider> | |
| <div style={{ height: '100%', display: 'flex', flexDirection: 'column' }}> | |
| <header | |
| style={{ | |
| display: 'flex', | |
| flexDirection: 'column', | |
| alignItems: 'center', | |
| justifyContent: 'center', | |
| padding: '5vh 0' | |
| }} | |
| > | |
| <div> | |
| <span | |
| role='img' | |
| aria-label='Globe Emoji' | |
| style={{ fontSize: '70px' }} | |
| > | |
| π | |
| </span> | |
| </div> | |
| <h1 style={{ fontSize: '2.5rem', fontWeight: '700' }}> | |
| Global AI Language Monitor | |
| </h1> | |
| <p style={{ fontSize: '1.15rem', color: '#555', marginTop: '0' }}> | |
| Tracking language proficiency of AI models for every language | |
| </p> | |
| <AutoComplete | |
| allSuggestions={allSuggestions} | |
| onComplete={item => setFilters(prevFilters => [item])} | |
| /> | |
| </header> | |
| <main | |
| style={{ | |
| display: 'flex', | |
| flexDirection: 'row', | |
| flexWrap: 'wrap', | |
| gap: '2rem', | |
| alignItems: 'center', | |
| width: '100%', | |
| height: '100%', | |
| justifyContent: 'center', | |
| paddingBottom: '5vh' | |
| }} | |
| > | |
| {loading && ( | |
| <i className='pi pi-spinner pi-spin' style={{ fontSize: '4rem' }} /> | |
| )} | |
| {error && <p>Error: {error}</p>} | |
| {data && ( | |
| <> | |
| <div | |
| style={{ | |
| flex: '60vw 100vw 40vw', | |
| maxWidth: 'min(100vw, 800px)' | |
| }} | |
| > | |
| <ModelTable data={data} /> | |
| </div> | |
| <div | |
| style={{ | |
| flex: '60vw 100vw 40vw', | |
| maxWidth: 'min(100vw, 800px)' | |
| }} | |
| > | |
| <LanguageTable data={data} /> | |
| </div> | |
| <div | |
| style={{ | |
| flex: '60vw 100vw 40vw', | |
| maxWidth: 'min(100vw, 800px)' | |
| }} | |
| > | |
| <DatasetTable data={data} /> | |
| </div> | |
| <div | |
| id='figure' | |
| style={{ | |
| flex: '100vw 100vw 100vw', | |
| maxWidth: 'min(100vw, 800px)', | |
| alignItems: 'center', | |
| justifyContent: 'center' | |
| }} | |
| > | |
| <Carousel | |
| value={[ | |
| <WorldMap data={data} />, | |
| <LanguagePlot data={data} /> | |
| ]} | |
| numScroll={1} | |
| numVisible={1} | |
| itemTemplate={item => item} | |
| circular | |
| /> | |
| </div> | |
| </> | |
| )} | |
| </main> | |
| </div> | |
| </PrimeReactProvider> | |
| ) | |
| } | |
| export default App | |