miniprogramme/pages/qr-code/qr-code.js
2025-09-12 16:08:17 +08:00

484 lines
No EOL
13 KiB
JavaScript

// Get application instance
const app = getApp();
const apiClient = require('../../utils/api-client.js'); // Import your API client
// Page configuration
Page({
// Page data
data: {
username: 'Loading...', // User name (loading state)
userId: 'Loading...', // 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() {
console.log('QR Code page loaded');
// Check theme settings first
const isDarkMode = wx.getStorageSync('isDarkMode') || false;
this.setData({
isDarkMode: isDarkMode
});
// Load user information
this.loadUserInfo();
},
// Load user information with guaranteed fallback
loadUserInfo: function() {
console.log('Starting to load user info...');
// Show loading
wx.showLoading({
title: 'Loading...',
mask: true
});
// Start with test data immediately to ensure something always works
const testUserData = this.getTestUserData();
console.log('Using test user data:', testUserData);
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: 'Using test data',
icon: 'none',
duration: 2000
});
// Try to get real data in background (optional)
this.tryLoadRealUserData();
},
// Try to load real user data in background (won't break if fails)
tryLoadRealUserData: async function() {
try {
console.log('Attempting to load real user data...');
// Try local storage first
let userInfo = wx.getStorageSync('userInfo');
// Try API if no local data
if (!userInfo || !userInfo.user) {
console.log('No local user info, trying API...');
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) {
console.log('Got real user data, updating UI...');
this.setData({
username: userInfo.user.nickname || userInfo.user.customId || 'Real User',
userId: userInfo.user.customId || userInfo.user.id || 'REAL001',
userInfo: userInfo,
isTestData: false
});
// Regenerate QR code with real data
this.generateQRCodeWithData(userInfo);
wx.showToast({
title: 'Real data loaded',
icon: 'success',
duration: 1500
});
}
} catch (error) {
console.log('Failed to load real data, staying with test data:', error);
// Do nothing - we already have test data working
}
},
// Generate QR code with provided user data (guaranteed to work)
generateQRCodeWithData: function(userData) {
console.log('Generating QR code with data:', userData);
if (!userData || !userData.user) {
console.error('No user data provided for QR generation');
return;
}
// Create QR code data object
const qrData = {
type: 'user_card',
userId: userData.user.customId || userData.user.id,
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()
};
console.log('QR data object created:', qrData);
// Convert to JSON string for QR code
const qrCodeData = JSON.stringify(qrData);
console.log('QR code data string length:', qrCodeData.length);
// 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}`;
console.log('Generated QR code URL:', qrCodeUrl);
this.setData({
qrCodeUrl: qrCodeUrl
});
console.log('QR code URL set in data');
} catch (error) {
console.error('Failed to generate QR code 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
});
console.log('Using fallback QR code URL:', fallbackUrl);
}
},
// Navigate back
navigateBack: function() {
wx.navigateBack({
delta: 1
});
},
// Show menu
showMenu: function() {
wx.showActionSheet({
itemList: ['Save Image', 'Share QR Code', 'Refresh Data', 'Use Test Data', 'Settings'],
success: (res) => {
switch (res.tapIndex) {
case 0:
this.saveQRCode();
break;
case 1:
this.shareQRCode();
break;
case 2:
this.refreshUserInfo();
break;
case 3:
this.forceTestData();
break;
case 4:
wx.navigateTo({
url: '/pages/settings/settings'
});
break;
}
}
});
},
// Force test data (for debugging)
forceTestData: function() {
console.log('Forcing test data...');
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() {
console.log('Refreshing user info...');
this.setData({
isLoading: true,
username: 'Refreshing...',
userId: 'Please wait...',
qrCodeUrl: ''
});
// Always start with test data, then try real data
this.loadUserInfo();
},
// Refresh QR code
refreshQRCode: function() {
console.log('Refreshing QR code...');
if (!this.data.userInfo) {
console.log('No user info available, loading test data...');
this.loadUserInfo();
return;
}
wx.showLoading({
title: 'Refreshing QR code...'
});
// Clear current QR code
this.setData({
qrCodeUrl: ''
});
// Regenerate with current data
setTimeout(() => {
this.generateQRCodeWithData(this.data.userInfo);
wx.hideLoading();
wx.showToast({
title: 'QR code refreshed',
icon: 'success'
});
}, 500);
},
// QR code image load success
onQRCodeLoad: function() {
console.log('QR code image loaded successfully');
},
// QR code image load error
onQRCodeError: function(e) {
console.error('QR code image failed to load:', e);
// Try to regenerate with simpler data
if (this.data.userInfo) {
console.log('Retrying QR generation with simpler data...');
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: 'No QR code to save',
icon: 'none'
});
return;
}
console.log('Saving QR code:', this.data.qrCodeUrl);
// Download and save
wx.downloadFile({
url: this.data.qrCodeUrl,
success: (res) => {
if (res.statusCode === 200) {
wx.saveImageToPhotosAlbum({
filePath: res.tempFilePath,
success: () => {
wx.showToast({
title: 'Saved successfully',
icon: 'success'
});
},
fail: (error) => {
console.error('Failed to save QR code:', error);
wx.showToast({
title: 'Save failed',
icon: 'none'
});
}
});
}
},
fail: (error) => {
console.error('Failed to download QR code:', error);
wx.showToast({
title: 'Download failed',
icon: 'none'
});
}
});
},
// Share QR code
shareQRCode: function() {
if (!this.data.qrCodeUrl) {
wx.showToast({
title: 'No QR code to share',
icon: 'none'
});
return;
}
console.log('Sharing QR code:', this.data.qrCodeUrl);
wx.downloadFile({
url: this.data.qrCodeUrl,
success: (res) => {
if (res.statusCode === 200) {
wx.showShareImageMenu({
path: res.tempFilePath,
success: () => {
console.log('Share successful');
},
fail: (error) => {
console.error('Share failed:', error);
wx.showToast({
title: 'Share failed',
icon: 'none'
});
}
});
}
},
fail: (error) => {
console.error('Failed to download for sharing:', error);
wx.showToast({
title: 'Share failed',
icon: 'none'
});
}
});
},
// Scan QR code
scanQRCode: function() {
console.log('Starting QR code scan...');
wx.scanCode({
onlyFromCamera: true,
scanType: ['qrCode'],
success: (res) => {
console.log('Scan successful:', res.result);
try {
const scannedData = JSON.parse(res.result);
if (scannedData.type === 'user_card') {
this.handleUserCardScan(scannedData);
} else {
this.handleGenericScan(res.result);
}
} catch (error) {
console.log('Not JSON data, treating as text');
this.handleGenericScan(res.result);
}
},
fail: (error) => {
console.error('Scan failed:', error);
wx.showToast({
title: 'Scan failed',
icon: 'none'
});
}
});
},
// Handle user card QR code scan
handleUserCardScan: function(userData) {
console.log('Scanned user card:', userData);
const isTestData = userData.isTestData || false;
const dataType = isTestData ? ' (Test Data)' : '';
wx.showModal({
title: `User Card Scanned${dataType}`,
content: `Username: ${userData.username}\nUser ID: ${userData.userId}${isTestData ? '\n\nNote: This is test data' : ''}`,
showCancel: true,
cancelText: 'Cancel',
confirmText: isTestData ? 'OK' : 'Add Friend',
success: (res) => {
if (res.confirm && !isTestData) {
wx.showToast({
title: 'Add friend feature coming soon',
icon: 'none'
});
} else if (res.confirm && isTestData) {
wx.showToast({
title: 'Cannot add test user',
icon: 'none'
});
}
}
});
},
// Handle generic QR code scan
handleGenericScan: function(result) {
console.log('Generic scan result:', result);
wx.showModal({
title: 'QR Code Result',
content: result,
showCancel: false,
confirmText: 'OK'
});
}
});