2020-04-18 19:37:30 +02:00
import {
BatchUpdateAssignment ,
BatchUpdateType ,
ReactComponentBase
} from "tc-shared/ui/react-elements/ReactComponentBase" ;
import { ServerEntry as ServerEntryController , ServerEvents } from "../server" ;
import * as React from "react" ;
import { LocalIconRenderer } from "tc-shared/ui/react-elements/Icon" ;
import { EventHandler , ReactEventHandler } from "tc-shared/events" ;
import { Settings , settings } from "tc-shared/settings" ;
import { TreeEntry , UnreadMarker } from "tc-shared/ui/tree/TreeEntry" ;
import { ConnectionEvents , ConnectionState } from "tc-shared/ConnectionHandler" ;
const serverStyle = require ( "./Server.scss" ) ;
const viewStyle = require ( "./View.scss" ) ;
export interface ServerEntryProperties {
server : ServerEntryController ;
offset : number ;
}
export interface ServerEntryState {
connection_state : "connected" | "connecting" | "disconnected" ;
}
@ReactEventHandler < ServerEntry > ( e = > e . props . server . events )
@BatchUpdateAssignment ( BatchUpdateType . CHANNEL_TREE )
export class ServerEntry extends TreeEntry < ServerEntryProperties , ServerEntryState > {
private handle_connection_state_change ;
protected defaultState ( ) : ServerEntryState {
2020-04-25 20:27:45 +02:00
return { connection_state : this.props.server ? ServerEntry . connectionState2String ( this . props . server . channelTree . client . connection_state ) : "disconnected" } ;
2020-04-18 19:37:30 +02:00
}
2020-04-25 20:27:45 +02:00
private static connectionState2String ( state : ConnectionState ) {
switch ( state ) {
case ConnectionState . AUTHENTICATING :
case ConnectionState . CONNECTING :
case ConnectionState . INITIALISING :
return "connecting" ;
case ConnectionState . CONNECTED :
return "connected" ;
case ConnectionState . DISCONNECTING :
case ConnectionState . UNCONNECTED :
return "disconnected" ;
2020-04-18 19:37:30 +02:00
}
}
2020-04-25 20:27:45 +02:00
protected initialize() {
this . handle_connection_state_change = ( event : ConnectionEvents [ "notify_connection_state_changed" ] ) = > this . setState ( {
connection_state : ServerEntry.connectionState2String ( event . new_state )
} ) ;
}
2020-04-18 19:37:30 +02:00
shouldComponentUpdate ( nextProps : Readonly < ServerEntryProperties > , nextState : Readonly < ServerEntryState > , nextContext : any ) : boolean {
return this . state . connection_state !== nextState . connection_state ||
this . props . offset !== nextProps . offset ||
this . props . server !== nextProps . server ;
}
componentDidMount ( ) : void {
this . props . server . channelTree . client . events ( ) . on ( "notify_connection_state_changed" , this . handle_connection_state_change ) ;
}
componentWillUnmount ( ) : void {
this . props . server . channelTree . client . events ( ) . off ( "notify_connection_state_changed" , this . handle_connection_state_change ) ;
}
render() {
let name = this . props . server . properties . virtualserver_name ;
if ( this . state . connection_state === "disconnected" )
name = tr ( "Not connected to any server" ) ;
else if ( this . state . connection_state === "connecting" )
name = tr ( "Connecting to " ) + this . props . server . remote_address . host + ( this . props . server . remote_address . port !== 9987 ? ":" + this . props . server . remote_address . host : "" ) ;
return < div className = { this . classList ( serverStyle . serverEntry , viewStyle . treeEntry , this . props . server . isSelected ( ) && viewStyle . selected ) }
style = { { top : this.props.offset } }
2020-04-21 17:11:06 +02:00
onMouseUp = { e = > this . onMouseUp ( e ) }
onContextMenu = { e = > this . onContextMenu ( e ) }
2020-04-18 19:37:30 +02:00
>
< UnreadMarker entry = { this . props . server } / >
< div className = { "icon client-server_green " + serverStyle . server_type } / >
< div className = { this . classList ( serverStyle . name ) } > { name } < / div >
< LocalIconRenderer icon = { this . props . server . channelTree . client . fileManager ? . icons . load_icon ( this . props . server . properties . virtualserver_icon_id ) } / >
< / div >
}
2020-04-21 17:11:06 +02:00
private onMouseUp ( event : React.MouseEvent ) {
2020-04-18 19:37:30 +02:00
if ( event . button !== 0 ) return ; /* only left mouse clicks */
2020-04-21 15:18:16 +02:00
if ( this . props . server . channelTree . isClientMoveActive ( ) ) return ;
2020-04-18 19:37:30 +02:00
this . props . server . channelTree . events . fire ( "action_select_entries" , {
entries : [ this . props . server ] ,
mode : "auto"
} ) ;
}
2020-04-21 17:11:06 +02:00
private onContextMenu ( event : React.MouseEvent ) {
2020-04-18 19:37:30 +02:00
if ( settings . static ( Settings . KEY_DISABLE_CONTEXT_MENU ) )
return ;
event . preventDefault ( ) ;
const server = this . props . server ;
if ( server . channelTree . selection . is_multi_select ( ) && server . isSelected ( ) )
return ;
server . channelTree . events . fire ( "action_select_entries" , {
entries : [ server ] ,
mode : "exclusive"
} ) ;
server . spawnContextMenu ( event . pageX , event . pageY ) ;
}
@EventHandler < ServerEvents > ( "notify_properties_updated" )
private handlePropertiesUpdated ( event : ServerEvents [ "notify_properties_updated" ] ) {
if ( typeof event . updated_properties . virtualserver_name !== "undefined" || typeof event . updated_properties . virtualserver_icon_id !== "undefined" ) {
this . forceUpdate ( ) ;
}
}
@EventHandler < ServerEvents > ( "notify_select_state_change" )
private handleServerSelectStateChange() {
this . forceUpdate ( ) ;
}
}