import type { ReactNode } from "react"; import { useContext, useEffect, useState } from "react"; import { ActionIcon, Button, Container, Paper, PasswordInput, Switch, Table, Text, TextInput, Title, rem, } from "@mantine/core"; import { useForm } from "@mantine/form"; import { TbBrandGithub, TbMail } from "react-icons/tb"; import { Meilisearch } from "meilisearch"; import { TitleContext } from "@/component/Header/Header"; import { ThemeSetting } from "@/component/Settings/Theme"; import useConfigStore from "@/store/config"; interface SettingItem { title?: ReactNode; description?: ReactNode; value?: ReactNode; } export default function SettingsPage() { const [_, setTitle] = useContext(TitleContext); const { setS3Url, setEnableHybridSearch, setMeilisearchToken, setMeilisearchUrl, ...options } = useConfigStore(); useEffect(() => { setTitle("Settings"); }, [setTitle]); const form = useForm({ initialValues: options, validateInputOnBlur: true, validateInputOnChange: true, }); const [meilisearchVersion, setMeilisearchVersion] = useState( null, ); const onSubmit = async (v: typeof options) => { try { new URL(v.s3Url, location.origin); form.clearFieldError("s3Url"); } catch { form.setFieldError("s3Url", "Invalid Minio URL"); } try { const client = new Meilisearch({ host: v.meilisearchUrl, apiKey: v.meilisearchToken, }); const version = await client.getVersion(); setMeilisearchVersion(version.pkgVersion); form.clearFieldError("meilisearchUrl"); form.clearFieldError("meilisearchToken"); } catch { form.setFieldError("meilisearchUrl", "Invalid Meilisearch URL"); form.setFieldError("meilisearchToken", "Invalid Meilisearch Token"); } if (form.errors.length !== 0) { return; } if (v.s3Url !== options.s3Url) { setS3Url(v.s3Url); } if (v.meilisearchUrl !== options.meilisearchUrl) { setMeilisearchUrl(v.meilisearchUrl); } if (v.meilisearchToken !== options.meilisearchToken) { setMeilisearchToken(v.meilisearchToken); } }; const settings: SettingItem[][] = [ [ { title: "Theme", description: "Change the theme of your UI", value: , }, { title: "Enable Hybrid Search", description: "Enable hybrid search for Meilisearch", value: (
{ const v = value.currentTarget.checked; setEnableHybridSearch(v); }} />
), }, ], [ { title: "Minio URL", description: "The URL of your Minio instance", value: , }, { title: "Meilisearch URL", description: "The URL of your Meilisearch instance", value: , }, { title: "Meilisearch Token", description: "The token of your Meilisearch instance", value: ( ), }, { title: , value: meilisearchVersion ? ( Meilisearch V{meilisearchVersion} ) : null, }, ], [ { title: "Made With ❤️ By", description: ( https://github.com/yoshino-s ), value: ( ), }, ], ]; return ( Settings Customize the look and feel of your Coder deployment.
{settings.map((settingItem, index) => ( {settingItem.map((setting) => ( {setting.title} {setting.description} {setting.value} ))}
))}
); }