Skip to content

Commit 4f94a88

Browse files
committed
feat(fullscreen): implement fullscreen toggle functionality with event tracking
1 parent d257631 commit 4f94a88

File tree

1 file changed

+69
-37
lines changed

1 file changed

+69
-37
lines changed

src/components/ContentWrap.jsx

Lines changed: 69 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -428,9 +428,9 @@ export default class ContentWrap extends Component {
428428
this.props.onLogin();
429429
return;
430430
}
431-
const png = await this.getPngBlob();
432-
saveAs(png, 'zenuml.png');
433-
mixpanel.track({ event: 'downloadPng', category: 'ui' });
431+
const png = await this.getPngBlob();
432+
saveAs(png, 'zenuml.png');
433+
mixpanel.track({ event: 'downloadPng', category: 'ui' });
434434
}
435435

436436
async getPngBlob() {
@@ -818,11 +818,42 @@ export default class ContentWrap extends Component {
818818
}
819819

820820
async toggleFullscreen() {
821-
if (this.frame) {
822-
if (document.fullscreenElement) {
823-
await document.exitFullscreen();
824-
} else {
825-
await this.frame.requestFullscreen();
821+
const demoElement = document.getElementById('js-demo-side');
822+
if (!document.fullscreenElement) {
823+
if (demoElement.requestFullscreen) {
824+
demoElement.requestFullscreen();
825+
trackEvent('ui', 'enterFullscreen');
826+
mixpanel.track('Enter Fullscreen');
827+
} else if (demoElement.mozRequestFullScreen) { /* Firefox */
828+
demoElement.mozRequestFullScreen();
829+
trackEvent('ui', 'enterFullscreen');
830+
mixpanel.track('Enter Fullscreen');
831+
} else if (demoElement.webkitRequestFullscreen) { /* Chrome, Safari & Opera */
832+
demoElement.webkitRequestFullscreen();
833+
trackEvent('ui', 'enterFullscreen');
834+
mixpanel.track('Enter Fullscreen');
835+
} else if (demoElement.msRequestFullscreen) { /* IE/Edge */
836+
demoElement.msRequestFullscreen();
837+
trackEvent('ui', 'enterFullscreen');
838+
mixpanel.track('Enter Fullscreen');
839+
}
840+
} else {
841+
if (document.exitFullscreen) {
842+
document.exitFullscreen();
843+
trackEvent('ui', 'exitFullscreen');
844+
mixpanel.track('Exit Fullscreen');
845+
} else if (document.mozCancelFullScreen) { /* Firefox */
846+
document.mozCancelFullScreen();
847+
trackEvent('ui', 'exitFullscreen');
848+
mixpanel.track('Exit Fullscreen');
849+
} else if (document.webkitExitFullscreen) { /* Chrome, Safari and Opera */
850+
document.webkitExitFullscreen();
851+
trackEvent('ui', 'exitFullscreen');
852+
mixpanel.track('Exit Fullscreen');
853+
} else if (document.msExitFullscreen) { /* IE/Edge */
854+
document.msExitFullscreen();
855+
trackEvent('ui', 'exitFullscreen');
856+
mixpanel.track('Exit Fullscreen');
826857
}
827858
}
828859
}
@@ -971,16 +1002,6 @@ export default class ContentWrap extends Component {
9711002
{window.zenumlDesktop ? null : (
9721003
<div className="shrink-0 relative z-10 bg-gray-200 py-2 px-6 flex justify-between">
9731004
<div className="flex gap-4 items-center text-black-100">
974-
<button
975-
className="px-3 py-1 bg-gray-300 text-gray-600 flex items-center gap-1.5 rounded-lg hover:bg-gray-400 duration-200"
976-
aria-label="Toggle Fullscreen"
977-
onClick={this.toggleFullscreen.bind(this)}
978-
>
979-
<svg className="w-5 h-5 fill-current">
980-
<use xlinkHref="#fullscreen-icon" />
981-
</svg>
982-
<span>Fullscreen</span>
983-
</button>
9841005
<button
9851006
onClick={() => this.props.layoutBtnClickHandler(1)}
9861007
id="layoutBtn1"
@@ -1014,42 +1035,53 @@ export default class ContentWrap extends Component {
10141035
</div>
10151036
<div className="flex items-center gap-3 text-sm font-semibold">
10161037
<button
1017-
className="px-3 py-1 bg-gray-300 text-gray-600 flex items-center gap-1.5 rounded-lg hover:bg-gray-400 duration-200"
1018-
aria-label="Export as PNG"
1019-
onClick={this.exportPngClickHandler.bind(this)}
1038+
className="px-3 py-1 bg-gray-300 text-gray-600 flex items-center gap-1.5 rounded-lg hover:bg-gray-400 duration-200"
1039+
aria-label="Toggle Fullscreen"
1040+
onClick={this.toggleFullscreen.bind(this)}
1041+
title="Toggle Fullscreen Presenting Mode"
1042+
>
1043+
<svg className="w-5 h-5 fill-current">
1044+
<use xlinkHref="#fullscreen-icon"/>
1045+
</svg>
1046+
<span>Present</span>
1047+
</button>
1048+
<button
1049+
className="px-3 py-1 bg-gray-300 text-gray-600 flex items-center gap-1.5 rounded-lg hover:bg-gray-400 duration-200"
1050+
aria-label="Export as PNG"
1051+
onClick={this.exportPngClickHandler.bind(this)}
10201052
>
10211053
<svg className="w-5 h-5 fill-current">
1022-
<use xlinkHref="#icon-download" />
1054+
<use xlinkHref="#icon-download"/>
10231055
</svg>
10241056
<span>PNG</span>
10251057
</button>
10261058
<button
1027-
className="px-3 py-1 bg-gray-300 text-gray-600 flex items-center gap-1.5 rounded-lg hover:bg-gray-400 duration-200"
1028-
aria-label="Copy PNG to Clipboard"
1029-
onClick={this.copyImageClickHandler.bind(this)}
1059+
className="px-3 py-1 bg-gray-300 text-gray-600 flex items-center gap-1.5 rounded-lg hover:bg-gray-400 duration-200"
1060+
aria-label="Copy PNG to Clipboard"
1061+
onClick={this.copyImageClickHandler.bind(this)}
10301062
>
10311063
<svg className="w-5 h-5 fill-current">
1032-
<use xlinkHref="#icon-copy" />
1064+
<use xlinkHref="#icon-copy"/>
10331065
</svg>
10341066
<span>Copy PNG</span>
10351067
</button>
10361068
</div>
10371069
</div>
10381070
)}
10391071
<Console
1040-
isConsoleOpen={this.state.isConsoleOpen}
1041-
onConsoleHeaderDblClick={this.consoleHeaderDblClickHandler.bind(
1042-
this,
1043-
)}
1044-
onClearConsoleBtnClick={this.clearConsoleBtnClickHandler.bind(
1045-
this,
1046-
)}
1047-
toggleConsole={this.toggleConsole.bind(this)}
1048-
onEvalInputKeyup={this.evalConsoleExpr.bind(this)}
1049-
onReady={(el) => (this.consoleCm = el)}
1072+
isConsoleOpen={this.state.isConsoleOpen}
1073+
onConsoleHeaderDblClick={this.consoleHeaderDblClickHandler.bind(
1074+
this,
1075+
)}
1076+
onClearConsoleBtnClick={this.clearConsoleBtnClickHandler.bind(
1077+
this,
1078+
)}
1079+
toggleConsole={this.toggleConsole.bind(this)}
1080+
onEvalInputKeyup={this.evalConsoleExpr.bind(this)}
1081+
onReady={(el) => (this.consoleCm = el)}
10501082
/>
10511083
<CssSettingsModal
1052-
show={this.state.isCssSettingsModalOpen}
1084+
show={this.state.isCssSettingsModalOpen}
10531085
closeHandler={async () =>
10541086
await this.setState({ isCssSettingsModalOpen: false })
10551087
}

0 commit comments

Comments
 (0)