aboutsummaryrefslogtreecommitdiff
path: root/src/client/views/nodes/TaskBox.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/views/nodes/TaskBox.tsx')
-rw-r--r--src/client/views/nodes/TaskBox.tsx97
1 files changed, 87 insertions, 10 deletions
diff --git a/src/client/views/nodes/TaskBox.tsx b/src/client/views/nodes/TaskBox.tsx
index b59599052..7df3876c3 100644
--- a/src/client/views/nodes/TaskBox.tsx
+++ b/src/client/views/nodes/TaskBox.tsx
@@ -159,13 +159,62 @@ export class TaskBox extends React.Component<TaskBoxProps> {
makeObservable(this);
}
+ _googleTaskCreateDisposer?: IReactionDisposer;
_heightDisposer?: IReactionDisposer;
_widthDisposer?: IReactionDisposer;
componentDidMount() {
this.setTaskDateRange();
-
const doc = this.props.Document;
+
+ // adding task on creation to google
+
+ (async () => {
+ if (!doc.$googleTaskId && doc.title) {
+ try {
+ const token = await GoogleAuthenticationManager.Instance.fetchOrGenerateAccessToken();
+ if (!token) return;
+
+ const body: any = {
+ title: doc.title || 'Untitled Task',
+ notes: doc.text || '',
+ status: doc.$task_completed ? 'completed' : 'needsAction',
+ completed: doc.$task_completed ? new Date().toISOString() : undefined,
+ };
+
+ if (doc.$task_allDay && typeof doc.$task_dateRange === 'string') {
+ const datePart = doc.$task_dateRange.split('|')[0];
+ if (datePart && !isNaN(new Date(datePart).getTime())) {
+ const baseDate = datePart.includes('T') ? datePart : datePart + 'T00:00:00Z';
+ body.due = new Date(baseDate).toISOString();
+ }
+ } else if (doc.$task_endTime instanceof DateField) {
+ body.due = doc.$task_endTime.date.toISOString();
+ }
+
+ const res = await fetch('/googleTasks/create', {
+ method: 'POST',
+ credentials: 'include',
+ headers: {
+ 'Content-Type': 'application/json',
+ Authorization: `Bearer ${token}`,
+ },
+ body: JSON.stringify(body),
+ });
+
+ const result = await res.json();
+ if (result?.id) {
+ doc.$googleTaskId = result.id;
+ console.log('✅ Google Task created on mount:', result);
+ } else {
+ console.warn('❌ Google Task creation failed:', result);
+ }
+ } catch (err) {
+ console.error('❌ Error creating Google Task:', err);
+ }
+ }
+ })();
+
this._heightDisposer = reaction(
() => Number(doc._height),
height => {
@@ -188,8 +237,32 @@ export class TaskBox extends React.Component<TaskBoxProps> {
}
componentWillUnmount() {
+ const doc = this.props.Document;
+ this._googleTaskCreateDisposer?.();
this._heightDisposer?.();
this._widthDisposer?.();
+
+ // task deletion
+ if (doc.$googleTaskId) {
+ (async () => {
+ try {
+ const token = await GoogleAuthenticationManager.Instance.fetchOrGenerateAccessToken();
+ if (!token) return;
+
+ await fetch(`/googleTasks/${doc.$googleTaskId}`, {
+ method: 'DELETE',
+ credentials: 'include',
+ headers: {
+ Authorization: `Bearer ${token}`,
+ },
+ });
+
+ console.log(`✅ Deleted Google Task ${doc.$googleTaskId}`);
+ } catch (err) {
+ console.warn('❌ Failed to delete Google Task:', err);
+ }
+ })();
+ }
}
/**
@@ -213,7 +286,7 @@ export class TaskBox extends React.Component<TaskBoxProps> {
const startTime = doc.$task_startTime instanceof DateField && doc.$task_startTime.date instanceof Date ? toLocalDateTimeString(doc.$task_startTime.date) : '';
const endTime = doc.$task_endTime instanceof DateField && doc.$task_endTime.date instanceof Date ? toLocalDateTimeString(doc.$task_endTime.date) : '';
- const handleGoogleTaskClick = async () => {
+ const handleGoogleTaskSync = async () => {
console.log('GT button clicked');
try {
@@ -221,9 +294,9 @@ export class TaskBox extends React.Component<TaskBoxProps> {
if (!token) {
const listener = () => {
window.removeEventListener('focusin', listener);
- if (confirm('✅ Authorization complete. Try adding the task again?')) {
+ if (confirm('✅ Authorization complete. Try syncing the task again?')) {
// you could refactor the click handler here
- handleGoogleTaskClick();
+ handleGoogleTaskSync();
}
window.removeEventListener('focusin', listener);
};
@@ -252,8 +325,12 @@ export class TaskBox extends React.Component<TaskBoxProps> {
due = undefined;
}
- const response = await fetch('/googleTasks/create', {
- method: 'POST',
+ const isUpdate = !!doc.$googleTaskId;
+ const endpoint = isUpdate ? `/googleTasks/${doc.$googleTaskId}` : '/googleTasks/create';
+ const method = isUpdate ? 'PATCH' : 'POST';
+
+ const response = await fetch(endpoint, {
+ method,
credentials: 'include',
headers: {
'Content-Type': 'application/json',
@@ -272,13 +349,13 @@ export class TaskBox extends React.Component<TaskBoxProps> {
console.log('Google Task result:', result);
if (result?.id) {
- alert('✅ Task sent to Google Tasks!');
+ alert('✅ Task synced with Google Tasks!');
} else {
alert(`❌ Failed: ${result?.error?.message || 'Unknown error'}`);
}
} catch (err) {
console.error('Fetch error:', err);
- alert('❌ Task creation failed.');
+ alert('❌ Task syncing failed.');
}
};
@@ -327,9 +404,9 @@ export class TaskBox extends React.Component<TaskBoxProps> {
className="task-manager-google"
onClick={event => {
event.preventDefault();
- handleGoogleTaskClick();
+ handleGoogleTaskSync();
}}>
- Add to Google Tasks
+ Sync to Google
</button>
</div>