Initial commit
This commit is contained in:
83
app/stores/notifications.ts
Normal file
83
app/stores/notifications.ts
Normal file
@@ -0,0 +1,83 @@
|
||||
import type { NotificationsRecord } from '~/types/pocketbase.types'
|
||||
|
||||
const COLLECTION = 'notifications'
|
||||
|
||||
export const useNotifications = defineStore('notifications', {
|
||||
state: () => {
|
||||
return {
|
||||
notifications: [] as NotificationsRecord[]
|
||||
}
|
||||
},
|
||||
actions: {
|
||||
/**
|
||||
* Subscribes to changes of notifications in realtime
|
||||
* and calls the method to refetch them
|
||||
*/
|
||||
subscribeToChanges() {
|
||||
if (useUser().isAuthenticated) {
|
||||
const { pb } = usePocketBase()
|
||||
pb.collection(COLLECTION).subscribe('*', () => this.fetchNotifications())
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Unsubscribe from the realtime channel
|
||||
* Should be done when the user leaves the page for cleanup
|
||||
*/
|
||||
unsubscribe() {
|
||||
const { pb } = usePocketBase()
|
||||
pb.collection(COLLECTION).unsubscribe('*')
|
||||
},
|
||||
/**
|
||||
* Fetches the notifications and sets the state
|
||||
*/
|
||||
async fetchNotifications() {
|
||||
const userId = useUser().userId
|
||||
if (!userId) return
|
||||
try {
|
||||
const { pb } = usePocketBase()
|
||||
const resultList = await pb.collection(COLLECTION).getList(1, 50, {
|
||||
filter: `userId="${userId}"`
|
||||
})
|
||||
this.notifications = resultList.items
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Marks a notification as read
|
||||
*/
|
||||
async markAsRead(notificationId: string) {
|
||||
try {
|
||||
const { pb } = usePocketBase()
|
||||
await pb.collection(COLLECTION).update(notificationId, {
|
||||
isRead: true
|
||||
})
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
}
|
||||
},
|
||||
/**
|
||||
* Adds a new FCM token for the current user for push notifications
|
||||
*/
|
||||
async addFcmToken(token: string) {
|
||||
const userId = useUser().userId
|
||||
if (!userId) return
|
||||
try {
|
||||
const { pb } = usePocketBase()
|
||||
const result = await pb.collection('fcm_tokens').getList(1, 0, {
|
||||
filter: `token = "${token}"`
|
||||
})
|
||||
if (result.totalItems > 0) {
|
||||
// skip if token already exists
|
||||
return
|
||||
}
|
||||
await pb.collection('fcm_tokens').create({
|
||||
userId,
|
||||
token
|
||||
})
|
||||
} catch (error) {
|
||||
console.error(error)
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user