feat: add public chat links settings page

This commit is contained in:
CREDO23 2026-02-02 16:40:11 +02:00
parent ea2dd20a78
commit 67f797232e
4 changed files with 29 additions and 2 deletions

View file

@ -6,6 +6,7 @@ import {
Brain, Brain,
ChevronRight, ChevronRight,
FileText, FileText,
Globe,
type LucideIcon, type LucideIcon,
Menu, Menu,
MessageSquare, MessageSquare,
@ -16,6 +17,7 @@ import { AnimatePresence, motion } from "motion/react";
import { useParams, useRouter } from "next/navigation"; import { useParams, useRouter } from "next/navigation";
import { useTranslations } from "next-intl"; import { useTranslations } from "next-intl";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import { PublicChatSnapshotsManager } from "@/components/public-chat-snapshots/public-chat-snapshots-manager";
import { GeneralSettingsManager } from "@/components/settings/general-settings-manager"; import { GeneralSettingsManager } from "@/components/settings/general-settings-manager";
import { LLMRoleManager } from "@/components/settings/llm-role-manager"; import { LLMRoleManager } from "@/components/settings/llm-role-manager";
import { ModelConfigManager } from "@/components/settings/model-config-manager"; import { ModelConfigManager } from "@/components/settings/model-config-manager";
@ -56,6 +58,12 @@ const settingsNavItems: SettingsNavItem[] = [
descriptionKey: "nav_system_instructions_desc", descriptionKey: "nav_system_instructions_desc",
icon: MessageSquare, icon: MessageSquare,
}, },
{
id: "public-links",
labelKey: "nav_public_links",
descriptionKey: "nav_public_links_desc",
icon: Globe,
},
]; ];
function SettingsSidebar({ function SettingsSidebar({
@ -276,6 +284,9 @@ function SettingsContent({
{activeSection === "models" && <ModelConfigManager searchSpaceId={searchSpaceId} />} {activeSection === "models" && <ModelConfigManager searchSpaceId={searchSpaceId} />}
{activeSection === "roles" && <LLMRoleManager searchSpaceId={searchSpaceId} />} {activeSection === "roles" && <LLMRoleManager searchSpaceId={searchSpaceId} />}
{activeSection === "prompts" && <PromptConfigManager searchSpaceId={searchSpaceId} />} {activeSection === "prompts" && <PromptConfigManager searchSpaceId={searchSpaceId} />}
{activeSection === "public-links" && (
<PublicChatSnapshotsManager searchSpaceId={searchSpaceId} />
)}
</motion.div> </motion.div>
</AnimatePresence> </AnimatePresence>
</div> </div>

View file

@ -1,7 +1,7 @@
"use client"; "use client";
import { useAtomValue } from "jotai"; import { useAtomValue } from "jotai";
import { Globe, Info } from "lucide-react"; import { AlertCircle, Globe, Info } from "lucide-react";
import { useCallback, useMemo, useState } from "react"; import { useCallback, useMemo, useState } from "react";
import { toast } from "sonner"; import { toast } from "sonner";
import { deletePublicChatSnapshotMutationAtom } from "@/atoms/public-chat-snapshots/public-chat-snapshots-mutation.atoms"; import { deletePublicChatSnapshotMutationAtom } from "@/atoms/public-chat-snapshots/public-chat-snapshots-mutation.atoms";
@ -23,7 +23,7 @@ export function PublicChatSnapshotsManager({
const [deletingId, setDeletingId] = useState<number | undefined>(); const [deletingId, setDeletingId] = useState<number | undefined>();
// Data fetching // Data fetching
const { data: snapshotsData, isLoading, refetch } = useAtomValue(publicChatSnapshotsAtom); const { data: snapshotsData, isLoading, isError, refetch } = useAtomValue(publicChatSnapshotsAtom);
// Permissions // Permissions
const { data: access } = useAtomValue(myAccessAtom); const { data: access } = useAtomValue(myAccessAtom);
@ -84,6 +84,18 @@ export function PublicChatSnapshotsManager({
); );
} }
// Error state
if (isError) {
return (
<Alert variant="destructive">
<AlertCircle className="h-4 w-4" />
<AlertDescription>
Failed to load public chat links. Please try again later.
</AlertDescription>
</Alert>
);
}
// Permission denied // Permission denied
if (!canView) { if (!canView) {
return ( return (

View file

@ -731,6 +731,8 @@
"nav_role_assignments_desc": "Assign configs to agent roles", "nav_role_assignments_desc": "Assign configs to agent roles",
"nav_system_instructions": "System Instructions", "nav_system_instructions": "System Instructions",
"nav_system_instructions_desc": "SearchSpace-wide AI instructions", "nav_system_instructions_desc": "SearchSpace-wide AI instructions",
"nav_public_links": "Public Chat Links",
"nav_public_links_desc": "Manage publicly shared chat links",
"general_name_label": "Name", "general_name_label": "Name",
"general_name_placeholder": "Enter search space name", "general_name_placeholder": "Enter search space name",
"general_name_description": "A unique name for your search space.", "general_name_description": "A unique name for your search space.",

View file

@ -716,6 +716,8 @@
"nav_role_assignments_desc": "为代理角色分配配置", "nav_role_assignments_desc": "为代理角色分配配置",
"nav_system_instructions": "系统指令", "nav_system_instructions": "系统指令",
"nav_system_instructions_desc": "搜索空间级别的 AI 指令", "nav_system_instructions_desc": "搜索空间级别的 AI 指令",
"nav_public_links": "公开聊天链接",
"nav_public_links_desc": "管理公开分享的聊天链接",
"general_name_label": "名称", "general_name_label": "名称",
"general_name_placeholder": "输入搜索空间名称", "general_name_placeholder": "输入搜索空间名称",
"general_name_description": "您的搜索空间的唯一名称。", "general_name_description": "您的搜索空间的唯一名称。",