89 lines
2.3 KiB
TypeScript
89 lines
2.3 KiB
TypeScript
import { SettingsPlatformDef } from "@hoppscotch/common/platform/settings"
|
|
import { settingsSyncer } from "./settings.sync"
|
|
import { authEvents$, def as platformAuth } from "@platform/auth"
|
|
import {
|
|
createUserSettings,
|
|
getUserSettings,
|
|
runUserSettingsUpdatedSubscription,
|
|
} from "./settings.api"
|
|
import * as E from "fp-ts/Either"
|
|
import { runGQLSubscription } from "@hoppscotch/common/helpers/backend/GQLClient"
|
|
import {
|
|
bulkApplySettings,
|
|
defaultSettings,
|
|
} from "@hoppscotch/common/newstore/settings"
|
|
import { runDispatchWithOutSyncing } from "@lib/sync"
|
|
|
|
function initSettingsSync() {
|
|
const currentUser$ = platformAuth.getCurrentUserStream()
|
|
settingsSyncer.startStoreSync()
|
|
settingsSyncer.setupSubscriptions(setupSubscriptions)
|
|
|
|
// load the settings
|
|
|
|
loadUserSettings()
|
|
|
|
currentUser$.subscribe(async (user) => {
|
|
if (user) {
|
|
// load the settings
|
|
loadUserSettings()
|
|
}
|
|
})
|
|
|
|
authEvents$.subscribe((event) => {
|
|
if (event.event == "login" || event.event == "token_refresh") {
|
|
settingsSyncer.startListeningToSubscriptions()
|
|
}
|
|
|
|
if (event.event == "logout") {
|
|
settingsSyncer.stopListeningToSubscriptions()
|
|
}
|
|
})
|
|
}
|
|
|
|
async function loadUserSettings() {
|
|
const res = await getUserSettings()
|
|
|
|
// create user settings if it doesn't exist
|
|
E.isLeft(res) &&
|
|
res.left.error == "user_settings/not_found" &&
|
|
(await createUserSettings(JSON.stringify(defaultSettings)))
|
|
|
|
if (E.isRight(res)) {
|
|
runDispatchWithOutSyncing(() => {
|
|
bulkApplySettings(JSON.parse(res.right.me.settings.properties))
|
|
})
|
|
}
|
|
}
|
|
|
|
function setupSubscriptions() {
|
|
let subs: ReturnType<typeof runGQLSubscription>[1][] = []
|
|
|
|
const userSettingsUpdatedSub = setupUserSettingsUpdatedSubscription()
|
|
|
|
subs = [userSettingsUpdatedSub]
|
|
|
|
return () => {
|
|
subs.forEach((sub) => sub.unsubscribe())
|
|
}
|
|
}
|
|
|
|
function setupUserSettingsUpdatedSubscription() {
|
|
const [userSettingsUpdated$, userSettingsUpdatedSub] =
|
|
runUserSettingsUpdatedSubscription()
|
|
|
|
userSettingsUpdated$.subscribe((res) => {
|
|
if (E.isRight(res)) {
|
|
runDispatchWithOutSyncing(() => {
|
|
bulkApplySettings(JSON.parse(res.right.userSettingsUpdated.properties))
|
|
})
|
|
}
|
|
})
|
|
|
|
return userSettingsUpdatedSub
|
|
}
|
|
|
|
export const def: SettingsPlatformDef = {
|
|
initSettingsSync,
|
|
}
|