import React, { useEffect, useState } from "react";
import ComposeComponents from "~/lib/react/ComposeComponents";
import { ApolloProvider } from "@apollo/client";
import createApolloClient from "~/network/apollo";
// import createAxios from "~/network/axios";
import createKy from "~/network/ky";
import network from "~/network";
import env from "~/env";
import Loader from "~/components/Loader";
import * as store from "~/stores";
import getRetryMaxAttempts from "./getRetryMaxAttemps";
import { createLogger } from "~/lib/logger";
import { NETWORK_SCOPES } from "~/lib/logger/scopes";
const { useNetworkState, networkActions } = store;
const networkProvidersLogger = createLogger({
module: NETWORK_SCOPES.APOLLO,
feature: "NetworkProviders",
});
const initializeNewApolloClient = (reload) => {
if (reload) {
const { apolloClient } = network;
apolloClient.stop();
apolloClient.clearStore();
}
network.apolloClient = createApolloClient({
store,
GRAPHQL_URL: env.GRAPHQL_URL,
GRAPHQL_WS_URL: env.GRAPHQL_WS_URL,
getRetryMaxAttempts,
});
};
initializeNewApolloClient();
// const oaFilesAxios = createAxios({ baseURL: env.OA_FILES_URL });
// network.oaFilesAxios = oaFilesAxios;
const oaFilesKy = createKy({ prefixUrl: env.OA_FILES_URL + "/" }, { store });
network.oaFilesKy = oaFilesKy;
export default function NetworkProviders({ children }) {
const [key, setKey] = useState(0);
const networkState = useNetworkState(["initialized", "triggerReload"]);
useEffect(() => {
if (networkState.triggerReload) {
networkProvidersLogger.debug("Network triggerReload received", {
reloadId: store.getAuthState()?.reloadId,
hasUserToken: !!store.getAuthState()?.userToken,
});
initializeNewApolloClient(true);
setKey((prevKey) => prevKey + 1);
}
}, [networkState.triggerReload]);
useEffect(() => {
if (key > 0) {
networkProvidersLogger.debug("Network reloaded", {
reloadId: store.getAuthState()?.reloadId,
hasUserToken: !!store.getAuthState()?.userToken,
});
networkActions.onReload();
}
}, [key]);
if (!networkState.initialized) {
return ;
}
const providers = [[ApolloProvider, { client: network.apolloClient }]];
return (
{children}
);
}