fix: Action toolbar menu state (#38964)

This commit is contained in:
Hetu Nandu 2025-02-04 12:54:11 +05:30 committed by GitHub
parent ce416df279
commit e6f10016e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 51 additions and 38 deletions

View File

@ -0,0 +1,30 @@
import React from "react";
import { Button, Menu, MenuContent, MenuTrigger } from "@appsmith/ads";
import { useToggle } from "@mantine/hooks";
import { usePluginActionContext } from "../../PluginActionContext";
interface Props {
menuContent: React.ReactNode;
}
export function PluginActionContextMenu(props: Props) {
const { action } = usePluginActionContext();
const [isMenuOpen, toggleMenuOpen] = useToggle([false, true]);
return (
<Menu onOpenChange={toggleMenuOpen} open={isMenuOpen}>
<MenuTrigger>
<Button
data-testid="t--more-action-trigger"
isIconButton
kind="tertiary"
size="sm"
startIcon="more-2-fill"
/>
</MenuTrigger>
<MenuContent key={action.id} loop width="204px">
{props.menuContent}
</MenuContent>
</Menu>
);
}

View File

@ -0,0 +1 @@
export { PluginActionContextMenu } from "./PluginActionContextMenu";

View File

@ -1,19 +1,17 @@
import React, { useCallback } from "react";
import { IDEToolbar } from "IDE";
import { Button, Menu, MenuContent, MenuTrigger, Tooltip } from "@appsmith/ads";
import { Button, Tooltip } from "@appsmith/ads";
import { modText } from "utils/helpers";
import { PluginType } from "../../entities/Plugin";
import { getIsAnvilEnabledInCurrentApplication } from "../../layoutSystems/anvil/integrations/selectors";
import { usePluginActionContext } from "../PluginActionContext";
import {
useBlockExecution,
useHandleRunClick,
useAnalyticsOnRunClick,
} from "../hooks";
import { useToggle } from "@mantine/hooks";
import { useSelector } from "react-redux";
import { isActionRunning } from "../store";
import PluginActionSettings from "./PluginActionSettings";
import { PluginActionContextMenu } from "./PluginActionContextMenu";
interface PluginActionToolbarProps {
runOptions?: React.ReactNode;
@ -22,21 +20,16 @@ interface PluginActionToolbarProps {
}
const PluginActionToolbar = (props: PluginActionToolbarProps) => {
const { action, plugin } = usePluginActionContext();
const { action } = usePluginActionContext();
const { handleRunClick } = useHandleRunClick();
const { callRunActionAnalytics } = useAnalyticsOnRunClick();
const [isMenuOpen, toggleMenuOpen] = useToggle([false, true]);
const blockExecution = useBlockExecution();
const isRunning = useSelector(isActionRunning(action.id));
const isAnvilEnabled = useSelector(getIsAnvilEnabledInCurrentApplication);
const onRunClick = useCallback(() => {
const isSkipOpeningDebugger =
isAnvilEnabled && plugin.type === PluginType.AI;
callRunActionAnalytics();
handleRunClick(isSkipOpeningDebugger);
}, [callRunActionAnalytics, handleRunClick, isAnvilEnabled, plugin.type]);
handleRunClick();
}, [callRunActionAnalytics, handleRunClick]);
return (
<IDEToolbar>
@ -60,25 +53,12 @@ const PluginActionToolbar = (props: PluginActionToolbarProps) => {
</Button>
</Tooltip>
<PluginActionSettings />
<Menu onOpenChange={toggleMenuOpen} open={isMenuOpen}>
<MenuTrigger>
<Button
data-testid="t--more-action-trigger"
isIconButton
kind="tertiary"
size="sm"
startIcon="more-2-fill"
/>
</MenuTrigger>
<MenuContent
{props.menuContent ? (
<PluginActionContextMenu
key={action.id}
loop
style={{ zIndex: 100 }}
width="204px"
>
{props.menuContent}
</MenuContent>
</Menu>
menuContent={props.menuContent}
/>
) : null}
</IDEToolbar.Right>
</IDEToolbar>
);

View File

@ -1,18 +1,20 @@
import { useCallback } from "react";
import { useDispatch } from "react-redux";
import { useDispatch, useSelector } from "react-redux";
import { runAction } from "actions/pluginActionActions";
import { usePluginActionContext } from "PluginActionEditor/PluginActionContext";
import { PluginType } from "../../../entities/Plugin";
import { getIsAnvilEnabledInCurrentApplication } from "../../../layoutSystems/anvil/integrations/selectors";
function useHandleRunClick() {
const { action } = usePluginActionContext();
const { action, plugin } = usePluginActionContext();
const dispatch = useDispatch();
const isAnvilEnabled = useSelector(getIsAnvilEnabledInCurrentApplication);
const handleRunClick = useCallback(
(skipOpeningDebugger = false) => {
dispatch(runAction(action?.id ?? "", undefined, skipOpeningDebugger));
},
[action.id, dispatch],
);
const handleRunClick = useCallback(() => {
const skipOpeningDebugger = isAnvilEnabled && plugin.type === PluginType.AI;
dispatch(runAction(action?.id ?? "", undefined, skipOpeningDebugger));
}, [action?.id, dispatch, isAnvilEnabled, plugin.type]);
return { handleRunClick };
}