(options: UseSessionAnalysisPageBaseOptions)
| 26 | } |
| 27 | |
| 28 | export function useSessionAnalysisPageBase(options: UseSessionAnalysisPageBaseOptions) { |
| 29 | const { route, router, currentSessionId, selectSession, defaultTab, validTabIds } = options |
| 30 | |
| 31 | const isLoading = ref(true) |
| 32 | const isInitialLoad = ref(true) |
| 33 | const session = ref<AnalysisSession | null>(null) |
| 34 | const memberActivity = ref<MemberActivity[]>([]) |
| 35 | const hourlyActivity = ref<HourlyActivity[]>([]) |
| 36 | const dailyActivity = ref<DailyActivity[]>([]) |
| 37 | const messageTypes = ref<Array<{ type: MessageType; count: number }>>([]) |
| 38 | |
| 39 | function resolveActiveTabFromRoute(): string { |
| 40 | const routeTab = route.query.tab as string | undefined |
| 41 | if (routeTab && validTabIds.includes(routeTab)) return routeTab |
| 42 | return defaultTab |
| 43 | } |
| 44 | |
| 45 | const activeTab = ref(resolveActiveTabFromRoute()) |
| 46 | |
| 47 | const { timeRangeValue, fullTimeRange, availableYears, timeFilter, selectedYearForOverview, initialTimeState } = |
| 48 | useTimeSelect(route, router, { |
| 49 | activeTab, |
| 50 | isInitialLoad, |
| 51 | currentSessionId, |
| 52 | onTimeRangeChange: () => loadAnalysisData(), |
| 53 | }) |
| 54 | |
| 55 | function syncSession() { |
| 56 | const id = route.params.id as string |
| 57 | if (id) { |
| 58 | selectSession(id) |
| 59 | if (currentSessionId.value !== id) { |
| 60 | router.replace('/') |
| 61 | } |
| 62 | } |
| 63 | } |
| 64 | |
| 65 | async function loadBaseData() { |
| 66 | if (!currentSessionId.value) return |
| 67 | |
| 68 | try { |
| 69 | const sessionData = await useDataService().getSession(currentSessionId.value) |
| 70 | session.value = sessionData |
| 71 | } catch (error) { |
| 72 | console.error('加载基础数据失败:', error) |
| 73 | } |
| 74 | } |
| 75 | |
| 76 | async function loadAnalysisData() { |
| 77 | if (!currentSessionId.value) return |
| 78 | |
| 79 | isLoading.value = true |
| 80 | |
| 81 | try { |
| 82 | const filter = timeFilter.value |
| 83 | |
| 84 | const adapter = useDataService() |
| 85 | const [members, hourly, daily, types] = await Promise.all([ |
nothing calls this directly
no test coverage detected