diff --git a/web/public/static/langs/en.json b/web/public/static/langs/en.json index ee6197c5..0f7c9756 100644 --- a/web/public/static/langs/en.json +++ b/web/public/static/langs/en.json @@ -26,6 +26,7 @@ "alert_not_supported_description": "Notifications are not supported in your browser.", "notifications_list": "Notifications list", "notifications_list_item": "Notification", + "notifications_mark_read": "Mark as read", "notifications_delete": "Delete notification", "notifications_copied_to_clipboard": "Copied to clipboard", "notifications_tags": "Tags", diff --git a/web/src/app/SubscriptionManager.js b/web/src/app/SubscriptionManager.js index b485383d..6384aa82 100644 --- a/web/src/app/SubscriptionManager.js +++ b/web/src/app/SubscriptionManager.js @@ -115,6 +115,12 @@ class SubscriptionManager { .delete(); } + async markNotificationRead(notificationId) { + await db.notifications + .where({id: notificationId, new: 1}) + .modify({new: 0}); + } + async markNotificationsRead(subscriptionId) { await db.notifications .where({subscriptionId: subscriptionId, new: 1}) diff --git a/web/src/app/db.js b/web/src/app/db.js index 7c82be31..7c983090 100644 --- a/web/src/app/db.js +++ b/web/src/app/db.js @@ -8,9 +8,9 @@ import Dexie from 'dexie'; const db = new Dexie('ntfy'); -db.version(1).stores({ +db.version(2).stores({ subscriptions: '&id,baseUrl', - notifications: '&id,subscriptionId,time,new,[subscriptionId+new]', // compound key for query performance + notifications: '&id,subscriptionId,time,new,[subscriptionId+new],[id+new]', // compound keys for query performance users: '&baseUrl,username', prefs: '&key' }); diff --git a/web/src/components/Notifications.js b/web/src/components/Notifications.js index b0bbae82..4d9043e2 100644 --- a/web/src/components/Notifications.js +++ b/web/src/components/Notifications.js @@ -26,6 +26,7 @@ import { unmatchedTags } from "../app/utils"; import IconButton from "@mui/material/IconButton"; +import CheckIcon from '@mui/icons-material/Check'; import CloseIcon from '@mui/icons-material/Close'; import {LightboxBackdrop, Paragraph, VerticallyCenteredContainer} from "./styles"; import {useLiveQuery} from "dexie-react-hooks"; @@ -135,6 +136,10 @@ const NotificationItem = (props) => { console.log(`[Notifications] Deleting notification ${notification.id}`); await subscriptionManager.deleteNotification(notification.id) } + const handleMarkRead = async () => { + console.log(`[Notifications] Marking notification ${notification.id} as read`); + await subscriptionManager.markNotificationRead(notification.id) + } const handleCopy = (s) => { navigator.clipboard.writeText(s); props.onShowSnack(); @@ -150,6 +155,12 @@ const NotificationItem = (props) => { + {notification.new === 1 && + + + + + } {date} {[1,2,4,5].includes(notification.priority) &&