refactor: handle updates post move request action
- Filter out duplicate issued handle entries. - Move from `getAffectedIndexes` helper function to a custom implementation for updating affected request indices.
This commit is contained in:
@@ -7,7 +7,7 @@ import {
|
|||||||
} from "@hoppscotch/data"
|
} from "@hoppscotch/data"
|
||||||
import { Service } from "dioc"
|
import { Service } from "dioc"
|
||||||
import * as E from "fp-ts/Either"
|
import * as E from "fp-ts/Either"
|
||||||
import { merge } from "lodash-es"
|
import { isEqual, merge } from "lodash-es"
|
||||||
import path from "path"
|
import path from "path"
|
||||||
import {
|
import {
|
||||||
Ref,
|
Ref,
|
||||||
@@ -414,7 +414,32 @@ export class PersonalWorkspaceProviderService
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
this.issuedHandles.push(writableHandle)
|
const handleIsAlreadyIssued = this.issuedHandles.some((handle) => {
|
||||||
|
if (handle.value.type === "invalid") {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!("requestID" in handle.value.data)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const { request, ...dataProps } = handle.value.data
|
||||||
|
|
||||||
|
if (
|
||||||
|
isEqual(dataProps, {
|
||||||
|
providerID,
|
||||||
|
workspaceID,
|
||||||
|
collectionID,
|
||||||
|
requestID,
|
||||||
|
})
|
||||||
|
) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!handleIsAlreadyIssued) {
|
||||||
|
this.issuedHandles.push(writableHandle)
|
||||||
|
}
|
||||||
|
|
||||||
return Promise.resolve(E.right(handle))
|
return Promise.resolve(E.right(handle))
|
||||||
}
|
}
|
||||||
@@ -636,55 +661,107 @@ export class PersonalWorkspaceProviderService
|
|||||||
return Promise.resolve(E.left("INVALID_REQUEST_HANDLE" as const))
|
return Promise.resolve(E.left("INVALID_REQUEST_HANDLE" as const))
|
||||||
}
|
}
|
||||||
|
|
||||||
const { requestID } = requestHandle.value.data
|
const { requestID: draggedRequestID } = requestHandle.value.data
|
||||||
const draggedRequestParentCollectionID = requestID
|
const sourceCollectionID = draggedRequestID
|
||||||
.split("/")
|
.split("/")
|
||||||
.slice(0, -1)
|
.slice(0, -1)
|
||||||
.join("/")
|
.join("/")
|
||||||
|
|
||||||
const draggedRequestIndexPos = this.pathToLastIndex(requestID)
|
const draggedRequestIndexPos = this.pathToLastIndex(draggedRequestID)
|
||||||
|
|
||||||
// `-1` indicates the incoming request in the last position for the destination collection
|
const movedRequestHandleIdx = this.issuedHandles.findIndex((handle) => {
|
||||||
const destinationRequestIndexPos = -1
|
if (handle.value.type === "invalid") {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
const affectedRequestIndices = getAffectedIndexes(
|
if (!("requestID" in handle.value.data)) {
|
||||||
draggedRequestIndexPos,
|
return
|
||||||
destinationRequestIndexPos
|
}
|
||||||
)
|
|
||||||
|
|
||||||
// Remove deleted request from the map
|
return handle.value.data.requestID === draggedRequestID
|
||||||
if (destinationRequestIndexPos === -1) {
|
})
|
||||||
affectedRequestIndices.delete(draggedRequestIndexPos)
|
|
||||||
|
const movedRequestHandle = this.issuedHandles[movedRequestHandleIdx]
|
||||||
|
|
||||||
|
if (
|
||||||
|
!movedRequestHandle ||
|
||||||
|
movedRequestHandle.value.type === "invalid" ||
|
||||||
|
!("requestID" in movedRequestHandle.value.data)
|
||||||
|
) {
|
||||||
|
return Promise.resolve(E.left("INVALID_REQUEST_HANDLE" as const))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const draggedCollectionReqCountBeforeMove = getRequestsByPath(
|
||||||
|
restCollectionStore.value.state,
|
||||||
|
sourceCollectionID
|
||||||
|
).length
|
||||||
|
|
||||||
|
// Requests appearing below the request being moved will be affected by the action
|
||||||
|
const affectedReqIndexRange =
|
||||||
|
draggedCollectionReqCountBeforeMove - 1 - draggedRequestIndexPos
|
||||||
|
|
||||||
|
const affectedRequestIDs = Array.from({
|
||||||
|
length: affectedReqIndexRange,
|
||||||
|
}).map((_, idx) => {
|
||||||
|
const val = affectedReqIndexRange + idx
|
||||||
|
return `${sourceCollectionID}/${val}`
|
||||||
|
})
|
||||||
|
|
||||||
moveRESTRequest(
|
moveRESTRequest(
|
||||||
draggedRequestParentCollectionID,
|
sourceCollectionID,
|
||||||
draggedRequestIndexPos,
|
draggedRequestIndexPos,
|
||||||
destinationCollectionID
|
destinationCollectionID
|
||||||
)
|
)
|
||||||
|
|
||||||
for (const [key, value] of affectedRequestIndices) {
|
const destinationCollectionReqCount = getRequestsByPath(
|
||||||
const handle = this.issuedHandles.find((handle) => {
|
restCollectionStore.value.state,
|
||||||
if (handle.value.type === "invalid") return
|
destinationCollectionID
|
||||||
|
).length
|
||||||
|
|
||||||
if (!("requestID" in handle.value.data)) return
|
// @ts-expect-error - Updating handle data the moved request
|
||||||
|
this.issuedHandles[movedRequestHandleIdx].value.data = {
|
||||||
|
// @ts-expect-error - Updating the IDs
|
||||||
|
...this.issuedHandles[movedRequestHandleIdx].value.data,
|
||||||
|
collectionID: destinationCollectionID,
|
||||||
|
requestID: `${destinationCollectionID}/${
|
||||||
|
destinationCollectionReqCount - 1
|
||||||
|
}`,
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
affectedRequestIDs.forEach((requestID) => {
|
||||||
handle.value.data.requestID ===
|
const handleIdx = this.issuedHandles.findIndex((handle) => {
|
||||||
`${draggedRequestParentCollectionID}/${key}`
|
if (handle.value.type === "invalid") {
|
||||||
)
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!("requestID" in handle.value.data)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
return handle.value.data.requestID === requestID
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const handle = this.issuedHandles[handleIdx]
|
||||||
|
|
||||||
if (
|
if (
|
||||||
!handle ||
|
!handle ||
|
||||||
handle.value.type === "invalid" ||
|
handle.value.type === "invalid" ||
|
||||||
!("requestID" in handle.value.data)
|
!("requestID" in handle.value.data)
|
||||||
) {
|
) {
|
||||||
continue
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
handle.value.data.requestID = `${destinationCollectionID}/${value}`
|
// Decrement the index pos in affected requests due to move
|
||||||
}
|
const reqIndexPos = Number(
|
||||||
|
handle.value.data.requestID.split("/").slice(-1)[0]
|
||||||
|
)
|
||||||
|
|
||||||
|
// @ts-expect-error - Updating the request ID
|
||||||
|
this.issuedHandles[handleIdx].value.data = {
|
||||||
|
...handle.value.data,
|
||||||
|
requestID: `${sourceCollectionID}/${reqIndexPos - 1}`,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
return Promise.resolve(E.right(undefined))
|
return Promise.resolve(E.right(undefined))
|
||||||
}
|
}
|
||||||
@@ -813,7 +890,32 @@ export class PersonalWorkspaceProviderService
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
this.issuedHandles.push(writableHandle)
|
const handleIsAlreadyIssued = this.issuedHandles.some((handle) => {
|
||||||
|
if (handle.value.type === "invalid") {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!("requestID" in handle.value.data)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const { request, ...dataProps } = handle.value.data
|
||||||
|
|
||||||
|
if (
|
||||||
|
isEqual(dataProps, {
|
||||||
|
providerID,
|
||||||
|
workspaceID,
|
||||||
|
collectionID,
|
||||||
|
requestID,
|
||||||
|
})
|
||||||
|
) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
if (!handleIsAlreadyIssued) {
|
||||||
|
this.issuedHandles.push(writableHandle)
|
||||||
|
}
|
||||||
|
|
||||||
return Promise.resolve(E.right(handle))
|
return Promise.resolve(E.right(handle))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -64,15 +64,28 @@ export class RESTTabService extends TabService<HoppRESTDocument> {
|
|||||||
ctx?.originLocation === "workspace-user-collection" &&
|
ctx?.originLocation === "workspace-user-collection" &&
|
||||||
tab.document.saveContext?.originLocation === "workspace-user-collection"
|
tab.document.saveContext?.originLocation === "workspace-user-collection"
|
||||||
) {
|
) {
|
||||||
if (
|
const requestHandle = tab.document.saveContext.requestHandle as
|
||||||
isEqual(
|
| HandleRef<WorkspaceRequest>["value"]
|
||||||
ctx.requestHandle?.value,
|
| undefined
|
||||||
|
|
||||||
// TODO: Investigate why requestHandle gets unwrapped
|
if (!ctx.requestHandle || !requestHandle) {
|
||||||
tab.document.saveContext.requestHandle as
|
return null
|
||||||
| HandleRef<WorkspaceRequest>["value"]
|
}
|
||||||
| undefined
|
|
||||||
)
|
if (
|
||||||
|
ctx.requestHandle.value.type === "invalid" ||
|
||||||
|
requestHandle.type === "invalid"
|
||||||
|
) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
ctx.requestHandle.value.data.providerID ===
|
||||||
|
requestHandle.data.providerID &&
|
||||||
|
ctx.requestHandle.value.data.workspaceID ===
|
||||||
|
requestHandle.data.workspaceID &&
|
||||||
|
ctx.requestHandle.value.data.requestID ===
|
||||||
|
requestHandle.data.requestID
|
||||||
) {
|
) {
|
||||||
return this.getTabRef(tab.id)
|
return this.getTabRef(tab.id)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user