Skip to content

Commit ba67dd4

Browse files
feat: add responsive fullscreen toggle and fix tab deprecations
1 parent c53ed31 commit ba67dd4

1 file changed

Lines changed: 63 additions & 12 deletions

File tree

components/TextBox.js

Lines changed: 63 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,34 @@
1-
import { Button, Tabs, Dropdown, Menu, Space } from "antd";
1+
import { Button, Tabs, Dropdown, Menu, Space } from "antd"; // Restored Menu
22
const { TabPane } = Tabs;
3-
import { DownOutlined, PlayCircleOutlined } from "@ant-design/icons";
3+
import { DownOutlined, PlayCircleOutlined,FullscreenOutlined,FullscreenExitOutlined} from "@ant-design/icons";
4+
import { useIsMobile } from "./useIsMobile";
5+
import React, { useState, useEffect } from 'react'; // Added useEffect
46
import preinstalled_programs from "../utils/preinstalled_programs";
57
import dynamic from 'next/dynamic'
68
const Editor = dynamic(import('./Editor'), {
79
ssr: false
810
})
911

1012
function TextBox({ disabled, sourceCode, setSourceCode, exampleName, setExampleName, activeTab, handleUserTabChange, myHeight }) {
13+
const isMobile = useIsMobile(); // ADDED THIS
14+
// ADDED THIS FUNCTION
15+
const [isFullScreen, setIsFullScreen] = useState(false);
16+
17+
// Listen for fullscreen changes (Esc key, browser buttons, etc.)
18+
useEffect(() => {
19+
const handler = () => setIsFullScreen(!!document.fullscreenElement);
20+
document.addEventListener("fullscreenchange", handler);
21+
return () => document.removeEventListener("fullscreenchange", handler);
22+
}, []);
23+
24+
const handleFullScreen = () => {
25+
if (!document.fullscreenElement) {
26+
document.documentElement.requestFullscreen();
27+
} else {
28+
document.exitFullscreen();
29+
}
30+
};
31+
1132
var menu_items = [];
1233
for (let category in preinstalled_programs) {
1334
var category_examples = []
@@ -31,27 +52,57 @@ function TextBox({ disabled, sourceCode, setSourceCode, exampleName, setExampleN
3152

3253
const examples_menu = (<Menu items={menu_items}></Menu>);
3354
const extraOperations = {
34-
right: <Button disabled={disabled} onClick={() => handleUserTabChange(activeTab)}> <PlayCircleOutlined /> Run </Button>,
35-
left: <Dropdown overlay={examples_menu} trigger="hover">
55+
right: (
56+
<Space>
57+
<Button
58+
onClick={handleFullScreen}
59+
icon={isFullScreen ? <FullscreenExitOutlined /> : <FullscreenOutlined />}
60+
>
61+
{/* Now both text options only show on desktop, keeping mobile clean */}
62+
{!isMobile && (isFullScreen ? " Exit Fullscreen" : " Fullscreen")}
63+
</Button>
64+
<Button
65+
disabled={disabled}
66+
onClick={() => handleUserTabChange(activeTab)}
67+
icon={<PlayCircleOutlined />}
68+
>
69+
Run
70+
</Button>
71+
</Space>
72+
),
73+
left: (
74+
<Dropdown menu={{ items: menu_items }} trigger={["hover"]}>
3675
<a onClick={(e) => e.preventDefault()}>
37-
<Space style={{marginRight: "10px"}}>
38-
Examples <DownOutlined />
76+
<Space style={{ marginRight: "10px" }}>
77+
{!isMobile && "Examples"} <DownOutlined />
3978
</Space>
4079
</a>
4180
</Dropdown>
81+
)
4282
};
4383

44-
return (
45-
<div className="card-container" style={{height: "100%" }}>
46-
<Tabs tabBarExtraContent={extraOperations} style={{ height: "100%" }}>
47-
<TabPane tab={`${exampleName}.f90`} key="1" style={{ height: myHeight }}>
84+
const tabItems = [
85+
{
86+
key: '1',
87+
label: `${exampleName}.f90`,
88+
children: (
89+
<div style={{ height: myHeight }}>
4890
<Editor
4991
sourceCode={sourceCode}
5092
setSourceCode={setSourceCode}
5193
/>
52-
</TabPane>
94+
</div>
95+
),
96+
},
97+
];
5398

54-
</Tabs>
99+
return (
100+
<div className="card-container" style={{height: "100%" }}>
101+
<Tabs
102+
tabBarExtraContent={extraOperations}
103+
style={{ height: "100%" }}
104+
items={tabItems} // UPDATED TO MODERN SYNTAX
105+
/>
55106
</div>
56107
);
57108
}

0 commit comments

Comments
 (0)