diff --git a/packages/hoppscotch-common/src/components/app/Header.vue b/packages/hoppscotch-common/src/components/app/Header.vue index f557e889f..8dfaa8295 100644 --- a/packages/hoppscotch-common/src/components/app/Header.vue +++ b/packages/hoppscotch-common/src/components/app/Header.vue @@ -368,8 +368,10 @@ watch( const newWorkspaceService = useService(NewWorkspaceService) const activeWorkspaceName = computed(() => { - if (newWorkspaceService.activeWorkspaceHandle.value?.value.type === "ok") { - return newWorkspaceService.activeWorkspaceHandle.value?.value.data.name + const activeWorkspaceHandleRef = newWorkspaceService.activeWorkspaceHandle.value?.get() + + if (activeWorkspaceHandleRef?.value.type === "ok") { + return activeWorkspaceHandleRef.value.data.name } return t("workspace.no_workspace") diff --git a/packages/hoppscotch-common/src/components/collections/SaveRequest.vue b/packages/hoppscotch-common/src/components/collections/SaveRequest.vue index 47c53be9c..eb40f26b9 100644 --- a/packages/hoppscotch-common/src/components/collections/SaveRequest.vue +++ b/packages/hoppscotch-common/src/components/collections/SaveRequest.vue @@ -245,11 +245,6 @@ const saveRequestAs = async () => { const collectionHandle = collectionHandleResult.right - if (collectionHandle.value.type === "invalid") { - // WORKSPACE_INVALIDATED - return - } - const requestHandleResult = await workspaceService.createRESTRequest( collectionHandle, updatedRequest diff --git a/packages/hoppscotch-common/src/components/http/RequestTab.vue b/packages/hoppscotch-common/src/components/http/RequestTab.vue index 4427a04d3..0e3c8a4f7 100644 --- a/packages/hoppscotch-common/src/components/http/RequestTab.vue +++ b/packages/hoppscotch-common/src/components/http/RequestTab.vue @@ -20,8 +20,6 @@ import { useVModel } from "@vueuse/core" import { cloneDeep, isEqual } from "lodash-es" import { HoppTab } from "~/services/tab" import { HoppRESTDocument } from "~/helpers/rest/document" -import { WorkspaceRequest } from "~/services/new-workspace/workspace" -import { HandleRef } from "~/services/new-workspace/handle" // TODO: Move Response and Request execution code to over here @@ -43,24 +41,23 @@ watch( tab.value.document.saveContext?.originLocation === "workspace-user-collection" ) { - const requestHandle = tab.value.document.saveContext.requestHandle as - | HandleRef["value"] - | undefined + const requestHandleRef = + tab.value.document.saveContext.requestHandle?.get() - if (!requestHandle || requestHandle.type === "invalid") { + if (!requestHandleRef || requestHandleRef.value.type === "invalid") { return } if ( !tab.value.document.isDirty && - !isEqual(oldRequest, requestHandle?.data.request) + !isEqual(oldRequest, requestHandleRef?.value.data.request) ) { tab.value.document.isDirty = true } if ( tab.value.document.isDirty && - isEqual(oldRequest, requestHandle?.data.request) + isEqual(oldRequest, requestHandleRef?.value.data.request) ) { tab.value.document.isDirty = false } diff --git a/packages/hoppscotch-common/src/components/new-collections/rest/index.vue b/packages/hoppscotch-common/src/components/new-collections/rest/index.vue index fe18629a2..03504fb45 100644 --- a/packages/hoppscotch-common/src/components/new-collections/rest/index.vue +++ b/packages/hoppscotch-common/src/components/new-collections/rest/index.vue @@ -514,7 +514,7 @@ import { platform } from "~/platform" import { NewWorkspaceService } from "~/services/new-workspace" import { HandleRef } from "~/services/new-workspace/handle" import { RESTCollectionViewRequest } from "~/services/new-workspace/view" -import { Workspace, WorkspaceRequest } from "~/services/new-workspace/workspace" +import { Workspace } from "~/services/new-workspace/workspace" import { RESTTabService } from "~/services/tab/rest" import IconImport from "~icons/lucide/folder-down" import IconHelpCircle from "~icons/lucide/help-circle" @@ -1110,12 +1110,7 @@ const selectRequest = async (requestIndexPath: string) => { return } - const collectionHandle = collectionHandleResult.right.get() - - if (collectionHandle.value.type === "invalid") { - // WORKSPACE_INVALIDATED | INVALID_COLLECTION_HANDLE - return - } + const collectionHandle = collectionHandleResult.right const requestHandleResult = await workspaceService.getRequestHandle( props.workspaceHandle, @@ -1127,12 +1122,7 @@ const selectRequest = async (requestIndexPath: string) => { return } - const requestHandle = requestHandleResult.right.get() - - if (requestHandle.value.type === "invalid") { - // COLLECTION_INVALIDATED - return - } + const requestHandle = requestHandleResult.right const cascadingAuthHeadersHandleResult = await workspaceService.getRESTCollectionLevelAuthHeadersView( @@ -1163,9 +1153,11 @@ const selectRequest = async (requestIndexPath: string) => { if (possibleTab) { tabs.setActiveTab(possibleTab.value.id) } else { + const requestHandleRef = requestHandle.get() + // If not, open the request in a new tab tabs.createNewTab({ - request: requestHandle.value.data.request, + request: requestHandleRef.value.data.request, isDirty: false, saveContext: { originLocation: "workspace-user-collection", @@ -1640,12 +1632,7 @@ const dropRequest = async (payload: { return } - const requestHandle = requestHandleResult.right.get() - - if (requestHandle.value.type === "invalid") { - // COLLECTION_INVALIDATED - return - } + const requestHandle = requestHandleResult.right const result = await workspaceService.moveRESTRequest( requestHandle, @@ -1667,12 +1654,7 @@ const dropRequest = async (payload: { return } - const collectionHandle = collectionHandleResult.right.get() - - if (collectionHandle.value.type === "invalid") { - // WORKSPACE_INVALIDATED - return - } + const collectionHandle = collectionHandleResult.right const cascadingAuthHeadersHandleResult = await workspaceService.getRESTCollectionLevelAuthHeadersView( @@ -2098,18 +2080,20 @@ const isActiveRequest = (requestView: RESTCollectionViewRequest) => { return false } - // TODO: Investigate why requestHandle is available unwrapped here - const requestHandle = tabs.currentActiveTab.value.document.saveContext - .requestHandle as HandleRef["value"] | undefined + const requestHandle = + tabs.currentActiveTab.value.document.saveContext.requestHandle + if (!requestHandle) { return false } - if (requestHandle.type === "invalid") { + const requestHandleRef = requestHandle.get() + + if (requestHandleRef.value.type === "invalid") { return false } - return requestHandle.data.requestID === requestView.requestID + return requestHandleRef.value.data.requestID === requestView.requestID } const onSelectPick = (payload: Picked | null) => { diff --git a/packages/hoppscotch-common/src/components/workspace/Current.vue b/packages/hoppscotch-common/src/components/workspace/Current.vue index 1158b8be9..0f8301683 100644 --- a/packages/hoppscotch-common/src/components/workspace/Current.vue +++ b/packages/hoppscotch-common/src/components/workspace/Current.vue @@ -26,8 +26,10 @@ const workspaceService = useService(NewWorkspaceService) const activeWorkspaceHandle = workspaceService.activeWorkspaceHandle const workspaceName = computed(() => { - if (activeWorkspaceHandle.value?.value.type === "ok") { - return activeWorkspaceHandle.value.value.data.name + const activeWorkspaceHandleRef = activeWorkspaceHandle.value?.get() + + if (activeWorkspaceHandleRef?.value.type === "ok") { + return activeWorkspaceHandleRef.value.data.name } return undefined diff --git a/packages/hoppscotch-common/src/components/workspace/PersonalWorkspaceSelector.vue b/packages/hoppscotch-common/src/components/workspace/PersonalWorkspaceSelector.vue index 5ec7eb52e..18defa06a 100644 --- a/packages/hoppscotch-common/src/components/workspace/PersonalWorkspaceSelector.vue +++ b/packages/hoppscotch-common/src/components/workspace/PersonalWorkspaceSelector.vue @@ -34,12 +34,13 @@ const personalWorkspaceProviderService = useService( ) const activeWorkspaceInfo = computed(() => { - const activeWorkspace = workspaceService.activeWorkspaceHandle.value + const activeWorkspaceHandleRef = + workspaceService.activeWorkspaceHandle.value?.get() - if (activeWorkspace?.value.type === "ok") { + if (activeWorkspaceHandleRef?.value.type === "ok") { return { - provider: activeWorkspace.value.data.providerID, - workspaceID: activeWorkspace.value.data.workspaceID, + provider: activeWorkspaceHandleRef.value.data.providerID, + workspaceID: activeWorkspaceHandleRef.value.data.workspaceID, } } @@ -48,6 +49,6 @@ const activeWorkspaceInfo = computed(() => { function selectWorkspace() { workspaceService.activeWorkspaceHandle.value = - personalWorkspaceProviderService.getPersonalWorkspaceHandle().get() + personalWorkspaceProviderService.getPersonalWorkspaceHandle() } diff --git a/packages/hoppscotch-common/src/components/workspace/TestWorkspaceSelector.vue b/packages/hoppscotch-common/src/components/workspace/TestWorkspaceSelector.vue index 48eda6e72..02b3858e7 100644 --- a/packages/hoppscotch-common/src/components/workspace/TestWorkspaceSelector.vue +++ b/packages/hoppscotch-common/src/components/workspace/TestWorkspaceSelector.vue @@ -37,12 +37,13 @@ const testWorkspaceProviderService = useService(TestWorkspaceProviderService) const candidates = testWorkspaceProviderService.getWorkspaceCandidates() const activeWorkspaceInfo = computed(() => { - const activeWorkspace = workspaceService.activeWorkspaceHandle.value + const activeWorkspaceHandle = workspaceService.activeWorkspaceHandle.value + const activeWorkspaceHandleRef = activeWorkspaceHandle?.get() - if (activeWorkspace?.value.type === "ok") { + if (activeWorkspaceHandleRef?.value.type === "ok") { return { - provider: activeWorkspace.value.data.providerID, - workspaceID: activeWorkspace.value.data.workspaceID, + provider: activeWorkspaceHandleRef.value.data.providerID, + workspaceID: activeWorkspaceHandleRef.value.data.workspaceID, } } @@ -59,6 +60,6 @@ async function selectWorkspace(workspaceID: string) { return } - workspaceService.activeWorkspaceHandle.value = result.right.get() + workspaceService.activeWorkspaceHandle.value = result.right } diff --git a/packages/hoppscotch-common/src/helpers/adapters/WorkspaceRESTCollectionTreeAdapter.ts b/packages/hoppscotch-common/src/helpers/adapters/WorkspaceRESTCollectionTreeAdapter.ts index 8f6b541f5..c2c8737b3 100644 --- a/packages/hoppscotch-common/src/helpers/adapters/WorkspaceRESTCollectionTreeAdapter.ts +++ b/packages/hoppscotch-common/src/helpers/adapters/WorkspaceRESTCollectionTreeAdapter.ts @@ -5,7 +5,7 @@ import { import * as E from "fp-ts/Either" import { Ref, ref, watchEffect } from "vue" import { NewWorkspaceService } from "~/services/new-workspace" -import { HandleRef } from "~/services/new-workspace/handle" +import { Handle } from "~/services/new-workspace/handle" import { RESTCollectionViewItem } from "~/services/new-workspace/view" import { Workspace } from "~/services/new-workspace/workspace" @@ -13,7 +13,7 @@ export class WorkspaceRESTCollectionTreeAdapter implements SmartTreeAdapter { constructor( - private workspaceHandle: HandleRef, + private workspaceHandle: Handle, private workspaceService: NewWorkspaceService ) {} @@ -21,7 +21,9 @@ export class WorkspaceRESTCollectionTreeAdapter nodeID: string | null, nodeType?: string ): Ref> { - if (this.workspaceHandle.value.type !== "ok") { + const workspaceHandleRef = this.workspaceHandle.get() + + if (workspaceHandleRef.value.type !== "ok") { throw new Error("Cannot issue children with invalid workspace handle") } @@ -50,7 +52,7 @@ export class WorkspaceRESTCollectionTreeAdapter throw new Error(JSON.stringify(collectionHandleResult.left.error)) } - const collectionHandle = collectionHandleResult.right.get() + const collectionHandle = collectionHandleResult.right const collectionChildrenResult = await this.workspaceService.getRESTCollectionChildrenView( diff --git a/packages/hoppscotch-common/src/helpers/collection/collection.ts b/packages/hoppscotch-common/src/helpers/collection/collection.ts index c9cea6913..425defab3 100644 --- a/packages/hoppscotch-common/src/helpers/collection/collection.ts +++ b/packages/hoppscotch-common/src/helpers/collection/collection.ts @@ -9,8 +9,6 @@ import { runGQLQuery } from "../backend/GQLClient" import { GetSingleRequestDocument } from "../backend/graphql" import { HoppInheritedProperty } from "../types/HoppInheritedProperties" import { getAffectedIndexes } from "./affectedIndex" -import { WorkspaceRequest } from "~/services/new-workspace/workspace" -import { HandleRef } from "~/services/new-workspace/handle" /** * Resolve save context on reorder @@ -67,15 +65,13 @@ export function resolveSaveContextOnCollectionReorder(payload: { return false } - const requestHandle = tab.document.saveContext.requestHandle as - | HandleRef["value"] - | undefined + const requestHandleRef = tab.document.saveContext.requestHandle?.get() - if (!requestHandle || requestHandle.type === "invalid") { + if (!requestHandleRef || requestHandleRef.value.type === "invalid") { return false } - const { requestID } = requestHandle.data + const { requestID } = requestHandleRef.value.data const collectionID = requestID.split("/").slice(0, -1).join("/") @@ -97,15 +93,13 @@ export function resolveSaveContextOnCollectionReorder(payload: { return false } - const requestHandle = tab.value.document.saveContext.requestHandle as - | HandleRef["value"] - | undefined + const requestHandleRef = tab.value.document.saveContext.requestHandle?.get() - if (!requestHandle || requestHandle.type === "invalid") { + if (!requestHandleRef || requestHandleRef.value.type === "invalid") { return false } - const { requestID } = requestHandle.data + const { requestID } = requestHandleRef.value.data const collectionID = requestID.split("/").slice(0, -1).join("/") @@ -114,8 +108,8 @@ export function resolveSaveContextOnCollectionReorder(payload: { requestID.split("/").slice(-1)[0] }` - requestHandle.data = { - ...requestHandle.data, + requestHandleRef.value.data = { + ...requestHandleRef.value.data, collectionID: newCollectionID!, requestID: newRequestID, } @@ -159,15 +153,13 @@ export function updateSaveContextForAffectedRequests( if ( tab.document.saveContext?.originLocation === "workspace-user-collection" ) { - const requestHandle = tab.document.saveContext.requestHandle as - | HandleRef["value"] - | undefined + const requestHandleRef = tab.document.saveContext.requestHandle?.get() - if (!requestHandle || requestHandle.type === "invalid") { + if (!requestHandleRef || requestHandleRef.value.type === "invalid") { return false } - const { requestID } = requestHandle.data + const { requestID } = requestHandleRef.value.data const collectionID = requestID.split("/").slice(0, -1).join("/") const requestIndex = requestID.split("/").slice(-1)[0] @@ -184,8 +176,8 @@ export function updateSaveContextForAffectedRequests( requestID: newRequestID, } - requestHandle.data = { - ...requestHandle.data, + requestHandleRef.value.data = { + ...requestHandleRef.value.data, collectionID: newCollectionID, requestID: newRequestID, } @@ -268,7 +260,7 @@ export function updateInheritedPropertiesForAffectedRequests( } const collectionID = tab.document.saveContext?.requestID - .split("/") + ?.split("/") .slice(0, -1) .join("/") @@ -359,65 +351,6 @@ export function updateInheritedPropertiesForAffectedRequests( }) } -function resetSaveContextForAffectedRequests(folderPath: string) { - const tabService = getService(RESTTabService) - const tabs = tabService.getTabsRefTo((tab) => { - if (tab.document.saveContext?.originLocation === "user-collection") { - return tab.document.saveContext.folderPath.startsWith(folderPath) - } - - if ( - tab.document.saveContext?.originLocation !== "workspace-user-collection" - ) { - return false - } - - const requestHandle = tab.document.saveContext.requestHandle as - | HandleRef["value"] - | undefined - - if (!requestHandle || requestHandle.type === "invalid") { - return false - } - - const { requestID } = requestHandle.data - const collectionID = requestID.split("/").slice(0, -1).join("/") - - return collectionID.startsWith(folderPath) - }) - - for (const tab of tabs) { - if (tab.value.document.saveContext?.originLocation === "user-collection") { - tab.value.document.saveContext = null - tab.value.document.isDirty = true - - return - } - - if ( - tab.value.document.saveContext?.originLocation === - "workspace-user-collection" - ) { - const requestHandle = tab.value.document.saveContext.requestHandle as - | HandleRef["value"] - | undefined - - if (!requestHandle || requestHandle.type === "invalid") { - return - } - - // @ts-expect-error - Removing the `data` property - delete requestHandle.data - - // @ts-expect-error - Updating the type - requestHandle.type = "invalid" - - // @ts-expect-error - Specifying the reason - requestHandle.reason = "REQUEST_INVALIDATED" - } - } -} - /** * Reset save context to null if requests are deleted from the team collection or its folder * only runs when collection or folder is deleted diff --git a/packages/hoppscotch-common/src/helpers/collection/request.ts b/packages/hoppscotch-common/src/helpers/collection/request.ts index ba758fc2c..35a34e8b3 100644 --- a/packages/hoppscotch-common/src/helpers/collection/request.ts +++ b/packages/hoppscotch-common/src/helpers/collection/request.ts @@ -5,8 +5,6 @@ import { } from "@hoppscotch/data" import { getService } from "~/modules/dioc" -import { HandleRef } from "~/services/new-workspace/handle" -import { WorkspaceRequest } from "~/services/new-workspace/workspace" import { RESTTabService } from "~/services/tab/rest" import { getAffectedIndexes } from "./affectedIndex" @@ -55,15 +53,13 @@ export function resolveSaveContextOnRequestReorder(payload: { return false } - const requestHandle = tab.document.saveContext.requestHandle as - | HandleRef["value"] - | undefined + const requestHandleRef = tab.document.saveContext.requestHandle?.get() - if (!requestHandle || requestHandle.type === "invalid") { + if (!requestHandleRef || requestHandleRef.value.type === "invalid") { return false } - const { requestID } = requestHandle.data + const { requestID } = requestHandleRef.value.data const collectionID = requestID.split("/").slice(0, -1).join("/") const requestIndex = parseInt(requestID.split("/").slice(-1)[0]) @@ -85,15 +81,13 @@ export function resolveSaveContextOnRequestReorder(payload: { return } - const requestHandle = tab.value.document.saveContext.requestHandle as - | HandleRef["value"] - | undefined + const requestHandleRef = tab.value.document.saveContext.requestHandle?.get() - if (!requestHandle || requestHandle.type === "invalid") { + if (!requestHandleRef || requestHandleRef.value.type === "invalid") { return } - const { requestID } = requestHandle.data + const { requestID } = requestHandleRef.value.data const requestIDArr = requestID.split("/") const requestIndex = affectedIndices.get( @@ -102,8 +96,10 @@ export function resolveSaveContextOnRequestReorder(payload: { requestIDArr[requestIDArr.length - 1] = requestIndex.toString() - requestHandle.data.requestID = requestIDArr.join("/") - requestHandle.data.collectionID = requestIDArr.slice(0, -1).join("/") + requestHandleRef.value.data.requestID = requestIDArr.join("/") + requestHandleRef.value.data.collectionID = requestIDArr + .slice(0, -1) + .join("/") } } diff --git a/packages/hoppscotch-common/src/helpers/rest/document.ts b/packages/hoppscotch-common/src/helpers/rest/document.ts index a4bb9805e..a2f99878f 100644 --- a/packages/hoppscotch-common/src/helpers/rest/document.ts +++ b/packages/hoppscotch-common/src/helpers/rest/document.ts @@ -3,7 +3,7 @@ import { HoppRESTResponse } from "../types/HoppRESTResponse" import { HoppTestResult } from "../types/HoppTestResult" import { RESTOptionTabs } from "~/components/http/RequestOptions.vue" import { HoppInheritedProperty } from "../types/HoppInheritedProperties" -import { HandleRef } from "~/services/new-workspace/handle" +import { Handle } from "~/services/new-workspace/handle" import { WorkspaceRequest } from "~/services/new-workspace/workspace" export type HoppRESTSaveContext = @@ -31,7 +31,7 @@ export type HoppRESTSaveContext = /** * Handle to the request open in the tab */ - requestHandle?: HandleRef + requestHandle?: Handle } | { /** diff --git a/packages/hoppscotch-common/src/helpers/utils/lazy.ts b/packages/hoppscotch-common/src/helpers/utils/lazy.ts new file mode 100644 index 000000000..c8a228d4d --- /dev/null +++ b/packages/hoppscotch-common/src/helpers/utils/lazy.ts @@ -0,0 +1,17 @@ +/** + * Create a function that will only run the given function once and caches the result. + */ +export function lazy(fn: () => T): () => T { + let funcRan = false + let result: T | null = null + + return () => { + if (!funcRan) { + result = fn() + funcRan = true + + return result + } + return result! + } +} diff --git a/packages/hoppscotch-common/src/services/new-workspace/index.ts b/packages/hoppscotch-common/src/services/new-workspace/index.ts index 4d7fb73de..92be54624 100644 --- a/packages/hoppscotch-common/src/services/new-workspace/index.ts +++ b/packages/hoppscotch-common/src/services/new-workspace/index.ts @@ -10,7 +10,7 @@ import { shallowRef, watch, } from "vue" -import { Handle, HandleRef } from "./handle" +import { Handle } from "./handle" import { WorkspaceProvider } from "./provider" import { RESTCollectionChildrenView, @@ -32,16 +32,18 @@ export class NewWorkspaceService extends Service { new Map() ) - public activeWorkspaceHandle: Ref | undefined> = + public activeWorkspaceHandle: Ref | undefined> = shallowRef() public activeWorkspaceDecor = computed(() => { - if (this.activeWorkspaceHandle.value?.value.type !== "ok") { + const activeWorkspaceHandleRef = this.activeWorkspaceHandle.value?.get() + + if (activeWorkspaceHandleRef?.value.type !== "ok") { return undefined } return this.registeredProviders.get( - this.activeWorkspaceHandle.value.value.data.providerID + activeWorkspaceHandleRef.value.data.providerID )!.workspaceDecor }) @@ -73,14 +75,16 @@ export class NewWorkspaceService extends Service { return this.activeWorkspaceHandle.value ? [ this.activeWorkspaceHandle.value, - this.activeWorkspaceHandle.value.value, + this.activeWorkspaceHandle.value?.get(), ] : [this.activeWorkspaceHandle.value] }, () => { if (!this.activeWorkspaceHandle.value) return - if (this.activeWorkspaceHandle.value.value.type === "invalid") { + const activeWorkspaceHandleRef = this.activeWorkspaceHandle.value.get() + + if (activeWorkspaceHandleRef.value.type === "invalid") { this.activeWorkspaceHandle.value = undefined } }, @@ -110,7 +114,7 @@ export class NewWorkspaceService extends Service { } public async getCollectionHandle( - workspaceHandle: HandleRef, + workspaceHandle: Handle, collectionID: string ): Promise< E.Either< @@ -118,12 +122,14 @@ export class NewWorkspaceService extends Service { Handle > > { - if (workspaceHandle.value.type === "invalid") { + const workspaceHandleRef = workspaceHandle.get() + + if (workspaceHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - workspaceHandle.value.data.providerID + workspaceHandleRef.value.data.providerID ) if (!provider) { @@ -143,7 +149,7 @@ export class NewWorkspaceService extends Service { } public async getRequestHandle( - workspaceHandle: HandleRef, + workspaceHandle: Handle, requestID: string ): Promise< E.Either< @@ -151,12 +157,14 @@ export class NewWorkspaceService extends Service { Handle > > { - if (workspaceHandle.value.type === "invalid") { + const workspaceHandleRef = workspaceHandle.get() + + if (workspaceHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - workspaceHandle.value.data.providerID + workspaceHandleRef.value.data.providerID ) if (!provider) { @@ -173,7 +181,7 @@ export class NewWorkspaceService extends Service { } public async createRESTRootCollection( - workspaceHandle: HandleRef, + workspaceHandle: Handle, newCollection: Partial> & { name: string } ): Promise< E.Either< @@ -181,12 +189,14 @@ export class NewWorkspaceService extends Service { Handle > > { - if (workspaceHandle.value.type === "invalid") { + const workspaceHandleRef = workspaceHandle.get() + + if (workspaceHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - workspaceHandle.value.data.providerID + workspaceHandleRef.value.data.providerID ) if (!provider) { @@ -206,7 +216,7 @@ export class NewWorkspaceService extends Service { } public async createRESTChildCollection( - parentCollectionHandle: HandleRef, + parentCollectionHandle: Handle, newChildCollection: Partial & { name: string } ): Promise< E.Either< @@ -214,12 +224,14 @@ export class NewWorkspaceService extends Service { Handle > > { - if (parentCollectionHandle.value.type === "invalid") { + const parentCollectionHandleRef = parentCollectionHandle.get() + + if (parentCollectionHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - parentCollectionHandle.value.data.providerID + parentCollectionHandleRef.value.data.providerID ) if (!provider) { @@ -239,17 +251,19 @@ export class NewWorkspaceService extends Service { } public async updateRESTCollection( - collectionHandle: HandleRef, + collectionHandle: Handle, updatedCollection: Partial ): Promise< E.Either, void> > { - if (collectionHandle.value.type === "invalid") { + const collectionHandleRef = collectionHandle.get() + + if (collectionHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - collectionHandle.value.data.providerID + collectionHandleRef.value.data.providerID ) if (!provider) { @@ -269,16 +283,18 @@ export class NewWorkspaceService extends Service { } public async removeRESTCollection( - collectionHandle: HandleRef + collectionHandle: Handle ): Promise< E.Either, void> > { - if (collectionHandle.value.type === "invalid") { + const collectionHandleRef = collectionHandle.get() + + if (collectionHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - collectionHandle.value.data.providerID + collectionHandleRef.value.data.providerID ) if (!provider) { @@ -295,7 +311,7 @@ export class NewWorkspaceService extends Service { } public async createRESTRequest( - parentCollectionHandle: HandleRef, + parentCollectionHandle: Handle, newRequest: HoppRESTRequest ): Promise< E.Either< @@ -303,12 +319,14 @@ export class NewWorkspaceService extends Service { Handle > > { - if (parentCollectionHandle.value.type === "invalid") { + const parentCollectionHandleRef = parentCollectionHandle.get() + + if (parentCollectionHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - parentCollectionHandle.value.data.providerID + parentCollectionHandleRef.value.data.providerID ) if (!provider) { @@ -328,16 +346,18 @@ export class NewWorkspaceService extends Service { } public async removeRESTRequest( - requestHandle: HandleRef + requestHandle: Handle ): Promise< E.Either, void> > { - if (requestHandle.value.type === "invalid") { + const requestHandleRef = requestHandle.get() + + if (requestHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - requestHandle.value.data.providerID + requestHandleRef.value.data.providerID ) if (!provider) { @@ -354,17 +374,19 @@ export class NewWorkspaceService extends Service { } public async updateRESTRequest( - requestHandle: HandleRef, + requestHandle: Handle, updatedRequest: Partial ): Promise< E.Either, void> > { - if (requestHandle.value.type === "invalid") { + const requestHandleRef = requestHandle.get() + + if (requestHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - requestHandle.value.data.providerID + requestHandleRef.value.data.providerID ) if (!provider) { @@ -384,7 +406,7 @@ export class NewWorkspaceService extends Service { } public async importRESTCollections( - workspaceHandle: HandleRef, + workspaceHandle: Handle, collections: HoppCollection[] ): Promise< E.Either< @@ -392,12 +414,14 @@ export class NewWorkspaceService extends Service { Handle > > { - if (workspaceHandle.value.type === "invalid") { + const workspaceHandleRef = workspaceHandle.get() + + if (workspaceHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - workspaceHandle.value.data.providerID + workspaceHandleRef.value.data.providerID ) if (!provider) { @@ -417,17 +441,19 @@ export class NewWorkspaceService extends Service { } public async exportRESTCollections( - workspaceHandle: HandleRef, + workspaceHandle: Handle, collections: HoppCollection[] ): Promise< E.Either, void> > { - if (workspaceHandle.value.type === "invalid") { + const workspaceHandleRef = workspaceHandle.get() + + if (workspaceHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - workspaceHandle.value.data.providerID + workspaceHandleRef.value.data.providerID ) if (!provider) { @@ -447,17 +473,19 @@ export class NewWorkspaceService extends Service { } public async exportRESTCollection( - collectionHandle: HandleRef, + collectionHandle: Handle, collection: HoppCollection ): Promise< E.Either, void> > { - if (collectionHandle.value.type === "invalid") { + const collectionHandleRef = collectionHandle.get() + + if (collectionHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - collectionHandle.value.data.providerID + collectionHandleRef.value.data.providerID ) if (!provider) { @@ -477,17 +505,19 @@ export class NewWorkspaceService extends Service { } public async reorderRESTCollection( - collectionHandle: HandleRef, + collectionHandle: Handle, destinationCollectionID: string | null ): Promise< E.Either, void> > { - if (collectionHandle.value.type === "invalid") { + const collectionHandleRef = collectionHandle.get() + + if (collectionHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - collectionHandle.value.data.providerID + collectionHandleRef.value.data.providerID ) if (!provider) { @@ -507,17 +537,19 @@ export class NewWorkspaceService extends Service { } public async moveRESTCollection( - collectionHandle: HandleRef, + collectionHandle: Handle, destinationCollectionID: string | null ): Promise< E.Either, void> > { - if (collectionHandle.value.type === "invalid") { + const collectionHandleRef = collectionHandle.get() + + if (collectionHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - collectionHandle.value.data.providerID + collectionHandleRef.value.data.providerID ) if (!provider) { @@ -537,18 +569,20 @@ export class NewWorkspaceService extends Service { } public async reorderRESTRequest( - requestHandle: HandleRef, + requestHandle: Handle, destinationCollectionID: string, destinationRequestID: string | null ): Promise< E.Either, void> > { - if (requestHandle.value.type === "invalid") { + const requestHandleRef = requestHandle.get() + + if (requestHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - requestHandle.value.data.providerID + requestHandleRef.value.data.providerID ) if (!provider) { @@ -569,17 +603,19 @@ export class NewWorkspaceService extends Service { } public async moveRESTRequest( - requestHandle: HandleRef, + requestHandle: Handle, destinationCollectionID: string ): Promise< E.Either, void> > { - if (requestHandle.value.type === "invalid") { + const requestHandleRef = requestHandle.get() + + if (requestHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - requestHandle.value.data.providerID + requestHandleRef.value.data.providerID ) if (!provider) { @@ -599,19 +635,21 @@ export class NewWorkspaceService extends Service { } public async getRESTCollectionChildrenView( - collectionHandle: HandleRef + collectionHandle: Handle ): Promise< E.Either< WorkspaceError<"INVALID_HANDLE" | "INVALID_PROVIDER">, Handle > > { - if (collectionHandle.value.type === "invalid") { + const collectionHandleRef = collectionHandle.get() + + if (collectionHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - collectionHandle.value.data.providerID + collectionHandleRef.value.data.providerID ) if (!provider) { @@ -629,19 +667,21 @@ export class NewWorkspaceService extends Service { } public async getRESTRootCollectionView( - workspaceHandle: HandleRef + workspaceHandle: Handle ): Promise< E.Either< WorkspaceError<"INVALID_HANDLE" | "INVALID_PROVIDER">, Handle > > { - if (workspaceHandle.value.type === "invalid") { + const workspaceHandleRef = workspaceHandle.get() + + if (workspaceHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - workspaceHandle.value.data.providerID + workspaceHandleRef.value.data.providerID ) if (!provider) { @@ -658,19 +698,21 @@ export class NewWorkspaceService extends Service { } public async getRESTCollectionLevelAuthHeadersView( - collectionHandle: HandleRef + collectionHandle: Handle ): Promise< E.Either< WorkspaceError<"INVALID_HANDLE" | "INVALID_PROVIDER">, Handle > > { - if (collectionHandle.value.type === "invalid") { + const collectionHandleRef = collectionHandle.get() + + if (collectionHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - collectionHandle.value.data.providerID + collectionHandleRef.value.data.providerID ) if (!provider) { @@ -688,7 +730,7 @@ export class NewWorkspaceService extends Service { } public async getRESTSearchResultsView( - workspaceHandle: HandleRef, + workspaceHandle: Handle, searchQuery: Ref ): Promise< E.Either< @@ -696,12 +738,14 @@ export class NewWorkspaceService extends Service { Handle > > { - if (workspaceHandle.value.type === "invalid") { + const workspaceHandleRef = workspaceHandle.get() + + if (workspaceHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - workspaceHandle.value.data.providerID + workspaceHandleRef.value.data.providerID ) if (!provider) { @@ -721,19 +765,21 @@ export class NewWorkspaceService extends Service { } public async getRESTCollectionJSONView( - workspaceHandle: HandleRef + workspaceHandle: Handle ): Promise< E.Either< WorkspaceError<"INVALID_HANDLE" | "INVALID_PROVIDER">, Handle > > { - if (workspaceHandle.value.type === "invalid") { + const workspaceHandleRef = workspaceHandle.get() + + if (workspaceHandleRef.value.type === "invalid") { return E.left({ type: "SERVICE_ERROR", error: "INVALID_HANDLE" }) } const provider = this.registeredProviders.get( - workspaceHandle.value.data.providerID + workspaceHandleRef.value.data.providerID ) if (!provider) { diff --git a/packages/hoppscotch-common/src/services/new-workspace/provider.ts b/packages/hoppscotch-common/src/services/new-workspace/provider.ts index d55b3c505..6f34e8319 100644 --- a/packages/hoppscotch-common/src/services/new-workspace/provider.ts +++ b/packages/hoppscotch-common/src/services/new-workspace/provider.ts @@ -1,7 +1,7 @@ import { Ref } from "vue" import * as E from "fp-ts/Either" -import { Handle, HandleRef } from "./handle" +import { Handle } from "./handle" import { Workspace, WorkspaceCollection, @@ -26,86 +26,86 @@ export interface WorkspaceProvider { workspaceID: string ): Promise>> getCollectionHandle( - workspaceHandle: HandleRef, + workspaceHandle: Handle, collectionID: string ): Promise>> getRequestHandle( - workspaceHandle: HandleRef, + workspaceHandle: Handle, requestID: string ): Promise>> getRESTRootCollectionView( - workspaceHandle: HandleRef + workspaceHandle: Handle ): Promise>> getRESTCollectionChildrenView( - collectionHandle: HandleRef + collectionHandle: Handle ): Promise>> getRESTCollectionLevelAuthHeadersView( - collectionHandle: HandleRef + collectionHandle: Handle ): Promise>> getRESTSearchResultsView( - workspaceHandle: HandleRef, + workspaceHandle: Handle, searchQuery: Ref ): Promise>> getRESTCollectionJSONView( - workspaceHandle: HandleRef + workspaceHandle: Handle ): Promise>> createRESTRootCollection( - workspaceHandle: HandleRef, + workspaceHandle: Handle, newCollection: Partial> & { name: string } ): Promise>> createRESTChildCollection( - parentCollectionHandle: HandleRef, + parentCollectionHandle: Handle, newChildCollection: Partial & { name: string } ): Promise>> updateRESTCollection( - collectionHandle: HandleRef, + collectionHandle: Handle, updatedCollection: Partial ): Promise> removeRESTCollection( - collectionHandle: HandleRef + collectionHandle: Handle ): Promise> createRESTRequest( - parentCollectionHandle: HandleRef, + parentCollectionHandle: Handle, newRequest: HoppRESTRequest ): Promise>> updateRESTRequest( - requestHandle: HandleRef, + requestHandle: Handle, updatedRequest: Partial ): Promise> removeRESTRequest( - requestHandle: HandleRef + requestHandle: Handle ): Promise> importRESTCollections( - workspaceHandle: HandleRef, + workspaceHandle: Handle, collections: HoppCollection[] ): Promise>> exportRESTCollections( - workspaceHandle: HandleRef, + workspaceHandle: Handle, collections: HoppCollection[] ): Promise> exportRESTCollection( - collectionHandle: HandleRef, + collectionHandle: Handle, collection: HoppCollection ): Promise> reorderRESTCollection( - collectionHandle: HandleRef, + collectionHandle: Handle, destinationCollectionID: string | null ): Promise> moveRESTCollection( - collectionHandle: HandleRef, + collectionHandle: Handle, destinationCollectionID: string | null ): Promise> reorderRESTRequest( - requestHandle: HandleRef, + requestHandle: Handle, destinationCollectionID: string, destinationRequestID: string | null ): Promise> moveRESTRequest( - requestHandle: HandleRef, + requestHandle: Handle, destinationCollectionID: string ): Promise> } diff --git a/packages/hoppscotch-common/src/services/new-workspace/providers/personal.workspace.ts b/packages/hoppscotch-common/src/services/new-workspace/providers/personal.workspace.ts index 5a3d7b768..e7643fdc2 100644 --- a/packages/hoppscotch-common/src/services/new-workspace/providers/personal.workspace.ts +++ b/packages/hoppscotch-common/src/services/new-workspace/providers/personal.workspace.ts @@ -80,6 +80,7 @@ import { isValidRequestHandle, isValidWorkspaceHandle, } from "../helpers" +import { lazy } from "~/helpers/utils/lazy" export class PersonalWorkspaceProviderService extends Service @@ -128,10 +129,14 @@ export class PersonalWorkspaceProviderService } public createRESTRootCollection( - workspaceHandle: HandleRef, + workspaceHandle: Handle, newCollection: Partial> & { name: string } ): Promise>> { - if (!isValidWorkspaceHandle(workspaceHandle, this.providerID, "personal")) { + const workspaceHandleRef = workspaceHandle.get() + + if ( + !isValidWorkspaceHandle(workspaceHandleRef, this.providerID, "personal") + ) { return Promise.resolve(E.left("INVALID_WORKSPACE_HANDLE" as const)) } @@ -160,11 +165,11 @@ export class PersonalWorkspaceProviderService return Promise.resolve( E.right({ - get: () => + get: lazy(() => computed(() => { if ( !isValidWorkspaceHandle( - workspaceHandle, + workspaceHandleRef, this.providerID, "personal" ) @@ -179,23 +184,26 @@ export class PersonalWorkspaceProviderService type: "ok", data: { providerID: this.providerID, - workspaceID: workspaceHandle.value.data.workspaceID, + workspaceID: workspaceHandleRef.value.data.workspaceID, collectionID: newCollectionID, name: newCollectionName, }, } - }), + }) + ), }) ) } public createRESTChildCollection( - parentCollectionHandle: HandleRef, + parentCollectionHandle: Handle, newChildCollection: Partial & { name: string } ): Promise>> { + const parentCollectionHandleRef = parentCollectionHandle.get() + if ( !isValidCollectionHandle( - parentCollectionHandle, + parentCollectionHandleRef, this.providerID, "personal" ) @@ -204,7 +212,7 @@ export class PersonalWorkspaceProviderService } const { collectionID, providerID, workspaceID } = - parentCollectionHandle.value.data + parentCollectionHandleRef.value.data const newCollectionName = newChildCollection.name addRESTFolder(newCollectionName, collectionID) @@ -218,11 +226,11 @@ export class PersonalWorkspaceProviderService return Promise.resolve( E.right({ - get: () => + get: lazy(() => computed(() => { if ( !isValidCollectionHandle( - parentCollectionHandle, + parentCollectionHandleRef, this.providerID, "personal" ) @@ -242,22 +250,25 @@ export class PersonalWorkspaceProviderService name: newCollectionName, }, } - }), + }) + ), }) ) } public updateRESTCollection( - collectionHandle: HandleRef, + collectionHandle: Handle, updatedCollection: Partial ): Promise> { + const collectionHandleRef = collectionHandle.get() + if ( - !isValidCollectionHandle(collectionHandle, this.providerID, "personal") + !isValidCollectionHandle(collectionHandleRef, this.providerID, "personal") ) { return Promise.resolve(E.left("INVALID_COLLECTION_HANDLE" as const)) } - const { collectionID } = collectionHandle.value.data + const { collectionID } = collectionHandleRef.value.data const collection = navigateToFolderWithIndexPath( this.restCollectionState.value.state, @@ -278,15 +289,17 @@ export class PersonalWorkspaceProviderService } public removeRESTCollection( - collectionHandle: HandleRef + collectionHandle: Handle ): Promise> { + const collectionHandleRef = collectionHandle.get() + if ( - !isValidCollectionHandle(collectionHandle, this.providerID, "personal") + !isValidCollectionHandle(collectionHandleRef, this.providerID, "personal") ) { return Promise.resolve(E.left("INVALID_COLLECTION_HANDLE" as const)) } - const { collectionID } = collectionHandle.value.data + const { collectionID } = collectionHandleRef.value.data const isRootCollection = collectionID.split("/").length === 1 const collectionIndex = parseInt(collectionID) @@ -355,12 +368,14 @@ export class PersonalWorkspaceProviderService } public createRESTRequest( - parentCollectionHandle: HandleRef, + parentCollectionHandle: Handle, newRequest: HoppRESTRequest ): Promise>> { + const parentCollectionHandleRef = parentCollectionHandle.get() + if ( !isValidCollectionHandle( - parentCollectionHandle, + parentCollectionHandleRef, this.providerID, "personal" ) @@ -369,7 +384,7 @@ export class PersonalWorkspaceProviderService } const { collectionID, providerID, workspaceID } = - parentCollectionHandle.value.data + parentCollectionHandleRef.value.data const insertionIndex = saveRESTRequestAs(collectionID, newRequest) @@ -396,7 +411,7 @@ export class PersonalWorkspaceProviderService const handle: HandleRef = computed(() => { if ( !isValidCollectionHandle( - parentCollectionHandle, + parentCollectionHandleRef, this.providerID, "personal" ) @@ -446,17 +461,19 @@ export class PersonalWorkspaceProviderService this.issuedHandles.push(writableHandle) } - return Promise.resolve(E.right({ get: () => handle })) + return Promise.resolve(E.right({ get: lazy(() => handle) })) } public removeRESTRequest( - requestHandle: HandleRef + requestHandle: Handle ): Promise> { - if (!isValidRequestHandle(requestHandle, this.providerID, "personal")) { + const requestHandleRef = requestHandle.get() + + if (!isValidRequestHandle(requestHandleRef, this.providerID, "personal")) { return Promise.resolve(E.left("INVALID_REQUEST_HANDLE" as const)) } - const { collectionID, requestID } = requestHandle.value.data + const { collectionID, requestID } = requestHandleRef.value.data const requestIndex = parseInt(requestID.split("/").slice(-1)[0]) const requestToRemove = navigateToFolderWithIndexPath( @@ -495,16 +512,18 @@ export class PersonalWorkspaceProviderService } public updateRESTRequest( - requestHandle: HandleRef, + requestHandle: Handle, updatedRequest: Partial ): Promise> { - if (!isValidRequestHandle(requestHandle, this.providerID, "personal")) { + const requestHandleRef = requestHandle.get() + + if (!isValidRequestHandle(requestHandleRef, this.providerID, "personal")) { return Promise.resolve(E.left("INVALID_REQUEST_HANDLE" as const)) } delete updatedRequest.id - const { collectionID, requestID, request } = requestHandle.value.data + const { collectionID, requestID, request } = requestHandleRef.value.data const newRequest: HoppRESTRequest = merge(request, updatedRequest) const requestIndex = parseInt(requestID.split("/").slice(-1)[0]) @@ -532,10 +551,13 @@ export class PersonalWorkspaceProviderService } public importRESTCollections( - workspaceHandle: HandleRef, + workspaceHandle: Handle, collections: HoppCollection[] ): Promise>> { - if (!isValidWorkspaceHandle(workspaceHandle, this.providerID, "personal")) { + const workspaceHandleRef = workspaceHandle.get() + if ( + !isValidWorkspaceHandle(workspaceHandleRef, this.providerID, "personal") + ) { return Promise.resolve(E.left("INVALID_WORKSPACE_HANDLE" as const)) } @@ -547,11 +569,11 @@ export class PersonalWorkspaceProviderService return Promise.resolve( E.right({ - get: () => + get: lazy(() => computed(() => { if ( !isValidWorkspaceHandle( - workspaceHandle, + workspaceHandleRef, this.providerID, "personal" ) @@ -566,21 +588,26 @@ export class PersonalWorkspaceProviderService type: "ok", data: { providerID: this.providerID, - workspaceID: workspaceHandle.value.data.workspaceID, + workspaceID: workspaceHandleRef.value.data.workspaceID, collectionID: newCollectionID, name: newCollectionName, }, } - }), + }) + ), }) ) } public exportRESTCollections( - workspaceHandle: HandleRef, + workspaceHandle: Handle, collections: HoppCollection[] ): Promise> { - if (!isValidWorkspaceHandle(workspaceHandle, this.providerID, "personal")) { + const workspaceHandleRef = workspaceHandle.get() + + if ( + !isValidWorkspaceHandle(workspaceHandleRef, this.providerID, "personal") + ) { return Promise.resolve(E.left("INVALID_COLLECTION_HANDLE" as const)) } @@ -590,11 +617,13 @@ export class PersonalWorkspaceProviderService } public exportRESTCollection( - collectionHandle: HandleRef, + collectionHandle: Handle, collection: HoppCollection ): Promise> { + const collectionHandleRef = collectionHandle.get() + if ( - !isValidCollectionHandle(collectionHandle, this.providerID, "personal") + !isValidCollectionHandle(collectionHandleRef, this.providerID, "personal") ) { return Promise.resolve(E.left("INVALID_COLLECTION_HANDLE" as const)) } @@ -605,16 +634,18 @@ export class PersonalWorkspaceProviderService } public reorderRESTCollection( - collectionHandle: HandleRef, + collectionHandle: Handle, destinationCollectionID: string | null ): Promise> { + const collectionHandleRef = collectionHandle.get() + if ( - !isValidCollectionHandle(collectionHandle, this.providerID, "personal") + !isValidCollectionHandle(collectionHandleRef, this.providerID, "personal") ) { return Promise.resolve(E.left("INVALID_COLLECTION_HANDLE" as const)) } - const draggedCollectionIndex = collectionHandle.value.data.collectionID + const draggedCollectionIndex = collectionHandleRef.value.data.collectionID updateRESTCollectionOrder(draggedCollectionIndex, destinationCollectionID) @@ -622,17 +653,19 @@ export class PersonalWorkspaceProviderService } public moveRESTCollection( - collectionHandle: HandleRef, + collectionHandle: Handle, destinationCollectionID: string | null ): Promise> { + const collectionHandleRef = collectionHandle.get() + if ( - !isValidCollectionHandle(collectionHandle, this.providerID, "personal") + !isValidCollectionHandle(collectionHandleRef, this.providerID, "personal") ) { return Promise.resolve(E.left("INVALID_COLLECTION_HANDLE" as const)) } moveRESTFolder( - collectionHandle.value.data.collectionID, + collectionHandleRef.value.data.collectionID, destinationCollectionID ) @@ -640,15 +673,17 @@ export class PersonalWorkspaceProviderService } public reorderRESTRequest( - requestHandle: HandleRef, + requestHandle: Handle, destinationCollectionID: string, destinationRequestID: string | null ): Promise> { - if (!isValidRequestHandle(requestHandle, this.providerID, "personal")) { + const requestHandleRef = requestHandle.get() + + if (!isValidRequestHandle(requestHandleRef, this.providerID, "personal")) { return Promise.resolve(E.left("INVALID_REQUEST_HANDLE" as const)) } - const draggedRequestIndex = requestHandle.value.data.requestID + const draggedRequestIndex = requestHandleRef.value.data.requestID updateRESTRequestOrder( this.pathToLastIndex(draggedRequestIndex), @@ -660,14 +695,16 @@ export class PersonalWorkspaceProviderService } public moveRESTRequest( - requestHandle: HandleRef, + requestHandle: Handle, destinationCollectionID: string ): Promise> { - if (!isValidRequestHandle(requestHandle, this.providerID, "personal")) { + const requestHandleRef = requestHandle.get() + + if (!isValidRequestHandle(requestHandleRef, this.providerID, "personal")) { return Promise.resolve(E.left("INVALID_REQUEST_HANDLE" as const)) } - const { requestID: draggedRequestID } = requestHandle.value.data + const { requestID: draggedRequestID } = requestHandleRef.value.data const sourceCollectionID = draggedRequestID .split("/") .slice(0, -1) @@ -762,21 +799,21 @@ export class PersonalWorkspaceProviderService 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}`, - } + handle.value.data.requestID = `${sourceCollectionID}/${reqIndexPos - 1}` }) return Promise.resolve(E.right(undefined)) } public getCollectionHandle( - workspaceHandle: HandleRef, + workspaceHandle: Handle, collectionID: string ): Promise>> { - if (!isValidWorkspaceHandle(workspaceHandle, this.providerID, "personal")) { + const workspaceHandleRef = workspaceHandle.get() + + if ( + !isValidWorkspaceHandle(workspaceHandleRef, this.providerID, "personal") + ) { return Promise.resolve(E.left("INVALID_WORKSPACE_HANDLE" as const)) } @@ -793,15 +830,15 @@ export class PersonalWorkspaceProviderService return Promise.resolve(E.left("COLLECTION_NOT_FOUND")) } - const { providerID, workspaceID } = workspaceHandle.value.data + const { providerID, workspaceID } = workspaceHandleRef.value.data return Promise.resolve( E.right({ - get: () => + get: lazy(() => computed(() => { if ( !isValidWorkspaceHandle( - workspaceHandle, + workspaceHandleRef, this.providerID, "personal" ) @@ -821,16 +858,21 @@ export class PersonalWorkspaceProviderService name: collection.name, }, } - }), + }) + ), }) ) } public getRequestHandle( - workspaceHandle: HandleRef, + workspaceHandle: Handle, requestID: string ): Promise>> { - if (!isValidWorkspaceHandle(workspaceHandle, this.providerID, "personal")) { + const workspaceHandleRef = workspaceHandle.get() + + if ( + !isValidWorkspaceHandle(workspaceHandleRef, this.providerID, "personal") + ) { return Promise.resolve(E.left("INVALID_COLLECTION_HANDLE" as const)) } @@ -838,7 +880,7 @@ export class PersonalWorkspaceProviderService return Promise.resolve(E.left("INVALID_REQUEST_ID" as const)) } - const { providerID, workspaceID } = workspaceHandle.value.data + const { providerID, workspaceID } = workspaceHandleRef.value.data const collectionID = requestID.split("/").slice(0, -1).join("/") const requestIndexPath = requestID.split("/").slice(-1)[0] @@ -877,7 +919,7 @@ export class PersonalWorkspaceProviderService const handle: HandleRef = computed(() => { if ( - !isValidWorkspaceHandle(workspaceHandle, this.providerID, "personal") + !isValidWorkspaceHandle(workspaceHandleRef, this.providerID, "personal") ) { return { type: "invalid" as const, @@ -924,19 +966,21 @@ export class PersonalWorkspaceProviderService this.issuedHandles.push(writableHandle) } - return Promise.resolve(E.right({ get: () => handle })) + return Promise.resolve(E.right({ get: lazy(() => handle) })) } public getRESTCollectionChildrenView( - collectionHandle: HandleRef + collectionHandle: Handle ): Promise>> { + const collectionHandleRef = collectionHandle.get() + return Promise.resolve( E.right({ get: () => computed(() => { if ( !isValidCollectionHandle( - collectionHandle, + collectionHandleRef, this.providerID, "personal" ) @@ -947,14 +991,14 @@ export class PersonalWorkspaceProviderService } } - const collectionID = collectionHandle.value.data.collectionID + const collectionID = collectionHandleRef.value.data.collectionID return markRaw({ type: "ok" as const, data: { providerID: this.providerID, - workspaceID: collectionHandle.value.data.workspaceID, - collectionID: collectionHandle.value.data.collectionID, + workspaceID: collectionHandleRef.value.data.workspaceID, + collectionID: collectionHandleRef.value.data.collectionID, loading: ref(false), @@ -1012,15 +1056,17 @@ export class PersonalWorkspaceProviderService } public getRESTRootCollectionView( - workspaceHandle: HandleRef + workspaceHandle: Handle ): Promise>> { + const workspaceHandleRef = workspaceHandle.get() + return Promise.resolve( E.right({ - get: () => + get: lazy(() => computed(() => { if ( !isValidWorkspaceHandle( - workspaceHandle, + workspaceHandleRef, this.providerID, "personal" ) @@ -1035,7 +1081,7 @@ export class PersonalWorkspaceProviderService type: "ok" as const, data: { providerID: this.providerID, - workspaceID: workspaceHandle.value.data.workspaceID, + workspaceID: workspaceHandleRef.value.data.workspaceID, loading: ref(false), @@ -1055,21 +1101,24 @@ export class PersonalWorkspaceProviderService }), }, }) - }), + }) + ), }) ) } public getRESTCollectionLevelAuthHeadersView( - collectionHandle: HandleRef + collectionHandle: Handle ): Promise>> { + const collectionHandleRef = collectionHandle.get() + return Promise.resolve( E.right({ - get: () => + get: lazy(() => computed(() => { if ( !isValidCollectionHandle( - collectionHandle, + collectionHandleRef, this.providerID, "personal" ) @@ -1080,7 +1129,7 @@ export class PersonalWorkspaceProviderService } } - const { collectionID } = collectionHandle.value.data + const { collectionID } = collectionHandleRef.value.data let auth: HoppInheritedProperty["auth"] = { parentID: collectionID ?? "", @@ -1167,13 +1216,14 @@ export class PersonalWorkspaceProviderService } return { type: "ok", data: { auth, headers } } - }), + }) + ), }) ) } public getRESTSearchResultsView( - workspaceHandle: HandleRef, + workspaceHandle: Handle, searchQuery: Ref ): Promise>> { const results = ref([]) @@ -1262,13 +1312,15 @@ export class PersonalWorkspaceProviderService scopeHandle.stop() } + const workspaceHandleRef = workspaceHandle.get() + return Promise.resolve( E.right({ - get: () => + get: lazy(() => computed(() => { if ( !isValidWorkspaceHandle( - workspaceHandle, + workspaceHandleRef, this.providerID, "personal" ) @@ -1283,7 +1335,7 @@ export class PersonalWorkspaceProviderService type: "ok" as const, data: { providerID: this.providerID, - workspaceID: workspaceHandle.value.data.workspaceID, + workspaceID: workspaceHandleRef.value.data.workspaceID, loading: ref(false), @@ -1291,21 +1343,24 @@ export class PersonalWorkspaceProviderService onSessionEnd, }, }) - }), + }) + ), }) ) } public getRESTCollectionJSONView( - workspaceHandle: HandleRef + workspaceHandle: Handle ): Promise>> { + const workspaceHandleRef = workspaceHandle.get() + return Promise.resolve( E.right({ - get: () => + get: lazy(() => computed(() => { if ( !isValidWorkspaceHandle( - workspaceHandle, + workspaceHandleRef, this.providerID, "personal" ) @@ -1320,7 +1375,7 @@ export class PersonalWorkspaceProviderService type: "ok" as const, data: { providerID: this.providerID, - workspaceID: workspaceHandle.value.data.workspaceID, + workspaceID: workspaceHandleRef.value.data.workspaceID, content: JSON.stringify( this.restCollectionState.value.state, null, @@ -1328,7 +1383,8 @@ export class PersonalWorkspaceProviderService ), }, }) - }), + }) + ), }) ) } @@ -1345,7 +1401,7 @@ export class PersonalWorkspaceProviderService public getPersonalWorkspaceHandle(): Handle { return { - get: () => + get: lazy(() => shallowRef({ type: "ok" as const, data: { @@ -1354,7 +1410,8 @@ export class PersonalWorkspaceProviderService name: "Personal Workspace", }, - }), + }) + ), } } } diff --git a/packages/hoppscotch-common/src/services/tab/rest.ts b/packages/hoppscotch-common/src/services/tab/rest.ts index 6adf29dcf..0a60c58ba 100644 --- a/packages/hoppscotch-common/src/services/tab/rest.ts +++ b/packages/hoppscotch-common/src/services/tab/rest.ts @@ -3,8 +3,6 @@ import { isEqual } from "lodash-es" import { computed } from "vue" import { getDefaultRESTRequest } from "~/helpers/rest/default" import { HoppRESTDocument, HoppRESTSaveContext } from "~/helpers/rest/document" -import { HandleRef } from "../new-workspace/handle" -import { WorkspaceRequest } from "../new-workspace/workspace" import { TabService } from "./tab" export class RESTTabService extends TabService { @@ -61,28 +59,29 @@ export class RESTTabService extends TabService { ctx?.originLocation === "workspace-user-collection" && tab.document.saveContext?.originLocation === "workspace-user-collection" ) { - const requestHandle = tab.document.saveContext.requestHandle as - | HandleRef["value"] - | undefined + const requestHandle = tab.document.saveContext.requestHandle if (!ctx.requestHandle || !requestHandle) { return null } + const tabRequestHandleRef = requestHandle.get() + const requestHandleRef = ctx.requestHandle.get() + if ( - ctx.requestHandle.value.type === "invalid" || - requestHandle.type === "invalid" + requestHandleRef.value.type === "invalid" || + tabRequestHandleRef.value.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 + requestHandleRef.value.data.providerID === + tabRequestHandleRef.value.data.providerID && + requestHandleRef.value.data.workspaceID === + tabRequestHandleRef.value.data.workspaceID && + requestHandleRef.value.data.requestID === + tabRequestHandleRef.value.data.requestID ) { return this.getTabRef(tab.id) } @@ -104,11 +103,9 @@ export class RESTTabService extends TabService { if ( tab.document.saveContext?.originLocation === "workspace-user-collection" ) { - const requestHandle = tab.document.saveContext.requestHandle as - | HandleRef["value"] - | undefined + const requestHandle = tab.document.saveContext.requestHandle - if (requestHandle?.type === "invalid") { + if (requestHandle?.get().value.type === "invalid") { count++ } } diff --git a/packages/hoppscotch-common/src/services/tab/tab.ts b/packages/hoppscotch-common/src/services/tab/tab.ts index 219b070f1..44c2f52ca 100644 --- a/packages/hoppscotch-common/src/services/tab/tab.ts +++ b/packages/hoppscotch-common/src/services/tab/tab.ts @@ -19,7 +19,7 @@ import { } from "." import { NewWorkspaceService } from "../new-workspace" -import { Handle, HandleRef } from "../new-workspace/handle" +import { Handle } from "../new-workspace/handle" import { WorkspaceRequest } from "../new-workspace/workspace" export abstract class TabService @@ -121,11 +121,7 @@ export abstract class TabService continue } - const workspaceHandle = workspaceHandleResult.right.get() - - if (workspaceHandle.value.type === "invalid") { - continue - } + const workspaceHandle = workspaceHandleResult.right const requestHandleResult = await this.workspaceService.getRequestHandle( @@ -249,15 +245,15 @@ export abstract class TabService } // TODO: Investigate why requestHandle is available unwrapped here - const requestHandle = saveContext.requestHandle as - | HandleRef["value"] - | undefined + const requestHandle = saveContext.requestHandle if (!requestHandle) { return tabDoc } - if (requestHandle.type === "invalid") { + const requestHandleRef = requestHandle.get() + + if (requestHandleRef.value.type === "invalid") { // eslint-disable-next-line @typescript-eslint/no-unused-vars const { requestHandle, ...rest } = saveContext @@ -268,7 +264,7 @@ export abstract class TabService } } - const { providerID, workspaceID, requestID } = requestHandle.data + const { providerID, workspaceID, requestID } = requestHandleRef.value.data // Return the document without the handle return {