/* * Copyright © 2024 Hexastack. All rights reserved. * * Licensed under the GNU Affero General Public License v3.0 (AGPLv3) with the following additional terms: * 1. The name "Hexabot" is a trademark of Hexastack. You may not use this name in derivative works without express written permission. * 2. All derivative works must include clear attribution to the original creator and software, Hexastack and Hexabot, in a prominent location (e.g., in the software's "About" section, documentation, and README file). */ import React, { createContext, ReactNode, useCallback, useContext, useState, } from "react"; import { useTranslation } from "../hooks/useTranslation"; import { IMenuNode } from "../types/menu.type"; import { SessionStorage } from "../utils/sessionStorage"; import { useSubscribe } from "./SocketProvider"; type ChannelSettings = { menu: IMenuNode[]; secret: string; allowed_domains: string; start_button: boolean; input_disabled: boolean; persistent_menu: boolean; theme_color: string; window_title: string; avatar_url: string; show_emoji: boolean; show_file: boolean; show_location: boolean; allowed_upload_types: string; greeting_message: string; }; type ChatSettings = { showEmoji: boolean; showFile: boolean; showLocation: boolean; showTypingIndicator: boolean; alwaysScrollToBottom: boolean; focusOnOpen: boolean; title: string; titleImageUrl: string; inputDisabled: boolean; placeholder: string; menu: IMenuNode[]; autoFlush: boolean; allowedUploadTypes: string[]; color: string; greetingMessage: string; avatarUrl: string; }; const defaultSettings: ChatSettings = { showEmoji: true, showFile: true, showLocation: true, showTypingIndicator: true, alwaysScrollToBottom: true, focusOnOpen: true, title: "Hexabot :)", titleImageUrl: "", inputDisabled: false, placeholder: "Write something...", menu: [], autoFlush: true, allowedUploadTypes: ["image/gif", "image/png", "image/jpeg"], color: "blue", greetingMessage: "Welcome !", avatarUrl: "", }; const SettingsContext = createContext(defaultSettings); interface ChatSettingsProviderProps { children: ReactNode; } export const SettingsProvider: React.FC = ({ children, }) => { const { t } = useTranslation(); const defaultOrSavedSettings = SessionStorage.getItem("settings"); const [settings, setSettingsState] = useState( defaultOrSavedSettings || defaultSettings, ); const setSettings = useCallback((settings: ChatSettings) => { SessionStorage.setItem("settings", settings); setSettingsState(settings); }, []); useSubscribe("settings", (settings: ChannelSettings) => { setSettings({ ...defaultSettings, showEmoji: settings.show_emoji, showFile: settings.show_file, showLocation: settings.show_location, title: settings.window_title, titleImageUrl: settings.avatar_url, menu: settings.menu, allowedUploadTypes: settings.allowed_upload_types.split(","), inputDisabled: settings.input_disabled, color: settings.theme_color, greetingMessage: settings.greeting_message, placeholder: t("settings.placeholder"), avatarUrl: settings.avatar_url, }); }); return ( {children} ); }; export const useSettings = () => { return useContext(SettingsContext); };