tangled
alpha
login
or
join now
cosmik.network
/
semble
43
fork
atom
A social knowledge tool for researchers built on ATProto
43
fork
atom
overview
issues
13
pulls
pipelines
linting and formatting
Wesley Finck
7 months ago
08dbc941
0d7bac6f
+28
-16
5 changed files
expand all
collapse all
unified
split
.vscode
launch.json
src
webapp
app
auth
complete
page.tsx
content.ts
hooks
useExtensionAuth.tsx
popup.tsx
+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
-
});
0
0
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> => {
0
0
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';
0
0
0
0
0
0
0
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';
0
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();