Browse Source

refactor: better tab dirty check

Mark the tab (saved request under a collection) as not dirty if the request contents are reset to the value since previous save.
jamesgeorge007 10 months ago
parent
commit
18d5958d1f

+ 1 - 10
packages/hoppscotch-common/src/components/collections/SaveRequest.vue

@@ -267,16 +267,11 @@ const saveRequestAs = async () => {
       return
     }
 
-    const { providerID, requestID, workspaceID } = requestHandle.value.data
-
     RESTTabs.currentActiveTab.value.document = {
       request: updatedRequest,
       isDirty: false,
       saveContext: {
         originLocation: "workspace-user-collection",
-        workspaceID,
-        providerID,
-        requestID,
         requestHandle,
       },
     }
@@ -313,16 +308,12 @@ const saveRequestAs = async () => {
       return
     }
 
-    const { providerID, requestID, workspaceID } = requestHandle.value.data
-
     RESTTabs.currentActiveTab.value.document = {
       request: updatedRequest,
       isDirty: false,
       saveContext: {
         originLocation: "workspace-user-collection",
-        workspaceID,
-        providerID,
-        requestID,
+        requestHandle,
       },
     }
 

+ 1 - 18
packages/hoppscotch-common/src/components/http/Request.vue

@@ -525,24 +525,7 @@ const saveRequest = async () => {
       return
     }
 
-    const { requestID } = saveContext
-
-    const requestHandleResult = await newWorkspaceService.getRequestHandle(
-      newWorkspaceService.activeWorkspaceHandle.value,
-      requestID
-    )
-
-    if (E.isLeft(requestHandleResult)) {
-      // INVALID_COLLECTION_HANDLE | INVALID_REQUEST_ID | REQUEST_NOT_FOUND
-      showSaveRequestModal.value = true
-
-      if (!tab.value.document.isDirty) {
-        tab.value.document.isDirty = true
-      }
-      return
-    }
-
-    const requestHandle = requestHandleResult.right
+    const requestHandle = ref(saveContext.requestHandle)
 
     if (!requestHandle.value) {
       return

+ 34 - 5
packages/hoppscotch-common/src/components/http/RequestTab.vue

@@ -17,10 +17,11 @@
 <script setup lang="ts">
 import { watch } from "vue"
 import { useVModel } from "@vueuse/core"
-import { cloneDeep } from "lodash-es"
-import { isEqualHoppRESTRequest } from "@hoppscotch/data"
+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
 
@@ -32,15 +33,43 @@ const emit = defineEmits<{
 
 const tab = useVModel(props, "modelValue", emit)
 
-// TODO: Come up with a better dirty check
 let oldRequest = cloneDeep(tab.value.document.request)
+
 watch(
   () => tab.value.document.request,
   (updatedValue) => {
+    // Request from the collection tree
     if (
-      !tab.value.document.isDirty &&
-      !isEqualHoppRESTRequest(oldRequest, updatedValue)
+      tab.value.document.saveContext?.originLocation ===
+      "workspace-user-collection"
     ) {
+      const requestHandle = tab.value.document.saveContext.requestHandle as
+        | HandleRef<WorkspaceRequest>["value"]
+        | undefined
+
+      if (!requestHandle || requestHandle.type === "invalid") {
+        return
+      }
+
+      if (
+        !tab.value.document.isDirty &&
+        !isEqual(oldRequest, requestHandle?.data.request)
+      ) {
+        tab.value.document.isDirty = true
+      }
+
+      if (
+        tab.value.document.isDirty &&
+        isEqual(oldRequest, requestHandle?.data.request)
+      ) {
+        tab.value.document.isDirty = false
+      }
+
+      return
+    }
+
+    // Unsaved request
+    if (!tab.value.document.isDirty && !isEqual(oldRequest, updatedValue)) {
       tab.value.document.isDirty = true
     }
 

+ 1 - 1
packages/hoppscotch-common/src/services/tab/rest.ts

@@ -88,7 +88,7 @@ export class RESTTabService extends TabService<HoppRESTDocument> {
     for (const tab of this.tabMap.values()) {
       if (tab.document.isDirty) {
         count++
-        return
+        continue
       }
 
       if (