feat(ee): ai chat (#2098)

* feat: ai chat

* feat: ai chat

* sync

* cleanup

* view space button
This commit is contained in:
Philip Okugbe
2026-04-10 19:23:47 +01:00
committed by GitHub
parent da9b43681e
commit 57efb91bd3
63 changed files with 4149 additions and 48 deletions
@@ -0,0 +1,28 @@
.wrapper {
display: flex;
flex-direction: column;
align-items: center;
padding: var(--mantine-spacing-xl) var(--mantine-spacing-md) var(--mantine-spacing-lg);
}
.heading {
font-size: 1.75rem;
font-weight: 600;
color: light-dark(var(--mantine-color-gray-8), var(--mantine-color-dark-0));
text-align: center;
margin: 0;
line-height: 1.2;
}
.subtitle {
font-size: var(--mantine-font-size-sm);
color: light-dark(var(--mantine-color-gray-6), var(--mantine-color-dark-2));
text-align: center;
margin-top: 6px;
margin-bottom: var(--mantine-spacing-lg);
}
.inputContainer {
width: 100%;
max-width: 640px;
}
@@ -0,0 +1,60 @@
import { useAtomValue } from "jotai";
import { useNavigate } from "react-router-dom";
import { useTranslation } from "react-i18next";
import { workspaceAtom } from "@/features/user/atoms/current-user-atom.ts";
import ChatInput from "@/ee/ai-chat/components/chat-input";
import type {
ChatAttachment,
PageMention,
} from "@/ee/ai-chat/types/ai-chat.types";
import classes from "./home-ai-prompt.module.css";
export type HomeAiPromptInitialState = {
initialContent: string;
initialMentions: PageMention[];
initialAttachments: ChatAttachment[];
};
export default function HomeAiPrompt() {
const { t } = useTranslation();
const navigate = useNavigate();
const workspace = useAtomValue(workspaceAtom);
const aiChatEnabled = workspace?.settings?.ai?.chat === true;
if (!aiChatEnabled) return null;
const handleSend = (
content: string,
mentions: PageMention[],
attachments: ChatAttachment[],
) => {
if (!content.trim() && attachments.length === 0) return;
const state: HomeAiPromptInitialState = {
initialContent: content,
initialMentions: mentions,
initialAttachments: attachments,
};
navigate("/ai", { state });
};
return (
<div className={classes.wrapper}>
<h1 className={classes.heading}>
{t("Welcome to {{name}}", { name: workspace?.name ?? "Docmost" })}
</h1>
<div className={classes.subtitle}>
{t("Ask anything or search your workspace")}
</div>
<div className={classes.inputContainer}>
<ChatInput
isStreaming={false}
onSend={handleSend}
onStop={() => {}}
placeholder={t("Ask anything... Use @ to mention pages")}
autofocus={false}
/>
</div>
</div>
);
}