mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-06-29 16:12:53 +08:00
feat: add desktop notifications and skills updates
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import { useEffect, useMemo, useState } from 'react';
|
||||
import { X } from 'lucide-react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
@@ -18,8 +19,22 @@ import { useSettingsController } from '../hooks/useSettingsController';
|
||||
import { useWebPush } from '../../../hooks/useWebPush';
|
||||
import type { SettingsProps } from '../types/types';
|
||||
|
||||
type DesktopNotificationsState = {
|
||||
enabled: boolean;
|
||||
supported: boolean;
|
||||
connectedCount?: number;
|
||||
targetCount?: number;
|
||||
lastError?: string | null;
|
||||
};
|
||||
|
||||
function Settings({ isOpen, onClose, projects = [], initialTab = 'agents' }: SettingsProps) {
|
||||
const { t } = useTranslation('settings');
|
||||
const desktopNotificationsBridge = useMemo(() => (
|
||||
typeof window === 'undefined'
|
||||
? null
|
||||
: ((window as any).cloudcliDesktopNotifications || null)
|
||||
), []);
|
||||
const [desktopNotificationsState, setDesktopNotificationsState] = useState<DesktopNotificationsState | null>(null);
|
||||
const {
|
||||
activeTab,
|
||||
setActiveTab,
|
||||
@@ -75,6 +90,45 @@ function Settings({ isOpen, onClose, projects = [], initialTab = 'agents' }: Set
|
||||
});
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
if (!desktopNotificationsBridge) return undefined;
|
||||
let mounted = true;
|
||||
desktopNotificationsBridge.getState().then((state: any) => {
|
||||
if (mounted) {
|
||||
setDesktopNotificationsState(state?.desktopNotifications || null);
|
||||
}
|
||||
}).catch(() => {});
|
||||
const unsubscribe = desktopNotificationsBridge.onStateUpdated?.((state: any) => {
|
||||
if (mounted) {
|
||||
setDesktopNotificationsState(state?.desktopNotifications || null);
|
||||
}
|
||||
});
|
||||
return () => {
|
||||
mounted = false;
|
||||
unsubscribe?.();
|
||||
};
|
||||
}, [desktopNotificationsBridge]);
|
||||
|
||||
const handleEnableDesktopNotifications = async () => {
|
||||
if (!desktopNotificationsBridge) return;
|
||||
const state = await desktopNotificationsBridge.update({ enabled: true });
|
||||
setDesktopNotificationsState(state?.desktopNotifications || null);
|
||||
setNotificationPreferences({
|
||||
...notificationPreferences,
|
||||
channels: { ...notificationPreferences.channels, desktop: true },
|
||||
});
|
||||
};
|
||||
|
||||
const handleDisableDesktopNotifications = async () => {
|
||||
if (!desktopNotificationsBridge) return;
|
||||
const state = await desktopNotificationsBridge.update({ enabled: false });
|
||||
setDesktopNotificationsState(state?.desktopNotifications || null);
|
||||
setNotificationPreferences({
|
||||
...notificationPreferences,
|
||||
channels: { ...notificationPreferences.channels, desktop: false },
|
||||
});
|
||||
};
|
||||
|
||||
if (!isOpen) {
|
||||
return null;
|
||||
}
|
||||
@@ -155,6 +209,10 @@ function Settings({ isOpen, onClose, projects = [], initialTab = 'agents' }: Set
|
||||
isPushLoading={isPushLoading}
|
||||
onEnablePush={handleEnablePush}
|
||||
onDisablePush={handleDisablePush}
|
||||
isDesktop={Boolean(desktopNotificationsBridge)}
|
||||
desktopNotifications={desktopNotificationsState}
|
||||
onEnableDesktopNotifications={handleEnableDesktopNotifications}
|
||||
onDisableDesktopNotifications={handleDisableDesktopNotifications}
|
||||
/>
|
||||
)}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user