// Get application instance const app = getApp(); const apiClient = require('../../../utils/api-client.js'); // Import your API client const friendAPI = require('../../../utils/friend-api.js'); // Import friend API for loading target user info // Page configuration Page({ // Page data data: { username: '加载中...', // User name (loading state) userId: '加载中...', // User ID (loading state) qrCodeUrl: '', // QR code image URL isDarkMode: false, // Whether in dark mode isLoading: true, // Loading state userInfo: null, // Store complete user info isTestData: false, // Flag to indicate if using test data }, // Test/fallback user data to prevent crashes getTestUserData: function() { return { user: { id: 'test_123456', customId: 'TEST001', nickname: 'Test User', phone: '13800138000', avatar: 'https://via.placeholder.com/100x100/4CAF50/white?text=T', gender: 1, birthday: '1990-01-01', location: 'Test City', signature: 'This is a test user for development', isActive: true, createdAt: '2024-01-01T00:00:00Z', updatedAt: '2024-01-01T00:00:00Z' }, token: 'test_token_123456789', refreshToken: 'test_refresh_token_123456789', expiresAt: Date.now() + (7 * 24 * 60 * 60 * 1000), // 7 days from now permissions: ['basic', 'location', 'social'], settings: { locationPrivacy: 'friends', showPhone: false, allowSearch: true } }; }, // Page load lifecycle function onLoad: function(options) { // 接收传入的 customId 参数(如果是从用户预览页或好友详情页跳转过来的) const targetCustomId = options?.customId || null; // Check theme settings first const isDarkMode = wx.getStorageSync('isDarkMode') || false; this.setData({ isDarkMode: isDarkMode }); // Load user information this.loadUserInfo(targetCustomId); }, // Load user information with guaranteed fallback loadUserInfo: function(targetCustomId) { // Show loading wx.showLoading({ title: '加载中...', mask: true }); // 如果传入了 targetCustomId,说明要显示陌生人或好友的二维码 if (targetCustomId) { this.loadTargetUserInfo(targetCustomId); return; } // 否则显示当前用户的二维码 // Start with test data immediately to ensure something always works const testUserData = this.getTestUserData(); this.setData({ username: testUserData.user.nickname, userId: testUserData.user.customId, userInfo: testUserData, isLoading: false, isTestData: true }); // Generate QR code immediately with test data this.generateQRCodeWithData(testUserData); // Hide loading wx.hideLoading(); // Show test data notification wx.showToast({ title: '使用测试数据', icon: 'none', duration: 2000 }); // Try to get real data in background (optional) this.tryLoadRealUserData(); }, // 加载目标用户(陌生人或好友)的信息 loadTargetUserInfo: async function(targetCustomId) { console.log('📱 开始加载目标用户信息, customId:', targetCustomId); if (!targetCustomId) { console.error('❌ targetCustomId 为空'); wx.hideLoading(); wx.showModal({ title: '参数错误', content: '用户ID不存在', showCancel: false, confirmText: '确定', success: () => { wx.navigateBack(); } }); return; } try { // 先尝试获取好友详情(如果是好友) try { console.log('🔍 尝试获取好友详情, customId:', targetCustomId); const detail = await friendAPI.getFriendDetail(targetCustomId); if (detail && detail.code === 0 && detail.data) { console.log('✅ 获取好友详情成功'); const userData = detail.data; // 格式化用户信息,匹配二维码生成所需的格式 const formattedUserInfo = { user: { customId: userData.customId || targetCustomId, nickname: userData.nickname || userData.remark || '用户', avatar: userData.avatar || '', id: userData.id || userData.customId } }; this.setData({ username: formattedUserInfo.user.nickname, userId: formattedUserInfo.user.customId, userInfo: formattedUserInfo, isLoading: false, isTestData: false }); // 使用现有逻辑生成二维码 this.generateQRCodeWithData(formattedUserInfo); wx.hideLoading(); console.log('✅ 好友二维码生成完成'); return; } } catch (err) { // 不是好友,继续走搜索流程 console.log('⚠️ 获取好友详情失败(可能不是好友),尝试搜索用户:', err.message || err); } // 如果不是好友,使用搜索接口 console.log('🔍 使用搜索接口查找用户, customId:', targetCustomId); const resp = await friendAPI.searchUsers(targetCustomId, 'custom_id', 1, 1); const user = resp?.data?.users?.[0]; if (!user) { console.error('❌ 未找到用户信息'); wx.hideLoading(); wx.showModal({ title: '加载失败', content: '未找到该用户信息', showCancel: false, confirmText: '确定', success: () => { wx.navigateBack(); } }); return; } console.log('✅ 搜索到用户信息:', user); // 格式化用户信息 const formattedUserInfo = { user: { customId: user.customId || targetCustomId, nickname: user.nickname || '用户', avatar: user.avatar || '', id: user.id || user.customId } }; this.setData({ username: formattedUserInfo.user.nickname, userId: formattedUserInfo.user.customId, userInfo: formattedUserInfo, isLoading: false, isTestData: false }); // 使用现有逻辑生成二维码 this.generateQRCodeWithData(formattedUserInfo); wx.hideLoading(); console.log('✅ 陌生人二维码生成完成'); } catch (error) { console.error('❌ 加载目标用户信息失败:', error); wx.hideLoading(); wx.showModal({ title: '加载失败', content: error.message || '无法加载用户信息,请稍后重试', showCancel: false, confirmText: '确定', success: () => { wx.navigateBack(); } }); } }, // Try to load real user data in background (won't break if fails) tryLoadRealUserData: async function() { try { // Try local storage first let userInfo = wx.getStorageSync('userInfo'); // Try API if no local data if (!userInfo || !userInfo.user) { const response = await apiClient.getUserInfo(); if (response && response.code === 0 && response.data) { userInfo = response.data; wx.setStorageSync('userInfo', userInfo); } } // If we got real data, update the UI if (userInfo && userInfo.user) { this.setData({ username: userInfo.user.nickname || userInfo.user.customId || '真实用户', userId: userInfo.user.customId || userInfo.user.id || 'REAL001', userInfo: userInfo, isTestData: false }); // Regenerate QR code with real data this.generateQRCodeWithData(userInfo); wx.showToast({ title: '已加载真实数据', icon: 'success', duration: 1500 }); } } catch (error) { // Do nothing - we already have test data working } }, // Generate QR code with provided user data (guaranteed to work) generateQRCodeWithData: function(userData) { if (!userData || !userData.user) { console.error('未提供用于生成二维码的用户数据'); return; } // Create QR code data object // const qrData = { // type: 'user_card', // username: userData.user.nickname || userData.user.customId, // customId: userData.user.customId, // nickname: userData.user.nickname, // avatar: userData.user.avatar, // isTestData: this.data.isTestData, // timestamp: Date.now() // }; // Convert to JSON string for QR code const qrCodeData = "FINDME:" + userData.user.customId;//JSON.stringify(qrData); // Generate QR code URL using online service (guaranteed to work) try { const encodedData = encodeURIComponent(qrCodeData); const qrCodeUrl = `https://api.qrserver.com/v1/create-qr-code/?size=300x300&format=png&data=${encodedData}`; this.setData({ qrCodeUrl: qrCodeUrl }); } catch (error) { console.error('生成二维码失败 URL:', error); // Ultimate fallback - use a simple text-based QR code const simpleData = `${userData.user.nickname}-${userData.user.customId}`; const encodedSimpleData = encodeURIComponent(simpleData); const fallbackUrl = `https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=${encodedSimpleData}`; this.setData({ qrCodeUrl: fallbackUrl }); } }, // Navigate back navigateBack: function() { wx.navigateBack({ delta: 1 }); }, // Show menu showMenu: function() { // Different menu options based on whether user is logged in or using test data const menuItems = ['保存图片', '分享二维码', '刷新数据']; if (this.data.isTestData) { menuItems.push('前往登录'); } menuItems.push('Settings'); wx.showActionSheet({ itemList: menuItems, success: (res) => { switch (res.tapIndex) { case 0: this.saveQRCode(); break; case 1: this.shareQRCode(); break; case 2: this.refreshUserInfo(); break; case 3: if (this.data.isTestData) { this.goToLogin(); } else { this.goToSettings(); } break; case 4: if (!this.data.isTestData) { this.goToSettings(); } break; } } }); }, // Navigate to login page goToLogin: function() { wx.navigateTo({ url: '/pages/login/login' }); }, // Navigate to settings page goToSettings: function() { wx.navigateTo({ url: '/subpackages/settings/settingss/settingss' }); }, // Force test data (for debugging) - only works when not logged in forceTestData: function() { // Check if user is actually logged in const userInfo = wx.getStorageSync('userInfo'); if (userInfo && userInfo.user && userInfo.token) { wx.showModal({ title: 'Cannot Use Test Data', content: 'You are currently logged in. Please log out first to use test data.', showCancel: false, confirmText: 'OK' }); return; } const testUserData = this.getTestUserData(); this.setData({ username: testUserData.user.nickname, userId: testUserData.user.customId, userInfo: testUserData, isTestData: true, qrCodeUrl: '' // Clear current QR code }); this.generateQRCodeWithData(testUserData); wx.showToast({ title: 'Test data loaded', icon: 'success' }); }, // Refresh user info refreshUserInfo: function() { this.setData({ isLoading: true, username: '令人耳目一新……', userId: '请稍等...', qrCodeUrl: '' }); // Try to reload user info (will use real data if available, test data if not) this.loadUserInfo(); }, // Refresh QR code refreshQRCode: function() { if (!this.data.userInfo) { this.loadUserInfo(); return; } wx.showLoading({ title: '正在刷新二维码...' }); // Clear current QR code this.setData({ qrCodeUrl: '' }); // Regenerate with current data setTimeout(() => { this.generateQRCodeWithData(this.data.userInfo); wx.hideLoading(); wx.showToast({ title: '二维码已刷新', icon: 'success' }); }, 500); }, // QR code image load success onQRCodeLoad: function() { }, // QR code image load error onQRCodeError: function(e) { console.error('二维码图片加载失败:', e); // Try to regenerate with simpler data if (this.data.userInfo) { const userData = this.data.userInfo; const simpleData = `${userData.user.nickname || 'User'}-${userData.user.customId || 'ID'}`; const encodedData = encodeURIComponent(simpleData); const fallbackUrl = `https://api.qrserver.com/v1/create-qr-code/?size=300x300&data=${encodedData}`; this.setData({ qrCodeUrl: fallbackUrl }); } }, // Save QR code to album saveQRCode: function() { if (!this.data.qrCodeUrl) { wx.showToast({ title: '没有二维码可以保存', icon: 'none' }); return; } // Download and save wx.downloadFile({ url: this.data.qrCodeUrl, success: (res) => { if (res.statusCode === 200) { wx.saveImageToPhotosAlbum({ filePath: res.tempFilePath, success: () => { wx.showToast({ title: '保存成功', icon: 'success' }); }, fail: (error) => { console.error('保存二维码失败:', error); wx.showToast({ title: '保存失败', icon: 'none' }); } }); } }, fail: (error) => { console.error('二维码下载失败:', error); wx.showToast({ title: '下载失败'+error.errMsg, icon: 'none' }); } }); }, // Share QR code shareQRCode: function() { if (!this.data.qrCodeUrl) { wx.showToast({ title: '没有可分享的二维码', icon: 'none' }); return; } wx.downloadFile({ url: this.data.qrCodeUrl, success: (res) => { if (res.statusCode === 200) { wx.showShareImageMenu({ path: res.tempFilePath, success: () => { }, fail: (error) => { console.error('分享失败:', error); wx.showToast({ title: '分享失败', icon: 'none' }); } }); } }, fail: (error) => { console.error('无法下载共享:', error); wx.showToast({ title: '分享失败', icon: 'none' }); } }); }, // Enhanced scan QR code with better error handling scanQRCode: function() { wx.navigateTo({ url: '/subpackages/qr/qr-scan/qr-scan', }) // Check camera permission first // wx.getSetting({ // success: (res) => { // if (res.authSetting['scope.camera'] === false) { // wx.showModal({ // title: '需要相机权限', // content: '扫描二维码需要使用相机,请允许访问相机', // showCancel: true, // cancelText: '取消', // confirmText: '去设置', // success: (modalRes) => { // if (modalRes.confirm) { // wx.openSetting(); // } // } // }); // return; // } // // Proceed with scanning // wx.scanCode({ // // onlyFromCamera: true, // scanType: ['qrCode'], // success: (res) => { // try { // const scannedData = JSON.parse(res.result); // if (scannedData.type === 'user_card') { // this.handleUserCardScan(scannedData); // } else { // this.handleGenericScan(res.result); // } // } catch (error) { // this.handleGenericScan(res.result); // } // }, // fail: (error) => { // console.error('扫描失败:', error); // if (error.errMsg.includes('cancel')) { // // User cancelled scanning // } else { // wx.showToast({ // title: '扫描失败,请重试', // icon: 'none' // }); // } // } // }); // } // }); }, // Handle user card QR code scan (Enhanced version) handleUserCardScan: function(userData) { const isTestData = userData.isTestData || false; const dataType = isTestData ? ' (Test Data)' : ''; // Check if trying to scan own QR code if (this.data.userInfo && (userData.userId === this.data.userInfo.user.customId || userData.userId === this.data.userInfo.user.id)) { wx.showModal({ title: '提示', content: '不能添加自己为好友', showCancel: false, confirmText: '知道了' }); return; } wx.showModal({ title: `扫描到用户${dataType}`, content: `用户名: ${userData.username}\n用户ID: ${userData.userId}${isTestData ? '\n\n注意:这是测试数据' : ''}`, showCancel: true, cancelText: '取消', confirmText: isTestData ? '知道了' : '添加好友', success: (res) => { if (res.confirm && !isTestData) { this.addFriend(userData); } else if (res.confirm && isTestData) { wx.showToast({ title: '无法添加测试用户', icon: 'none' }); } } }); }, // Add friend functionality using your existing API addFriend: async function(userData) { // Show loading wx.showLoading({ title: '添加中...', mask: true }); try { // Check if user is logged in const currentUserInfo = wx.getStorageSync('userInfo'); if (!currentUserInfo || !currentUserInfo.token) { wx.hideLoading(); wx.showModal({ title: '未登录', content: '请先登录后再添加好友', showCancel: true, cancelText: '取消', confirmText: '去登录', success: (res) => { if (res.confirm) { wx.navigateTo({ url: '/pages/login/login' }); } } }); return; } // Use your existing API method const response = await apiClient.addFriend( userData.userId, // targetId '通过扫描二维码添加' // message ); wx.hideLoading(); if (response && response.code === 0) { // Success wx.showModal({ title: '添加成功', content: `已成功添加 ${userData.username} 为好友`, showCancel: false, confirmText: '确定', success: () => { // Navigate to friends list or chat wx.showActionSheet({ itemList: ['查看好友列表', '开始聊天'], success: (actionRes) => { if (actionRes.tapIndex === 0) { wx.navigateTo({ url: '/pages/social/friends/friends' }); } else if (actionRes.tapIndex === 1) { wx.navigateTo({ url: `/pages/message/chat/chat?userId=${userData.userId}&username=${userData.username}` }); } } }); } }); // Update local friends list if you have one cached this.updateLocalFriendsList(userData); } else if (response && (response.code === 40001 || response.message?.includes('已经是好友'))) { // User already a friend (adjust code based on your backend response) wx.showModal({ title: '提示', content: `${userData.username} 已经是您的好友了`, showCancel: true, cancelText: '知道了', confirmText: '开始聊天', success: (res) => { if (res.confirm) { wx.navigateTo({ url: `/pages/message/chat/chat?userId=${userData.userId}&username=${userData.username}` }); } } }); } else if (response && (response.code === 40002 || response.message?.includes('等待确认'))) { // Friend request sent (pending approval) wx.showToast({ title: '好友请求已发送,等待对方确认', icon: 'none', duration: 3000 }); } else if (response && (response.code === 40404 || response.message?.includes('用户不存在'))) { // User not found wx.showModal({ title: '用户不存在', content: '该用户可能已注销或不存在', showCancel: false, confirmText: '知道了' }); } else { // Other error const errorMsg = response?.message || '添加好友失败'; wx.showToast({ title: errorMsg, icon: 'none', duration: 2000 }); } } catch (error) { wx.hideLoading(); console.error('添加好友出错:', error); // Handle specific error messages let errorMsg = '添加好友失败'; if (error.message) { if (error.message.includes('目标用户ID不能为空')) { errorMsg = '用户ID无效'; } else if (error.message.includes('好友申请留言不能超过100字符')) { errorMsg = '申请留言过长'; } else { errorMsg = error.message; } } wx.showModal({ title: '添加失败', content: errorMsg, showCancel: true, cancelText: '取消', confirmText: '重试', success: (res) => { if (res.confirm) { this.addFriend(userData); } } }); } }, // Update local friends list cache updateLocalFriendsList: function(newFriend) { try { let friendsList = wx.getStorageSync('friendsList') || []; // Check if friend already exists const existingIndex = friendsList.findIndex(friend => friend.userId === newFriend.userId || friend.customId === newFriend.userId ); if (existingIndex === -1) { // Add new friend to local cache friendsList.push({ userId: newFriend.userId, customId: newFriend.userId, nickname: newFriend.username, avatar: newFriend.avatar || '', addedAt: new Date().toISOString(), status: 'accepted' // or 'pending' if requires approval }); wx.setStorageSync('friendsList', friendsList); } } catch (error) { console.error('更新本地好友列表失败:', error); } }, // Handle generic QR code scan handleGenericScan: function(result) { wx.showModal({ title: '二维码结果', content: result, showCancel: false, confirmText: 'OK' }); } });