
diff --git a/web/src/pages/LoginPage.tsx b/web/src/pages/LoginPage.tsx
index a800e67..62b71a9 100644
--- a/web/src/pages/LoginPage.tsx
+++ b/web/src/pages/LoginPage.tsx
@@ -54,7 +54,7 @@ export function LoginPage() {
initial={{ scale: 0.8, opacity: 0 }}
animate={{ scale: 1, opacity: 1 }}
transition={{ delay: 0.15, type: 'spring', stiffness: 200 }}
- src="/brand/mgo-emby-icon.png"
+ src="/brand/mgo-emby-icon.svg"
alt="MediaStationGo"
className="mb-4 h-14 w-14 rounded-2xl object-contain shadow-sm"
/>
diff --git a/web/src/pages/NotifyChannelsPage.tsx b/web/src/pages/NotifyChannelsPage.tsx
index 47c065c..282279e 100644
--- a/web/src/pages/NotifyChannelsPage.tsx
+++ b/web/src/pages/NotifyChannelsPage.tsx
@@ -197,6 +197,16 @@ const EVENT_OPTIONS = [
{ value: 'system_alert', label: '系统异常通知' },
]
+const EVENT_ALL = '__all__'
+const EVENT_NONE = '__none__'
+type EventMode = 'all' | 'custom' | 'none'
+
+function initialEventMode(events: string[] | undefined): EventMode {
+ if (events?.includes(EVENT_NONE)) return 'none'
+ if (events?.includes(EVENT_ALL) || !events || events.length === 0) return 'all'
+ return 'custom'
+}
+
function ChannelCard({
channel,
onTest,
@@ -252,6 +262,8 @@ function ChannelCard({
}
function eventSummary(events: string[] | undefined): string {
+ if (events?.includes(EVENT_NONE)) return '事件:不推送'
+ if (events?.includes(EVENT_ALL)) return '事件:全部'
if (!events || events.length === 0) return '事件:全部'
const labels = events.map((event) => EVENT_OPTIONS.find((item) => item.value === event)?.label ?? event)
return `事件:${labels.join('、')}`
@@ -324,6 +336,7 @@ function ChannelFormModal({
normalizeInitialConfig(editing?.type ?? 'telegram', editing?.config ?? {}),
)
const [events, setEvents] = useState
(editing?.events ?? [])
+ const [eventMode, setEventMode] = useState(initialEventMode(editing?.events))
const [enabled, setEnabled] = useState(editing?.enabled ?? true)
const [saving, setSaving] = useState(false)
@@ -344,6 +357,11 @@ function ChannelFormModal({
return
}
}
+ const selectedEvents = events.filter((event) => EVENT_OPTIONS.some((item) => item.value === event))
+ if (eventMode === 'custom' && selectedEvents.length === 0) {
+ toast.error('请至少选择一个推送事件,或选择关闭全部推送事件')
+ return
+ }
setSaving(true)
try {
const cleanedConfig = Object.fromEntries(
@@ -354,7 +372,7 @@ function ChannelFormModal({
name: name.trim(),
type: type,
config: cleanedConfig,
- events,
+ events: eventMode === 'all' ? [EVENT_ALL] : eventMode === 'none' ? [EVENT_NONE] : selectedEvents,
enabled,
}
if (editing) {
@@ -378,7 +396,9 @@ function ChannelFormModal({
const toggleEvent = (event: string) => {
setEvents((current) =>
- current.includes(event) ? current.filter((item) => item !== event) : [...current, event],
+ current.includes(event)
+ ? current.filter((item) => item !== event)
+ : [...current.filter((item) => item !== EVENT_ALL && item !== EVENT_NONE), event],
)
}
@@ -622,19 +642,41 @@ function ChannelFormModal({