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:
jamesgeorge007
2024-05-03 22:31:36 +05:30
parent bbac317b71
commit b239b6b4a6
2 changed files with 150 additions and 35 deletions

View File

@@ -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))
} }

View File

@@ -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)
} }