Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions app/client/src/ce/pages/Applications/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ import { useGitModEnabled } from "pages/Editor/gitSync/hooks/modHooks";
import {
GitRepoLimitErrorModal as NewGitRepoLimitErrorModal,
GitImportModal as NewGitImportModal,
GitImportOverrideModal,
} from "git";
import OldRepoLimitExceededErrorModal from "pages/Editor/gitSync/RepoLimitExceededErrorModal";

Expand All @@ -145,6 +146,7 @@ function GitModals() {
<>
<NewGitImportModal />
<NewGitRepoLimitErrorModal />
<GitImportOverrideModal />
</>
) : (
<>
Expand Down
8 changes: 8 additions & 0 deletions app/client/src/git/ce/constants/messages.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@ export const IMPORT_GIT = {
WAIT_TEXT: "Please wait while we import via Git..",
};

export const IMPORT_OVERRIDE_MODAL = {
TITLE: "Override existing {{artifactType}}?",
DESCRIPTION:
"You're trying to import a {{artifactType}} that already exists in this workspace as <b>my-app</b>. Do you want to override it?",
CANCEL_BTN: "Cancel",
OVERRIDE_BTN: "Import and override {{artifactType}}",
};

export const CONNECT_GIT = {
MODAL_TITLE: "Configure Git",
CHOOSE_PROVIDER_CTA: "Configure Git",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
import {
Button,
Callout,
Modal,
ModalBody,
ModalContent,
ModalFooter,
ModalHeader,
Text,
} from "@appsmith/ads";
import { IMPORT_OVERRIDE_MODAL } from "git/ee/constants/messages";
Comment thread
brayn003 marked this conversation as resolved.
import useMessage from "git/hooks/useMessage";
import noop from "lodash/noop";
import React, { useCallback } from "react";
import styled from "styled-components";

const StyledModalContent = styled(ModalContent)`
width: 640px;
`;

interface ImportOverrideModalViewProps {
artifactType?: string;
isOpen: boolean;
onOpenChange: (open: boolean) => void;
onImport: () => void;
}

function ImportOverrideModalView({
artifactType = "artifact",
isOpen = false,
onImport = noop,
onOpenChange = noop,
}: ImportOverrideModalViewProps) {
const modalTitle = useMessage(IMPORT_OVERRIDE_MODAL.TITLE, { artifactType });
const modalDescription = useMessage(IMPORT_OVERRIDE_MODAL.DESCRIPTION, {
artifactType,
});
const ctaBtnText = useMessage(IMPORT_OVERRIDE_MODAL.OVERRIDE_BTN, {
artifactType,
});
Comment thread
brayn003 marked this conversation as resolved.

const handleCancel = useCallback(() => {
onOpenChange(false);
}, [onOpenChange]);

const handleImport = useCallback(() => {
onImport();
}, [onImport]);

return (
<Modal onOpenChange={onOpenChange} open={isOpen}>
<StyledModalContent>
<ModalHeader>{modalTitle}</ModalHeader>
<ModalBody>
<Callout kind="warning">
<Text>{modalDescription}</Text>
</Callout>
</ModalBody>
<ModalFooter>
<Button kind="secondary" onClick={handleCancel} size="md">
{IMPORT_OVERRIDE_MODAL.CANCEL_BTN}
</Button>
<Button onClick={handleImport} size="md">
{ctaBtnText}
</Button>
</ModalFooter>
</StyledModalContent>
</Modal>
);
}

export default ImportOverrideModalView;
38 changes: 38 additions & 0 deletions app/client/src/git/components/ImportOverrideModal/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import React, { useCallback } from "react";
import ImportOverrideModalView from "./ImportOverrideModalView";
import useImport from "git/hooks/useImport";

function ImportOverrideModal() {
const {
gitImport,
importOverrideParams,
isImportOverrideModalOpen,
resetImportOverrideParams,
} = useImport();

const handleOpenChange = useCallback(
(open: boolean) => {
if (!open) {
resetImportOverrideParams();
}
},
[resetImportOverrideParams],
);

const handleImport = useCallback(() => {
if (importOverrideParams) {
gitImport(importOverrideParams);
}
}, [gitImport, importOverrideParams]);

return (
<ImportOverrideModalView
artifactType={"package"}
isOpen={isImportOverrideModalOpen}
onImport={handleImport}
onOpenChange={handleOpenChange}
/>
);
}

export default ImportOverrideModal;
21 changes: 21 additions & 0 deletions app/client/src/git/hooks/useImport.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import { useDispatch, useSelector } from "react-redux";
import {
selectGitImportState,
selectImportModalOpen,
selectImportOverrideModalOpen,
selectImportOverrideParams,
} from "git/store/selectors/gitGlobalSelectors";
import { gitGlobalActions } from "git/store/gitGlobalSlice";
import type { GitImportRequestParams } from "git/requests/gitImportRequest.types";
Expand All @@ -28,11 +30,30 @@ export default function useImport() {
[dispatch],
);

const isImportOverrideModalOpen = useSelector(selectImportOverrideModalOpen);

const importOverrideParams = useSelector(selectImportOverrideParams);

const setImportOverrideParams = useCallback(
(params: GitImportRequestParams) => {
dispatch(gitGlobalActions.setImportOverrideParams(params));
},
[dispatch],
);

const resetImportOverrideParams = useCallback(() => {
dispatch(gitGlobalActions.resetImportOverrideParams());
}, [dispatch]);

return {
isGitImportLoading: gitImportState?.loading ?? false,
gitImportError: gitImportState?.error ?? null,
gitImport,
isImportModalOpen: isImportModalOpen ?? false,
toggleImportModal,
isImportOverrideModalOpen: isImportOverrideModalOpen ?? false,
importOverrideParams,
setImportOverrideParams,
resetImportOverrideParams,
};
}
12 changes: 12 additions & 0 deletions app/client/src/git/hooks/useMessage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { useMemo } from "react";

export default function useMessage(msg: string, args: Record<string, string>) {
return useMemo(() => {
const msgWithArgs = msg.replace(/\{\{([^}]+)\}\}/g, (match, p1) => {
// p1 is the key from {{key}} in the message
return args[p1] || match;
});

return msgWithArgs;
}, [msg, args]);
}
1 change: 1 addition & 0 deletions app/client/src/git/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export { useHotKeys } from "./components/HotKeys";
export { default as GitContextProvider } from "./components/GitContextProvider";
export { default as GitModals } from "./ee/components/GitModals";
export { default as GitImportModal } from "./components/ImportModal";
export { default as GitImportOverrideModal } from "./components/ImportOverrideModal";
export { default as GitRepoLimitErrorModal } from "./components/RepoLimitErrorModal";
export { default as GitQuickActions } from "./components/QuickActions";
export { default as GitProtectedBranchCallout } from "./components/ProtectedBranchCallout";
Expand Down
5 changes: 4 additions & 1 deletion app/client/src/git/requests/gitImportRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@ async function gitImportRequestNew(
workspaceId: string,
params: GitImportRequestParams,
): AxiosPromise<GitImportResponse> {
return Api.post(`${GIT_BASE_URL}/artifacts/import`, params, { workspaceId });
const { override = false, ...restParams } = params;
const body = { override, ...restParams };

return Api.post(`${GIT_BASE_URL}/artifacts/import`, body, { workspaceId });
}

export default async function gitImportRequest(
Expand Down
1 change: 1 addition & 0 deletions app/client/src/git/requests/gitImportRequest.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export interface GitImportRequestParams {
authorEmail: string;
useDefaultProfile?: boolean;
};
override?: boolean;
}

export interface GitImportResponseData {
Expand Down
17 changes: 17 additions & 0 deletions app/client/src/git/store/actions/uiActions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { createArtifactAction } from "../helpers/createArtifactAction";
import type { GitGlobalReduxState } from "../types";
import type { PayloadAction } from "@reduxjs/toolkit";
import type { GitArtifactDef } from "git/types";
import type { GitImportRequestParams } from "git/requests/gitImportRequest.types";

// connect modal
export interface ToggleConnectModalPayload {
Expand Down Expand Up @@ -31,6 +32,7 @@ export const toggleConnectSuccessModalAction =
return state;
});

// import
export interface ToggleImportModalPayload {
open: boolean;
}
Expand All @@ -46,6 +48,21 @@ export const toggleImportModalAction = (
return state;
};

export const resetImportOverrideParamsAction = (state: GitGlobalReduxState) => {
state.importOverrideParams = null;

return state;
};

export const setImportOverrideParamsAction = (
state: GitGlobalReduxState,
action: PayloadAction<GitImportRequestParams>,
) => {
state.importOverrideParams = { ...action.payload };

return state;
};

// disconnect modal
export interface OpenDisconnectModalPayload {
targetArtifactDef: GitArtifactDef;
Expand Down
8 changes: 7 additions & 1 deletion app/client/src/git/store/gitGlobalSlice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,11 @@ import {
updateGlobalProfileSuccessAction,
} from "./actions/updateGlobalProfileActions";
import { gitGlobalInitialState } from "./helpers/initialState";
import { toggleImportModalAction } from "./actions/uiActions";
import {
resetImportOverrideParamsAction,
setImportOverrideParamsAction,
toggleImportModalAction,
} from "./actions/uiActions";
import {
gitImportErrorAction,
gitImportInitAction,
Expand Down Expand Up @@ -42,6 +46,8 @@ export const gitGlobalSlice = createSlice({
gitImportSuccess: gitImportSuccessAction,
gitImportError: gitImportErrorAction,
toggleImportModal: toggleImportModalAction,
resetImportOverrideParams: resetImportOverrideParamsAction,
setImportOverrideParams: setImportOverrideParamsAction,
toggleRepoLimitErrorModal: toggleRepoLimitErrorModalAction,
},
});
Expand Down
1 change: 1 addition & 0 deletions app/client/src/git/store/helpers/initialState.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,5 +168,6 @@ export const gitGlobalInitialState: GitGlobalReduxState = {
error: null,
},
isImportModalOpen: false,
importOverrideParams: null,
repoLimitErrorModalOpen: false,
};
6 changes: 6 additions & 0 deletions app/client/src/git/store/selectors/gitGlobalSelectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,12 @@ export const selectUpdateGlobalProfileState = (state: GitRootState) =>
export const selectImportModalOpen = (state: GitRootState) =>
selectGitGlobal(state).isImportModalOpen;

export const selectImportOverrideModalOpen = (state: GitRootState) =>
!!selectGitGlobal(state).importOverrideParams;

export const selectImportOverrideParams = (state: GitRootState) =>
selectGitGlobal(state).importOverrideParams ?? null;

export const selectGitImportState = (state: GitRootState) =>
selectGitGlobal(state).gitImport;

Expand Down
2 changes: 2 additions & 0 deletions app/client/src/git/store/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import type { FetchGlobalSSHKeyResponseData } from "git/requests/fetchGlobalSSHK
import type { FetchRefsResponseData } from "git/requests/fetchRefsRequest.types";
import type { GitArtifactDef } from "git/types";
import type { PretagResponseData } from "git/requests/pretagRequest.types";
import type { GitImportRequestParams } from "git/requests/gitImportRequest.types";

export interface GitApiError extends ApiResponseError {
errorType?: string;
Expand Down Expand Up @@ -98,6 +99,7 @@ export interface GitGlobalReduxState {
globalSSHKey: GitAsyncState<FetchGlobalSSHKeyResponseData>;
// ui
isImportModalOpen: boolean;
importOverrideParams: GitImportRequestParams | null;
repoLimitErrorModalOpen: boolean;
}

Expand Down