diff --git a/src/components/TelegramLoginButton.tsx b/src/components/TelegramLoginButton.tsx index 54aa648c6..f1ed488cb 100644 --- a/src/components/TelegramLoginButton.tsx +++ b/src/components/TelegramLoginButton.tsx @@ -175,7 +175,7 @@ const TelegramLoginButton = ({ } const exchangeData = await exchangeResponse.json(); - const { sessionToken, user } = exchangeData.data; + const { sessionToken } = exchangeData.data; if (!sessionToken) { throw new Error('No JWT token received from server'); @@ -183,11 +183,6 @@ const TelegramLoginButton = ({ // Store JWT token in store (this is the JWT from the backend) dispatch(setToken(sessionToken)); - - // Store user data in localStorage for backward compatibility - if (user) { - localStorage.setItem('user', JSON.stringify(user)); - } // Call onSuccess callback if provided, otherwise navigate to onboarding if (onSuccess) { diff --git a/src/store/authSlice.ts b/src/store/authSlice.ts index 10b4e4bd5..17e9e6c5f 100644 --- a/src/store/authSlice.ts +++ b/src/store/authSlice.ts @@ -8,28 +8,15 @@ const initialState: AuthState = { token: null, }; -// Initialize from localStorage for backward compatibility -if (typeof window !== 'undefined') { - const legacyToken = localStorage.getItem('sessionToken'); - if (legacyToken) { - initialState.token = legacyToken; - } -} - const authSlice = createSlice({ name: 'auth', initialState, reducers: { setToken: (state, action: PayloadAction) => { state.token = action.payload; - // Also sync to localStorage for backward compatibility - localStorage.setItem('sessionToken', action.payload); }, clearToken: (state) => { state.token = null; - // Also clear from localStorage for backward compatibility - localStorage.removeItem('sessionToken'); - localStorage.removeItem('user'); }, }, }); diff --git a/src/store/index.ts b/src/store/index.ts index 48752b7a9..aa726403b 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -12,76 +12,7 @@ const authPersistConfig = { whitelist: ['token'], }; -// Custom storage that syncs with localStorage 'sessionToken' for backward compatibility -// redux-persist stores data as JSON string with the state object -const customStorage = { - getItem: (key: string): Promise => { - return new Promise((resolve) => { - // First check redux-persist storage (redux-persist adds 'persist:' prefix) - const persistKey = `persist:${key}`; - const persistData = localStorage.getItem(persistKey); - - if (persistData) { - try { - const parsed = JSON.parse(persistData); - // redux-persist format: { _persist: {...}, token: "..." } - if (parsed && typeof parsed === 'object') { - resolve(persistData); - return; - } - } catch { - // Ignore parse errors - } - } - - // Fallback to legacy sessionToken for backward compatibility - const legacyToken = localStorage.getItem('sessionToken'); - if (legacyToken) { - // Create redux-persist compatible format - const fallbackData = JSON.stringify({ - token: legacyToken, - _persist: { version: -1, rehydrated: true }, - }); - localStorage.setItem(persistKey, fallbackData); - resolve(fallbackData); - return; - } - - resolve(null); - }); - }, - setItem: (key: string, value: string): Promise => { - return new Promise((resolve) => { - const persistKey = `persist:${key}`; - localStorage.setItem(persistKey, value); - // Also sync to sessionToken for backward compatibility - try { - const parsed = JSON.parse(value); - if (parsed && typeof parsed === 'object' && parsed.token) { - localStorage.setItem('sessionToken', parsed.token); - } - } catch { - // Ignore parse errors - } - resolve(); - }); - }, - removeItem: (key: string): Promise => { - return new Promise((resolve) => { - const persistKey = `persist:${key}`; - localStorage.removeItem(persistKey); - localStorage.removeItem('sessionToken'); - resolve(); - }); - }, -}; - -const authPersistConfigWithCustomStorage = { - ...authPersistConfig, - storage: customStorage, -}; - -const persistedAuthReducer = persistReducer(authPersistConfigWithCustomStorage, authReducer); +const persistedAuthReducer = persistReducer(authPersistConfig, authReducer); // Get logger only in dev mode let loggerMiddleware: unknown = undefined; diff --git a/src/utils/desktopDeepLinkListener.ts b/src/utils/desktopDeepLinkListener.ts index 2c4311b07..b2e04c194 100644 --- a/src/utils/desktopDeepLinkListener.ts +++ b/src/utils/desktopDeepLinkListener.ts @@ -31,17 +31,14 @@ const handleDeepLinkUrls = async (urls: string[] | null | undefined) => { console.log('[DeepLink] Received token'); let sessionToken: string | undefined; - let user: { id: string; username: string; firstName?: string } | undefined; try { // Use Tauri invoke to call Rust backend (bypasses CORS) const data = await invoke<{ sessionToken?: string; - user?: { id: string; username: string; firstName?: string }; }>('exchange_token', { backendUrl: BACKEND_URL, token }); sessionToken = data.sessionToken; - user = data.user; } catch (err) { console.warn('[DeepLink] Token exchange failed:', err); } @@ -55,10 +52,6 @@ const handleDeepLinkUrls = async (urls: string[] | null | undefined) => { // Store session token in store store.dispatch(setToken(sessionToken)); - localStorage.setItem('deepLinkHandled', 'true'); - if (user) { - localStorage.setItem('user', JSON.stringify(user)); - } // Navigate to post-login flow. This listener runs outside the React // router context, so we assign the path directly and reload. @@ -75,10 +68,8 @@ const handleDeepLinkUrls = async (urls: string[] | null | undefined) => { export const setupDesktopDeepLinkListener = async () => { try { const startUrls = await getCurrent(); - if (startUrls && !localStorage.getItem('deepLinkHandled')) { + if (startUrls) { await handleDeepLinkUrls(startUrls); - } else if (localStorage.getItem('deepLinkHandled')) { - localStorage.removeItem('deepLinkHandled'); } await onOpenUrl(urls => {