diff --git a/components/collections/SaveRequest.vue b/components/collections/SaveRequest.vue index 42d23bb20..c86dcd0a0 100644 --- a/components/collections/SaveRequest.vue +++ b/components/collections/SaveRequest.vue @@ -62,7 +62,11 @@ import { saveGraphqlRequestAs, } from "~/newstore/collections" import { getGQLSession, useGQLRequestName } from "~/newstore/GQLSession" -import { getRESTRequest, useRESTRequestName } from "~/newstore/RESTSession" +import { + getRESTRequest, + useRESTRequestName, + setRESTSaveContext, +} from "~/newstore/RESTSession" export default defineComponent({ props: { @@ -142,10 +146,32 @@ export default defineComponent({ this.picked.requestIndex, requestUpdated ) + setRESTSaveContext({ + originLocation: "user-collection", + folderPath: this.picked.folderPath, + requestIndex: this.picked.requestIndex, + }) } else if (this.picked.pickedType === "my-folder") { - saveRESTRequestAs(this.picked.folderPath, requestUpdated) + const insertionIndex = saveRESTRequestAs( + this.picked.folderPath, + requestUpdated + ) + setRESTSaveContext({ + originLocation: "user-collection", + folderPath: this.picked.folderPath, + requestIndex: insertionIndex, + }) } else if (this.picked.pickedType === "my-collection") { - saveRESTRequestAs(`${this.picked.collectionIndex}`, requestUpdated) + debugger + const insertionIndex = saveRESTRequestAs( + `${this.picked.collectionIndex}`, + requestUpdated + ) + setRESTSaveContext({ + originLocation: "user-collection", + folderPath: `${this.picked.collectionIndex}`, + requestIndex: insertionIndex, + }) } else if (this.picked.pickedType === "teams-request") { teamUtils.overwriteRequestTeams( this.$apollo, @@ -153,6 +179,10 @@ export default defineComponent({ requestUpdated.name, this.picked.requestID ) + setRESTSaveContext({ + originLocation: "teams-collection", + requestID: this.picked.requestID, + }) } else if (this.picked.pickedType === "teams-folder") { teamUtils.saveRequestAsTeams( this.$apollo, @@ -161,6 +191,10 @@ export default defineComponent({ this.collectionsType.selectedTeam.id, this.picked.folderID ) + setRESTSaveContext({ + originLocation: "teams-collection", + requestID: this.picked.requestID, + }) } else if (this.picked.pickedType === "teams-collection") { teamUtils.saveRequestAsTeams( this.$apollo, @@ -169,6 +203,10 @@ export default defineComponent({ this.collectionsType.selectedTeam.id, this.picked.collectionID ) + setRESTSaveContext({ + originLocation: "teams-collection", + requestID: this.picked.requestID, + }) } else if (this.picked.pickedType === "gql-my-request") { editGraphqlRequest( this.picked.folderPath, @@ -183,6 +221,7 @@ export default defineComponent({ this.$toast.success("Requested added", { icon: "done", }) + this.hideModal() }, hideModal() { diff --git a/components/collections/my/Request.vue b/components/collections/my/Request.vue index 4d9944a3b..1a38457ef 100644 --- a/components/collections/my/Request.vue +++ b/components/collections/my/Request.vue @@ -160,7 +160,13 @@ export default { requestIndex: this.requestIndex, }, }) - else setRESTRequest(translateToNewRequest(this.request)) + else { + setRESTRequest(translateToNewRequest(this.request), { + originLocation: "user-collection", + folderPath: this.folderPath, + requestIndex: this.requestIndex, + }) + } }, dragStart({ dataTransfer }) { this.dragging = !this.dragging diff --git a/components/collections/teams/Request.vue b/components/collections/teams/Request.vue index aa6d269bb..262e599a1 100644 --- a/components/collections/teams/Request.vue +++ b/components/collections/teams/Request.vue @@ -147,7 +147,11 @@ export default { requestID: this.requestIndex, }, }) - else setRESTRequest(translateToNewRequest(this.request)) + else + setRESTRequest(translateToNewRequest(this.request), { + originLocation: "team-collection", + requestIndex: this.requestIndex, + }) }, removeRequest() { this.$emit("remove-request", { diff --git a/components/http/Request.vue b/components/http/Request.vue index 926d32938..affc2ec7a 100644 --- a/components/http/Request.vue +++ b/components/http/Request.vue @@ -219,7 +219,10 @@ import { updateRESTMethod, resetRESTRequest, useRESTRequestName, + getRESTSaveContext, + getRESTRequest, } from "~/newstore/RESTSession" +import { editRESTRequest } from "~/newstore/collections" import { getPlatformSpecialKey } from "~/helpers/platformutils" import { runRESTRequest$ } from "~/helpers/RequestRunner" import { @@ -230,6 +233,8 @@ import { import { defineActionHandler } from "~/helpers/actions" import { copyToClipboard } from "~/helpers/utils/clipboard" import { useSetting } from "~/newstore/settings" +import { saveRequestAsTeams } from "~/helpers/teams/utils" +import { apolloClient } from "~/helpers/apollo" const methods = [ "GET", @@ -366,6 +371,32 @@ export default defineComponent({ } } + const saveRequest = () => { + const saveCtx = getRESTSaveContext() + if (!saveCtx) { + showSaveRequestModal.value = true + return + } + + if (saveCtx.originLocation === "user-collection") { + editRESTRequest( + saveCtx.folderPath, + saveCtx.requestIndex, + getRESTRequest() + ) + } else if (saveCtx.originLocation === "team-collection") { + const req = getRESTRequest() + + // TODO: handle error case (NOTE: saveRequestAsTeams is async) + saveRequestAsTeams( + apolloClient, + JSON.stringify(req), + req.name, + saveCtx.requestID + ) + } + } + defineActionHandler("request.send-cancel", () => { if (!loading.value) newSendRequest() else cancelRequest() @@ -374,10 +405,7 @@ export default defineComponent({ defineActionHandler("request.copy-link", copyRequest) defineActionHandler("request.method.next", cycleDownMethod) defineActionHandler("request.method.prev", cycleUpMethod) - defineActionHandler( - "request.save", - () => (showSaveRequestModal.value = true) - ) + defineActionHandler("request.save", saveRequest) defineActionHandler("request.method.get", () => updateMethod("GET")) defineActionHandler("request.method.post", () => updateMethod("POST")) defineActionHandler("request.method.put", () => updateMethod("PUT")) diff --git a/helpers/types/HoppRequestSaveContext.ts b/helpers/types/HoppRequestSaveContext.ts new file mode 100644 index 000000000..6293b583a --- /dev/null +++ b/helpers/types/HoppRequestSaveContext.ts @@ -0,0 +1,31 @@ +/** + * We use the save context to figure out + * how a loaded request is to be saved. + * These will be set when the request is loaded + * into the request session (RESTSession) + */ +export type HoppRequestSaveContext = + | { + /** + * The origin source of the request + */ + originLocation: "user-collection" + /** + * Path to the request folder + */ + folderPath: string + /** + * Index to the request + */ + requestIndex: number + } + | { + /** + * The origin source of the request + */ + originLocation: "team-collection" + /** + * ID of the request in the team + */ + requestID: string + } diff --git a/newstore/RESTSession.ts b/newstore/RESTSession.ts index ed4639849..80a7b5122 100644 --- a/newstore/RESTSession.ts +++ b/newstore/RESTSession.ts @@ -14,11 +14,13 @@ import { useStream } from "~/helpers/utils/composables" import { HoppTestResult } from "~/helpers/types/HoppTestResult" import { HoppRESTAuth } from "~/helpers/types/HoppRESTAuth" import { ValidContentTypes } from "~/helpers/utils/contenttypes" +import { HoppRequestSaveContext } from "~/helpers/types/HoppRequestSaveContext" type RESTSession = { request: HoppRESTRequest response: HoppRESTResponse | null testResults: HoppTestResult | null + saveContext: HoppRequestSaveContext | null } const defaultRESTRequest: HoppRESTRequest = { @@ -45,6 +47,7 @@ const defaultRESTSession: RESTSession = { request: defaultRESTRequest, response: null, testResults: null, + saveContext: null, } const dispatchers = defineDispatchers({ @@ -338,6 +341,14 @@ const dispatchers = defineDispatchers({ testResults: newResults, } }, + setSaveContext( + _, + { newContext }: { newContext: HoppRequestSaveContext | null } + ) { + return { + saveContext: newContext, + } + }, }) const restSessionStore = new DispatchingStore(defaultRESTSession, dispatchers) @@ -346,13 +357,31 @@ export function getRESTRequest() { return restSessionStore.subject$.value.request } -export function setRESTRequest(req: HoppRESTRequest) { +export function setRESTRequest( + req: HoppRESTRequest, + saveContext?: HoppRequestSaveContext | null +) { restSessionStore.dispatch({ dispatcher: "setRequest", payload: { req, }, }) + + if (saveContext) setRESTSaveContext(saveContext) +} + +export function setRESTSaveContext(saveContext: HoppRequestSaveContext | null) { + restSessionStore.dispatch({ + dispatcher: "setSaveContext", + payload: { + newContext: saveContext, + }, + }) +} + +export function getRESTSaveContext() { + return restSessionStore.value.saveContext } export function resetRESTRequest() { diff --git a/newstore/collections.ts b/newstore/collections.ts index f0768d41a..2ef497447 100644 --- a/newstore/collections.ts +++ b/newstore/collections.ts @@ -1,5 +1,6 @@ import { pluck } from "rxjs/operators" import DispatchingStore, { defineDispatchers } from "./DispatchingStore" +import { getRESTSaveContext, setRESTSaveContext } from "./RESTSession" interface Collection { name: string @@ -255,6 +256,16 @@ const collectionDispatchers = defineDispatchers({ targetLocation.requests.splice(requestIndex, 1) + // If the save context is set and is set to the same source, we invalidate it + const saveCtx = getRESTSaveContext() + if ( + saveCtx?.originLocation === "user-collection" && + saveCtx.folderPath === path && + saveCtx.requestIndex === requestIndex + ) { + setRESTSaveContext(null) + } + return { state: newState, } @@ -416,6 +427,15 @@ export function editRESTRequest( } export function saveRESTRequestAs(path: string, request: any) { + // For calculating the insertion request index + debugger + const targetLocation = navigateToFolderWithIndexPath( + restCollectionStore.value.state, + path.split("/").map((x) => parseInt(x)) + ) + + const insertionIndex = targetLocation!.requests.length + restCollectionStore.dispatch({ dispatcher: "saveRequestAs", payload: { @@ -423,6 +443,8 @@ export function saveRESTRequestAs(path: string, request: any) { request, }, }) + + return insertionIndex } export function removeRESTRequest(path: string, requestIndex: number) {