diff --git a/apps/web/components/settings/account.tsx b/apps/web/components/settings/account.tsx index 9d61067b..ffea566c 100644 --- a/apps/web/components/settings/account.tsx +++ b/apps/web/components/settings/account.tsx @@ -39,6 +39,7 @@ import { useQueryState } from "nuqs" import { useEffect, useMemo, useRef, useState } from "react" import { toast } from "sonner" import { useContainerTags } from "@/hooks/use-container-tags" +import { useHasCompanyBrain } from "@/hooks/use-company-brain" import { PopoverAnchor } from "@ui/components/popover" import { WorkspacePersona } from "@/components/settings/workspace-persona" import { OrgPlanBadge } from "@/components/org-plan-badge" @@ -135,6 +136,7 @@ function isPendingInvitation(invitation: { export default function Account() { const { user, org, refetchActiveOrg, refetchOrganizations } = useAuth() const autumn = useCustomer() + const isCompanyBrain = useHasCompanyBrain() const { currentPlan, searchesUsed } = useTokenUsage(autumn) const { data: orgSummaries } = useOrgSummaries() const orgSummary = orgSummaries?.find((s) => s.orgId === org?.id) @@ -614,7 +616,7 @@ export default function Account() { - {canManageTeam && } + {canManageTeam && isCompanyBrain && } diff --git a/apps/web/components/settings/workspace-persona.tsx b/apps/web/components/settings/workspace-persona.tsx index c1f29f5f..d26e17d8 100644 --- a/apps/web/components/settings/workspace-persona.tsx +++ b/apps/web/components/settings/workspace-persona.tsx @@ -1,36 +1,70 @@ "use client" import { LoaderIcon } from "lucide-react" -import { useEffect, useState } from "react" +import { useEffect, useRef, useState } from "react" import { useOrgSettings, useUpdateOrgSettings } from "@/hooks/use-org-settings" import { dmSans125ClassName, dmSansClassName } from "@/lib/fonts" import { cn } from "@lib/utils" +import { useAuth } from "@lib/auth-context" -function SectionTitle({ children }: { children: React.ReactNode }) { +const DESCRIPTION_ID = "workspace-persona-description" +const COUNTER_ID = "workspace-persona-counter" +const HEADING_ID = "workspace-persona-heading" + +function SectionHeading({ children }: { children: React.ReactNode }) { return ( -

{children} -

+ + ) +} + +function PersonaHeader() { + return ( +
+ Workspace Persona +

+ Guide how Company Brain communicates and works with your workspace. +

+
) } export function WorkspacePersona() { - const { data: settings, isLoading, isError } = useOrgSettings() + const { org } = useAuth() + const settingsQuery = useOrgSettings() const updateSettings = useUpdateOrgSettings() const [persona, setPersona] = useState("") + const syncedPersona = useRef<{ orgId: string; value: string } | null>(null) - const savedPersona = settings?.workspacePersona ?? "" + const savedPersona = settingsQuery.data?.workspacePersona ?? "" const dirty = persona.trim() !== savedPersona.trim() - const settingsReady = !isLoading && !isError useEffect(() => { - setPersona(settings?.workspacePersona ?? "") - }, [settings?.workspacePersona]) + if (!settingsQuery.data) return + + const nextPersona = settingsQuery.data.workspacePersona ?? "" + const orgId = org?.id ?? "" + const previous = syncedPersona.current + + setPersona((current) => { + if (!previous || previous.orgId !== orgId) return nextPersona + return current === previous.value ? nextPersona : current + }) + syncedPersona.current = { orgId, value: nextPersona } + }, [org?.id, settingsQuery.data]) const handleSave = () => { updateSettings.mutate({ @@ -39,63 +73,92 @@ export function WorkspacePersona() { } return ( -
-
- Workspace Persona -

+ + + {settingsQuery.isLoading ? ( +

- Guide how Company Brain communicates and works with your workspace. -

-
- -
-