Skip to content

Commit 3fb5e42

Browse files
committed
feat: add subscription announce settings
1 parent 576d6ee commit 3fb5e42

File tree

6 files changed

+77
-1
lines changed

6 files changed

+77
-1
lines changed

dashboard/public/statics/locales/en.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,12 @@
200200
"profileTitle": "Profile Title",
201201
"profileTitlePlaceholder": "My VPN Service",
202202
"profileTitleDescription": "Display name for the subscription profile",
203+
"announce": "Announcement",
204+
"announcePlaceholder": "Service maintenance starts at 02:00",
205+
"announceDescription": "Short message shown to users in supported subscription clients",
206+
"announceUrl": "Announcement URL",
207+
"announceUrlPlaceholder": "https://status.example.com",
208+
"announceUrlDescription": "Optional link with more information about the announcement",
203209
"hostStatusFilter": "Host Status Filter",
204210
"hostStatusFilterDescription": "Filter hosts based on their status"
205211
},

dashboard/public/statics/locales/fa.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,12 @@
107107
"profileTitle": "عنوان پروفایل",
108108
"profileTitlePlaceholder": "سرویس VPN من",
109109
"profileTitleDescription": "نام نمایشی برای پروفایل اشتراک",
110+
"announce": "متن اطلاعیه",
111+
"announcePlaceholder": "سرویس امشب ساعت ۰۲:۰۰ در دسترس نیست",
112+
"announceDescription": "پیام کوتاهی که در کلاینت‌های سازگار نمایش داده می‌شود",
113+
"announceUrl": "آدرس اطلاعیه",
114+
"announceUrlPlaceholder": "https://status.example.com",
115+
"announceUrlDescription": "لینک اختیاری برای جزئیات بیشتر اطلاعیه",
110116
"hostStatusFilter": "فیلتر وضعیت هاست",
111117
"hostStatusFilterDescription": "فیلتر کردن هاست‌ها بر اساس وضعیت آن‌ها"
112118
},

dashboard/public/statics/locales/ru.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,12 @@
213213
"profileTitle": "Название профиля",
214214
"profileTitlePlaceholder": "Мой VPN сервис",
215215
"profileTitleDescription": "Отображаемое имя для профиля подписки",
216+
"announce": "Объявление",
217+
"announcePlaceholder": "Технические работы начнутся в 02:00",
218+
"announceDescription": "Короткое сообщение, показываемое пользователям в поддерживаемых клиентах подписки",
219+
"announceUrl": "Ссылка на объявление",
220+
"announceUrlPlaceholder": "https://status.example.com",
221+
"announceUrlDescription": "Необязательная ссылка с дополнительной информацией об объявлении",
216222
"hostStatusFilter": "Фильтр статуса хоста",
217223
"hostStatusFilterDescription": "Фильтровать хосты на основе их статуса"
218224
},

dashboard/public/statics/locales/zh.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,12 @@
179179
"profileTitle": "配置文件标题",
180180
"profileTitlePlaceholder": "输入配置文件标题",
181181
"profileTitleDescription": "显示在客户端中的配置文件名称",
182+
"announce": "公告内容",
183+
"announcePlaceholder": "服务将于 02:00 进行维护",
184+
"announceDescription": "在支持的订阅客户端中展示给用户的简短消息",
185+
"announceUrl": "公告链接",
186+
"announceUrlPlaceholder": "https://status.example.com",
187+
"announceUrlDescription": "可选的链接,用于提供更多公告细节",
182188
"hostStatusFilter": "主机状态过滤",
183189
"hostStatusFilterDescription": "仅包含活跃主机在订阅中"
184190
},

dashboard/src/pages/_dashboard.settings.subscriptions.tsx

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { Switch } from '@/components/ui/switch'
1010
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'
1111
import { Separator } from '@/components/ui/separator'
1212
import { Badge } from '@/components/ui/badge'
13-
import { Plus, Trash2, Filter, FileText, Link, Clock, HelpCircle, User, Settings, Code, FileCode2, Sword, Shield, Lock, GripVertical, RotateCcw } from 'lucide-react'
13+
import { Plus, Trash2, Filter, FileText, Link, Clock, HelpCircle, User, Settings, Code, FileCode2, Sword, Shield, Lock, GripVertical, RotateCcw, Megaphone, ExternalLink } from 'lucide-react'
1414
import { useSettingsContext } from './_dashboard.settings'
1515
import { ConfigFormat } from '@/service/api'
1616
import { toast } from 'sonner'
@@ -28,6 +28,8 @@ const subscriptionSchema = z.object({
2828
update_interval: z.number().min(1, 'Update interval must be at least 1 hour').max(168, 'Update interval cannot exceed 168 hours (1 week)').optional(),
2929
support_url: z.string().url('Please enter a valid URL').optional().or(z.literal('')),
3030
profile_title: z.string().optional(),
31+
announce: z.string().max(128, 'Announcement must be 128 characters or less').optional(),
32+
announce_url: z.string().url('Please enter a valid URL').optional().or(z.literal('')),
3133
host_status_filter: z.boolean(),
3234
rules: z.array(
3335
z.object({
@@ -432,6 +434,8 @@ export default function SubscriptionSettings() {
432434
update_interval: 24,
433435
support_url: '',
434436
profile_title: '',
437+
announce: '',
438+
announce_url: '',
435439
host_status_filter: false,
436440
rules: [],
437441
applications: [],
@@ -517,6 +521,8 @@ export default function SubscriptionSettings() {
517521
update_interval: subscriptionData.update_interval || 24,
518522
support_url: subscriptionData.support_url || '',
519523
profile_title: subscriptionData.profile_title || '',
524+
announce: subscriptionData.announce || '',
525+
announce_url: subscriptionData.announce_url || '',
520526
host_status_filter: subscriptionData.host_status_filter || false,
521527
rules: subscriptionData.rules || [],
522528
applications: subscriptionData.applications || [],
@@ -570,6 +576,8 @@ export default function SubscriptionSettings() {
570576
url_prefix: data.url_prefix?.trim() || undefined,
571577
support_url: data.support_url?.trim() || undefined,
572578
profile_title: data.profile_title?.trim() || undefined,
579+
announce: data.announce?.trim() || undefined,
580+
announce_url: data.announce_url?.trim() || undefined,
573581
// Include processed applications
574582
applications: processedApplications,
575583
},
@@ -643,6 +651,8 @@ export default function SubscriptionSettings() {
643651
update_interval: subscriptionData.update_interval || 24,
644652
support_url: subscriptionData.support_url || '',
645653
profile_title: subscriptionData.profile_title || '',
654+
announce: subscriptionData.announce || '',
655+
announce_url: subscriptionData.announce_url || '',
646656
host_status_filter: subscriptionData.host_status_filter || false,
647657
rules: subscriptionData.rules || [],
648658
applications: subscriptionData.applications || [],
@@ -898,6 +908,42 @@ export default function SubscriptionSettings() {
898908
</FormItem>
899909
)}
900910
/>
911+
912+
<FormField
913+
control={form.control}
914+
name="announce"
915+
render={({ field }) => (
916+
<FormItem className="space-y-2">
917+
<FormLabel className="flex items-center gap-2 text-sm font-medium">
918+
<Megaphone className="h-4 w-4" />
919+
{t('settings.subscriptions.general.announce')}
920+
</FormLabel>
921+
<FormControl>
922+
<Input maxLength={128} placeholder={t('settings.subscriptions.general.announcePlaceholder')} {...field} />
923+
</FormControl>
924+
<FormDescription className="text-sm text-muted-foreground">{t('settings.subscriptions.general.announceDescription')}</FormDescription>
925+
<FormMessage />
926+
</FormItem>
927+
)}
928+
/>
929+
930+
<FormField
931+
control={form.control}
932+
name="announce_url"
933+
render={({ field }) => (
934+
<FormItem className="space-y-2">
935+
<FormLabel className="flex items-center gap-2 text-sm font-medium">
936+
<ExternalLink className="h-4 w-4" />
937+
{t('settings.subscriptions.general.announceUrl')}
938+
</FormLabel>
939+
<FormControl>
940+
<Input type="url" placeholder={t('settings.subscriptions.general.announceUrlPlaceholder')} {...field} className="font-mono" />
941+
</FormControl>
942+
<FormDescription className="text-sm text-muted-foreground">{t('settings.subscriptions.general.announceUrlDescription')}</FormDescription>
943+
<FormMessage />
944+
</FormItem>
945+
)}
946+
/>
901947
</div>
902948

903949
<FormField

dashboard/src/service/api/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -890,6 +890,9 @@ export interface SubscriptionOutput {
890890
update_interval?: number
891891
support_url?: string
892892
profile_title?: string
893+
/** @maxLength 128 */
894+
announce?: string
895+
announce_url?: string
893896
host_status_filter: boolean
894897
rules: SubRule[]
895898
manual_sub_request?: SubFormatEnable
@@ -901,6 +904,9 @@ export interface SubscriptionInput {
901904
update_interval?: number
902905
support_url?: string
903906
profile_title?: string
907+
/** @maxLength 128 */
908+
announce?: string
909+
announce_url?: string
904910
host_status_filter: boolean
905911
rules: SubRule[]
906912
manual_sub_request?: SubFormatEnable

0 commit comments

Comments
 (0)