PromucFlow_constructor/app/client/src/pages/Editor/Canvas.tsx
Rudraprasad Das 692e394e73
chore: git mod - integration app (#38315)
## Description
- Git mod integration with applications behind feature flag

Fixes #37815 
Fixes #37816 
Fixes #37817 
Fixes #37818 
Fixes #37819 
Fixes #37820 


## Automation

/ok-to-test tags="@tag.All"

### 🔍 Cypress test results
<!-- This is an auto-generated comment: Cypress test results  -->
> [!TIP]
> 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
> Workflow run:
<https://github.com/appsmithorg/appsmith/actions/runs/12526603607>
> Commit: 19f3ca0a35b16b25b2cff8700e2df4b2a497e7fe
> <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=12526603607&attempt=2"
target="_blank">Cypress dashboard</a>.
> Tags: `@tag.All`
> Spec:
> <hr>Sat, 28 Dec 2024 15:57:13 UTC
<!-- end of auto-generated comment: Cypress test results  -->


## Communication
Should the DevRel and Marketing teams inform users about this change?
- [ ] Yes
- [ ] No


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

## Summary by CodeRabbit

## Release Notes

- **New Features**
- Introduced various new hooks for Git functionalities, including
`useGitModEnabled`, `useGitCurrentBranch`, `useGitProtectedMode`, and
`useGitConnected`.
	- Added a new component `DeployButton` to manage deployment actions.
- Integrated `ConnectSuccessModal` to enhance user feedback upon
successful Git connection.
	- Added `GitImportModal` for improved Git import functionality.
- Introduced `GlobalProfileView` for managing and displaying user
profile information.
	- Added a new icon, `CloudIconV2`, to the icon provider.
- Implemented `fetchGlobalSSHKey` and `gitImport` sagas for better state
management.

- **Improvements**
- Enhanced handling of Git-related states and actions across multiple
components and sagas.
- Streamlined selector usage for determining preview mode by replacing
`combinedPreviewModeSelector` with `selectCombinedPreviewMode`.
- Updated the `DeployPreview` component to manage success feedback and
handle commit operations more effectively.
- Improved the `StatusChangesView` component by adding a callout for
migration messages.
	- Added new transformers for application status handling.

- **Bug Fixes**
- Updated error handling and loading states across various actions and
components to improve reliability.

- **Refactor**
- Refactored action creators to use `createArtifactAction` instead of
`createSingleArtifactAction` for consistency and clarity.
- Consolidated Git import and connection logic to improve modularity and
maintainability.
- Modified the `Header` component to utilize
`GitApplicationContextProvider` for managing Git-related state.
- Updated various components to utilize the new
`selectCombinedPreviewMode` selector for improved state management.
- Refactored the `DeployPreview` component to enhance its functionality
and styling consistency.
- Enhanced the `applicationStatusTransformer` to handle multiple status
transformations.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2024-12-30 15:53:32 +05:30

130 lines
4.3 KiB
TypeScript

import log from "loglevel";
import React, { useCallback } from "react";
import styled from "styled-components";
import * as Sentry from "@sentry/react";
import { useDispatch, useSelector } from "react-redux";
import type { CanvasWidgetStructure } from "WidgetProvider/constants";
import useWidgetFocus from "utils/hooks/useWidgetFocus";
import { selectCombinedPreviewMode } from "selectors/gitModSelectors";
import { getSelectedAppTheme } from "selectors/appThemingSelectors";
import { getViewportClassName } from "layoutSystems/autolayout/utils/AutoLayoutUtils";
import {
ThemeProvider as WDSThemeProvider,
useTheme,
} from "@appsmith/wds-theming";
import { getIsAppSettingsPaneWithNavigationTabOpen } from "selectors/appSettingsPaneSelectors";
import { CANVAS_ART_BOARD } from "constants/componentClassNameConstants";
import { renderAppsmithCanvas } from "layoutSystems/CanvasFactory";
import type { WidgetProps } from "widgets/BaseWidget";
import { getAppThemeSettings } from "ee/selectors/applicationSelectors";
import CodeModeTooltip from "pages/Editor/WidgetsEditor/components/CodeModeTooltip";
import { getIsAnvilLayout } from "layoutSystems/anvil/integrations/selectors";
import { focusWidget } from "actions/widgetActions";
interface CanvasProps {
widgetsStructure: CanvasWidgetStructure;
canvasWidth: number;
enableMainCanvasResizer?: boolean;
}
const StyledWDSThemeProvider = styled(WDSThemeProvider)`
min-height: 100%;
display: flex;
`;
const Wrapper = styled.section<{
background: string;
width: number;
$enableMainCanvasResizer: boolean;
}>`
flex: 1;
background: ${({ background }) => background};
width: ${({ $enableMainCanvasResizer, width }) =>
$enableMainCanvasResizer ? `100%` : `${width}px`};
`;
const Canvas = (props: CanvasProps) => {
const { canvasWidth } = props;
const isPreviewMode = useSelector(selectCombinedPreviewMode);
const isAppSettingsPaneWithNavigationTabOpen = useSelector(
getIsAppSettingsPaneWithNavigationTabOpen,
);
const selectedTheme = useSelector(getSelectedAppTheme);
const isAnvilLayout = useSelector(getIsAnvilLayout);
const themeSetting = useSelector(getAppThemeSettings);
const wdsThemeProps = {
borderRadius: themeSetting.borderRadius,
seedColor: themeSetting.accentColor,
colorMode: themeSetting.colorMode.toLowerCase(),
userSizing: themeSetting.sizing,
userDensity: themeSetting.density,
} as Parameters<typeof useTheme>[0];
// in case of non-WDS theme, we will pass an empty object to useTheme hook
// so that fixedLayout theme does not break because of calculations done in useTheme
const { theme } = useTheme(isAnvilLayout ? wdsThemeProps : {});
const dispatch = useDispatch();
const unfocusAllWidgets = useCallback(() => {
dispatch(focusWidget());
}, [dispatch]);
/**
* background for canvas
*/
let backgroundForCanvas: string;
if (isPreviewMode || isAppSettingsPaneWithNavigationTabOpen) {
backgroundForCanvas = "initial";
} else {
backgroundForCanvas = selectedTheme.properties.colors.backgroundColor;
}
const focusRef = useWidgetFocus();
const marginHorizontalClass = props.enableMainCanvasResizer
? `mx-0`
: `mx-auto`;
const paddingBottomClass = props.enableMainCanvasResizer ? "" : "pb-52";
const renderChildren = () => {
return (
<CodeModeTooltip>
<Wrapper
$enableMainCanvasResizer={!!props.enableMainCanvasResizer}
background={isAnvilLayout ? "" : backgroundForCanvas}
className={`relative t--canvas-artboard mp-mask ${paddingBottomClass} ${marginHorizontalClass} ${getViewportClassName(
canvasWidth,
)}`}
data-testid={"t--canvas-artboard"}
id={CANVAS_ART_BOARD}
onMouseLeave={unfocusAllWidgets}
ref={isAnvilLayout ? undefined : focusRef}
width={canvasWidth}
>
{props.widgetsStructure.widgetId &&
renderAppsmithCanvas(props.widgetsStructure as WidgetProps)}
</Wrapper>
</CodeModeTooltip>
);
};
try {
if (isAnvilLayout) {
return (
<StyledWDSThemeProvider theme={theme}>
{renderChildren()}
</StyledWDSThemeProvider>
);
}
return renderChildren();
} catch (error) {
log.error("Error rendering DSL", error);
Sentry.captureException(error);
return null;
}
};
export default Canvas;