config.ts 1011 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. import * as api from '@/api'
  2. import build from '@/build'
  3. import deepmerge from 'deepmerge'
  4. import type { ProviderProps } from 'react'
  5. import { createContext, createElement, useEffect, useState } from 'react'
  6. export interface ConfigProps {
  7. defaults: typeof build
  8. path: string
  9. }
  10. export interface ConfigState {
  11. config: typeof build
  12. ready: boolean
  13. }
  14. export const ConfigContext = createContext({} as ConfigState)
  15. export function ConfigProvider({ children, value: params }: ProviderProps<ConfigProps>) {
  16. const [config, setConfig] = useState(build)
  17. const [ready, setReady] = useState(false)
  18. useEffect(() => {
  19. api.request<typeof build>({ host: `//${document.location.host}` }, 'GET', params.path)
  20. .then(res => {
  21. setConfig(deepmerge(build, res))
  22. })
  23. .catch(err => {
  24. console.error(err)
  25. })
  26. .finally(() => {
  27. setReady(true)
  28. })
  29. }, [])
  30. const value = { config, ready }
  31. return createElement(ConfigContext.Provider, { value }, children)
  32. }