nowrap-eventstream
This commit is contained in:
parent
ecc8cffa0e
commit
4748ecb141
|
@ -6,7 +6,7 @@ import { ShowIfAuthenticated } from '../components/_shared/ShowIfAuthenticated'
|
||||||
import { NotificationsPanel } from '../components/NotificationsPanel'
|
import { NotificationsPanel } from '../components/NotificationsPanel'
|
||||||
import { createStore } from 'solid-js/store'
|
import { createStore } from 'solid-js/store'
|
||||||
import { IDBPDatabase, openDB } from 'idb'
|
import { IDBPDatabase, openDB } from 'idb'
|
||||||
import { fetchEventSource } from '@microsoft/fetch-event-source'
|
// import { fetchEventSource } from '@microsoft/fetch-event-source'
|
||||||
import { getToken } from '../graphql/privateGraphQLClient'
|
import { getToken } from '../graphql/privateGraphQLClient'
|
||||||
import { Author, Message, Reaction, Shout } from '../graphql/types.gen'
|
import { Author, Message, Reaction, Shout } from '../graphql/types.gen'
|
||||||
|
|
||||||
|
@ -56,7 +56,10 @@ export const NotificationsProvider = (props: { children: JSX.Element }) => {
|
||||||
const loadNotifications = async () => {
|
const loadNotifications = async () => {
|
||||||
const storage = await db()
|
const storage = await db()
|
||||||
const notifications = await storage.getAll('notifications')
|
const notifications = await storage.getAll('notifications')
|
||||||
|
console.log('[context.notifications] Loaded notifications:', notifications)
|
||||||
|
|
||||||
const totalUnreadCount = notifications.filter((notification) => !notification.read).length
|
const totalUnreadCount = notifications.filter((notification) => !notification.read).length
|
||||||
|
console.log('[context.notifications] Total unread count:', totalUnreadCount)
|
||||||
|
|
||||||
setUnreadNotificationsCount(totalUnreadCount)
|
setUnreadNotificationsCount(totalUnreadCount)
|
||||||
setNotificationEntities(
|
setNotificationEntities(
|
||||||
|
@ -74,6 +77,8 @@ export const NotificationsProvider = (props: { children: JSX.Element }) => {
|
||||||
})
|
})
|
||||||
|
|
||||||
const storeNotification = async (notification: ServerNotification) => {
|
const storeNotification = async (notification: ServerNotification) => {
|
||||||
|
console.log('[context.notifications] Storing notification:', notification)
|
||||||
|
|
||||||
const storage = await db()
|
const storage = await db()
|
||||||
const tx = storage.transaction('notifications', 'readwrite')
|
const tx = storage.transaction('notifications', 'readwrite')
|
||||||
const store = tx.objectStore('notifications')
|
const store = tx.objectStore('notifications')
|
||||||
|
@ -85,42 +90,38 @@ export const NotificationsProvider = (props: { children: JSX.Element }) => {
|
||||||
|
|
||||||
const [messageHandler, setMessageHandler] = createSignal<(m: Message) => void>()
|
const [messageHandler, setMessageHandler] = createSignal<(m: Message) => void>()
|
||||||
|
|
||||||
createEffect(() => {
|
createEffect(async () => {
|
||||||
if (isAuthenticated()) {
|
if (isAuthenticated()) {
|
||||||
loadNotifications()
|
loadNotifications()
|
||||||
|
|
||||||
fetchEventSource('https://chat.discours.io/connect', {
|
const token = getToken()
|
||||||
method: 'GET',
|
const eventSource = new EventSource(`https://chat.discours.io/connect/${token}`)
|
||||||
headers: {
|
|
||||||
'Content-Type': 'application/json',
|
eventSource.onmessage = (event) => {
|
||||||
Authorization: 'Bearer ' + getToken()
|
const n: { kind: string; payload: any } = JSON.parse(event.data)
|
||||||
},
|
if (n.kind === 'new_message') {
|
||||||
onmessage(event) {
|
messageHandler()(n.payload)
|
||||||
const n: { kind: string; payload: any } = JSON.parse(event.data)
|
} else {
|
||||||
if (n.kind === 'new_message') {
|
console.log('[context.notifications] Received notification:', n)
|
||||||
messageHandler()(n.payload)
|
storeNotification({
|
||||||
} else {
|
kind: n.kind,
|
||||||
console.log('[context.notifications] Received notification:', n)
|
payload: n.payload,
|
||||||
storeNotification({
|
timestamp: Date.now(),
|
||||||
kind: n.kind,
|
seen: false
|
||||||
payload: n.payload,
|
})
|
||||||
timestamp: Date.now(),
|
|
||||||
seen: false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onclose() {
|
|
||||||
console.log('[context.notifications] sse connection closed by server')
|
|
||||||
},
|
|
||||||
onerror(err) {
|
|
||||||
console.error('[context.notifications] sse connection closed by error', err)
|
|
||||||
throw new Error() // NOTE: simple hack to close the connection
|
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
|
|
||||||
|
eventSource.onerror = (err) => {
|
||||||
|
console.error('[context.notifications] sse connection closed by error', err)
|
||||||
|
eventSource.close()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
const markNotificationAsRead = async (notification: ServerNotification) => {
|
const markNotificationAsRead = async (notification: ServerNotification) => {
|
||||||
|
console.log('[context.notifications] Marking notification as read:', notification)
|
||||||
|
|
||||||
const storage = await db()
|
const storage = await db()
|
||||||
await storage.put('notifications', { ...notification, seen: true })
|
await storage.put('notifications', { ...notification, seen: true })
|
||||||
loadNotifications()
|
loadNotifications()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user