From f95ed19a7df0696c53fd32bb2cdfa55aec7578a7 Mon Sep 17 00:00:00 2001 From: Sebastian Malton Date: Tue, 6 Dec 2022 17:14:30 -0500 Subject: [PATCH] Fix test flakiness by removing side effects from userStore preferences Signed-off-by: Sebastian Malton --- src/common/fs/{stat => }/stat.injectable.ts | 2 +- .../stat.global-override-for-injectable.ts | 10 - .../fs/validate-directory.injectable.ts | 2 +- ...timezone.global-override-for-injectable.ts | 9 + .../user-store/current-timezone.injectable.ts | 14 + .../preference-descriptors.injectable.ts | 141 +++++++++ src/common/user-store/preferences-helpers.ts | 269 +----------------- .../user-store/user-store.injectable.ts | 2 + src/common/user-store/user-store.ts | 45 +-- ...ive-repository-in-preferences.test.ts.snap | 38 ++- .../application/timezone/timezone.tsx | 25 +- .../discover-all-sync-kinds.injectable.ts | 20 ++ .../discover-sync-kind.injectable.ts | 46 +++ .../kubeconfig-sync/kubeconfig-sync.tsx | 85 ++---- .../__test__/kubeconfig-sync.test.ts | 4 +- .../watch-file-changes.injectable.ts | 2 +- .../helm/helm-chart-manager.injectable.ts | 2 +- src/main/helm/helm-chart-manager.ts | 2 +- .../local-shell-session/open.injectable.ts | 2 +- .../node-shell-session/open.injectable.ts | 2 +- src/main/shell-session/shell-session.ts | 2 +- .../cluster-local-terminal-settings.test.tsx | 2 +- .../test-utils/get-application-builder.tsx | 12 + .../add-sync-entries.injectable.tsx | 16 +- 24 files changed, 369 insertions(+), 385 deletions(-) rename src/common/fs/{stat => }/stat.injectable.ts (90%) delete mode 100644 src/common/fs/stat/stat.global-override-for-injectable.ts create mode 100644 src/common/user-store/current-timezone.global-override-for-injectable.ts create mode 100644 src/common/user-store/current-timezone.injectable.ts create mode 100644 src/common/user-store/preference-descriptors.injectable.ts create mode 100644 src/features/preferences/renderer/preference-items/kubernetes/kubeconfig-sync/discover-all-sync-kinds.injectable.ts create mode 100644 src/features/preferences/renderer/preference-items/kubernetes/kubeconfig-sync/discover-sync-kind.injectable.ts diff --git a/src/common/fs/stat/stat.injectable.ts b/src/common/fs/stat.injectable.ts similarity index 90% rename from src/common/fs/stat/stat.injectable.ts rename to src/common/fs/stat.injectable.ts index e9924fc088..07f2b298b1 100644 --- a/src/common/fs/stat/stat.injectable.ts +++ b/src/common/fs/stat.injectable.ts @@ -4,7 +4,7 @@ */ import { getInjectable } from "@ogre-tools/injectable"; import type { Stats } from "fs"; -import fsInjectable from "../fs.injectable"; +import fsInjectable from "./fs.injectable"; export type Stat = (path: string) => Promise; diff --git a/src/common/fs/stat/stat.global-override-for-injectable.ts b/src/common/fs/stat/stat.global-override-for-injectable.ts deleted file mode 100644 index 2afeda7b77..0000000000 --- a/src/common/fs/stat/stat.global-override-for-injectable.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ -import statInjectable from "./stat.injectable"; -import { getGlobalOverride } from "../../test-utils/get-global-override"; - -export default getGlobalOverride(statInjectable, () => () => { - throw new Error("Tried to call stat without explicit override"); -}); diff --git a/src/common/fs/validate-directory.injectable.ts b/src/common/fs/validate-directory.injectable.ts index 9d68ede8d5..efce915238 100644 --- a/src/common/fs/validate-directory.injectable.ts +++ b/src/common/fs/validate-directory.injectable.ts @@ -7,7 +7,7 @@ import type { AsyncResult } from "../utils/async-result"; import { isErrnoException } from "../utils"; import type { Stats } from "fs-extra"; import { lowerFirst } from "lodash/fp"; -import statInjectable from "./stat/stat.injectable"; +import statInjectable from "./stat.injectable"; export type ValidateDirectory = (path: string) => Promise>; diff --git a/src/common/user-store/current-timezone.global-override-for-injectable.ts b/src/common/user-store/current-timezone.global-override-for-injectable.ts new file mode 100644 index 0000000000..6056074d3c --- /dev/null +++ b/src/common/user-store/current-timezone.global-override-for-injectable.ts @@ -0,0 +1,9 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import { getGlobalOverride } from "../test-utils/get-global-override"; +import currentTimezoneInjectable from "./current-timezone.injectable"; + +export default getGlobalOverride(currentTimezoneInjectable, () => "Etc/GMT"); diff --git a/src/common/user-store/current-timezone.injectable.ts b/src/common/user-store/current-timezone.injectable.ts new file mode 100644 index 0000000000..9614e09635 --- /dev/null +++ b/src/common/user-store/current-timezone.injectable.ts @@ -0,0 +1,14 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import moment from "moment"; + +const currentTimezoneInjectable = getInjectable({ + id: "current-timezone", + instantiate: () => moment.tz.guess(true), + causesSideEffects: true, +}); + +export default currentTimezoneInjectable; diff --git a/src/common/user-store/preference-descriptors.injectable.ts b/src/common/user-store/preference-descriptors.injectable.ts new file mode 100644 index 0000000000..865728e675 --- /dev/null +++ b/src/common/user-store/preference-descriptors.injectable.ts @@ -0,0 +1,141 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ +import { getInjectable } from "@ogre-tools/injectable"; +import { merge } from "lodash"; +import homeDirectoryPathInjectable from "../os/home-directory-path.injectable"; +import joinPathsInjectable from "../path/join-paths.injectable"; +import { defaultThemeId } from "../vars"; +import currentTimezoneInjectable from "./current-timezone.injectable"; +import type { EditorConfiguration, ExtensionRegistry, KubeconfigSyncEntry, KubeconfigSyncValue, TerminalConfig } from "./preferences-helpers"; +import { defaultExtensionRegistryUrlLocation, defaultEditorConfig, defaultTerminalConfig, defaultPackageMirror, getPreferenceDescriptor, packageMirrors } from "./preferences-helpers"; + +export type PreferenceDescriptors = ReturnType; + +const userStorePreferenceDescriptorsInjectable = getInjectable({ + id: "user-store-preference-descriptors", + instantiate: (di) => { + const currentTimezone = di.inject(currentTimezoneInjectable); + const joinPaths = di.inject(joinPathsInjectable); + const homeDirectoryPath = di.inject(homeDirectoryPathInjectable); + + const mainKubeFolderPath = joinPaths(homeDirectoryPath, ".kube"); + + return ({ + httpsProxy: getPreferenceDescriptor({ + fromStore: val => val, + toStore: val => val || undefined, + }), + shell: getPreferenceDescriptor({ + fromStore: val => val, + toStore: val => val || undefined, + }), + colorTheme: getPreferenceDescriptor({ + fromStore: val => val || defaultThemeId, + toStore: val => !val || val === defaultThemeId + ? undefined + : val, + }), + terminalTheme: getPreferenceDescriptor({ + fromStore: val => val || "", + toStore: val => val || undefined, + }), + localeTimezone: getPreferenceDescriptor({ + fromStore: val => val || currentTimezone, + toStore: val => !val || val === currentTimezone + ? undefined + : val, + }), + allowUntrustedCAs: getPreferenceDescriptor({ + fromStore: val => val ?? false, + toStore: val => !val + ? undefined + : val, + }), + allowErrorReporting: getPreferenceDescriptor({ + fromStore: val => val ?? true, + toStore: val => val + ? undefined + : val, + }), + downloadMirror: getPreferenceDescriptor({ + fromStore: val => !val || !packageMirrors.has(val) + ? defaultPackageMirror + : val, + toStore: val => val === defaultPackageMirror + ? undefined + : val, + }), + downloadKubectlBinaries: getPreferenceDescriptor({ + fromStore: val => val ?? true, + toStore: val => val + ? undefined + : val, + }), + downloadBinariesPath: getPreferenceDescriptor({ + fromStore: val => val, + toStore: val => val || undefined, + }), + kubectlBinariesPath: getPreferenceDescriptor({ + fromStore: val => val, + toStore: val => val || undefined, + }), + openAtLogin: getPreferenceDescriptor({ + fromStore: val => val ?? false, + toStore: val => !val + ? undefined + : val, + }), + terminalCopyOnSelect: getPreferenceDescriptor({ + fromStore: val => val ?? false, + toStore: val => !val + ? undefined + : val, + }), + hiddenTableColumns: getPreferenceDescriptor<[string, string[]][], Map>>({ + fromStore: (val = []) => new Map( + val.map(([tableId, columnIds]) => [tableId, new Set(columnIds)]), + ), + toStore: (val) => { + const res: [string, string[]][] = []; + + for (const [table, columns] of val) { + if (columns.size) { + res.push([table, Array.from(columns)]); + } + } + + return res.length ? res : undefined; + }, + }), + syncKubeconfigEntries: getPreferenceDescriptor>({ + fromStore: val => new Map( + val?.map(({ filePath, ...rest }) => [filePath, rest]) + ?? [[mainKubeFolderPath, {}]], + ), + toStore: val => val.size === 1 && val.has(mainKubeFolderPath) + ? undefined + : Array.from(val, ([filePath, rest]) => ({ filePath, ...rest })), + }), + editorConfiguration: getPreferenceDescriptor, EditorConfiguration>({ + fromStore: val => merge(defaultEditorConfig, val), + toStore: val => val, + }), + terminalConfig: getPreferenceDescriptor, TerminalConfig>({ + fromStore: val => merge(defaultTerminalConfig, val), + toStore: val => val, + }), + extensionRegistryUrl: getPreferenceDescriptor({ + fromStore: val => val ?? { + location: defaultExtensionRegistryUrlLocation, + }, + toStore: val => val.location === defaultExtensionRegistryUrlLocation + ? undefined + : val, + }), + }) as const; + }, +}); + +export default userStorePreferenceDescriptorsInjectable; diff --git a/src/common/user-store/preferences-helpers.ts b/src/common/user-store/preferences-helpers.ts index ed3fb7c249..5bdc2a3852 100644 --- a/src/common/user-store/preferences-helpers.ts +++ b/src/common/user-store/preferences-helpers.ts @@ -3,14 +3,9 @@ * Licensed under MIT License. See LICENSE in root directory for more information. */ -import moment from "moment-timezone"; -import path from "path"; -import os from "os"; import type { editor } from "monaco-editor"; -import merge from "lodash/merge"; -import { defaultThemeId, defaultEditorFontFamily, defaultFontSize, defaultTerminalFontFamily } from "../vars"; -import type { ObservableMap } from "mobx"; -import { observable } from "mobx"; +import { defaultEditorFontFamily, defaultFontSize, defaultTerminalFontFamily } from "../vars"; +import type { PreferenceDescriptors } from "./preference-descriptors.injectable"; export interface KubeconfigSyncEntry extends KubeconfigSyncValue { filePath: string; @@ -54,86 +49,8 @@ export interface PreferenceDescription { toStore(val: R): T | undefined; } -const httpsProxy: PreferenceDescription = { - fromStore(val) { - return val; - }, - toStore(val) { - return val || undefined; - }, -}; +export const getPreferenceDescriptor = (desc: PreferenceDescription) => desc; -const shell: PreferenceDescription = { - fromStore(val) { - return val; - }, - toStore(val) { - return val || undefined; - }, -}; - -const colorTheme: PreferenceDescription = { - fromStore(val) { - return val || defaultThemeId; - }, - toStore(val) { - if (!val || val === defaultThemeId) { - return undefined; - } - - return val; - }, -}; - -const terminalTheme: PreferenceDescription = { - fromStore(val) { - return val || ""; - }, - toStore(val) { - return val || undefined; - }, -}; - -export const defaultLocaleTimezone = "UTC"; - -const localeTimezone: PreferenceDescription = { - fromStore(val) { - return val || moment.tz.guess(true) || defaultLocaleTimezone; - }, - toStore(val) { - if (!val || val === moment.tz.guess(true) || val === defaultLocaleTimezone) { - return undefined; - } - - return val; - }, -}; - -const allowUntrustedCAs: PreferenceDescription = { - fromStore(val) { - return val ?? false; - }, - toStore(val) { - if (!val) { - return undefined; - } - - return val; - }, -}; - -const allowErrorReporting: PreferenceDescription = { - fromStore(val) { - return val ?? true; - }, - toStore(val) { - if (val === true) { - return undefined; - } - - return val; - }, -}; export interface DownloadMirror { url: string; @@ -157,142 +74,6 @@ export const packageMirrors = new Map([ }], ]); -const downloadMirror: PreferenceDescription = { - fromStore(val) { - return !val || !packageMirrors.has(val) - ? defaultPackageMirror - : val; - }, - toStore(val) { - if (!val || val === defaultPackageMirror) { - return undefined; - } - - return val; - }, -}; - -const downloadKubectlBinaries: PreferenceDescription = { - fromStore(val) { - return val ?? true; - }, - toStore(val) { - if (val === true) { - return undefined; - } - - return val; - }, -}; - -const downloadBinariesPath: PreferenceDescription = { - fromStore(val) { - return val; - }, - toStore(val) { - if (!val) { - return undefined; - } - - return val; - }, -}; - -const kubectlBinariesPath: PreferenceDescription = { - fromStore(val) { - return val; - }, - toStore(val) { - if (!val) { - return undefined; - } - - return val; - }, -}; - -const openAtLogin: PreferenceDescription = { - fromStore(val) { - return val ?? false; - }, - toStore(val) { - if (!val) { - return undefined; - } - - return val; - }, -}; - -const terminalCopyOnSelect: PreferenceDescription = { - fromStore(val) { - return val ?? false; - }, - toStore(val) { - if (!val) { - return undefined; - } - - return val; - }, -}; - -const hiddenTableColumns: PreferenceDescription<[string, string[]][], Map>> = { - fromStore(val) { - return new Map( - (val ?? []).map(([tableId, columnIds]) => [tableId, new Set(columnIds)]), - ); - }, - toStore(val) { - const res: [string, string[]][] = []; - - for (const [table, columns] of val) { - if (columns.size) { - res.push([table, Array.from(columns)]); - } - } - - return res.length ? res : undefined; - }, -}; - -const mainKubeFolder = path.join(os.homedir(), ".kube"); - -const syncKubeconfigEntries: PreferenceDescription> = { - fromStore(val) { - return observable.map( - val - ?.map(({ filePath, ...rest }) => [filePath, rest]) - ?? [[mainKubeFolder, {}]], - ); - }, - toStore(val) { - if (val.size === 1 && val.has(mainKubeFolder)) { - return undefined; - } - - return Array.from(val, ([filePath, rest]) => ({ filePath, ...rest })); - }, -}; - -const editorConfiguration: PreferenceDescription | undefined, EditorConfiguration> = { - fromStore(val) { - return merge(defaultEditorConfig, val); - }, - toStore(val) { - return val; - }, -}; - -const terminalConfig: PreferenceDescription = { - fromStore(val) { - return merge(defaultTerminalConfig, val); - }, - toStore(val) { - return val; - }, -}; - export type ExtensionRegistryLocation = "default" | "npmrc" | "custom"; export type ExtensionRegistry = { @@ -306,49 +87,13 @@ export type ExtensionRegistry = { export const defaultExtensionRegistryUrlLocation = "default"; export const defaultExtensionRegistryUrl = "https://registry.npmjs.org"; -const extensionRegistryUrl: PreferenceDescription = { - fromStore(val) { - return val ?? { - location: defaultExtensionRegistryUrlLocation, - }; - }, - toStore(val) { - if (val.location === defaultExtensionRegistryUrlLocation) { - return undefined; - } - - return val; - }, -}; - -type PreferencesModelType = typeof DESCRIPTORS[field] extends PreferenceDescription ? T : never; -type UserStoreModelType = typeof DESCRIPTORS[field] extends PreferenceDescription ? T : never; +type PreferencesModelType = PreferenceDescriptors[field] extends PreferenceDescription ? T : never; +type UserStoreModelType = PreferenceDescriptors[field] extends PreferenceDescription ? T : never; export type UserStoreFlatModel = { - [field in keyof typeof DESCRIPTORS]: UserStoreModelType; + [field in keyof PreferenceDescriptors]: UserStoreModelType; }; export type UserPreferencesModel = { - [field in keyof typeof DESCRIPTORS]: PreferencesModelType; + [field in keyof PreferenceDescriptors]: PreferencesModelType; } & { updateChannel: string }; - -export const DESCRIPTORS = { - httpsProxy, - shell, - colorTheme, - terminalTheme, - localeTimezone, - allowUntrustedCAs, - allowErrorReporting, - downloadMirror, - downloadKubectlBinaries, - downloadBinariesPath, - kubectlBinariesPath, - openAtLogin, - hiddenTableColumns, - syncKubeconfigEntries, - editorConfiguration, - terminalCopyOnSelect, - terminalConfig, - extensionRegistryUrl, -}; diff --git a/src/common/user-store/user-store.injectable.ts b/src/common/user-store/user-store.injectable.ts index 0e4735931d..49a264f0e4 100644 --- a/src/common/user-store/user-store.injectable.ts +++ b/src/common/user-store/user-store.injectable.ts @@ -17,6 +17,7 @@ import { shouldBaseStoreDisableSyncInIpcListenerInjectionToken } from "../base-s import { persistStateToConfigInjectionToken } from "../base-store/save-to-file"; import getBasenameOfPathInjectable from "../path/get-basename.injectable"; import { enlistMessageChannelListenerInjectionToken } from "../utils/channel/enlist-message-channel-listener-injection-token"; +import userStorePreferenceDescriptorsInjectable from "./preference-descriptors.injectable"; const userStoreInjectable = getInjectable({ id: "user-store", @@ -34,6 +35,7 @@ const userStoreInjectable = getInjectable({ persistStateToConfig: di.inject(persistStateToConfigInjectionToken), enlistMessageChannelListener: di.inject(enlistMessageChannelListenerInjectionToken), shouldDisableSyncInListener: di.inject(shouldBaseStoreDisableSyncInIpcListenerInjectionToken), + preferenceDescriptors: di.inject(userStorePreferenceDescriptorsInjectable), }), }); diff --git a/src/common/user-store/user-store.ts b/src/common/user-store/user-store.ts index 49a03ce6a6..8979ba3351 100644 --- a/src/common/user-store/user-store.ts +++ b/src/common/user-store/user-store.ts @@ -7,13 +7,13 @@ import { action, observable, makeObservable, isObservableArray, isObservableSet, import type { BaseStoreDependencies } from "../base-store/base-store"; import { BaseStore } from "../base-store/base-store"; import { getOrInsertSet, toggle, toJS, object } from "../../renderer/utils"; -import { DESCRIPTORS } from "./preferences-helpers"; import type { UserPreferencesModel, StoreType } from "./preferences-helpers"; import type { EmitAppEvent } from "../app-event-bus/emit-event.injectable"; // TODO: Remove coupling with Feature import type { SelectedUpdateChannel } from "../../features/application-update/common/selected-update-channel/selected-update-channel.injectable"; import type { ReleaseChannel } from "../../features/application-update/common/update-channels"; +import type { PreferenceDescriptors } from "./preference-descriptors.injectable"; export interface UserStoreModel { preferences: UserPreferencesModel; @@ -21,6 +21,7 @@ export interface UserStoreModel { interface Dependencies extends BaseStoreDependencies { readonly selectedUpdateChannel: SelectedUpdateChannel; + readonly preferenceDescriptors: PreferenceDescriptors; emitAppEvent: EmitAppEvent; } @@ -43,45 +44,45 @@ export class UserStore extends BaseStore /* implements UserStore */ @observable newContexts = observable.set(); - @observable allowErrorReporting!: StoreType; - @observable allowUntrustedCAs!: StoreType; - @observable colorTheme!: StoreType; - @observable terminalTheme!: StoreType; - @observable localeTimezone!: StoreType; - @observable downloadMirror!: StoreType; - @observable httpsProxy!: StoreType; - @observable shell!: StoreType; - @observable downloadBinariesPath!: StoreType; - @observable kubectlBinariesPath!: StoreType; - @observable terminalCopyOnSelect!: StoreType; - @observable terminalConfig!: StoreType; - @observable extensionRegistryUrl!: StoreType; + @observable allowErrorReporting!: StoreType; + @observable allowUntrustedCAs!: StoreType; + @observable colorTheme!: StoreType; + @observable terminalTheme!: StoreType; + @observable localeTimezone!: StoreType; + @observable downloadMirror!: StoreType; + @observable httpsProxy!: StoreType; + @observable shell!: StoreType; + @observable downloadBinariesPath!: StoreType; + @observable kubectlBinariesPath!: StoreType; + @observable terminalCopyOnSelect!: StoreType; + @observable terminalConfig!: StoreType; + @observable extensionRegistryUrl!: StoreType; /** * Download kubectl binaries matching cluster version */ - @observable downloadKubectlBinaries!: StoreType; + @observable downloadKubectlBinaries!: StoreType; /** * Whether the application should open itself at login. */ - @observable openAtLogin!: StoreType; + @observable openAtLogin!: StoreType; /** * The column IDs under each configurable table ID that have been configured * to not be shown */ - @observable hiddenTableColumns!: StoreType; + @observable hiddenTableColumns!: StoreType; /** * Monaco editor configs */ - @observable editorConfiguration!: StoreType; + @observable editorConfiguration!: StoreType; /** * The set of file/folder paths to be synced */ - @observable syncKubeconfigEntries!: StoreType; + @observable syncKubeconfigEntries!: StoreType; /** * Checks if a column (by ID) for a table (by ID) is configured to be hidden @@ -112,14 +113,14 @@ export class UserStore extends BaseStore /* implements UserStore @action resetTheme() { - this.colorTheme = DESCRIPTORS.colorTheme.fromStore(undefined); + this.colorTheme = this.dependencies.preferenceDescriptors.colorTheme.fromStore(undefined); } @action protected fromStore({ preferences }: Partial = {}) { this.dependencies.logger.debug("UserStore.fromStore()", { preferences }); - for (const [key, { fromStore }] of object.entries(DESCRIPTORS)) { + for (const [key, { fromStore }] of object.entries(this.dependencies.preferenceDescriptors)) { const curVal = this[key]; const newVal = fromStore((preferences)?.[key] as never) as never; @@ -140,7 +141,7 @@ export class UserStore extends BaseStore /* implements UserStore toJSON(): UserStoreModel { const preferences = object.fromEntries( - object.entries(DESCRIPTORS) + object.entries(this.dependencies.preferenceDescriptors) .map(([key, { toStore }]) => [key, toStore(this[key] as never)]), ) as UserPreferencesModel; diff --git a/src/features/helm-charts/__snapshots__/remove-helm-repository-from-list-of-active-repository-in-preferences.test.ts.snap b/src/features/helm-charts/__snapshots__/remove-helm-repository-from-list-of-active-repository-in-preferences.test.ts.snap index 44d1f15961..7ea83480c0 100644 --- a/src/features/helm-charts/__snapshots__/remove-helm-repository-from-list-of-active-repository-in-preferences.test.ts.snap +++ b/src/features/helm-charts/__snapshots__/remove-helm-repository-from-list-of-active-repository-in-preferences.test.ts.snap @@ -2524,12 +2524,40 @@ exports[`remove helm repository from list of active repositories in preferences Synced Items -
+
+ class="item flex gaps align-center justify-space-between mt-3" + > + + + folder + + +
+ /some-home-dir/.kube +
+ + + delete + + +
+ Remove +
+
diff --git a/src/features/preferences/renderer/preference-items/application/timezone/timezone.tsx b/src/features/preferences/renderer/preference-items/application/timezone/timezone.tsx index 137d92531c..c3ee8f2ea1 100644 --- a/src/features/preferences/renderer/preference-items/application/timezone/timezone.tsx +++ b/src/features/preferences/renderer/preference-items/application/timezone/timezone.tsx @@ -8,12 +8,13 @@ import { withInjectables } from "@ogre-tools/injectable-react"; import type { UserStore } from "../../../../../../common/user-store"; import userStoreInjectable from "../../../../../../common/user-store/user-store.injectable"; import { Select } from "../../../../../../renderer/components/select"; -import { defaultLocaleTimezone } from "../../../../../../common/user-store/preferences-helpers"; import moment from "moment-timezone"; import { observer } from "mobx-react"; +import currentTimezoneInjectable from "../../../../../../common/user-store/current-timezone.injectable"; interface Dependencies { userStore: UserStore; + currentTimezone: string; } const timezoneOptions = moment.tz.names() @@ -23,26 +24,26 @@ const timezoneOptions = moment.tz.names() })); -const NonInjectedTimezone = observer(({ userStore }: Dependencies) => ( +const NonInjectedTimezone = observer(({ + userStore, + currentTimezone, +}: Dependencies) => (