w-aura/src/initialization/index.tsx
Daniil Chemerkin 71d13741a7 develop
2025-02-10 21:23:28 +00:00

75 lines
2.4 KiB
TypeScript

import { useApi } from "@/api";
import { useAuth } from "@/auth/useAuth";
import { actions } from "@/store";
import { useEffect, useState } from "react";
import { useDispatch } from "react-redux";
import { useLocation, useSearchParams } from "react-router-dom";
interface InitializationProviderProps {
children: React.ReactNode;
}
export function InitializationProvider({ children }: InitializationProviderProps) {
const location = useLocation();
const [isInitialized, setIsInitialized] = useState(false);
const [searchParams] = useSearchParams();
const jwtToken = searchParams.get("token");
const api = useApi();
const { signUp, logout, token, user } = useAuth();
const dispatch = useDispatch();
useEffect(() => {
const initialize = async () => {
if (!jwtToken) {
setIsInitialized(true);
return;
}
try {
logout();
const { token } = await api.getRealToken({ token: jwtToken });
const { user } = await api.getUser({ token });
const { user: userMe } = await api.getMe({ token });
signUp(token, user, userMe);
} catch (error) {
console.log("Error of get real token or get user: ");
console.error(error);
} finally {
setIsInitialized(true);
}
};
initialize();
}, [api, jwtToken, logout, signUp]);
useEffect(() => {
(async () => {
if (!token.length || !user) return;
const {
user: { has_subscription },
} = await api.getSubscriptionStatus({
token,
});
const { subscription: subscriptionStatusNew } =
await api.getSubscriptionStatusNew({ token });
if ((has_subscription || subscriptionStatusNew) && user) {
return dispatch(actions.status.update("subscribed"));
}
if (!has_subscription && !subscriptionStatusNew && user) {
return dispatch(actions.status.update("unsubscribed"));
}
if (!user) {
return dispatch(actions.status.update("lead"));
}
})();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [dispatch, api, token, location.pathname]);
if (!isInitialized) {
return null;
}
return <>{children}</>;
}