mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-19 13:21:46 +00:00
fix(offline): load trips from Dexie on dashboard when offline; fix offline tab i18n key
This commit is contained in:
@@ -149,6 +149,7 @@ const ar: Record<string, string | { name: string; category: string }[]> = {
|
|||||||
'settings.tabs.notifications': 'الإشعارات',
|
'settings.tabs.notifications': 'الإشعارات',
|
||||||
'settings.tabs.integrations': 'التكاملات',
|
'settings.tabs.integrations': 'التكاملات',
|
||||||
'settings.tabs.account': 'الحساب',
|
'settings.tabs.account': 'الحساب',
|
||||||
|
'settings.tabs.offline': 'Offline',
|
||||||
'settings.tabs.about': 'حول',
|
'settings.tabs.about': 'حول',
|
||||||
'settings.map': 'الخريطة',
|
'settings.map': 'الخريطة',
|
||||||
'settings.mapTemplate': 'قالب الخريطة',
|
'settings.mapTemplate': 'قالب الخريطة',
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ const br: Record<string, string | { name: string; category: string }[]> = {
|
|||||||
'settings.tabs.notifications': 'Notificações',
|
'settings.tabs.notifications': 'Notificações',
|
||||||
'settings.tabs.integrations': 'Integrações',
|
'settings.tabs.integrations': 'Integrações',
|
||||||
'settings.tabs.account': 'Conta',
|
'settings.tabs.account': 'Conta',
|
||||||
|
'settings.tabs.offline': 'Offline',
|
||||||
'settings.tabs.about': 'Sobre',
|
'settings.tabs.about': 'Sobre',
|
||||||
'settings.map': 'Mapa',
|
'settings.map': 'Mapa',
|
||||||
'settings.mapTemplate': 'Modelo de mapa',
|
'settings.mapTemplate': 'Modelo de mapa',
|
||||||
|
|||||||
@@ -145,6 +145,7 @@ const cs: Record<string, string | { name: string; category: string }[]> = {
|
|||||||
'settings.tabs.notifications': 'Oznámení',
|
'settings.tabs.notifications': 'Oznámení',
|
||||||
'settings.tabs.integrations': 'Integrace',
|
'settings.tabs.integrations': 'Integrace',
|
||||||
'settings.tabs.account': 'Účet',
|
'settings.tabs.account': 'Účet',
|
||||||
|
'settings.tabs.offline': 'Offline',
|
||||||
'settings.tabs.about': 'O aplikaci',
|
'settings.tabs.about': 'O aplikaci',
|
||||||
'settings.map': 'Mapy',
|
'settings.map': 'Mapy',
|
||||||
'settings.mapTemplate': 'Šablona mapy',
|
'settings.mapTemplate': 'Šablona mapy',
|
||||||
|
|||||||
@@ -147,6 +147,7 @@ const de: Record<string, string | { name: string; category: string }[]> = {
|
|||||||
'settings.tabs.notifications': 'Benachrichtigungen',
|
'settings.tabs.notifications': 'Benachrichtigungen',
|
||||||
'settings.tabs.integrations': 'Integrationen',
|
'settings.tabs.integrations': 'Integrationen',
|
||||||
'settings.tabs.account': 'Konto',
|
'settings.tabs.account': 'Konto',
|
||||||
|
'settings.tabs.offline': 'Offline',
|
||||||
'settings.tabs.about': 'Über',
|
'settings.tabs.about': 'Über',
|
||||||
'settings.map': 'Karte',
|
'settings.map': 'Karte',
|
||||||
'settings.mapTemplate': 'Karten-Vorlage',
|
'settings.mapTemplate': 'Karten-Vorlage',
|
||||||
|
|||||||
@@ -147,6 +147,7 @@ const en: Record<string, string | { name: string; category: string }[]> = {
|
|||||||
'settings.tabs.notifications': 'Notifications',
|
'settings.tabs.notifications': 'Notifications',
|
||||||
'settings.tabs.integrations': 'Integrations',
|
'settings.tabs.integrations': 'Integrations',
|
||||||
'settings.tabs.account': 'Account',
|
'settings.tabs.account': 'Account',
|
||||||
|
'settings.tabs.offline': 'Offline',
|
||||||
'settings.tabs.about': 'About',
|
'settings.tabs.about': 'About',
|
||||||
'settings.map': 'Map',
|
'settings.map': 'Map',
|
||||||
'settings.mapTemplate': 'Map Template',
|
'settings.mapTemplate': 'Map Template',
|
||||||
|
|||||||
@@ -145,6 +145,7 @@ const es: Record<string, string> = {
|
|||||||
'settings.tabs.notifications': 'Notificaciones',
|
'settings.tabs.notifications': 'Notificaciones',
|
||||||
'settings.tabs.integrations': 'Integraciones',
|
'settings.tabs.integrations': 'Integraciones',
|
||||||
'settings.tabs.account': 'Cuenta',
|
'settings.tabs.account': 'Cuenta',
|
||||||
|
'settings.tabs.offline': 'Offline',
|
||||||
'settings.tabs.about': 'Acerca de',
|
'settings.tabs.about': 'Acerca de',
|
||||||
'settings.map': 'Mapa',
|
'settings.map': 'Mapa',
|
||||||
'settings.mapTemplate': 'Plantilla del mapa',
|
'settings.mapTemplate': 'Plantilla del mapa',
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ const fr: Record<string, string> = {
|
|||||||
'settings.tabs.notifications': 'Notifications',
|
'settings.tabs.notifications': 'Notifications',
|
||||||
'settings.tabs.integrations': 'Intégrations',
|
'settings.tabs.integrations': 'Intégrations',
|
||||||
'settings.tabs.account': 'Compte',
|
'settings.tabs.account': 'Compte',
|
||||||
|
'settings.tabs.offline': 'Offline',
|
||||||
'settings.tabs.about': 'À propos',
|
'settings.tabs.about': 'À propos',
|
||||||
'settings.map': 'Carte',
|
'settings.map': 'Carte',
|
||||||
'settings.mapTemplate': 'Modèle de carte',
|
'settings.mapTemplate': 'Modèle de carte',
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ const hu: Record<string, string | { name: string; category: string }[]> = {
|
|||||||
'settings.tabs.notifications': 'Értesítések',
|
'settings.tabs.notifications': 'Értesítések',
|
||||||
'settings.tabs.integrations': 'Integrációk',
|
'settings.tabs.integrations': 'Integrációk',
|
||||||
'settings.tabs.account': 'Fiók',
|
'settings.tabs.account': 'Fiók',
|
||||||
|
'settings.tabs.offline': 'Offline',
|
||||||
'settings.tabs.about': 'Névjegy',
|
'settings.tabs.about': 'Névjegy',
|
||||||
'settings.map': 'Térkép',
|
'settings.map': 'Térkép',
|
||||||
'settings.mapTemplate': 'Térkép sablon',
|
'settings.mapTemplate': 'Térkép sablon',
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ const it: Record<string, string | { name: string; category: string }[]> = {
|
|||||||
'settings.tabs.notifications': 'Notifiche',
|
'settings.tabs.notifications': 'Notifiche',
|
||||||
'settings.tabs.integrations': 'Integrazioni',
|
'settings.tabs.integrations': 'Integrazioni',
|
||||||
'settings.tabs.account': 'Account',
|
'settings.tabs.account': 'Account',
|
||||||
|
'settings.tabs.offline': 'Offline',
|
||||||
'settings.tabs.about': 'Informazioni',
|
'settings.tabs.about': 'Informazioni',
|
||||||
'settings.map': 'Mappa',
|
'settings.map': 'Mappa',
|
||||||
'settings.mapTemplate': 'Modello Mappa',
|
'settings.mapTemplate': 'Modello Mappa',
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ const nl: Record<string, string> = {
|
|||||||
'settings.tabs.notifications': 'Meldingen',
|
'settings.tabs.notifications': 'Meldingen',
|
||||||
'settings.tabs.integrations': 'Integraties',
|
'settings.tabs.integrations': 'Integraties',
|
||||||
'settings.tabs.account': 'Account',
|
'settings.tabs.account': 'Account',
|
||||||
|
'settings.tabs.offline': 'Offline',
|
||||||
'settings.tabs.about': 'Over',
|
'settings.tabs.about': 'Over',
|
||||||
'settings.map': 'Kaart',
|
'settings.map': 'Kaart',
|
||||||
'settings.mapTemplate': 'Kaartsjabloon',
|
'settings.mapTemplate': 'Kaartsjabloon',
|
||||||
|
|||||||
@@ -130,6 +130,7 @@ const pl: Record<string, string | { name: string; category: string }[]> = {
|
|||||||
'settings.tabs.notifications': 'Powiadomienia',
|
'settings.tabs.notifications': 'Powiadomienia',
|
||||||
'settings.tabs.integrations': 'Integracje',
|
'settings.tabs.integrations': 'Integracje',
|
||||||
'settings.tabs.account': 'Konto',
|
'settings.tabs.account': 'Konto',
|
||||||
|
'settings.tabs.offline': 'Offline',
|
||||||
'settings.tabs.about': 'O aplikacji',
|
'settings.tabs.about': 'O aplikacji',
|
||||||
'settings.map': 'Mapa',
|
'settings.map': 'Mapa',
|
||||||
'settings.mapTemplate': 'Szablon mapy',
|
'settings.mapTemplate': 'Szablon mapy',
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ const ru: Record<string, string> = {
|
|||||||
'settings.tabs.notifications': 'Уведомления',
|
'settings.tabs.notifications': 'Уведомления',
|
||||||
'settings.tabs.integrations': 'Интеграции',
|
'settings.tabs.integrations': 'Интеграции',
|
||||||
'settings.tabs.account': 'Аккаунт',
|
'settings.tabs.account': 'Аккаунт',
|
||||||
|
'settings.tabs.offline': 'Offline',
|
||||||
'settings.tabs.about': 'О приложении',
|
'settings.tabs.about': 'О приложении',
|
||||||
'settings.map': 'Карта',
|
'settings.map': 'Карта',
|
||||||
'settings.mapTemplate': 'Шаблон карты',
|
'settings.mapTemplate': 'Шаблон карты',
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ const zh: Record<string, string> = {
|
|||||||
'settings.tabs.notifications': '通知',
|
'settings.tabs.notifications': '通知',
|
||||||
'settings.tabs.integrations': '集成',
|
'settings.tabs.integrations': '集成',
|
||||||
'settings.tabs.account': '账户',
|
'settings.tabs.account': '账户',
|
||||||
|
'settings.tabs.offline': 'Offline',
|
||||||
'settings.tabs.about': '关于',
|
'settings.tabs.about': '关于',
|
||||||
'settings.map': '地图',
|
'settings.map': '地图',
|
||||||
'settings.mapTemplate': '地图模板',
|
'settings.mapTemplate': '地图模板',
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ const zhTw: Record<string, string> = {
|
|||||||
'settings.tabs.notifications': '通知',
|
'settings.tabs.notifications': '通知',
|
||||||
'settings.tabs.integrations': '整合',
|
'settings.tabs.integrations': '整合',
|
||||||
'settings.tabs.account': '帳戶',
|
'settings.tabs.account': '帳戶',
|
||||||
|
'settings.tabs.offline': 'Offline',
|
||||||
'settings.tabs.about': '關於',
|
'settings.tabs.about': '關於',
|
||||||
'settings.map': '地圖',
|
'settings.map': '地圖',
|
||||||
'settings.mapTemplate': '地圖模板',
|
'settings.mapTemplate': '地圖模板',
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import React, { useEffect, useState, useRef } from 'react'
|
import React, { useEffect, useState, useRef } from 'react'
|
||||||
import { useNavigate } from 'react-router-dom'
|
import { useNavigate } from 'react-router-dom'
|
||||||
import { tripsApi } from '../api/client'
|
import { tripsApi } from '../api/client'
|
||||||
|
import { tripRepo } from '../repo/tripRepo'
|
||||||
import { useAuthStore } from '../store/authStore'
|
import { useAuthStore } from '../store/authStore'
|
||||||
import { useSettingsStore } from '../store/settingsStore'
|
import { useSettingsStore } from '../store/settingsStore'
|
||||||
import { useTranslation } from '../i18n'
|
import { useTranslation } from '../i18n'
|
||||||
@@ -713,12 +714,9 @@ export default function DashboardPage(): React.ReactElement {
|
|||||||
const loadTrips = async () => {
|
const loadTrips = async () => {
|
||||||
setIsLoading(true)
|
setIsLoading(true)
|
||||||
try {
|
try {
|
||||||
const [active, archived] = await Promise.all([
|
const { trips, archivedTrips } = await tripRepo.list()
|
||||||
tripsApi.list(),
|
setTrips(sortTrips(trips))
|
||||||
tripsApi.list({ archived: 1 }),
|
setArchivedTrips(sortTrips(archivedTrips))
|
||||||
])
|
|
||||||
setTrips(sortTrips(active.trips))
|
|
||||||
setArchivedTrips(sortTrips(archived.trips))
|
|
||||||
} catch {
|
} catch {
|
||||||
toast.error(t('dashboard.toast.loadError'))
|
toast.error(t('dashboard.toast.loadError'))
|
||||||
} finally {
|
} finally {
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ export default function SettingsPage(): React.ReactElement {
|
|||||||
{ id: 'map', label: t('settings.tabs.map') },
|
{ id: 'map', label: t('settings.tabs.map') },
|
||||||
{ id: 'notifications', label: t('settings.tabs.notifications') },
|
{ id: 'notifications', label: t('settings.tabs.notifications') },
|
||||||
...(hasIntegrations ? [{ id: 'integrations', label: t('settings.tabs.integrations') }] : []),
|
...(hasIntegrations ? [{ id: 'integrations', label: t('settings.tabs.integrations') }] : []),
|
||||||
{ id: 'offline', label: t('settings.tabs.offline', 'Offline') },
|
{ id: 'offline', label: t('settings.tabs.offline') },
|
||||||
{ id: 'account', label: t('settings.tabs.account') },
|
{ id: 'account', label: t('settings.tabs.account') },
|
||||||
...(appVersion ? [{ id: 'about', label: t('settings.tabs.about') }] : []),
|
...(appVersion ? [{ id: 'about', label: t('settings.tabs.about') }] : []),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -3,6 +3,23 @@ import { offlineDb, upsertTrip } from '../db/offlineDb'
|
|||||||
import type { Trip } from '../types'
|
import type { Trip } from '../types'
|
||||||
|
|
||||||
export const tripRepo = {
|
export const tripRepo = {
|
||||||
|
async list(): Promise<{ trips: Trip[]; archivedTrips: Trip[] }> {
|
||||||
|
if (!navigator.onLine) {
|
||||||
|
const all = await offlineDb.trips.toArray()
|
||||||
|
return {
|
||||||
|
trips: all.filter(t => !t.is_archived),
|
||||||
|
archivedTrips: all.filter(t => t.is_archived),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const [active, archived] = await Promise.all([
|
||||||
|
tripsApi.list(),
|
||||||
|
tripsApi.list({ archived: 1 }),
|
||||||
|
])
|
||||||
|
active.trips.forEach(t => upsertTrip(t))
|
||||||
|
archived.trips.forEach(t => upsertTrip(t))
|
||||||
|
return { trips: active.trips, archivedTrips: archived.trips }
|
||||||
|
},
|
||||||
|
|
||||||
async get(tripId: number | string): Promise<{ trip: Trip }> {
|
async get(tripId: number | string): Promise<{ trip: Trip }> {
|
||||||
if (!navigator.onLine) {
|
if (!navigator.onLine) {
|
||||||
const cached = await offlineDb.trips.get(Number(tripId))
|
const cached = await offlineDb.trips.get(Number(tripId))
|
||||||
|
|||||||
Reference in New Issue
Block a user