Skip to content

Commit 4c47413

Browse files
Reminders v1 (#93)
#93 * added reminders view; Signed-off-by: Sahil Shubham <[email protected]> * added useReminders to extension; move reminder store constructor to core lib; Signed-off-by: Sahil Shubham <[email protected]> * POC tested; native browser notifications implemented; Signed-off-by: Sahil Shubham <[email protected]> * fixed double placeholder post dnd addition; Signed-off-by: Sahil Shubham <[email protected]> * deps: added date-fns in extension; Signed-off-by: Sahil Shubham <[email protected]> * removed devtools from stores and updated options for sharing zustand; initiliazed on new frame addition and different channels for different variables; Signed-off-by: Sahil Shubham <[email protected]> * added support for buttons in notifications; Signed-off-by: Sahil Shubham <[email protected]>
1 parent 0ebf611 commit 4c47413

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+2543
-549
lines changed

apps/extension/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"chrome-extension-async": "^3.4.1",
2121
"core-js": "^3.21.1",
2222
"crypto-browserify": "^3.12.0",
23+
"date-fns": "^2.28.0",
2324
"fuzzysort": "^1.9.0",
2425
"hotkeys-js": "^3.8.7",
2526
"lodash": "^4.17.21",

apps/extension/src/Components/Chotu/index.tsx

+4
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,10 @@ export default function Chotu() {
187187
delete event.detail['type']
188188
child.updateIlinks(event.detail[0])
189189
break
190+
case 'ACT_ON_REMINDER':
191+
delete event.detail['type']
192+
child.reminderAction(event.detail[0])
193+
break
190194
}
191195
}
192196
window.addEventListener('raju', handleEvent)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { IpcAction, mog, ReminderActionIpcData } from '@mexit/core'
2+
import React, { useEffect } from 'react'
3+
import { useReminders } from '../Hooks/useReminders'
4+
import { useReminderStore } from '../Stores/useReminderStore'
5+
6+
const ReminderArmer = () => {
7+
const reminders = useReminderStore((state) => state.reminders)
8+
const { getToArmReminders, armReminders, clearAllArmedReminders, armMissedReminders, getMissedReminders } =
9+
useReminders()
10+
11+
useEffect(() => {
12+
const toArmRems = getToArmReminders()
13+
// mog('ReminderArmer: useEffect', { reminders, toArmRems })
14+
15+
if (toArmRems.length > 0) {
16+
toArmRems.forEach((rems) => armReminders(rems.reminders, rems.time))
17+
} else {
18+
// mog('ReminderArmer: Arming missed reminders', { reminders })
19+
// armMissedReminders()
20+
}
21+
22+
const intervalId = setInterval(() => {
23+
const missedRems = getMissedReminders()
24+
// mog('ReminderArmer: Arming missed reminders', { reminders, missedRems })
25+
if (missedRems.length > 0) {
26+
armMissedReminders()
27+
}
28+
}, 1000 * 60 * 1) // one minutes
29+
30+
return () => {
31+
// mog('ReminderArmer: unArming reminders', { reminders })
32+
clearInterval(intervalId)
33+
clearAllArmedReminders()
34+
}
35+
}, [reminders])
36+
37+
return <></>
38+
}
39+
40+
export default ReminderArmer

apps/extension/src/Hooks/useRaju.ts

+47-1
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,27 @@ import {
33
Contents,
44
idxKey,
55
ILink,
6+
mog,
67
NodeEditorContent,
78
NodeMetadata,
9+
Reminder,
10+
ReminderActions,
811
Snippet,
912
UserDetails,
1013
WorkspaceDetails
1114
} from '@mexit/core'
1215
import { Theme } from '@mexit/shared'
1316
import { AsyncMethodReturns, Methods } from 'penpal'
17+
import { useEffect } from 'react'
18+
import { addMinutes } from 'date-fns'
1419
import toast from 'react-hot-toast'
1520
import { useContentStore } from '../Stores/useContentStore'
1621
import useDataStore from '../Stores/useDataStore'
22+
import { useReminderStore } from '../Stores/useReminderStore'
1723
import { useSnippetStore } from '../Stores/useSnippetStore'
1824
import { useAuthStore } from './useAuth'
1925
import useInternalAuthStore from './useAuthStore'
26+
import { useReminders } from './useReminders'
2027
import useThemeStore from './useThemeStore'
2128

2229
interface ParentMethods {
@@ -26,6 +33,7 @@ interface ParentMethods {
2633
// ['SEARCH']: (key: idxKey | idxKey[], query: string) => Promise<any>
2734
['SET_CONTENT']: [props: { nodeid: string; content: NodeEditorContent; metadata: NodeMetadata }]
2835
['ADD_ILINK']: [props: AddILinkProps]
36+
['ACT_ON_REMINDER']: [props: { action: ReminderActions; reminder: Reminder }]
2937
}
3038

3139
// Raju is great with doing Hera Pheri
@@ -38,6 +46,42 @@ export default function useRaju() {
3846
const initContents = useContentStore((store) => store.initContents)
3947
const setIlinks = useDataStore((store) => store.setIlinks)
4048
const initSnippets = useSnippetStore((store) => store.initSnippets)
49+
const { setReminders, reminders } = useReminderStore()
50+
const { actOnReminder } = useReminders()
51+
52+
useEffect(() => {
53+
const handleMessage = (message) => {
54+
if (message.type === 'RAJU') {
55+
console.log('actOnReminders', reminders, message, addMinutes(Date.now(), 15).getTime())
56+
const mentionedReminder = reminders.find((item) => item.id === message.notificationId)
57+
switch (message.action) {
58+
case 'OPEN':
59+
actOnReminder({ type: 'open' }, mentionedReminder)
60+
dispatch('ACT_ON_REMINDER', { action: { type: 'open' }, reminder: mentionedReminder })
61+
break
62+
case 'SNOOZE':
63+
actOnReminder({ type: 'snooze', value: addMinutes(Date.now(), 15).getTime() }, mentionedReminder)
64+
dispatch('ACT_ON_REMINDER', {
65+
action: { type: 'snooze', value: addMinutes(Date.now(), 15).getTime() },
66+
reminder: mentionedReminder
67+
})
68+
break
69+
case 'DISMISS':
70+
actOnReminder({ type: 'dismiss' }, mentionedReminder)
71+
dispatch('ACT_ON_REMINDER', { action: { type: 'dismiss' }, reminder: mentionedReminder })
72+
break
73+
}
74+
}
75+
76+
return
77+
}
78+
79+
chrome.runtime.onMessage.addListener(handleMessage)
80+
81+
return () => {
82+
chrome.runtime.onMessage.removeListener(handleMessage)
83+
}
84+
}, [reminders])
4185

4286
const methods: Methods = {
4387
init(
@@ -47,14 +91,16 @@ export default function useRaju() {
4791
authAWS: any,
4892
snippets: Snippet[],
4993
contents: Contents,
50-
ilinks: any[]
94+
ilinks: any[],
95+
reminders: Reminder[]
5196
) {
5297
setAuthenticated(userDetails, workspaceDetails)
5398
setTheme(theme)
5499
setInternalAuthStore(authAWS)
55100
initSnippets(snippets)
56101
setIlinks(ilinks)
57102
initContents(contents)
103+
setReminders(reminders)
58104
},
59105
success(message: string) {
60106
toast.success(message)

0 commit comments

Comments
 (0)