Only the IDs (workspace, provider & request IDs) to restore the handle are stored under `localStorage` and the handle is restored back at runtime.
94 lines
2.7 KiB
TypeScript
94 lines
2.7 KiB
TypeScript
import { isEqual } from "lodash-es"
|
|
import { computed } from "vue"
|
|
import { getDefaultRESTRequest } from "~/helpers/rest/default"
|
|
import { HoppRESTDocument, HoppRESTSaveContext } from "~/helpers/rest/document"
|
|
import { TabService } from "./tab"
|
|
<<<<<<< HEAD
|
|
import { Container } from "dioc"
|
|
=======
|
|
import { HandleRef } from "../new-workspace/handle"
|
|
import { WorkspaceRequest } from "../new-workspace/workspace"
|
|
>>>>>>> 854ffa28 (refactor: persist request handles under tab `saveContext`)
|
|
|
|
export class RESTTabService extends TabService<HoppRESTDocument> {
|
|
public static readonly ID = "REST_TAB_SERVICE"
|
|
|
|
// TODO: Moving this to `onServiceInit` breaks `persistableTabState`
|
|
// Figure out how to fix this
|
|
constructor(c: Container) {
|
|
super(c)
|
|
|
|
this.tabMap.set("test", {
|
|
id: "test",
|
|
document: {
|
|
request: getDefaultRESTRequest(),
|
|
isDirty: false,
|
|
optionTabPreference: "params",
|
|
},
|
|
})
|
|
|
|
this.watchCurrentTabID()
|
|
}
|
|
|
|
// override persistableTabState to remove response from the document
|
|
public override persistableTabState = computed(() => ({
|
|
lastActiveTabID: this.currentTabID.value,
|
|
orderedDocs: this.tabOrdering.value.map((tabID) => {
|
|
const tab = this.tabMap.get(tabID)! // tab ordering is guaranteed to have value for this key
|
|
return {
|
|
tabID: tab.id,
|
|
doc: {
|
|
...tab.document,
|
|
response: null,
|
|
},
|
|
}
|
|
}),
|
|
}))
|
|
|
|
public getTabRefWithSaveContext(ctx: HoppRESTSaveContext) {
|
|
for (const tab of this.tabMap.values()) {
|
|
// For `team-collection` request id can be considered unique
|
|
if (ctx?.originLocation === "team-collection") {
|
|
if (
|
|
tab.document.saveContext?.originLocation === "team-collection" &&
|
|
tab.document.saveContext.requestID === ctx.requestID
|
|
) {
|
|
return this.getTabRef(tab.id)
|
|
}
|
|
} else if (ctx?.originLocation === "user-collection") {
|
|
if (isEqual(ctx, tab.document.saveContext)) {
|
|
return this.getTabRef(tab.id)
|
|
}
|
|
} else if (
|
|
ctx?.originLocation === "workspace-user-collection" &&
|
|
tab.document.saveContext?.originLocation === "workspace-user-collection"
|
|
) {
|
|
if (
|
|
isEqual(
|
|
ctx.requestHandle?.value,
|
|
|
|
// TODO: Investigate why requestHandle gets unwrapped
|
|
tab.document.saveContext.requestHandle as
|
|
| HandleRef<WorkspaceRequest>["value"]
|
|
| undefined
|
|
)
|
|
) {
|
|
return this.getTabRef(tab.id)
|
|
}
|
|
}
|
|
}
|
|
|
|
return null
|
|
}
|
|
|
|
public getDirtyTabsCount() {
|
|
let count = 0
|
|
|
|
for (const tab of this.tabMap.values()) {
|
|
if (tab.document.isDirty) count++
|
|
}
|
|
|
|
return count
|
|
}
|
|
}
|