// 📢 群公告页面逻辑 const app = getApp(); const groupChatManager = require('../../../utils/group-chat-manager.js'); const apiClient = require('../../../utils/api-client.js'); Page({ data: { // 系统信息 statusBarHeight: 44, navBarHeight: 88, // 群信息 groupId: '', groupInfo: {}, // 页面模式 mode: 'view', // view, edit // 用户权限 currentUserId: '', userRole: 'member', canEdit: false, // 公告数据 currentAnnouncement: null, announcementHistory: [], // 编辑状态 editContent: '', maxLength: 500, canSave: false, // 弹窗状态 showHistoryDetail: false, selectedHistory: {}, showDeleteConfirm: false, // 加载状态 loading: false, loadingText: '加载中...' }, onLoad(options) { // 获取系统信息 this.getSystemInfo(); // 获取参数 if (options.groupId) { this.setData({ groupId: options.groupId, mode: options.mode || 'view' }); // 加载群公告 this.loadGroupAnnouncement(); } else { wx.showToast({ title: '群聊ID不能为空', icon: 'none' }); setTimeout(() => { wx.navigateBack(); }, 1500); } }, onShow() { }, // 获取系统信息 getSystemInfo() { const systemInfo = wx.getSystemInfoSync(); this.setData({ statusBarHeight: systemInfo.statusBarHeight || 44, navBarHeight: 88, currentUserId: wx.getStorageSync('userId') }); }, // 加载群公告 async loadGroupAnnouncement() { try { this.setData({ loading: true, loadingText: '加载群公告中...' }); // 获取群基本信息 const groupResponse = await apiClient.request({ url: `/api/v1/groups/${this.data.groupId}`, method: 'GET' }); if (!groupResponse.success) { throw new Error(groupResponse.error || '获取群信息失败'); } // 获取当前用户角色 const membersResult = await groupChatManager.getGroupMembers(this.data.groupId); if (membersResult.success) { const currentUser = membersResult.data.find(member => member.userId === this.data.currentUserId); const userRole = currentUser ? currentUser.role : 'member'; const canEdit = userRole === 'owner' || userRole === 'admin'; this.setData({ userRole: userRole, canEdit: canEdit }); } // 获取群公告 const announcementResponse = await apiClient.request({ url: `/api/v1/groups/${this.data.groupId}/announcements`, method: 'GET' }); if (announcementResponse.success) { const announcements = announcementResponse.data || []; const currentAnnouncement = announcements.find(a => a.isCurrent); const history = announcements.filter(a => !a.isCurrent); // 处理时间显示 if (currentAnnouncement) { currentAnnouncement.publishTimeText = this.formatDateTime(new Date(currentAnnouncement.publishTime)); } history.forEach(item => { item.publishTimeText = this.formatDateTime(new Date(item.publishTime)); }); this.setData({ groupInfo: groupResponse.data, currentAnnouncement: currentAnnouncement, announcementHistory: history, loading: false }); // 如果是编辑模式,设置编辑内容 if (this.data.mode === 'edit' && currentAnnouncement) { this.setData({ editContent: currentAnnouncement.content }); this.updateCanSave(); } } } catch (error) { this.setData({ loading: false }); console.error('❌ 加载群公告失败:', error); wx.showToast({ title: error.message || '加载群公告失败', icon: 'none' }); } }, // 📝 ===== 编辑功能 ===== // 创建公告 createAnnouncement() { if (!this.data.canEdit) { wx.showToast({ title: '没有发布权限', icon: 'none' }); return; } this.setData({ mode: 'edit', editContent: '' }); this.updateCanSave(); }, // 编辑公告 editAnnouncement() { if (!this.data.canEdit) { wx.showToast({ title: '没有编辑权限', icon: 'none' }); return; } this.setData({ mode: 'edit', editContent: this.data.currentAnnouncement ? this.data.currentAnnouncement.content : '' }); this.updateCanSave(); }, // 内容输入 onContentInput(e) { const content = e.detail.value; this.setData({ editContent: content }); this.updateCanSave(); }, // 更新是否可以保存 updateCanSave() { const canSave = this.data.editContent.trim().length > 0; this.setData({ canSave: canSave }); }, // 取消编辑 cancelEdit() { if (this.data.editContent.trim() && this.data.editContent !== (this.data.currentAnnouncement?.content || '')) { wx.showModal({ title: '取消编辑', content: '确定要取消编辑吗?未保存的内容将丢失。', success: (res) => { if (res.confirm) { this.setData({ mode: 'view', editContent: '', canSave: false }); } } }); } else { this.setData({ mode: 'view', editContent: '', canSave: false }); } }, // 保存公告 async saveAnnouncement() { if (!this.data.canSave) { return; } const content = this.data.editContent.trim(); if (!content) { wx.showToast({ title: '公告内容不能为空', icon: 'none' }); return; } try { this.setData({ loading: true, loadingText: '发布公告中...' }); const result = await groupChatManager.setGroupAnnouncement(this.data.groupId, content); this.setData({ loading: false }); if (result.success) { wx.showToast({ title: '公告发布成功', icon: 'success' }); // 切换到查看模式 this.setData({ mode: 'view', editContent: '', canSave: false }); // 重新加载公告 this.loadGroupAnnouncement(); } else { throw new Error(result.error || '发布公告失败'); } } catch (error) { this.setData({ loading: false }); console.error('❌ 保存公告失败:', error); wx.showToast({ title: error.message || '发布公告失败', icon: 'none' }); } }, // 删除公告 deleteAnnouncement() { if (!this.data.canEdit) { wx.showToast({ title: '没有删除权限', icon: 'none' }); return; } this.setData({ showDeleteConfirm: true }); }, // 确认删除公告 async confirmDeleteAnnouncement() { try { this.setData({ loading: true, loadingText: '删除公告中...', showDeleteConfirm: false }); const result = await groupChatManager.setGroupAnnouncement(this.data.groupId, ''); this.setData({ loading: false }); if (result.success) { wx.showToast({ title: '公告已删除', icon: 'success' }); // 重新加载公告 this.loadGroupAnnouncement(); } else { throw new Error(result.error || '删除公告失败'); } } catch (error) { this.setData({ loading: false }); console.error('❌ 删除公告失败:', error); wx.showToast({ title: error.message || '删除公告失败', icon: 'none' }); } }, // 关闭删除确认弹窗 closeDeleteConfirm() { this.setData({ showDeleteConfirm: false }); }, // 📜 ===== 历史公告 ===== // 查看历史公告 viewHistoryAnnouncement(e) { const announcement = e.currentTarget.dataset.announcement; this.setData({ selectedHistory: announcement, showHistoryDetail: true }); }, // 关闭历史公告详情 closeHistoryDetail() { this.setData({ showHistoryDetail: false, selectedHistory: {} }); }, // 🔧 ===== 工具方法 ===== // 格式化日期时间 formatDateTime(date) { const now = new Date(); const diff = now.getTime() - date.getTime(); if (diff < 60000) { // 1分钟内 return '刚刚'; } else if (diff < 3600000) { // 1小时内 return `${Math.floor(diff / 60000)}分钟前`; } else if (diff < 86400000) { // 1天内 return `${Math.floor(diff / 3600000)}小时前`; } else if (diff < 604800000) { // 1周内 return `${Math.floor(diff / 86400000)}天前`; } else { return `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`; } }, // 阻止事件冒泡 stopPropagation() { // 阻止点击事件冒泡 }, // 🧭 ===== 页面导航 ===== // 返回上一页 goBack() { if (this.data.mode === 'edit') { this.cancelEdit(); } else { wx.navigateBack(); } } });