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) &&