fix and update

This commit is contained in:
lendry
2026-06-30 16:42:48 +03:00
parent 2eeb928a72
commit 31251be877
4 changed files with 113 additions and 97 deletions

View File

@@ -18,11 +18,6 @@ export function AppBootstrapScreen({
<p className="mt-2 max-w-sm text-center text-sm text-[#667085]">
Сервер авторизации временно недоступен. Обычно помогает повтор через несколько секунд.
</p>
{onRetry ? (
<Button className="mt-6 rounded-xl" onClick={onRetry}>
Повторить подключение
</Button>
) : null}
</>
) : (
<>
@@ -33,6 +28,11 @@ export function AppBootstrapScreen({
</p>
</>
)}
{onRetry ? (
<Button className="mt-6 rounded-xl" variant={error ? 'default' : 'secondary'} onClick={onRetry}>
Повторить подключение
</Button>
) : null}
</div>
);
}

View File

@@ -200,7 +200,7 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
setIsApiReady(false);
try {
await waitForStableGateway(3);
await waitForStableGateway(1);
const session = await fetchAuthSession(accessToken);
applySessionState(session, { setUser, setToken, activatePinLock, clearPinLock });
initialBootstrapDoneRef.current = true;
@@ -287,7 +287,7 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
for (let bootstrapAttempt = 0; bootstrapAttempt < 4; bootstrapAttempt += 1) {
try {
if (isInitialBootstrap) {
await waitForStableGateway(3);
await waitForStableGateway(1);
}
if (currentToken) {
@@ -343,11 +343,9 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
} catch (error) {
if (isGatewayUnavailableError(error) && isInitialBootstrap && bootstrapAttempt + 1 < 4) {
invalidateApiGatewayReady();
if (bootstrapAttempt >= 1) {
setBootstrapError(
'Не удалось подключиться к серверу API (502). Подождите несколько секунд и нажмите «Повторить».'
);
}
setBootstrapError(
'Не удалось подключиться к серверу API (502). Подождите несколько секунд и нажмите «Повторить».'
);
await new Promise((resolve) => setTimeout(resolve, 1200));
continue;
}
@@ -372,6 +370,7 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
setBootstrapError('Не удалось подключиться к серверу API. Подождите несколько секунд и нажмите «Повторить».');
setIsApiReady(false);
setIsSessionReady(false);
setIsLoading(false);
return;
}
if (message) showToast(message);
@@ -632,6 +631,16 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
Boolean(hasStoredSession || token) &&
(isLoading || !isApiReady || !isSessionReady);
React.useEffect(() => {
if (!isBootstrapping || bootstrapError) return;
const timer = window.setTimeout(() => {
setBootstrapError(
'Сервер API не отвечает. Если недавно перезапускали контейнеры — подождите 1020 секунд и нажмите «Повторить».'
);
}, 18000);
return () => window.clearTimeout(timer);
}, [bootstrapError, isBootstrapping]);
return (
<AuthContext.Provider
value={{
@@ -661,16 +670,15 @@ export function AuthProvider({ children }: { children: React.ReactNode }) {
{isBootstrapping ? (
<AppBootstrapScreen
error={bootstrapError}
onRetry={
bootstrapError
? () => {
setBootstrapError(null);
initialBootstrapDoneRef.current = false;
invalidateApiGatewayReady();
void refreshProfile();
}
: undefined
}
onRetry={() => {
setBootstrapError(null);
initialBootstrapDoneRef.current = false;
invalidateApiGatewayReady();
setIsLoading(true);
setIsApiReady(false);
setIsSessionReady(false);
void refreshProfile();
}}
/>
) : (
children