mirror of
https://github.com/haexhub/haex-hub.git
synced 2025-12-17 06:30:50 +01:00
Moved database schemas from src-tauri/database/schemas/ to src/database/schemas/ to fix bundling issues and resolved circular import dependency that caused "Cannot access uninitialized variable" error in production builds. Key changes: - Moved crdtColumnNames definition into haex.ts to break circular dependency - Restored .$defaultFn(() => crypto.randomUUID()) calls - Kept AnySQLiteColumn type annotations - Removed obsolete TDZ fix script (no longer needed) - Updated all import paths across stores and configuration files
196 lines
5.5 KiB
TypeScript
196 lines
5.5 KiB
TypeScript
import { and, eq } from 'drizzle-orm'
|
|
import { z } from 'zod'
|
|
import * as schema from '~/database/schemas/haex'
|
|
import type { Locale } from 'vue-i18n'
|
|
|
|
export enum VaultSettingsTypeEnum {
|
|
deviceName = 'deviceName',
|
|
settings = 'settings',
|
|
}
|
|
|
|
export enum VaultSettingsKeyEnum {
|
|
locale = 'locale',
|
|
theme = 'theme',
|
|
vaultName = 'vaultName',
|
|
}
|
|
|
|
export const vaultDeviceNameSchema = z.string().min(3).max(255)
|
|
|
|
export const useVaultSettingsStore = defineStore('vaultSettingsStore', () => {
|
|
const { currentVault, currentVaultName } = storeToRefs(useVaultStore())
|
|
|
|
const {
|
|
public: { haexVault },
|
|
} = useRuntimeConfig()
|
|
|
|
const syncLocaleAsync = async () => {
|
|
try {
|
|
const app = useNuxtApp()
|
|
|
|
const currentLocaleRow =
|
|
await currentVault.value?.drizzle.query.haexSettings.findFirst({
|
|
where: eq(schema.haexSettings.key, VaultSettingsKeyEnum.locale),
|
|
})
|
|
|
|
if (currentLocaleRow?.value) {
|
|
const currentLocale = app.$i18n.availableLocales.find(
|
|
(locale) => locale === currentLocaleRow.value,
|
|
)
|
|
await app.$i18n.setLocale(currentLocale ?? app.$i18n.defaultLocale)
|
|
} else {
|
|
await currentVault.value?.drizzle.insert(schema.haexSettings).values({
|
|
id: crypto.randomUUID(),
|
|
key: VaultSettingsKeyEnum.locale,
|
|
type: VaultSettingsTypeEnum.settings,
|
|
value: app.$i18n.locale.value,
|
|
})
|
|
}
|
|
} catch (error) {
|
|
console.log('ERROR syncLocaleAsync', error)
|
|
}
|
|
}
|
|
|
|
const updateLocaleAsync = async (locale: Locale) => {
|
|
await currentVault.value?.drizzle
|
|
.update(schema.haexSettings)
|
|
.set({ key: VaultSettingsKeyEnum.locale, value: locale })
|
|
.where(
|
|
and(
|
|
eq(schema.haexSettings.key, VaultSettingsKeyEnum.locale),
|
|
eq(schema.haexSettings.type, VaultSettingsTypeEnum.settings),
|
|
),
|
|
)
|
|
}
|
|
const syncThemeAsync = async () => {
|
|
const { defaultTheme, currentTheme, currentThemeName, availableThemes } =
|
|
storeToRefs(useUiStore())
|
|
|
|
const currentThemeRow =
|
|
await currentVault.value?.drizzle.query.haexSettings.findFirst({
|
|
where: eq(schema.haexSettings.key, VaultSettingsKeyEnum.theme),
|
|
})
|
|
|
|
if (currentThemeRow?.value) {
|
|
const theme = availableThemes.value.find(
|
|
(theme) => theme.value === currentThemeRow.value,
|
|
)
|
|
currentThemeName.value = theme?.value || defaultTheme.value
|
|
} else {
|
|
await currentVault.value?.drizzle.insert(schema.haexSettings).values({
|
|
id: crypto.randomUUID(),
|
|
key: VaultSettingsKeyEnum.theme,
|
|
type: VaultSettingsTypeEnum.settings,
|
|
value: currentTheme.value?.value,
|
|
})
|
|
}
|
|
}
|
|
|
|
const updateThemeAsync = async (theme: string) => {
|
|
return await currentVault.value?.drizzle
|
|
.update(schema.haexSettings)
|
|
.set({ key: VaultSettingsKeyEnum.theme, value: theme })
|
|
.where(eq(schema.haexSettings.key, VaultSettingsKeyEnum.theme))
|
|
}
|
|
|
|
const syncVaultNameAsync = async () => {
|
|
const currentVaultNameRow =
|
|
await currentVault.value?.drizzle.query.haexSettings.findFirst({
|
|
where: eq(schema.haexSettings.key, VaultSettingsKeyEnum.vaultName),
|
|
})
|
|
|
|
if (currentVaultNameRow?.value) {
|
|
currentVaultName.value =
|
|
currentVaultNameRow.value || haexVault.defaultVaultName || 'HaexHub'
|
|
} else {
|
|
await currentVault.value?.drizzle.insert(schema.haexSettings).values({
|
|
id: crypto.randomUUID(),
|
|
key: VaultSettingsKeyEnum.vaultName,
|
|
type: VaultSettingsTypeEnum.settings,
|
|
value: currentVaultName.value,
|
|
})
|
|
}
|
|
}
|
|
|
|
const updateVaultNameAsync = async (newVaultName?: string | null) => {
|
|
return currentVault.value?.drizzle
|
|
.update(schema.haexSettings)
|
|
.set({ value: newVaultName || haexVault.defaultVaultName || 'HaexHub' })
|
|
.where(eq(schema.haexSettings.key, 'vaultName'))
|
|
}
|
|
|
|
const readDeviceNameAsync = async (id?: string) => {
|
|
const { currentVault } = useVaultStore()
|
|
|
|
if (!id) return undefined
|
|
|
|
const deviceName =
|
|
await currentVault?.drizzle?.query.haexSettings.findFirst({
|
|
where: and(
|
|
eq(schema.haexSettings.type, VaultSettingsTypeEnum.deviceName),
|
|
eq(schema.haexSettings.key, id),
|
|
),
|
|
})
|
|
|
|
return deviceName?.id ? deviceName : undefined
|
|
}
|
|
|
|
const addDeviceNameAsync = async ({
|
|
deviceId,
|
|
deviceName,
|
|
}: {
|
|
deviceId: string
|
|
deviceName: string
|
|
}) => {
|
|
const { currentVault } = useVaultStore()
|
|
|
|
const isNameOk = vaultDeviceNameSchema.safeParse(deviceName)
|
|
if (!isNameOk.success) {
|
|
console.log('deviceName not OK', isNameOk.error)
|
|
return
|
|
}
|
|
|
|
return currentVault?.drizzle?.insert(schema.haexSettings).values({
|
|
type: VaultSettingsTypeEnum.deviceName,
|
|
key: deviceId,
|
|
value: deviceName,
|
|
})
|
|
}
|
|
|
|
const updateDeviceNameAsync = async ({
|
|
deviceId,
|
|
deviceName,
|
|
}: {
|
|
deviceId: string
|
|
deviceName: string
|
|
}) => {
|
|
const { currentVault } = useVaultStore()
|
|
|
|
const isNameOk = vaultDeviceNameSchema.safeParse(deviceName)
|
|
if (!isNameOk.success) return
|
|
|
|
return currentVault?.drizzle
|
|
?.update(schema.haexSettings)
|
|
.set({
|
|
value: deviceName,
|
|
})
|
|
.where(
|
|
and(
|
|
eq(schema.haexSettings.key, deviceId),
|
|
eq(schema.haexSettings.type, VaultSettingsTypeEnum.deviceName),
|
|
),
|
|
)
|
|
}
|
|
|
|
return {
|
|
addDeviceNameAsync,
|
|
readDeviceNameAsync,
|
|
syncLocaleAsync,
|
|
syncThemeAsync,
|
|
syncVaultNameAsync,
|
|
updateDeviceNameAsync,
|
|
updateLocaleAsync,
|
|
updateThemeAsync,
|
|
updateVaultNameAsync,
|
|
}
|
|
})
|