Skip to content

Commit 5de3c5f

Browse files
committed
fix: hide chat button and page unless AI Assistant installed
1 parent 18e55c7 commit 5de3c5f

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

admin/app/controllers/chats_controller.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,19 @@ import { ChatService } from '#services/chat_service'
44
import { createSessionSchema, updateSessionSchema, addMessageSchema } from '#validators/chat'
55
import { parseBoolean } from '../utils/misc.js'
66
import KVStore from '#models/kv_store'
7+
import { SystemService } from '#services/system_service'
8+
import { SERVICE_NAMES } from '../../constants/service_names.js'
79

810
@inject()
911
export default class ChatsController {
10-
constructor(private chatService: ChatService) {}
12+
constructor(private chatService: ChatService, private systemService: SystemService) {}
1113

12-
async inertia({ inertia }: HttpContext) {
14+
async inertia({ inertia, response }: HttpContext) {
15+
const aiAssistantInstalled = await this.systemService.checkServiceInstalled(SERVICE_NAMES.OLLAMA)
16+
if (!aiAssistantInstalled) {
17+
return response.status(404).json({ error: 'AI Assistant service not installed' })
18+
}
19+
1320
const chatSuggestionsEnabled = await KVStore.getValue('chat.suggestionsEnabled')
1421
return inertia.render('chat', {
1522
settings: {

admin/app/services/system_service.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ export class SystemService {
2020

2121
constructor(private dockerService: DockerService) {}
2222

23+
async checkServiceInstalled(serviceName: string): Promise<boolean> {
24+
const services = await this.getServices({ installedOnly: true });
25+
return services.some(service => service.service_name === serviceName);
26+
}
27+
2328
async getInternetStatus(): Promise<boolean> {
2429
const DEFAULT_TEST_URL = 'https://1.1.1.1/cdn-cgi/trace'
2530
const MAX_ATTEMPTS = 3

admin/inertia/layouts/AppLayout.tsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ import { useState } from 'react'
22
import Footer from '~/components/Footer'
33
import ChatButton from '~/components/chat/ChatButton'
44
import ChatModal from '~/components/chat/ChatModal'
5+
import useServiceInstalledStatus from '~/hooks/useServiceInstalledStatus'
6+
import { SERVICE_NAMES } from '../../constants/service_names'
57

68
export default function AppLayout({ children }: { children: React.ReactNode }) {
79
const [isChatOpen, setIsChatOpen] = useState(false)
10+
const aiAssistantInstalled = useServiceInstalledStatus(SERVICE_NAMES.OLLAMA)
811

912
return (
1013
<div className="min-h-screen flex flex-col">
@@ -19,8 +22,12 @@ export default function AppLayout({ children }: { children: React.ReactNode }) {
1922
<div className="flex-1 w-full bg-desert">{children}</div>
2023
<Footer />
2124

22-
<ChatButton onClick={() => setIsChatOpen(true)} />
23-
<ChatModal open={isChatOpen} onClose={() => setIsChatOpen(false)} />
25+
{aiAssistantInstalled && (
26+
<>
27+
<ChatButton onClick={() => setIsChatOpen(true)} />
28+
<ChatModal open={isChatOpen} onClose={() => setIsChatOpen(false)} />
29+
</>
30+
)}
2431
</div>
2532
)
2633
}

0 commit comments

Comments
 (0)