import React, { useDeferredValue, useEffect, useState } from "react"; import { FieldCaption, FireCMSLogo, useBrowserTitleAndIcon, useSnackbarController, useTranslation } from "@firecms/core"; import { BooleanSwitch, BooleanSwitchWithLabel, Button, Checkbox, Container, FileUpload, OnFileUploadRejected, Paper, Select, SelectItem, TextField, Typography, } from "@firecms/ui"; import { useFireCMSBackend, useProjectConfig } from "../../hooks"; import { ProjectSubscriptionPlans } from "../subscriptions"; import { SecurityRulesInstructions } from "../SecurityRulesInstructions"; import { AppCheckSettingsView } from "./AppCheckSettingsView"; export function ProjectSettings() { const { backendUid } = useFireCMSBackend(); const projectConfig = useProjectConfig(); const { t } = useTranslation(); useBrowserTitleAndIcon("Project settings") if (!backendUid) { throw new Error("No backendUid in ProjectSettings"); } return (
{t("settings_heading")}
{t("settings_default_language_caption")}
projectConfig.updateLocalTextSearchEnabled(v)} value={projectConfig.localTextSearchEnabled} /> {t("settings_local_text_search_caption")}
{/* TypesenseSettingsView hidden - not ready for use */}
projectConfig.updateHistoryDefaultEnabled(v)} value={projectConfig.historyDefaultEnabled ?? false} /> {t("settings_doc_history_caption")}
{/**/}
); } function ProjectNameTextField() { const projectConfig = useProjectConfig(); const { t } = useTranslation(); const [name, setName] = useState(projectConfig.projectName ?? ""); const deferredName = useDeferredValue(name); useEffect(() => { if (deferredName) projectConfig.updateProjectName(deferredName); }, [deferredName]); return setName(e.target.value)} onBlur={() => { if (name) projectConfig.updateProjectName(name); }} />; } function LogoUploadField() { const { logo, uploadLogo } = useProjectConfig(); const snackbarContext = useSnackbarController(); const { t } = useTranslation(); const onFilesAdded = async (acceptedFiles: File[]) => { if (!acceptedFiles.length) return; uploadLogo(acceptedFiles[0]); } const onFilesRejected: OnFileUploadRejected = (fileRejections, event) => { for (const fileRejection of fileRejections) { for (const error of fileRejection.errors) { snackbarContext.open({ type: "error", message: `Error uploading file: ${error.message}` }); } } }; return {logo && } {!logo && } ; } function SampleComponents() { const [checked, setChecked] = useState(true); const { t } = useTranslation(); return
{t("settings_sample_theme_components")}
; } function ThemeColors() { const projectConfig = useProjectConfig(); const { t } = useTranslation(); return
{t("settings_theme")}
{ return projectConfig.updatePrimaryColor(e.target.value); }} /> {t("settings_primary_color")}
{ return projectConfig.updateSecondaryColor(e.target.value); }} /> {t("settings_secondary_color")}
}