Skip to content

Commit ae48f8d

Browse files
Merge pull request #20 from mezh-hq/feature/airplane-mode
Feat: added airplane mode to boost performance
2 parents 07848eb + e381aab commit ae48f8d

File tree

11 files changed

+71
-14
lines changed

11 files changed

+71
-14
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { Plane } from "lucide-react";
2+
import { useSelector } from "react-redux";
3+
import { twMerge } from "tailwind-merge";
4+
import { store } from "@/store";
5+
import { toggleAirplaneMode } from "@/store/reducers/editor";
6+
import type { ISTKProps } from "@/types";
7+
import { Button, Tooltip, TooltipContent, TooltipTrigger } from "../../core";
8+
9+
const toggleAirPlaneMode = () => store.dispatch(toggleAirplaneMode());
10+
11+
export const AirplaneMode = (props: Pick<ISTKProps, "styles" | "options">) => {
12+
const airplaneMode = useSelector((state: any) => state.editor.airplaneMode);
13+
14+
return (
15+
<Tooltip>
16+
<TooltipTrigger
17+
className={props.styles?.core?.tooltip?.trigger?.className}
18+
style={props.styles?.core?.tooltip?.trigger?.properties}
19+
>
20+
<Button
21+
variant={airplaneMode ? "primary" : "secondary"}
22+
className={twMerge("w-8 h-8 p-2", props.styles?.airplaneControl?.button?.className)}
23+
onClick={toggleAirPlaneMode}
24+
style={props.styles?.airplaneControl?.button?.properties}
25+
>
26+
<Plane size={16} />
27+
</Button>
28+
</TooltipTrigger>
29+
<TooltipContent
30+
sideOffset={15}
31+
className={props.styles?.core?.tooltip?.content?.className}
32+
style={props.styles?.core?.tooltip?.content?.properties}
33+
>
34+
{airplaneMode ? "Disable" : "Enable"} Airplane Mode
35+
</TooltipContent>
36+
</Tooltip>
37+
);
38+
};

src/components/workspace/dock/index.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { Button } from "../../core";
1010
import { Tool } from "../../toolbar/data";
1111
import { showPostOffsetElements, showPreOffsetElements } from "../elements";
1212
import { default as Reload } from "../reload";
13+
import { AirplaneMode } from "./airplane-mode";
1314
import { default as DockHandler } from "./handler";
1415
import { VisibilityFreezeScale, VisibilityOffset } from "./visibility";
1516

@@ -104,6 +105,7 @@ const Dock = (props: Pick<ISTKProps, "mode" | "styles" | "options" | "events">)
104105
const isDesigner = props.mode === "designer";
105106
const showZoomControls = props.options?.showZoomControls ?? true;
106107
const showVisibilityControls = isDesigner && (props.options?.showVisibilityControls ?? true);
108+
const showAirplaneControl = isDesigner && props.options?.showAirplaneControl;
107109
const showReloadButton = props.options?.showReloadButton ?? false;
108110
const isUser = props.mode === "user";
109111

@@ -187,6 +189,7 @@ const Dock = (props: Pick<ISTKProps, "mode" | "styles" | "options" | "events">)
187189
</>
188190
)}
189191
{showVisibilityControls && <VisibilityOffset {...props} />}
192+
{showAirplaneControl && <AirplaneMode />}
190193
</div>
191194
</div>
192195
)}

src/components/workspace/dock/visibility.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,6 @@ const unsetVisibility = () => {
2929
export const VisibilityFreezeScale = (props: Pick<ISTKProps, "mode" | "styles" | "options">) => {
3030
const initialViewBoxScale = useSelector((state: any) => state.editor.initialViewBoxScale);
3131

32-
const styles = props.styles?.visibilityControls;
33-
3432
return (
3533
<Tooltip>
3634
<TooltipTrigger
@@ -39,9 +37,9 @@ export const VisibilityFreezeScale = (props: Pick<ISTKProps, "mode" | "styles" |
3937
>
4038
<Button
4139
variant={initialViewBoxScale ? "primary" : "secondary"}
42-
className={twMerge("w-8 h-8 p-2", styles?.buttons?.className)}
40+
className={twMerge("w-8 h-8 p-2", props.styles?.visibilityControls?.buttons?.className)}
4341
onClick={initialViewBoxScale ? unfreeze : freeze}
44-
style={styles?.buttons?.properties}
42+
style={props.styles?.visibilityControls?.buttons?.properties}
4543
>
4644
{initialViewBoxScale ? <Lock size={16} /> : <Unlock size={16} />}
4745
</Button>
@@ -60,8 +58,6 @@ export const VisibilityFreezeScale = (props: Pick<ISTKProps, "mode" | "styles" |
6058
export const VisibilityOffset = (props: Pick<ISTKProps, "mode" | "styles" | "options">) => {
6159
const visibilityOffset = useSelector((state: any) => state.editor.visibilityOffset);
6260

63-
const styles = props.styles?.visibilityControls;
64-
6561
return (
6662
<Tooltip>
6763
<TooltipTrigger
@@ -70,9 +66,9 @@ export const VisibilityOffset = (props: Pick<ISTKProps, "mode" | "styles" | "opt
7066
>
7167
<Button
7268
variant={visibilityOffset === 0 ? "secondary" : "primary"}
73-
className={twMerge("w-8 h-8 p-2", styles?.buttons?.className)}
69+
className={twMerge("w-8 h-8 p-2", props.styles?.visibilityControls?.buttons?.className)}
7470
onClick={visibilityOffset === 0 ? setVisibility : unsetVisibility}
75-
style={styles?.buttons?.properties}
71+
style={props.styles?.visibilityControls?.buttons?.properties}
7672
>
7773
{visibilityOffset === 0 ? <Scan size={16} /> : <Focus size={16} />}
7874
</Button>

src/components/workspace/elements/seat.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export interface ISeatProps extends ISeat {
2626
sections: ISection[];
2727
onClick: (e: any) => void;
2828
isSelected?: boolean;
29+
airplaneMode?: boolean;
2930
}
3031

3132
const Seat: React.FC<ISeatProps> = forwardRef(
@@ -44,6 +45,7 @@ const Seat: React.FC<ISeatProps> = forwardRef(
4445
rotation,
4546
element,
4647
isSelected,
48+
airplaneMode,
4749
...props
4850
},
4951
ref: any
@@ -54,7 +56,7 @@ const Seat: React.FC<ISeatProps> = forwardRef(
5456
[sections, categoryObject]
5557
);
5658

57-
const showLabel = consumer.options?.showSeatLabels ?? true;
59+
const showLabel = !airplaneMode && (consumer.options?.showSeatLabels ?? true);
5860

5961
const consumerSeatStatusColors = consumer.styles?.elements?.seat?.statusColors;
6062

src/components/workspace/index.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,23 @@ export const Workspace: React.FC<ISTKProps> = (props) => {
2323
const selectedElementIds = useSelector((state: any) => state.editor.selectedElementIds);
2424
const selectedPolylineId = useSelector((state: any) => state.editor.selectedPolylineId);
2525
const selectedTool = useSelector((state: any) => state.toolbar.selectedTool);
26+
const airplaneMode = useSelector((state: any) => state.editor.airplaneMode);
2627

2728
const elementProps = useCallback(
2829
(elem) => ({
2930
id: elem.id,
3031
x: elem.x,
3132
y: elem.y,
3233
isSelected: selectedElementIds.includes(elem.id),
34+
airplaneMode,
3335
label: elem.label,
3436
color: elem.color,
3537
stroke: elem.stroke,
3638
rotation: elem.rotation,
3739
consumer: props,
3840
element: elem
3941
}),
40-
[selectedElementIds]
42+
[selectedElementIds, airplaneMode]
4143
);
4244

4345
const onWorkspaceHover = useCallback(

src/store/reducers/editor/index.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,8 @@ const initialState = {
8484
images: [],
8585
initialViewBoxScale: null,
8686
initialViewBoxScaleForWidth: null,
87-
visibilityOffset: 0
87+
visibilityOffset: 0,
88+
airplaneMode: false
8889
};
8990

9091
export const slice = createSlice({
@@ -252,6 +253,7 @@ export const slice = createSlice({
252253
state.initialViewBoxScale = data.workspace?.initialViewBoxScale;
253254
state.initialViewBoxScaleForWidth = data.workspace?.initialViewBoxScaleForWidth;
254255
state.visibilityOffset = data.workspace?.visibilityOffset ?? state.visibilityOffset;
256+
state.airplaneMode = data.workspace?.airplaneMode ?? state.airplaneMode;
255257
Object.keys(data).forEach((key) => {
256258
state[key] = data[key] ?? state[key];
257259
});
@@ -274,6 +276,9 @@ export const slice = createSlice({
274276
state.selectedElementIds = state.selectedElementIds.filter((id) => !ids.includes(id));
275277
state.selectedPolylineId =
276278
state.selectedPolylineId && !ids.includes(state.selectedPolylineId) ? null : state.selectedPolylineId;
279+
},
280+
toggleAirplaneMode: (state) => {
281+
state.airplaneMode = !state.airplaneMode;
277282
}
278283
}
279284
});
@@ -320,7 +325,8 @@ export const {
320325
sync,
321326
setInitialViewBoxScale,
322327
setVisibilityOffset,
323-
deleteElements
328+
deleteElements,
329+
toggleAirplaneMode
324330
} = slice.actions;
325331

326332
export const selectPolylineById = (id: string) =>

src/stories/designer/categorized.stories.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ export const Story = {
1212
render: (props) => (
1313
<SeatToolkit
1414
mode={STKMode.DESIGNER}
15+
options={{
16+
showAirplaneControl: true
17+
}}
1518
data={{
1619
name: "Categorized Example",
1720
categories: [

src/stories/designer/persisted.stories.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ export const Story = {
1919
mode={STKMode.DESIGNER}
2020
data={data}
2121
options={{
22-
exportButtonText: "Save to Session Storage"
22+
exportButtonText: "Save to Session Storage",
23+
showAirplaneControl: true
2324
}}
2425
events={{
2526
onExport: (data) => {

src/types/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ export interface ISTKData {
5959
initialViewBoxScale?: number;
6060
initialViewBoxScaleForWidth?: number;
6161
visibilityOffset?: number;
62+
airplaneMode?: boolean;
6263
};
6364
}
6465

@@ -74,6 +75,7 @@ export interface ISTKProps {
7475
showSeatLabels?: boolean;
7576
showZoomControls?: boolean;
7677
showVisibilityControls?: boolean;
78+
showAirplaneControl?: boolean;
7779
showReloadButton?: boolean;
7880
exportButtonText?: string;
7981
operationTriggerIcon?: React.FC;

src/types/styles.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ export interface IStyles {
3838
visibilityControls?: {
3939
buttons?: IStyle;
4040
};
41+
airplaneControl?: {
42+
button?: IStyle;
43+
};
4144
reloadButton?: IStyle;
4245
elements?: {
4346
seat?: {

src/utils/transformer.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,8 @@ export const stateToJSON = (): ISTKData => {
110110
workspace: {
111111
initialViewBoxScale: state.initialViewBoxScale,
112112
initialViewBoxScaleForWidth: state.initialViewBoxScaleForWidth,
113-
visibilityOffset: state.visibilityOffset
113+
visibilityOffset: state.visibilityOffset,
114+
airplaneMode: state.airplaneMode
114115
}
115116
};
116117
};

0 commit comments

Comments
 (0)