diff --git a/front-end/src/main/shared/constants/index.ts b/front-end/src/main/shared/constants/index.ts index 79787b558..2258ab184 100644 --- a/front-end/src/main/shared/constants/index.ts +++ b/front-end/src/main/shared/constants/index.ts @@ -14,6 +14,8 @@ export const DISPLAY_FILE_SIZE_LIMIT = 512 * 1024; /* Claim */ export const DEFAULT_MAX_TRANSACTION_FEE_CLAIM_KEY = 'default_max_transaction_fee'; export const SELECTED_NETWORK = 'selected_network'; +export const LAST_SELECTED_ORGANIZATION = 'last_selected_organization'; +export const DEFAULT_ORGANIZATION_OPTION = 'default_organization_option'; export const USE_KEYCHAIN = 'use_keychain'; export const UPDATE_LOCATION = 'update_location'; export const MIGRATION_STARTED = 'migration_started'; diff --git a/front-end/src/renderer/components/GlobalAppProcesses/GlobalAppProcesses.vue b/front-end/src/renderer/components/GlobalAppProcesses/GlobalAppProcesses.vue index 2c0b57e02..7fb80394d 100644 --- a/front-end/src/renderer/components/GlobalAppProcesses/GlobalAppProcesses.vue +++ b/front-end/src/renderer/components/GlobalAppProcesses/GlobalAppProcesses.vue @@ -9,6 +9,7 @@ import useAutoLogin from '@renderer/composables/useAutoLogin'; import useLoader from '@renderer/composables/useLoader'; import useSetupStores from '@renderer/composables/user/useSetupStores'; import useRecoveryPhraseHashMigrate from '@renderer/composables/useRecoveryPhraseHashMigrate'; +import useDefaultOrganization from '@renderer/composables/user/useDefaultOrganization'; import { getUseKeychain } from '@renderer/services/safeStorageService'; import { getUsersCount, resetDataLocal } from '@renderer/services/userService'; @@ -26,6 +27,7 @@ const user = useUserStore(); const withLoader = useLoader(); const tryAutoLogin = useAutoLogin(); const setupStores = useSetupStores(); +const { select: selectDefaultOrganization } = useDefaultOrganization(); const { redirectIfRequiredKeysToMigrate } = useRecoveryPhraseHashMigrate(); /* State */ @@ -44,10 +46,14 @@ const handleImportantModalReady = async () => { const handleBeginMigrationReadyState = async () => { await withLoader(tryAutoLogin); + + const redirect = await redirectIfRequiredKeysToMigrate(); + if (!redirect) { + await withLoader(selectDefaultOrganization); + } + await user.refetchOrganizations(); await setupStores(); - - await redirectIfRequiredKeysToMigrate(); }; /* Hooks */ diff --git a/front-end/src/renderer/components/Transaction/TransactionGroupProcessor.vue b/front-end/src/renderer/components/Transaction/TransactionGroupProcessor.vue index 62f0603d8..1ae884dd5 100644 --- a/front-end/src/renderer/components/Transaction/TransactionGroupProcessor.vue +++ b/front-end/src/renderer/components/Transaction/TransactionGroupProcessor.vue @@ -332,7 +332,6 @@ async function sendSignedTransactionsToOrganization() { transactionGroup.description, false, transactionGroup.sequential, - transactionGroup.groupValidStart, apiGroupItems, ); diff --git a/front-end/src/renderer/components/UserModeSelect.vue b/front-end/src/renderer/components/UserModeSelect.vue index fcc24b5aa..fb8c3c9c2 100644 --- a/front-end/src/renderer/components/UserModeSelect.vue +++ b/front-end/src/renderer/components/UserModeSelect.vue @@ -9,6 +9,7 @@ import useNotificationsStore from '@renderer/stores/storeNotifications'; import useLoader from '@renderer/composables/useLoader'; import useCreateTooltips from '@renderer/composables/useCreateTooltips'; import useRecoveryPhraseHashMigrate from '@renderer/composables/useRecoveryPhraseHashMigrate'; +import useDefaultOrganization from '@renderer/composables/user/useDefaultOrganization'; import { isOrganizationActive } from '@renderer/utils'; @@ -26,6 +27,7 @@ const notifications = useNotificationsStore(); const withLoader = useLoader(); const createTooltips = useCreateTooltips(); const { redirectIfRequiredKeysToMigrate } = useRecoveryPhraseHashMigrate(); +const { setLast } = useDefaultOrganization(); /* State */ const selectedMode = ref('personal'); @@ -54,6 +56,7 @@ const handleUserModeChange = async (e: Event) => { dropDownValue.value = personalModeText; await user.selectOrganization(null); await redirectIfRequiredKeysToMigrate(); + await setLast(null); } else { selectedMode.value = org ? org.id : 'personal'; const organizationNickname = @@ -72,6 +75,7 @@ const handleUserModeChange = async (e: Event) => { if (isOrganizationActive(user.selectedOrganization)) { dropDownValue.value = organizationNickname; + await setLast(user.selectedOrganization?.id || null); } await redirectIfRequiredKeysToMigrate(); diff --git a/front-end/src/renderer/composables/user/index.ts b/front-end/src/renderer/composables/user/index.ts index a4887e0c6..ba6e888f0 100644 --- a/front-end/src/renderer/composables/user/index.ts +++ b/front-end/src/renderer/composables/user/index.ts @@ -1 +1,3 @@ export * from './useAfterOrganizationSelection'; +export * from './useSetupStores'; +export * from './useDefaultOrganization'; diff --git a/front-end/src/renderer/composables/user/useAfterOrganizationSelection.ts b/front-end/src/renderer/composables/user/useAfterOrganizationSelection.ts index e85299eb7..32b3a6aa0 100644 --- a/front-end/src/renderer/composables/user/useAfterOrganizationSelection.ts +++ b/front-end/src/renderer/composables/user/useAfterOrganizationSelection.ts @@ -1,6 +1,7 @@ import useUserStore from '@renderer/stores/storeUser'; import { useRouter } from 'vue-router'; + import useSetupStores from '@renderer/composables/user/useSetupStores'; import { get as getStoredMnemonics } from '@renderer/services/mnemonicService'; diff --git a/front-end/src/renderer/composables/user/useDefaultOrganization.ts b/front-end/src/renderer/composables/user/useDefaultOrganization.ts new file mode 100644 index 000000000..823a65d80 --- /dev/null +++ b/front-end/src/renderer/composables/user/useDefaultOrganization.ts @@ -0,0 +1,73 @@ +import useUserStore from '@renderer/stores/storeUser'; + +import { DEFAULT_ORGANIZATION_OPTION, LAST_SELECTED_ORGANIZATION } from '@main/shared/constants'; + +import { getOrganizations } from '@renderer/services/organizationsService'; +import { getStoredClaim, add, update, remove } from '@renderer/services/claimService'; + +import { isUserLoggedIn, safeAwait } from '@renderer/utils'; + +export default function useDefaultOrganization() { + /* Stores */ + const user = useUserStore(); + + /* Functions */ + const get = async (key: string) => { + if (isUserLoggedIn(user.personal)) { + const { data } = await safeAwait(getStoredClaim(user.personal.id, key)); + return data; + } + }; + + const getSelected = async () => { + const defaultOption = await get(DEFAULT_ORGANIZATION_OPTION); + + if (defaultOption) { + return defaultOption; + } + + return await get(LAST_SELECTED_ORGANIZATION); + }; + + const getDefault = async () => { + return await get(DEFAULT_ORGANIZATION_OPTION); + }; + + const set = async (organizationId: string | null, key: string) => { + if (isUserLoggedIn(user.personal)) { + if (organizationId === null) { + await remove(user.personal.id, [key]); + return; + } + + const storedId = await get(key); + const addOrUpdate = storedId !== undefined ? update : add; + await addOrUpdate(user.personal.id, key, organizationId); + } + }; + + const setLast = async (organizationId: string | null) => { + await set(organizationId, LAST_SELECTED_ORGANIZATION); + }; + + const setDefault = async (organizationId: string | null) => { + await set(organizationId, DEFAULT_ORGANIZATION_OPTION); + }; + + const select = async () => { + if (isUserLoggedIn(user.personal)) { + const organizationId = await getSelected(); + + if (organizationId) { + const organizations = await getOrganizations(); + const organization = organizations.find(org => org.id === organizationId); + + if (organization) { + await user.selectOrganization(organization); + } + } + } + }; + + return { getDefault, setLast, setDefault, select }; +} diff --git a/front-end/src/renderer/pages/Settings/components/GeneralTab/components/DefaultOrganization.vue b/front-end/src/renderer/pages/Settings/components/GeneralTab/components/DefaultOrganization.vue new file mode 100644 index 000000000..63fde99c6 --- /dev/null +++ b/front-end/src/renderer/pages/Settings/components/GeneralTab/components/DefaultOrganization.vue @@ -0,0 +1,62 @@ + + diff --git a/front-end/src/renderer/pages/Settings/components/GeneralTab/components/DefaultSettings.vue b/front-end/src/renderer/pages/Settings/components/GeneralTab/components/DefaultSettings.vue index eb0f8d963..e42cf5e66 100644 --- a/front-end/src/renderer/pages/Settings/components/GeneralTab/components/DefaultSettings.vue +++ b/front-end/src/renderer/pages/Settings/components/GeneralTab/components/DefaultSettings.vue @@ -1,4 +1,5 @@ @@ -6,6 +7,7 @@ import UpdateLocation from './UpdateLocation.vue';

Default Settings

+
diff --git a/front-end/src/renderer/pages/Settings/components/GeneralTab/components/UpdateLocation.vue b/front-end/src/renderer/pages/Settings/components/GeneralTab/components/UpdateLocation.vue index 03f32ecd2..7f46c090c 100644 --- a/front-end/src/renderer/pages/Settings/components/GeneralTab/components/UpdateLocation.vue +++ b/front-end/src/renderer/pages/Settings/components/GeneralTab/components/UpdateLocation.vue @@ -61,8 +61,8 @@ onBeforeMount(async () => {