2025-12-18 13:50:39 +08:00
< template >
< AppLayout >
< div class = "space-y-6" >
2026-01-05 00:38:23 +08:00
< div v-if = "loading" class="flex items-center justify-center py-12" > < LoadingSpinner / > < / div >
2025-12-18 13:50:39 +08:00
< template v-else-if = "stats" >
refactor(frontend): comprehensive split of large view files into modular components
- Split UsersView.vue into UserCreateModal, UserEditModal, UserApiKeysModal, etc.
- Split UsageView.vue into UsageStatsCards, UsageFilters, UsageTable, etc.
- Split DashboardView.vue into UserDashboardStats, UserDashboardCharts, etc.
- Split AccountsView.vue into AccountTableActions, AccountTableFilters, etc.
- Standardized TypeScript types across new components to resolve implicit 'any' and 'never[]' errors.
- Improved overall frontend maintainability and code clarity.
2026-01-04 22:17:27 +08:00
< UserDashboardStats :stats = "stats" : balance = "user?.balance || 0" :is-simple = "authStore.isSimpleMode" / >
< UserDashboardCharts v -model :startDate = "startDate" v -model :endDate = "endDate" v -model :granularity = "granularity" :loading = "loadingCharts" :trend = "trendData" :models = "modelStats" @dateRangeChange ="loadCharts" @granularityChange ="loadCharts" / >
2025-12-18 13:50:39 +08:00
< div class = "grid grid-cols-1 gap-6 lg:grid-cols-3" >
refactor(frontend): comprehensive split of large view files into modular components
- Split UsersView.vue into UserCreateModal, UserEditModal, UserApiKeysModal, etc.
- Split UsageView.vue into UsageStatsCards, UsageFilters, UsageTable, etc.
- Split DashboardView.vue into UserDashboardStats, UserDashboardCharts, etc.
- Split AccountsView.vue into AccountTableActions, AccountTableFilters, etc.
- Standardized TypeScript types across new components to resolve implicit 'any' and 'never[]' errors.
- Improved overall frontend maintainability and code clarity.
2026-01-04 22:17:27 +08:00
< div class = "lg:col-span-2" > < UserDashboardRecentUsage :data = "recentUsage" :loading = "loadingUsage" / > < / div >
2026-01-05 00:38:23 +08:00
< div class = "lg:col-span-1" > < UserDashboardQuickActions / > < / div >
2025-12-18 13:50:39 +08:00
< / div >
< / template >
< / div >
< / AppLayout >
< / template >
< script setup lang = "ts" >
refactor(frontend): comprehensive split of large view files into modular components
- Split UsersView.vue into UserCreateModal, UserEditModal, UserApiKeysModal, etc.
- Split UsageView.vue into UsageStatsCards, UsageFilters, UsageTable, etc.
- Split DashboardView.vue into UserDashboardStats, UserDashboardCharts, etc.
- Split AccountsView.vue into AccountTableActions, AccountTableFilters, etc.
- Standardized TypeScript types across new components to resolve implicit 'any' and 'never[]' errors.
- Improved overall frontend maintainability and code clarity.
2026-01-04 22:17:27 +08:00
import { ref , computed , onMounted } from 'vue' ; import { useAuthStore } from '@/stores/auth' ; import { usageAPI , type UserDashboardStats as UserStatsType } from '@/api/usage'
import AppLayout from '@/components/layout/AppLayout.vue' ; import LoadingSpinner from '@/components/common/LoadingSpinner.vue'
import UserDashboardStats from '@/components/user/dashboard/UserDashboardStats.vue' ; import UserDashboardCharts from '@/components/user/dashboard/UserDashboardCharts.vue'
import UserDashboardRecentUsage from '@/components/user/dashboard/UserDashboardRecentUsage.vue' ; import UserDashboardQuickActions from '@/components/user/dashboard/UserDashboardQuickActions.vue'
2025-12-18 13:50:39 +08:00
import type { UsageLog , TrendDataPoint , ModelStat } from '@/types'
2025-12-29 03:18:06 +08:00
refactor(frontend): comprehensive split of large view files into modular components
- Split UsersView.vue into UserCreateModal, UserEditModal, UserApiKeysModal, etc.
- Split UsageView.vue into UsageStatsCards, UsageFilters, UsageTable, etc.
- Split DashboardView.vue into UserDashboardStats, UserDashboardCharts, etc.
- Split AccountsView.vue into AccountTableActions, AccountTableFilters, etc.
- Standardized TypeScript types across new components to resolve implicit 'any' and 'never[]' errors.
- Improved overall frontend maintainability and code clarity.
2026-01-04 22:17:27 +08:00
const authStore = useAuthStore ( ) ; const user = computed ( ( ) => authStore . user )
const stats = ref < UserStatsType | null > ( null ) ; const loading = ref ( false ) ; const loadingUsage = ref ( false ) ; const loadingCharts = ref ( false )
const trendData = ref < TrendDataPoint [ ] > ( [ ] ) ; const modelStats = ref < ModelStat [ ] > ( [ ] ) ; const recentUsage = ref < UsageLog [ ] > ( [ ] )
2025-12-29 03:18:06 +08:00
refactor(frontend): comprehensive split of large view files into modular components
- Split UsersView.vue into UserCreateModal, UserEditModal, UserApiKeysModal, etc.
- Split UsageView.vue into UsageStatsCards, UsageFilters, UsageTable, etc.
- Split DashboardView.vue into UserDashboardStats, UserDashboardCharts, etc.
- Split AccountsView.vue into AccountTableActions, AccountTableFilters, etc.
- Standardized TypeScript types across new components to resolve implicit 'any' and 'never[]' errors.
- Improved overall frontend maintainability and code clarity.
2026-01-04 22:17:27 +08:00
const formatLD = ( d : Date ) => d . toISOString ( ) . split ( 'T' ) [ 0 ]
const startDate = ref ( formatLD ( new Date ( Date . now ( ) - 6 * 86400000 ) ) ) ; const endDate = ref ( formatLD ( new Date ( ) ) ) ; const granularity = ref ( 'day' )
2025-12-18 13:50:39 +08:00
2026-01-06 12:42:06 +08:00
const loadStats = async ( ) => { loading . value = true ; try { await authStore . refreshUser ( ) ; stats . value = await usageAPI . getDashboardStats ( ) } catch ( error ) { console . error ( 'Failed to load dashboard stats:' , error ) } finally { loading . value = false } }
const loadCharts = async ( ) => { loadingCharts . value = true ; try { const res = await Promise . all ( [ usageAPI . getDashboardTrend ( { start _date : startDate . value , end _date : endDate . value , granularity : granularity . value as any } ) , usageAPI . getDashboardModels ( { start _date : startDate . value , end _date : endDate . value } ) ] ) ; trendData . value = res [ 0 ] . trend || [ ] ; modelStats . value = res [ 1 ] . models || [ ] } catch ( error ) { console . error ( 'Failed to load charts:' , error ) } finally { loadingCharts . value = false } }
const loadRecent = async ( ) => { loadingUsage . value = true ; try { const res = await usageAPI . getByDateRange ( startDate . value , endDate . value ) ; recentUsage . value = res . items . slice ( 0 , 5 ) } catch ( error ) { console . error ( 'Failed to load recent usage:' , error ) } finally { loadingUsage . value = false } }
2025-12-18 13:50:39 +08:00
refactor(frontend): comprehensive split of large view files into modular components
- Split UsersView.vue into UserCreateModal, UserEditModal, UserApiKeysModal, etc.
- Split UsageView.vue into UsageStatsCards, UsageFilters, UsageTable, etc.
- Split DashboardView.vue into UserDashboardStats, UserDashboardCharts, etc.
- Split AccountsView.vue into AccountTableActions, AccountTableFilters, etc.
- Standardized TypeScript types across new components to resolve implicit 'any' and 'never[]' errors.
- Improved overall frontend maintainability and code clarity.
2026-01-04 22:17:27 +08:00
onMounted ( ( ) => { loadStats ( ) ; loadCharts ( ) ; loadRecent ( ) } )
2025-12-18 13:50:39 +08:00
< / script >