feat(directory): fetch optimization

This commit is contained in:
Haoyu Xu
2023-03-02 17:50:14 -05:00
parent b06d78b77e
commit 62c7e2b956
4 changed files with 42 additions and 25 deletions

View File

@@ -215,7 +215,7 @@
opacity: 0.3; opacity: 0.3;
} }
@media (max-width: 1024px) { @media (max-width: 1280px) {
.operator .spine-container { .operator .spine-container {
width: 100%; width: 100%;
position: relative; position: relative;

View File

@@ -18,6 +18,7 @@ import {
useI18n, useI18n,
useLanguage, useLanguage,
} from '@/state/language' } from '@/state/language'
import { useBackgrounds } from '@/state/background';
import Dropdown from '@/component/dropdown'; import Dropdown from '@/component/dropdown';
import Popup from '@/component/popup'; import Popup from '@/component/popup';
import ReturnButton from '@/component/return_button'; import ReturnButton from '@/component/return_button';
@@ -34,11 +35,12 @@ export default function Root(props) {
appbarExtraArea, appbarExtraArea,
headerIcon headerIcon
} = useHeader() } = useHeader()
const { version } = useConfig() const { version, fetchConfig, fetchVersion } = useConfig()
const [drawerDestinations, setDrawerDestinations] = useState(null) const [drawerDestinations, setDrawerDestinations] = useState(null)
const currentYear = useMemo(() => new Date().getFullYear(), []) const currentYear = useMemo(() => new Date().getFullYear(), [])
const [headerTabs, setHeaderTabs] = useState(null) const [headerTabs, setHeaderTabs] = useState(null)
const { i18n } = useI18n() const { i18n } = useI18n()
const { fetchBackgrounds } = useBackgrounds()
const renderHeaderTabs = (tabs) => { const renderHeaderTabs = (tabs) => {
setHeaderTabs(tabs?.map((item) => { setHeaderTabs(tabs?.map((item) => {
@@ -120,6 +122,12 @@ export default function Root(props) {
} }
}, [tabs]) }, [tabs])
useEffect(() => {
fetchConfig()
fetchVersion()
fetchBackgrounds()
}, [])
return ( return (
<> <>
<header className='header'> <header className='header'>
@@ -209,6 +217,8 @@ function LanguageDropdown() {
const { language, setLanguage } = useLanguage() const { language, setLanguage } = useLanguage()
const { i18n, i18nValues } = useI18n() const { i18n, i18nValues } = useI18n()
return ( return (
<Dropdown <Dropdown
text={i18n(language)} text={i18n(language)}

View File

@@ -1,4 +1,4 @@
import { useEffect } from 'react'; import { useCallback } from 'react';
import { atom, useAtom } from 'jotai'; import { atom, useAtom } from 'jotai';
const fetcher = (...args) => fetch(...args).then(res => res.json()) const fetcher = (...args) => fetch(...args).then(res => res.json())
@@ -9,12 +9,17 @@ export function useBackgrounds() {
const [backgrounds, setBackgrounds] = useAtom(backgroundsAtom); const [backgrounds, setBackgrounds] = useAtom(backgroundsAtom);
const [currentBackground, setCurrentBackground] = useAtom(currentBackgroundAtom) const [currentBackground, setCurrentBackground] = useAtom(currentBackgroundAtom)
useEffect(() => { const fetchBackgrounds = useCallback(async () => {
fetcher('/_assets/backgrounds.json').then(data => { const res = await fetch('/_assets/backgrounds.json')
setBackgrounds(data) const data = await res.json()
setCurrentBackground(data[0]) setBackgrounds(data)
}) setCurrentBackground(data[0])
}, []); }, [])
return { backgrounds, currentBackground, setCurrentBackground }; return {
backgrounds,
currentBackground,
setCurrentBackground,
fetchBackgrounds
};
} }

View File

@@ -1,7 +1,6 @@
import { useEffect } from 'react'; import { useCallback } from 'react';
import { atom, useAtom } from 'jotai'; import { atom, useAtom } from 'jotai';
const fetcher = (...args) => fetch(...args).then(res => res.json())
const configAtom = atom([]); const configAtom = atom([]);
const operatorsAtom = atom([]); const operatorsAtom = atom([]);
const versionAtom = atom({}); const versionAtom = atom({});
@@ -11,19 +10,22 @@ export function useConfig() {
const [version, setVersion] = useAtom(versionAtom); const [version, setVersion] = useAtom(versionAtom);
const [operators, setOperators] = useAtom(operatorsAtom); const [operators, setOperators] = useAtom(operatorsAtom);
useEffect(() => { const fetchConfig = useCallback(async () => {
fetcher('/_assets/directory.json').then(data => { const res = await fetch('/_assets/directory.json')
setConfig(data); const data = await res.json()
let operatorsList = [] setConfig(data);
data.operators.forEach((item) => { let operatorsList = []
operatorsList = [...operatorsList, ...item] data.operators.forEach((item) => {
}) operatorsList = [...operatorsList, ...item]
setOperators(operatorsList)
}) })
fetcher('/_assets/version.json').then(data => { setOperators(operatorsList)
setVersion(data); }, [])
})
}, []);
return { config, version, operators }; const fetchVersion = useCallback(async () => {
const res = await fetch('/_assets/version.json')
const data = await res.json()
setVersion(data);
}, [])
return { config, version, operators, fetchConfig, fetchVersion };
} }