Compare commits
2 Commits
2023.4.4
...
fix/sync-p
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bda9ce6dd8 | ||
|
|
2ea7f56c23 |
40
packages/hoppscotch-common/src/newstore/syncing.ts
Normal file
40
packages/hoppscotch-common/src/newstore/syncing.ts
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import { distinctUntilChanged, pluck } from "rxjs"
|
||||||
|
import DispatchingStore, { defineDispatchers } from "./DispatchingStore"
|
||||||
|
|
||||||
|
type SyncState = {
|
||||||
|
isInitialSync: boolean
|
||||||
|
shouldSync: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
type CurrentSyncingState = {
|
||||||
|
currentSyncingItem: SyncState
|
||||||
|
}
|
||||||
|
|
||||||
|
const initialState: CurrentSyncingState = {
|
||||||
|
currentSyncingItem: {
|
||||||
|
isInitialSync: false,
|
||||||
|
shouldSync: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const dispatchers = defineDispatchers({
|
||||||
|
changeCurrentSyncStatus(_, { syncItem }: { syncItem: SyncState }) {
|
||||||
|
return {
|
||||||
|
currentSyncingItem: syncItem,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
export const currentSyncStore = new DispatchingStore(initialState, dispatchers)
|
||||||
|
|
||||||
|
export const currentSyncingStatus$ = currentSyncStore.subject$.pipe(
|
||||||
|
pluck("currentSyncingItem"),
|
||||||
|
distinctUntilChanged()
|
||||||
|
)
|
||||||
|
|
||||||
|
export function changeCurrentSyncStatus(syncItem: SyncState) {
|
||||||
|
currentSyncStore.dispatch({
|
||||||
|
dispatcher: "changeCurrentSyncStatus",
|
||||||
|
payload: { syncItem },
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -87,7 +87,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { ref, onMounted, onBeforeUnmount, watch, onBeforeMount } from "vue"
|
import { ref, onMounted, onBeforeUnmount, onBeforeMount } from "vue"
|
||||||
import { safelyExtractRESTRequest } from "@hoppscotch/data"
|
import { safelyExtractRESTRequest } from "@hoppscotch/data"
|
||||||
import { translateExtURLParams } from "~/helpers/RESTExtURLParams"
|
import { translateExtURLParams } from "~/helpers/RESTExtURLParams"
|
||||||
import { useRoute } from "vue-router"
|
import { useRoute } from "vue-router"
|
||||||
@@ -123,6 +123,11 @@ import { useToast } from "~/composables/toast"
|
|||||||
import { PersistableRESTTabState } from "~/helpers/rest/tab"
|
import { PersistableRESTTabState } from "~/helpers/rest/tab"
|
||||||
import { watchDebounced } from "@vueuse/core"
|
import { watchDebounced } from "@vueuse/core"
|
||||||
import { oauthRedirect } from "~/helpers/oauth"
|
import { oauthRedirect } from "~/helpers/oauth"
|
||||||
|
import { useReadonlyStream } from "~/composables/stream"
|
||||||
|
import {
|
||||||
|
changeCurrentSyncStatus,
|
||||||
|
currentSyncingStatus$,
|
||||||
|
} from "~/newstore/syncing"
|
||||||
|
|
||||||
const savingRequest = ref(false)
|
const savingRequest = ref(false)
|
||||||
const confirmingCloseForTabID = ref<string | null>(null)
|
const confirmingCloseForTabID = ref<string | null>(null)
|
||||||
@@ -134,7 +139,10 @@ const toast = useToast()
|
|||||||
|
|
||||||
const tabs = getActiveTabs()
|
const tabs = getActiveTabs()
|
||||||
|
|
||||||
const confirmSync = ref(false)
|
const confirmSync = useReadonlyStream(currentSyncingStatus$, {
|
||||||
|
isInitialSync: false,
|
||||||
|
shouldSync: true,
|
||||||
|
})
|
||||||
const tabStateForSync = ref<PersistableRESTTabState | null>(null)
|
const tabStateForSync = ref<PersistableRESTTabState | null>(null)
|
||||||
|
|
||||||
function bindRequestToURLParams() {
|
function bindRequestToURLParams() {
|
||||||
@@ -229,29 +237,6 @@ const onSaveModalClose = () => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
watch(confirmSync, (newValue) => {
|
|
||||||
if (newValue) {
|
|
||||||
toast.show(t("confirm.sync"), {
|
|
||||||
duration: 0,
|
|
||||||
action: [
|
|
||||||
{
|
|
||||||
text: `${t("action.yes")}`,
|
|
||||||
onClick: (_, toastObject) => {
|
|
||||||
syncTabState()
|
|
||||||
toastObject.goAway(0)
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
text: `${t("action.no")}`,
|
|
||||||
onClick: (_, toastObject) => {
|
|
||||||
toastObject.goAway(0)
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
})
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
const syncTabState = () => {
|
const syncTabState = () => {
|
||||||
if (tabStateForSync.value) loadTabsFromPersistedState(tabStateForSync.value)
|
if (tabStateForSync.value) loadTabsFromPersistedState(tabStateForSync.value)
|
||||||
}
|
}
|
||||||
@@ -290,6 +275,35 @@ function startTabStateSync(): Subscription {
|
|||||||
return sub
|
return sub
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const showSyncToast = () => {
|
||||||
|
toast.show(t("confirm.sync"), {
|
||||||
|
duration: 0,
|
||||||
|
action: [
|
||||||
|
{
|
||||||
|
text: `${t("action.yes")}`,
|
||||||
|
onClick: (_, toastObject) => {
|
||||||
|
syncTabState()
|
||||||
|
changeCurrentSyncStatus({
|
||||||
|
isInitialSync: true,
|
||||||
|
shouldSync: true,
|
||||||
|
})
|
||||||
|
toastObject.goAway(0)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: `${t("action.no")}`,
|
||||||
|
onClick: (_, toastObject) => {
|
||||||
|
changeCurrentSyncStatus({
|
||||||
|
isInitialSync: true,
|
||||||
|
shouldSync: false,
|
||||||
|
})
|
||||||
|
toastObject.goAway(0)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
function setupTabStateSync() {
|
function setupTabStateSync() {
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
|
||||||
@@ -305,9 +319,15 @@ function setupTabStateSync() {
|
|||||||
const tabStateFromSync =
|
const tabStateFromSync =
|
||||||
await platform.sync.tabState.loadTabStateFromSync()
|
await platform.sync.tabState.loadTabStateFromSync()
|
||||||
|
|
||||||
if (tabStateFromSync) {
|
if (tabStateFromSync && !confirmSync.value.isInitialSync) {
|
||||||
tabStateForSync.value = tabStateFromSync
|
tabStateForSync.value = tabStateFromSync
|
||||||
confirmSync.value = true
|
showSyncToast()
|
||||||
|
// Have to set isInitialSync to true here because the toast is shown
|
||||||
|
// and the user does not click on any of the actions
|
||||||
|
changeCurrentSyncStatus({
|
||||||
|
isInitialSync: true,
|
||||||
|
shouldSync: false,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user