import { NextPage } from "next"; import { AppProps } from "next/app"; import { ReactElement, ReactNode, useEffect, useState, useLayoutEffect, } from "react"; import { QueryCache, QueryClient, QueryClientProvider, AmplitudeCtx, ReactQueryDevtools, useInstillStore, useCreateResourceFormStore, } from "@instill-ai/toolkit"; import "../styles/global.css"; import "../styles/github-markdown.css"; import "@instill-ai/design-system/dist/index.css"; import "@instill-ai/design-tokens/dist/theme/root.css"; import "@instill-ai/design-tokens/dist/theme/light.css"; import "@instill-ai/design-tokens/dist/theme/dark.css"; import "reactflow/dist/style.css"; import { useRouter } from "next/router"; import { ErrorBoundary } from "../components"; import { Toaster, useToast } from "@instill-ai/design-system"; export const queryCache = new QueryCache(); export const queryClient = new QueryClient({ queryCache }); /* eslint-disable-next-line @typescript-eslint/ban-types */ export type NextPageWithLayout
= NextPage
& {
getLayout?: (page: ReactElement) => ReactNode;
};
type AppPropsWithLayout = AppProps & {
Component: NextPageWithLayout;
};
function MyApp({ Component, pageProps }: AppPropsWithLayout) {
const getLayout = Component.getLayout ?? ((page) => page);
const [amplitudeIsInit, setAmplitudeIsInit] = useState(false);
const [previousURL, setPreviousUrl] = useState("");
const router = useRouter();
const initPipelineBuilder = useInstillStore(
(state) => state.initPipelineBuilder
);
const initCreateResourceFormStore = useCreateResourceFormStore(
(state) => state.init
);
const { dismiss: dismissToast } = useToast();
function isPipelineDetailPage(path: string) {
if (path.split("/")[2] === "pipelines" && path.split("/")[3]) {
return true;
}
return false;
}
useEffect(() => {
if (typeof window === "undefined") return;
function onRouteChange() {
// We will only init the pipeline builder when user is previously on the
// pipeline builder page
if (
isPipelineDetailPage(previousURL) &&
!isPipelineDetailPage(window.history.state.url)
) {
initPipelineBuilder();
}
dismissToast();
setPreviousUrl(window.history.state.url);
initCreateResourceFormStore();
}
router.events.on("routeChangeComplete", onRouteChange);
return () => {
router.events.off("routeChangeComplete", onRouteChange);
};
}, [
router.events,
initPipelineBuilder,
dismissToast,
previousURL,
initCreateResourceFormStore,
]);
return (