Skip to content

Commit dfb4bad

Browse files
committed
Cleaner code for requests
1 parent e5cf7df commit dfb4bad

File tree

3 files changed

+44
-67
lines changed

3 files changed

+44
-67
lines changed

src/constants.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@ import { Icons } from './components/Icons'
44

55
export const prefersDark = useMediaQuery('(prefers-color-scheme: dark)')
66

7+
export enum CheckedNotificationProcess {
8+
Unsubscribe,
9+
MarkAsRead,
10+
}
11+
712
export enum ColorPreference {
813
System = 'system',
914
Light = 'light',

src/pages/HomePage.vue

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { isRepository, isThread } from '../utils/notification'
1818
import Popover from '../components/Popover.vue'
1919
import MenuItems, { menuItem } from '../components/MenuItems.vue'
2020
import { type UseKeyOptions, useKey } from '../composables/useKey'
21-
import { notificationApiMutex } from '../constants'
21+
import { CheckedNotificationProcess, notificationApiMutex } from '../constants'
2222
import { everySome } from '../utils/array'
2323
2424
const store = useStore()
@@ -150,7 +150,7 @@ async function handleSelectMarkAsRead(triggeredByKeyboard = false) {
150150
if (
151151
(triggeredByKeyboard && store.checkedItems.length > 0)
152152
|| (contextMenuThread.value && isChecked(contextMenuThread.value))) {
153-
store.markCheckedNotificationsAsRead(AppStorage.get('accessToken')!)
153+
store.processCheckedNotifications(CheckedNotificationProcess.MarkAsRead)
154154
return
155155
}
156156
@@ -182,9 +182,9 @@ async function handleSelectOpen(triggeredByKeyboard = false) {
182182
store.checkedItems.forEach(handleOpenNotification)
183183
184184
if (AppStorage.get('markAsReadOnOpen'))
185-
store.markCheckedNotificationsAsRead(AppStorage.get('accessToken')!)
186-
187-
store.checkedItems = []
185+
store.processCheckedNotifications(CheckedNotificationProcess.MarkAsRead)
186+
else
187+
store.checkedItems = []
188188
return
189189
}
190190
@@ -198,12 +198,7 @@ async function handleSelectUnsubscribe(triggeredByKeyboard = false) {
198198
if (
199199
(triggeredByKeyboard && store.checkedItems.length > 0)
200200
|| (contextMenuThread.value && isChecked(contextMenuThread.value))) {
201-
try {
202-
await store.unsubscribeCheckedNotifications(AppStorage.get('accessToken')!)
203-
}
204-
catch (error) {
205-
console.log(error)
206-
}
201+
store.processCheckedNotifications(CheckedNotificationProcess.Unsubscribe)
207202
return
208203
}
209204

src/stores/store.ts

Lines changed: 33 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ import { type UpdateManifest, installUpdate } from '@tauri-apps/api/updater'
77
import { relaunch } from '@tauri-apps/api/process'
88
import { computedEager } from '@vueuse/core'
99
import { type Thread, getNotifications, markNotificationAsRead, unsubscribeNotification } from '../api/notifications'
10-
import { ColorPreference, InvokeCommand, Page, notificationApiMutex, prefersDark } from '../constants'
10+
import { CheckedNotificationProcess, ColorPreference, InvokeCommand, Page, notificationApiMutex, prefersDark } from '../constants'
1111
import { AppStorage } from '../storage'
12-
import type { AppStorageContext, NotificationList, Option, PageState } from '../types'
12+
import type { NotificationList, Option, PageState } from '../types'
1313
import { filterNewThreads, isRepository, isThread, toNotificationList } from '../utils/notification'
1414

1515
export const useStore = defineStore('store', () => {
@@ -124,62 +124,40 @@ export const useStore = defineStore('store', () => {
124124
return notifications.value.findIndex(({ id }) => id === thread.id)
125125
}
126126

127-
async function markCheckedNotificationsAsRead(accessToken: NonNullable<AppStorageContext['accessToken']>) {
128-
const deletedThreads: Thread['id'][] = []
129-
const checkedThreads = checkedItems.value
130-
const snapshot = notifications.value.slice(0)
131-
132-
checkedThreads.forEach(item => removeNotificationById(item.id))
133-
triggerRef(notifications)
134-
135-
checkedItems.value = []
127+
function processCheckedNotifications(process: CheckedNotificationProcess) {
128+
return notificationApiMutex.runExclusive(async () => {
129+
const deletedThreads: Thread['id'][] = []
130+
const checkedThreads = checkedItems.value
131+
const snapshot = notifications.value.slice(0)
132+
const accessToken = AppStorage.get('accessToken')!
136133

137-
try {
138-
await notificationApiMutex.runExclusive(() => pAll(
139-
checkedThreads.map(thread => async () => {
140-
await markNotificationAsRead(thread.id, accessToken)
141-
deletedThreads.push(thread.id)
142-
}),
143-
{
144-
stopOnError: false,
145-
concurrency: 7,
146-
},
147-
))
148-
}
149-
catch (error) {
150-
notifications.value = snapshot
151-
deletedThreads.forEach(id => removeNotificationById(id))
134+
checkedThreads.forEach(item => removeNotificationById(item.id))
152135
triggerRef(notifications)
153-
}
154-
}
155-
156-
async function unsubscribeCheckedNotifications(accessToken: NonNullable<AppStorageContext['accessToken']>) {
157-
const deletedThreads: Thread['id'][] = []
158-
const checkedThreads = checkedItems.value
159-
const snapshot = notifications.value.slice(0)
160136

161-
checkedItems.value = []
162-
163-
checkedThreads.forEach(item => removeNotificationById(item.id))
164-
triggerRef(notifications)
137+
checkedItems.value = []
165138

166-
try {
167-
await notificationApiMutex.runExclusive(() => pAll(
168-
checkedThreads.map(thread => async () => {
169-
await unsubscribeNotification(thread.id, accessToken)
170-
deletedThreads.push(thread.id)
171-
}),
172-
{
173-
stopOnError: false,
174-
concurrency: 7,
175-
},
176-
))
177-
}
178-
catch (error) {
179-
notifications.value = snapshot
180-
deletedThreads.forEach(id => removeNotificationById(id))
181-
triggerRef(notifications)
182-
}
139+
try {
140+
await pAll(
141+
checkedThreads.map(thread => async () => {
142+
if (process === CheckedNotificationProcess.MarkAsRead)
143+
await markNotificationAsRead(thread.id, accessToken)
144+
else if (process === CheckedNotificationProcess.Unsubscribe)
145+
await unsubscribeNotification(thread.id, accessToken)
146+
147+
deletedThreads.push(thread.id)
148+
}),
149+
{
150+
stopOnError: false,
151+
concurrency: 7,
152+
},
153+
)
154+
}
155+
catch (error) {
156+
notifications.value = snapshot
157+
deletedThreads.forEach(id => removeNotificationById(id))
158+
triggerRef(notifications)
159+
}
160+
})
183161
}
184162

185163
const newRelease = ref<Option<UpdateManifest>>(null)
@@ -229,12 +207,11 @@ export const useStore = defineStore('store', () => {
229207
installingUpate,
230208
theme,
231209
updateAndRestart,
232-
unsubscribeCheckedNotifications,
233210
removeNotificationById,
234211
findThreadIndex,
235-
markCheckedNotificationsAsRead,
236212
setPage,
237213
fetchNotifications,
214+
processCheckedNotifications,
238215
logout,
239216
}
240217
})

0 commit comments

Comments
 (0)