2020-09-04 07:35:57 +08:00
|
|
|
import React, { Component } from 'react';
|
|
|
|
import Draggable from 'react-draggable';
|
|
|
|
import Resizable from 're-resizable';
|
|
|
|
import { defineMessages, injectIntl } from 'react-intl';
|
2021-05-18 04:25:07 +08:00
|
|
|
import { styles } from './styles.scss';
|
2020-09-04 07:35:57 +08:00
|
|
|
import Icon from '/imports/ui/components/icon/component';
|
|
|
|
import Button from '/imports/ui/components/button/component';
|
|
|
|
import Toggle from '/imports/ui/components/switch/component';
|
|
|
|
import Storage from '/imports/ui/services/storage/session';
|
|
|
|
import { withLayoutConsumer } from '/imports/ui/components/layout/context';
|
2021-01-20 01:06:32 +08:00
|
|
|
import ChatLogger from '/imports/ui/components/chat/chat-logger/ChatLogger';
|
2020-09-04 07:35:57 +08:00
|
|
|
|
|
|
|
const intlMessages = defineMessages({
|
|
|
|
modalClose: {
|
|
|
|
id: 'app.modal.close',
|
|
|
|
description: 'Close',
|
|
|
|
},
|
|
|
|
modalCloseDescription: {
|
|
|
|
id: 'app.modal.close.description',
|
|
|
|
description: 'Disregards changes and closes the modal',
|
|
|
|
},
|
|
|
|
debugWindowTitle: {
|
|
|
|
id: 'app.debugWindow.windowTitle',
|
|
|
|
description: 'Debug window title',
|
|
|
|
},
|
|
|
|
userAgentLabel: {
|
|
|
|
id: 'app.debugWindow.form.userAgentLabel',
|
|
|
|
description: 'User agent form label',
|
|
|
|
},
|
|
|
|
copyButtonLabel: {
|
|
|
|
id: 'app.debugWindow.form.button.copy',
|
|
|
|
description: 'User agent form copy button',
|
|
|
|
},
|
|
|
|
enableAutoarrangeLayoutLabel: {
|
|
|
|
id: 'app.debugWindow.form.enableAutoarrangeLayoutLabel',
|
|
|
|
description: 'Enable Autoarrange layout label',
|
|
|
|
},
|
|
|
|
enableAutoarrangeLayoutDescription: {
|
|
|
|
id: 'app.debugWindow.form.enableAutoarrangeLayoutDescription',
|
|
|
|
description: 'Enable Autoarrange layout description',
|
|
|
|
},
|
2021-06-15 05:08:39 +08:00
|
|
|
chatLoggerLabel: {
|
|
|
|
id: 'app.debugWindow.form.chatLoggerLabel',
|
|
|
|
description: 'Chat logger level form label',
|
|
|
|
},
|
|
|
|
applyButtonLabel: {
|
|
|
|
id: 'app.debugWindow.form.button.apply',
|
|
|
|
description: 'Chat logger level form apply button',
|
|
|
|
},
|
2021-05-11 04:41:52 +08:00
|
|
|
on: {
|
|
|
|
id: 'app.switch.onLabel',
|
|
|
|
description: 'label for toggle switch on state',
|
|
|
|
},
|
|
|
|
off: {
|
|
|
|
id: 'app.switch.offLabel',
|
|
|
|
description: 'label for toggle switch off state',
|
|
|
|
},
|
2020-09-04 07:35:57 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
const DEBUG_WINDOW_ENABLED = Meteor.settings.public.app.enableDebugWindow;
|
|
|
|
const SHOW_DEBUG_WINDOW_ACCESSKEY = Meteor.settings.public.app.shortcuts.openDebugWindow.accesskey;
|
|
|
|
|
|
|
|
class DebugWindow extends Component {
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
|
|
|
|
|
|
|
this.state = {
|
|
|
|
showDebugWindow: false,
|
2021-01-20 01:06:32 +08:00
|
|
|
logLevel: ChatLogger.getLogLevel(),
|
2021-05-11 04:41:52 +08:00
|
|
|
autoArrangeLayout: Storage.getItem('autoArrangeLayout'),
|
2020-09-04 07:35:57 +08:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
componentDidMount() {
|
|
|
|
document.addEventListener('keyup', (event) => {
|
2021-04-28 04:28:59 +08:00
|
|
|
const { key, code } = event;
|
|
|
|
const eventKey = key.toUpperCase();
|
|
|
|
const eventCode = code;
|
|
|
|
if (DEBUG_WINDOW_ENABLED && event.altKey && (eventKey === SHOW_DEBUG_WINDOW_ACCESSKEY || eventCode === `Key${SHOW_DEBUG_WINDOW_ACCESSKEY}`)) {
|
2020-09-04 07:35:57 +08:00
|
|
|
this.debugWindowToggle();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
setShowDebugWindow(showDebugWindow) {
|
|
|
|
this.setState({ showDebugWindow });
|
|
|
|
}
|
|
|
|
|
|
|
|
debugWindowToggle() {
|
|
|
|
const { showDebugWindow } = this.state;
|
|
|
|
if (showDebugWindow) {
|
|
|
|
this.setShowDebugWindow(false);
|
|
|
|
} else {
|
|
|
|
this.setShowDebugWindow(true);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-05-11 04:41:52 +08:00
|
|
|
displaySettingsStatus(status) {
|
|
|
|
const { intl } = this.props;
|
|
|
|
|
|
|
|
return (
|
|
|
|
<span className={styles.toggleLabel}>
|
|
|
|
{status ? intl.formatMessage(intlMessages.on)
|
|
|
|
: intl.formatMessage(intlMessages.off)}
|
|
|
|
</span>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2020-09-04 07:35:57 +08:00
|
|
|
autoArrangeToggle() {
|
|
|
|
const { layoutContextDispatch } = this.props;
|
|
|
|
const autoArrangeLayout = Storage.getItem('autoArrangeLayout');
|
2021-05-11 04:41:52 +08:00
|
|
|
|
|
|
|
this.setState({
|
|
|
|
autoArrangeLayout: !autoArrangeLayout,
|
|
|
|
});
|
|
|
|
|
2020-09-04 07:35:57 +08:00
|
|
|
layoutContextDispatch(
|
|
|
|
{
|
|
|
|
type: 'setAutoArrangeLayout',
|
|
|
|
value: !autoArrangeLayout,
|
|
|
|
},
|
|
|
|
);
|
2021-05-11 04:41:52 +08:00
|
|
|
|
2020-09-04 07:35:57 +08:00
|
|
|
window.dispatchEvent(new Event('autoArrangeChanged'));
|
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
2021-01-20 01:06:32 +08:00
|
|
|
const { showDebugWindow, logLevel } = this.state;
|
|
|
|
const chatLoggerLevelsNames = Object.keys(ChatLogger.levels);
|
2020-09-04 07:35:57 +08:00
|
|
|
|
|
|
|
if (!DEBUG_WINDOW_ENABLED || !showDebugWindow) return false;
|
|
|
|
|
2021-06-22 02:49:25 +08:00
|
|
|
const { intl } = this.props;
|
2021-05-11 04:41:52 +08:00
|
|
|
const { autoArrangeLayout } = this.state;
|
|
|
|
|
2020-09-04 07:35:57 +08:00
|
|
|
return (
|
|
|
|
<Draggable
|
|
|
|
handle="#debugWindowHeader"
|
|
|
|
bounds="body"
|
|
|
|
enableUserSelectHack={false}
|
|
|
|
>
|
|
|
|
<Resizable
|
|
|
|
className={styles.debugWindowWrapper}
|
|
|
|
minWidth={window.innerWidth * 0.2}
|
|
|
|
minHeight={window.innerHeight * 0.2}
|
|
|
|
enable={{
|
|
|
|
top: false,
|
|
|
|
bottom: false,
|
|
|
|
left: false,
|
|
|
|
right: false,
|
|
|
|
topLeft: false,
|
|
|
|
topRight: false,
|
|
|
|
bottomLeft: false,
|
|
|
|
bottomRight: true,
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
<div
|
|
|
|
className={styles.debugWindow}
|
|
|
|
>
|
|
|
|
<div
|
|
|
|
id="debugWindowHeader"
|
|
|
|
className={styles.header}
|
|
|
|
>
|
|
|
|
<Icon iconName="fit_to_screen" className={styles.moveIcon} />
|
|
|
|
<div className={styles.title}>
|
|
|
|
{intl.formatMessage(intlMessages.debugWindowTitle)}
|
|
|
|
</div>
|
|
|
|
<Button
|
|
|
|
className={styles.close}
|
|
|
|
label={intl.formatMessage(intlMessages.modalClose)}
|
|
|
|
aria-label={`${intl.formatMessage(intlMessages.modalClose)} ${intl.formatMessage(intlMessages.debugWindowTitle)}`}
|
|
|
|
icon="close"
|
|
|
|
circle
|
|
|
|
hideLabel
|
|
|
|
onClick={() => this.setShowDebugWindow(false)}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div className={styles.debugWindowContent}>
|
|
|
|
<div className={styles.table}>
|
|
|
|
<div className={styles.row}>
|
|
|
|
<div className={styles.cell}>
|
|
|
|
{`${intl.formatMessage(intlMessages.userAgentLabel)}:`}
|
|
|
|
</div>
|
|
|
|
<div className={styles.cell}>
|
|
|
|
<input
|
|
|
|
className={styles.userAgentInput}
|
|
|
|
id="debugModalUserAgent"
|
|
|
|
type="text"
|
|
|
|
value={window.navigator.userAgent}
|
|
|
|
readOnly
|
|
|
|
/>
|
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
onClick={() => navigator.clipboard.writeText(window.navigator.userAgent)}
|
|
|
|
>
|
|
|
|
{`${intl.formatMessage(intlMessages.copyButtonLabel)}`}
|
|
|
|
</button>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div className={styles.row}>
|
|
|
|
<div className={styles.cell}>
|
|
|
|
{`${intl.formatMessage(intlMessages.enableAutoarrangeLayoutLabel)}:`}
|
|
|
|
</div>
|
|
|
|
<div className={styles.cell}>
|
|
|
|
<div className={styles.cellContent}>
|
2021-05-11 04:41:52 +08:00
|
|
|
{this.displaySettingsStatus(autoArrangeLayout)}
|
2020-09-04 07:35:57 +08:00
|
|
|
<Toggle
|
|
|
|
className={styles.autoArrangeToggle}
|
|
|
|
icons={false}
|
|
|
|
defaultChecked={autoArrangeLayout}
|
|
|
|
onChange={() => this.autoArrangeToggle()}
|
|
|
|
ariaLabel={intl.formatMessage(intlMessages.enableAutoarrangeLayoutLabel)}
|
2021-05-11 04:41:52 +08:00
|
|
|
showToggleLabel={false}
|
2020-09-04 07:35:57 +08:00
|
|
|
/>
|
|
|
|
<p>{`${intl.formatMessage(intlMessages.enableAutoarrangeLayoutDescription)}`}</p>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2021-01-20 01:06:32 +08:00
|
|
|
<div className={styles.row}>
|
|
|
|
<div className={styles.cell}>
|
2021-06-15 05:08:39 +08:00
|
|
|
{`${intl.formatMessage(intlMessages.chatLoggerLabel)}:`}
|
2021-01-20 01:06:32 +08:00
|
|
|
</div>
|
|
|
|
<div className={styles.cell}>
|
|
|
|
<div className={styles.cellContent}>
|
|
|
|
<select
|
|
|
|
style={{ marginRight: '1rem' }}
|
|
|
|
onChange={(ev) => {
|
|
|
|
this.setState({
|
|
|
|
logLevel: ev.target.value,
|
|
|
|
});
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
{
|
|
|
|
chatLoggerLevelsNames.map((i, index) => {
|
|
|
|
return (<option key={`${i}-${index}`}>{i}</option>);
|
|
|
|
})
|
|
|
|
}
|
|
|
|
</select>
|
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
disabled={logLevel === ChatLogger.getLogLevel()}
|
|
|
|
onClick={() => {
|
|
|
|
ChatLogger.setLogLevel(logLevel);
|
|
|
|
this.setState({
|
|
|
|
logLevel: ChatLogger.getLogLevel(),
|
|
|
|
});
|
|
|
|
}}
|
|
|
|
>
|
2021-06-15 05:08:39 +08:00
|
|
|
{`${intl.formatMessage(intlMessages.applyButtonLabel)}`}
|
2021-01-20 01:06:32 +08:00
|
|
|
</button>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
2020-09-04 07:35:57 +08:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</Resizable>
|
|
|
|
</Draggable>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-06-22 02:49:25 +08:00
|
|
|
export default withLayoutConsumer(injectIntl(DebugWindow));
|