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 {
FileOutlined,
HighlightOutlined,
HomeOutlined,
QuestionOutlined,
TableOutlined,
ToolOutlined,
UserOutlined,
} from "@ant-design/icons";
import loadable from "@loadable/component";
import routerBindings, { DocumentTitleHandler, UnsavedChangesNotifier } from "@refinedev/react-router";
import { ConfigProvider } from "antd";
import { Locale } from "antd/es/locale";
import { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { BrowserRouter, Outlet, Route, Routes } from "react-router";
import dataProvider from "./components/dataProvider";
import { Favicon } from "./components/favicon";
import { SpoolmanLayout } from "./components/layout";
import liveProvider from "./components/liveProvider";
import SpoolmanNotificationProvider from "./components/notificationProvider";
import { ColorModeContextProvider } from "./contexts/color-mode";
import { languages } from "./i18n";
import { getAPIURL, getBasePath } from "./utils/url";
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] = useState();
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: "locations",
list: "/locations",
meta: {
canDelete: false,
icon: ,
},
},
{
name: "settings",
list: "/settings",
meta: {
canDelete: false,
icon: ,
},
},
{
name: "help",
list: "/help",
meta: {
canDelete: false,
icon: ,
},
},
]}
options={{
syncWithLocation: true,
warnWhenUnsavedChanges: true,
disableTelemetry: true,
}}
>
}
>
} />
} />
}
/>
}
/>
} />
} />
} />
} />
}
/>
}
/>
} />
} />
} />
}
/>
}
/>
} />
} />
} />
} />
} />
} />
);
}
export default App;