mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-30 02:23:47 +00:00
fix: handle unmounted SDK components gracefully
This commit is contained in:
@@ -75,23 +75,11 @@ export function initTelegramSDK() {
|
|||||||
initCleanup = init();
|
initCleanup = init();
|
||||||
sdkInitialized = true;
|
sdkInitialized = true;
|
||||||
|
|
||||||
// Mount viewport and bind CSS variables
|
// Mount mini app and call ready (sync)
|
||||||
viewport
|
|
||||||
.mount()
|
|
||||||
.then(() => {
|
|
||||||
viewport.bindCssVars();
|
|
||||||
// Expand the mini app
|
|
||||||
viewport.expand();
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
console.warn('Viewport mount failed:', err);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Mount mini app and call ready
|
|
||||||
miniApp.mount();
|
miniApp.mount();
|
||||||
miniApp.ready();
|
miniApp.ready();
|
||||||
|
|
||||||
// Mount theme params and bind CSS variables
|
// Mount theme params and bind CSS variables (sync)
|
||||||
try {
|
try {
|
||||||
themeParams.mount();
|
themeParams.mount();
|
||||||
themeParams.bindCssVars();
|
themeParams.bindCssVars();
|
||||||
@@ -99,25 +87,38 @@ export function initTelegramSDK() {
|
|||||||
// Theme params may already be mounted or not supported
|
// Theme params may already be mounted or not supported
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable vertical swipes if supported
|
// Disable vertical swipes if supported (sync)
|
||||||
if (swipeBehavior.isSupported()) {
|
if (swipeBehavior.isSupported()) {
|
||||||
swipeBehavior.mount();
|
swipeBehavior.mount();
|
||||||
swipeBehavior.disableVertical();
|
swipeBehavior.disableVertical();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Mount viewport and bind CSS variables (async)
|
||||||
|
viewport
|
||||||
|
.mount()
|
||||||
|
.then(() => {
|
||||||
|
viewport.bindCssVars();
|
||||||
|
// Expand the mini app
|
||||||
|
viewport.expand();
|
||||||
|
|
||||||
// Auto-enter fullscreen if enabled in settings (mobile only)
|
// Auto-enter fullscreen if enabled in settings (mobile only)
|
||||||
const fullscreenEnabled = getCachedFullscreenEnabled();
|
const fullscreenEnabled = getCachedFullscreenEnabled();
|
||||||
if (fullscreenEnabled && isTelegramMobile()) {
|
if (fullscreenEnabled && isTelegramMobile()) {
|
||||||
// Wait for viewport to be mounted
|
try {
|
||||||
setTimeout(() => {
|
|
||||||
const isFullscreen = viewport.isFullscreen();
|
const isFullscreen = viewport.isFullscreen();
|
||||||
if (!isFullscreen) {
|
if (!isFullscreen) {
|
||||||
viewport.requestFullscreen().catch((e) => {
|
viewport.requestFullscreen().catch((e) => {
|
||||||
console.warn('Auto-fullscreen failed:', e);
|
console.warn('Auto-fullscreen failed:', e);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}, 100);
|
} catch {
|
||||||
|
// Viewport signal not available
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.warn('Viewport mount failed:', err);
|
||||||
|
});
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.warn('Telegram SDK initialization failed:', e);
|
console.warn('Telegram SDK initialization failed:', e);
|
||||||
}
|
}
|
||||||
@@ -153,6 +154,7 @@ const defaultInsets = { top: 0, bottom: 0, left: 0, right: 0 };
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper to subscribe to SDK signals using useSyncExternalStore pattern
|
* Helper to subscribe to SDK signals using useSyncExternalStore pattern
|
||||||
|
* Safely handles unmounted components by returning default values
|
||||||
*/
|
*/
|
||||||
function useSDKSignal<T>(
|
function useSDKSignal<T>(
|
||||||
signal: { (): T; sub(fn: VoidFunction): VoidFunction } | null,
|
signal: { (): T; sub(fn: VoidFunction): VoidFunction } | null,
|
||||||
@@ -161,9 +163,22 @@ function useSDKSignal<T>(
|
|||||||
return useSyncExternalStore(
|
return useSyncExternalStore(
|
||||||
(callback) => {
|
(callback) => {
|
||||||
if (!signal) return () => {};
|
if (!signal) return () => {};
|
||||||
|
try {
|
||||||
return signal.sub(callback);
|
return signal.sub(callback);
|
||||||
|
} catch {
|
||||||
|
// Signal not available (component unmounted)
|
||||||
|
return () => {};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
() => {
|
||||||
|
if (!signal) return defaultValue;
|
||||||
|
try {
|
||||||
|
return signal();
|
||||||
|
} catch {
|
||||||
|
// Signal not available (component unmounted)
|
||||||
|
return defaultValue;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
() => (signal ? signal() : defaultValue),
|
|
||||||
() => defaultValue,
|
() => defaultValue,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,8 +65,12 @@ function createBackButtonController(): BackButtonController {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
get isVisible() {
|
get isVisible() {
|
||||||
if (!inTelegram) return false;
|
if (!inTelegram || !mounted) return false;
|
||||||
|
try {
|
||||||
return backButton.isVisible();
|
return backButton.isVisible();
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
show(onClick: () => void) {
|
show(onClick: () => void) {
|
||||||
@@ -115,8 +119,12 @@ function createMainButtonController(): MainButtonController {
|
|||||||
|
|
||||||
return {
|
return {
|
||||||
get isVisible() {
|
get isVisible() {
|
||||||
if (!inTelegram) return false;
|
if (!inTelegram || !mounted) return false;
|
||||||
|
try {
|
||||||
return mainButton.isVisible();
|
return mainButton.isVisible();
|
||||||
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
show(config: MainButtonConfig) {
|
show(config: MainButtonConfig) {
|
||||||
@@ -301,6 +309,7 @@ function createThemeController(): ThemeController {
|
|||||||
getThemeParams() {
|
getThemeParams() {
|
||||||
if (!inTelegram) return null;
|
if (!inTelegram) return null;
|
||||||
ensureMounted();
|
ensureMounted();
|
||||||
|
try {
|
||||||
const state = themeParams.state();
|
const state = themeParams.state();
|
||||||
// Convert SDK format to our format
|
// Convert SDK format to our format
|
||||||
return {
|
return {
|
||||||
@@ -319,6 +328,9 @@ function createThemeController(): ThemeController {
|
|||||||
subtitle_text_color: state.subtitleTextColor,
|
subtitle_text_color: state.subtitleTextColor,
|
||||||
destructive_text_color: state.destructiveTextColor,
|
destructive_text_color: state.destructiveTextColor,
|
||||||
};
|
};
|
||||||
|
} catch {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user