import {SideHeaderEvents, SideHeaderState} from "tc-shared/ui/frames/side/HeaderDefinitions"; import {Registry} from "tc-shared/events"; import {SideHeaderRenderer} from "tc-shared/ui/frames/side/HeaderRenderer"; import {SideBarEvents, SideBarType, SideBarTypeData} from "tc-shared/ui/frames/SideBarDefinitions"; import {useContext, useState} from "react"; import {ClientInfoRenderer} from "tc-shared/ui/frames/side/ClientInfoRenderer"; import {PrivateConversationsPanel} from "tc-shared/ui/frames/side/PrivateConversationRenderer"; import {ChannelBarRenderer} from "tc-shared/ui/frames/side/ChannelBarRenderer"; import {LogCategory, logWarn} from "tc-shared/log"; import {ErrorBoundary} from "tc-shared/ui/react-elements/ErrorBoundary"; import {MusicBotRenderer} from "tc-shared/ui/frames/side/MusicBotRenderer"; import {ConversationPanel} from "tc-shared/ui/frames/side/AbstractConversationRenderer"; import React = require("react"); const cssStyle = require("./SideBarRenderer.scss"); const EventContent = React.createContext>(undefined); function useContentData(type: T) : SideBarTypeData[T] { const events = useContext(EventContent); const [ contentData, setContentData ] = useState(() => { events.fire("query_content_data", { content: type }); return undefined; }); events.reactUse("notify_content_data", event => event.content === type && setContentData(event.data)); return contentData; } const ContentRendererChannel = () => { const contentData = useContentData("channel"); if(!contentData) { return null; } return ( ); }; const ContentRendererServer = () => { const contentData = useContentData("server"); if(!contentData) { return null; } return ( ); }; const ContentRendererPrivateConversation = () => { const contentData = useContentData("private-chat"); if(!contentData) { return null; } return ( ); }; const ContentRendererClientInfo = () => { const contentData = useContentData("client-info"); if(!contentData) { return null; } return ( ); }; const ContentRendererMusicManage = () => { const contentData = useContentData("music-manage"); if(!contentData) { return null; } return ( ); }; const SideBarFrame = (props: { type: SideBarType }) => { switch (props.type) { case "server": return ( ) case "channel": return ( ); case "private-chat": return ( ); case "client-info": return ( ); case "music-manage": return ( ) case "none": default: return null; } } const SideBarHeader = (props: { type: SideBarType, eventsHeader: Registry }) => { let headerState: SideHeaderState; switch (props.type) { case "none": headerState = { state: "none" }; break; case "server": headerState = { state: "conversation", mode: "server" }; break; case "channel": headerState = { state: "conversation", mode: "channel" }; break; case "private-chat": headerState = { state: "conversation", mode: "private" }; break; case "client-info": headerState = { state: "client" }; break; case "music-manage": headerState = { state: "music-bot" }; break; default: logWarn(LogCategory.GENERAL, tr("Side bar header with invalid type: %s"), props.type); headerState = { state: "none" }; break; } return ; } export const SideBarRenderer = (props: { events: Registry, eventsHeader: Registry, className?: string }) => { const [ content, setContent ] = useState(() => { props.events.fire("query_content"); return "none"; }); props.events.reactUse("notify_content", event => setContent(event.content)); return (
) };