App.tsx 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. // src/App.tsx
  2. import { App as AntdApp, ConfigProvider, theme } from "antd";
  3. import { Suspense, useEffect, useState } from "react";
  4. import { IntlProvider } from "react-intl";
  5. import { Provider, useSelector } from "react-redux";
  6. import Router from "./Router";
  7. import store from "./store";
  8. import { detect as detect_locale, messages as get_messages } from "./locales";
  9. import Loading from "./components/loading/Loading";
  10. import onLoad from "./load";
  11. import { mode as _mode } from "./reducers/theme";
  12. onLoad();
  13. const locale = detect_locale();
  14. const messages = get_messages(locale);
  15. const prefersDark = window.matchMedia("(prefers-color-scheme: dark)");
  16. const ThemedApp = () => {
  17. const themeMode = useSelector(_mode);
  18. const [systemIsDark, setSystemIsDark] = useState(prefersDark.matches);
  19. useEffect(() => {
  20. localStorage.setItem("theme/mode", themeMode);
  21. }, [themeMode]);
  22. useEffect(() => {
  23. const handler = (e: MediaQueryListEvent) => setSystemIsDark(e.matches);
  24. prefersDark.addEventListener("change", handler);
  25. return () => prefersDark.removeEventListener("change", handler);
  26. }, []);
  27. const isDark =
  28. themeMode === "dark" || (themeMode === "system" && systemIsDark);
  29. return (
  30. <ConfigProvider
  31. theme={{
  32. algorithm: isDark ? theme.darkAlgorithm : theme.defaultAlgorithm,
  33. token: {
  34. colorPrimary: "#1677ff",
  35. borderRadius: 6,
  36. },
  37. components: {
  38. Menu: {
  39. collapsedWidth: 40,
  40. },
  41. },
  42. }}
  43. >
  44. <AntdApp>
  45. <Router />
  46. </AntdApp>
  47. </ConfigProvider>
  48. );
  49. };
  50. const Widget = () => {
  51. return (
  52. <IntlProvider locale={locale} messages={messages}>
  53. <Suspense fallback={<Loading />}>
  54. <Provider store={store}>
  55. <ThemedApp />
  56. </Provider>
  57. </Suspense>
  58. </IntlProvider>
  59. );
  60. };
  61. export default Widget;