HomeLease/utils/loading-manager.js
2025-08-19 08:55:34 +08:00

237 lines
5.1 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 全局自动Loading管理器
* 提供智能的Loading状态管理支持并发请求计数和超时保护
*/
// 环境配置
const ENV_CONFIG = {
develop: {
loadingText: '加载中~',
loadingTime: 100,
},
trial: {
loadingText: '加载中~',
loadingTime: 100,
},
release: {
loadingText: '加载中~',
loadingTime: 100,
},
}
// 获取当前环境配置
const getCurrentConfig = () => {
try {
const { envVersion } = wx.getAccountInfoSync().miniProgram
console.log('当前环境:', envVersion)
return ENV_CONFIG[envVersion] || ENV_CONFIG.release
} catch (error) {
console.warn('获取环境失败,默认使用正式环境:', error)
return ENV_CONFIG.release
}
}
const config = getCurrentConfig()
// 全局状态管理
let isLoading = false
let loadingTimer = null
let loadingCount = 0 // 请求计数器
/**
* 设置loading超时自动清除
*/
const setLoadingTimeout = () => {
if (loadingTimer) {
clearTimeout(loadingTimer)
}
loadingTimer = setTimeout(() => {
console.warn('Loading超时强制清除')
forceHideLoading()
}, 30000) // 30秒超时
}
/**
* 显示加载状态
* @param {string} text - 加载提示文字
*/
function showLoading(text = config.loadingText) {
try {
loadingCount++
if (!isLoading) {
isLoading = true
uni.showLoading({
title: text,
mask: true,
})
// 设置超时清除
setLoadingTimeout()
console.log('显示Loading:', text)
}
} catch (error) {
console.warn('显示loading失败:', error)
}
}
/**
* 隐藏加载状态
*/
function hideLoading() {
try {
loadingCount--
if (loadingCount > 0) {
console.log('还有其他请求在进行不隐藏Loading, 剩余请求数:', loadingCount)
return // 还有其他请求在进行
}
if (isLoading) {
isLoading = false
// 清除超时定时器
if (loadingTimer) {
clearTimeout(loadingTimer)
loadingTimer = null
}
uni.hideLoading()
console.log('隐藏Loading')
}
} catch (error) {
console.warn('隐藏loading失败:', error)
}
}
/**
* 强制隐藏loading
*/
export function forceHideLoading() {
try {
isLoading = false
loadingCount = 0
if (loadingTimer) {
clearTimeout(loadingTimer)
loadingTimer = null
}
uni.hideLoading()
console.log('强制隐藏Loading')
} catch (error) {
console.warn('强制隐藏loading失败:', error)
}
}
/**
* 获取当前loading状态
* @returns {Object} loading状态信息
*/
export function getLoadingStatus() {
return {
isLoading,
loadingCount,
hasTimer: !!loadingTimer,
}
}
/**
* 设置loading配置
* @param {Object} newConfig - 新的配置
*/
export function setLoadingConfig(newConfig) {
Object.assign(config, newConfig)
console.log('更新Loading配置:', config)
}
/**
* 获取loading配置
* @returns {Object} 当前配置
*/
export function getLoadingConfig() {
return { ...config }
}
/**
* 显示loading带延迟
* @param {string} text - 加载提示文字
* @param {number} delay - 延迟时间(毫秒)
*/
export function showLoadingWithDelay(text = config.loadingText, delay = config.loadingTime) {
setTimeout(() => {
showLoading(text)
}, delay)
}
/**
* 隐藏loading带延迟
* @param {number} delay - 延迟时间(毫秒)
*/
export function hideLoadingWithDelay(delay = 500) {
setTimeout(() => {
hideLoading()
}, delay)
}
/**
* 初始化全局loading管理器
*/
export function initGlobalLoadingManager() {
// 监听页面显示事件
uni.$on('page-show', () => {
console.log('页面显示检查loading状态')
// 页面显示时检查loading状态如果超时则清除
if (isLoading && loadingTimer) {
const remainingTime = 30000 - (Date.now() - (loadingTimer._startTime || Date.now()))
if (remainingTime <= 0) {
console.warn('页面显示时发现超时loading强制清除')
forceHideLoading()
}
}
})
// 监听页面隐藏事件
uni.$on('page-hide', () => {
console.log('页面隐藏')
})
// 监听应用显示事件
uni.$on('app-show', () => {
console.log('应用显示')
})
// 监听应用隐藏事件
uni.$on('app-hide', () => {
console.log('应用隐藏清除loading')
forceHideLoading()
})
console.log('全局loading管理器已初始化')
}
/**
* 简化的自动loading管理类
*/
export class AutoLoadingManager {
constructor() {
this.isActive = false
}
// 显示loading可选
show(text = '加载中...') {
this.isActive = true
// 这里可以选择是否显示额外的loading
// 默认情况下所有API调用都会自动显示loading
}
// 隐藏loading可选
hide() {
this.isActive = false
// 这里可以选择是否手动隐藏loading
// 默认情况下API调用完成后会自动隐藏loading
}
// 销毁管理器
destroy() {
this.isActive = false
// 页面卸载时可以选择是否强制清除loading
// forceHideLoading()
}
}
// 导出内部方法供request.js使用
export { showLoading, hideLoading, config }