2024-08-06 14:52:22 +00:00
|
|
|
import type { ReduxAction } from "ee/constants/ReduxActionConstants";
|
2023-09-25 06:27:23 +00:00
|
|
|
import {
|
|
|
|
|
ReduxActionErrorTypes,
|
|
|
|
|
ReduxActionTypes,
|
2024-08-06 14:52:22 +00:00
|
|
|
} from "ee/constants/ReduxActionConstants";
|
|
|
|
|
import { isAirgapped } from "ee/utils/airgapHelpers";
|
2023-09-25 06:27:23 +00:00
|
|
|
import { all, call, put, select, takeEvery } from "redux-saga/effects";
|
|
|
|
|
import { validateResponse, type ErrorActionPayload } from "./ErrorSagas";
|
2024-08-06 14:52:22 +00:00
|
|
|
import { COMMUNITY_TEMPLATES, createMessage } from "ee/constants/messages";
|
2024-08-09 14:20:29 +00:00
|
|
|
import { toast } from "@appsmith/ads";
|
2023-09-25 06:27:23 +00:00
|
|
|
import type {
|
|
|
|
|
PublishCommunityTemplateRequest,
|
|
|
|
|
PublishCommunityTemplateResponse,
|
|
|
|
|
} from "api/TemplatesApi";
|
|
|
|
|
import TemplatesAPI from "api/TemplatesApi";
|
2024-08-06 14:52:22 +00:00
|
|
|
import { getCurrentWorkspaceId } from "ee/selectors/selectedWorkspaceSelectors";
|
2023-09-25 06:27:23 +00:00
|
|
|
import { getCurrentApplicationId } from "selectors/editorSelectors";
|
2024-08-06 14:52:22 +00:00
|
|
|
import type { UpdateUserRequest } from "ee/api/UserApi";
|
|
|
|
|
import UserApi from "ee/api/UserApi";
|
2023-09-25 06:27:23 +00:00
|
|
|
import type { PublishCommunityTemplatePayload } from "actions/communityTemplateActions";
|
|
|
|
|
import type { ApiResponse } from "api/ApiResponses";
|
|
|
|
|
|
|
|
|
|
const isAirgappedInstance = isAirgapped();
|
|
|
|
|
|
|
|
|
|
function* updateUserDetails(payload: PublishCommunityTemplatePayload) {
|
|
|
|
|
if (!payload.shouldUpdateEmail && !payload.shouldUpdateName) return;
|
2024-09-18 16:35:28 +00:00
|
|
|
|
2023-09-25 06:27:23 +00:00
|
|
|
const request: UpdateUserRequest = {};
|
2024-09-18 16:35:28 +00:00
|
|
|
|
2023-09-25 06:27:23 +00:00
|
|
|
payload.shouldUpdateEmail && (request.email = payload.authorEmail);
|
|
|
|
|
payload.shouldUpdateName && (request.name = payload.authorName);
|
|
|
|
|
|
|
|
|
|
const response: ApiResponse = yield call(UserApi.updateUser, request);
|
|
|
|
|
const isValidResponse: boolean = yield validateResponse(response);
|
|
|
|
|
|
|
|
|
|
if (isValidResponse) {
|
|
|
|
|
yield put({
|
|
|
|
|
type: ReduxActionTypes.UPDATE_USER_DETAILS_SUCCESS,
|
|
|
|
|
payload: response.data,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function* handleFailure(error: unknown) {
|
|
|
|
|
const payload: ErrorActionPayload = {
|
|
|
|
|
show: true,
|
|
|
|
|
error: {
|
|
|
|
|
message:
|
2024-07-31 15:41:28 +00:00
|
|
|
// TODO: Fix this the next time the file is edited
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
2023-09-25 06:27:23 +00:00
|
|
|
(error as any).message ??
|
|
|
|
|
createMessage(COMMUNITY_TEMPLATES.publishFormPage.publishedFailedError),
|
|
|
|
|
},
|
|
|
|
|
};
|
2024-09-18 16:35:28 +00:00
|
|
|
|
2023-09-25 06:27:23 +00:00
|
|
|
yield put({
|
|
|
|
|
type: ReduxActionErrorTypes.PUBLISH_APP_AS_COMMUNITY_TEMPLATE_ERROR,
|
|
|
|
|
payload,
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function* publishCommunityTemplateSaga(
|
|
|
|
|
action: ReduxAction<PublishCommunityTemplatePayload>,
|
|
|
|
|
) {
|
|
|
|
|
try {
|
|
|
|
|
yield call(updateUserDetails, action.payload);
|
|
|
|
|
} catch (error) {}
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
const applicationId: string = yield select(getCurrentApplicationId);
|
|
|
|
|
const workspaceId: string = yield select(getCurrentWorkspaceId);
|
|
|
|
|
const requestObj: PublishCommunityTemplateRequest = {
|
|
|
|
|
applicationId,
|
|
|
|
|
workspaceId,
|
|
|
|
|
...action.payload,
|
|
|
|
|
};
|
2024-09-18 16:35:28 +00:00
|
|
|
|
2023-09-25 06:27:23 +00:00
|
|
|
if ("authorName" in requestObj) delete requestObj.authorName;
|
2024-09-18 16:35:28 +00:00
|
|
|
|
2023-09-25 06:27:23 +00:00
|
|
|
if ("shouldUpdateEmail" in requestObj) delete requestObj.shouldUpdateEmail;
|
2024-09-18 16:35:28 +00:00
|
|
|
|
2023-09-25 06:27:23 +00:00
|
|
|
if ("shouldUpdateName" in requestObj) delete requestObj.shouldUpdateName;
|
|
|
|
|
|
|
|
|
|
const response: PublishCommunityTemplateResponse = yield call(
|
|
|
|
|
TemplatesAPI.publishCommunityTemplate,
|
|
|
|
|
requestObj,
|
|
|
|
|
);
|
|
|
|
|
const isValid: boolean = yield validateResponse(response);
|
|
|
|
|
|
|
|
|
|
if (isValid) {
|
|
|
|
|
toast.show(`Template published to community`, {
|
|
|
|
|
kind: "success",
|
|
|
|
|
});
|
|
|
|
|
yield put({
|
|
|
|
|
type: ReduxActionTypes.PUBLISH_APP_AS_COMMUNITY_TEMPLATE_SUCCESS,
|
|
|
|
|
payload: response,
|
|
|
|
|
});
|
|
|
|
|
yield put({
|
|
|
|
|
type: ReduxActionTypes.CURRENT_APPLICATION_COMMUNITY_TEMPLATE_STATUS_UPDATE,
|
|
|
|
|
payload: {
|
|
|
|
|
isCommunityTemplate: response.data.isCommunityTemplate,
|
|
|
|
|
isPublic: response.data.isPublic,
|
|
|
|
|
forkingEnabled: response.data.forkingEnabled,
|
|
|
|
|
},
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
yield handleFailure(response);
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
yield handleFailure(error);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export default function* watchActionSagas() {
|
|
|
|
|
if (!isAirgappedInstance)
|
|
|
|
|
yield all([
|
|
|
|
|
takeEvery(
|
|
|
|
|
ReduxActionTypes.PUBLISH_APP_AS_COMMUNITY_TEMPLATE_INIT,
|
|
|
|
|
publishCommunityTemplateSaga,
|
|
|
|
|
),
|
|
|
|
|
]);
|
|
|
|
|
}
|