Skip to content

Commit 944f79d

Browse files
fix:loggin and session management with supbase and saving experies time
1 parent 05d89f6 commit 944f79d

File tree

4 files changed

+194
-81
lines changed

4 files changed

+194
-81
lines changed

src/pages/background/index.ts

+10-5
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,9 @@ chrome.action.onClicked.addListener(async (tab) => {
8686
if (await isRecordingInProgress()) {
8787
console.log("=== RECORDING IS IN PROGRESS ===");
8888

89-
const tabData = await isSameTab()
90-
console.log("🚀 ~ chrome.action.onClicked.addListener ~ tabData:", tabData)
91-
if (!!tabData) {
89+
const tabData = await isSameTab();
90+
console.log("🚀 ~ chrome.action.onClicked.addListener ~ tabData:", tabData);
91+
if (tabData) {
9292
initateRecordingStop();
9393
// If user is trying to record from an another tab
9494
} else {
@@ -168,11 +168,13 @@ const setTokens = async (
168168

169169
const accessToken = params.get("access_token");
170170
const refreshToken = params.get("refresh_token");
171+
const expiresIn = parseInt(params.get("expires_in"), 10);
171172

172-
if (accessToken && refreshToken) {
173+
if (accessToken && refreshToken && !isNaN(expiresIn)) {
173174
if (!tab.id) return;
174175

175-
// console.log("--> tokens: ", accessToken, refreshToken);
176+
const expiryTime = Date.now() + expiresIn * 1000; // expiresIn is in seconds
177+
console.log("--> tokens: ", accessToken, refreshToken, expiryTime);
176178

177179
// we can close that tab now
178180
await chrome.tabs.remove(tab.id);
@@ -194,6 +196,9 @@ const setTokens = async (
194196
await chrome.storage.local.set({
195197
refreshToken,
196198
});
199+
await chrome.storage.local.set({
200+
expiryTime,
201+
});
197202

198203
// remove tab listener as tokens are set
199204
chrome.tabs.onUpdated.removeListener(setTokens);

src/pages/sidepanel/ActiveMeetingTab.tsx

+13-8
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
import { useEffect, useRef, useState } from "react";
22
import { RecordingStates } from "../../../utils/recordingState";
33
import { SpeakerType } from "../../../utils/speakerType";
4-
import { Message, areTokensSet, isSameTab } from "../../../utils/recorderUtils";
4+
import {
5+
Message,
6+
areTokensSet,
7+
getUserInfo,
8+
isSameTab,
9+
} from "../../../utils/recorderUtils";
510

611
import Markdown from "react-markdown";
712
import remarkGfm from "remark-gfm";
8-
913
import clsx from "clsx";
10-
1114
import {
1215
addTranscription,
1316
updateEndTime,
1417
addAndGetMeetingInfo,
1518
getClientTranscript,
16-
getCurrentUser,
1719
} from "../../../utils/supabase";
1820
import JarvisScreen from "./JarvisScreen";
1921
import PlaybookDropdown from "./PlaybookDropdown";
@@ -66,7 +68,6 @@ const ActiveMeetingTab = () => {
6668
);
6769

6870
const [query, setQuery] = useState<string>("");
69-
7071
const showListeningMsgRef = useRef<boolean>(null);
7172
const ActiveMeetingTabRef = useRef<HTMLDivElement>(null);
7273
const meetingIdRef = useRef<number>(-1);
@@ -164,9 +165,13 @@ const ActiveMeetingTab = () => {
164165
}
165166

166167
async function handleTokens() {
167-
const userFound = await getCurrentUser();
168+
// const userFound = await getCurrentUser();
169+
// const user = await getUserInfo();
170+
// console.log("User found in handleTokens", user);
171+
// console.log("user found", userFound);
172+
// console.log("is set", isSet);
168173
const isSet = await areTokensSet();
169-
if (isSet && userFound) setLoggedIn(true);
174+
if (isSet) setLoggedIn(true);
170175
}
171176

172177
useEffect(() => {
@@ -366,7 +371,7 @@ const ActiveMeetingTab = () => {
366371
className="p-2 px-4 m-2 bg-gray-500 rounded-md mx-auto"
367372
onClick={handleLogin}
368373
>
369-
LogIn
374+
Login
370375
</button>
371376
</div>
372377
)}

utils/recorderUtils.tsx

+40-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { RecordingStates } from "./recordingState";
2+
import { fetchUserInfo, refreshTokens } from "./supabase";
23

34
export interface MeetingUrl {
45
cur_meeting_url: string;
@@ -11,6 +12,7 @@ export interface RecordingState {
1112
export interface Tokens {
1213
accessToken: string;
1314
refreshToken: string;
15+
expiryTime: number;
1416
}
1517

1618
export interface Message {
@@ -64,17 +66,50 @@ export async function isRecordingInProgress() {
6466

6567
// These tokens are set while authentication.
6668
export async function areTokensSet() {
67-
const { accessToken, refreshToken } = (await getTokens()) as Tokens;
68-
return accessToken && refreshToken;
69+
const { accessToken, refreshToken, expiryTime } =
70+
(await getTokens()) as Tokens;
71+
if (!accessToken || !refreshToken) {
72+
return false;
73+
}
74+
if (Date.now() > expiryTime) {
75+
// Token expired, try to refresh
76+
77+
return await refreshTokens(refreshToken);
78+
}
79+
return true;
6980
}
7081

7182
export async function getTokens() {
7283
return new Promise((resolve, reject) => {
7384
chrome.storage.local.get(
74-
["accessToken", "refreshToken"],
75-
({ accessToken, refreshToken }) => {
76-
resolve({ accessToken, refreshToken });
85+
["accessToken", "refreshToken", "expiryTime"],
86+
({ accessToken, refreshToken, expiryTime }) => {
87+
resolve({ accessToken, refreshToken, expiryTime });
7788
}
7889
);
7990
});
8091
}
92+
93+
// Function to store tokens and expiry time
94+
export async function storeTokens(
95+
accessToken: string,
96+
refreshToken: string,
97+
expiresIn: number
98+
) {
99+
const expiryTime = Date.now() + expiresIn * 1000;
100+
await chrome.storage.local.set({
101+
accessToken,
102+
refreshToken,
103+
expiryTime,
104+
});
105+
}
106+
107+
export async function getUserInfo() {
108+
const tokensValid = await areTokensSet();
109+
if (!tokensValid) {
110+
throw new Error("User is not authenticated");
111+
}
112+
113+
const { accessToken } = (await getTokens()) as Tokens;
114+
return fetchUserInfo(accessToken);
115+
}

0 commit comments

Comments
 (0)