|  |  |  | import React, { useEffect, useState } from 'react'; | 
					
						
							|  |  |  | import styled from 'styled-components'; | 
					
						
							|  |  |  | import { switchThemeTo } from '../themes/switchTheme'; | 
					
						
							|  |  |  | import { SessionTheme } from '../themes/SessionTheme'; | 
					
						
							|  |  |  | import { fetch } from '../util/logging'; | 
					
						
							|  |  |  | import { SessionButton, SessionButtonType } from './basic/SessionButton'; | 
					
						
							|  |  |  | import { SessionIconButton } from './icon'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const StyledContent = styled.div`
 | 
					
						
							|  |  |  |   background-color: var(--modal-background-content-color); | 
					
						
							|  |  |  |   color: var(--modal-text-color); | 
					
						
							|  |  |  |   font-family: var(--font-default); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   display: flex; | 
					
						
							|  |  |  |   flex-direction: column; | 
					
						
							|  |  |  |   padding: 20px; | 
					
						
							|  |  |  |   height: 100%; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   .session-button { | 
					
						
							|  |  |  |     margin: 1rem auto 1rem 0; | 
					
						
							|  |  |  |     padding: 1rem; | 
					
						
							|  |  |  |     width: fit-content; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   .session-icon-button { | 
					
						
							|  |  |  |     float: right; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   h1 { | 
					
						
							|  |  |  |     color: var(--modal-text-color); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   textarea { | 
					
						
							|  |  |  |     flex-grow: 1; | 
					
						
							|  |  |  |     width: 100%; | 
					
						
							|  |  |  |     box-sizing: border-box; | 
					
						
							|  |  |  |     padding: var(--margins-md); | 
					
						
							|  |  |  |     background-color: var(--input-background-color); | 
					
						
							|  |  |  |     color: var(--input-text-color); | 
					
						
							|  |  |  |     border: 2px solid var(--border-color); | 
					
						
							|  |  |  |     border-radius: 4px; | 
					
						
							|  |  |  |     resize: none; | 
					
						
							|  |  |  |     min-height: 100px; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     font-family: Monaco, Consolas, 'Courier New', Courier, monospace; | 
					
						
							|  |  |  |     font-size: 12px; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | `;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const DebugLogTextArea = (props: { content: string }) => { | 
					
						
							|  |  |  |   // tslint:disable-next-line: react-a11y-input-elements
 | 
					
						
							|  |  |  |   return <textarea spellCheck="false" rows={10} value={props.content} style={{ height: '100%' }} />; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const DebugLogButtons = (props: { content: string }) => { | 
					
						
							|  |  |  |   return ( | 
					
						
							|  |  |  |     <div className="buttons"> | 
					
						
							|  |  |  |       <SessionButton | 
					
						
							|  |  |  |         text={window.i18n('saveLogToDesktop')} | 
					
						
							|  |  |  |         buttonType={SessionButtonType.Simple} | 
					
						
							|  |  |  |         onClick={() => { | 
					
						
							|  |  |  |           if (props.content.length <= 20) { | 
					
						
							|  |  |  |             // loading
 | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |           (window as any).saveLog(props.content); | 
					
						
							|  |  |  |         }} | 
					
						
							|  |  |  |       /> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | // tslint:disable: no-console
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const DebugLogViewAndSave = () => { | 
					
						
							|  |  |  |   const [content, setContent] = useState(window.i18n('loading')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   useEffect(() => { | 
					
						
							|  |  |  |     const operatingSystemInfo = `Operating System: ${(window as any).getOSRelease()}`; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const commitHashInfo = window.getCommitHash() ? `Commit Hash: ${window.getCommitHash()}` : ''; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // eslint-disable-next-line more/no-then
 | 
					
						
							|  |  |  |     fetch() | 
					
						
							|  |  |  |       .then((text: any) => { | 
					
						
							|  |  |  |         const debugLogWithSystemInfo = `${operatingSystemInfo} ${commitHashInfo} ${text}`; | 
					
						
							|  |  |  |         setContent(debugLogWithSystemInfo); | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |       .catch(console.error); | 
					
						
							|  |  |  |   }, []); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return ( | 
					
						
							|  |  |  |     <> | 
					
						
							|  |  |  |       <DebugLogTextArea content={content} /> | 
					
						
							|  |  |  |       <DebugLogButtons content={content} /> | 
					
						
							|  |  |  |     </> | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | export const DebugLogView = () => { | 
					
						
							|  |  |  |   useEffect(() => { | 
					
						
							|  |  |  |     if (window.theme) { | 
					
						
							|  |  |  |       void switchThemeTo({ | 
					
						
							|  |  |  |         theme: window.theme, | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }, [window.theme]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return ( | 
					
						
							|  |  |  |     <SessionTheme> | 
					
						
							|  |  |  |       <StyledContent> | 
					
						
							|  |  |  |         <div> | 
					
						
							|  |  |  |           <SessionIconButton | 
					
						
							|  |  |  |             aria-label="close debug log" | 
					
						
							|  |  |  |             iconType="exit" | 
					
						
							|  |  |  |             iconSize="medium" | 
					
						
							|  |  |  |             onClick={() => { | 
					
						
							|  |  |  |               window.closeDebugLog(); | 
					
						
							|  |  |  |             }} | 
					
						
							|  |  |  |           /> | 
					
						
							|  |  |  |           <h1> {window.i18n('debugLog')} </h1> | 
					
						
							|  |  |  |           <p> {window.i18n('debugLogExplanation')}</p> | 
					
						
							|  |  |  |         </div> | 
					
						
							|  |  |  |         <DebugLogViewAndSave /> | 
					
						
							|  |  |  |       </StyledContent> | 
					
						
							|  |  |  |     </SessionTheme> | 
					
						
							|  |  |  |   ); | 
					
						
							|  |  |  | }; |