const { get } = require("../../utils/api"); const { refreshMe, requireLogin } = require("../../utils/auth"); const { isModuleEnabled, visibleModules } = require("../../utils/modules"); const { getActiveClassId, getActiveClassName, getEnabledModules, showError } = require("../../utils/page-helpers"); Page({ data: { className: "HKU ICB", announcements: [], schedules: [], votes: [], timelines: [], quickModules: [], unreadCount: 0, loading: false }, async onShow() { if (!requireLogin()) return; await this.load(); }, async load() { this.setData({ loading: true }); try { await refreshMe(); const app = getApp(); const user = app.globalData.user; const classId = getActiveClassId(); const enabledModules = getEnabledModules(); const className = getActiveClassName(); this.setData({ className, quickModules: [ ...visibleModules("class", enabledModules), ...visibleModules("interact", enabledModules) ].slice(0, 4) }); const tasks = [get("/api/notifications/unread-count").catch(() => ({ unread_count: 0 }))]; const names = ["unread"]; if (isModuleEnabled("announcements", enabledModules)) { names.push("announcements"); tasks.push(get("/api/announcements/", { page_size: 3, class_id: classId })); } if (isModuleEnabled("schedule", enabledModules)) { names.push("schedules"); tasks.push(get("/api/schedule/upcoming", { limit: 3, class_id: classId })); } if (isModuleEnabled("votes", enabledModules)) { names.push("votes"); tasks.push(get("/api/votes/", { page_size: 3, class_id: classId })); } if (isModuleEnabled("timeline", enabledModules)) { names.push("timelines"); tasks.push(get("/api/timeline/", { page_size: 3, class_id: classId })); } const results = await Promise.all(tasks); const next = { announcements: [], schedules: [], votes: [], timelines: [] }; names.forEach((name, index) => { const value = results[index]; if (name === "unread") next.unreadCount = value.unread_count || 0; if (name === "announcements") next.announcements = value.items || []; if (name === "schedules") next.schedules = value || []; if (name === "votes") next.votes = value.items || []; if (name === "timelines") next.timelines = value.items || []; }); this.setData(next); } catch (error) { showError(error); } finally { this.setData({ loading: false }); } }, openModule(event) { const key = event.currentTarget.dataset.key; wx.navigateTo({ url: `/pages/module/index?module=${key}` }); }, openSchedule(event) { wx.navigateTo({ url: `/pages/schedule-detail/index?id=${event.currentTarget.dataset.id}` }); }, openTimeline(event) { wx.navigateTo({ url: `/pages/timeline-detail/index?id=${event.currentTarget.dataset.id}` }); } });