mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-03-06 22:47:36 +00:00
fix: notifications orchestrator and add a notification when first enabled
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import express from 'express';
|
import express from 'express';
|
||||||
import { apiKeysDb, credentialsDb, notificationPreferencesDb, pushSubscriptionsDb } from '../database/db.js';
|
import { apiKeysDb, credentialsDb, notificationPreferencesDb, pushSubscriptionsDb } from '../database/db.js';
|
||||||
import { getPublicKey } from '../services/vapid-keys.js';
|
import { getPublicKey } from '../services/vapid-keys.js';
|
||||||
|
import { createNotificationEvent, notifyUserIfEnabled } from '../services/notification-orchestrator.js';
|
||||||
|
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
|
||||||
@@ -221,7 +222,27 @@ router.post('/push/subscribe', async (req, res) => {
|
|||||||
return res.status(400).json({ error: 'Missing subscription fields' });
|
return res.status(400).json({ error: 'Missing subscription fields' });
|
||||||
}
|
}
|
||||||
pushSubscriptionsDb.saveSubscription(req.user.id, endpoint, keys.p256dh, keys.auth);
|
pushSubscriptionsDb.saveSubscription(req.user.id, endpoint, keys.p256dh, keys.auth);
|
||||||
|
|
||||||
|
// Enable webPush in preferences so the confirmation goes through the full pipeline
|
||||||
|
const currentPrefs = notificationPreferencesDb.getPreferences(req.user.id);
|
||||||
|
if (!currentPrefs?.channels?.webPush) {
|
||||||
|
notificationPreferencesDb.updatePreferences(req.user.id, {
|
||||||
|
...currentPrefs,
|
||||||
|
channels: { ...currentPrefs?.channels, webPush: true },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
res.json({ success: true });
|
res.json({ success: true });
|
||||||
|
|
||||||
|
// Send a confirmation push through the full notification pipeline
|
||||||
|
const event = createNotificationEvent({
|
||||||
|
provider: 'system',
|
||||||
|
kind: 'info',
|
||||||
|
code: 'push.enabled',
|
||||||
|
meta: { message: 'Push notifications are now enabled!' },
|
||||||
|
severity: 'info'
|
||||||
|
});
|
||||||
|
notifyUserIfEnabled({ userId: req.user.id, event });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error saving push subscription:', error);
|
console.error('Error saving push subscription:', error);
|
||||||
res.status(500).json({ error: 'Failed to save push subscription' });
|
res.status(500).json({ error: 'Failed to save push subscription' });
|
||||||
@@ -235,6 +256,16 @@ router.post('/push/unsubscribe', async (req, res) => {
|
|||||||
return res.status(400).json({ error: 'Missing endpoint' });
|
return res.status(400).json({ error: 'Missing endpoint' });
|
||||||
}
|
}
|
||||||
pushSubscriptionsDb.removeSubscription(endpoint);
|
pushSubscriptionsDb.removeSubscription(endpoint);
|
||||||
|
|
||||||
|
// Disable webPush in preferences to match subscription state
|
||||||
|
const currentPrefs = notificationPreferencesDb.getPreferences(req.user.id);
|
||||||
|
if (currentPrefs?.channels?.webPush) {
|
||||||
|
notificationPreferencesDb.updatePreferences(req.user.id, {
|
||||||
|
...currentPrefs,
|
||||||
|
channels: { ...currentPrefs.channels, webPush: false },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
res.json({ success: true });
|
res.json({ success: true });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error removing push subscription:', error);
|
console.error('Error removing push subscription:', error);
|
||||||
|
|||||||
@@ -67,7 +67,8 @@ function buildPushBody(event) {
|
|||||||
: 'Action Required: A tool needs your approval',
|
: 'Action Required: A tool needs your approval',
|
||||||
'run.stopped': event.meta?.stopReason || 'Run Stopped: The run has stopped',
|
'run.stopped': event.meta?.stopReason || 'Run Stopped: The run has stopped',
|
||||||
'run.failed': event.meta?.error ? `Run Failed: ${event.meta.error}` : 'Run Failed: The run encountered an error',
|
'run.failed': event.meta?.error ? `Run Failed: ${event.meta.error}` : 'Run Failed: The run encountered an error',
|
||||||
'agent.notification': event.meta?.message ? String(event.meta.message) : 'You have a new notification'
|
'agent.notification': event.meta?.message ? String(event.meta.message) : 'You have a new notification',
|
||||||
|
'push.enabled': 'Push notifications are now enabled!'
|
||||||
};
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -96,6 +96,7 @@ function Settings({ isOpen, onClose, projects = [], initialTab = 'agents' }: Set
|
|||||||
|
|
||||||
const handleEnablePush = async () => {
|
const handleEnablePush = async () => {
|
||||||
await pushSubscribe();
|
await pushSubscribe();
|
||||||
|
// Server sets webPush: true in preferences on subscribe; sync local state
|
||||||
setNotificationPreferences({
|
setNotificationPreferences({
|
||||||
...notificationPreferences,
|
...notificationPreferences,
|
||||||
channels: { ...notificationPreferences.channels, webPush: true },
|
channels: { ...notificationPreferences.channels, webPush: true },
|
||||||
@@ -104,6 +105,7 @@ function Settings({ isOpen, onClose, projects = [], initialTab = 'agents' }: Set
|
|||||||
|
|
||||||
const handleDisablePush = async () => {
|
const handleDisablePush = async () => {
|
||||||
await pushUnsubscribe();
|
await pushUnsubscribe();
|
||||||
|
// Server sets webPush: false in preferences on unsubscribe; sync local state
|
||||||
setNotificationPreferences({
|
setNotificationPreferences({
|
||||||
...notificationPreferences,
|
...notificationPreferences,
|
||||||
channels: { ...notificationPreferences.channels, webPush: false },
|
channels: { ...notificationPreferences.channels, webPush: false },
|
||||||
|
|||||||
Reference in New Issue
Block a user