summaryrefslogtreecommitdiff
path: root/gui/static/js/main.bca18f22.chunk.js.map
blob: 4052a5e1cec4921462a5b08db2eaadd7b7e2ef32 (plain)
1
{"version":3,"sources":["design/GlobalStyle.tsx","design/components/Alert.design.tsx","redux/allReducer.ts","redux/store.ts","design/components/Card.design.tsx","components/Card.tsx","design/components/Sidebar.design.tsx","components/Sidebar.tsx","design/components/Window.design.tsx","components/Window.tsx","design/components/Footer.design.tsx","components/Footer.tsx","design/components/Select.design.tsx","components/Select.tsx","design/components/Server.design.tsx","App.tsx","components/Server.tsx","redux/actions.ts","index.tsx","components/Alert.tsx"],"names":["GlobalStyle","createGlobalStyle","AlertButton","styled","props","color","calcBgColor","bgColor","AlertButtonCross","initialState","clients","Map","session","Set","store","createStore","state","action","type","payload","keys","updatedSession","add","delete","updatedClients","set","unique_id","client","active_window","idle_time","resource_usage","get","undefined","CardContainer","CardHeader","CardFooter","CardFooterItem","Card","videoRef","React","createRef","plyrPlayer","flvPlayer","createFlvPlayer","video","current","source","flvjs","createPlayer","isLive","url","attachMediaElement","load","reload","destroy","remove","title","removeStream","this","Plyr","iconUrl","svg","controls","ref","data-poster","onClick","size","Component","SidebarDropdown","SidebarDropdownButton","SidebarDropdownContent","active","SidebarStreamContent","SidebarStream","SidebarStreamSection","SidebarStreamInput","SidebarStreamButton","SidebarBlock","Sidebar","sourceInput","titleInput","toRemove","setState","streams","filter","stream","addStream","sourceValue","value","trim","titleValue","sourcePassed","titlePassed","style","border","streamExists","alert","push","updateShowContent","showContent","placeholder","length","map","WindowData","WindowTopBar","WindowTopBarTitle","WindowTopBarAction","WindowInputGroup","WindowContent","WindowForm","WindowLabel","WindowInput","WindowCheckbox","WindowFormSubmit","WindowFormButton","WindowFormClear","WindowResult","Window","windowResult","windowTitle","windowForm","window","windowMove","event","dragging","rel","pos","x","pageX","y","pageY","windowGrab","button","cursor","hightlight","offsetLeft","offsetTop","windowDrop","clearResult","result","item","preventDefault","executeRequest","requestType","requestArgs","message","toLowerCase","requiredFields","i","target","checked","eel","execute_eel","response","reverse","awaitResponseMessage","updateCheckbox","previousSibling","hasAttribute","removeAttribute","setAttribute","fullscreenEvent","document","fullscreenElement","fullscreen","enterFullscreen","requestFullscreen","exitFullscreen","data","addEventListener","height","scrollHeight","_","removeEventListener","toggle","left","top","onMouseDown","index","key","html","dangerouslySetInnerHTML","__html","onSubmit","name","required","FooterDropdown","FooterDropdownToggle","FooterWindowManager","FooterWindowButton","FooterWindowClear","FooterBlock","FooterDropdownContent","FooterNameSpaceButton","FooterDropdownButton","FooterMenu","FooterParagraph","Footer","winManager","column","row","showHelp","address","windows","help","createWindow","argsArray","windowData","newWindow","undefinedExists","removeWindow","Boolean","clearWindows","stopPropagation","zIndex","windowPosition","windowHighlight","newZIndex","Number","windowToggle","show","indexOf","display","windowCenter","width","createWindowEvent","showAlert","windowHighlightEvent","windowToggleEvent","launchWebVersion","ctrlKey","open","location","href","altKey","request","XMLHttpRequest","send","showHelpToggle","host_eel","help_eel","Object","entries","namespace","requests","available","argsString","SelectContainer","SelectRow","Select","sessionAdd","sessionRemove","blacklistAdd","blacklistRemove","clientRemove","sessionAllEel","sessionCloseEel","sessionAddEel","sessionRemoveEel","clientAddEel","clientRemoveEel","activityUpdateEel","tableColumn","css","tableResponsive","ServerTable","ServerTableHead","ServerTableBody","ServerTableRow","activeSession","ServerTableHeader","ServerTableData","ServerTableImage","ServerTableBarBg","ServerTableBar","ServerBlock","Server","tableBody","touchStartMenuTimestamp","touchEndMenuTimestamp","lastSelected","displayKeys","displayValues","hiddenKeys","hiddenValues","selected","allSelected","id","join","console","log","plural","selectMenuError","clipboard","isSecureContext","navigator","writeText","array","end","errorFlag","currentTarget","src","properties","propertiesResult","onContextMenu","menu","isSelected","selectData","innerWidth","clientX","innerHeight","clientY","touchStartMenu","timeStamp","touchEndMenu","select","removeSelected","addSelected","shiftKey","rows","currentPosition","latestPosition","rangeSelect","singleSelect","currentSelected","otherSelected","start","n","dataAttribute","getAttribute","clearSelected","backgroundColor","clientsLoad","sessionLoad","clients_eel","session_eel","category","Array","from","data-unique-id","data-connect-ip","connect_ip","onTouchStart","onTouchEnd","has","data-label","country","country_code","onError","displayValue","split","bar","connect","dispatch","App","useDispatch","useAlert","useSelector","audio_alert","clientAdd","promise","Audio","play","catch","activity","activityUpdate","expose","alertOptions","position","positions","TOP_LEFT","transition","transitions","FADE","timeout","set_host","host","oncontextmenu","_websocket","close","ReactDOM","render","StrictMode","template","options","getElementById"],"mappings":"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","file":"static/js/main.bca18f22.chunk.js","sourcesContent":["import { createGlobalStyle } from 'styled-components';\r\n\r\n// NOTE : rem unit is used instead of px. But\r\n// the UI is still dependant on px units, mostly\r\n// because of some javascript calculations\r\nexport const GlobalStyle = createGlobalStyle`\r\n    ::-webkit-scrollbar {\r\n        height: 0.2rem;\r\n        width: 0.4rem;\r\n    }\r\n\r\n    ::-webkit-scrollbar-track {\r\n        background-color: rgb(5, 32, 58);\r\n    }\r\n\r\n    ::-webkit-scrollbar-thumb {\r\n        background-color: rgb(31, 113, 145);\r\n    }\r\n\r\n    ::placeholder {\r\n        text-transform: capitalize;\r\n        color: rgb(204, 204, 204);\r\n        opacity: 1;\r\n    }\r\n\r\n    * {\r\n        box-sizing: border-box;\r\n        outline: none;\r\n    }\r\n\r\n    body {\r\n        font-family: Arial, Helvetica, sans-serif;\r\n        background-color: rgb(5, 32, 58);\r\n        color: rgb(255, 255, 255);\r\n        font-size: 0.7rem;\r\n        font-weight: 100;\r\n        margin: 0;\r\n    }\r\n\r\n    button, svg {\r\n        cursor: pointer;\r\n    }\r\n\r\n    button {\r\n        transition: 150ms;\r\n\r\n        :active {\r\n            transform: translateY(0.125rem);\r\n            transition: 150ms;\r\n        }\r\n    }\r\n`;\r\n","import { IAlertButton } from '../../interfaces/design/AlertDesign.interface';\r\nimport styled from 'styled-components';\r\n\r\nconst calcBgColor = (color: string) => {\r\n    switch (color) {\r\n        case 'SUCCESS':\r\n            return 'rgb(24, 79, 59)';\r\n        case 'DANGER':\r\n            return 'rgb(175, 45, 45)';\r\n        case 'WARNING':\r\n            return 'rgb(175, 121, 21)';\r\n        case 'INFO':\r\n            return 'rgb(23, 52, 102)';\r\n    }\r\n};\r\n\r\nexport const AlertButton = styled('div') <IAlertButton>`\r\n    background-color: ${(props) => calcBgColor(props.bgColor)};\r\n    border: solid thin rgb(255, 255, 255);\r\n    grid-template-columns: 1fr auto;\r\n    color: rgb(255, 255, 255);\r\n    align-items: center;\r\n    min-height: 2.5rem;\r\n    text-align: center;\r\n    font-size: 0.8rem;\r\n    width: 17.5rem;\r\n    display: grid;\r\n\r\n    @media (min-width: 768px) {\r\n        width: 22.5rem;\r\n    }\r\n`;\r\n\r\nexport const AlertButtonCross = styled('span')`\r\n    border-left: solid thin rgb(255, 255, 255);\r\n    -webkit-touch-callout: none;\r\n    -webkit-user-select: none;\r\n    -khtml-user-select: none;\r\n    -moz-user-select: none;\r\n    -ms-user-select: none;\r\n    padding: 0.5rem 1rem;\r\n    align-items: center;\r\n    font-size: 1.25rem;\r\n    user-select: none;\r\n    cursor: pointer;\r\n    display: grid;\r\n    height: 100%;\r\n`;\r\n","import { IAllReducer } from '../interfaces/AllReducer.interface';\r\nimport { IClient } from '../interfaces/Client.interface';\r\nimport {\r\n    ClientsLoadType,\r\n    SessionLoadType,\r\n    SessionAllType,\r\n    SessionCloseType,\r\n    SessionAddType,\r\n    SessionRemoveType,\r\n    ClientAddType,\r\n    ClientRemoveType,\r\n    ActivityUpdateType\r\n} from './actions';\r\n\r\nconst initialState: IAllReducer = {\r\n    clients: new Map<string, IClient>(),\r\n    session: new Set<string>()\r\n};\r\n\r\nexport const allReducer = (\r\n    state: IAllReducer = initialState,\r\n    action:\r\n        | ClientsLoadType\r\n        | SessionLoadType\r\n        | SessionAllType\r\n        | SessionCloseType\r\n        | SessionAddType\r\n        | SessionRemoveType\r\n        | ClientAddType\r\n        | ClientRemoveType\r\n        | ActivityUpdateType\r\n) => {\r\n    switch (action.type) {\r\n        case 'CLIENTS_LOAD': {\r\n            return { ...state, clients: new Map<string, IClient>(action.payload) };\r\n        }\r\n        case 'SESSION_LOAD': {\r\n            return { ...state, session: new Set<string>(action.payload) };\r\n        }\r\n        case 'SESSION_ALL': {\r\n            return { ...state, session: new Set<string>(state.clients.keys()) };\r\n        }\r\n        case 'SESSION_CLOSE': {\r\n            return { ...state, session: new Set<string>() };\r\n        }\r\n        case 'SESSION_ADD': {\r\n            const updatedSession = new Set<string>(state.session);\r\n            updatedSession.add(action.payload);\r\n            return { ...state, session: updatedSession };\r\n        }\r\n        case 'SESSION_REMOVE': {\r\n            const updatedSession = new Set<string>(state.session);\r\n            updatedSession.delete(action.payload);\r\n            return { ...state, session: updatedSession };\r\n        }\r\n        case 'CLIENT_ADD': {\r\n            const updatedClients = new Map<string, IClient>(state.clients);\r\n            updatedClients.set(action.payload.unique_id, action.payload.client);\r\n            return { ...state, clients: updatedClients };\r\n        }\r\n        case 'CLIENT_REMOVE': {\r\n            const updatedClients = new Map<string, IClient>(state.clients);\r\n            updatedClients.delete(action.payload);\r\n            return { ...state, clients: updatedClients };\r\n        }\r\n        case 'ACTIVITY_UPDATE': {\r\n            const { unique_id, active_window, idle_time, resource_usage } = action.payload;\r\n            const updatedClients = new Map<string, IClient>(state.clients);\r\n            const client = updatedClients.get(unique_id);\r\n\r\n            if (client !== undefined) {\r\n                client.active_window = active_window;\r\n                client.idle_time = idle_time;\r\n                client.resource_usage = resource_usage;\r\n                updatedClients.set(unique_id, client);\r\n            }\r\n\r\n            return { ...state, clients: updatedClients };\r\n        }\r\n        default:\r\n            return state;\r\n    }\r\n};\r\n","import { createStore } from 'redux';\r\nimport { allReducer } from './allReducer';\r\n\r\nexport const store = createStore(allReducer);\r\n","import styled from 'styled-components';\r\n\r\nexport const CardContainer = styled('div')`\r\n    border: solid thin rgb(31, 113, 145);\r\n    background-color: rgb(5, 32, 58);\r\n    // CONSTANT : left & right borders + left & right margin\r\n    width: calc(100% - 1.125rem);\r\n    color: rgb(255, 255, 255);\r\n    border-radius: 0.5rem;\r\n    display: inline-block;\r\n    margin: 0.5rem;\r\n    \r\n    @media (min-width: 992px) {\r\n        width: 46.5%;\r\n    }\r\n`;\r\n\r\nexport const CardHeader = styled('div')`\r\n    border-bottom: solid thin rgb(31, 113, 145);\r\n    padding: 0.5rem 0.5rem 0.625rem 0.5rem;\r\n    border-top-right-radius: 0.5rem;\r\n    border-top-left-radius: 0.5rem;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n    font-size: 0.9rem;\r\n    text-align: left;\r\n    overflow: hidden;\r\n`;\r\n\r\nexport const CardFooter = styled('div')`\r\n    border-top: solid thin rgb(31, 113, 145);\r\n    border-bottom-right-radius: 0.5rem;\r\n    border-bottom-left-radius: 0.5rem;\r\n    grid-template-columns: 1fr 1fr;\r\n    display: grid;\r\n`;\r\n\r\nexport const CardFooterItem = styled('div')`\r\n    border-right: solid thin rgb(31, 113, 145);\r\n    justify-content: center;\r\n    align-items: center;\r\n    font-size: 0.65rem;\r\n    padding: 0.5rem 0;\r\n    cursor: pointer;\r\n    display: grid;\r\n\r\n    :hover {\r\n        background-color: rgb(0, 55, 117);\r\n        transition: 250ms;\r\n    }\r\n\r\n    :first-child {\r\n        border-bottom-left-radius: 0.5rem;\r\n    }\r\n\r\n    :last-child {\r\n        border-bottom-right-radius: 0.5rem;\r\n        border-right: none;\r\n    }\r\n`;\r\n","import { IProps, IState } from '../interfaces/components/Card.interface';\r\nimport { FaRedo, FaTrash } from 'react-icons/fa';\r\nimport React, { Component } from 'react';\r\nimport svg from 'plyr/dist/plyr.svg';\r\nimport 'plyr/dist/plyr.css';\r\nimport flvjs from 'flv.js';\r\nimport Plyr from 'plyr';\r\nimport {\r\n    CardContainer,\r\n    CardHeader,\r\n    CardFooter,\r\n    CardFooterItem\r\n} from '../design/components/Card.design';\r\n\r\nclass Card extends Component<IProps, IState> {\r\n    videoRef: any = React.createRef();\r\n    plyrPlayer: any;\r\n    flvPlayer: any;\r\n\r\n    componentDidMount() {\r\n        const video = this.videoRef.current;\r\n        this.createFlvPlayer();\r\n\r\n        this.plyrPlayer = new Plyr(video, {\r\n            iconUrl: svg,\r\n            controls: [\r\n                'play-large',\r\n                'play',\r\n                'progress',\r\n                'mute',\r\n                'volume',\r\n                'fullscreen'\r\n            ]\r\n        });\r\n    }\r\n\r\n    createFlvPlayer = () => {\r\n        const video = this.videoRef.current;\r\n        const { source } = this.props;\r\n\r\n        this.flvPlayer = flvjs.createPlayer({\r\n            type: 'flv',\r\n            isLive: true,\r\n            url: source\r\n        });\r\n        this.flvPlayer.attachMediaElement(video);\r\n        this.flvPlayer.load()\r\n    }\r\n\r\n    reload = () => {\r\n        this.flvPlayer.destroy();\r\n        this.createFlvPlayer();\r\n    }\r\n\r\n    remove = () => {\r\n        const { source, title } = this.props;\r\n        this.props.removeStream({ source, title });\r\n    }\r\n\r\n    render() {\r\n        const { source, title } = this.props;\r\n\r\n        return (\r\n            <CardContainer>\r\n                <CardHeader title={`${title}: ${source}`}>{title}: {source}</CardHeader>\r\n                <video ref={this.videoRef} data-poster=\"./static/poster.png\" />\r\n                <CardFooter>\r\n                    <CardFooterItem onClick={this.reload}>\r\n                        <FaRedo size=\"0.8rem\" />\r\n                    </CardFooterItem>\r\n                    <CardFooterItem onClick={this.remove}>\r\n                        <FaTrash size=\"0.8rem\" />\r\n                    </CardFooterItem>\r\n                </CardFooter>\r\n            </CardContainer>\r\n        )\r\n    }\r\n}\r\n\r\nexport default Card;\r\n","import { ISidebarSlide } from '../../interfaces/design/SidebarDesign.interface';\r\nimport styled from 'styled-components';\r\n\r\nexport const SidebarDropdown = styled('div')`\r\n    background-color: rgb(5, 32, 58);\r\n    grid-template-columns: 1fr auto;\r\n    color: rgb(0, 255, 255);\r\n    position: fixed;\r\n    display: grid;\r\n    height: 100%;\r\n    z-index: 999;\r\n    right: 0;\r\n    top: 0;\r\n`;\r\n\r\nexport const SidebarDropdownButton = styled('div')`\r\n    border-left: solid thin rgb(31, 113, 145);\r\n    padding: 0 0.25rem 0 0.2rem;\r\n    color: rgb(0, 255, 255);\r\n    align-items: center;\r\n    cursor: pointer;\r\n    width: 1.2rem;\r\n    display: grid;\r\n    height: 100vh;\r\n    z-index: 999;\r\n`;\r\n\r\nexport const SidebarDropdownContent = styled('div') <ISidebarSlide>`\r\n    overflow-x: hidden;\r\n    text-align: center;\r\n    transition: 250ms;\r\n    overflow-y: auto;\r\n    opacity: 0;\r\n    padding: 0;\r\n    width: 0;\r\n\r\n    ${({ active }: any) =>\r\n        active &&\r\n        `\r\n        border-left: solid thin rgb(31, 113, 145);\r\n        width: calc(100vw - 1.2rem);\r\n        opacity: 1;\r\n\r\n        @media (min-width: 576px) {\r\n            width: 65vw;\r\n        }\r\n    `}\r\n`;\r\n\r\nexport const SidebarStreamContent = styled('div')`\r\n    @media (min-width: 992px) {\r\n        padding: 0.5rem 0;\r\n    }\r\n\r\n    @media (min-width: 1200px) {\r\n        padding: 1rem 0;\r\n    }\r\n\r\n    @media (min-width: 1600px) {\r\n        padding: 1.5rem 0;\r\n    }\r\n`;\r\n\r\nexport const SidebarStream = styled('div')`\r\n    border-bottom: solid thin rgb(31, 113, 145);\r\n    border-top: solid thin rgb(31, 113, 145);\r\n    background-color: rgb(5, 32, 58);\r\n    color: rgb(255, 255, 255);\r\n    text-align: center;\r\n    padding: 0.8rem 0;\r\n`;\r\n\r\nexport const SidebarStreamSection = styled('div')`\r\n    grid-template-columns: 1fr auto;\r\n    display: grid;\r\n`;\r\n\r\nexport const SidebarStreamInput = styled('input')`\r\n    padding: 0.45rem 0.45rem 0.45rem 0.6rem;\r\n    border: solid thin rgb(31, 93, 117);\r\n    background-color: rgb(5, 32, 58);\r\n    width: calc(100% - 0.8rem);\r\n    color: rgb(255, 255, 255);\r\n    border-radius: 5rem;\r\n    font-size: 0.8rem;\r\n    margin: 0.4rem;\r\n`;\r\n\r\nexport const SidebarStreamButton = styled('button')`\r\n    border: solid thin rgb(31, 93, 117);\r\n    background-color: rgb(5, 32, 58);\r\n    margin: 0.4rem 0.4rem 0.4rem 0;\r\n    color: rgb(255, 255, 255);\r\n    padding: 0.5rem 2rem;\r\n    border-radius: 5rem;\r\n    transition: 250ms;\r\n\r\n    @media (min-width: 576px) {\r\n        padding: 0.5rem 4rem;\r\n    } \r\n`;\r\n\r\nexport const SidebarBlock = styled('div')`\r\n    background-color: rgb(31, 93, 117);\r\n    color: rgb(255, 255, 255);\r\n    text-align: center;\r\n    padding: 0.8rem 0;\r\n`;\r\n","import { IProps, IState } from '../interfaces/components/Sidebar.interface';\r\nimport { FaChevronLeft, FaChevronRight } from 'react-icons/fa';\r\nimport { IStream } from '../interfaces/Stream.interface';\r\nimport React, { Component } from 'react';\r\nimport Card from './Card';\r\nimport {\r\n    SidebarDropdown,\r\n    SidebarDropdownButton,\r\n    SidebarDropdownContent,\r\n    SidebarStreamContent,\r\n    SidebarStream,\r\n    SidebarStreamSection,\r\n    SidebarStreamInput,\r\n    SidebarStreamButton,\r\n    SidebarBlock\r\n} from '../design/components/Sidebar.design';\r\n\r\nclass Sidebar extends Component<IProps, IState> {\r\n    sourceInput: any = React.createRef();\r\n    titleInput: any = React.createRef();\r\n\r\n    constructor(props: IProps) {\r\n        super(props);\r\n\r\n        this.state = {\r\n            showContent: false,\r\n            streams: []\r\n        };\r\n    }\r\n\r\n    removeStream = (toRemove: IStream) =>\r\n        this.setState({\r\n            streams: this.state.streams.filter(\r\n                (stream: IStream) => (\r\n                    !(stream.source === toRemove.source\r\n                        && stream.title === toRemove.title)\r\n                )\r\n            )\r\n        });\r\n\r\n    addStream = () => {\r\n        const source = this.sourceInput.current;\r\n        const title = this.titleInput.current;\r\n        const sourceValue = source.value.trim();\r\n        const titleValue = title.value.trim();\r\n        let sourcePassed = true;\r\n        let titlePassed = true;\r\n\r\n        if (sourceValue === '') {\r\n            source.style.border = 'solid thin rgb(225, 53, 57)';\r\n            sourcePassed = false;\r\n        } else\r\n            source.style.border = 'solid thin rgb(31, 93, 117)';\r\n\r\n        if (titleValue === '') {\r\n            title.style.border = 'solid thin rgb(225, 53, 57)';\r\n            titlePassed = false;\r\n        } else\r\n            title.style.border = 'solid thin rgb(31, 93, 117)';\r\n\r\n        if (sourcePassed && titlePassed)\r\n            if (this.streamExists(sourceValue, titleValue))\r\n                alert('Stream Already Exists!')\r\n            else {\r\n                this.state.streams.push({\r\n                    source: sourceValue,\r\n                    title: titleValue\r\n                });\r\n                source.value = '';\r\n                title.value = '';\r\n            }\r\n    }\r\n\r\n    streamExists = (source: string, title: string) => {\r\n        for (const stream of this.state.streams)\r\n            if (stream.source === source && stream.title === title)\r\n                return true;\r\n        return false;\r\n    }\r\n\r\n    updateShowContent = () =>\r\n        this.setState({ showContent: !this.state.showContent });\r\n\r\n    render() {\r\n        const { showContent, streams } = this.state;\r\n\r\n        return (\r\n            <SidebarDropdown>\r\n                <SidebarDropdownButton onClick={this.updateShowContent}>\r\n                    {showContent ? (\r\n                        <FaChevronRight size=\".8rem\" />\r\n                    ) : (\r\n                            <FaChevronLeft size=\".8rem\" />\r\n                        )}\r\n                </SidebarDropdownButton>\r\n\r\n                <SidebarDropdownContent active={showContent}>\r\n                    <SidebarStream>\r\n                        <SidebarStreamInput\r\n                            type=\"search\"\r\n                            placeholder=\"Flash video source...\"\r\n                            ref={this.sourceInput}\r\n                        />\r\n                        <SidebarStreamSection>\r\n                            <SidebarStreamInput\r\n                                type=\"search\"\r\n                                placeholder=\"Stream title...\"\r\n                                ref={this.titleInput}\r\n                            />\r\n                            <SidebarStreamButton\r\n                                onClick={this.addStream}\r\n                            >\r\n                                Add\r\n                            </SidebarStreamButton>\r\n                        </SidebarStreamSection>\r\n                    </SidebarStream>\r\n                    {streams.length === 0 ? (\r\n                        <SidebarBlock>No Streams Available</SidebarBlock>\r\n                    ) : (\r\n                            <SidebarStreamContent>\r\n                                {streams.map((stream: IStream) => (\r\n                                    <Card\r\n                                        removeStream={this.removeStream}\r\n                                        source={stream.source}\r\n                                        title={stream.title}\r\n                                    />\r\n                                ))}\r\n                            </SidebarStreamContent>\r\n                        )}\r\n                </SidebarDropdownContent>\r\n            </SidebarDropdown>\r\n        );\r\n    }\r\n}\r\n\r\nexport default Sidebar;\r\n","import styled from 'styled-components';\r\n\r\nexport const WindowData = styled('div')`\r\n    border: solid 0.0625rem rgb(178, 178, 178);\r\n    background-color: rgb(5, 32, 58);\r\n    color: rgb(255, 255, 255);\r\n    min-height: 2.1875rem;\r\n    min-width: 18rem;\r\n    overflow: hidden;\r\n    position: fixed;\r\n    resize: both;\r\n    height: 55vh;\r\n    width: 40vw;\r\n\r\n    &:after {\r\n        cursor: nwse-resize;\r\n        position: absolute;\r\n        display: block;\r\n        height: 1rem;\r\n        width: 1rem;\r\n        content: '';\r\n        bottom: 0;\r\n        right: 0;\r\n    }\r\n`;\r\n\r\nexport const WindowTopBar = styled('div')`\r\n    border-bottom: solid 0.0625rem rgb(31, 93, 117);\r\n    background-color: rgb(225, 53, 57);\r\n    grid-template-columns: 1fr auto;\r\n    align-items: center;\r\n    text-align: right;\r\n    display: grid;\r\n`;\r\n\r\nexport const WindowTopBarTitle = styled('div')`\r\n    text-overflow: ellipsis;\r\n    text-align: left;\r\n    overflow: hidden;\r\n    padding: 0.5rem;\r\n    cursor: grab;\r\n`;\r\n\r\nexport const WindowTopBarAction = styled('div')`\r\n    padding: 0.5rem;\r\n`;\r\n\r\nexport const WindowInputGroup = styled('div')`\r\n    padding: 0 0.75rem 1rem 0.75rem;\r\n    grid-template-columns: auto 1fr;\r\n    justify-content: center;\r\n    align-items: center;\r\n    text-align: center;\r\n    grid-gap: 0.5rem;\r\n    display: grid;\r\n\r\n    :first-child {\r\n        padding-top: 0.75rem;\r\n    }\r\n`;\r\n\r\nexport const WindowContent = styled('div')`\r\n    height: calc(100% - 2.1875rem);\r\n    overflow-x: auto;\r\n`;\r\n\r\nexport const WindowForm = styled('form')`\r\n    border-bottom: solid 0.0625rem rgb(31, 93, 117);\r\n    border-right: solid 0.0625rem rgb(31, 93, 117);\r\n    border-left: solid 0.0625rem rgb(31, 93, 117);\r\n    margin: 0 0.75rem 0.75rem 0.75rem;\r\n    width: calc(100% - 1.5rem);\r\n    text-align: left;\r\n`;\r\n\r\nexport const WindowLabel = styled('label')`\r\n    text-transform: capitalize;\r\n    font-size: 0.8rem;\r\n`;\r\n\r\nexport const WindowInput = styled('input')`\r\n    border: solid 0.0625rem rgb(31, 93, 117);\r\n    padding: 0.45rem 0.45rem 0.45rem 0.6rem;\r\n    background-color: rgb(5, 32, 58);\r\n    color: rgb(255, 255, 255);\r\n    border-radius: 5rem;\r\n    font-size: 0.8rem;\r\n`;\r\n\r\nexport const WindowCheckbox = styled('div')`\r\n    border: solid 0.0625rem rgb(31, 93, 117);\r\n    background-color: rgb(5, 32, 58);\r\n    border-radius: 3.125rem;\r\n    position: relative;\r\n    width: 4.6875rem;\r\n    height: 1.5rem;\r\n    z-index: 0;\r\n\r\n    &:before {\r\n        color: rgb(255, 255, 255);\r\n        position: absolute;\r\n        font-weight: bold;\r\n        right: 0.625rem;\r\n        content: 'OFF';\r\n        top: 0.25rem;\r\n    }\r\n\r\n    &:after {\r\n        color: rgb(255, 255, 255);\r\n        position: absolute;\r\n        font-weight: bold;\r\n        left: 0.625rem;\r\n        content: 'ON';\r\n        top: 0.25rem;\r\n        z-index: 0;\r\n    }\r\n\r\n    label {\r\n        box-shadow: 0 0.125rem 0.5rem rgb(31, 93, 117);\r\n        background-color: rgb(255, 255, 255);\r\n        border-radius: 3.125rem;\r\n        position: absolute;\r\n        transition: 250ms;\r\n        cursor: pointer;\r\n        width: 1.875rem;\r\n        display: block;\r\n        top: 0.1875rem;\r\n        left: 0.25rem;\r\n        height: 1rem;\r\n        z-index: 1;\r\n    }\r\n\r\n    input[type=\"checkbox\"] {\r\n        visibility: hidden;\r\n\r\n        &:checked + label {\r\n            left: 2.4375rem;\r\n        }\r\n    }\r\n`;\r\n\r\nexport const WindowFormSubmit = styled('div')`\r\n    padding: 0.25rem 0.75rem 0.75rem 0.75rem;\r\n`;\r\n\r\nexport const WindowFormButton = styled('button')`\r\n    border: solid 0.0625rem rgb(31, 93, 117);\r\n    background-color: rgb(5, 32, 58);\r\n    color: rgb(255, 255, 255);\r\n    padding: 0.5rem 0.25rem;\r\n    border-radius: 5rem;\r\n    width: 10rem;\r\n`;\r\n\r\nexport const WindowFormClear = styled('button')`\r\n    border: solid 0.0625rem rgb(31, 93, 117);\r\n    padding: 0.45rem 0.4rem 0.55rem 0.4rem;\r\n    background-color: rgb(5, 32, 58);\r\n    color: rgb(255, 255, 255);\r\n    margin-left: 0.5rem;\r\n    border-radius: 5rem;\r\n    width: 2rem;\r\n\r\n    > svg {\r\n        vertical-align: bottom;\r\n    }\r\n`;\r\n\r\nexport const WindowResult = styled('div')`\r\n    font-family: 'Courier New', Courier, monospace;\r\n    border: solid 0.0625rem rgb(31, 93, 117);\r\n    padding: 0.75rem 0.75rem 0 0.75rem;\r\n    margin: 0.75rem 0.75rem 0 0.75rem;\r\n    line-height: 1.2rem;\r\n    min-height: 7.5rem;\r\n    font-size: 0.8rem;\r\n    text-align: left;\r\n    white-space: pre;\r\n    overflow: auto;\r\n\r\n    ::-webkit-scrollbar {\r\n        height: 0.3rem;\r\n        width: 0.3rem;\r\n    }\r\n\r\n    > div {\r\n        border: solid 0.0625rem rgb(31, 113, 145);\r\n        background-color: rgb(5, 32, 58);\r\n        margin-bottom: 0.75rem;\r\n        padding: 0.25rem;\r\n        display: table;\r\n        width: 100%;\r\n    }\r\n\r\n    table {\r\n        border-collapse: collapse;\r\n    }\r\n\r\n    td,\r\n    th {\r\n        border: solid 0.0625rem rgb(31, 113, 145);\r\n        background-color: rgb(5, 32, 58);\r\n        padding: 0.25rem 0.5rem;\r\n    }\r\n\r\n    th {\r\n        background-color: rgb(31, 93, 117);\r\n    }\r\n`;\r\n","import { IProps, IState } from '../interfaces/components/Window.interface';\r\nimport React, { Component, Fragment } from 'react';\r\nimport {\r\n    WindowData,\r\n    WindowTopBar,\r\n    WindowTopBarTitle,\r\n    WindowTopBarAction,\r\n    WindowContent,\r\n    WindowResult,\r\n    WindowForm,\r\n    WindowInputGroup,\r\n    WindowLabel,\r\n    WindowInput,\r\n    WindowCheckbox,\r\n    WindowFormSubmit,\r\n    WindowFormButton,\r\n    WindowFormClear\r\n} from '../design/components/Window.design';\r\nimport {\r\n    FaMinusSquare,\r\n    FaWindowMaximize,\r\n    FaWindowMinimize,\r\n    FaWindowClose,\r\n    FaRedo\r\n} from 'react-icons/fa';\r\n\r\nclass Window extends Component<IProps, IState> {\r\n    windowResult: any = React.createRef();\r\n    windowTitle: any = React.createRef();\r\n    windowForm: any = React.createRef();\r\n    window: any = React.createRef();\r\n\r\n    constructor(props: IProps) {\r\n        super(props);\r\n        this.state = {\r\n            result: props.data || [],\r\n            fullscreen: false,\r\n            dragging: false,\r\n            pos: props.pos,\r\n            rel: null\r\n        };\r\n    }\r\n\r\n    componentDidMount() {\r\n        document.addEventListener('fullscreenchange', this.fullscreenEvent);\r\n\r\n        if (this.windowForm.current === null)\r\n            // CONSTANT : window height minus the margin & borders\r\n            this.windowResult.current.style.height = 'calc(100% - 1.625rem)';\r\n        else\r\n            // CONSTANT : window height minus the form height, margin & borders\r\n            // CONSTANT : Rem unit dependant & px scrollHeight\r\n            this.windowResult.current.style.height = `\r\n                calc(100% - 1.625rem - ${this.windowForm.current.scrollHeight / 16}rem)\r\n            `;\r\n    }\r\n\r\n    componentDidUpdate(_: IProps, state: IState) {\r\n        const { dragging } = this.state;\r\n\r\n        if (dragging && !state.dragging) {\r\n            document.addEventListener('mousemove', this.windowMove);\r\n            document.addEventListener('mouseup', this.windowDrop);\r\n        } else if (!dragging && state.dragging) {\r\n            document.removeEventListener('mousemove', this.windowMove);\r\n            document.removeEventListener('mouseup', this.windowDrop);\r\n        }\r\n    }\r\n\r\n    componentWillUnmount() {\r\n        document.removeEventListener('fullscreenchange', this.fullscreenEvent);\r\n    }\r\n\r\n    windowMove = (event: any) => {\r\n        const { dragging, rel } = this.state;\r\n\r\n        if (!dragging) return;\r\n\r\n        this.setState({\r\n            pos: {\r\n                x: event.pageX - rel.x,\r\n                y: event.pageY - rel.y\r\n            }\r\n        });\r\n    };\r\n\r\n    windowGrab = (event: any) => {\r\n        if (event.button !== 0) return;\r\n\r\n        this.windowTitle.current.style.cursor = 'grabbing';\r\n        this.props.hightlight();\r\n\r\n        this.setState({\r\n            dragging: true,\r\n            rel: {\r\n                x: event.pageX - this.window.current.offsetLeft,\r\n                y: event.pageY - this.window.current.offsetTop\r\n            }\r\n        });\r\n    };\r\n\r\n    windowDrop = () => {\r\n        this.windowTitle.current.style.cursor = 'grab';\r\n        this.setState({ dragging: false });\r\n    };\r\n\r\n    clearResult = (event: any) => {\r\n        this.setState({\r\n            result: this.state.result.filter(\r\n                (item: string) => item === 'Request Sent... Awaiting Response')\r\n        });\r\n        event.preventDefault();\r\n    };\r\n\r\n    executeRequest = (event: any) => {\r\n        const { requestType, requestArgs } = this.props;\r\n        let windowResult: any = {\r\n            message: requestType.toLowerCase()\r\n        };\r\n        let requiredFields = true;\r\n\r\n        for (let i = 0; i < requestArgs.length; i++)\r\n            if (requestArgs[i][2])\r\n                if (\r\n                    requestArgs[i][1] &&\r\n                    !event.target[requestArgs[i][0]].value\r\n                ) {\r\n                    event.target[requestArgs[i][0]].style.border =\r\n                        'solid 0.0625rem rgb(225, 53, 57)';\r\n                    requiredFields = false;\r\n                } else {\r\n                    event.target[requestArgs[i][0]].style.border =\r\n                        'solid 0.0625rem rgb(31, 93, 117)';\r\n                    windowResult[requestArgs[i][0]] =\r\n                        event.target[requestArgs[i][0]].value;\r\n                }\r\n            else\r\n                windowResult[requestArgs[i][0]] =\r\n                    event.target[requestArgs[i][0]].checked;\r\n\r\n        if (requiredFields)\r\n            this.setState({\r\n                result: ['Request Sent... Awaiting Response', ...this.state.result]\r\n            }, () =>\r\n                window.eel.execute_eel(windowResult)((response: string) => {\r\n                    const result = this.state.result.reverse()\r\n                    let awaitResponseMessage = true;\r\n\r\n                    this.setState({\r\n                        result: result.map(\r\n                            (item: string) => {\r\n                                if (item === 'Request Sent... Awaiting Response')\r\n                                    if (awaitResponseMessage) {\r\n                                        awaitResponseMessage = false;\r\n                                        return response;\r\n                                    } else\r\n                                        return item;\r\n                                else\r\n                                    return item;\r\n                            }\r\n                        ).reverse()\r\n                    })\r\n                })\r\n            )\r\n\r\n        event.preventDefault();\r\n    };\r\n\r\n    updateCheckbox = (event: any) => {\r\n        if (event.target.previousSibling.hasAttribute('checked'))\r\n            event.target.previousSibling.removeAttribute('checked');\r\n        else event.target.previousSibling.setAttribute('checked', '');\r\n    };\r\n\r\n    fullscreenEvent = () => {\r\n        if (document.fullscreenElement) this.setState({ fullscreen: true });\r\n        else this.setState({ fullscreen: false });\r\n    };\r\n\r\n    enterFullscreen = () => this.window.current.requestFullscreen();\r\n\r\n    exitFullscreen = () => document.exitFullscreen();\r\n\r\n    render() {\r\n        const { pos, result, fullscreen } = this.state;\r\n        const {\r\n            requestType,\r\n            requestArgs,\r\n            hightlight,\r\n            toggle,\r\n            destroy\r\n        } = this.props;\r\n\r\n        return (\r\n            <WindowData\r\n                ref={this.window}\r\n                style={{\r\n                    left: `${pos.x}px`,\r\n                    top: `${pos.y}px`\r\n                }}\r\n            >\r\n                <WindowTopBar>\r\n                    <WindowTopBarTitle\r\n                        title={`${requestType} Request / Response Window`}\r\n                        onMouseDown={this.windowGrab}\r\n                        ref={this.windowTitle}\r\n                    >\r\n                        {requestType}\r\n                    </WindowTopBarTitle>\r\n                    <WindowTopBarAction>\r\n                        {fullscreen ? (\r\n                            <FaWindowMinimize\r\n                                onClick={this.exitFullscreen}\r\n                                size=\"1rem\"\r\n                            />\r\n                        ) : (\r\n                                <FaWindowMaximize\r\n                                    onClick={this.enterFullscreen}\r\n                                    size=\"1rem\"\r\n                                />\r\n                            )}{' '}\r\n                        <FaMinusSquare onClick={toggle} size=\"1rem\" />{' '}\r\n                        <FaWindowClose onClick={destroy} size=\"1rem\" />\r\n                    </WindowTopBarAction>\r\n                </WindowTopBar>\r\n                <WindowContent onMouseDown={hightlight}>\r\n                    <WindowResult ref={this.windowResult}>\r\n                        {result.length > 0 ? (\r\n                            result.map((response: any, index: number) => (\r\n                                <Fragment key={index}>\r\n                                    {response ? (\r\n                                        response.html ? (\r\n                                            <div\r\n                                                dangerouslySetInnerHTML={{\r\n                                                    __html: response.message\r\n                                                        ? response.message\r\n                                                        : 'Empty Response'\r\n                                                }}\r\n                                            ></div>\r\n                                        ) : (\r\n                                                <div>{response}</div>\r\n                                            )\r\n                                    ) : (\r\n                                            <div>Empty Response</div>\r\n                                        )}\r\n                                </Fragment>\r\n                            ))\r\n                        ) : (\r\n                                <div>No Responses Present</div>\r\n                            )}\r\n                    </WindowResult>\r\n                    {requestArgs.length > 0 ? (\r\n                        <WindowForm\r\n                            onSubmit={this.executeRequest}\r\n                            ref={this.windowForm}\r\n                        >\r\n                            {requestArgs.map((\r\n                                [name, required, response]: [string, boolean, boolean],\r\n                                index: number\r\n                            ) =>\r\n                                response ? (\r\n                                    <WindowInputGroup key={index}>\r\n                                        <WindowLabel>\r\n                                            {required\r\n                                                ? 'Required'\r\n                                                : 'Optional'}\r\n                                        </WindowLabel>\r\n\r\n                                        <WindowInput\r\n                                            type=\"search\"\r\n                                            name={name}\r\n                                            placeholder={name}\r\n                                        />\r\n                                    </WindowInputGroup>\r\n                                ) : (\r\n                                        <WindowInputGroup key={index}>\r\n                                            <WindowLabel>{name}</WindowLabel>\r\n                                            <WindowCheckbox>\r\n                                                <input\r\n                                                    type=\"checkbox\"\r\n                                                    name={name}\r\n                                                />\r\n                                                <label\r\n                                                    onClick={\r\n                                                        this.updateCheckbox\r\n                                                    }\r\n                                                ></label>\r\n                                            </WindowCheckbox>\r\n                                        </WindowInputGroup>\r\n                                    )\r\n                            )}\r\n                            <WindowFormSubmit>\r\n                                <WindowFormButton>\r\n                                    Execute Request\r\n                                </WindowFormButton>\r\n                                <WindowFormClear onClick={this.clearResult}>\r\n                                    <FaRedo />\r\n                                </WindowFormClear>\r\n                            </WindowFormSubmit>\r\n                        </WindowForm>\r\n                    ) : null}\r\n                </WindowContent>\r\n            </WindowData>\r\n        );\r\n    }\r\n}\r\n\r\nexport default Window;\r\n","import { IFooterDropdownContent } from '../../interfaces/design/FooterDesign.interface';\r\nimport styled from 'styled-components';\r\n\r\nexport const FooterDropdown = styled('div')`\r\n    border-top: solid thin rgb(31, 93, 117);\r\n    background-color: rgb(5, 32, 58);\r\n    width: calc(100% - 1.2rem);\r\n    text-align: center;\r\n    position: fixed;\r\n    bottom: 4.45rem;\r\n    left: 0;\r\n`;\r\n\r\nexport const FooterDropdownToggle = styled('div')`\r\n    background-color: rgb(5, 32, 58);\r\n    color: rgb(0, 255, 255);\r\n    padding: 0.25rem 0;\r\n    cursor: pointer;\r\n`;\r\n\r\nexport const FooterWindowManager = styled('div')`\r\n    border-top: solid thin rgb(31, 93, 117);\r\n    background-color: rgb(5, 32, 58);\r\n    width: calc(100% - 1.2rem);\r\n    color: rgb(255, 255, 255);\r\n    -ms-overflow-style: none;\r\n    scrollbar-width: none;\r\n    white-space: nowrap;\r\n    text-align: center;\r\n    overflow-x: scroll;\r\n    overflow-y: hidden;\r\n    position: fixed;\r\n    height: 3.25rem;\r\n    bottom: 1.2rem;\r\n    left: 0;\r\n`;\r\n\r\nexport const FooterWindowButton = styled('button')`\r\n    border: solid thin rgb(31, 93, 117);\r\n    background-color: rgb(5, 32, 58);\r\n    margin: 0.578125rem 0.15rem;\r\n    color: rgb(255, 255, 255);\r\n    padding: 0.5rem 1.5rem;\r\n    border-radius: 5rem;\r\n    transition: 250ms;\r\n`;\r\n\r\nexport const FooterWindowClear = styled('button')`\r\n    border: solid thin rgb(225, 53, 57);\r\n    background-color: rgb(5, 32, 58);\r\n    margin: 0.578125rem 0.15rem;\r\n    color: rgb(255, 255, 255);\r\n    padding: 0.5rem 1.5rem;\r\n    border-radius: 5rem;\r\n    transition: 250ms;\r\n`;\r\n\r\nexport const FooterBlock = styled('div')`\r\n    background-color: rgb(5, 32, 58);\r\n    color: rgb(255, 255, 255);\r\n    margin: 1.1875rem 0;\r\n`;\r\n\r\nexport const FooterDropdownContent = styled('div') <IFooterDropdownContent>`\r\n    background-color: rgb(5, 32, 58);\r\n    overflow-y: scroll;\r\n    transition: 250ms;\r\n    padding: 0;\r\n    height: 0;\r\n\r\n    ${({ active }: any) =>\r\n        active &&\r\n        `\r\n        border-top: solid thin rgb(31, 93, 117);\r\n        padding: 0.5rem 0;\r\n        transition: 250ms;\r\n        height: 9.2rem;\r\n\r\n        @media (min-width: 1280px) {\r\n            height: 7.2rem;\r\n        }\r\n\r\n        @media (min-width: 2000px) {\r\n            height: 5.2rem;\r\n        }\r\n    `}\r\n`;\r\n\r\nexport const FooterNameSpaceButton = styled('button')`\r\n    border: solid thin rgb(225, 53, 57);\r\n    background-color: rgb(225, 53, 57);\r\n    color: rgb(255, 255, 255);\r\n    padding: 0.4rem 1rem;\r\n    border-radius: 5rem;\r\n    transition: none;\r\n    cursor: text;\r\n    \r\n    :active {\r\n        transform: none;\r\n        transition: none;\r\n    }\r\n`;\r\n\r\nexport const FooterDropdownButton = styled('button')`\r\n    background-color: rgb(31, 93, 117);\r\n    color: rgb(255, 255, 255);\r\n    border: rgb(31, 93, 117);\r\n    padding: 0.4rem 1rem;\r\n    border-radius: 5rem;\r\n    margin: 0.15rem;\r\n`;\r\n\r\nexport const FooterMenu = styled('div')`\r\n    border-top: solid thin rgb(31, 93, 117);\r\n    background-color: rgb(5, 32, 58);\r\n    width: calc(100% - 1.2rem);\r\n    color: rgb(255, 255, 255);\r\n    position: fixed;\r\n    height: 1.2rem;\r\n    bottom: 0;\r\n    left: 0;\r\n`;\r\n\r\nexport const FooterParagraph = styled('p')`\r\n    text-overflow: ellipsis;\r\n    padding-top: 0.15rem;\r\n    white-space: nowrap;\r\n    font-size: 0.75rem;\r\n    overflow: hidden;\r\n    height: 1.2rem;\r\n    margin-top: 0;\r\n`;\r\n","import { IProps, IState } from '../interfaces/components/Footer.interface';\r\nimport React, { Component, Fragment } from 'react';\r\nimport Window from './Window';\r\nimport {\r\n    FooterDropdown,\r\n    FooterDropdownToggle,\r\n    FooterDropdownContent,\r\n    FooterNameSpaceButton,\r\n    FooterDropdownButton,\r\n    FooterWindowManager,\r\n    FooterWindowButton,\r\n    FooterWindowClear,\r\n    FooterBlock,\r\n    FooterMenu,\r\n    FooterParagraph\r\n} from '../design/components/Footer.design';\r\nimport {\r\n    FaChevronDown,\r\n    FaChevronUp,\r\n    FaLink,\r\n    FaListUl,\r\n    FaPlus,\r\n    FaMinus,\r\n    FaSyncAlt,\r\n    FaTrash\r\n} from 'react-icons/fa';\r\n\r\nclass Footer extends Component<IProps, IState> {\r\n    winManager: any = React.createRef();\r\n    column = 0;\r\n    row = 0;\r\n\r\n    state = {\r\n        showHelp: false,\r\n        address: '',\r\n        windows: [],\r\n        help: {}\r\n    };\r\n\r\n    componentDidMount() {\r\n        window.eel.host_eel()((address: string) =>\r\n            window.eel.help_eel()((help: object) =>\r\n                this.setState({ address: address, help: help })\r\n            )\r\n        );\r\n    }\r\n\r\n    componentDidUpdate() {\r\n        this.column = 0;\r\n        this.row = 0;\r\n    }\r\n\r\n    createWindow = (\r\n        requestType: string,\r\n        argsArray: any,\r\n        windowData: string\r\n    ) => {\r\n        const newWindow = [\r\n            requestType,\r\n            argsArray,\r\n            React.createRef(),\r\n            true,\r\n            windowData ? [windowData] : null\r\n        ];\r\n\r\n        const windows: any = [...this.state.windows];\r\n        let undefinedExists = false;\r\n\r\n        for (let i = 0; i < windows.length; i++)\r\n            if (windows[i] === undefined) {\r\n                windows[i] = newWindow;\r\n                undefinedExists = true;\r\n                break;\r\n            }\r\n\r\n        if (!undefinedExists)\r\n            windows.push(newWindow);\r\n\r\n        this.setState({ windows: windows });\r\n    };\r\n\r\n    removeWindow = (index: number) => (event: any) => {\r\n        const windows = [...this.state.windows];\r\n        delete windows[index];\r\n\r\n        windows.filter(Boolean).length === 0\r\n            ? this.clearWindows()\r\n            : this.setState({ windows });\r\n\r\n        event.stopPropagation();\r\n    };\r\n\r\n    clearWindows = () => {\r\n        this.winManager.current.style.zIndex = 1;\r\n        this.setState({ windows: [] });\r\n    };\r\n\r\n    windowPosition = () => {\r\n        if (this.column === 5) {\r\n            this.column = 0;\r\n            this.row++;\r\n        }\r\n\r\n        this.column++;\r\n\r\n        return {\r\n            // CONSTANT : px for every row and column (left & top)\r\n            x: this.column * 25 + this.row * 25,\r\n            y: this.column * 25 + 40 + this.row\r\n        };\r\n    };\r\n\r\n    windowHighlight = (ref: any) => {\r\n        const newZIndex = Number(this.winManager.current.style.zIndex) + 1\r\n        this.winManager.current.style.zIndex = newZIndex;\r\n        ref.current.window.current.style.zIndex = newZIndex;\r\n    };\r\n\r\n    windowToggle = (show: boolean, window: any) => {\r\n        const windows: any[] = [...this.state.windows];\r\n        const index: number = windows.indexOf(window);\r\n        windows[index][3] = show;\r\n\r\n        this.windowHighlight(window[2]);\r\n        this.setState({ windows });\r\n\r\n        if (!show) window[2].current.window.current.style.display = 'none';\r\n        else window[2].current.window.current.style.display = 'block';\r\n    };\r\n\r\n    windowCenter = (window: any) => (event: any) => {\r\n        this.windowToggle(true, window);\r\n        // CONSTANT : based on default styles from the CSS of the window\r\n        // (height & width) & the values of each column & row (left & top)\r\n        window[2].current.window.current.style.height = '55vh';\r\n        window[2].current.window.current.style.width = '40vw';\r\n        window[2].current.window.current.style.left = '25px';\r\n        window[2].current.window.current.style.top = '65px';\r\n\r\n        event.stopPropagation();\r\n    };\r\n\r\n    createWindowEvent = (requestType: string, argsArray: any) => () => {\r\n        if (argsArray.length > 0) this.createWindow(requestType, argsArray, '');\r\n        else\r\n            window.eel.execute_eel({\r\n                message: requestType.toLowerCase()\r\n            })((response: any) => {\r\n                response !== null\r\n                    ? response.alert\r\n                        ? window.showAlert({\r\n                            message: response.message,\r\n                            type: response.type\r\n                        })\r\n                        : this.createWindow(requestType, argsArray, response)\r\n                    : window.showAlert({\r\n                        message: `${requestType} Request Executed`,\r\n                        type: 'INFO'\r\n                    });\r\n            });\r\n    };\r\n\r\n    windowHighlightEvent = (ref: any) => () => this.windowHighlight(ref);\r\n\r\n    windowToggleEvent = (show: boolean, window: any) => (event: any) => {\r\n        this.windowToggle(show, window);\r\n        event.stopPropagation();\r\n    };\r\n\r\n    launchWebVersion = (event: any) => {\r\n        if (event.ctrlKey) {\r\n            window.open(window.location.href, '_blank');\r\n            window.showAlert({\r\n                message: 'Web Version Launched',\r\n                type: 'INFO'\r\n            });\r\n        } else if (event.altKey) {\r\n            const request = new XMLHttpRequest();\r\n            request.open('GET', '/logout');\r\n            request.send();\r\n            window.location.reload();\r\n        }\r\n    };\r\n\r\n    showHelpToggle = () => this.setState({ showHelp: !this.state.showHelp });\r\n\r\n    render() {\r\n        const { showHelp, address, windows, help } = this.state;\r\n\r\n        return (\r\n            <Fragment>\r\n                <FooterDropdown>\r\n                    <FooterDropdownToggle onClick={this.showHelpToggle}>\r\n                        {showHelp ? (\r\n                            <FaChevronDown size=\"0.8rem\" />\r\n                        ) : (\r\n                                <FaChevronUp size=\"0.8rem\" />\r\n                            )}\r\n                    </FooterDropdownToggle>\r\n\r\n                    <FooterDropdownContent active={showHelp}>\r\n                        {Object.entries(help).map(\r\n                            ([namespace, requests]: any, index: number) => (\r\n                                <Fragment key={index}>\r\n                                    <FooterNameSpaceButton\r\n                                        title={`${namespace} Namespace`}\r\n                                    >\r\n                                        {namespace}\r\n                                    </FooterNameSpaceButton>{' '}\r\n                                    {requests.map(\r\n                                        (\r\n                                            [\r\n                                                available,\r\n                                                requestType,\r\n                                                argsString,\r\n                                                argsArray\r\n                                            ]: any[],\r\n                                            i: number\r\n                                        ) => (\r\n                                            <FooterDropdownButton\r\n                                                key={i}\r\n                                                title={`Available: ${available}${argsString\r\n                                                    ? ` ${argsString}`\r\n                                                    : ''\r\n                                                    }`}\r\n                                                onClick={this.createWindowEvent(\r\n                                                    requestType,\r\n                                                    argsArray\r\n                                                )}\r\n                                            >\r\n                                                {available === 'Session' ? (\r\n                                                    <FaLink size=\"0.6rem\" />\r\n                                                ) : null}{' '}\r\n                                                {argsString ? (\r\n                                                    <FaListUl size=\"0.65rem\" />\r\n                                                ) : null}{' '}\r\n                                                {requestType}\r\n                                            </FooterDropdownButton>\r\n                                        )\r\n                                    )}\r\n                                </Fragment>\r\n                            )\r\n                        )}\r\n                    </FooterDropdownContent>\r\n                </FooterDropdown>\r\n\r\n                <FooterWindowManager>\r\n                    <div ref={this.winManager} style={{ zIndex: 1 }}>\r\n                        {windows.length > 0 ? (\r\n                            <Fragment>\r\n                                <FooterWindowClear\r\n                                    title='Remove All Windows'\r\n                                    onClick={this.clearWindows}\r\n                                >\r\n                                    Clear Windows\r\n                                </FooterWindowClear>\r\n                                {windows.map((window: any, index: number) => (\r\n                                    <Fragment key={index}>\r\n                                        {window !== undefined ? (\r\n                                            <Fragment>\r\n                                                <Window\r\n                                                    ref={window[2]}\r\n                                                    requestType={window[0]}\r\n                                                    requestArgs={window[1]}\r\n                                                    pos={this.windowPosition()}\r\n                                                    data={window[4]}\r\n                                                    hightlight={this.windowHighlightEvent(\r\n                                                        window[2]\r\n                                                    )}\r\n                                                    toggle={this.windowToggleEvent(\r\n                                                        false,\r\n                                                        window\r\n                                                    )}\r\n                                                    destroy={this.removeWindow(\r\n                                                        index\r\n                                                    )}\r\n                                                />\r\n                                                <FooterWindowButton\r\n                                                    onClick={this.windowToggleEvent(\r\n                                                        window[3]\r\n                                                            ? false\r\n                                                            : true,\r\n                                                        window\r\n                                                    )}\r\n                                                >\r\n                                                    {window[0]}{' '}\r\n                                                    {window[3] ? (\r\n                                                        <FaMinus\r\n                                                            size=\"0.7rem\"\r\n                                                            title={`Hide ${window[0]} Window`}\r\n                                                            onClick={this.windowToggleEvent(\r\n                                                                false,\r\n                                                                window\r\n                                                            )}\r\n                                                        />\r\n                                                    ) : (\r\n                                                            <FaPlus\r\n                                                                size=\"0.7rem\"\r\n                                                                title={`Show ${window[0]} Window`}\r\n                                                                onClick={this.windowToggleEvent(\r\n                                                                    true,\r\n                                                                    window\r\n                                                                )}\r\n                                                            />\r\n                                                        )}{' '}\r\n                                                    <FaSyncAlt\r\n                                                        size=\"0.7rem\"\r\n                                                        title={`Reset ${window[0]} Window Position`}\r\n                                                        onClick={this.windowCenter(\r\n                                                            window\r\n                                                        )}\r\n                                                    />{' '}\r\n                                                    <FaTrash\r\n                                                        size=\"0.7rem\"\r\n                                                        title={`Remove ${window[0]} Window`}\r\n                                                        onClick={this.removeWindow(\r\n                                                            index\r\n                                                        )}\r\n                                                    />\r\n                                                </FooterWindowButton>\r\n                                            </Fragment>\r\n                                        ) : null}\r\n                                    </Fragment>\r\n                                ))}\r\n                            </Fragment>\r\n                        ) : (\r\n                                <FooterBlock>\r\n                                    No Active Windows To Manage\r\n                                </FooterBlock>\r\n                            )}\r\n                    </div>\r\n                </FooterWindowManager>\r\n\r\n                <FooterMenu>\r\n                    <FooterParagraph\r\n                        title={`Listening Address: ${address}`}\r\n                        onClick={this.launchWebVersion}\r\n                    >\r\n                        {`Listening Address: ${address}`}\r\n                    </FooterParagraph>\r\n                </FooterMenu>\r\n            </Fragment>\r\n        );\r\n    }\r\n}\r\n\r\nexport default Footer;\r\n","import styled from 'styled-components';\r\n\r\nexport const SelectContainer = styled('div')`\r\n    position: fixed;\r\n`;\r\n\r\nexport const SelectRow = styled('div')`\r\n    border-bottom: solid thin rgb(31, 113, 145);\r\n    border-right: solid thin rgb(31, 113, 145);\r\n    border-left: solid thin rgb(31, 113, 145);\r\n    background-color: rgb(5, 32, 58);\r\n    font-size: 0.8rem;\r\n    transition: 250ms;\r\n    padding: 0.4rem;\r\n    cursor: pointer;\r\n    width: 8.5rem;\r\n\r\n    :hover {\r\n        background-color: rgb(0, 55, 117);\r\n        transition: 250ms;\r\n    }\r\n\r\n    :first-child {\r\n        border-top: solid thin rgb(31, 113, 145);\r\n        border-top-right-radius: 0.25rem;\r\n        border-top-left-radius: 0.25rem;\r\n    }\r\n\r\n    :last-child {\r\n        border-bottom-right-radius: 0.25rem;\r\n        border-bottom-left-radius: 0.25rem;\r\n    }\r\n\r\n    > svg {\r\n        vertical-align: text-bottom;\r\n    }\r\n`;\r\n","import { SelectContainer, SelectRow } from '../design/components/Select.design';\r\nimport { ISelect, IState } from '../interfaces/components/Select.interface';\r\nimport React, { Component } from 'react';\r\nimport {\r\n    FaUserPlus,\r\n    FaUserMinus,\r\n    FaBan,\r\n    FaUnlockAlt,\r\n    FaTrash\r\n} from 'react-icons/fa';\r\n\r\nclass Select extends Component<ISelect, IState> {\r\n    render() {\r\n        const {\r\n            show,\r\n            top,\r\n            left,\r\n            sessionAdd,\r\n            sessionRemove,\r\n            blacklistAdd,\r\n            blacklistRemove,\r\n            clientRemove\r\n        } = this.props;\r\n\r\n        return show ? (\r\n            <SelectContainer\r\n                style={{\r\n                    top: top,\r\n                    left: left\r\n                }}\r\n            >\r\n                <SelectRow onClick={sessionAdd}>\r\n                    <FaUserPlus size=\"1rem\" color=\"rgb(0, 255, 255)\" /> Session\r\n                    Add\r\n                </SelectRow>\r\n                <SelectRow onClick={sessionRemove}>\r\n                    <FaUserMinus size=\"1rem\" color=\"rgb(0, 255, 255)\" /> Session\r\n                    Remove\r\n                </SelectRow>\r\n                <SelectRow onClick={blacklistAdd}>\r\n                    <FaBan size=\"1rem\" color=\"rgb(138, 43, 226)\" /> Blacklist\r\n                    Add\r\n                </SelectRow>\r\n                <SelectRow onClick={blacklistRemove}>\r\n                    <FaUnlockAlt size=\"1rem\" color=\"rgb(138, 43, 226)\" />{' '}\r\n                    Blacklist Remove\r\n                </SelectRow>\r\n                <SelectRow onClick={clientRemove}>\r\n                    <FaTrash size=\"1rem\" color=\"rgb(225, 53, 57)\" /> Delete\r\n                </SelectRow>\r\n            </SelectContainer>\r\n        ) : null;\r\n    }\r\n}\r\n\r\nexport default Select;\r\n","import styled, { css } from 'styled-components';\r\nimport {\r\n    IServerTableRow,\r\n    IServerTableBar\r\n} from '../../interfaces/design/ServerDesign.interface';\r\n\r\nconst tableColumn = css`\r\n    border: solid thin rgb(31, 113, 145);\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n    max-width: 3.1rem;\r\n    border-top: none;\r\n    overflow: hidden;\r\n    padding: 0.3rem;\r\n`;\r\n\r\nconst tableResponsive = css`\r\n    @media (max-width: 767px) {\r\n        display: block;\r\n    }\r\n`;\r\n\r\nexport const ServerTable = styled('table')`\r\n    width: calc(100% - 1.125rem);\r\n    color: rgb(255, 255, 255);\r\n    border-collapse: collapse;\r\n    -webkit-user-select: none;\r\n    -khtml-user-select: none;\r\n    -moz-user-select: none;\r\n    margin-bottom: 5.9rem;\r\n    -ms-user-select: none;\r\n    text-align: center;\r\n    user-select: none;\r\n    ${tableResponsive}\r\n`;\r\n\r\nexport const ServerTableHead = styled('thead')`\r\n    background-color: rgb(31, 93, 117);\r\n\r\n    @media (max-width: 767px) {\r\n        display: none;\r\n    }\r\n`;\r\n\r\nexport const ServerTableBody = styled('tbody')`\r\n    background-color: rgb(5, 32, 58);\r\n    ${tableResponsive}\r\n\r\n    > tr:first-child {\r\n        padding-top: 1.5rem;\r\n    }\r\n\r\n    > tr:last-child {\r\n        padding-bottom: 1.5rem;\r\n    }\r\n`;\r\n\r\nexport const ServerTableRow = styled('tr') <IServerTableRow>`\r\n    ${(props) => props.activeSession && `color: ${props.activeSession};`}\r\n    padding: 0.75rem 1.5rem;\r\n    ${tableResponsive}\r\n\r\n    > td:first-child {\r\n        border-top: solid thin rgb(31, 113, 145);\r\n    }\r\n`;\r\n\r\nexport const ServerTableHeader = styled('th')`\r\n    ${tableColumn}\r\n`;\r\n\r\nexport const ServerTableData = styled('td')`\r\n    ${tableColumn}\r\n\r\n    @media (max-width: 767px) {\r\n        min-height: 1.4125rem;\r\n        padding-right: 1rem;\r\n        position: relative;\r\n        text-align: right;\r\n        padding-left: 45%;\r\n        overflow: hidden;\r\n        max-width: 100%;\r\n        display: block;\r\n\r\n        &:before {\r\n            content: attr(data-label);\r\n            position: absolute;\r\n            padding-left: 1rem;\r\n            text-align: left;\r\n            width: 55%;\r\n            left: 0;\r\n        }\r\n    }\r\n`;\r\n\r\nexport const ServerTableImage = styled('img')`\r\n    vertical-align: text-bottom;\r\n    margin-right: 0.15rem;\r\n    height: 0.90625rem;\r\n    width: 0.90625rem;\r\n`;\r\n\r\nexport const ServerTableBarBg = styled('div')`\r\n    background-color: rgb(31, 93, 117);\r\n`;\r\n\r\nexport const ServerTableBar = styled('div') <IServerTableBar>`\r\n    ${(props) => props.width && `width: ${props.width}%;`}\r\n    background-color: rgb(24, 79, 59);\r\n    margin: 0.0625rem 0;\r\n    height: 0.375rem;\r\n`;\r\n\r\nexport const ServerBlock = styled('div')`\r\n    background-color: rgb(31, 93, 117);\r\n    width: calc(100% - 1.2rem);\r\n    color: rgb(255, 255, 255);\r\n    text-align: center;\r\n    padding: 0.8rem 0;\r\n`;\r\n","import { IAllReducer } from './interfaces/AllReducer.interface';\nimport { IActivity } from './interfaces/Activity.interface';\nimport { IClient } from './interfaces/Client.interface';\nimport { useDispatch, useSelector } from 'react-redux';\nimport { IAlert } from './interfaces/Alert.interface';\nimport Server from './components/Server';\nimport { useAlert } from 'react-alert';\nimport React from 'react';\nimport {\n    sessionAll,\n    sessionClose,\n    sessionAdd,\n    sessionRemove,\n    clientAdd,\n    clientRemove,\n    activityUpdate\n} from './redux/actions';\n\nlet sessionAllEel,\n    sessionCloseEel,\n    sessionAddEel,\n    sessionRemoveEel,\n    clientAddEel,\n    clientRemoveEel,\n    activityUpdateEel;\n\nfunction App() {\n    const dispatch = useDispatch(),\n        alert = useAlert();\n\n    document.title = useSelector<IAllReducer, string>((state) => {\n        return `${state.clients.size} Connected Client${state.clients.size === 1 ? '' : 's'\n            }${state.session.size > 0\n                ? ` [${state.session.size} Client Session]`\n                : ''\n            }`;\n    });\n\n    clientAddEel = (unique_id: string, client: IClient, audio_alert: boolean) => {\n        dispatch(clientAdd(unique_id, client));\n\n        if (audio_alert) {\n            const promise = new Audio('./static/alert.wav').play();\n\n            promise !== undefined &&\n                promise.catch(() => window.showAlert({\n                    message: 'Failed To Play Alert Audio',\n                    type: 'DANGER'\n                }));\n\n            window.showAlert({\n                message: 'Client Connected',\n                type: 'SUCCESS'\n            });\n        }\n    };\n\n    window.showAlert = (data: IAlert) =>\n        // @ts-ignore\n        alert.show(data.message, { type: data.type });\n\n    sessionRemoveEel = (unique_id: string) =>\n        dispatch(sessionRemove(unique_id));\n\n    sessionAllEel = () => dispatch(sessionAll());\n    sessionCloseEel = () => dispatch(sessionClose());\n    sessionAddEel = (unique_id: string) => dispatch(sessionAdd(unique_id));\n    clientRemoveEel = (unique_id: string) => dispatch(clientRemove(unique_id));\n    activityUpdateEel = (activity: IActivity) => dispatch(activityUpdate(activity));\n\n    window.eel.expose(sessionAllEel, 'sessionAllEel');\n    window.eel.expose(sessionCloseEel, 'sessionCloseEel');\n    window.eel.expose(sessionAddEel, 'sessionAddEel');\n    window.eel.expose(sessionRemoveEel, 'sessionRemoveEel');\n    window.eel.expose(clientAddEel, 'clientAddEel');\n    window.eel.expose(clientRemoveEel, 'clientRemoveEel');\n    window.eel.expose(activityUpdateEel, 'activityUpdateEel');\n\n    return <Server />;\n}\n\nexport default App;\n","import { IProps, IState } from '../interfaces/components/Server.interface';\r\nimport { clientsLoad, sessionLoad } from '../redux/actions';\r\nimport { IClient } from '../interfaces/Client.interface';\r\nimport React, { Component, Fragment } from 'react';\r\nimport { connect } from 'react-redux';\r\nimport Sidebar from './Sidebar';\r\nimport Footer from './Footer';\r\nimport Select from './Select';\r\nimport {\r\n\tServerTable,\r\n\tServerTableHead,\r\n\tServerTableBody,\r\n\tServerTableRow,\r\n\tServerTableHeader,\r\n\tServerTableData,\r\n\tServerTableImage,\r\n\tServerTableBarBg,\r\n\tServerTableBar,\r\n\tServerBlock\r\n} from '../design/components/Server.design';\r\n\r\nclass Server extends Component<IProps, IState> {\r\n\ttableBody: any = React.createRef();\r\n\ttouchStartMenuTimestamp = 0;\r\n\ttouchEndMenuTimestamp = 0;\r\n\tlastSelected: any = null;\r\n\t// CONSTANT : assumes these are\r\n\t// the same on the server side\r\n\tdisplayKeys = [\r\n\t\t'Row',\r\n\t\t'Country',\r\n\t\t'Connect IP',\r\n\t\t'Unique ID',\r\n\t\t'Username',\r\n\t\t'Hostname',\r\n\t\t'Privileges',\r\n\t\t'Antivirus',\r\n\t\t'Operating System',\r\n\t\t'CPU',\r\n\t\t'GPU',\r\n\t\t'RAM',\r\n\t\t'Active Window',\r\n\t\t'Idle Time',\r\n\t\t'Resource Usage'\r\n\t]\r\n\tdisplayValues = [\r\n\t\t'username',\r\n\t\t'hostname',\r\n\t\t'privileges',\r\n\t\t'antivirus',\r\n\t\t'operating_system',\r\n\t\t'cpu',\r\n\t\t'gpu',\r\n\t\t'ram'\r\n\t]\r\n\thiddenKeys = [\r\n\t\t'Initial Connect',\r\n\t\t'Filepath',\r\n\t\t'Running',\r\n\t\t'Build Name',\r\n\t\t'Build Version',\r\n\t\t'OS Version',\r\n\t\t'System Locale',\r\n\t\t'System Uptime',\r\n\t\t'PC Manufacturer',\r\n\t\t'PC Model',\r\n\t\t'MAC Address',\r\n\t\t'External IP',\r\n\t\t'Local IP',\r\n\t\t'Timezone',\r\n\t\t'Country Code',\r\n\t\t'Region',\r\n\t\t'~City',\r\n\t\t'~Zip Code',\r\n\t\t'~Latitude',\r\n\t\t'~Longitude'\r\n\t]\r\n\thiddenValues = [\r\n\t\t'initial_connect',\r\n\t\t'filepath',\r\n\t\t'running',\r\n\t\t'build_name',\r\n\t\t'build_version',\r\n\t\t'os_version',\r\n\t\t'system_locale',\r\n\t\t'system_uptime',\r\n\t\t'pc_manufacturer',\r\n\t\t'pc_model',\r\n\t\t'mac_address',\r\n\t\t'external_ip',\r\n\t\t'local_ip',\r\n\t\t'timezone',\r\n\t\t'country_code',\r\n\t\t'region',\r\n\t\t'city',\r\n\t\t'zip_code',\r\n\t\t'latitude',\r\n\t\t'longitude'\r\n\t]\r\n\r\n\tconstructor(props: IProps) {\r\n\t\tsuper(props);\r\n\r\n\t\tthis.state = {\r\n\t\t\tselectData: { show: false },\r\n\t\t\tclients: props.clients,\r\n\t\t\tsession: props.session\r\n\t\t};\r\n\t}\r\n\r\n\tcomponentDidMount() {\r\n\t\tconst { clientsLoad, sessionLoad } = this.props;\r\n\r\n\t\twindow.addEventListener('click', () => {\r\n\t\t\tthis.setState({ selectData: { show: false } });\r\n\t\t\tthis.clearSelected();\r\n\t\t});\r\n\r\n\t\twindow.eel.clients_eel()((clients: Map<string, IClient>) =>\r\n\t\t\twindow.eel.session_eel()((session: Set<string>) => {\r\n\t\t\t\tclientsLoad(clients);\r\n\t\t\t\tsessionLoad(session);\r\n\t\t\t})\r\n\t\t);\r\n\t}\r\n\r\n\tsessionAdd = () => {\r\n\t\tconst selected = this.allSelected('unique-id');\r\n\t\tconst length = selected.length;\r\n\r\n\t\tif (length > 0) {\r\n\t\t\twindow.eel.execute_eel({\r\n\t\t\t\tmessage: 'session',\r\n\t\t\t\tid: selected.join(','),\r\n\t\t\t})((response: string) => console.log(response));\r\n\t\t\twindow.showAlert({\r\n\t\t\t\tmessage: `Client${this.plural(selected)} Added To Session`,\r\n\t\t\t\ttype: 'SUCCESS',\r\n\t\t\t});\r\n\t\t} else this.selectMenuError();\r\n\t};\r\n\r\n\tsessionRemove = () => {\r\n\t\tconst selected = this.allSelected('unique-id');\r\n\t\tconst length = selected.length;\r\n\r\n\t\tif (length > 0) {\r\n\t\t\twindow.eel.execute_eel({\r\n\t\t\t\tmessage: 'session',\r\n\t\t\t\tid: selected.join(','),\r\n\t\t\t\tremove: true,\r\n\t\t\t})((response: string) => console.log(response));\r\n\t\t\twindow.showAlert({\r\n\t\t\t\tmessage: `Client${this.plural(selected)} Removed From Session`,\r\n\t\t\t\ttype: 'SUCCESS',\r\n\t\t\t});\r\n\t\t} else this.selectMenuError();\r\n\t};\r\n\r\n\tblacklistAdd = () => {\r\n\t\tconst selected = this.allSelected('connect-ip');\r\n\t\tconst length = selected.length;\r\n\r\n\t\tif (length > 0) {\r\n\t\t\twindow.eel.execute_eel({\r\n\t\t\t\tmessage: 'blacklist',\r\n\t\t\t\tadd: selected.join(','),\r\n\t\t\t})((response: string) => console.log(response));\r\n\t\t\twindow.showAlert({\r\n\t\t\t\tmessage: `Blacklist Address${this.plural(selected, 'es')} Added`,\r\n\t\t\t\ttype: 'SUCCESS',\r\n\t\t\t});\r\n\t\t} else this.selectMenuError();\r\n\t};\r\n\r\n\tblacklistRemove = () => {\r\n\t\tconst selected = this.allSelected('connect-ip');\r\n\t\tconst length = selected.length;\r\n\r\n\t\tif (length > 0) {\r\n\t\t\twindow.eel.execute_eel({\r\n\t\t\t\tmessage: 'blacklist',\r\n\t\t\t\tremove: selected.join(','),\r\n\t\t\t})((response: string) => console.log(response));\r\n\t\t\twindow.showAlert({\r\n\t\t\t\tmessage: `Blacklist Address${this.plural(selected, 'es')} Removed`,\r\n\t\t\t\ttype: 'SUCCESS',\r\n\t\t\t});\r\n\t\t} else this.selectMenuError();\r\n\t};\r\n\r\n\tclientRemove = () => {\r\n\t\tconst selected = this.allSelected('unique-id');\r\n\t\tconst length = selected.length;\r\n\r\n\t\tif (length > 0) {\r\n\t\t\twindow.eel.execute_eel({\r\n\t\t\t\tmessage: 'delete',\r\n\t\t\t\tid: selected.join(','),\r\n\t\t\t})((response: string) => console.log(response));\r\n\t\t\twindow.showAlert({\r\n\t\t\t\tmessage: `Client${this.plural(selected)} Removed`,\r\n\t\t\t\ttype: 'SUCCESS',\r\n\t\t\t});\r\n\t\t} else this.selectMenuError();\r\n\t};\r\n\r\n\tclipboard = (data: string) => (event: any) => {\r\n\t\tif (event.altKey) {\r\n\t\t\tif (window.isSecureContext) {\r\n\t\t\t\twindow.navigator.clipboard.writeText(data);\r\n\t\t\t\twindow.showAlert({\r\n\t\t\t\t\tmessage: 'Field Copied To Clipboard',\r\n\t\t\t\t\ttype: 'SUCCESS'\r\n\t\t\t\t});\r\n\t\t\t} else\r\n\t\t\t\twindow.showAlert({\r\n\t\t\t\t\tmessage: 'Clipboard Failed',\r\n\t\t\t\t\ttype: 'DANGER',\r\n\t\t\t\t});\r\n\r\n\t\t\tevent.stopPropagation();\r\n\t\t\tevent.preventDefault();\r\n\t\t}\r\n\t};\r\n\r\n\tselectMenuError = () => window.showAlert({\r\n\t\tmessage: 'Select Menu Error',\r\n\t\ttype: 'DANGER',\r\n\t});\r\n\r\n\tplural = (array: string[], end = 's') =>\r\n\t\tarray.length === 1 ? '' : end;\r\n\r\n\terrorFlag = (event: any) =>\r\n\t\t// CONSTANT : placeholder flag name\r\n\t\tevent.currentTarget.src = './static/flags/placeholder.png';\r\n\r\n\tproperties = (client: IClient) => {\r\n\t\tlet result: string[] | string = [];\r\n\r\n\t\tfor (let i = 0; i < this.hiddenValues.length; i++) {\r\n\t\t\tconst value = (client as any)[this.hiddenValues[i]];\r\n\t\t\tconst key = this.hiddenKeys[i];\r\n\t\t\tresult.push(`${key}: ${value}`);\r\n\t\t}\r\n\r\n\t\treturn this.propertiesResult(result.join('\\n'));\r\n\t};\r\n\r\n\tpropertiesResult = (result: string) => ({\r\n\t\tonContextMenu: this.clipboard(result),\r\n\t\ttitle: result\r\n\t});\r\n\r\n\tmenu = (event: any) =>\r\n\t\tthis.isSelected(event.currentTarget) &&\r\n\t\tthis.setState({\r\n\t\t\tselectData: {\r\n\t\t\t\tshow: true,\r\n\t\t\t\t// CONSTANT : when to swap menu horizontally (right to left)\r\n\t\t\t\tleft:\r\n\t\t\t\t\twindow.innerWidth - event.clientX < 165\r\n\t\t\t\t\t\t? event.clientX - 136\r\n\t\t\t\t\t\t: event.clientX,\r\n\t\t\t\t// CONSTANT : when to swap menu vertically (bottom to top)\r\n\t\t\t\ttop:\r\n\t\t\t\t\twindow.innerHeight - event.clientY < 165\r\n\t\t\t\t\t\t? event.clientY - 150\r\n\t\t\t\t\t\t: event.clientY,\r\n\t\t\t\tsessionAdd: this.sessionAdd,\r\n\t\t\t\tsessionRemove: this.sessionRemove,\r\n\t\t\t\tblacklistAdd: this.blacklistAdd,\r\n\t\t\t\tblacklistRemove: this.blacklistRemove,\r\n\t\t\t\tclientRemove: this.clientRemove\r\n\t\t\t},\r\n\t\t});\r\n\r\n\ttouchStartMenu = (event: any) =>\r\n\t\t(this.touchStartMenuTimestamp = event.timeStamp);\r\n\r\n\ttouchEndMenu = (event: any) => {\r\n\t\tthis.touchEndMenuTimestamp = event.timeStamp;\r\n\t\t// CONSTANT : hold down touch time\r\n\t\tthis.touchEndMenuTimestamp - this.touchStartMenuTimestamp > 300 &&\r\n\t\t\tthis.menu(event);\r\n\t};\r\n\r\n\tselect = (event: any) => {\r\n\t\tthis.setState({ selectData: { show: false } });\r\n\t\tconst current = event.currentTarget;\r\n\r\n\t\tif (event.ctrlKey) {\r\n\t\t\tif (this.isSelected(current)) {\r\n\t\t\t\tthis.removeSelected(current);\r\n\t\t\t\tthis.lastSelected = null;\r\n\t\t\t} else {\r\n\t\t\t\tthis.addSelected(current);\r\n\t\t\t\tthis.lastSelected = current;\r\n\t\t\t}\r\n\t\t} else if (event.shiftKey) {\r\n\t\t\tconst rows = this.tableBody.current.rows;\r\n\t\t\tlet currentPosition = 0;\r\n\t\t\tlet latestPosition = 0;\r\n\r\n\t\t\tfor (let i = 0; i < rows.length; i++)\r\n\t\t\t\tif (rows[i] === current) currentPosition = i;\r\n\t\t\t\telse if (rows[i] === this.lastSelected) latestPosition = i;\r\n\r\n\t\t\tthis.rangeSelect(rows, currentPosition, latestPosition);\r\n\t\t} else this.singleSelect(current);\r\n\r\n\t\tevent.stopPropagation();\r\n\t};\r\n\r\n\tsingleSelect = (row: any) => {\r\n\t\tconst rows = this.tableBody.current.rows;\r\n\t\tlet currentSelected = false,\r\n\t\t\totherSelected = false;\r\n\r\n\t\tfor (let i = 0; i < rows.length; i++)\r\n\t\t\tif (rows[i] !== row) {\r\n\t\t\t\tif (this.isSelected(rows[i])) {\r\n\t\t\t\t\tif (!otherSelected) otherSelected = true;\r\n\t\t\t\t\tthis.removeSelected(rows[i]);\r\n\t\t\t\t}\r\n\t\t\t} else if (this.isSelected(row)) currentSelected = true;\r\n\r\n\t\tif (currentSelected && !otherSelected) {\r\n\t\t\tthis.removeSelected(row);\r\n\t\t\tthis.lastSelected = null;\r\n\t\t} else {\r\n\t\t\tthis.addSelected(row);\r\n\t\t\tthis.lastSelected = row;\r\n\t\t}\r\n\t};\r\n\r\n\trangeSelect = (rows: any, start: number, end: number) => {\r\n\t\tif (this.lastSelected !== rows[start]) {\r\n\t\t\tif (start > end) {\r\n\t\t\t\tlet n = start;\r\n\t\t\t\tstart = end;\r\n\t\t\t\tend = n;\r\n\t\t\t}\r\n\r\n\t\t\tfor (let i = 0; i < rows.length; i++)\r\n\t\t\t\tif (i >= start && i <= end) {\r\n\t\t\t\t\tif (!this.isSelected(rows[i])) this.addSelected(rows[i]);\r\n\t\t\t\t} else if (this.isSelected(rows[i])) this.removeSelected(rows[i]);\r\n\t\t} else this.singleSelect(this.lastSelected);\r\n\t};\r\n\r\n\tallSelected = (dataAttribute: string) => {\r\n\t\tlet result = [];\r\n\r\n\t\tif (this.tableBody.current !== null) {\r\n\t\t\tconst rows = this.tableBody.current.rows;\r\n\r\n\t\t\tfor (let i = 0; i < rows.length; i++)\r\n\t\t\t\tif (this.isSelected(rows[i]))\r\n\t\t\t\t\tresult.push(rows[i].getAttribute(`data-${dataAttribute}`));\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t};\r\n\r\n\tclearSelected = () => {\r\n\t\tif (this.tableBody.current !== null) {\r\n\t\t\tconst rows = this.tableBody.current.rows;\r\n\t\t\tthis.lastSelected = null;\r\n\r\n\t\t\tfor (let i = 0; i < rows.length; i++)\r\n\t\t\t\tif (this.isSelected(rows[i])) this.removeSelected(rows[i]);\r\n\t\t}\r\n\t};\r\n\r\n\taddSelected = (row: any) => {\r\n\t\trow.setAttribute('data-selected', '');\r\n\t\trow.style.backgroundColor = 'rgb(0, 40, 80)';\r\n\t};\r\n\r\n\tremoveSelected = (row: any) => {\r\n\t\trow.removeAttribute('data-selected');\r\n\t\trow.removeAttribute('style');\r\n\t};\r\n\r\n\tisSelected = (row: any) => row.hasAttribute('data-selected');\r\n\r\n\trender() {\r\n\t\tconst { clients, session } = this.props;\r\n\t\tconst { selectData } = this.state;\r\n\r\n\t\treturn (\r\n\t\t\t<Fragment>\r\n\t\t\t\t{clients.size > 0 ? (\r\n\t\t\t\t\t<ServerTable>\r\n\t\t\t\t\t\t<ServerTableHead>\r\n\t\t\t\t\t\t\t<ServerTableRow>\r\n\t\t\t\t\t\t\t\t{this.displayKeys.map((category: string, index: number) => (\r\n\t\t\t\t\t\t\t\t\t<ServerTableHeader key={index} title={category}>\r\n\t\t\t\t\t\t\t\t\t\t{category}\r\n\t\t\t\t\t\t\t\t\t</ServerTableHeader>\r\n\t\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t\t</ServerTableRow>\r\n\t\t\t\t\t\t</ServerTableHead>\r\n\t\t\t\t\t\t<ServerTableBody ref={this.tableBody}>\r\n\t\t\t\t\t\t\t{Array.from(clients.entries()).map(([unique_id, client]: [string, IClient], row: number) => (\r\n\t\t\t\t\t\t\t\t<ServerTableRow\r\n\t\t\t\t\t\t\t\t\tkey={row}\r\n\t\t\t\t\t\t\t\t\tdata-unique-id={unique_id}\r\n\t\t\t\t\t\t\t\t\tdata-connect-ip={client.connect_ip}\r\n\t\t\t\t\t\t\t\t\tonClick={this.select}\r\n\t\t\t\t\t\t\t\t\tonContextMenu={this.menu}\r\n\t\t\t\t\t\t\t\t\tonTouchStart={this.touchStartMenu}\r\n\t\t\t\t\t\t\t\t\tonTouchEnd={this.touchEndMenu}\r\n\t\t\t\t\t\t\t\t\tactiveSession={\r\n\t\t\t\t\t\t\t\t\t\tsession.has(unique_id)\r\n\t\t\t\t\t\t\t\t\t\t\t? 'rgb(0, 255, 255)'\r\n\t\t\t\t\t\t\t\t\t\t\t: 'rgb(255, 255, 255)'\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t<ServerTableData\r\n\t\t\t\t\t\t\t\t\t\tdata-label={this.displayKeys[0]}\r\n\t\t\t\t\t\t\t\t\t\t{...this.properties(client)}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{row + 1}\r\n\t\t\t\t\t\t\t\t\t</ServerTableData>\r\n\r\n\t\t\t\t\t\t\t\t\t<ServerTableData\r\n\t\t\t\t\t\t\t\t\t\tdata-label={this.displayKeys[1]}\r\n\t\t\t\t\t\t\t\t\t\ttitle={client.country}\r\n\t\t\t\t\t\t\t\t\t\tonContextMenu={this.clipboard(client.country)}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<Fragment>\r\n\t\t\t\t\t\t\t\t\t\t\t<ServerTableImage\r\n\t\t\t\t\t\t\t\t\t\t\t\tsrc={`./static/flags/${client.country_code}.png`}\r\n\t\t\t\t\t\t\t\t\t\t\t\tonError={this.errorFlag}\r\n\t\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t\t\t{client.country}\r\n\t\t\t\t\t\t\t\t\t\t</Fragment>\r\n\t\t\t\t\t\t\t\t\t</ServerTableData>\r\n\r\n\t\t\t\t\t\t\t\t\t<ServerTableData\r\n\t\t\t\t\t\t\t\t\t\tdata-label={this.displayKeys[2]}\r\n\t\t\t\t\t\t\t\t\t\ttitle={client.connect_ip}\r\n\t\t\t\t\t\t\t\t\t\tonContextMenu={this.clipboard(client.connect_ip)}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{client.connect_ip}\r\n\t\t\t\t\t\t\t\t\t</ServerTableData>\r\n\r\n\t\t\t\t\t\t\t\t\t<ServerTableData\r\n\t\t\t\t\t\t\t\t\t\tdata-label={this.displayKeys[3]}\r\n\t\t\t\t\t\t\t\t\t\ttitle={unique_id}\r\n\t\t\t\t\t\t\t\t\t\tonContextMenu={this.clipboard(unique_id)}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{unique_id}\r\n\t\t\t\t\t\t\t\t\t</ServerTableData>\r\n\r\n\t\t\t\t\t\t\t\t\t{this.displayValues.map(\r\n\t\t\t\t\t\t\t\t\t\t(displayValue: string, column: number) => (\r\n\t\t\t\t\t\t\t\t\t\t\t<ServerTableData\r\n\t\t\t\t\t\t\t\t\t\t\t\tkey={column}\r\n\t\t\t\t\t\t\t\t\t\t\t\tdata-label={\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t// CONSTANT : start index\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tthis.displayKeys[4 + column]\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle={(client as any)[displayValue]}\r\n\t\t\t\t\t\t\t\t\t\t\t\tonContextMenu={this.clipboard(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t(client as any)[displayValue]\r\n\t\t\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{(client as any)[displayValue]}\r\n\t\t\t\t\t\t\t\t\t\t\t</ServerTableData>\r\n\t\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t\t)}\r\n\r\n\t\t\t\t\t\t\t\t\t<ServerTableData\r\n\t\t\t\t\t\t\t\t\t\tdata-label={\r\n\t\t\t\t\t\t\t\t\t\t\tthis.displayKeys[this.displayKeys.length - 3]\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t{...client.active_window && (\r\n\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle: client.active_window,\r\n\t\t\t\t\t\t\t\t\t\t\t\tonContextMenu: this.clipboard(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclient.active_window\r\n\t\t\t\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{client.active_window ? client.active_window : '...'}\r\n\t\t\t\t\t\t\t\t\t</ServerTableData>\r\n\r\n\t\t\t\t\t\t\t\t\t<ServerTableData\r\n\t\t\t\t\t\t\t\t\t\tdata-label={\r\n\t\t\t\t\t\t\t\t\t\t\tthis.displayKeys[this.displayKeys.length - 2]\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t{...client.idle_time && (\r\n\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle: client.idle_time,\r\n\t\t\t\t\t\t\t\t\t\t\t\tonContextMenu: this.clipboard(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclient.idle_time\r\n\t\t\t\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{client.idle_time ? client.idle_time : '...'}\r\n\t\t\t\t\t\t\t\t\t</ServerTableData>\r\n\r\n\t\t\t\t\t\t\t\t\t<ServerTableData\r\n\t\t\t\t\t\t\t\t\t\tdata-label={\r\n\t\t\t\t\t\t\t\t\t\t\tthis.displayKeys[this.displayKeys.length - 1]\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t{...client.resource_usage && (\r\n\t\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\t\ttitle: client.resource_usage,\r\n\t\t\t\t\t\t\t\t\t\t\t\tonContextMenu: this.clipboard(\r\n\t\t\t\t\t\t\t\t\t\t\t\t\tclient.resource_usage\r\n\t\t\t\t\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t{client.resource_usage ? (\r\n\t\t\t\t\t\t\t\t\t\t\t// CONSTANT : cpu/ram\r\n\t\t\t\t\t\t\t\t\t\t\tclient.resource_usage\r\n\t\t\t\t\t\t\t\t\t\t\t\t.split('/')\r\n\t\t\t\t\t\t\t\t\t\t\t\t.map((bar: string) => (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ServerTableBarBg>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ServerTableBar width={bar} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</ServerTableBarBg>\r\n\t\t\t\t\t\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t\t\t\t\t) : '...'}\r\n\t\t\t\t\t\t\t\t\t</ServerTableData>\r\n\t\t\t\t\t\t\t\t</ServerTableRow>\r\n\t\t\t\t\t\t\t))}\r\n\t\t\t\t\t\t</ServerTableBody>\r\n\t\t\t\t\t</ServerTable>\r\n\t\t\t\t) : (\r\n\t\t\t\t\t\t<ServerBlock>No Clients Connected</ServerBlock>\r\n\t\t\t\t\t)}\r\n\t\t\t\t<Sidebar />\r\n\t\t\t\t<Footer />\r\n\t\t\t\t<Select\r\n\t\t\t\t\tshow={selectData.show}\r\n\t\t\t\t\ttop={selectData.top}\r\n\t\t\t\t\tleft={selectData.left}\r\n\t\t\t\t\tsessionAdd={selectData.sessionAdd}\r\n\t\t\t\t\tsessionRemove={selectData.sessionRemove}\r\n\t\t\t\t\tblacklistAdd={selectData.blacklistAdd}\r\n\t\t\t\t\tblacklistRemove={selectData.blacklistRemove}\r\n\t\t\t\t\tclientRemove={selectData.clientRemove}\r\n\t\t\t\t/>\r\n\t\t\t</Fragment>\r\n\t\t);\r\n\t}\r\n}\r\n\r\nconst mapStateToProps = (state: IProps) => {\r\n\treturn {\r\n\t\tsession: state.session,\r\n\t\tclients: state.clients\r\n\t};\r\n};\r\n\r\nconst mapDispatchToProps = (dispatch: any) => {\r\n\treturn {\r\n\t\tclientsLoad: (clients: Map<string, IClient>) => dispatch(clientsLoad(clients)),\r\n\t\tsessionLoad: (session: Set<string>) => dispatch(sessionLoad(session))\r\n\t};\r\n};\r\n\r\nexport default connect(mapStateToProps, mapDispatchToProps)(Server);\r\n","import { IActivity } from '../interfaces/Activity.interface';\r\nimport { IClient } from '../interfaces/Client.interface';\r\n\r\nexport type ClientsLoadType = { type: 'CLIENTS_LOAD'; payload: Map<string, IClient>; };\r\nexport type SessionLoadType = { type: 'SESSION_LOAD'; payload: Set<string>; };\r\nexport type SessionAllType = { type: 'SESSION_ALL'; };\r\nexport type SessionCloseType = { type: 'SESSION_CLOSE'; };\r\nexport type SessionAddType = { type: 'SESSION_ADD'; payload: string; };\r\nexport type SessionRemoveType = { type: 'SESSION_REMOVE'; payload: string; };\r\nexport type ClientAddType = { type: 'CLIENT_ADD'; payload: { unique_id: string, client: IClient; }; };\r\nexport type ClientRemoveType = { type: 'CLIENT_REMOVE'; payload: string; };\r\nexport type ActivityUpdateType = { type: 'ACTIVITY_UPDATE'; payload: IActivity; };\r\n\r\nexport const clientsLoad = (clients: Map<string, IClient>): ClientsLoadType => ({\r\n    type: 'CLIENTS_LOAD',\r\n    payload: clients\r\n});\r\n\r\nexport const sessionLoad = (session: Set<string>): SessionLoadType => ({\r\n    type: 'SESSION_LOAD',\r\n    payload: session\r\n});\r\n\r\nexport const sessionAll = (): SessionAllType => ({\r\n    type: 'SESSION_ALL'\r\n});\r\n\r\nexport const sessionClose = (): SessionCloseType => ({\r\n    type: 'SESSION_CLOSE'\r\n});\r\n\r\nexport const sessionAdd = (unique_id: string): SessionAddType => ({\r\n    type: 'SESSION_ADD',\r\n    payload: unique_id\r\n});\r\n\r\nexport const sessionRemove = (unique_id: string): SessionRemoveType => ({\r\n    type: 'SESSION_REMOVE',\r\n    payload: unique_id\r\n});\r\n\r\nexport const clientAdd = (unique_id: string, client: IClient): ClientAddType => ({\r\n    type: 'CLIENT_ADD',\r\n    payload: { unique_id, client }\r\n});\r\n\r\nexport const clientRemove = (unique_id: string): ClientRemoveType => ({\r\n    type: 'CLIENT_REMOVE',\r\n    payload: unique_id\r\n});\r\n\r\nexport const activityUpdate = (activity: IActivity): ActivityUpdateType => ({\r\n    type: 'ACTIVITY_UPDATE',\r\n    payload: activity\r\n});\r\n","import { transitions, positions, Provider as AlertProvider } from 'react-alert';\nimport { GlobalStyle } from './design/GlobalStyle';\nimport { AlertTemplate } from './components/Alert';\nimport { Provider } from 'react-redux';\nimport { store } from './redux/store';\nimport ReactDOM from 'react-dom';\nimport React from 'react';\nimport App from './App';\n\nconst alertOptions = {\n    // CONSTANT : alert parameters\n    position: positions.TOP_LEFT,\n    transition: transitions.FADE,\n    timeout: 3000\n};\n\ndeclare global {\n    interface Window {\n        showAlert: any;\n        eel: any;\n    }\n}\n\nwindow.eel.set_host(`ws://${window.location.host}`);\nwindow.oncontextmenu = () => false;\n\nwindow.addEventListener('load', () => {\n    window.addEventListener('error', (event: any) =>\n        console.log(`Window Error: ${event.message}`));\n\n    window.eel._websocket.addEventListener('open', () =>\n        console.log('Host Websocket Connected!'));\n\n    window.eel._websocket.addEventListener('error', (event: any) => {\n        console.log(`Websocket Error: ${event.message}`);\n        window.alert('Host Connection Error. Closing!');\n        window.close();\n    });\n\n    window.eel._websocket.addEventListener('close', () => {\n        window.alert('Host Disconnected. Closing!');\n        window.close();\n    });\n});\n\nReactDOM.render(\n    <React.StrictMode>\n        <Provider store={store}>\n            <GlobalStyle />\n            <AlertProvider template={AlertTemplate} {...alertOptions}>\n                <App />\n            </AlertProvider>\n        </Provider>\n    </React.StrictMode>,\n    document.getElementById('root')\n);\n","// @ts-nocheck\r\nimport { AlertButton, AlertButtonCross } from '../design/components/Alert.design';\r\nimport React from 'react';\r\n\r\nexport const AlertTemplate = ({ style, options, message, close }) => (\r\n    <AlertButton style={style} color={options.type} bgColor={options.type}>\r\n        {message}\r\n        {options.type === 'SUCCESS' && '!'}\r\n        {options.type === 'DANGER' && '.'}\r\n        {options.type === 'WARNING' && '.'}\r\n        {options.type === 'INFO' && '.'}\r\n        <AlertButtonCross onClick={close}>x</AlertButtonCross>\r\n    </AlertButton>\r\n);\r\n"],"sourceRoot":""}