summaryrefslogtreecommitdiff
path: root/gui/static/js/main.bca18f22.chunk.js.map
diff options
context:
space:
mode:
Diffstat (limited to 'gui/static/js/main.bca18f22.chunk.js.map')
-rw-r--r--gui/static/js/main.bca18f22.chunk.js.map1
1 files changed, 1 insertions, 0 deletions
diff --git a/gui/static/js/main.bca18f22.chunk.js.map b/gui/static/js/main.bca18f22.chunk.js.map
new file mode 100644
index 0000000..4052a5e
--- /dev/null
+++ b/gui/static/js/main.bca18f22.chunk.js.map
@@ -0,0 +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":""} \ No newline at end of file