import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Button, Input, Select, Space, Switch, Tabs, message } from 'antd'; import { BranchesOutlined, BuildOutlined, CloudSyncOutlined, DesktopOutlined, ThunderboltOutlined, } from '@ant-design/icons'; import type { AllSetting } from '@/models/setting'; import { SettingListItem } from '@/components/ui'; import { buildHappPresetDeeplink } from './happPresets'; import HappRoutingEditorModal from './HappRoutingEditorModal'; import { catTabLabel } from './catTabLabel'; interface HappSettingsContentProps { allSetting: AllSetting; updateSetting: (patch: Partial) => void; isMobile: boolean; remoteSourceBadge: (val: string) => React.ReactNode; } export default function HappSettingsContent({ allSetting, updateSetting, isMobile, remoteSourceBadge, }: HappSettingsContentProps) { const { t } = useTranslation(); const [messageApi, messageContextHolder] = message.useMessage(); // Generator choices stay local until Apply updates the draft; page Save persists it. const [selectedPreset, setSelectedPreset] = useState('iran-bypass'); const [includeAdblock, setIncludeAdblock] = useState(false); const [isModalOpen, setIsModalOpen] = useState(false); const applyPreset = () => { const payload = buildHappPresetDeeplink(selectedPreset, includeAdblock); if (payload) { updateSetting({ subRoutingRules: payload }); messageApi.success(t('pages.settings.subHappPresetApplied')); } }; const handleBuildDeeplink = (deeplink: string) => { updateSetting({ subRoutingRules: deeplink }); setIsModalOpen(false); messageApi.success(t('pages.settings.subHappDeeplinkGenerated')); }; return ( <> {messageContextHolder} updateSetting({ subHappAutoDetect: v })} /> updateSetting({ happLinkEnable: v })} /> , t('pages.settings.subHappGroupRouting'), isMobile, ), children: ( <> updateSetting({ subEnableRouting: v })} /> updateSetting({ subHappSubInfoText: e.target.value })} /> updateSetting({ subHappSubInfoButtonText: e.target.value })} /> updateSetting({ subHappSubInfoButtonLink: e.target.value })} /> updateSetting({ subHappSubExpire: v })} /> updateSetting({ subHappSubExpireButtonLink: e.target.value })} /> updateSetting({ subHappNotificationExpire: v })} /> updateSetting({ subHappColorProfile: e.target.value })} /> ), }, { key: 'network', label: catTabLabel( , t('pages.settings.subHappGroupNetwork'), isMobile, ), children: ( <> updateSetting({ subHappTunType: v })} options={[ { value: 'singbox', label: t('pages.settings.subHappTunTypeSingbox') }, { value: 'tun2proxy', label: t('pages.settings.subHappTunTypeTun2proxy') }, { value: 'default', label: t('pages.settings.subHappTunTypeDefault') }, { value: 'xray', label: t('pages.settings.subHappTunTypeXray') }, ]} /> updateSetting({ subHappExcludeRoutes: e.target.value })} /> updateSetting({ subHappExcludeApns: v })} /> updateSetting({ subHappLocalProxyAuth: v })} options={[ { value: 'auto', label: t('pages.settings.subHappLocalProxyAuthAuto') }, { value: 'disable', label: t('pages.settings.subHappLocalProxyAuthDisable') }, { value: '', label: t('pages.settings.subHappLocalProxyAuthUnset') }, ]} /> updateSetting({ subHappAutoConnect: v })} /> updateSetting({ subHappPerAppMode: v })} options={[ { value: 'off', label: t('pages.settings.subHappPerAppOff') }, { value: 'on', label: t('pages.settings.subHappPerAppOn') }, { value: 'bypass', label: t('pages.settings.subHappPerAppBypass') }, ]} /> updateSetting({ subHappPerAppList: e.target.value })} /> ), }, { key: 'failover', label: catTabLabel( , t('pages.settings.subHappGroupFailover'), isMobile, ), children: ( <> updateSetting({ subHappProviderId: e.target.value })} /> updateSetting({ subHappNewUrl: e.target.value })} /> updateSetting({ subHappFallbackUrl: e.target.value })} /> updateSetting({ subHappAlwaysHwid: v })} /> ), }, ]} /> {/* Mount per opening so canceled edits are discarded and the latest parent draft is loaded. */} {isModalOpen ? ( setIsModalOpen(false)} onGenerate={handleBuildDeeplink} /> ) : null} ); }