aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/client/apis/GoogleAuthenticationManager.tsx23
-rw-r--r--src/client/util/SettingsManager.tsx2
-rw-r--r--src/client/views/nodes/TaskBox.tsx11
-rw-r--r--src/server/ApiManagers/GeneralGoogleManager.ts27
-rw-r--r--src/server/apis/google/GoogleApiServerUtils.ts16
-rw-r--r--src/server/apis/google/google_project_credentials.json8
6 files changed, 39 insertions, 48 deletions
diff --git a/src/client/apis/GoogleAuthenticationManager.tsx b/src/client/apis/GoogleAuthenticationManager.tsx
index a93e03e60..ffec07512 100644
--- a/src/client/apis/GoogleAuthenticationManager.tsx
+++ b/src/client/apis/GoogleAuthenticationManager.tsx
@@ -1,4 +1,4 @@
-import { action, IReactionDisposer, makeObservable, observable, reaction, runInAction } from 'mobx';
+import { action, IReactionDisposer, makeObservable, observable, runInAction } from 'mobx';
import { observer } from 'mobx-react';
import * as React from 'react';
import { Opt } from '../../fields/Doc';
@@ -8,7 +8,6 @@ import { MainViewModal } from '../views/MainViewModal';
import './GoogleAuthenticationManager.scss';
import { ObservableReactComponent } from '../views/ObservableReactComponent';
-const AuthenticationUrl = 'https://accounts.google.com/o/oauth2/v2/auth';
const prompt = 'Paste authorization code here...';
@observer
@@ -85,27 +84,29 @@ export class GoogleAuthenticationManager extends ObservableReactComponent<object
// return (response2 as { access_token: string }).access_token;
// };
- public fetchOrGenerateAccessToken = async (): Promise<string> => {
+ public fetchOrGenerateAccessToken = async (): Promise<string | undefined> => {
const response = await Networking.FetchFromServer('/readGoogleAccessToken');
-
+
// This will return a JSON object with { access_token, user_info } if already linked
try {
const parsed = JSON.parse(response) as { access_token: string; user_info: { name: string; picture: string } };
-
+
runInAction(() => {
this.success = true;
this.credentials = parsed;
});
-
+
return parsed.access_token;
- } catch (err) {
- console.warn('Not linked yet or invalid JSON. Redirecting to auth...');
+ } catch {
+ console.warn('Not linked yet or invalid JSON. open auth...');
// This is an auth URL — redirect the user to /refreshGoogle
if (typeof response === 'string' && response.startsWith('http')) {
- window.location.href = response;
- return ''; // Won’t be used — this page will reload anyway
+ if (window.confirm('Authorize Dash to access your Google tasks?')) {
+ window.open(response)?.focus();
+ return undefined;
+ }
}
-
+
throw new Error('Unable to fetch Google access token.');
}
};
diff --git a/src/client/util/SettingsManager.tsx b/src/client/util/SettingsManager.tsx
index 9e79fd870..f54dea90c 100644
--- a/src/client/util/SettingsManager.tsx
+++ b/src/client/util/SettingsManager.tsx
@@ -40,7 +40,7 @@ export class SettingsManager extends React.Component<object> {
@observable private _activeTab = 'Accounts';
@observable private _isOpen = false;
- private googleAuthorize = action(() => GoogleAuthenticationManager.Instance.fetchOrGenerateAccessToken(true));
+ private googleAuthorize = action(() => GoogleAuthenticationManager.Instance.fetchOrGenerateAccessToken());
public closeMgr = action(() => {
this._isOpen = false;
diff --git a/src/client/views/nodes/TaskBox.tsx b/src/client/views/nodes/TaskBox.tsx
index 8855e43c8..df81d9c69 100644
--- a/src/client/views/nodes/TaskBox.tsx
+++ b/src/client/views/nodes/TaskBox.tsx
@@ -6,7 +6,6 @@ import { DocumentType } from '../../documents/DocumentTypes';
import { FieldView } from './FieldView';
import { DateField } from '../../../fields/DateField';
import { Doc } from '../../../fields/Doc';
-import { Networking } from '../../Network';
import './TaskBox.scss';
import { GoogleAuthenticationManager } from '../../apis/GoogleAuthenticationManager';
@@ -324,6 +323,16 @@ export class TaskBox extends React.Component<TaskBoxProps> {
console.log('GT button clicked');
try {
const token = await GoogleAuthenticationManager.Instance.fetchOrGenerateAccessToken();
+ if (token === undefined) {
+ const listener = () => {
+ if (confirm('✅ Try again?')) {
+ // refactor this click function and call it again
+ }
+ window.removeEventListener('focusin', listener);
+ };
+ setTimeout(() => window.addEventListener('focusin', listener), 100);
+ return;
+ }
console.log('Got token', token);
const response = await fetch('/googleTasks/create', {
diff --git a/src/server/ApiManagers/GeneralGoogleManager.ts b/src/server/ApiManagers/GeneralGoogleManager.ts
index 25589ccb5..59d066934 100644
--- a/src/server/ApiManagers/GeneralGoogleManager.ts
+++ b/src/server/ApiManagers/GeneralGoogleManager.ts
@@ -1,5 +1,5 @@
import ApiManager, { Registration } from './ApiManager';
-import { Method, _success } from '../RouteManager';
+import { Method } from '../RouteManager';
import { GoogleApiServerUtils } from '../apis/google/GoogleApiServerUtils';
import RouteSubscriber from '../RouteSubscriber';
import { Database } from '../database';
@@ -72,19 +72,19 @@ export default class GeneralGoogleManager extends ApiManager {
secureHandler: async ({ req, res, user }) => {
try {
const auth = await GoogleApiServerUtils.retrieveOAuthClient(user);
-
+
if (!auth) {
return res.status(401).send('Google credentials missing or invalid.');
}
-
+
const tasks = google.tasks({ version: 'v1', auth });
-
+
const { title, notes, due, status, completed } = req.body;
const result = await tasks.tasks.insert({
tasklist: '@default',
- requestBody: { title, notes, due, status, completed},
+ requestBody: { title, notes, due, status, completed },
});
-
+
res.status(200).send(result.data);
} catch (err) {
console.error('Google Tasks error:', err);
@@ -98,37 +98,22 @@ export default class GeneralGoogleManager extends ApiManager {
subscription: '/refreshGoogle',
secureHandler: async ({ user, req, res }) => {
const code = req.query.code as string;
- console.log('/refreshGoogle hit with code:', code);
try {
const enriched = await GoogleApiServerUtils.processNewUser(user.id, code);
if (enriched.refresh_token) {
- console.log('Enriched credentials:', enriched);
-
if (enriched.refresh_token) {
user.googleToken = enriched.refresh_token;
await user.save();
- console.log('Saved refresh token to user model');
} else {
console.warn('No refresh token returned');
}
}
-
- // await user.save();
- // _success(res, 'Google account successfully linked!');
- res.redirect('/home');
-
} catch (err) {
console.error('Failed to process Google code:', err);
res.status(500).send('Error linking Google account');
}
-
- // const response2 = await Networking.PostToServer('/writeGoogleAccessToken', { authenticationCode });
- // runInAction(() => {
- // this.success = true;
- // this.credentials = response2 as { user_info: { name: string; picture: string }; access_token: string };
- // });
},
});
}
diff --git a/src/server/apis/google/GoogleApiServerUtils.ts b/src/server/apis/google/GoogleApiServerUtils.ts
index 56bc79119..2f7ef473c 100644
--- a/src/server/apis/google/GoogleApiServerUtils.ts
+++ b/src/server/apis/google/GoogleApiServerUtils.ts
@@ -185,18 +185,14 @@ export namespace GoogleApiServerUtils {
*/
export function generateAuthenticationUrl(): string {
const oauth2Client = new google.auth.OAuth2(
- '838617994486-a28072lirm8uk8cm78t7ic4krp0rgkgv.apps.googleusercontent.com',
- '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',
+ '740987818053-dtflji3hfkn5r9t8ad6jb8740pls8moh.apps.googleusercontent.com',
+ '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',
'http://localhost:1050/refreshGoogle' // Ensure this matches the redirect URI in Google Cloud Console
);
return oauth2Client.generateAuthUrl({
access_type: 'offline',
- scope: [
- 'https://www.googleapis.com/auth/tasks',
- 'openid',
- 'profile'
- ],
+ scope: ['https://www.googleapis.com/auth/tasks', 'openid', 'profile'],
prompt: 'consent', // This ensures we get a refresh token
});
}
@@ -220,12 +216,12 @@ export namespace GoogleApiServerUtils {
*/
export async function processNewUser(userId: string, authenticationCode: string): Promise<EnrichedCredentials> {
const credentials = await new Promise<Credentials>((resolve, reject) => {
- worker.getToken(authenticationCode, (err, credentials) => {
- if (err || !credentials) {
+ worker.getToken(authenticationCode, (err, creds) => {
+ if (err || !creds) {
reject(err);
return;
}
- resolve(credentials);
+ resolve(creds);
});
});
const enriched = injectUserInfo(credentials);
diff --git a/src/server/apis/google/google_project_credentials.json b/src/server/apis/google/google_project_credentials.json
index 010f9a626..8abc13b80 100644
--- a/src/server/apis/google/google_project_credentials.json
+++ b/src/server/apis/google/google_project_credentials.json
@@ -1,11 +1,11 @@
{
"installed": {
- "client_id": "838617994486-a28072lirm8uk8cm78t7ic4krp0rgkgv.apps.googleusercontent.com",
- "project_id": "gtasks-test-dash",
+ "client_id": "740987818053-dtflji3hfkn5r9t8ad6jb8740pls8moh.apps.googleusercontent.com",
+ "project_id": "dash-web-461920",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
- "client_secret": "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",
+ "client_secret": "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",
"redirect_uris": ["http://localhost:1050/refreshGoogle"]
}
-} \ No newline at end of file
+}