import {AbstractModal} from "tc-shared/ui/react-elements/modal/Definitions"; import React, {useContext} from "react"; import {IpcRegistryDescription, Registry} from "tc-events"; import { AvailableGroup, ModalClientGroupAssignmentEvents, ModalClientGroupAssignmentVariables } from "tc-shared/ui/modal/group-assignment/Definitions"; import {createIpcUiVariableConsumer, IpcVariableDescriptor} from "tc-shared/ui/utils/IpcVariable"; import {UiVariableConsumer} from "tc-shared/ui/utils/Variable"; import {Translatable, VariadicTranslatable} from "tc-shared/ui/react-elements/i18n"; import {ClientTag} from "tc-shared/ui/tree/EntryTags"; import {Checkbox} from "tc-shared/ui/react-elements/Checkbox"; import {RemoteIconInfoRenderer} from "tc-shared/ui/react-elements/Icon"; import {Button} from "tc-shared/ui/react-elements/Button"; import {LoadingDots} from "tc-shared/ui/react-elements/LoadingDots"; import {ClientIconRenderer} from "tc-shared/ui/react-elements/Icons"; import {ClientIcon} from "svg-sprites/client-icons"; const cssStyle = require("./Renderer.scss"); const VariablesContext = React.createContext>(undefined); const EventsContext = React.createContext>(undefined); const GroupEntryRenderer = React.memo((props: { entry : AvailableGroup, defaultGroup: boolean, defaultGroupActive: boolean }) => { const variables = useContext(VariablesContext); const assigned = variables.useVariable("groupAssigned", props.entry.groupId, false); let disabled = false; if(assigned.status === "applying") { disabled = true; } else if(assigned.localValue ? !props.entry.removeAble : !props.entry.addAble) { disabled = true; } else if(props.defaultGroup && !assigned.localValue) { /* Only disable it if we haven't the group assigned in order to remove the assignment even though the groups is the default group */ disabled = true; } let nameSuffix; if(props.defaultGroup) { nameSuffix = " [default]"; } else if(!props.entry.saveDB) { nameSuffix = " [temp]"; } return (
assigned.setValue(value)} disabled={disabled} className={cssStyle.checkbox} />
{props.entry.name}{nameSuffix}
); }); const GroupListRenderer = React.memo(() => { const variables = useContext(VariablesContext); const serverGroups = variables.useReadOnly("availableGroups", undefined, { defaultGroup: -1, groups: [] }); const assignmentStatus = variables.useReadOnly("assignedGroupStatus", undefined, { status: "loading" }); let body; if(assignmentStatus.status === "loaded") { body = serverGroups.groups.map(entry => ( )); } else if(assignmentStatus.status === "loading") { body = (
loading
); } else if(assignmentStatus.status === "error") { body = (
An error occurred:
{assignmentStatus.message}
); } return (
{body}
); }); const Buttons = React.memo(() => { const events = useContext(EventsContext); const variables = useContext(VariablesContext); const assignmentStatus = variables.useReadOnly("assignedGroupStatus", undefined, { status: "loading" }); return (
) }); const ClientInfoRenderer = React.memo(() => { const variables = useContext(VariablesContext); const handlerId = variables.useReadOnly("handlerId", undefined, undefined); const user = variables.useReadOnly("targetClient"); let inner; if(handlerId && user.status === "loaded") { let clientTag; if(user.value.status === "success") { clientTag = ; } else { clientTag =
{user.value.message}
; } inner = ( {clientTag} ); } else { inner = Change server groups; } return (
{inner}
); }); const RefreshButton = React.memo(() => { const events = useContext(EventsContext); return (
events.fire("action_refresh", { slowMode: true })}>
) }) const TitleRenderer = React.memo(() => { const variables = useContext(VariablesContext); const client = variables.useReadOnly("targetClient"); const handlerId = variables.useReadOnly("handlerId", undefined, undefined); if(client.status === "loaded" && client.value.status === "success" && handlerId) { return ( ); } else { return Server group assignments; } }); export default class ModalServerGroups extends AbstractModal { private readonly events: Registry; private readonly variables: UiVariableConsumer; constructor(events: IpcRegistryDescription, variables: IpcVariableDescriptor) { super(); this.events = Registry.fromIpcDescription(events); this.variables = createIpcUiVariableConsumer(variables); } protected onDestroy() { super.onDestroy(); this.events.destroy(); this.variables.destroy(); } renderBody(): React.ReactElement { return (
); } renderTitle(): string | React.ReactElement { return ( ) } }