Feat: create isThereModal validate function to prevent modals from opening on top of each other
This commit is contained in:
parent
d07dec9195
commit
4f80346602
4 changed files with 32 additions and 18 deletions
|
|
@ -8,23 +8,29 @@ import useFlowStore from "../../stores/flowStore";
|
||||||
import useFlowsManagerStore from "../../stores/flowsManagerStore";
|
import useFlowsManagerStore from "../../stores/flowsManagerStore";
|
||||||
import { useShortcutsStore } from "../../stores/shortcuts";
|
import { useShortcutsStore } from "../../stores/shortcuts";
|
||||||
import { useStoreStore } from "../../stores/storeStore";
|
import { useStoreStore } from "../../stores/storeStore";
|
||||||
import { classNames } from "../../utils/utils";
|
import { classNames, isThereModal } from "../../utils/utils";
|
||||||
import ForwardedIconComponent from "../genericIconComponent";
|
import ForwardedIconComponent from "../genericIconComponent";
|
||||||
import { Separator } from "../ui/separator";
|
import { Separator } from "../ui/separator";
|
||||||
|
|
||||||
export default function FlowToolbar(): JSX.Element {
|
export default function FlowToolbar(): JSX.Element {
|
||||||
const preventDefault = true;
|
const preventDefault = true;
|
||||||
|
const [open, setOpen] = useState<boolean>(false);
|
||||||
|
const [openCodeModal, setOpenCodeModal] = useState<boolean>(false);
|
||||||
|
const [openShareModal, setOpenShareModal] = useState<boolean>(false);
|
||||||
function handleAPIWShortcut(e: KeyboardEvent) {
|
function handleAPIWShortcut(e: KeyboardEvent) {
|
||||||
|
if (isThereModal() && !openCodeModal) return;
|
||||||
setOpenCodeModal((oldOpen) => !oldOpen);
|
setOpenCodeModal((oldOpen) => !oldOpen);
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleChatWShortcut(e: KeyboardEvent) {
|
function handleChatWShortcut(e: KeyboardEvent) {
|
||||||
|
if (isThereModal() && !open) return;
|
||||||
if (useFlowStore.getState().hasIO) {
|
if (useFlowStore.getState().hasIO) {
|
||||||
setOpen((oldState) => !oldState);
|
setOpen((oldState) => !oldState);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleShareWShortcut(e: KeyboardEvent) {
|
function handleShareWShortcut(e: KeyboardEvent) {
|
||||||
|
if (isThereModal() && !openShareModal) return;
|
||||||
setOpenShareModal((oldState) => !oldState);
|
setOpenShareModal((oldState) => !oldState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -36,10 +42,6 @@ export default function FlowToolbar(): JSX.Element {
|
||||||
useHotkeys(api, handleAPIWShortcut, { preventDefault });
|
useHotkeys(api, handleAPIWShortcut, { preventDefault });
|
||||||
useHotkeys(flow, handleShareWShortcut, { preventDefault });
|
useHotkeys(flow, handleShareWShortcut, { preventDefault });
|
||||||
|
|
||||||
const [open, setOpen] = useState<boolean>(false);
|
|
||||||
const [openCodeModal, setOpenCodeModal] = useState<boolean>(false);
|
|
||||||
const [openShareModal, setOpenShareModal] = useState<boolean>(false);
|
|
||||||
|
|
||||||
const hasIO = useFlowStore((state) => state.hasIO);
|
const hasIO = useFlowStore((state) => state.hasIO);
|
||||||
const hasStore = useStoreStore((state) => state.hasStore);
|
const hasStore = useStoreStore((state) => state.hasStore);
|
||||||
const validApiKey = useStoreStore((state) => state.validApiKey);
|
const validApiKey = useStoreStore((state) => state.validApiKey);
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
import { ReactNode, useEffect, useMemo, useState } from "react";
|
import { ReactNode, useEffect, useMemo, useState } from "react";
|
||||||
import { useHotkeys } from "react-hotkeys-hook";
|
|
||||||
import EditFlowSettings from "../../components/editFlowSettingsComponent";
|
import EditFlowSettings from "../../components/editFlowSettingsComponent";
|
||||||
import IconComponent from "../../components/genericIconComponent";
|
import IconComponent from "../../components/genericIconComponent";
|
||||||
import { TagsSelector } from "../../components/tagsSelectorComponent";
|
import { TagsSelector } from "../../components/tagsSelectorComponent";
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ import {
|
||||||
expandGroupNode,
|
expandGroupNode,
|
||||||
updateFlowPosition,
|
updateFlowPosition,
|
||||||
} from "../../../../utils/reactflowUtils";
|
} from "../../../../utils/reactflowUtils";
|
||||||
import { classNames, cn } from "../../../../utils/utils";
|
import { classNames, cn, isThereModal } from "../../../../utils/utils";
|
||||||
import ToolbarSelectItem from "./toolbarSelectItem";
|
import ToolbarSelectItem from "./toolbarSelectItem";
|
||||||
import RenderIcons from "../../../../components/renderIconComponent";
|
import RenderIcons from "../../../../components/renderIconComponent";
|
||||||
|
|
||||||
|
|
@ -47,6 +47,13 @@ export default function NodeToolbarComponent({
|
||||||
setShowState,
|
setShowState,
|
||||||
onCloseAdvancedModal,
|
onCloseAdvancedModal,
|
||||||
}: nodeToolbarPropsType): JSX.Element {
|
}: nodeToolbarPropsType): JSX.Element {
|
||||||
|
const version = useDarkStore((state) => state.version);
|
||||||
|
const [showModalAdvanced, setShowModalAdvanced] = useState(false);
|
||||||
|
const [showconfirmShare, setShowconfirmShare] = useState(false);
|
||||||
|
const [showOverrideModal, setShowOverrideModal] = useState(false);
|
||||||
|
const [flowComponent, setFlowComponent] = useState<FlowType>(
|
||||||
|
createFlowComponent(cloneDeep(data), version),
|
||||||
|
);
|
||||||
const preventDefault = true;
|
const preventDefault = true;
|
||||||
const isMac = navigator.platform.toUpperCase().includes("MAC");
|
const isMac = navigator.platform.toUpperCase().includes("MAC");
|
||||||
const nodeLength = Object.keys(data.node!.template).filter(
|
const nodeLength = Object.keys(data.node!.template).filter(
|
||||||
|
|
@ -99,20 +106,23 @@ export default function NodeToolbarComponent({
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleShareWShortcut(e: KeyboardEvent) {
|
function handleShareWShortcut(e: KeyboardEvent) {
|
||||||
|
e.preventDefault();
|
||||||
|
if (isThereModal() && !showOverrideModal) return;
|
||||||
if (hasApiKey || hasStore) {
|
if (hasApiKey || hasStore) {
|
||||||
e.preventDefault();
|
|
||||||
setShowconfirmShare((state) => !state);
|
setShowconfirmShare((state) => !state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleCodeWShortcut(e: KeyboardEvent) {
|
function handleCodeWShortcut(e: KeyboardEvent) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
if (isThereModal() && !openModal) return;
|
||||||
if (hasCode) return setOpenModal((state) => !state);
|
if (hasCode) return setOpenModal((state) => !state);
|
||||||
setNoticeData({ title: `You can not access ${data.id} code` });
|
setNoticeData({ title: `You can not access ${data.id} code` });
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleAdvancedWShortcut(e: KeyboardEvent) {
|
function handleAdvancedWShortcut(e: KeyboardEvent) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
if (isThereModal() && !showModalAdvanced) return;
|
||||||
if (!isGroup) {
|
if (!isGroup) {
|
||||||
setShowModalAdvanced((state) => !state);
|
setShowModalAdvanced((state) => !state);
|
||||||
}
|
}
|
||||||
|
|
@ -120,11 +130,12 @@ export default function NodeToolbarComponent({
|
||||||
|
|
||||||
function handleSaveWShortcut(e: KeyboardEvent) {
|
function handleSaveWShortcut(e: KeyboardEvent) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
if (isThereModal() && !showOverrideModal) return;
|
||||||
if (isSaved) {
|
if (isSaved) {
|
||||||
setShowOverrideModal((state) => !state);
|
setShowOverrideModal((state) => !state);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (hasCode) {
|
if (hasCode && !isSaved) {
|
||||||
saveComponent(cloneDeep(data), false);
|
saveComponent(cloneDeep(data), false);
|
||||||
setSuccessData({ title: `${data.id} saved successfully` });
|
setSuccessData({ title: `${data.id} saved successfully` });
|
||||||
return;
|
return;
|
||||||
|
|
@ -195,14 +206,7 @@ export default function NodeToolbarComponent({
|
||||||
const saveComponent = useFlowsManagerStore((state) => state.saveComponent);
|
const saveComponent = useFlowsManagerStore((state) => state.saveComponent);
|
||||||
const getNodePosition = useFlowStore((state) => state.getNodePosition);
|
const getNodePosition = useFlowStore((state) => state.getNodePosition);
|
||||||
const flows = useFlowsManagerStore((state) => state.flows);
|
const flows = useFlowsManagerStore((state) => state.flows);
|
||||||
const version = useDarkStore((state) => state.version);
|
|
||||||
const takeSnapshot = useFlowsManagerStore((state) => state.takeSnapshot);
|
const takeSnapshot = useFlowsManagerStore((state) => state.takeSnapshot);
|
||||||
const [showModalAdvanced, setShowModalAdvanced] = useState(false);
|
|
||||||
const [showconfirmShare, setShowconfirmShare] = useState(false);
|
|
||||||
const [showOverrideModal, setShowOverrideModal] = useState(false);
|
|
||||||
const [flowComponent, setFlowComponent] = useState<FlowType>(
|
|
||||||
createFlowComponent(cloneDeep(data), version),
|
|
||||||
);
|
|
||||||
|
|
||||||
// useEffect(() => {
|
// useEffect(() => {
|
||||||
// if (openWDoubleClick) setShowModalAdvanced(true);
|
// if (openWDoubleClick) setShowModalAdvanced(true);
|
||||||
|
|
@ -428,7 +432,7 @@ export default function NodeToolbarComponent({
|
||||||
side="top"
|
side="top"
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
className="relative inline-flex items-center rounded-l-md bg-background px-2 py-2 text-foreground shadow-md ring-1 ring-inset ring-ring transition-all duration-500 ease-in-out hover:bg-muted focus:z-10"
|
className="relative inline-flex items-center rounded-l-md bg-background px-2 py-2 text-foreground shadow-md ring-1 ring-inset ring-ring transition-all duration-500 ease-in-out hover:bg-muted focus:z-10"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setOpenModal(!openModal);
|
setOpenModal(!openModal);
|
||||||
}}
|
}}
|
||||||
|
|
@ -448,7 +452,7 @@ export default function NodeToolbarComponent({
|
||||||
side="top"
|
side="top"
|
||||||
>
|
>
|
||||||
<button
|
<button
|
||||||
className="relative -ml-px inline-flex items-center bg-background px-2 py-2 text-foreground shadow-md ring-1 ring-inset ring-ring transition-all duration-500 ease-in-out hover:bg-muted focus:z-10"
|
className={`${isGroup ? "rounded-l-md" : ""} relative -ml-px inline-flex items-center bg-background px-2 py-2 text-foreground shadow-md ring-1 ring-inset ring-ring transition-all duration-500 ease-in-out hover:bg-muted focus:z-10`}
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setShowModalAdvanced(true);
|
setShowModalAdvanced(true);
|
||||||
}}
|
}}
|
||||||
|
|
|
||||||
|
|
@ -406,3 +406,12 @@ export function extractColumnsFromRows(
|
||||||
|
|
||||||
return Object.values(columnsKeys);
|
return Object.values(columnsKeys);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isThereModal(): boolean {
|
||||||
|
const modal = document.body.getElementsByClassName(
|
||||||
|
"nopan nodelete nodrag noundo nocopy fixed inset-0 bottom-0 left-0 right-0 top-0 z-50 overflow-auto bg-blur-shared backdrop-blur-sm data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
|
||||||
|
);
|
||||||
|
console.log(modal);
|
||||||
|
if (modal.length > 0) return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue