A social knowledge tool for researchers built on ATProto

linting and formatting

+28 -16
+1 -1
.vscode/launch.json
··· 38 "name": "Launch All Services", 39 "configurations": [ 40 "Backend (dev:mock)", 41 - "Webapp Dev", 42 "Webapp Extension Dev" 43 ], 44 "stopAll": true
··· 38 "name": "Launch All Services", 39 "configurations": [ 40 "Backend (dev:mock)", 41 + "Webapp Dev", 42 "Webapp Extension Dev" 43 ], 44 "stopAll": true
+4 -4
src/webapp/app/auth/complete/page.tsx
··· 54 const handleExtensionTokenGeneration = async () => { 55 try { 56 setMessage('Generating extension tokens...'); 57 - 58 const tokens = await apiClient.generateExtensionTokens(); 59 await ExtensionService.sendTokensToExtension(tokens); 60 ExtensionService.clearExtensionTokensRequested(); 61 - 62 setMessage('Extension tokens generated successfully!'); 63 - 64 // Redirect to library after successful extension token generation 65 setTimeout(() => router.push('/library'), 1000); 66 } catch (extensionError: any) { 67 console.error('Failed to generate extension tokens:', extensionError); 68 ExtensionService.clearExtensionTokensRequested(); 69 setMessage('Login successful, but failed to generate extension tokens'); 70 - 71 // Still redirect to library after a delay 72 setTimeout(() => router.push('/library'), 2000); 73 }
··· 54 const handleExtensionTokenGeneration = async () => { 55 try { 56 setMessage('Generating extension tokens...'); 57 + 58 const tokens = await apiClient.generateExtensionTokens(); 59 await ExtensionService.sendTokensToExtension(tokens); 60 ExtensionService.clearExtensionTokensRequested(); 61 + 62 setMessage('Extension tokens generated successfully!'); 63 + 64 // Redirect to library after successful extension token generation 65 setTimeout(() => router.push('/library'), 1000); 66 } catch (extensionError: any) { 67 console.error('Failed to generate extension tokens:', extensionError); 68 ExtensionService.clearExtensionTokensRequested(); 69 setMessage('Login successful, but failed to generate extension tokens'); 70 + 71 // Still redirect to library after a delay 72 setTimeout(() => router.push('/library'), 2000); 73 }
+9 -7
src/webapp/content.ts
··· 7 8 if (event.data?.type === 'EXTENSION_TOKENS') { 9 // Forward tokens to background script 10 - chrome.runtime.sendMessage({ 11 - type: 'WEBAPP_TOKENS_RECEIVED', 12 - accessToken: event.data.accessToken, 13 - refreshToken: event.data.refreshToken 14 - }).catch((error) => { 15 - console.error('Failed to forward tokens to background script:', error); 16 - }); 17 } 18 });
··· 7 8 if (event.data?.type === 'EXTENSION_TOKENS') { 9 // Forward tokens to background script 10 + chrome.runtime 11 + .sendMessage({ 12 + type: 'WEBAPP_TOKENS_RECEIVED', 13 + accessToken: event.data.accessToken, 14 + refreshToken: event.data.refreshToken, 15 + }) 16 + .catch((error) => { 17 + console.error('Failed to forward tokens to background script:', error); 18 + }); 19 } 20 });
+4 -2
src/webapp/hooks/useExtensionAuth.tsx
··· 54 }); 55 }, []); 56 57 - const getStoredRefreshToken = useCallback(async (): Promise<string | null> => { 58 return new Promise((resolve) => { 59 if (typeof chrome !== 'undefined' && chrome.storage) { 60 chrome.storage.local.get(['refreshToken'], (result) => { ··· 130 131 if (typeof chrome !== 'undefined' && chrome.runtime?.onMessage) { 132 chrome.runtime.onMessage.addListener(handleAuthStateChange); 133 - 134 return () => { 135 chrome.runtime.onMessage.removeListener(handleAuthStateChange); 136 };
··· 54 }); 55 }, []); 56 57 + const getStoredRefreshToken = useCallback(async (): Promise< 58 + string | null 59 + > => { 60 return new Promise((resolve) => { 61 if (typeof chrome !== 'undefined' && chrome.storage) { 62 chrome.storage.local.get(['refreshToken'], (result) => { ··· 132 133 if (typeof chrome !== 'undefined' && chrome.runtime?.onMessage) { 134 chrome.runtime.onMessage.addListener(handleAuthStateChange); 135 + 136 return () => { 137 chrome.runtime.onMessage.removeListener(handleAuthStateChange); 138 };
+10 -2
src/webapp/popup.tsx
··· 3 useExtensionAuth, 4 } from './hooks/useExtensionAuth'; 5 import { SaveCardPage } from './components/extension/SaveCardPage'; 6 - import { Card, MantineProvider, ScrollArea, Button, Text, Stack } from '@mantine/core'; 7 import '@mantine/core/styles.css'; 8 import { theme } from '@/styles/theme'; 9 ··· 20 21 if (!isAuthenticated) { 22 const handleSignIn = () => { 23 - const appUrl = process.env.PLASMO_PUBLIC_APP_URL || 'http://localhost:3000'; 24 const loginUrl = `${appUrl}/login?extension-login=true`; 25 chrome.tabs.create({ url: loginUrl }); 26 window.close();
··· 3 useExtensionAuth, 4 } from './hooks/useExtensionAuth'; 5 import { SaveCardPage } from './components/extension/SaveCardPage'; 6 + import { 7 + Card, 8 + MantineProvider, 9 + ScrollArea, 10 + Button, 11 + Text, 12 + Stack, 13 + } from '@mantine/core'; 14 import '@mantine/core/styles.css'; 15 import { theme } from '@/styles/theme'; 16 ··· 27 28 if (!isAuthenticated) { 29 const handleSignIn = () => { 30 + const appUrl = 31 + process.env.PLASMO_PUBLIC_APP_URL || 'http://localhost:3000'; 32 const loginUrl = `${appUrl}/login?extension-login=true`; 33 chrome.tabs.create({ url: loginUrl }); 34 window.close();