feat(features): 功能开放 - 增加自定义渠道开关

This commit is contained in:
MasterChiefCN
2026-08-15 13:25:50 +08:00
parent b2a7eef35d
commit f83ff03df3
16 changed files with 154 additions and 30 deletions

View File

@@ -34,17 +34,24 @@ export default function SettingsPage() {
const navigate = useNavigate();
const [searchParams, setSearchParams] = useSearchParams();
const requestedSection = searchParams.get("section");
const [activeTab, setActiveTab] = useState<ConfigSectionKey>(isConfigSection(requestedSection) ? requestedSection : "channels");
const customChannelsEnabled = useUserStore((state) => state.features.customChannelsEnabled);
const initialSection = isConfigSection(requestedSection) ? requestedSection : customChannelsEnabled ? "channels" : "models";
const [activeTab, setActiveTab] = useState<ConfigSectionKey>(initialSection === "channels" && !customChannelsEnabled ? "models" : initialSection);
const config = useConfigStore((state) => state.config);
const effectiveConfig = useEffectiveConfig();
const updateConfig = useConfigStore((state) => state.updateConfig);
const shouldPromptContinue = searchParams.get("continue") === "1";
const userId = useUserStore((state) => state.user?.id);
const userChannels = config.channels.filter((channel) => channel.scope !== "system");
const visibleConfigSections = customChannelsEnabled ? configSections : configSections.filter((section) => section.key !== "channels");
useEffect(() => {
if (isConfigSection(requestedSection)) setActiveTab(requestedSection);
}, [requestedSection]);
if (isConfigSection(requestedSection) && (requestedSection !== "channels" || customChannelsEnabled)) {
setActiveTab(requestedSection);
return;
}
if (!customChannelsEnabled) setActiveTab((current) => (current === "channels" ? "models" : current));
}, [customChannelsEnabled, requestedSection]);
useEffect(() => {
if (!userId) return;
@@ -65,7 +72,7 @@ export default function SettingsPage() {
};
const finishConfig = () => {
const invalidChannel = userChannels.find((channel) => channelValidationError(channel));
const invalidChannel = customChannelsEnabled ? userChannels.find((channel) => channelValidationError(channel)) : undefined;
if (invalidChannel) {
selectSection("channels");
message.warning(`${invalidChannel.name || "未命名渠道"}:${channelValidationError(invalidChannel)}`);
@@ -73,9 +80,9 @@ export default function SettingsPage() {
return;
}
const hasReadyLocalRuntime = effectiveConfig.channels.some((channel) => channel.transport === "local-runtime" && channel.enabled !== false && Boolean(channel.localModels?.length));
if (!config.channels.some(isChannelReady) && !hasReadyLocalRuntime) {
selectSection("channels");
message.error(shouldPromptContinue ? "请先完成至少一个渠道的 Base URL、API Key 和模型配置" : "当前没有可用渠道,请先完成连接信息和模型配置");
if (!effectiveConfig.channels.some(isChannelReady) && !hasReadyLocalRuntime) {
selectSection(customChannelsEnabled ? "channels" : "models");
message.error(customChannelsEnabled ? (shouldPromptContinue ? "请先完成至少一个渠道的 Base URL、API Key 和模型配置" : "当前没有可用渠道,请先完成连接信息和模型配置") : "当前没有可用的系统模型,请联系管理员配置系统渠道");
return;
}
message.success("配置已保存,正在返回创作页面");
@@ -190,7 +197,7 @@ export default function SettingsPage() {
<div className="settings-library-frame flex min-h-0 flex-1 flex-col md:flex-row">
<aside className="settings-nav-panel w-full shrink-0 md:w-[200px]">
<nav className="thin-scrollbar flex gap-1 overflow-x-auto p-2 md:block md:space-y-1 md:p-2.5" aria-label="配置分类">
{configSections.map((item) => {
{visibleConfigSections.map((item) => {
const selected = item.key === activeTab;
return (
<button