Files
directus/app/src/hydrate.ts
Christian Rendl 0206a3d2cc Added default locale before login (#8196)
* Added default locale before login

* Use project_language as default language for new users

* Revert "Use project_language as default language for new users"

* Allow user's language field to be nullable; Use project_language whenever language is unset;

* Apply suggestions from code review

Co-authored-by: Nicola Krumschmidt <nicola.krumschmidt@freenet.de>

* Make "Project Default" option in system-language interface configurable

* Set language only if user language is not null

* Introduced translation for project_language field; Use translation in system-language interface

* Set app language only from app.vue;
Included watcher to restore project_language if user's language is (re)set to null

* Removed .alter() in knex migration since it's not needed for changing default and breaks checks

* Reverted previous change in migration; .alter() is needed for changing column defaults

* Reverted migration to use .defaultTo(null) to set default value

* Update position of project language field in settings

* Fix cockroachdb test error in knex migration

* Fix cockroachdb test error in knex migration

* Apply migration fix also on oracle databases

* Apply changes from code review

* Rename migration to fix migration key error

* Move setLanguage calls to server.ts and hydrate.ts

Co-authored-by: Nicola Krumschmidt <nicola.krumschmidt@freenet.de>
Co-authored-by: jaycammarano <jay.cammarano@gmail.com>
Co-authored-by: Christian Rendl <cr@mutor.at>
Co-authored-by: rijkvanzanten <rijkvanzanten@me.com>
2022-04-01 14:30:56 -04:00

110 lines
2.7 KiB
TypeScript

import { setLanguage } from '@/lang/set-language';
import { register as registerModules, unregister as unregisterModules } from '@/modules/register';
import { getBasemapSources } from '@/utils/geometry/basemap';
import {
useAppStore,
useCollectionsStore,
useFieldsStore,
useLatencyStore,
useInsightsStore,
usePermissionsStore,
usePresetsStore,
useRelationsStore,
useRequestsStore,
useServerStore,
useSettingsStore,
useUserStore,
useNotificationsStore,
} from '@/stores';
import { useTranslationStrings } from '@/composables/use-translation-strings';
type GenericStore = {
$id: string;
hydrate?: () => Promise<void>;
dehydrate?: () => Promise<void>;
[key: string]: any;
};
export function useStores(
stores = [
useCollectionsStore,
useFieldsStore,
useUserStore,
useRequestsStore,
usePresetsStore,
useSettingsStore,
useServerStore,
useLatencyStore,
useRelationsStore,
usePermissionsStore,
useInsightsStore,
useNotificationsStore,
]
): GenericStore[] {
return stores.map((useStore) => useStore()) as GenericStore[];
}
export async function hydrate(): Promise<void> {
const stores = useStores();
const appStore = useAppStore();
const userStore = useUserStore();
const serverStore = useServerStore();
const permissionsStore = usePermissionsStore();
const { refresh: hydrateTranslationStrings } = useTranslationStrings();
if (appStore.hydrated) return;
if (appStore.hydrating) return;
appStore.hydrating = true;
try {
/**
* @NOTE
* Multiple stores rely on the userStore to be set, so they can fetch user specific data. The
* following makes sure that the user store is always fetched first, before we hydrate anything
* else.
*/
await userStore.hydrate();
let lang = 'en-US';
if (serverStore.info?.project?.default_language) lang = serverStore.info.project.default_language;
if (userStore.currentUser?.role) {
await permissionsStore.hydrate();
const hydratedStores = ['userStore', 'permissionsStore'];
await Promise.all(stores.filter(({ $id }) => !hydratedStores.includes($id)).map((store) => store.hydrate?.()));
await registerModules();
await hydrateTranslationStrings();
if (userStore.currentUser?.language) lang = userStore.currentUser?.language;
}
await setLanguage(lang);
appStore.basemap = getBasemapSources()[0].name;
} catch (error: any) {
appStore.error = error;
} finally {
appStore.hydrating = false;
}
appStore.hydrated = true;
}
export async function dehydrate(stores = useStores()): Promise<void> {
const appStore = useAppStore();
if (appStore.hydrated === false) return;
for (const store of stores) {
await store.dehydrate?.();
}
unregisterModules();
appStore.hydrated = false;
}