import { createReducer } from "utils/AppsmithUtils"; import { ReduxAction, ReduxActionErrorTypes, ReduxActionTypes, } from "constants/ReduxActionConstants"; import { GitSyncModalTab, GitConfig, MergeStatus } from "entities/GitSync"; const initialState: GitSyncReducerState = { isGitSyncModalOpen: false, isCommitting: false, isCommitSuccessful: false, activeGitSyncModalTab: GitSyncModalTab.GIT_CONNECTION, isErrorPopupVisible: false, isImportAppViaGitModalOpen: false, isFetchingGitStatus: false, isFetchingMergeStatus: false, globalGitConfig: { authorEmail: "", authorName: "" }, branches: [], fetchingBranches: false, localGitConfig: { authorEmail: "", authorName: "" }, isFetchingLocalGitConfig: false, isFetchingGitConfig: false, isMerging: false, tempRemoteUrl: "", showRepoLimitErrorModal: false, isDisconnectGitModalOpen: false, disconnectingGitApp: { id: "", name: "", }, }; const gitSyncReducer = createReducer(initialState, { [ReduxActionTypes.SET_IS_GIT_SYNC_MODAL_OPEN]: ( state: GitSyncReducerState, action: ReduxAction<{ isOpen: boolean; tab: GitSyncModalTab; }>, ) => { const activeGitSyncModalTab = action.payload.tab; return { ...state, isGitSyncModalOpen: action.payload.isOpen, activeGitSyncModalTab, connectError: null, commitAndPushError: null, pullError: null, mergeError: null, // reset conflicts when the modal is opened pullFailed: false, }; }, [ReduxActionTypes.COMMIT_TO_GIT_REPO_INIT]: (state: GitSyncReducerState) => ({ ...state, isCommitting: true, isCommitSuccessful: false, }), [ReduxActionTypes.COMMIT_TO_GIT_REPO_SUCCESS]: ( state: GitSyncReducerState, ) => ({ ...state, isCommitting: false, isCommitSuccessful: true, connectError: null, commitAndPushError: null, pullError: null, mergeError: null, }), [ReduxActionErrorTypes.COMMIT_TO_GIT_REPO_ERROR]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, isCommitting: false, commitAndPushError: action.payload, }), [ReduxActionTypes.CLEAR_COMMIT_SUCCESSFUL_STATE]: ( state: GitSyncReducerState, ) => ({ ...state, isCommitSuccessful: false, }), [ReduxActionTypes.PUSH_TO_GIT_SUCCESS]: (state: GitSyncReducerState) => ({ ...state, isPushingToGit: false, isPushSuccessful: true, }), [ReduxActionErrorTypes.PUSH_TO_GIT_ERROR]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, isPushingToGit: false, commitAndPushError: action.payload, }), [ReduxActionTypes.SHOW_ERROR_POPUP]: ( state: GitSyncReducerState, action: ReduxAction<{ isVisible: boolean }>, ) => ({ ...state, isErrorPopupVisible: action.payload.isVisible, }), [ReduxActionTypes.SET_IS_IMPORT_APP_VIA_GIT_MODAL_OPEN]: ( state: GitSyncReducerState, action: ReduxAction<{ isOpen: boolean; organizationId: string }>, ) => ({ ...state, isImportAppViaGitModalOpen: action.payload.isOpen, organisationIdForImport: action.payload.organizationId, }), [ReduxActionTypes.FETCH_GLOBAL_GIT_CONFIG_INIT]: ( state: GitSyncReducerState, ) => ({ ...state, isFetchingGitConfig: true, connectError: null, commitAndPushError: null, pullError: null, mergeError: null, }), [ReduxActionTypes.UPDATE_GLOBAL_GIT_CONFIG_INIT]: ( state: GitSyncReducerState, ) => ({ ...state, isFetchingGitConfig: true, connectError: null, commitAndPushError: null, pullError: null, mergeError: null, }), [ReduxActionTypes.FETCH_GLOBAL_GIT_CONFIG_SUCCESS]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, globalGitConfig: action.payload, isFetchingGitConfig: false, }), [ReduxActionTypes.UPDATE_GLOBAL_GIT_CONFIG_SUCCESS]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, globalGitConfig: action.payload, isFetchingGitConfig: false, }), [ReduxActionErrorTypes.UPDATE_GLOBAL_GIT_CONFIG_ERROR]: ( state: GitSyncReducerState, ) => ({ ...state, isFetchingGitConfig: false, }), [ReduxActionErrorTypes.FETCH_GLOBAL_GIT_CONFIG_ERROR]: ( state: GitSyncReducerState, ) => ({ ...state, isFetchingGitConfig: false, }), [ReduxActionTypes.FETCH_BRANCHES_INIT]: (state: GitSyncReducerState) => ({ ...state, fetchingBranches: true, connectError: null, commitAndPushError: null, pullError: null, mergeError: null, }), [ReduxActionTypes.FETCH_BRANCHES_SUCCESS]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, branches: action.payload, fetchingBranches: false, }), [ReduxActionErrorTypes.FETCH_BRANCHES_ERROR]: ( state: GitSyncReducerState, ) => ({ ...state, fetchingBranches: false, }), [ReduxActionTypes.FETCH_LOCAL_GIT_CONFIG_INIT]: ( state: GitSyncReducerState, ) => ({ ...state, isFetchingLocalGitConfig: true, connectError: null, commitAndPushError: null, pullError: null, mergeError: null, }), [ReduxActionTypes.UPDATE_LOCAL_GIT_CONFIG_INIT]: ( state: GitSyncReducerState, ) => ({ ...state, isFetchingLocalGitConfig: true, connectError: null, commitAndPushError: null, pullError: null, mergeError: null, }), [ReduxActionTypes.FETCH_LOCAL_GIT_CONFIG_SUCCESS]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, localGitConfig: action.payload, isFetchingLocalGitConfig: false, useGlobalProfile: action.payload?.useGlobalProfile, }), [ReduxActionTypes.UPDATE_LOCAL_GIT_CONFIG_SUCCESS]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, localGitConfig: action.payload, isFetchingLocalGitConfig: false, }), [ReduxActionErrorTypes.UPDATE_LOCAL_GIT_CONFIG_ERROR]: ( state: GitSyncReducerState, ) => ({ ...state, isFetchingLocalGitConfig: false, }), [ReduxActionErrorTypes.FETCH_LOCAL_GIT_CONFIG_ERROR]: ( state: GitSyncReducerState, ) => ({ ...state, isFetchingLocalGitConfig: false, }), [ReduxActionTypes.FETCH_GIT_STATUS_INIT]: (state: GitSyncReducerState) => ({ ...state, isFetchingGitStatus: true, connectError: null, commitAndPushError: null, pullError: null, mergeError: null, }), [ReduxActionTypes.FETCH_GIT_STATUS_SUCCESS]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, gitStatus: action.payload, isFetchingGitStatus: false, }), [ReduxActionErrorTypes.FETCH_GIT_STATUS_ERROR]: ( state: GitSyncReducerState, ) => ({ ...state, isFetchingGitStatus: false, }), [ReduxActionErrorTypes.DISCONNECT_TO_GIT_ERROR]: ( state: GitSyncReducerState, ) => ({ ...state, isDisconnectingGit: false, }), [ReduxActionErrorTypes.CONNECT_TO_GIT_ERROR]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, connectError: action.payload, }), [ReduxActionTypes.FETCH_MERGE_STATUS_INIT]: (state: GitSyncReducerState) => ({ ...state, isFetchingMergeStatus: true, connectError: null, commitAndPushError: null, mergeStatus: null, pullError: null, mergeError: null, }), [ReduxActionTypes.FETCH_MERGE_STATUS_SUCCESS]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, mergeStatus: action.payload, isFetchingMergeStatus: false, }), [ReduxActionErrorTypes.FETCH_MERGE_STATUS_ERROR]: ( state: GitSyncReducerState, ) => ({ ...state, isFetchingMergeStatus: false, }), [ReduxActionTypes.RESET_MERGE_STATUS]: (state: GitSyncReducerState) => ({ ...state, mergeStatus: null, }), [ReduxActionTypes.GIT_PULL_SUCCESS]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, pullFailed: false, pullMergeStatus: action.payload, pullInProgress: false, }), [ReduxActionTypes.GIT_PULL_INIT]: (state: GitSyncReducerState) => ({ ...state, pullMergeStatus: null, pullInProgress: true, }), [ReduxActionErrorTypes.GIT_PULL_ERROR]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, pullInProgress: false, pullFailed: true, pullError: action.payload, }), [ReduxActionTypes.RESET_PULL_MERGE_STATUS]: (state: GitSyncReducerState) => ({ ...state, pullFailed: false, }), [ReduxActionTypes.MERGE_BRANCH_INIT]: (state: GitSyncReducerState) => ({ ...state, isMerging: true, mergeError: null, }), [ReduxActionTypes.MERGE_BRANCH_SUCCESS]: (state: GitSyncReducerState) => ({ ...state, isMerging: false, mergeError: null, }), [ReduxActionErrorTypes.MERGE_BRANCH_ERROR]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, isMerging: false, mergeError: action.payload, }), [ReduxActionTypes.SET_REMOTE_URL_INPUT_VALUE]: ( state: GitSyncReducerState, action: ReduxAction, ) => { return { ...state, tempRemoteUrl: action.payload, }; }, [ReduxActionTypes.SET_SHOULD_SHOW_REPO_LIMIT_ERROR_MODAL]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, showRepoLimitErrorModal: action.payload, }), [ReduxActionTypes.SET_SHOULD_SHOW_DISCONNECT_GIT_MODAL]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, isDisconnectGitModalOpen: action.payload, }), [ReduxActionTypes.SET_DISCONNECTING_GIT_APPLICATION]: ( state: GitSyncReducerState, action: ReduxAction, ) => ({ ...state, disconnectingGitApp: action.payload, }), }); export type GitStatusData = { aheadCount: number; behindCount: number; conflicting: Array; isClean: boolean; modified: Array; modifiedPages: number; modifiedQueries: number; remoteBranch: string; }; type GitErrorPayloadType = { code: number; errorType?: string; message: string; }; export type GitErrorType = { error: GitErrorPayloadType; show?: boolean; crash?: boolean; logToSentry?: boolean; }; export type GitSyncReducerState = { isGitSyncModalOpen: boolean; isCommitting?: boolean; isCommitSuccessful: boolean; fetchingBranches: boolean; isFetchingGitConfig: boolean; isFetchingLocalGitConfig: boolean; isFetchingGitStatus: boolean; isFetchingMergeStatus: boolean; activeGitSyncModalTab: GitSyncModalTab; isImportAppViaGitModalOpen: boolean; organizationIdForImport?: string; isErrorPopupVisible?: boolean; globalGitConfig: GitConfig; branches: Array<{ branchName: string; default: boolean }>; localGitConfig: GitConfig; gitStatus?: GitStatusData; mergeStatus?: MergeStatus; connectError?: GitErrorType; commitAndPushError?: GitErrorType; pullError?: GitErrorType; mergeError?: GitErrorType; pullFailed?: boolean; pullInProgress?: boolean; isMerging?: boolean; tempRemoteUrl?: string; showRepoLimitErrorModal: boolean; isDisconnectGitModalOpen: boolean; disconnectingGitApp: { id: string; name: string; }; useGlobalProfile?: boolean; }; export default gitSyncReducer;