import { Refine } from "@refinedev/core"; import { RefineKbar, RefineKbarProvider } from "@refinedev/kbar"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; import { ErrorComponent } from "@refinedev/antd"; import "@refinedev/antd/dist/reset.css"; import routerBindings, { DocumentTitleHandler, UnsavedChangesNotifier } from "@refinedev/react-router-v6"; import dataProvider from "./components/dataProvider"; import { useTranslation } from "react-i18next"; import { BrowserRouter, Outlet, Route, Routes } from "react-router-dom"; import { ColorModeContextProvider } from "./contexts/color-mode"; import { FileOutlined, HighlightOutlined, HomeOutlined, QuestionOutlined, UserOutlined } from "@ant-design/icons"; import { ConfigProvider } from "antd"; import React from "react"; import { Locale } from "antd/es/locale"; import { languages } from "./i18n"; import loadable from "@loadable/component"; import SpoolmanNotificationProvider from "./components/notificationProvider"; import { SpoolmanLayout } from "./components/layout"; import liveProvider from "./components/liveProvider"; interface ResourcePageProps { resource: "spools" | "filaments" | "vendors"; page: "list" | "create" | "edit" | "show"; mode?: "create" | "clone"; } const LoadableResourcePage = loadable( (props: ResourcePageProps) => import(`./pages/${props.resource}/${props.page}.tsx`), { fallback:
Page is Loading...
, cacheKey: (props: ResourcePageProps) => `${props.resource}-${props.page}-${props.mode ?? ""}`, } ); interface LoadablePageProps { name: string; } const LoadablePage = loadable((props: LoadablePageProps) => import(`./pages/${props.name}/index.tsx`), { fallback:
Page is Loading...
, cacheKey: (props: LoadablePageProps) => `page-${props.name}`, }); function App() { const { t, i18n } = useTranslation(); const i18nProvider = { translate: (key: string, params?: never) => t(key, params), changeLocale: (lang: string) => i18n.changeLanguage(lang), getLocale: () => i18n.language, }; // Fetch the antd locale using dynamic imports const [antdLocale, setAntdLocale] = React.useState(); React.useEffect(() => { const fetchLocale = async () => { const locale = await import( `./../node_modules/antd/es/locale/${languages[i18n.language].fullCode.replace("-", "_")}.js` ); setAntdLocale(locale.default); }; fetchLocale().catch(console.error); }, [i18n.language]); if (!import.meta.env.VITE_APIURL) { return ( <>

Missing API URL

App was built without an API URL. Please set the VITE_APIURL environment variable to the URL of your Spoolman API.

); } return ( , }, }, { name: "spool", list: "/spool", create: "/spool/create", clone: "/spool/clone/:id", edit: "/spool/edit/:id", show: "/spool/show/:id", meta: { canDelete: true, icon: , }, }, { name: "filament", list: "/filament", create: "/filament/create", clone: "/filament/clone/:id", edit: "/filament/edit/:id", show: "/filament/show/:id", meta: { canDelete: true, icon: , }, }, { name: "vendor", list: "/vendor", create: "/vendor/create", clone: "/vendor/clone/:id", edit: "/vendor/edit/:id", show: "/vendor/show/:id", meta: { canDelete: true, icon: , }, }, { name: "help", list: "/help", meta: { canDelete: false, icon: , }, }, ]} options={{ syncWithLocation: true, warnWhenUnsavedChanges: true, disableTelemetry: true, }} > } > } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } /> ); } export default App;