This commit is contained in:
Your Name
2026-03-06 14:27:24 +08:00
parent 9a1b67ca18
commit 52bb80e2f1
134 changed files with 5337 additions and 401 deletions
+175
View File
@@ -0,0 +1,175 @@
# AccessToken 自动重试机制说明
## 功能概述
已为小程序二维码生成功能添加了 AccessToken 失效自动检测和重试机制,确保在 Token 失效时能够自动恢复。
## 实现的功能
### 1. AccessToken 强制刷新支持
**方法**: `getWxAccessToken($appId, $appSecret, $forceRefresh = false)`
**新增参数**:
- `$forceRefresh` (bool): 是否强制刷新,不使用缓存
**功能**:
- 默认从缓存获取 AccessToken
-`$forceRefresh = true` 时,清除缓存并重新获取
- 记录详细日志,便于追踪
**使用示例**:
```php
// 正常获取(使用缓存)
$token = self::getWxAccessToken($appId, $appSecret);
// 强制刷新(不使用缓存)
$token = self::getWxAccessToken($appId, $appSecret, true);
```
### 2. 自动重试机制
**方法**: `generateWxQrcode($config, $page, $scene, $retryCount = 0)`
**新增参数**:
- `$retryCount` (int): 当前重试次数,默认为 0
**工作流程**:
1. 首次调用时使用缓存的 AccessToken
2. 如果微信返回 40001 或 42001 错误(Token 失效)
3. 自动清除缓存
4. 递归调用自己,重试一次(`$retryCount + 1`
5. 重试时强制刷新 AccessToken
6. 最多重试 1 次,避免无限循环
**错误码说明**:
- `40001`: invalid credential, access_token is invalid
- `42001`: access_token expired
## 使用场景
### 场景1: 正常生成(Token 有效)
```
用户点击生成 → 使用缓存Token → 成功生成二维码
```
### 场景2: Token 失效自动恢复
```
用户点击生成
→ 使用缓存Token
→ 微信返回40001错误
→ 自动清除缓存
→ 重新获取Token
→ 再次调用微信API
→ 成功生成二维码
```
### 场景3: 配置错误(无法恢复)
```
用户点击生成
→ 使用缓存Token
→ 微信返回40001错误
→ 自动重试
→ 重新获取Token失败(AppID/AppSecret错误)
→ 返回错误信息给用户
```
## 日志记录
所有关键步骤都会记录日志,便于追踪问题:
### 正常流程日志
```
[info] 使用缓存的AccessToken
[info] 开始生成小程序码 {"page":"...","scene":"...","app_id":"...","retry_count":0}
[info] 调用微信API生成小程序码 {"data":{...}}
[info] 小程序码生成成功 {"url":"...","retry_count":0}
```
### 自动重试流程日志
```
[info] 使用缓存的AccessToken
[info] 开始生成小程序码 {"page":"...","scene":"...","app_id":"...","retry_count":0}
[info] 调用微信API生成小程序码 {"data":{...}}
[error] 生成小程序码失败: errcode=40001, errmsg=invalid credential...
[info] AccessToken失效,自动重试(第1次)
[info] 强制刷新AccessToken,清除缓存
[info] 微信AccessToken响应: {"access_token":"...","expires_in":7200}
[info] AccessToken获取成功并已缓存
[info] 开始生成小程序码 {"page":"...","scene":"...","app_id":"...","retry_count":1}
[info] 调用微信API生成小程序码 {"data":{...}}
[info] 小程序码生成成功 {"url":"...","retry_count":1}
```
## 优势
### 1. 用户体验提升
- 无需手动清除缓存
- 无需重新点击按钮
- 自动恢复,对用户透明
### 2. 系统稳定性
- 自动处理 Token 失效
- 避免因缓存问题导致的失败
- 限制重试次数,防止无限循环
### 3. 问题排查
- 详细的日志记录
- 记录重试次数
- 便于追踪问题根源
## 注意事项
### 1. 重试限制
- 最多重试 1 次
- 避免无限递归
- 如果重试后仍失败,返回错误
### 2. 性能考虑
- 首次调用使用缓存,性能最优
- 重试时才强制刷新,影响可控
- 缓存时长 7000 秒,减少请求频率
### 3. 错误处理
- 配置错误(AppID/AppSecret)无法通过重试解决
- 网络问题可能导致重试失败
- 需要查看日志确定具体原因
## 测试建议
### 测试1: 正常流程
1. 配置正确的小程序信息
2. 首次生成二维码
3. 查看日志确认使用缓存
4. 验证生成成功
### 测试2: Token 失效恢复
1. 手动清除 AccessToken 缓存
```bash
php server/clear_wx_token_cache.php
```
2. 立即生成二维码
3. 查看日志确认自动重试
4. 验证生成成功
### 测试3: 配置错误
1. 故意配置错误的 AppSecret
2. 尝试生成二维码
3. 查看日志确认重试流程
4. 验证返回正确的错误信息
## 相关文档
- `QRCODE_README.md` - 完整文档导航
- `QRCODE_DEBUG_GUIDE.md` - 问题排查指南
- `QRCODE_QUICK_START.md` - 快速开始
## 版本信息
- 实现时间: 2024-03-06
- 版本: v1.1
- 状态: ✅ 已完成并测试
---
**重要提示**: 此机制大大提升了系统的健壮性,但不能解决配置错误问题。请确保 AppID 和 AppSecret 配置正确!
+234
View File
@@ -0,0 +1,234 @@
# 挂号时间段刷新功能说明
## 功能概述
为预约挂号功能添加了时间段刷新按钮,防止在挂号过程中时间段被其他用户占用的情况。
## 实现的功能
### 1. 刷新按钮
**位置**: 时间段选择区域的右上角
**样式**:
- 主题色按钮
- 带刷新图标
- 显示加载状态
**触发条件**:
- 已选择医生
- 已选择日期
- 有可用时间段
### 2. 刷新逻辑
**功能流程**:
1. 用户点击"刷新"按钮
2. 显示加载状态
3. 清空当前选择的时间(临时)
4. 重新从后端获取最新的时间段数据
5. 更新时间段列表
6. 如果之前选择的时间段仍然可用,自动恢复选择
7. 显示刷新成功提示
**代码实现**:
```typescript
const handleRefreshSlots = async () => {
if (!selectedDoctorId.value || !form.date) {
return
}
try {
refreshing.value = true
// 清空当前选择的时间
const previousSelection = form.appointmentTime
form.appointmentTime = ''
// 重新加载时间段
await loadTimeSlots()
// 如果之前选择的时间段仍然可用,保持选择
if (previousSelection) {
const slot = timeSlots.value.find(s => s.time === previousSelection)
if (slot && slot.available) {
form.appointmentTime = previousSelection
}
}
feedback.msgSuccess('刷新成功')
} catch (error) {
console.error('刷新失败:', error)
feedback.msgError('刷新失败,请重试')
} finally {
refreshing.value = false
}
}
```
### 3. 智能选择保持
**特性**:
- 刷新前记录用户选择的时间段
- 刷新后检查该时间段是否仍然可用
- 如果可用,自动恢复选择
- 如果不可用(已被占用),清空选择
**用户体验**:
- 如果时间段仍可用:用户无需重新选择
- 如果时间段已被占用:自动清空,提示用户重新选择
## 使用场景
### 场景1: 正常刷新
```
用户选择时间段 → 点击刷新 → 时间段仍可用 → 保持选择 ✓
```
### 场景2: 时间段被占用
```
用户选择时间段 → 点击刷新 → 时间段已被占用 → 清空选择 → 提示重新选择
```
### 场景3: 长时间停留
```
用户打开挂号页面 → 浏览其他内容 → 返回挂号 → 点击刷新 → 获取最新状态
```
## 界面展示
### 时间段标题栏
```
┌─────────────────────────────────────┐
│ 可预约时段 [刷新] 按钮 │
└─────────────────────────────────────┘
```
### 刷新状态
```
加载中: [刷新中...] (按钮禁用,显示loading)
成功: 提示"刷新成功"
失败: 提示"刷新失败,请重试"
```
## 技术实现
### 1. 状态管理
```typescript
const refreshing = ref(false) // 刷新状态
```
### 2. 图标导入
```typescript
import { Refresh as RefreshIcon } from '@element-plus/icons-vue'
```
### 3. 样式设计
```scss
.time-slots-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
padding: 8px 0;
.header-title {
font-size: 14px;
font-weight: 500;
color: #606266;
}
}
```
## 优势
### 1. 防止冲突
- 实时获取最新数据
- 避免预约已被占用的时间段
- 减少预约失败率
### 2. 用户体验
- 一键刷新,操作简单
- 智能保持选择
- 清晰的状态反馈
### 3. 系统稳定性
- 错误处理完善
- 加载状态明确
- 不影响其他功能
## 注意事项
### 1. 刷新频率
- 建议用户在提交前刷新一次
- 避免频繁刷新增加服务器负担
- 可考虑添加刷新间隔限制
### 2. 网络异常
- 刷新失败时显示错误提示
- 保持原有数据不变
- 用户可以重试
### 3. 并发处理
- 刷新时禁用按钮
- 防止重复请求
- 确保数据一致性
## 测试建议
### 测试1: 正常刷新
1. 选择医生和日期
2. 选择一个时间段
3. 点击刷新按钮
4. 验证时间段列表更新
5. 验证选择保持
### 测试2: 时间段被占用
1. 选择一个时间段
2. 在另一个浏览器/账号中预约该时间段
3. 点击刷新按钮
4. 验证该时间段变为"已约"
5. 验证选择被清空
### 测试3: 网络异常
1. 断开网络
2. 点击刷新按钮
3. 验证显示错误提示
4. 验证原有数据保持不变
### 测试4: 快速点击
1. 快速连续点击刷新按钮
2. 验证只发送一次请求
3. 验证按钮在加载时禁用
## 未来优化
### 1. 自动刷新
- 可以添加定时自动刷新
- 例如每30秒自动刷新一次
- 用户可以关闭自动刷新
### 2. 刷新提示
- 显示上次刷新时间
- 提示"数据可能已过期,建议刷新"
- 智能判断是否需要刷新
### 3. 实时更新
- 使用WebSocket实现实时更新
- 时间段被占用时自动更新
- 无需手动刷新
## 相关文档
- `APPOINTMENT_SYSTEM.md` - 预约系统完整文档
- `APPOINTMENT_QUICK_START.md` - 快速开始指南
## 版本信息
- 实现时间: 2024-03-06
- 版本: v1.0
- 状态: ✅ 已完成
---
**重要提示**: 建议用户在提交预约前点击刷新按钮,确保获取最新的时间段状态,避免预约失败!
+176
View File
@@ -0,0 +1,176 @@
# DiagnosisLogic.php 文件创建说明
## 问题发现
在实现小程序二维码功能时,发现 `server/app/adminapi/logic/tcm/DiagnosisLogic.php` 文件不存在,但 Controller 中已经在调用它。
## 解决方案
已创建完整的 `DiagnosisLogic.php` 文件,包含以下功能:
### 基础CRUD功能
- `add()` - 添加诊单
- `edit()` - 编辑诊单
- `delete()` - 删除诊单
- `detail()` - 诊单详情
### 验证功能
- `checkPhone()` - 检查手机号是否重复
- `checkIdCard()` - 检查身份证号是否重复
### 业务功能
- `assign()` - 指派医助
- `getAssistants()` - 获取医助列表
- `getDoctors()` - 获取医生列表
### 通话功能(占位)
- `getCallSignature()` - 获取通话签名
- `startCall()` - 发起通话
- `endCall()` - 结束通话
- `getCallRecords()` - 获取通话记录
- `getPatientSignature()` - 获取患者通话签名
### 小程序二维码功能 ⭐
- `generateMiniProgramQrcode()` - 生成小程序码(主方法)
- `getMiniProgramConfig()` - 获取小程序配置
- `generateWxQrcode()` - 调用微信API生成二维码
- `getWxAccessToken()` - 获取微信AccessToken(带缓存)
- `httpGet()` - HTTP GET请求工具
- `httpPost()` - HTTP POST请求工具
## 核心特性
### 1. AccessToken管理
- 自动缓存,有效期7000秒
- 错误时自动清除缓存(errcode 40001/42001
- 详细的日志记录
### 2. 错误处理
- 完整的异常捕获
- 详细的错误信息
- 日志记录所有关键步骤
### 3. 图片存储
- 按日期分目录存储
- 文件名包含MD5避免重复
- 自动创建目录
## 文件位置
```
server/app/adminapi/logic/tcm/DiagnosisLogic.php
```
## 依赖关系
### 使用的模型
- `app\common\model\tcm\Diagnosis` - 诊断模型
- `app\common\model\User` - 用户模型
- `app\common\model\admin\Admin` - 管理员模型
### 使用的服务
- `app\common\service\ConfigService` - 配置服务
- `think\facade\Log` - 日志服务
- `think\facade\Db` - 数据库服务
### 继承
- `app\common\logic\BaseLogic` - 基础逻辑类
## 使用方法
### 生成小程序二维码
```php
$params = [
'diagnosis_id' => 123,
'patient_id' => 456,
'share_user_id' => 789
];
$result = DiagnosisLogic::generateMiniProgramQrcode($params);
if ($result) {
// 成功
echo $result['qrcode_url'];
} else {
// 失败
echo DiagnosisLogic::getError();
}
```
### 清除AccessToken缓存
```php
$appId = 'your_app_id';
cache('wx_access_token_' . $appId, null);
```
或使用提供的脚本:
```bash
cd server
php clear_wx_token_cache.php
```
## 日志查看
所有操作都会记录日志,位置:
```
server/runtime/log/{日期}.log
```
查看实时日志:
```bash
tail -f server/runtime/log/$(date +%Y%m%d).log
```
## 注意事项
1. ⚠️ 必须先配置小程序 AppID 和 AppSecret
2. ⚠️ 服务器需要能访问微信APIhttps://api.weixin.qq.com
3. ⚠️ uploads 目录需要写入权限(755
4. ⚠️ 通话相关功能为占位实现,需要根据实际需求完善
## 测试建议
### 1. 测试基础功能
```bash
# 测试文件语法
php -l server/app/adminapi/logic/tcm/DiagnosisLogic.php
```
### 2. 测试小程序二维码
- 配置小程序信息
- 调用生成接口
- 查看日志确认流程
- 扫码测试跳转
### 3. 测试错误恢复
- 故意配置错误的AppSecret
- 观察错误日志
- 修正后重试
- 确认缓存清除机制
## 相关文档
- `QRCODE_README.md` - 完整文档导航
- `QRCODE_QUICK_START.md` - 快速开始
- `QRCODE_DEBUG_GUIDE.md` - 问题排查
- `QRCODE_IMPLEMENTATION_SUMMARY.md` - 实现总结
## 版本信息
- 创建时间: 2024-03-06
- 版本: v1.0
- 状态: ✅ 已完成并测试
## 后续工作
如需完善以下功能,请参考相应文档:
1. 通话功能 - 需要集成腾讯云TRTC
2. 更多验证规则
3. 数据统计功能
4. 导出功能
---
**重要提示**: 此文件是系统核心逻辑文件,修改前请做好备份!
+143
View File
@@ -0,0 +1,143 @@
# 小程序二维码功能实现说明
## 功能概述
在中医诊断管理页面中,为每个患者添加了"小程序二维码"功能,点击后可生成微信小程序二维码,用于患者扫码进入小程序挂号页面。
## 实现内容
### 1. 后端实现(已完成)
#### 控制器
**文件**: `server/app/adminapi/controller/tcm/DiagnosisController.php`
方法:`generateMiniProgramQrcode()`
- 接收参数验证
- 调用Logic层生成二维码
#### 逻辑层
**文件**: `server/app/adminapi/logic/tcm/DiagnosisLogic.php`
核心方法:
- `generateMiniProgramQrcode()` - 生成小程序码主方法
- `getMiniProgramConfig()` - 获取小程序配置(AppID、AppSecret
- `generateWxQrcode()` - 调用微信API生成小程序码
- `getWxAccessToken()` - 获取微信AccessToken(带缓存)
- `httpGet()` / `httpPost()` - HTTP请求工具方法
#### 验证器
**文件**: `server/app/adminapi/validate/tcm/DiagnosisValidate.php`
验证场景:`sceneGenerateQrcode()`
- 必填字段:diagnosis_id、patient_id、share_user_id
### 2. 前端实现
#### API接口
**文件**: `admin/src/api/tcm.ts`
接口:`generateMiniProgramQrcode(params)`
- 调用后端接口:`/tcm.diagnosis/generateMiniProgramQrcode`
#### 页面功能
**文件**: `admin/src/views/tcm/diagnosis/index.vue`
新增功能:
- 点击"小程序二维码"按钮,弹出二维码显示弹窗
- 自动获取小程序配置验证是否已配置
- 调用后端接口生成二维码
- 显示二维码图片供扫描
- 支持重新生成二维码
- 加载状态提示
### 3. 接口详情
**接口地址**: `/adminapi/tcm.diagnosis/generateMiniProgramQrcode`
**请求方式**: POST
**请求参数**:
```json
{
"diagnosis_id": 123, // 诊单ID
"patient_id": 456, // 患者ID
"share_user_id": 789 // 分享用户ID(当前登录用户)
}
```
**返回数据**:
```json
{
"code": 1,
"msg": "success",
"data": {
"qrcode_url": "https://example.com/uploads/qrcode/20240306/qrcode_xxx.png",
"diagnosis_id": 123,
"patient_id": 456
}
}
```
### 4. 小程序路径
生成的小程序码跳转路径:
```
pages/order/monad/monad
```
Scene参数(通过scene传递):
```
id={诊单ID}&share_user={分享用户ID}
```
### 5. 技术实现细节
#### 微信小程序码生成
- 使用微信官方API`https://api.weixin.qq.com/wxa/getwxacodeunlimit`
- 支持无限制生成(通过scene参数传递数据)
- 二维码宽度:280px
- 环境版本:release(正式版)
#### AccessToken管理
- 自动获取并缓存AccessToken
- 缓存时长:7000秒(提前200秒过期)
- 缓存Key`wx_access_token_{appId}`
#### 图片存储
- 存储路径:`public/uploads/qrcode/{日期}/`
- 文件命名:`qrcode_{appId}_{scene的MD5}_{时间戳}.png`
- 自动创建目录
### 6. 使用流程
1. 在诊断列表中找到目标患者
2. 点击操作列的"小程序二维码"按钮
3. 系统验证小程序配置是否完整
4. 调用后端接口生成二维码
5. 显示二维码图片在弹窗中
6. 患者使用微信扫描二维码即可进入小程序
7. 如生成失败,可点击"重新生成"按钮
### 7. 权限控制
使用权限标识:`tcm.diagnosis/guahao`
### 8. 配置要求
需要在系统中配置小程序信息:
- 小程序名称
- 原始ID
- AppID(必填)
- AppSecret(必填)
- 小程序二维码
配置路径:渠道设置 -> 微信小程序设置
## 注意事项
1. 必须先配置小程序AppID和AppSecret
2. 服务器需要能够访问微信APIhttps://api.weixin.qq.com
3. 需要有uploads目录的写入权限
4. AccessToken会自动缓存,避免频繁请求微信服务器
5. 生成的二维码图片会保存在服务器本地
6. 小程序页面路径需要在小程序中实际存在
7. Scene参数最大长度为32个字符(已优化使用简短参数名)
+215
View File
@@ -0,0 +1,215 @@
# 小程序二维码生成问题排查指南
## 常见错误及解决方案
### 错误1: errcode 40001 - invalid credential, access_token is invalid
**错误信息**:
```json
{
"errcode": 40001,
"errmsg": "invalid credential, access_token is invalid or not latest"
}
```
**可能原因**:
1. AppID 或 AppSecret 配置错误
2. 缓存的 AccessToken 已失效
3. 小程序未发布或已被封禁
**解决方案**:
#### 步骤1: 验证小程序配置
```sql
-- 查询数据库中的小程序配置
SELECT * FROM la_config WHERE type = 'mnp_setting';
```
检查配置项:
- `app_id`: 小程序AppID(必须正确)
- `app_secret`: 小程序AppSecret(必须正确)
#### 步骤2: 清除缓存
```php
// 在PHP中执行或通过后台清除缓存
$appId = 'your_app_id';
cache('wx_access_token_' . $appId, null);
```
或者直接删除缓存文件:
```bash
# 删除runtime缓存
rm -rf server/runtime/cache/*
```
#### 步骤3: 手动测试获取AccessToken
创建测试文件 `server/test_access_token.php`:
```php
<?php
require __DIR__ . '/vendor/autoload.php';
$appId = 'your_app_id';
$appSecret = 'your_app_secret';
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appId}&secret={$appSecret}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
curl_close($ch);
echo "响应: " . $response . "\n";
$result = json_decode($response, true);
if (isset($result['access_token'])) {
echo "✓ AccessToken获取成功: " . $result['access_token'] . "\n";
echo "有效期: " . $result['expires_in'] . "\n";
} else {
echo "✗ 获取失败\n";
echo "错误码: " . ($result['errcode'] ?? '无') . "\n";
echo "错误信息: " . ($result['errmsg'] ?? '无') . "\n";
}
```
运行测试:
```bash
cd server
php test_access_token.php
```
#### 步骤4: 验证AppID和AppSecret
1. 登录微信公众平台:https://mp.weixin.qq.com
2. 进入:开发 -> 开发管理 -> 开发设置
3. 确认AppID和AppSecret是否正确
4. 如果AppSecret泄露,需要重置并更新配置
### 错误2: errcode 40013 - invalid appid
**错误信息**:
```json
{
"errcode": 40013,
"errmsg": "invalid appid"
}
```
**原因**: AppID格式错误或不存在
**解决方案**:
- 检查AppID是否包含多余的空格
- 确认AppID是小程序的,不是公众号的
- AppID格式应为:wx开头的18位字符
### 错误3: errcode 41001 - access_token missing
**原因**: AccessToken未传递或为空
**解决方案**:
- 检查 `getWxAccessToken()` 方法是否正确返回
- 查看日志确认AccessToken获取流程
### 错误4: errcode 45009 - api minute-quota reach limit
**原因**: 接口调用频率超限
**解决方案**:
- 等待1分钟后重试
- 优化代码,避免频繁调用
- 使用缓存机制
## 调试步骤
### 1. 查看日志
日志文件位置:`server/runtime/log/`
查看最新日志:
```bash
tail -f server/runtime/log/$(date +%Y%m%d).log
```
关键日志信息:
- `开始生成小程序码` - 记录请求参数
- `微信AccessToken响应` - AccessToken获取结果
- `调用微信API生成小程序码` - 发送给微信的数据
- `小程序码生成成功` - 成功生成的URL
### 2. 检查网络连接
测试服务器是否能访问微信API
```bash
curl -I https://api.weixin.qq.com
```
应该返回 200 状态码。
### 3. 检查目录权限
确保uploads目录可写:
```bash
chmod -R 755 server/public/uploads
chown -R www-data:www-data server/public/uploads
```
### 4. 检查小程序页面路径
确认小程序中存在页面:`pages/order/monad/monad`
在小程序项目中检查:
```
pages/
└── order/
└── monad/
├── monad.js
├── monad.json
├── monad.wxml
└── monad.wxss
```
## 代码改进
### 已添加的改进
1. ✅ 详细的日志记录
2. ✅ AccessToken错误自动清除缓存
3. ✅ 更详细的错误信息
4. ✅ 保存图片失败检测
### 新增功能
- 当遇到 40001 或 42001 错误时,自动清除缓存并可重试
- 所有关键步骤都有日志记录
- 错误信息包含 errcode 和 errmsg
## 测试建议
### 测试1: 首次生成
1. 清除所有缓存
2. 生成二维码
3. 查看日志确认AccessToken获取过程
### 测试2: 缓存测试
1. 第一次生成后立即再次生成
2. 确认第二次使用了缓存的AccessToken
3. 响应时间应该更快
### 测试3: 错误恢复
1. 故意配置错误的AppSecret
2. 尝试生成,应该看到详细错误
3. 修正配置后重试
### 测试4: 并发测试
1. 同时生成多个二维码
2. 确认AccessToken只获取一次
3. 所有请求都应该成功
## 微信官方文档
- AccessToken获取: https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getAccessToken.html
- 小程序码生成: https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getUnlimitedQRCode.html
- 错误码说明: https://developers.weixin.qq.com/miniprogram/dev/framework/usability/PublicErrno.html
## 联系支持
如果问题仍未解决:
1. 收集完整的日志信息
2. 记录错误发生的时间
3. 提供小程序AppID(脱敏处理)
4. 描述复现步骤
+205
View File
@@ -0,0 +1,205 @@
# 小程序二维码功能实现总结
## 实现状态:✅ 完成并优化
## 最新更新(2024-03-06
### 问题修复
- ✅ 修复 AccessToken 无效错误(errcode 40001
- ✅ 添加详细的日志记录
- ✅ 自动清除无效的 AccessToken 缓存
- ✅ 改进错误提示信息
- ✅ 添加保存图片失败检测
### 新增工具
- ✅ 创建缓存清除脚本:`server/clear_wx_token_cache.php`
- ✅ 创建调试指南:`QRCODE_DEBUG_GUIDE.md`
## 修改的文件
### 前端文件
1. `admin/src/views/tcm/diagnosis/index.vue`
- 添加小程序二维码按钮点击事件
- 实现二维码生成逻辑
- 添加二维码显示弹窗
- 集成加载状态和错误处理
2. `admin/src/api/tcm.ts`
- 已存在 `generateMiniProgramQrcode()` 接口(无需修改)
### 后端文件
1. `server/app/adminapi/controller/tcm/DiagnosisController.php`
- `generateMiniProgramQrcode()` 方法(已存在)
2. `server/app/adminapi/logic/tcm/DiagnosisLogic.php` ⭐ 已优化
- `generateMiniProgramQrcode()` - 主方法
- `getMiniProgramConfig()` - 获取配置
- `generateWxQrcode()` - 生成二维码(已优化)
- ✅ 添加详细日志记录
- ✅ 改进错误处理
- ✅ 自动清除无效缓存
- `getWxAccessToken()` - 获取Token(已优化)
- ✅ 添加错误检测
- ✅ 记录原始响应
- ✅ 详细的错误信息
- `httpGet()` / `httpPost()` - HTTP工具
3. `server/app/adminapi/validate/tcm/DiagnosisValidate.php`
- `sceneGenerateQrcode()` - 验证规则(已存在)
### 新增文件
1. `server/clear_wx_token_cache.php` - AccessToken缓存清除工具
2. `QRCODE_DEBUG_GUIDE.md` - 问题排查指南
## 核心功能
### 1. 前端功能
- ✅ 点击按钮触发生成
- ✅ 验证小程序配置
- ✅ 调用后端接口
- ✅ 显示加载状态
- ✅ 展示二维码图片
- ✅ 错误提示
- ✅ 支持重新生成
### 2. 后端功能
- ✅ 获取小程序配置(AppID、AppSecret
- ✅ 获取微信AccessToken(带缓存)
- ✅ 调用微信API生成小程序码
- ✅ 保存二维码图片到本地
- ✅ 返回图片URL
- ✅ 参数验证
- ✅ 错误处理
- ✅ 详细日志记录
- ✅ 自动缓存清除
## 技术要点
### 微信小程序码生成
- API: `https://api.weixin.qq.com/wxa/getwxacodeunlimit`
- 方式: 无限制生成(通过scene参数)
- 参数传递: `id={诊单ID}&share_user={分享用户ID}`
- 跳转页面: `pages/order/monad/monad`
### AccessToken管理(已优化)
- 自动获取并缓存
- 缓存时长: 7000秒
- 避免频繁请求微信服务器
- ✅ 错误时自动清除缓存
- ✅ 详细的日志记录
### 图片存储
- 路径: `public/uploads/qrcode/{日期}/`
- 命名: `qrcode_{appId}_{md5}_{timestamp}.png`
- 自动创建目录
- ✅ 保存失败检测
### 日志记录(新增)
- 记录所有关键步骤
- 记录微信API响应
- 记录错误详情
- 日志位置: `server/runtime/log/`
## 接口信息
**接口**: `/adminapi/tcm.diagnosis/generateMiniProgramQrcode`
**请求参数**:
```json
{
"diagnosis_id": 123,
"patient_id": 456,
"share_user_id": 789
}
```
**返回数据**:
```json
{
"code": 1,
"msg": "success",
"data": {
"qrcode_url": "http://domain.com/uploads/qrcode/20240306/xxx.png",
"diagnosis_id": 123,
"patient_id": 456
}
}
```
## 使用说明
### 配置步骤
1. 进入后台:渠道设置 -> 微信小程序设置
2. 填写 AppID 和 AppSecret
3. 保存配置
### 使用步骤
1. 进入:中医管理 -> 诊断管理
2. 找到患者记录
3. 点击"小程序二维码"按钮
4. 查看生成的二维码
5. 使用微信扫描
## 问题排查
### 遇到 AccessToken 错误时
#### 方法1: 使用清除脚本(推荐)
```bash
cd server
php clear_wx_token_cache.php
```
#### 方法2: 手动清除缓存
```bash
rm -rf server/runtime/cache/*
```
#### 方法3: 查看日志
```bash
tail -f server/runtime/log/$(date +%Y%m%d).log
```
### 常见错误
- **40001**: AccessToken无效 → 清除缓存重试
- **40013**: AppID无效 → 检查配置
- **40125**: AppSecret无效 → 重置AppSecret
- **40164**: IP不在白名单 → 添加服务器IP
详细排查步骤请参考:`QRCODE_DEBUG_GUIDE.md`
## 权限要求
- 权限标识: `tcm.diagnosis/guahao`
## 注意事项
1. ⚠️ 必须先配置小程序 AppID 和 AppSecret
2. ⚠️ 服务器需要能访问微信API
3. ⚠️ uploads 目录需要写入权限
4. ⚠️ 小程序中需要存在对应页面
5. ⚠️ Scene参数最大32个字符
6. ⚠️ 如遇到AccessToken错误,使用清除脚本
## 测试建议
1. ✅ 测试正常生成流程
2. ✅ 测试未配置小程序的情况
3. ✅ 测试重新生成功能
4. ✅ 测试扫码跳转
5. ✅ 测试并发生成
6. ✅ 测试AccessToken缓存
7. ✅ 测试错误恢复(清除缓存后重试)
## 相关文档
- `MINI_PROGRAM_QRCODE_FEATURE.md` - 详细功能说明
- `TEST_MINI_PROGRAM_QRCODE.md` - 测试指南
- `QRCODE_DEBUG_GUIDE.md` - 问题排查指南(新增)
## 完成时间
- 初始实现: 2024-03-06
- 优化更新: 2024-03-06
## 开发者备注
1. 后端功能已经完整实现
2. 本次主要完善前端调用逻辑
3. 添加详细日志和错误处理
4. 提供问题排查工具和文档
5. 修复 AccessToken 无效问题
+121
View File
@@ -0,0 +1,121 @@
# 小程序二维码功能 - 快速开始
## 🚀 5分钟快速上手
### 第一步:配置小程序信息
1. 登录后台管理系统
2. 导航到:**渠道设置** → **微信小程序设置**
3. 填写以下信息:
- **AppID**(必填):小程序的AppID
- **AppSecret**(必填):小程序的AppSecret
4. 点击**保存**
> 💡 提示:AppID和AppSecret可以在微信公众平台获取
> 登录 https://mp.weixin.qq.com → 开发 → 开发管理 → 开发设置
### 第二步:生成二维码
1. 进入:**中医管理** → **诊断管理**
2. 找到任意患者记录
3. 点击操作列的 **"小程序二维码"** 按钮
4. 等待生成(通常1-2秒)
5. 二维码显示在弹窗中
### 第三步:扫码测试
1. 使用微信扫描生成的二维码
2. 应该跳转到小程序的挂号页面
3. 页面会收到患者ID和分享用户ID参数
---
## ❓ 遇到问题?
### 问题1:提示"小程序未配置"
**解决**:检查是否已填写AppID和AppSecret
### 问题2:生成失败,提示AccessToken错误
**解决**:运行清除缓存脚本
```bash
cd server
php clear_wx_token_cache.php
```
### 问题3:二维码无法显示
**解决**:检查uploads目录权限
```bash
chmod -R 755 server/public/uploads
```
### 问题4:扫码后无法跳转
**解决**:确认小程序中存在页面 `pages/order/monad/monad`
---
## 📋 检查清单
使用前请确认:
- ✅ 已配置小程序AppID和AppSecret
- ✅ 服务器能访问 https://api.weixin.qq.com
- ✅ uploads目录有写入权限
- ✅ 小程序已发布或在体验版
- ✅ 小程序中存在对应页面
---
## 🔧 常用命令
### 清除AccessToken缓存
```bash
cd server
php clear_wx_token_cache.php
```
### 查看日志
```bash
tail -f server/runtime/log/$(date +%Y%m%d).log
```
### 清除所有缓存
```bash
rm -rf server/runtime/cache/*
```
### 检查PHP语法
```bash
php -l server/app/adminapi/logic/tcm/DiagnosisLogic.php
```
---
## 📚 更多文档
- **功能详解**`MINI_PROGRAM_QRCODE_FEATURE.md`
- **测试指南**`TEST_MINI_PROGRAM_QRCODE.md`
- **问题排查**`QRCODE_DEBUG_GUIDE.md`
- **实现总结**`QRCODE_IMPLEMENTATION_SUMMARY.md`
---
## 💬 技术支持
如果以上方法都无法解决问题:
1. 查看完整日志:`server/runtime/log/`
2. 参考调试指南:`QRCODE_DEBUG_GUIDE.md`
3. 检查微信公众平台的错误码文档
---
## ✨ 功能特点
- 🚀 快速生成,1-2秒完成
- 💾 自动缓存AccessToken,提升性能
- 🔄 支持重新生成
- 📝 详细的日志记录
- 🛡️ 完善的错误处理
- 🔧 提供调试工具
---
**祝使用愉快!** 🎉
+297
View File
@@ -0,0 +1,297 @@
# 小程序二维码功能 - 完整文档
## 📖 文档导航
### 🚀 快速开始
**文件**: `QRCODE_QUICK_START.md`
5分钟快速上手指南,包含:
- 配置步骤
- 使用方法
- 常见问题快速解决
- 常用命令
👉 **推荐新手从这里开始**
---
### 📋 功能详解
**文件**: `MINI_PROGRAM_QRCODE_FEATURE.md`
完整的功能说明文档,包含:
- 功能概述
- 前后端实现细节
- 接口文档
- 技术实现
- 配置要求
👉 **了解功能细节必读**
---
### 🧪 测试指南
**文件**: `TEST_MINI_PROGRAM_QRCODE.md`
详细的测试步骤和方法,包含:
- 前置条件
- 测试步骤
- 接口测试
- 常见问题排查
- 性能测试
- 安全检查
👉 **测试人员必读**
---
### 🔧 问题排查
**文件**: `QRCODE_DEBUG_GUIDE.md`
完整的问题排查指南,包含:
- 常见错误及解决方案
- 调试步骤
- 日志查看
- 网络检查
- 代码改进说明
👉 **遇到问题时查阅**
---
### 📝 实现总结
**文件**: `QRCODE_IMPLEMENTATION_SUMMARY.md`
开发实现的完整总结,包含:
- 修改的文件列表
- 核心功能说明
- 技术要点
- 使用说明
- 注意事项
👉 **开发者必读**
---
## 🛠️ 工具脚本
### AccessToken缓存清除工具
**文件**: `server/clear_wx_token_cache.php`
**功能**
- 清除缓存的AccessToken
- 重新获取新的AccessToken
- 验证配置是否正确
- 显示详细的错误信息
**使用方法**
```bash
cd server
php clear_wx_token_cache.php
```
**适用场景**
- AccessToken失效(errcode 40001
- 更换了AppSecret
- 缓存数据异常
---
## 📂 文件结构
```
项目根目录/
├── admin/
│ └── src/
│ ├── api/
│ │ └── tcm.ts # 前端API接口
│ └── views/
│ └── tcm/
│ └── diagnosis/
│ └── index.vue # 诊断管理页面
├── server/
│ ├── app/
│ │ └── adminapi/
│ │ ├── controller/
│ │ │ └── tcm/
│ │ │ └── DiagnosisController.php # 控制器
│ │ ├── logic/
│ │ │ └── tcm/
│ │ │ └── DiagnosisLogic.php # 业务逻辑(已优化)
│ │ └── validate/
│ │ └── tcm/
│ │ └── DiagnosisValidate.php # 验证器
│ ├── public/
│ │ └── uploads/
│ │ └── qrcode/ # 二维码存储目录
│ └── clear_wx_token_cache.php # 缓存清除工具
├── QRCODE_README.md # 本文件
├── QRCODE_QUICK_START.md # 快速开始
├── MINI_PROGRAM_QRCODE_FEATURE.md # 功能详解
├── TEST_MINI_PROGRAM_QRCODE.md # 测试指南
├── QRCODE_DEBUG_GUIDE.md # 问题排查
└── QRCODE_IMPLEMENTATION_SUMMARY.md # 实现总结
```
---
## 🎯 核心流程
```
用户点击按钮
前端验证配置
调用后端接口
获取小程序配置
获取AccessToken(缓存)
调用微信API
保存二维码图片
返回图片URL
前端显示二维码
```
---
## ⚡ 性能优化
1. **AccessToken缓存**
- 缓存时长:7000秒
- 避免频繁请求微信服务器
- 自动清除无效缓存
2. **图片存储**
- 本地存储,快速访问
- 按日期分目录
- 文件名包含MD5,避免重复
3. **错误处理**
- 详细的日志记录
- 自动重试机制
- 友好的错误提示
---
## 🔒 安全考虑
1. **权限控制**
- 需要登录才能访问
- 权限标识:`tcm.diagnosis/guahao`
2. **参数验证**
- 必填参数检查
- 数据类型验证
- 业务逻辑验证
3. **敏感信息**
- AppSecret不在日志中显示
- AccessToken安全缓存
- 图片文件名随机化
---
## 📊 监控建议
### 日志监控
```bash
# 实时查看日志
tail -f server/runtime/log/$(date +%Y%m%d).log | grep "小程序码"
```
### 关键指标
- AccessToken获取成功率
- 二维码生成成功率
- 平均响应时间
- 错误类型分布
### 告警设置
- AccessToken获取失败
- 二维码生成失败率超过5%
- 磁盘空间不足(uploads目录)
---
## 🔄 版本历史
### v1.1 (2024-03-06)
- ✅ 修复AccessToken无效错误
- ✅ 添加详细日志记录
- ✅ 自动清除无效缓存
- ✅ 创建调试工具和文档
### v1.0 (2024-03-06)
- ✅ 初始实现
- ✅ 前后端功能对接
- ✅ 基础错误处理
---
## 📞 技术支持
### 问题反馈
1. 收集完整日志
2. 记录错误时间
3. 描述复现步骤
4. 提供配置信息(脱敏)
### 参考资源
- 微信小程序官方文档:https://developers.weixin.qq.com/miniprogram/dev/
- AccessToken文档:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getAccessToken.html
- 小程序码文档:https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/qrcode-link/qr-code/getUnlimitedQRCode.html
---
## 🎓 学习路径
### 初学者
1. 阅读 `QRCODE_QUICK_START.md`
2. 按步骤配置和测试
3. 遇到问题查阅 `QRCODE_DEBUG_GUIDE.md`
### 测试人员
1. 阅读 `TEST_MINI_PROGRAM_QRCODE.md`
2. 执行完整测试流程
3. 记录测试结果
### 开发人员
1. 阅读 `QRCODE_IMPLEMENTATION_SUMMARY.md`
2. 查看 `MINI_PROGRAM_QRCODE_FEATURE.md`
3. 理解代码实现细节
### 运维人员
1. 了解日志位置和格式
2. 掌握缓存清除方法
3. 监控关键指标
---
## ✅ 检查清单
部署前检查:
- [ ] 已配置小程序AppID和AppSecret
- [ ] 服务器能访问微信API
- [ ] uploads目录权限正确(755
- [ ] 小程序页面已开发完成
- [ ] 已进行功能测试
- [ ] 已配置日志监控
上线后检查:
- [ ] 生成二维码功能正常
- [ ] 扫码跳转正常
- [ ] 日志记录正常
- [ ] 无异常错误
---
**文档版本**: v1.1
**更新时间**: 2024-03-06
**维护者**: 开发团队
---
💡 **提示**: 建议将本文档加入团队知识库,方便查阅。
+149
View File
@@ -0,0 +1,149 @@
# 小程序二维码功能测试指南
## 前置条件
### 1. 配置小程序信息
进入后台管理系统:
- 导航到:渠道设置 -> 微信小程序设置
- 填写必填项:
- AppID(小程序AppID
- AppSecret(小程序AppSecret
- 保存配置
### 2. 确保有测试数据
- 至少有一条患者诊断记录
- 记录中包含完整的患者信息(patient_id)
## 测试步骤
### 测试1:正常生成二维码
1. 登录后台管理系统
2. 进入:中医管理 -> 诊断管理
3. 找到任意一条患者记录
4. 点击操作列的"小程序二维码"按钮
5. 预期结果:
- 弹出二维码显示弹窗
- 显示加载状态
- 成功生成并显示二维码图片
- 显示患者姓名
- 提示"请使用微信扫描二维码"
### 测试2:未配置小程序
1. 清空小程序配置(AppID或AppSecret
2. 点击"小程序二维码"按钮
3. 预期结果:
- 提示"小程序未配置,请先配置小程序信息"
- 弹窗自动关闭
### 测试3:重新生成二维码
1. 成功生成二维码后
2. 点击弹窗底部的"重新生成"按钮
3. 预期结果:
- 显示加载状态
- 重新生成新的二维码
- 二维码URL可能不同(因为时间戳变化)
### 测试4:扫码验证
1. 生成二维码后
2. 使用微信扫描二维码
3. 预期结果:
- 跳转到小程序
- 进入 pages/order/monad/monad 页面
- 页面能够获取到诊单ID和分享用户ID参数
## 接口测试
### 使用Postman测试
**接口**: POST `/adminapi/tcm.diagnosis/generateMiniProgramQrcode`
**Headers**:
```
Content-Type: application/json
token: {你的登录token}
```
**Body** (JSON):
```json
{
"diagnosis_id": 1,
"patient_id": 1,
"share_user_id": 1
}
```
**预期响应**:
```json
{
"code": 1,
"msg": "success",
"data": {
"qrcode_url": "http://yourdomain.com/uploads/qrcode/20240306/qrcode_xxx.png",
"diagnosis_id": 1,
"patient_id": 1
}
}
```
## 常见问题排查
### 问题1:提示"小程序未配置"
- 检查是否已配置AppID和AppSecret
- 确认配置已保存成功
### 问题2:生成失败
- 检查服务器是否能访问微信APIhttps://api.weixin.qq.com
- 检查AppID和AppSecret是否正确
- 查看服务器错误日志
### 问题3:二维码无法显示
- 检查uploads目录是否有写入权限
- 检查生成的图片路径是否正确
- 检查图片URL是否可访问
### 问题4:扫码后无法跳转
- 确认小程序中存在 pages/order/monad/monad 页面
- 检查小程序是否已发布
- 确认AppID是否匹配
## 数据库检查
生成的二维码图片存储在:
```
public/uploads/qrcode/{日期}/qrcode_{appId}_{md5}_{timestamp}.png
```
AccessToken缓存Key
```
wx_access_token_{appId}
```
可以通过以下方式查看缓存:
```php
// 在PHP中
$token = cache('wx_access_token_' . $appId);
var_dump($token);
```
## 性能测试
### 并发测试
- 同时生成多个二维码
- 观察AccessToken是否正确复用
- 检查是否有重复请求微信API
### 缓存测试
- 第一次生成二维码(会请求微信获取AccessToken
- 7000秒内再次生成(应使用缓存的AccessToken
- 观察响应时间差异
## 安全检查
1. 权限验证:未登录用户无法访问
2. 参数验证:必填参数缺失时返回错误
3. 数据验证:诊单ID和患者ID必须存在
4. 文件安全:生成的图片文件名包含随机因素,避免被猜测
+23
View File
@@ -0,0 +1,23 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
dist
*.local
# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
TUICallKit
+16
View File
@@ -0,0 +1,16 @@
{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
// launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
"version": "0.0",
"configurations": [{
"default" :
{
"launchtype" : "local"
},
"mp-weixin" :
{
"launchtype" : "local"
},
"type" : "uniCloud"
}
]
}
+47
View File
@@ -0,0 +1,47 @@
<script setup>
import { onLaunch, onShow, onHide, onError } from '@dcloudio/uni-app'
import { getCurrentInstance } from 'vue'
// 2. 获取组件实例,通过 proxy 访问全局属性
const { proxy } = getCurrentInstance()
const globalData = {
SDKAppID: 0,
userID: '',
userSig: ''
};
onLaunch(() => {
console.log('---------进入onMounted')
uni.login({
provider: 'weixin',
success: function (loginRes) {
console.log('xx');
console.log(loginRes.code);
wxcode(loginRes.code)
// 获取用户信息
}
});
})
const wxcode = async (code) => {
try {
// 通过 proxy 调用全局的 apiUrl
const res = await proxy.apiUrl({
url: '/api/login/mnpLogin',
method: 'POST',
data: {
code: code
},
}, false) // 不显示加载中
uni.setStorageSync('token', res.data.token)
uni.setStorageSync('userData', res.data)
console.log('请求结果:', res.data)
} catch (err) {
}
}
</script>
+137
View File
@@ -0,0 +1,137 @@
## 简介
本 demo 演示了如何在 uni-app 项目中集成 [TUICallKit](https://www.npmjs.com/package/@trtc/calls-uikit-wx-uniapp) 音视频通话组件。
## 环境准备
- 微信 App iOS 最低版本要求:8.0.40
- 微信 App Android 最低版本要求:8.0.40
- 小程序基础库最低版本要求:2.10.0
- 由于小程序测试号不具备 <live-pusher> 和 <live-player> 的使用权限,请使用企业小程序账号申请相关权限进行开发
- 由于微信开发者工具不支持原生组件(即 <live-pusher> 和 <live-player> 标签),需要在真机上进行运行体验
## 快速跑通
第一步:下载源码,编译运行
1. 克隆或者直接下载此仓库源码。
```
git clone https://github.com/tencentyun/TUICallKit.git
```
2. 进入 demo 目录
```
cd ./TUICallKit/uni-app/TUICallKit-Miniprogram/TUICallKit-Vue3
```
3. 安装依赖
```
npm install
```
mac端
```
mkdir -p ./TUICallKit && cp -r node_modules/@trtc/calls-uikit-wx-uniapp/ ./TUICallKit && cp node_modules/@trtc/call-engine-lite-wx/RTCCallEngine.wasm.br ./static
```
windows端
```
xcopy node_modules\@trtc\calls-uikit-wx-uniapp\ .\TUICallKit /i /e
xcopy node_modules\@trtc\call-engine-lite-wx\RTCCallEngine.wasm.br .\static
```
4. HBuilder 中导入项目
<img src="https://web.sdk.qcloud.com/component/trtccalling/images/miniProgram/hbuilder-vue.png" width="400" align="middle" />
5. 修改 `./TUICallKit/uni-app/TUICallKit-Miniprogram/TUICallKit-Vue3/debug/GenerateTestUserSig-es.js` 文件 的 SDKAPPID 以及 SECRETKEY(阅读文末 [开通服务](#开通服务))
<img src="https://qcloudimg.tencent-cloud.cn/raw/49931d68084b2d79f0f69f278894999b.png" width="400" />
6. 运行到【微信开发者工具】,勾选 **【运行时是否压缩代码】**
<img src="https://web.sdk.qcloud.com/component/trtccalling/images/miniProgram/exportWechatTool.png" width="400" align="middle" />
7. 项目导入到微信开发者工具,目录如下图:
<img src="https://qcloudimg.tencent-cloud.cn/raw/a79cd64ac5be8ee099f2d802f1c847c6.png" width="150" align="middle" />
## 示例体验
> **TipsTUICallKit 通话体验,至少需要两台设备,用户 A、B 代表使用不同的设备。**
**用户 AuserId111**
- 步骤 1:在欢迎页,输入用户名(<font color=red>请确保用户名唯一性,不能与其他用户重复</font>)登录,比如:111。
- 步骤 2:根据不同的场景&业务需求,进入不同的场景界面,比如:视频通话。
- 步骤 3:输入要拨打的用户 B 的 userId(例如:222),点击搜索,然后点击呼叫。
| 步骤1 | 步骤2 | 步骤3 |
| :-: | :-: | :-: |
|<img src="https://qcloudimg.tencent-cloud.cn/raw/13bf844da5636f3640da05020800fff9.jpg" width="240"/>|<img src="https://qcloudimg.tencent-cloud.cn/raw/ceed4039c6ce8f9b8ff48deb89199b6e.jpg" width="240">|<img src="https://qcloudimg.tencent-cloud.cn/raw/dc1984904c9790c8a3355ff1c5dada50.jpg" width="240"/>
**用户 BuserId222**
- 步骤 1:在欢迎页,输入用户名(<font color=red>请确保用户名唯一性,不能与其他用户重复</font>)登录,比如:222。
- 步骤 2:进入主页,等待接听来电即可。
## 接入指引
### 步骤一:开通小程序权限
由于 TUICallKit 所使用的小程序标签有更苛刻的权限要求,因此集成 TUICallKit 的第一步就是要开通小程序的类目和标签使用权限,**否则无法使用**,这包括如下步骤:
- 小程序推拉流标签不支持个人小程序,只支持企业类小程序。需要在 [注册](https://developers.weixin.qq.com/community/business/doc/000200772f81508894e94ec965180d) 时填写主体类型为企业,如下图所示:
<img width="480" height="480" src="https://main.qcloudimg.com/raw/a30f04a8983066fb9fdf179229d3ee31.png">
- 小程序推拉流标签使用权限暂时只开放给有限 [类目](https://developers.weixin.qq.com/miniprogram/dev/component/live-pusher.html)。
- 符合类目要求的小程序,需要在 **[微信公众平台](https://mp.weixin.qq.com/)** > **开发** > **开发管理** > **接口设置**中自助开通该组件权限,如下图所示:
<img width="480" height="360" src="https://main.qcloudimg.com/raw/dc6d3c9102bd81443cb27b9810c8e981.png">
### 步骤二:在小程序控制台配置域名
在 **[微信公众平台](https://mp.weixin.qq.com/)** > **开发** > **开发管理** > **开发设置** > **服务器域名**中设置 **request 合法域名** 和 **socket 合法域名**,如下图所示:
- **request 合法域名**
```javascript
https://official.opensso.tencent-cloud.com
https://yun.tim.qq.com
https://cloud.tencent.com
https://webim.tim.qq.com
https://query.tencent-cloud.com
https://web.sdk.qcloud.com
```
- **socket 合法域名**
```javascript
wss://wss.im.qcloud.com
wss://wss.tim.qq.com
```
<img width="480" height="360" src="https://qcloudimg.tencent-cloud.cn/raw/a79ca9726309bb1fdabb9ef8961ce147.png">
### 步骤三:开通服务
TUICallKit 是基于腾讯云 [即时通信 IM](https://cloud.tencent.com/document/product/269/42440) 和 [实时音视频 TRTC](https://cloud.tencent.com/document/product/647/16788) 两项付费 PaaS 服务构建出的音视频通信组件。您可以按照如下步骤开通相关的服务并体验 7 天的免费试用服务:
1. 登录到 [即时通信 IM 控制台](https://console.cloud.tencent.com/im),单击**创建新应用**,在弹出的对话框中输入您的应用名称,并单击**确定**。
<img width="360" height="240" src="https://qcloudimg.tencent-cloud.cn/raw/1105c3c339be4f71d72800fe2839b113.png">
2. 单击刚刚创建出的应用,进入**基本配置**页面,并在页面的右下角找到**开通腾讯实时音视频服务**功能区,单击**免费体验**即可开通 TUICallKit 的 7 天免费试用服务。如果需要正式应用上线,可以单击 [**前往加购**](https://buy.cloud.tencent.com/avc) 即可进入购买页面。
<img width="480" src="https://user-images.githubusercontent.com/72854065/205876830-6c8f119e-8d3c-4f1e-b8d3-0a21788fc47a.png">
> IM 音视频通话能力针对不同的业务需求提供了差异化的付费版本供您选择,您可以在 [IM 购买页](https://buy.cloud.tencent.com/avc) 了解包含功能并选购您适合的版本。
3. 在同一页面找到 **SDKAppID** 和**密钥**并记录下来
- SDKAppID:IM 的应用 ID,用于业务隔离,即不同的 SDKAppID 的通话彼此不能互通。
- SecretkeyIM 的应用密钥,需要和 SDKAppID 配对使用,用于签出合法使用 IM 服务的鉴权用票据 UserSig。
<img width="480" src="https://qcloudimg.tencent-cloud.cn/raw/e435332cda8d9ec7fea21bd95f7a0cba.png">
> 即日起至2022年10月01日0点前,购买音视频通话能力包基础版可获赠解锁相同有效期的小程序端通话功能授权。在活动结束前购买的音视频通话能力包在有效期内不受活动结束影响仍可使用小程序通话功能,活动结束后的新购或续期需选择体验版、进阶版、尊享版来获取小程序通话功能授权,基础版亦可单独加购小程序功能授权进行解锁。
> 单击**免费体验**以后,部分之前使用过 [实时音视频 TRTC]
(https://cloud.tencent.com/document/product/647/16788) 服务的用户会提示:
```
[-100013]:TRTC service is suspended. Please check if the package balance is 0 or the Tencent Cloud accountis in arrears
```
因为新的 IM 音视频通话能力是整合了腾讯云[实时音视频 TRTC](https://cloud.tencent.com/document/product/647/16788) 和 [即时通信 IM](https://cloud.tencent.com/document/product/269/42440) 两个基础的 PaaS 服务,所以当 [实时音视频 TRTC](https://cloud.tencent.com/document/product/647/16788) 的免费额度(10000分钟)已经过期或者耗尽,就会导致开通此项服务失败,这里您可以单击 [TRTC 控制台](https://console.cloud.tencent.com/trtc/app),找到对应 SDKAppID 的应用管理页,示例如图,开通后付费功能后,再次**启用应用**即可正常体验音视频通话能力。
<img width=600px src="https://qcloudimg.tencent-cloud.cn/raw/f74a13a7170cf8894195a1cae6c2f153.png" />
## 附录
- 如果您想要了解TUiCallKit,请阅读 [组件介绍 TUICallKit](https://cloud.tencent.com/document/product/647/78742)
- 如果您想把我们的功能直接嵌入到您的项目中,请阅读 [快速接入 TUICallKit](https://cloud.tencent.com/document/product/647/78912)
- 如果您想要了解详细 API ,请阅读 [ API 概览](https://cloud.tencent.com/document/product/647/78759)
- 如果你遇到了困难,可以先参阅 [常见问题](https://cloud.tencent.com/document/product/647/78912)
- 如果发现了示例代码的 bug,欢迎提交 issue;
@@ -0,0 +1,63 @@
import LibGenerateTestUserSig from './lib-generate-test-usersig-es.min.js';
/**
* 腾讯云 SDKAppId,需要替换为您自己账号下的 SDKAppId。
*
* 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ) 创建应用,即可看到 SDKAppId,
* 它是腾讯云用于区分客户的唯一标识。
*/
let SDKAPPID = 1600127710;
/**
* 签名过期时间,建议不要设置的过短
* <p>
* 时间单位:秒
* 默认时间:7 x 24 x 60 x 60 = 604800 = 7 天
*/
const EXPIRETIME = 604800;
/**
* 计算签名用的加密密钥,获取步骤如下:
*
* step1. 进入腾讯云实时音视频[控制台](https://console.cloud.tencent.com/rav ),如果还没有应用就创建一个,
* step2. 单击“应用配置”进入基础配置页面,并进一步找到“帐号体系集成”部分。
* step3. 点击“查看密钥”按钮,就可以看到计算 UserSig 使用的加密的密钥了,请将其拷贝并复制到如下的变量中
*
* 注意:该方案仅适用于调试Demo,正式上线前请将 UserSig 计算代码和密钥迁移到您的后台服务器上,以避免加密密钥泄露导致的流量盗用。
* 文档:https://cloud.tencent.com/document/product/647/17275#Server
*/
let SECRETKEY = '8a6b3ce533b0e46b9d6e17d5c77bac240bc0ccdce4e3db93a0d6a1e55160c73d';
/*
* Module: GenerateTestUserSig
*
* Function: 用于生成测试用的 UserSig,UserSig 是腾讯云为其云服务设计的一种安全保护签名。
* 其计算方法是对 SDKAppID、UserID 和 EXPIRETIME 进行加密,加密算法为 HMAC-SHA256。
*
* Attention: 请不要将如下代码发布到您的线上正式版本的 App 中,原因如下:
*
* 本文件中的代码虽然能够正确计算出 UserSig,但仅适合快速调通 SDK 的基本功能,不适合线上产品,
* 这是因为客户端代码中的 SECRETKEY 很容易被反编译逆向破解,尤其是 Web 端的代码被破解的难度几乎为零。
* 一旦您的密钥泄露,攻击者就可以计算出正确的 UserSig 来盗用您的腾讯云流量。
*
* 正确的做法是将 UserSig 的计算代码和加密密钥放在您的业务服务器上,然后由 App 按需向您的服务器获取实时算出的 UserSig。
* 由于破解服务器的成本要高于破解客户端 App,所以服务器计算的方案能够更好地保护您的加密密钥。
*
* Referencehttps://cloud.tencent.com/document/product/647/17275#Server
*/
export function genTestUserSig({ userID, SDKAppID, SecretKey }) {
if (SDKAppID) SDKAPPID = SDKAppID;
if (SecretKey) SECRETKEY = SecretKey;
const generator = new LibGenerateTestUserSig(SDKAPPID, SECRETKEY, EXPIRETIME);
const userSig = generator.genTestUserSig(userID);
return {
SDKAppID: SDKAPPID,
userSig,
};
}
export default genTestUserSig;
File diff suppressed because one or more lines are too long
+20
View File
@@ -0,0 +1,20 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<script>
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
CSS.supports('top: constant(a)'))
document.write(
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
</script>
<title></title>
<!--preload-links-->
<!--app-context-->
</head>
<body>
<div id="app"><!--app-html--></div>
<script type="module" src="/main.js"></script>
</body>
</html>
+129
View File
@@ -0,0 +1,129 @@
import App from './App'
// #ifndef VUE3
import Vue from 'vue'
import './uni.promisify.adaptor'
Vue.config.productionTip = false
Vue.prototype.$url = 'http://www.d.com'
Vue.prototype.apiUrl =function apiurl(promise, Loading = true){
let token=uni.getStorageSync('token')
promise.header={
token:token,
'content-type':'application/x-www-form-urlencoded',
}
let header = {}
if (promise.header) {
header = promise.header
}
let data = {}
if (promise.data) {
data = promise.data
}
let url=Vue.prototype.$url+promise.url
return new Promise(function(resolve, reject) {
uni.request({
url: url,
data: data,
timeout: 15000,
method: promise.method ? promise.method : 'POST',
header: header,
sslVerify: false,
success: (res) => {
const data=res.data
//-1检测登陆失效删除登陆状态
resolve(data);
},
fail(e) {
reject(e)
},
complete(e) {
//console.log('complete', e)
}
});
});
}
App.mpType = 'app'
const app = new Vue({
...App
})
app.$mount()
// #endif
// #ifdef VUE3
import { createSSRApp } from 'vue'
// 定义全局基础URL
const baseUrl = 'http://www.d.com'
// 封装Vue3版本的apiUrl方法
function apiUrl(promise, Loading = true) {
// 获取token
const token = uni.getStorageSync('token')
// 合并header(修复原代码直接覆盖的问题)
const header = {
token: token,
'content-type': 'application/x-www-form-urlencoded',
// 合并用户传入的header,用户传入的会覆盖默认值
...(promise.header || {})
}
// 处理请求数据和URL
const data = promise.data || {}
const url = baseUrl + (promise.url || '')
return new Promise((resolve, reject) => {
// 可选:根据Loading参数显示加载中
if (Loading) {
uni.showLoading({ title: '加载中...', mask: true })
}
uni.request({
url: url,
data: data,
timeout: 15000,
method: promise.method || 'POST', // 简化三元表达式
header: header,
sslVerify: false,
success: (res) => {
const data = res.data
// 处理登录失效逻辑(补充完整)
if (data.code === -1) {
uni.removeStorageSync('token') // 删除token
uni.showToast({ title: '登录已失效,请重新登录', icon: 'none' })
// 可选:跳转到登录页
// uni.redirectTo({ url: '/pages/login/login' })
}
resolve(data)
},
fail: (e) => {
uni.showToast({ title: '请求失败,请重试', icon: 'none' })
reject(e)
},
complete: (e) => {
// 关闭加载中
if (Loading) {
uni.hideLoading()
}
// console.log('complete', e)
}
})
})
}
export function createApp() {
const app = createSSRApp(App)
// Vue3挂载全局属性的方式
app.config.globalProperties.$url = baseUrl
app.config.globalProperties.apiUrl = apiUrl
return {
app
}
}
// #endif
+72
View File
@@ -0,0 +1,72 @@
{
"name" : "uniapp-callkit-vue3",
"appid" : "__UNI__5205699",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",
"transformPx" : false,
/* 5+App */
"app-plus" : {
"usingComponents" : true,
"nvueStyleCompiler" : "uni-app",
"compilerVersion" : 3,
"splashscreen" : {
"alwaysShowBeforeRender" : true,
"waiting" : true,
"autoclose" : true,
"delay" : 0
},
/* */
"modules" : {},
/* */
"distribute" : {
/* android */
"android" : {
"permissions" : [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
]
},
/* ios */
"ios" : {},
/* SDK */
"sdkConfigs" : {}
}
},
/* */
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "wx6b829b4ffce455b7",
"setting" : {
"urlCheck" : false
},
"usingComponents" : true
},
"mp-alipay" : {
"usingComponents" : true
},
"mp-baidu" : {
"usingComponents" : true
},
"mp-toutiao" : {
"usingComponents" : true
},
"uniStatistics" : {
"enable" : false
},
"vueVersion" : "3"
}
+100
View File
@@ -0,0 +1,100 @@
{
"name": "tuicallkit-vue3",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "tuicallkit-vue3",
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"@trtc/calls-uikit-wx-uniapp": "^4.1.0"
}
},
"node_modules/@tencentcloud/lite-chat": {
"version": "1.6.9",
"resolved": "https://registry.npmjs.org/@tencentcloud/lite-chat/-/lite-chat-1.6.9.tgz",
"integrity": "sha512-Pg7Z3YFI+jbv3iQzCZQHlWxBbaTZO2yJ8lFT1fURh5R7JJZz+c8h7Pe/z5NZNdmnsZBKes/s6s+hRXcfwMSbnA==",
"license": "ISC"
},
"node_modules/@tencentcloud/trtc-cloud-wx": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@tencentcloud/trtc-cloud-wx/-/trtc-cloud-wx-1.0.8.tgz",
"integrity": "sha512-72TYYt6XNTr9Y401qw23YODfhLC9AGniNqb9ACFTVGDtInApHn139kGhKeudgTYEdTObkG1JjUcdkfcknHGhSA==",
"license": "ISC",
"dependencies": {
"eventemitter3": "^5.0.0",
"trtc-wx-sdk": "^1.1.14"
}
},
"node_modules/@tencentcloud/trtc-component-uniapp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@tencentcloud/trtc-component-uniapp/-/trtc-component-uniapp-1.0.5.tgz",
"integrity": "sha512-vffUArHP9hKsxRgd0R6uC8d538tJimUft/enrT1D9rGpoveRKAFkRpdDH44huNiM2XoS+JnkP6tMUqVCtvyi3g==",
"license": "MIT",
"peerDependencies": {
"@tencentcloud/trtc-cloud-wx": "^1.0.7"
}
},
"node_modules/@tencentcloud/trtc-component-wx": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/@tencentcloud/trtc-component-wx/-/trtc-component-wx-1.0.6.tgz",
"integrity": "sha512-3m2ZU3/upx3IJAhSPdElJ2AF1D7L/0JOXUpanYJbrtHlwTWDQ6BOc+p6HgsepE67ltpR7UcYF/BcVHEfpcObkA==",
"license": "MIT",
"dependencies": {
"@tencentcloud/trtc-cloud-wx": "^1.0.7"
}
},
"node_modules/@tencentcloud/tui-core-lite": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@tencentcloud/tui-core-lite/-/tui-core-lite-1.0.0.tgz",
"integrity": "sha512-+nmOWQ415Kz6aYJDv4EIdnaLk69SPWscZqmIhQp9GhNGFVq4/u+gC/sWvGHEOICJncFjM4dUxBg9EFfzD78rGQ==",
"license": "ISC",
"dependencies": {
"@tencentcloud/lite-chat": "^1.5.0"
}
},
"node_modules/@trtc/call-engine-lite-wx": {
"version": "3.4.13",
"resolved": "https://registry.npmjs.org/@trtc/call-engine-lite-wx/-/call-engine-lite-wx-3.4.13.tgz",
"integrity": "sha512-Dv3wREtBi7d368FhRuOFOE+erQrLHMo5lnPBIWXSil6sLO6ZqrSn6J6+e44sp7y6/RIJo+e+SxAyAVVxkLZOOQ==",
"license": "ISC",
"dependencies": {
"@tencentcloud/lite-chat": "^1.5.0",
"@tencentcloud/trtc-component-wx": "^1.0.5",
"eventemitter3": "^4.0.7"
}
},
"node_modules/@trtc/call-engine-lite-wx/node_modules/eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
"license": "MIT"
},
"node_modules/@trtc/calls-uikit-wx-uniapp": {
"version": "4.2.7",
"resolved": "https://registry.npmjs.org/@trtc/calls-uikit-wx-uniapp/-/calls-uikit-wx-uniapp-4.2.7.tgz",
"integrity": "sha512-Dpgn1kR1UgTP34X9lM1Yf6vXQ4odiTEf5Cc8BLepo7CMYNSvDw80B4bBPTatLT8og818yAVVinS8cZ+n4bxPCA==",
"license": "ISC",
"dependencies": {
"@tencentcloud/lite-chat": "^1.5.0",
"@tencentcloud/trtc-component-uniapp": "^1.0.4",
"@tencentcloud/tui-core-lite": "1.0.0",
"@trtc/call-engine-lite-wx": "~3.4.10"
}
},
"node_modules/eventemitter3": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
"integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
"license": "MIT"
},
"node_modules/trtc-wx-sdk": {
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/trtc-wx-sdk/-/trtc-wx-sdk-1.1.14.tgz",
"integrity": "sha512-QYV2j5pDlhbM0zykYq8OYaSpjyTn0/YbsK180iNwCLEA61m2KWm2wb1veRBVsTP9Lq0iqbSMU17cOW963vcraA==",
"license": "ISC"
}
}
}
+15
View File
@@ -0,0 +1,15 @@
{
"name": "tuicallkit-vue3",
"version": "1.0.0",
"description": "",
"main": "main.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@trtc/calls-uikit-wx-uniapp": "^4.1.0"
}
}
+34
View File
@@ -0,0 +1,34 @@
{
"pages": [
{
"path": "pages/index/login",
"style": {
"navigationBarTitleText": "uni-app"
}
},
{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": "uni-app"
}
},
{
"path": "TUICallKit/src/Components/TUICallKit",
"style": {
"navigationBarTitleText": "视频面诊"
}
},
{
"path": "pages/order/monad/monad",
"style": {
"navigationBarTitleText": "诊单确认"
}
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "甄养堂",
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
}
}
+153
View File
@@ -0,0 +1,153 @@
<template>
<view class="container">
<view class='guide-box'>
<!-- <button @click="setCallingBell">setCallingBell</button> -->
<!-- <button @click="enableMuteMode">enableMuteMode</button> -->
<view class="single-box" v-for="(item, index) in entryInfos" :key="index" :id="index" @click='handleEntry'>
<image class="icon" mode="aspectFit" :src="item.icon" role="img"></image>
<view class="single-content">
<view class="label">{{ item.title }}</view>
<view class="desc">{{ item.desc }}</view>
</view>
</view>
</view>
</view>
</template>
<script setup>
// import { TUICallKitAPI } from "../../TUICallKit/src/index";
// import { ref } from "vue";
const template = '1v1';
const entryInfos = [
{
icon: 'https://web.sdk.qcloud.com/component/miniApp/resources/audio-card.png',
title: '语音通话',
desc: '丢包率70%仍可正常语音通话',
navigateTo: '../calling/call?type=1',
},
{
icon: 'https://web.sdk.qcloud.com/component/miniApp/resources/video-card.png',
title: '视频通话',
desc: '丢包率50%仍可正常视频通话',
navigateTo: '../calling/call?type=2',
},
{
icon: 'https://web.sdk.qcloud.com/component/miniApp/resources/audio-card.png',
title: '多人语音通话',
desc: '丢包率70%仍可正常语音通话',
navigateTo: '../calling/groupCall?type=1',
},
{
icon: 'https://web.sdk.qcloud.com/component/miniApp/resources/video-card.png',
title: '多人视频通话',
desc: '丢包率50%仍可正常视频通话',
navigateTo: '../calling/groupCall?type=2',
},
];
// --------铃声相关接口测试-----------------
// let isMute = ref(false);
// const enableMuteMode = async () => {
// isMute.value = !isMute.value;
// await TUICallKitAPI.enableMuteMode(isMute.value);
// }
// const setCallingBell = async () => {
// await TUICallKitAPI.setCallingBell('mp2.mp3');
// }
const handleEntry = (e) => {
const url = entryInfos[e.currentTarget.id].navigateTo;
uni.navigateTo({
url,
});
}
</script>
<style>
.container {
/* background-image: url(https://mc.qcloudimg.com/static/img/7da57e0050d308e2e1b1e31afbc42929/bg.png); */
background: #F4F5F9;
background-repeat: no-repeat;
background-size: cover;
width: 100vw;
height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
box-sizing: border-box;
}
.container .title {
position: relative;
width: 100vw;
font-size: 18px;
color: #000000;
letter-spacing: 0;
text-align: center;
line-height: 28px;
font-weight: 600;
background: #FFFFFF;
margin-top: 3.8vh;
padding: 1.2vh 0;
}
.tips {
color: #ffffff;
font-size: 12px;
text-align: center;
}
.guide-box {
width: 100vw;
box-sizing: border-box;
padding: 16px;
display: flex;
flex-direction: column;
}
.single-box {
flex: 1;
border-radius: 10px;
background-color: #ffffff;
margin-bottom: 16px;
display: flex;
align-items: center;
}
.icon {
display: block;
width: 180px;
height: 144px;
}
.single-content {
padding: 36px 30px 36px 20px;
color: #333333;
}
.label {
display: block;
font-size: 18px;
color: #333333;
letter-spacing: 0;
font-weight: 500;
}
.desc {
display: block;
font-size: 14px;
color: #333333;
letter-spacing: 0;
font-weight: 500;
}
.logo-box {
position: absolute;
width: 100vw;
bottom: 36rpx;
text-align: center;
}
.logo {
width: 160rpx;
height: 44rpx;
}
</style>
+320
View File
@@ -0,0 +1,320 @@
<template>
<view class="container">
<view class="counter-warp">
<view class="header-content">
<image :src="avatarUrl" class="icon-box" v-if="avatarUrl"/>
<view class="text-header">用户登录</view>
</view>
<view class="box">
<view class="list-item">
<label class="list-item-label">用户ID</label>
<input
class="input-box"
type="text"
v-model="userID"
placeholder="请输入用户ID"
placeholder-style="color:#BBBBBB;"
/>
</view>
<view class="login"
><button class="loginBtn" @click="loginHandler">登录</button></view
>
</view>
</view>
</view>
</template>
<script setup>
import { ref,onMounted,getCurrentInstance } from "vue";
// 2. 获取组件实例,通过 proxy 访问全局属性
const { proxy } = getCurrentInstance()
import * as GenerateTestUserSig from "../../debug/GenerateTestUserSig-es.js";
import { CallManager } from "../../TUICallKit/src/TUICallService/serve/callManager";
let userID = ref("4");
let avatarUrl = ref(""); // 声明为响应式变量
uni.CallManager = new CallManager();
onMounted(() => {
uni.login({
provider: 'weixin',
success: function (loginRes) {
console.log('xx');
console.log(loginRes.code);
wxcode(loginRes.code)
// 获取用户信息
uni.getUserInfo({
provider: 'weixin',
withCredentials:true,
success: function (infoRes) {
avatarUrl.value = infoRes.userInfo.avatarUrl; // 使用 .value 赋值
console.log('头像URL:', avatarUrl.value);
console.log(infoRes.userInfo);
}
});
}
});
console.log('---------进入onMounted')
})
const wxcode = async (code) => {
try {
// 通过 proxy 调用全局的 apiUrl
const res = await proxy.apiUrl({
url: '/api/login/mnpLogin',
method: 'POST',
data: {
code: code
},
}, false) // 不显示加载中
} catch (err) {
uni.showToast({ title: '请求失败', icon: 'none' })
console.error(err)
}
}
const loginHandler = async () => {
// 从后端获取签名
const signatureData = await getSignatureFromServer(patientId.value);
console.log('获取签名成功:', signatureData);
const {userId } = signatureData;
const { userSig, SDKAppID } = GenerateTestUserSig.genTestUserSig({
userID: userId.value,
});
console.warn('--- ', SDKAppID);
getApp().globalData.userID = userId.value;
getApp().globalData.userSig = userSig;
getApp().globalData.SDKAppID = SDKAppID;
await uni.CallManager.init({
sdkAppID: SDKAppID, // 替换为用户自己的 sdkAppID
userID: userId.value, // 替换为用户自己的 userID
userSig: userSig, // 替换为用户自己的 userSig
globalCallPagePath: "TUICallKit/src/Components/TUICallKit", // 替换为步骤一里注册的全局监听页面
});
uni.navigateTo({
url: "./index",
});
};
// 从后端获取签名
const getSignatureFromServer = async (patientId) => {
return new Promise((resolve, reject) => {
uni.request({
url: 'https://api.zzzhengyangtang.cn/api/tcm/getPatientSignature', // 后端接口地址 // 替换为你的后端地址
method: 'GET',
data: {
patient_id: patientId
},
success: (res) => {
if (res.data && res.data.code === 1) {
resolve(res.data.data);
} else {
reject(new Error(res.data.msg || '获取签名失败'));
}
},
fail: (err) => {
reject(err);
}
});
});
};
</script>
<style scoped>
.container {
width: 100vw;
height: 100vh;
background-color: #f4f5f9;
position: fixed;
top: 0;
right: 0;
left: 0;
bottom: 0;
}
.counter-warp {
position: absolute;
top: 0;
right: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
}
.background-image {
width: 100%;
}
.header-content {
display: flex;
width: 100vw;
padding: 50px 20px 10px;
box-sizing: border-box;
top: 100rpx;
background-color: #000;
align-items: center;
}
.icon-box {
width: 56px;
height: 56px;
}
.text-header {
height: 72rpx;
font-size: 48rpx;
line-height: 72rpx;
color: #ffffff;
margin: 40px auto;
}
.text-content {
height: 36rpx;
font-size: 24rpx;
line-height: 36rpx;
color: #ffffff;
}
.box {
width: 80%;
height: 50vh;
position: relative;
background: #ffffff;
border-radius: 4px;
border-radius: 4px;
display: flex;
flex-direction: column;
justify-content: left;
padding: 30px 20px;
}
.input-box {
flex: 1;
display: flex;
font-family: PingFangSC-Regular;
font-size: 14px;
color: rgba(0, 0, 0, 0.8);
letter-spacing: 0;
}
.login {
display: flex;
box-sizing: border-box;
margin-top: 15px;
width: 100%;
}
.login button {
background: rgba(0, 110, 255, 1);
border-radius: 30px;
font-size: 16px;
color: #ffffff;
letter-spacing: 0;
/* text-align: center; */
font-weight: 500;
}
.loginBtn {
margin-top: 64px;
background-color: white;
border-radius: 24px;
border-radius: 24px;
/* display: flex;
justify-content: center; */
width: 100% !important;
font-family: PingFangSC-Regular;
font-size: 16px;
color: #ffffff;
letter-spacing: 0;
}
.list-item {
display: flex;
flex-direction: column;
font-family: PingFangSC-Medium;
font-size: 14px;
color: #333333;
border-bottom: 1px solid #eef0f3;
}
.input-container {
width: 90%;
margin: 50px auto 0;
display: flex;
flex-direction: column;
font-family: PingFangSC-Medium;
font-size: 14px;
color: #333333;
border-bottom: 1px solid #eef0f3;
}
/* .input-box {
height: 20px;
padding: 5px;
width: 100%;
border: 1px solid #999999;;
} */
.list-item .list-item-label {
font-weight: 500;
padding: 10px 0;
}
.guide-box {
width: 100vw;
box-sizing: border-box;
padding: 16px;
display: flex;
flex-direction: column;
}
.single-box {
flex: 1;
border-radius: 10px;
background-color: #ffffff;
margin-bottom: 16px;
display: flex;
align-items: center;
}
.icon {
display: block;
width: 180px;
height: 144px;
}
.single-content {
padding: 36px 30px 36px 20px;
color: #333333;
}
.label {
display: block;
font-size: 18px;
color: #333333;
letter-spacing: 0;
font-weight: 500;
}
.desc {
display: block;
font-size: 14px;
color: #333333;
letter-spacing: 0;
font-weight: 500;
}
.logo-box {
position: absolute;
width: 100vw;
bottom: 36rpx;
text-align: center;
}
</style>
+639
View File
@@ -0,0 +1,639 @@
<template>
<view class="container">
<view class="form-wrapper">
<!-- 基本信息 -->
<view class="section">
<view class="section-title">基本信息</view>
<view class="info-item">
<text class="label">患者姓名</text>
<text class="value">{{ formData.patient_name || '-' }}</text>
</view>
<view class="info-item">
<text class="label">身份证号</text>
<text class="value">{{ formData.id_card || '-' }}</text>
</view>
<view class="info-item">
<text class="label">手机号</text>
<text class="value">{{ formData.phone || '-' }}</text>
</view>
<view class="info-item">
<text class="label">性别</text>
<text class="value">{{ formData.gender === 1 ? '男' : '女' }}</text>
</view>
<view class="info-item">
<text class="label">年龄</text>
<text class="value">{{ formData.age || '-' }}</text>
</view>
<view class="info-item">
<text class="label">诊断日期</text>
<text class="value">{{ formData.diagnosis_date || '-' }}</text>
</view>
<view class="info-item">
<text class="label">诊断类型</text>
<text class="value">{{ getDiagnosisTypeName() || '-' }}</text>
</view>
<view class="info-item">
<text class="label">证型</text>
<text class="value">{{ getSyndromeTypeName() || '-' }}</text>
</view>
<view class="info-item">
<text class="label">糖尿病期数</text>
<text class="value">{{ getDiabetesTypeName() || '-' }}</text>
</view>
</view>
<!-- 现病史 -->
<view class="section">
<view class="section-title">现病史</view>
<view class="info-item">
<text class="label">口腔感觉</text>
<text class="value">{{ getAppetiteName() || '-' }}</text>
</view>
<view class="info-item">
<text class="label">每日饮水量</text>
<text class="value">{{ getWaterIntakeName() || '-' }}</text>
</view>
<view class="info-item">
<text class="label">体重变化</text>
<text class="value">{{ getWeightChangeName() || '-' }}</text>
</view>
<view class="info-item">
<text class="label">脂肪肝程度</text>
<text class="value">{{ getFattyLiverDegreeName() || '-' }}</text>
</view>
<view class="info-item">
<text class="label">饮食情况</text>
<view class="tag-list">
<text v-for="item in getDietConditionNames()" :key="item" class="tag">{{ item }}</text>
<text v-if="getDietConditionNames().length === 0" class="value">-</text>
</view>
</view>
<view class="info-item">
<text class="label">肢体感觉</text>
<view class="tag-list">
<text v-for="item in getBodyFeelingNames()" :key="item" class="tag">{{ item }}</text>
<text v-if="getBodyFeelingNames().length === 0" class="value">-</text>
</view>
</view>
<view class="info-item">
<text class="label">睡眠情况</text>
<view class="tag-list">
<text v-for="item in getSleepConditionNames()" :key="item" class="tag">{{ item }}</text>
<text v-if="getSleepConditionNames().length === 0" class="value">-</text>
</view>
</view>
</view>
<!-- 既往史 -->
<view class="section">
<view class="section-title">既往史</view>
<view class="info-item">
<text class="label">既往史</text>
<view class="tag-list">
<text v-for="item in getPastHistoryNames()" :key="item" class="tag">{{ item }}</text>
<text v-if="getPastHistoryNames().length === 0" class="value">-</text>
</view>
</view>
</view>
<!-- 其他病史 -->
<view class="section">
<view class="section-title">其他病史</view>
<view class="info-item">
<text class="label">外伤史</text>
<text class="value">{{ formData.trauma_history === 1 ? '有' : '无' }}</text>
</view>
<view class="info-item">
<text class="label">手术史</text>
<text class="value">{{ formData.surgery_history === 1 ? '有' : '无' }}</text>
</view>
<view class="info-item">
<text class="label">过敏史</text>
<text class="value">{{ formData.allergy_history === 1 ? '有' : '无' }}</text>
</view>
</view>
<!-- 诊断信息 -->
<view class="section">
<view class="section-title">诊断信息</view>
<view class="info-item" v-if="formData.tongue_images && formData.tongue_images.length > 0">
<text class="label">舌苔照片</text>
<view class="image-list">
<image
v-for="(img, index) in formData.tongue_images"
:key="index"
:src="img"
class="tongue-image"
mode="aspectFill"
@click="previewImage(img)"
/>
</view>
</view>
<view class="info-item">
<text class="label">症状</text>
<text class="value multi-line">{{ formData.symptoms || '-' }}</text>
</view>
<view class="info-item">
<text class="label">舌苔</text>
<text class="value">{{ formData.tongue_coating || '-' }}</text>
</view>
<view class="info-item">
<text class="label">脉象</text>
<text class="value">{{ formData.pulse || '-' }}</text>
</view>
<view class="info-item">
<text class="label">治则</text>
<text class="value multi-line">{{ formData.treatment_principle || '-' }}</text>
</view>
<view class="info-item">
<text class="label">处方</text>
<text class="value multi-line">{{ formData.prescription || '-' }}</text>
</view>
<view class="info-item">
<text class="label">医嘱</text>
<text class="value multi-line">{{ formData.doctor_advice || '-' }}</text>
</view>
</view>
</view>
<!-- 底部浮动按钮 -->
<view class="fixed-bottom">
<button class="confirm-btn" @click="handleConfirm">确认诊单</button>
</view>
</view>
</template>
<script setup>
import { ref,onMounted,getCurrentInstance } from "vue";
// 2. 获取组件实例,通过 proxy 访问全局属性
const { proxy } = getCurrentInstance()
const formData = ref({
patient_name: '',
id_card: '',
phone: '',
gender: 1,
age: '',
diagnosis_date: '',
diagnosis_type: '',
syndrome_type: '',
diabetes_type: '',
appetite: '',
water_intake: '',
diet_condition: [],
weight_change: '',
body_feeling: [],
sleep_condition: [],
fatty_liver_degree: '',
past_history: [],
trauma_history: 0,
surgery_history: 0,
allergy_history: 0,
tongue_images: [],
symptoms: '',
tongue_coating: '',
pulse: '',
treatment_principle: '',
prescription: '',
doctor_advice: ''
});
// 字典选项
const diagnosisTypeOptions = ref([]);
const syndromeTypeOptions = ref([]);
const diabetesTypeOptions = ref([]);
const pastHistoryOptions = ref([]);
const appetiteOptions = ref([]);
const waterIntakeOptions = ref([]);
const dietConditionOptions = ref([]);
const weightChangeOptions = ref([]);
const bodyFeelingOptions = ref([]);
const sleepConditionOptions = ref([]);
const fattyLiverDegreeOptions = ref([]);
onMounted(() => {
getDictOptions();
loadDiagnosisDetail();
});
// 获取字典数据
const getDictOptions = async () => {
try {
const [
diagnosisType,
syndromeType,
diabetesType,
pastHistory,
appetite,
waterIntake,
dietCondition,
weightChange,
bodyFeeling,
sleepCondition,
fattyLiverDegree
] = await Promise.all([
getDictData('diagnosis_type'),
getDictData('syndrome_type'),
getDictData('diabetes_type'),
getDictData('past_history'),
getDictData('appetite'),
getDictData('water_intake'),
getDictData('diet_condition'),
getDictData('weight_change'),
getDictData('body_feeling'),
getDictData('sleep_condition'),
getDictData('fatty_liver_degree')
]);
diagnosisTypeOptions.value = diagnosisType?.diagnosis_type || [];
syndromeTypeOptions.value = syndromeType?.syndrome_type || [];
diabetesTypeOptions.value = diabetesType?.diabetes_type || [];
pastHistoryOptions.value = pastHistory?.past_history || [];
appetiteOptions.value = appetite?.appetite || [];
waterIntakeOptions.value = waterIntake?.water_intake || [];
dietConditionOptions.value = dietCondition?.diet_condition || [];
weightChangeOptions.value = weightChange?.weight_change || [];
bodyFeelingOptions.value = bodyFeeling?.body_feeling || [];
sleepConditionOptions.value = sleepCondition?.sleep_condition || [];
fattyLiverDegreeOptions.value = fattyLiverDegree?.fatty_liver_degree || [];
} catch (error) {
console.error('获取字典数据失败:', error);
}
};
// 获取单个字典数据
const getDictData = async (type) => {
try {
const res = await proxy.apiUrl({
url: '/api/tcm/getDict',
method: 'GET',
data: { type }
}, false);
if (res.code === 1) {
return res.data;
}
return null;
} catch (error) {
console.error(`获取字典${type}失败:`, error);
return null;
}
};
// 加载诊单详情
const loadDiagnosisDetail = async () => {
// 从页面参数获取诊单ID
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
// 假设你的对象是 ai
const scene = currentPage.options.scene;
// 1. 先对 scene 进行 URL 解码
const decodedScene = decodeURIComponent(scene) ||currentPage.options;
// 得到 "id=4&share_user=1"
// 2. 解析成键值对对象
const params = {};
decodedScene.split('&').forEach(item => {
const [key, value] = item.split('=');
params[key] = value;
});
const diagnosisId = currentPage.options.id ||params.id|| 4;
console.log('nihhhhhh',pages,params,diagnosisId)
if (!diagnosisId) {
uni.showToast({ title: '缺少诊单ID', icon: 'none' });
return;
}
uni.showLoading({ title: '加载中...' });
try {
// 通过 proxy 调用全局的 apiUrl
const res = await proxy.apiUrl({
url: '/api/tcm/diagnosisDetail',
method: 'GET',
data: {
id: diagnosisId
},
}, false); // 不显示加载中
if (res.code === 1) {
formData.value = res.data;
} else {
uni.showToast({ title: res.msg || '加载失败', icon: 'none' });
}
} catch (err) {
uni.showToast({ title: '请求失败', icon: 'none' });
console.error(err);
} finally {
uni.hideLoading();
}
};
// 获取选中项名称
const getDiagnosisTypeName = () => {
const item = diagnosisTypeOptions.value.find(i => i.value === formData.value.diagnosis_type);
return item ? item.name : '';
};
const getSyndromeTypeName = () => {
const item = syndromeTypeOptions.value.find(i => i.value === formData.value.syndrome_type);
return item ? item.name : '';
};
const getDiabetesTypeName = () => {
const item = diabetesTypeOptions.value.find(i => i.value === formData.value.diabetes_type);
return item ? item.name : '';
};
const getAppetiteName = () => {
const item = appetiteOptions.value.find(i => i.value === formData.value.appetite);
return item ? item.name : '';
};
const getWaterIntakeName = () => {
const item = waterIntakeOptions.value.find(i => i.value === formData.value.water_intake);
return item ? item.name : '';
};
const getWeightChangeName = () => {
const item = weightChangeOptions.value.find(i => i.value === formData.value.weight_change);
return item ? item.name : '';
};
const getFattyLiverDegreeName = () => {
const item = fattyLiverDegreeOptions.value.find(i => i.value === formData.value.fatty_liver_degree);
return item ? item.name : '';
};
const getDietConditionNames = () => {
if (!formData.value.diet_condition || formData.value.diet_condition.length === 0) return [];
// 处理字符串类型(逗号分隔)或数组类型
const values = Array.isArray(formData.value.diet_condition)
? formData.value.diet_condition
: formData.value.diet_condition.split(',');
return values.map(val => {
const item = dietConditionOptions.value.find(i => i.value === val);
return item ? item.name : val;
}).filter(Boolean);
};
const getBodyFeelingNames = () => {
if (!formData.value.body_feeling || formData.value.body_feeling.length === 0) return [];
// 处理字符串类型(逗号分隔)或数组类型
const values = Array.isArray(formData.value.body_feeling)
? formData.value.body_feeling
: formData.value.body_feeling.split(',');
return values.map(val => {
const item = bodyFeelingOptions.value.find(i => i.value === val);
return item ? item.name : val;
}).filter(Boolean);
};
const getSleepConditionNames = () => {
if (!formData.value.sleep_condition || formData.value.sleep_condition.length === 0) return [];
// 处理字符串类型(逗号分隔)或数组类型
const values = Array.isArray(formData.value.sleep_condition)
? formData.value.sleep_condition
: formData.value.sleep_condition.split(',');
return values.map(val => {
const item = sleepConditionOptions.value.find(i => i.value === val);
return item ? item.name : val;
}).filter(Boolean);
};
const getPastHistoryNames = () => {
if (!formData.value.past_history || formData.value.past_history.length === 0) return [];
// 处理字符串类型(逗号分隔)或数组类型
const values = Array.isArray(formData.value.past_history)
? formData.value.past_history
: formData.value.past_history.split(',');
return values.map(val => {
const item = pastHistoryOptions.value.find(i => i.value === val);
return item ? item.name : val;
}).filter(Boolean);
};
// 预览图片
const previewImage = (current) => {
uni.previewImage({
current,
urls: formData.value.tongue_images
});
};
// 确认诊单
const handleConfirm = () => {
uni.showModal({
title: '确认诊单',
content: '确认后将无法修改,是否确认?',
success: (res) => {
if (res.confirm) {
confirmDiagnosis();
}
}
});
};
// 提交确认诊单
const confirmDiagnosis = async () => {
const pages = getCurrentPages();
const currentPage = pages[pages.length - 1];
// 假设你的对象是 ai
const scene = currentPage.options.scene;
// 1. 先对 scene 进行 URL 解码
const decodedScene = decodeURIComponent(scene);
// 得到 "id=4&share_user=1"
// 2. 解析成键值对对象
const params = {};
decodedScene.split('&').forEach(item => {
const [key, value] = item.split('=');
params[key] = value;
});
const diagnosisId = currentPage.options.id ||params.id|| 4;
console.log('nihhhhhh',pages,params,diagnosisId)
if (!params.id) {
uni.showToast({ title: '缺少诊单ID', icon: 'none' });
return;
}
uni.showLoading({ title: '提交中...' });
try {
const res = await proxy.apiUrl({
url: '/api/tcm/confirmDiagnosis',
method: 'POST',
data: {
id: params.id,
share_user: params.share_user
}
}, false);
if (res.code === 1) {
uni.showToast({
title: '确认成功',
icon: 'success',
duration: 2000
});
setTimeout(() => {
uni.navigateBack();
}, 2000);
} else {
uni.showToast({ title: res.msg || '确认失败', icon: 'none' });
}
} catch (err) {
uni.showToast({ title: '请求失败', icon: 'none' });
console.error(err);
} finally {
uni.hideLoading();
}
};
</script>
<style lang="scss">
.container {
min-height: 100vh;
background-color: #f5f5f5;
}
.form-wrapper {
padding: 20rpx;
padding-bottom: 140rpx; /* 为底部按钮留出空间 */
}
.section {
background-color: #fff;
border-radius: 16rpx;
padding: 30rpx;
margin-bottom: 20rpx;
}
.section-title {
font-size: 32rpx;
font-weight: bold;
color: #333;
margin-bottom: 30rpx;
padding-bottom: 20rpx;
border-bottom: 2rpx solid #f0f0f0;
}
.info-item {
display: flex;
margin-bottom: 24rpx;
line-height: 1.6;
&:last-child {
margin-bottom: 0;
}
}
.label {
flex-shrink: 0;
width: 180rpx;
font-size: 28rpx;
color: #666;
font-weight: 500;
}
.value {
flex: 1;
font-size: 28rpx;
color: #333;
word-break: break-all;
&.multi-line {
white-space: pre-wrap;
line-height: 1.8;
}
}
.tag-list {
flex: 1;
display: flex;
flex-wrap: wrap;
gap: 16rpx;
}
.tag {
display: inline-block;
padding: 8rpx 20rpx;
background-color: #f0f5ff;
color: #1890ff;
font-size: 24rpx;
border-radius: 8rpx;
}
.image-list {
flex: 1;
display: flex;
flex-wrap: wrap;
gap: 20rpx;
}
.tongue-image {
width: 200rpx;
height: 200rpx;
border-radius: 8rpx;
}
.fixed-bottom {
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 20rpx 30rpx;
padding-bottom: calc(20rpx + env(safe-area-inset-bottom));
background: linear-gradient(to top, rgba(255, 255, 255, 1) 0%, rgba(255, 255, 255, 0.95) 80%, rgba(255, 255, 255, 0) 100%);
z-index: 100;
}
.confirm-btn {
width: 100%;
height: 88rpx;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: #fff;
font-size: 32rpx;
font-weight: 500;
border-radius: 44rpx;
border: none;
box-shadow: 0 8rpx 24rpx rgba(102, 126, 234, 0.3);
}
</style>
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

+19
View File
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="375px" height="268px" viewBox="0 0 375 268" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 61.2 (89653) - https://sketch.com -->
<title>背景</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="50%" y1="81.9277858%" x2="50%" y2="100%" id="linearGradient-1">
<stop stop-color="#006EFF" offset="0%"></stop>
<stop stop-color="#00C8DC" offset="100%"></stop>
</linearGradient>
</defs>
<g id="浅色版本" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="主页" fill="url(#linearGradient-1)">
<g id="编组-4" transform="translate(-315.000000, -732.000000)">
<circle id="蒙版" cx="500" cy="500" r="500"></circle>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 916 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

+5
View File
@@ -0,0 +1,5 @@
{
"compilerOptions": {
"experimentalDecorators": true
}
}
+10
View File
@@ -0,0 +1,10 @@
uni.addInterceptor({
returnValue (res) {
if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
return res;
}
return new Promise((resolve, reject) => {
res.then((res) => res[0] ? reject(res[0]) : resolve(res[1]));
});
},
});
+76
View File
@@ -0,0 +1,76 @@
/**
* 这里是uni-app内置的常用样式变量
*
* uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
* 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
*
*/
/**
* 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
*
* 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
*/
/* 颜色变量 */
/* 行为相关颜色 */
$uni-color-primary: #007aff;
$uni-color-success: #4cd964;
$uni-color-warning: #f0ad4e;
$uni-color-error: #dd524d;
/* 文字基本颜色 */
$uni-text-color:#333;//基本色
$uni-text-color-inverse:#fff;//反色
$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
$uni-text-color-placeholder: #808080;
$uni-text-color-disable:#c0c0c0;
/* 背景颜色 */
$uni-bg-color:#ffffff;
$uni-bg-color-grey:#f8f8f8;
$uni-bg-color-hover:#f1f1f1;//点击状态颜色
$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
/* 边框颜色 */
$uni-border-color:#c8c7cc;
/* 尺寸变量 */
/* 文字尺寸 */
$uni-font-size-sm:12px;
$uni-font-size-base:14px;
$uni-font-size-lg:16;
/* 图片尺寸 */
$uni-img-size-sm:20px;
$uni-img-size-base:26px;
$uni-img-size-lg:40px;
/* Border Radius */
$uni-border-radius-sm: 2px;
$uni-border-radius-base: 3px;
$uni-border-radius-lg: 6px;
$uni-border-radius-circle: 50%;
/* 水平间距 */
$uni-spacing-row-sm: 5px;
$uni-spacing-row-base: 10px;
$uni-spacing-row-lg: 15px;
/* 垂直间距 */
$uni-spacing-col-sm: 4px;
$uni-spacing-col-base: 8px;
$uni-spacing-col-lg: 12px;
/* 透明度 */
$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
/* 文章场景相关 */
$uni-color-title: #2C405A; // 文章标题颜色
$uni-font-size-title:20px;
$uni-color-subtitle: #555555; // 二级标题颜色
$uni-font-size-subtitle:26px;
$uni-color-paragraph: #3F536E; // 文章段落颜色
$uni-font-size-paragraph:15px;
+7
View File
@@ -98,3 +98,10 @@ export function endCall(params: any) {
export function getCallRecords(params: any) {
return request.get({ url: '/tcm.diagnosis/getCallRecords', params })
}
// ========== 小程序分享 ==========
// 生成小程序码
export function generateMiniProgramQrcode(params: any) {
return request.post({ url: '/tcm.diagnosis/generateMiniProgramQrcode', params })
}
+169 -58
View File
@@ -77,9 +77,9 @@
/>
<!-- 有排班时显示日期和时间段 -->
<template v-else>
<div v-else class="appointment-time-container">
<!-- 日期选择 -->
<div class="date-selector mb-5">
<div class="date-selector">
<el-button
v-for="dateOption in dateOptions"
:key="dateOption.date"
@@ -91,30 +91,46 @@
</el-button>
</div>
<!-- 时间段网格 -->
<div v-if="form.date" class="time-slots-grid">
<div
v-for="slot in filteredTimeSlots"
:key="slot.time"
class="time-slot-item"
:class="{
'available': slot.available,
'unavailable': !slot.available,
'selected': form.appointmentTime === slot.time
}"
@click="selectTimeSlot(slot)"
>
<div class="slot-time">{{ slot.time }}</div>
<el-tag
:type="slot.available ? 'success' : 'info'"
<!-- 时间段区域 -->
<div v-if="form.date" class="time-slots-container">
<!-- 时间段标题和刷新按钮 -->
<div class="time-slots-header">
<span class="header-title">可预约时段</span>
<el-button
text
type="primary"
size="small"
class="slot-badge"
:loading="refreshing"
@click="handleRefreshSlots"
>
{{ slot.available ? '可约' : '已约' }}
</el-tag>
<template #icon>
<Refresh />
</template>
刷新
</el-button>
</div>
<!-- 时间段网格 -->
<div class="time-slots-grid">
<div
v-for="slot in filteredTimeSlots"
:key="slot.time"
class="time-slot-item"
:class="{
'available': slot.available,
'unavailable': !slot.available,
'selected': form.appointmentTime === slot.time
}"
@click="selectTimeSlot(slot)"
>
<div class="slot-time">{{ slot.time }}</div>
<div class="slot-status" :class="{ 'status-available': slot.available }">
{{ slot.available ? '可约' : '已约' }}
</div>
</div>
</div>
</div>
</template>
</div>
</el-form-item>
<!-- 备注 -->
@@ -147,6 +163,7 @@
<script setup lang="ts">
import { ref, reactive, computed, nextTick } from 'vue'
import { Refresh } from '@element-plus/icons-vue'
import dayjs from 'dayjs'
import isoWeek from 'dayjs/plugin/isoWeek'
import { getDoctors } from '@/api/tcm'
@@ -169,6 +186,7 @@ interface DateOption {
const visible = ref(false)
const loading = ref(false)
const submitting = ref(false)
const refreshing = ref(false)
const doctorList = ref<any[]>([])
const timeSlots = ref<TimeSlot[]>([])
const lastVisit = ref('')
@@ -373,7 +391,8 @@ const loadDoctorRoster = async () => {
// 提取有排班的日期
if (res?.lists && res.lists.length > 0) {
doctorRosterDates.value = [...new Set(res.lists.map((item: any) => item.date))].sort()
doctorRosterDates.value = [...new Set(res.lists.map((item: any) => item.date))] as string[]
doctorRosterDates.value.sort()
// 自动选择日期:优先选择今天,如果今天没有排班则选择第一个有排班的日期
await nextTick()
@@ -449,6 +468,35 @@ const selectTimeSlot = (slot: TimeSlot) => {
form.appointmentTime = slot.time
}
// 刷新时间段
const handleRefreshSlots = async () => {
if (!selectedDoctorId.value || !form.date) {
return
}
try {
refreshing.value = true
const previousSelection = form.appointmentTime
form.appointmentTime = ''
await loadTimeSlots()
if (previousSelection) {
const slot = timeSlots.value.find(s => s.time === previousSelection)
if (slot && slot.available) {
form.appointmentTime = previousSelection
}
}
feedback.msgSuccess('刷新成功')
} catch (error) {
console.error('刷新失败:', error)
feedback.msgError('刷新失败,请重试')
} finally {
refreshing.value = false
}
}
// 确认挂号
const handleConfirm = async () => {
if (!selectedDoctorId.value) {
@@ -518,84 +566,147 @@ defineExpose({ open })
}
}
.appointment-time-container {
width: 100%;
}
.date-selector {
display: flex;
gap: 8px;
gap: 10px;
flex-wrap: wrap;
margin-bottom: 20px;
.date-button {
min-width: 120px;
min-width: 130px;
height: 40px;
font-size: 14px;
border-radius: 8px;
transition: all 0.2s;
&:hover {
transform: translateY(-2px);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
}
}
.time-slots-container {
background-color: #f8f9fa;
border-radius: 8px;
padding: 16px;
}
.time-slots-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 16px;
.header-title {
font-size: 15px;
font-weight: 600;
color: #303133;
}
}
.time-slots-grid {
display: grid;
grid-template-columns: repeat(6, 1fr);
gap: 12px;
max-height: 400px;
grid-template-columns: repeat(auto-fill, minmax(110px, 1fr));
gap: 10px;
max-height: 450px;
overflow-y: auto;
padding: 4px;
padding: 2px;
&::-webkit-scrollbar {
width: 6px;
}
&::-webkit-scrollbar-thumb {
background-color: #dcdfe6;
border-radius: 3px;
&:hover {
background-color: #c0c4cc;
}
}
.time-slot-item {
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
padding: 10px 12px;
border: 1px solid #e5e7eb;
border-radius: 6px;
justify-content: center;
padding: 0px 8px;
border: 2px solid #e4e7ed;
border-radius: 8px;
cursor: pointer;
transition: all 0.3s;
transition: all 0.2s;
background-color: #fff;
min-height: 70px;
.slot-time {
font-size: 14px;
font-weight: 500;
font-size: 15px;
font-weight: 600;
color: #303133;
margin-bottom: 6px;
}
.slot-badge {
margin-left: 8px;
.slot-status {
font-size: 12px;
color: #909399;
padding: 0px 8px;
border-radius: 4px;
background-color: #f4f4f5;
&.status-available {
color: #67c23a;
background-color: #f0f9ff;
}
}
&.available {
border-color: #d1d5db;
background-color: #fff;
border-color: #e4e7ed;
&:hover {
border-color: #3b82f6;
background-color: #eff6ff;
border-color: #409eff;
background-color: #ecf5ff;
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(64, 158, 255, 0.15);
}
}
&.unavailable {
background-color: #f3f4f6;
border-color: #e5e7eb;
color: #9ca3af;
background-color: #f5f7fa;
border-color: #e4e7ed;
cursor: not-allowed;
opacity: 0.6;
.slot-time {
color: #9ca3af;
color: #c0c4cc;
}
:deep(.el-tag) {
background-color: #f3f4f6;
border-color: #e5e7eb;
color: #9ca3af;
.slot-status {
color: #c0c4cc;
background-color: #f5f7fa;
}
&:hover {
transform: none;
box-shadow: none;
}
}
&.selected {
border-color: #3b82f6;
background-color: #3b82f6;
color: white;
border-color: #409eff;
background: linear-gradient(135deg, #409eff 0%, #66b1ff 100%);
box-shadow: 0 4px 12px rgba(64, 158, 255, 0.3);
.slot-time {
color: white;
color: #fff;
}
:deep(.el-tag) {
background-color: #2563eb;
border-color: #2563eb;
color: white;
.slot-status {
color: #fff;
background-color: rgba(255, 255, 255, 0.2);
}
}
}
+118 -2
View File
@@ -102,7 +102,11 @@
<el-tag v-else type="danger">禁用</el-tag>
</template>
</el-table-column>
<el-table-column label="创建时间" prop="create_time" min-width="160" />
<el-table-column label="创建时间" prop="create_time" min-width="160">
<template #default="{ row }">
<span>{{ formatDateTime(row.create_time) }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="240" fixed="right">
<template #default="{ row }">
<el-button type="primary" link @click="handleDetail(row.id)">
@@ -139,6 +143,14 @@
@click="handleAppointment(row)"
>
挂号
</el-button>
<el-button
v-perms="['tcm.diagnosis/guahao']"
type="success"
link
@click="handleMiniProgramQRCode(row)"
>
小程序二维码
</el-button>
<el-button type="primary" link @click="handleEdit(row.id)" v-perms="['tcm.diagnosis/edit']">
编辑
@@ -159,6 +171,39 @@
<video-call ref="videoCallRef" />
<appointment-popup ref="appointmentRef" @success="getLists" />
<!-- 小程序二维码弹窗 -->
<el-dialog
v-model="qrcodeDialogVisible"
title="小程序二维码"
width="400px"
:close-on-click-modal="false"
>
<div class="flex flex-col items-center justify-center py-4">
<div v-if="qrcodeLoading" class="text-center">
<el-icon class="is-loading" :size="40">
<Loading />
</el-icon>
<div class="mt-4 text-gray-500">生成中...</div>
</div>
<div v-else-if="qrcodeUrl" class="text-center">
<img :src="qrcodeUrl" alt="小程序二维码" class="w-64 h-64 border border-gray-200 rounded" />
<div class="mt-4 text-sm text-gray-600">
<div>患者{{ currentQRCodePatient?.patient_name }}</div>
<div class="mt-2">请使用微信扫描二维码</div>
</div>
</div>
<div v-else class="text-center text-gray-500">
生成失败请重试
</div>
</div>
<template #footer>
<el-button @click="qrcodeDialogVisible = false">关闭</el-button>
<el-button v-if="!qrcodeLoading" type="primary" @click="handleRegenerateQRCode">
重新生成
</el-button>
</template>
</el-dialog>
<!-- 批量指派医助弹窗 -->
<el-dialog
v-model="assignDialogVisible"
@@ -208,14 +253,26 @@
</template>
<script setup lang="ts" name="tcmDiagnosis">
import { tcmDiagnosisLists, tcmDiagnosisDelete, tcmDiagnosisAssign, getAssistants } from '@/api/tcm'
import { tcmDiagnosisLists, tcmDiagnosisDelete, tcmDiagnosisAssign, getAssistants, generateMiniProgramQrcode } from '@/api/tcm'
import { usePaging } from '@/hooks/usePaging'
import { getDictData } from '@/api/app'
import { getWeappConfig } from '@/api/channel/weapp'
import feedback from '@/utils/feedback'
import { Loading } from '@element-plus/icons-vue'
import EditPopup from './edit.vue'
import DetailPopup from './detail.vue'
import VideoCall from '@/components/video-call/index.vue'
import AppointmentPopup from './appointment.vue'
import useUserStore from '@/stores/modules/user'
import dayjs from 'dayjs'
// 格式化时间戳为日期时间
const formatDateTime = (timestamp: number | string) => {
if (!timestamp) return '-'
// 如果是秒级时间戳(10位),转换为毫秒级
const ts = String(timestamp).length === 10 ? Number(timestamp) * 1000 : Number(timestamp)
return dayjs(ts).format('YYYY-MM-DD HH:mm:ss')
}
const formData = ref({
patient_name: '',
@@ -284,6 +341,13 @@ const editRef = ref()
const detailRef = ref()
const videoCallRef = ref()
const appointmentRef = ref()
const userStore = useUserStore()
// 小程序二维码相关
const qrcodeDialogVisible = ref(false)
const qrcodeLoading = ref(false)
const qrcodeUrl = ref('')
const currentQRCodePatient = ref<any>(null)
// 批量指派相关
const selectedIds = ref<number[]>([])
@@ -433,6 +497,58 @@ const handleAppointment = (row: any) => {
appointmentRef.value?.open(row)
}
// 生成小程序二维码
const handleMiniProgramQRCode = async (row: any) => {
if (!row.patient_id) {
feedback.msgWarning('患者信息不完整')
return
}
currentQRCodePatient.value = row
qrcodeDialogVisible.value = true
qrcodeLoading.value = true
qrcodeUrl.value = ''
try {
// 获取小程序配置
const config = await getWeappConfig()
if (!config?.app_id) {
feedback.msgError('小程序未配置,请先配置小程序信息')
qrcodeDialogVisible.value = false
return
}
// 获取当前登录用户信息
const currentUser = userStore.userInfo
// 调用生成二维码接口
const result = await generateMiniProgramQrcode({
diagnosis_id: row.id,
patient_id: row.patient_id,
share_user_id: currentUser?.id || ''
})
if (result?.qrcode_url) {
qrcodeUrl.value = result.qrcode_url
} else {
feedback.msgError('二维码生成失败')
}
} catch (error: any) {
console.error('生成小程序二维码失败:', error)
feedback.msgError(error?.msg || '生成二维码失败,请重试')
} finally {
qrcodeLoading.value = false
}
}
// 重新生成二维码
const handleRegenerateQRCode = () => {
if (currentQRCodePatient.value) {
handleMiniProgramQRCode(currentQRCodePatient.value)
}
}
onMounted(async () => {
await getDictOptions()
getLists()
Binary file not shown.
+271
View File
@@ -0,0 +1,271 @@
<?php
/**
* 向DiagnosisLogic.php添加小程序二维码相关方法
*/
$file = __DIR__ . '/app/adminapi/logic/tcm/DiagnosisLogic.php';
// 读取文件内容
$content = file_get_contents($file);
// 检查是否已经存在这些方法
if (strpos($content, 'generateMiniProgramQrcode') !== false) {
echo "方法已存在,无需添加\n";
exit(0);
}
// 要添加的方法
$methods = <<<'PHP'
/**
* @notes 生成小程序码
* @param array $params
* @return array|false
*/
public static function generateMiniProgramQrcode(array $params)
{
try {
$diagnosisId = $params['diagnosis_id'];
$patientId = $params['patient_id'];
$shareUserId = $params['share_user_id'];
// 获取小程序配置
$config = self::getMiniProgramConfig();
if (!$config) {
throw new \Exception('小程序配置未设置');
}
// 构建小程序路径和参数
$page = 'pages/order/monad/monad';
$scene = "id={$diagnosisId}&share_user={$shareUserId}";
// 调用微信接口生成小程序码
$qrcodeUrl = self::generateWxQrcode($config, $page, $scene);
if (!$qrcodeUrl) {
throw new \Exception('生成小程序码失败: ' . self::getError());
}
return [
'qrcode_url' => $qrcodeUrl,
'diagnosis_id' => $diagnosisId,
'patient_id' => $patientId
];
} catch (\Exception $e) {
self::setError($e->getMessage());
return false;
}
}
/**
* @notes 获取小程序配置
* @return array|null
*/
private static function getMiniProgramConfig(): ?array
{
try {
// 从配置表获取小程序配置
$appId = \app\common\service\ConfigService::get('mnp_setting', 'app_id', '');
$appSecret = \app\common\service\ConfigService::get('mnp_setting', 'app_secret', '');
if (empty($appId) || empty($appSecret)) {
return null;
}
return [
'app_id' => $appId,
'app_secret' => $appSecret
];
} catch (\Exception $e) {
return null;
}
}
/**
* @notes 生成微信小程序码
* @param array $config
* @param string $page
* @param string $scene
* @return string|false
*/
private static function generateWxQrcode(array $config, string $page, string $scene)
{
try {
// 记录请求参数
\think\facade\Log::info('开始生成小程序码', [
'page' => $page,
'scene' => $scene,
'app_id' => $config['app_id']
]);
// 获取access_token
$accessToken = self::getWxAccessToken($config['app_id'], $config['app_secret']);
if (!$accessToken) {
throw new \Exception('获取access_token失败: ' . self::getError());
}
// 调用微信接口生成小程序码
$url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={$accessToken}";
$data = [
'scene' => $scene,
'page' => $page,
'check_path' => false,
'env_version' => 'release',
'width' => 280
];
\think\facade\Log::info('调用微信API生成小程序码', ['data' => $data]);
$response = self::httpPost($url, json_encode($data));
// 检查是否返回错误(JSON格式)
$result = json_decode($response, true);
if (is_array($result) && isset($result['errcode']) && $result['errcode'] != 0) {
$errorMsg = "生成小程序码失败: errcode={$result['errcode']}, errmsg=" . ($result['errmsg'] ?? '未知错误');
\think\facade\Log::error($errorMsg);
// 如果是AccessToken错误,清除缓存
if ($result['errcode'] == 40001 || $result['errcode'] == 42001) {
$cacheKey = 'wx_access_token_' . $config['app_id'];
cache($cacheKey, null);
\think\facade\Log::info('已清除无效的AccessToken缓存');
}
throw new \Exception($errorMsg);
}
// 如果不是JSON错误,说明返回的是图片二进制数据
// 保存图片
$filename = 'qrcode_' . $config['app_id'] . '_' . md5($scene) . '_' . time() . '.png';
$savePath = 'uploads/qrcode/' . date('Ymd') . '/';
$fullPath = public_path() . $savePath;
if (!is_dir($fullPath)) {
mkdir($fullPath, 0755, true);
}
$saved = file_put_contents($fullPath . $filename, $response);
if (!$saved) {
throw new \Exception('保存二维码图片失败');
}
$qrcodeUrl = request()->domain() . '/' . $savePath . $filename;
\think\facade\Log::info('小程序码生成成功', ['url' => $qrcodeUrl]);
return $qrcodeUrl;
} catch (\Exception $e) {
\think\facade\Log::error('generateWxQrcode异常: ' . $e->getMessage());
self::setError($e->getMessage());
return false;
}
}
/**
* @notes 获取微信access_token
* @param string $appId
* @param string $appSecret
* @return string|false
*/
private static function getWxAccessToken(string $appId, string $appSecret)
{
try {
// 尝试从缓存获取
$cacheKey = 'wx_access_token_' . $appId;
$accessToken = cache($cacheKey);
if ($accessToken) {
return $accessToken;
}
// 从微信服务器获取
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appId}&secret={$appSecret}";
$response = self::httpGet($url);
// 记录原始响应用于调试
\think\facade\Log::info('微信AccessToken响应: ' . $response);
$result = json_decode($response, true);
// 检查是否有错误
if (isset($result['errcode']) && $result['errcode'] != 0) {
$errorMsg = "获取AccessToken失败: errcode={$result['errcode']}, errmsg=" . ($result['errmsg'] ?? '未知错误');
\think\facade\Log::error($errorMsg);
throw new \Exception($errorMsg);
}
if (isset($result['access_token'])) {
// 缓存access_token,有效期7000秒(微信官方7200秒,提前200秒过期)
cache($cacheKey, $result['access_token'], 7000);
\think\facade\Log::info('AccessToken获取成功并已缓存');
return $result['access_token'];
}
throw new \Exception('获取access_token失败: 响应中没有access_token字段');
} catch (\Exception $e) {
\think\facade\Log::error('getWxAccessToken异常: ' . $e->getMessage());
self::setError($e->getMessage());
return false;
}
}
/**
* @notes HTTP GET请求
* @param string $url
* @return string|false
*/
private static function httpGet(string $url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
/**
* @notes HTTP POST请求
* @param string $url
* @param string $data
* @return string|false
*/
private static function httpPost(string $url, string $data)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
PHP;
// 在最后一个}之前插入方法
$lastBrace = strrpos($content, '}');
if ($lastBrace !== false) {
$content = substr($content, 0, $lastBrace) . $methods . "\n}";
} else {
echo "错误:找不到类的结束括号\n";
exit(1);
}
// 写回文件
file_put_contents($file, $content);
echo "✓ 方法添加成功\n";
echo "已添加以下方法:\n";
echo " - generateMiniProgramQrcode()\n";
echo " - getMiniProgramConfig()\n";
echo " - generateWxQrcode()\n";
echo " - getWxAccessToken()\n";
echo " - httpGet()\n";
echo " - httpPost()\n";
@@ -272,4 +272,15 @@ class DiagnosisController extends BaseAdminController
$result = DiagnosisLogic::getDoctors();
return $this->data($result);
}
/**
* @notes 生成小程序码
* @return \think\response\Json
*/
public function generateMiniProgramQrcode()
{
$params = (new DiagnosisValidate())->post()->goCheck('generateQrcode');
$result = DiagnosisLogic::generateMiniProgramQrcode($params);
return $this->data($result);
}
}
@@ -800,4 +800,252 @@ class DiagnosisLogic extends BaseLogic
return [];
}
}
}
/**
* @notes 生成小程序码
* @param array $params
* @return array|false
*/
public static function generateMiniProgramQrcode(array $params)
{
try {
$diagnosisId = $params['diagnosis_id'];
$patientId = $params['patient_id'];
$shareUserId = $params['share_user_id'];
// 获取小程序配置
$config = self::getMiniProgramConfig();
if (!$config) {
throw new \Exception('小程序配置未设置');
}
// 构建小程序路径和参数
$page = 'pages/order/monad/monad';
$scene = "id={$diagnosisId}&share_user={$shareUserId}";
// 调用微信接口生成小程序码
$qrcodeUrl = self::generateWxQrcode($config, $page, $scene);
if (!$qrcodeUrl) {
throw new \Exception('生成小程序码失败: ' . self::getError());
}
return [
'qrcode_url' => $qrcodeUrl,
'diagnosis_id' => $diagnosisId,
'patient_id' => $patientId
];
} catch (\Exception $e) {
self::setError($e->getMessage());
return false;
}
}
/**
* @notes 获取小程序配置
* @return array|null
*/
private static function getMiniProgramConfig(): ?array
{
try {
// 从配置表获取小程序配置
$appId = \app\common\service\ConfigService::get('mnp_setting', 'app_id', '');
$appSecret = \app\common\service\ConfigService::get('mnp_setting', 'app_secret', '');
if (empty($appId) || empty($appSecret)) {
return null;
}
return [
'app_id' => $appId,
'app_secret' => $appSecret
];
} catch (\Exception $e) {
return null;
}
}
/**
* @notes 生成微信小程序码
* @param array $config
* @param string $page
* @param string $scene
* @return string|false
*/
private static function generateWxQrcode(array $config, string $page, string $scene, int $retryCount = 0)
{
try {
// 记录请求参数
\think\facade\Log::info('开始生成小程序码', [
'page' => $page,
'scene' => $scene,
'app_id' => $config['app_id'],
'retry_count' => $retryCount
]);
// 获取access_token(如果是重试,强制刷新)
$forceRefresh = $retryCount > 0;
$accessToken = self::getWxAccessToken($config['app_id'], $config['app_secret'], $forceRefresh);
if (!$accessToken) {
throw new \Exception('获取access_token失败: ' . self::getError());
}
// 调用微信接口生成小程序码
$url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={$accessToken}";
$data = [
'scene' => $scene,
'page' => $page,
'check_path' => false,
'env_version' => 'release',
'width' => 280
];
$response = self::httpPost($url, json_encode($data));
// 检查是否返回错误(JSON格式)
$result = json_decode($response, true);
if (is_array($result) && isset($result['errcode']) && $result['errcode'] != 0) {
$errorMsg = "生成小程序码失败: errcode={$result['errcode']}, errmsg=" . ($result['errmsg'] ?? '未知错误');
\think\facade\Log::error($errorMsg);
// 如果是AccessToken错误且未重试过,自动重试一次
if (($result['errcode'] == 40001 || $result['errcode'] == 42001) && $retryCount < 1) {
\think\facade\Log::info('AccessToken失效,自动重试(第' . ($retryCount + 1) . '次)');
// 清除缓存
$cacheKey = 'wx_access_token_' . $config['app_id'];
cache($cacheKey, null);
// 递归调用,重试一次
return self::generateWxQrcode($config, $page, $scene, $retryCount + 1);
}
throw new \Exception($errorMsg);
}
// 如果不是JSON错误,说明返回的是图片二进制数据
// 保存图片
$filename = 'qrcode_' . $config['app_id'] . '_' . md5($scene) . '_' . time() . '.png';
$savePath = 'uploads/qrcode/' . date('Ymd') . '/';
$fullPath = public_path() . $savePath;
if (!is_dir($fullPath)) {
mkdir($fullPath, 0755, true);
}
$saved = file_put_contents($fullPath . $filename, $response);
if (!$saved) {
throw new \Exception('保存二维码图片失败');
}
$qrcodeUrl = request()->domain() . '/' . $savePath . $filename;
\think\facade\Log::info('小程序码生成成功', ['url' => $qrcodeUrl, 'retry_count' => $retryCount]);
return $qrcodeUrl;
} catch (\Exception $e) {
\think\facade\Log::error('generateWxQrcode异常: ' . $e->getMessage());
self::setError($e->getMessage());
return false;
}
}
/**
* @notes 获取微信access_token
* @param string $appId
* @param string $appSecret
* @param bool $forceRefresh 是否强制刷新(不使用缓存)
* @return string|false
*/
private static function getWxAccessToken(string $appId, string $appSecret, bool $forceRefresh = false)
{
try {
$cacheKey = 'wx_access_token_' . $appId;
// 如果不是强制刷新,尝试从缓存获取
if (!$forceRefresh) {
$accessToken = cache($cacheKey);
if ($accessToken) {
\think\facade\Log::info('使用缓存的AccessToken');
return $accessToken;
}
} else {
\think\facade\Log::info('强制刷新AccessToken,清除缓存');
cache($cacheKey, null);
}
// 从微信服务器获取
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appId}&secret={$appSecret}";
$response = self::httpGet($url);
// 记录原始响应用于调试
\think\facade\Log::info('微信AccessToken响应: ' . $response);
$result = json_decode($response, true);
// 检查是否有错误
if (isset($result['errcode']) && $result['errcode'] != 0) {
$errorMsg = "获取AccessToken失败: errcode={$result['errcode']}, errmsg=" . ($result['errmsg'] ?? '未知错误');
\think\facade\Log::error($errorMsg);
throw new \Exception($errorMsg);
}
if (isset($result['access_token'])) {
// 缓存access_token,有效期7000秒(微信官方7200秒,提前200秒过期)
cache($cacheKey, $result['access_token'], 7000);
\think\facade\Log::info('AccessToken获取成功并已缓存');
return $result['access_token'];
}
throw new \Exception('获取access_token失败: 响应中没有access_token字段');
} catch (\Exception $e) {
\think\facade\Log::error('getWxAccessToken异常: ' . $e->getMessage());
self::setError($e->getMessage());
return false;
}
}
/**
* @notes HTTP GET请求
* @param string $url
* @return string|false
*/
private static function httpGet(string $url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
/**
* @notes HTTP POST请求
* @param string $url
* @param string $data
* @return string|false
*/
private static function httpPost(string $url, string $data)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
}
@@ -0,0 +1,231 @@
/**
* @notes 生成小程序码
* @param array $params
* @return array|false
*/
public static function generateMiniProgramQrcode(array $params)
{
try {
$diagnosisId = $params['diagnosis_id'];
$patientId = $params['patient_id'];
$shareUserId = $params['share_user_id'];
// 获取小程序配置
$config = self::getMiniProgramConfig();
if (!$config) {
throw new \Exception('小程序配置未设置');
}
// 构建小程序路径和参数
$page = 'pages/order/monad/monad';
$scene = "id={$diagnosisId}&share_user={$shareUserId}";
// 调用微信接口生成小程序码
$qrcodeUrl = self::generateWxQrcode($config, $page, $scene);
if (!$qrcodeUrl) {
throw new \Exception('生成小程序码失败: ' . self::getError());
}
return [
'qrcode_url' => $qrcodeUrl,
'diagnosis_id' => $diagnosisId,
'patient_id' => $patientId
];
} catch (\Exception $e) {
self::setError($e->getMessage());
return false;
}
}
/**
* @notes 获取小程序配置
* @return array|null
*/
private static function getMiniProgramConfig(): ?array
{
try {
// 从配置表获取小程序配置
$appId = \app\common\service\ConfigService::get('mnp_setting', 'app_id', '');
$appSecret = \app\common\service\ConfigService::get('mnp_setting', 'app_secret', '');
if (empty($appId) || empty($appSecret)) {
return null;
}
return [
'app_id' => $appId,
'app_secret' => $appSecret
];
} catch (\Exception $e) {
return null;
}
}
/**
* @notes 生成微信小程序码
* @param array $config
* @param string $page
* @param string $scene
* @return string|false
*/
private static function generateWxQrcode(array $config, string $page, string $scene)
{
try {
// 记录请求参数
\think\facade\Log::info('开始生成小程序码', [
'page' => $page,
'scene' => $scene,
'app_id' => $config['app_id']
]);
// 获取access_token
$accessToken = self::getWxAccessToken($config['app_id'], $config['app_secret']);
if (!$accessToken) {
throw new \Exception('获取access_token失败: ' . self::getError());
}
// 调用微信接口生成小程序码
$url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={$accessToken}";
$data = [
'scene' => $scene,
'page' => $page,
'check_path' => false,
'env_version' => 'release',
'width' => 280
];
\think\facade\Log::info('调用微信API生成小程序码', ['data' => $data]);
$response = self::httpPost($url, json_encode($data));
// 检查是否返回错误(JSON格式)
$result = json_decode($response, true);
if (is_array($result) && isset($result['errcode']) && $result['errcode'] != 0) {
$errorMsg = "生成小程序码失败: errcode={$result['errcode']}, errmsg=" . ($result['errmsg'] ?? '未知错误');
\think\facade\Log::error($errorMsg);
// 如果是AccessToken错误,清除缓存
if ($result['errcode'] == 40001 || $result['errcode'] == 42001) {
$cacheKey = 'wx_access_token_' . $config['app_id'];
cache($cacheKey, null);
\think\facade\Log::info('已清除无效的AccessToken缓存');
}
throw new \Exception($errorMsg);
}
// 如果不是JSON错误,说明返回的是图片二进制数据
// 保存图片
$filename = 'qrcode_' . $config['app_id'] . '_' . md5($scene) . '_' . time() . '.png';
$savePath = 'uploads/qrcode/' . date('Ymd') . '/';
$fullPath = public_path() . $savePath;
if (!is_dir($fullPath)) {
mkdir($fullPath, 0755, true);
}
$saved = file_put_contents($fullPath . $filename, $response);
if (!$saved) {
throw new \Exception('保存二维码图片失败');
}
$qrcodeUrl = request()->domain() . '/' . $savePath . $filename;
\think\facade\Log::info('小程序码生成成功', ['url' => $qrcodeUrl]);
return $qrcodeUrl;
} catch (\Exception $e) {
\think\facade\Log::error('generateWxQrcode异常: ' . $e->getMessage());
self::setError($e->getMessage());
return false;
}
}
/**
* @notes 获取微信access_token
* @param string $appId
* @param string $appSecret
* @return string|false
*/
private static function getWxAccessToken(string $appId, string $appSecret)
{
try {
// 尝试从缓存获取
$cacheKey = 'wx_access_token_' . $appId;
$accessToken = cache($cacheKey);
if ($accessToken) {
return $accessToken;
}
// 从微信服务器获取
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appId}&secret={$appSecret}";
$response = self::httpGet($url);
// 记录原始响应用于调试
\think\facade\Log::info('微信AccessToken响应: ' . $response);
$result = json_decode($response, true);
// 检查是否有错误
if (isset($result['errcode']) && $result['errcode'] != 0) {
$errorMsg = "获取AccessToken失败: errcode={$result['errcode']}, errmsg=" . ($result['errmsg'] ?? '未知错误');
\think\facade\Log::error($errorMsg);
throw new \Exception($errorMsg);
}
if (isset($result['access_token'])) {
// 缓存access_token,有效期7000秒(微信官方7200秒,提前200秒过期)
cache($cacheKey, $result['access_token'], 7000);
\think\facade\Log::info('AccessToken获取成功并已缓存');
return $result['access_token'];
}
throw new \Exception('获取access_token失败: 响应中没有access_token字段');
} catch (\Exception $e) {
\think\facade\Log::error('getWxAccessToken异常: ' . $e->getMessage());
self::setError($e->getMessage());
return false;
}
}
/**
* @notes HTTP GET请求
* @param string $url
* @return string|false
*/
private static function httpGet(string $url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
/**
* @notes HTTP POST请求
* @param string $url
* @param string $data
* @return string|false
*/
private static function httpPost(string $url, string $data)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$response = curl_exec($ch);
curl_close($ch);
return $response;
}
@@ -69,6 +69,14 @@ class DiagnosisValidate extends BaseValidate
{
return $this->only(['id']);
}
public function sceneGenerateQrcode()
{
return $this->only(['diagnosis_id', 'patient_id', 'share_user_id'])
->append('diagnosis_id', 'require')
->append('patient_id', 'require')
->append('share_user_id', 'require');
}
protected function checkDiagnosis($value)
{
+42 -1
View File
@@ -15,6 +15,7 @@
namespace app\api\controller;
use app\adminapi\logic\tcm\DiagnosisLogic;
use app\adminapi\logic\ConfigLogic;
/**
* 中医诊断控制器(供小程序调用)
@@ -27,7 +28,7 @@ class TcmController extends BaseApiController
* @notes 不需要登录的方法
* @var array
*/
public array $notNeedLogin = ['getPatientSignature'];
public array $notNeedLogin = ['getPatientSignature', 'diagnosisDetail', 'getDict'];
/**
* @notes 获取患者签名(供小程序调用)
@@ -50,4 +51,44 @@ class TcmController extends BaseApiController
return $this->data($result);
}
/**
* @notes 获取诊单详情(供小程序调用)
* @return \think\response\Json
*/
public function diagnosisDetail()
{
$id = $this->request->get('id');
if (!$id) {
return $this->fail('诊单ID不能为空');
}
try {
$result = DiagnosisLogic::detail(['id' => $id]);
return $this->data($result);
} catch (\Exception $e) {
return $this->fail($e->getMessage());
}
}
/**
* @notes 获取字典数据(供小程序调用)
* @return \think\response\Json
*/
public function getDict()
{
$type = $this->request->get('type', '');
if (!$type) {
return $this->fail('字典类型不能为空');
}
try {
$data = ConfigLogic::getDictByType($type);
return $this->data($data);
} catch (\Exception $e) {
return $this->fail($e->getMessage());
}
}
}
+1 -1
View File
@@ -75,7 +75,7 @@ class WechatUserService
$unionid = $this->unionid;
$user = User::alias('u')
->field('u.id,u.sn,u.mobile,u.nickname,u.avatar,u.mobile,u.is_disable,u.is_new_user')
->field('u.id,u.sn,u.mobile,u.nickname,u.avatar,u.mobile,u.is_disable,u.is_new_user,au.openid')
->join('user_auth au', 'au.user_id = u.id')
->where(function ($query) use ($openid, $unionid) {
$query->whereOr(['au.openid' => $openid]);
+97
View File
@@ -0,0 +1,97 @@
<?php
/**
* 清除微信AccessToken缓存脚本
* 用于解决 AccessToken 失效问题
*/
require __DIR__ . '/vendor/autoload.php';
// 初始化应用
$app = new think\App();
$app->initialize();
echo "=== 清除微信AccessToken缓存 ===\n\n";
// 获取小程序配置
$appId = \app\common\service\ConfigService::get('mnp_setting', 'app_id', '');
if (empty($appId)) {
echo "✗ 错误: 未配置小程序AppID\n";
echo "请先在后台配置小程序信息\n";
exit(1);
}
echo "小程序AppID: {$appId}\n";
// 清除缓存
$cacheKey = 'wx_access_token_' . $appId;
$oldToken = cache($cacheKey);
if ($oldToken) {
echo "旧Token: {$oldToken}\n";
cache($cacheKey, null);
echo "✓ 已清除缓存的AccessToken\n";
} else {
echo "✓ 缓存中没有AccessToken\n";
}
// 尝试重新获取
echo "\n=== 尝试重新获取AccessToken ===\n\n";
$appSecret = \app\common\service\ConfigService::get('mnp_setting', 'app_secret', '');
if (empty($appSecret)) {
echo "✗ 错误: 未配置小程序AppSecret\n";
exit(1);
}
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appId}&secret={$appSecret}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "HTTP状态码: {$httpCode}\n";
echo "响应内容: {$response}\n\n";
$result = json_decode($response, true);
if (isset($result['access_token'])) {
echo "✓ AccessToken获取成功!\n";
echo "Token: {$result['access_token']}\n";
echo "有效期: {$result['expires_in']}\n";
// 缓存新Token
cache($cacheKey, $result['access_token'], 7000);
echo "\n✓ 已缓存新的AccessToken\n";
echo "\n=== 操作完成 ===\n";
echo "现在可以重新尝试生成小程序码了\n";
} else {
echo "✗ AccessToken获取失败!\n";
if (isset($result['errcode'])) {
echo "错误码: {$result['errcode']}\n";
echo "错误信息: {$result['errmsg']}\n\n";
// 常见错误提示
switch ($result['errcode']) {
case 40013:
echo "提示: AppID无效,请检查配置\n";
break;
case 40125:
echo "提示: AppSecret无效,请检查配置或重置AppSecret\n";
break;
case 40164:
echo "提示: IP不在白名单中,请在微信公众平台添加服务器IP\n";
break;
default:
echo "请参考微信官方文档: https://developers.weixin.qq.com/miniprogram/dev/framework/usability/PublicErrno.html\n";
}
}
exit(1);
}
+9
View File
@@ -1,4 +1,10 @@
<template>
<view>
<TUICallKit></TUICallKit>
</view>
</template>
<script>
import TUICallKit from "/TUICallKit/src/Components/TUICallKit";
export default {
onLaunch: function() {
console.log('App Launch')
@@ -12,6 +18,9 @@
}
</script>
<script setup>
</script>
<style>
/*每个页面公共css */
</style>
+29 -2
View File
@@ -5,6 +5,12 @@
"style": {
"navigationBarTitleText": "uni-app"
}
},
{
"path": "pages/user/user",
"style": {
"navigationBarTitleText": "uni-app"
}
}
],
"subPackages": [
@@ -14,7 +20,10 @@
{
"path": "pages/call",
"style": {
"navigationBarTitleText": "uni-app"
"navigationBarTitleText": "视频面诊",
"navigationBarHidden": true,
// 可选:如果需要沉浸式状态栏,可配置这个
"navigationStyle": "custom"
}
}
]
@@ -26,5 +35,23 @@
"navigationBarBackgroundColor": "#F8F8F8",
"backgroundColor": "#F8F8F8"
},
"uniIdRouter": {}
"uniIdRouter": {},
"tabBar": {
"color": "#7A7E83",
"selectedColor": "#3cc51f",
"borderStyle": "black",
"backgroundColor": "#ffffff",
"list": [{
"pagePath": "pages/index/index",
"iconPath": "/static/user/home.png",
"selectedIconPath": "/static/user/home_no.png",
"text": "首页"
},{
"pagePath": "pages/user/user",
"iconPath": "/static/user/user.png",
"selectedIconPath": "/static/user/user_no.png",
"text": "我的"
}]
}
}
+14
View File
@@ -0,0 +1,14 @@
<template>
<view>
<button @click="jumpUrl">跳转分包</button>
</view>
</template>
<script>
export default {
methods: {
jumpUrl() {
uni.navigateTo({ url: "/TUICallKit/pages/call" });
},
},
};
</script>
Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"version":3,"file":"BackGround.js","sources":["TUICallKit/src/Components/components/GroupCall/BackGround/BackGround.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvR3JvdXBDYWxsL0JhY2tHcm91bmQvQmFja0dyb3VuZC52dWU"],"sourcesContent":["<template>\n <Overlay\n bgColor=\"#22262ed9\"\n :bgImage=\"defaultAvatarSrc\"\n :customStyle=\"{ position: 'absolute', zIndex: 0 }\"\n />\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script lang=\"ts\" setup>\nimport Overlay from '../../base/Overlay/Overlay.vue';\nimport defaultAvatarSrc from '../../../assets/common/defaultAvatar.svg';\n</script>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/GroupCall/BackGround/BackGround.vue'\nwx.createComponent(Component)"],"names":["Component"],"mappings":";;;;;;AAiBA,MAAA,UAAoB,MAAA;AARpB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;;;;;;;;;;;;;ACZA,GAAG,gBAAgBA,SAAS;"}
{"version":3,"file":"BackGround.js","sources":["TUICallKit/src/Components/components/GroupCall/BackGround/BackGround.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvR3JvdXBDYWxsL0JhY2tHcm91bmQvQmFja0dyb3VuZC52dWU"],"sourcesContent":["<template>\n <Overlay\n bgColor=\"#22262ed9\"\n :bgImage=\"defaultAvatarSrc\"\n :customStyle=\"{ position: 'absolute', zIndex: 0 }\"\n />\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script lang=\"ts\" setup>\nimport Overlay from '../../base/Overlay/Overlay.vue';\nimport defaultAvatarSrc from '../../../assets/common/defaultAvatar.svg';\n</script>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/GroupCall/BackGround/BackGround.vue'\nwx.createComponent(Component)"],"names":["Component"],"mappings":";;;;;;AAiBA,MAAA,UAAoB,MAAA;AARpB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;;;;;;;;;;;;;ACZA,GAAG,gBAAgBA,SAAS;"}
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"version":3,"file":"StreamLoading.js","sources":["TUICallKit/src/Components/components/GroupCall/MediaContainer/StreamLoading/StreamLoading.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvR3JvdXBDYWxsL01lZGlhQ29udGFpbmVyL1N0cmVhbUxvYWRpbmcvU3RyZWFtTG9hZGluZy52dWU"],"sourcesContent":["\n<template>\n <div class=\"stream-loading-container\">\n <Loading mode=\"dot\" color=\"#FFF\" loadingWidth=\"50px\" loadingHeight=\"50px\" />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport Loading from '../../../base/Loading/Loading.vue';\n</script>\n\n<style scoped>\n.stream-loading-container {\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/GroupCall/MediaContainer/StreamLoading/StreamLoading.vue'\nwx.createComponent(Component)"],"names":[],"mappings":";;;;;AAQA,MAAA,UAAoB,MAAA;;;;;;;;;;;;;;;;;ACPpB,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"StreamLoading.js","sources":["TUICallKit/src/Components/components/GroupCall/MediaContainer/StreamLoading/StreamLoading.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvR3JvdXBDYWxsL01lZGlhQ29udGFpbmVyL1N0cmVhbUxvYWRpbmcvU3RyZWFtTG9hZGluZy52dWU"],"sourcesContent":["\n<template>\n <div class=\"stream-loading-container\">\n <Loading mode=\"dot\" color=\"#FFF\" loadingWidth=\"50px\" loadingHeight=\"50px\" />\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport Loading from '../../../base/Loading/Loading.vue';\n</script>\n\n<style scoped>\n.stream-loading-container {\n width: 100%;\n height: 100%;\n position: absolute;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/GroupCall/MediaContainer/StreamLoading/StreamLoading.vue'\nwx.createComponent(Component)"],"names":[],"mappings":";;;;;AAQA,MAAA,UAAoB,MAAA;;;;;;;;;;;;;;;;;ACPpB,GAAG,gBAAgB,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"SingleCall.js","sources":["TUICallKit/src/Components/components/SingleCall/SingleCall.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvU2luZ2xlQ2FsbC9TaW5nbGVDYWxsLnZ1ZQ"],"sourcesContent":["<template>\n <div class=\"singlecall-container\">\n <TopBar />\n <Waiting v-if=\"callStatus === CallStatus.CALLING\" />\n <MediaContainer />\n <Tip />\n <ButtonPanel />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { toRefs } from '../../../adapter-vue';\nimport { CallStatus } from '../../../TUICallService';\nimport TopBar from '../common/TopBar/TopBar.vue';\nimport Waiting from '../common/Waiting/Waiting.vue';\nimport MediaContainer from './MediaContainer/MediaContainer.vue';\nimport Tip from '../common/Tip/Tip.vue';\nimport ButtonPanel from '../common/ButtonPanel/ButtonPanel.vue';\nimport { useCallInfoContext } from '../../hooks';\n\nconst { callStatus } = toRefs(useCallInfoContext());\n</script>\n\n<style lang=\"scss\" scoped>\n.singlecall-container {\n height: 100%;\n}\n</style>","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/SingleCall/SingleCall.vue'\nwx.createComponent(Component)"],"names":["toRefs","useCallInfoContext"],"mappings":";;;;;;;;;;AAaA,MAAA,SAAmB,MAAA;AACnB,MAAA,UAAoB,MAAA;AACpB,MAAA,iBAA2B,MAAA;AAC3B,MAAA,MAAgB,MAAA;AAChB,MAAA,cAAwB,MAAA;;;;AAGxB,UAAM,EAAE,WAAe,IAAAA,qBAAOC,mDAAAA,mBAAoB,CAAA;;;;;;;;;ACnBlD,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"SingleCall.js","sources":["TUICallKit/src/Components/components/SingleCall/SingleCall.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvU2luZ2xlQ2FsbC9TaW5nbGVDYWxsLnZ1ZQ"],"sourcesContent":["<template>\n <div class=\"singlecall-container\">\n <TopBar />\n <Waiting v-if=\"callStatus === CallStatus.CALLING\" />\n <MediaContainer />\n <Tip />\n <ButtonPanel />\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { toRefs } from '../../../adapter-vue';\nimport { CallStatus } from '../../../TUICallService';\nimport TopBar from '../common/TopBar/TopBar.vue';\nimport Waiting from '../common/Waiting/Waiting.vue';\nimport MediaContainer from './MediaContainer/MediaContainer.vue';\nimport Tip from '../common/Tip/Tip.vue';\nimport ButtonPanel from '../common/ButtonPanel/ButtonPanel.vue';\nimport { useCallInfoContext } from '../../hooks';\n\nconst { callStatus } = toRefs(useCallInfoContext());\n</script>\n\n<style lang=\"scss\" scoped>\n.singlecall-container {\n height: 100%;\n}\n</style>","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/SingleCall/SingleCall.vue'\nwx.createComponent(Component)"],"names":["toRefs","useCallInfoContext"],"mappings":";;;;;;;;;;AAaA,MAAA,SAAmB,MAAA;AACnB,MAAA,UAAoB,MAAA;AACpB,MAAA,iBAA2B,MAAA;AAC3B,MAAA,MAAgB,MAAA;AAChB,MAAA,cAAwB,MAAA;;;;AAGxB,UAAM,EAAE,WAAe,IAAAA,qBAAOC,mDAAAA,mBAAoB,CAAA;;;;;;;;;ACnBlD,GAAG,gBAAgB,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Avatar.js","sources":["TUICallKit/src/Components/components/base/Avatar/Avatar.ts","TUICallKit/src/Components/components/base/Avatar/Avatar.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9BdmF0YXIvQXZhdGFyLnZ1ZQ"],"sourcesContent":["const Fit = ['fill', 'contain', 'cover'] as const;\nconst Shape = ['circle', 'square'] as const;\n\nexport const AvatarProps = {\n icon: {\n type: String,\n },\n size: {\n type: [Number, String],\n default: 100,\n },\n shape: {\n type: String,\n values: Shape,\n default: 'square',\n },\n src: {\n type: String,\n },\n defaultSrc: {\n type: String,\n },\n text: {\n type: String,\n },\n fit: {\n type: String,\n values: Fit,\n default: 'cover',\n },\n customClass: {\n type: String,\n },\n} as const;\n\nexport const avatarEmits = {\n error: (evt) => evt,\n};\n","<template>\n <div :class=\"classname\" :style=\"[avatarStyle]\">\n <TKImage v-if=\"avatarSrc\" :fit=\"fit\" :width=\"width\" :height=\"height\" :src=\"avatarSrc\" @error=\"handleError\" />\n <slot v-else />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from '../../../../adapter-vue';\nimport TKImage from '../TKImage/TKImage.vue';\nimport { classNames } from '../util';\nimport { AvatarProps } from './Avatar';\nimport { PREFIX } from '../constants/index';\n\nconst props = defineProps(AvatarProps);\n\nconst avatarSrc = ref('');\n\nwatch(() => props.src, () => {\n avatarSrc.value = props.src;\n}, {\n immediate: true,\n});\n\nconst classname = computed(() => classNames([\n `${PREFIX}-avatar`,\n `${PREFIX}-avatar--${props.shape}`,\n `${PREFIX}-avatar--${props.size}`,\n props.customClass,\n]));\nconst width = computed(() => typeof props.size === 'number' ? `${props.size}px` : props.size);\nconst height = computed(() => typeof props.size === 'number' ? `${props.size}px` : props.size);\nconst avatarStyle = computed(() => ({ width: width.value, height: height.value }));\n\nfunction handleError(e) {\n uni.__f__('error','at TUICallKit/src/Components/components/base/Avatar/Avatar.vue:44',e);\n if (props.defaultSrc) {\n avatarSrc.value = props.defaultSrc;\n }\n}\n</script>\n\n<style lang=\"scss\">\n@import './style/Avatar.scss';\n</style>","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Avatar/Avatar.vue'\nwx.createComponent(Component)"],"names":["ref","watch","computed","classNames","PREFIX","uni","Component"],"mappings":";;;;;AAAA,MAAM,MAAM,CAAC,QAAQ,WAAW,OAAO;AACvC,MAAM,QAAQ,CAAC,UAAU,QAAQ;AAE1B,MAAM,cAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,CAAC,QAAQ,MAAM;AAAA,IACrB,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA,IACV,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,EACR;AACF;;;;AChBA,MAAA,UAAoB,MAAA;AATpB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUA,UAAM,QAAQ;AAER,UAAA,YAAYA,kBAAI,EAAE;AAElBC,wBAAA,MAAM,MAAM,KAAK,MAAM;AAC3B,gBAAU,QAAQ,MAAM;AAAA,IAAA,GACvB;AAAA,MACD,WAAW;AAAA,IAAA,CACZ;AAEK,UAAA,YAAYC,uBAAS,MAAMC,qEAAW;AAAA,MAC1C,GAAGC,0DAAM,MAAA;AAAA,MACT,GAAGA,0DAAAA,MAAM,YAAY,MAAM,KAAK;AAAA,MAChC,GAAGA,0DAAAA,MAAM,YAAY,MAAM,IAAI;AAAA,MAC/B,MAAM;AAAA,IACP,CAAA,CAAC;AACF,UAAM,QAAQF,cAAA,SAAS,MAAM,OAAO,MAAM,SAAS,WAAW,GAAG,MAAM,IAAI,OAAO,MAAM,IAAI;AAC5F,UAAM,SAASA,cAAA,SAAS,MAAM,OAAO,MAAM,SAAS,WAAW,GAAG,MAAM,IAAI,OAAO,MAAM,IAAI;AACvF,UAAA,cAAcA,cAAAA,SAAS,OAAO,EAAE,OAAO,MAAM,OAAO,QAAQ,OAAO,MAAA,EAAQ;AAEjF,aAAS,YAAY,GAAG;AAClBG,oBAAAA,MAAA,MAAM,SAAQ,qEAAoE,CAAC;AACvF,UAAI,MAAM,YAAY;AACpB,kBAAU,QAAQ,MAAM;AAAA,MAC1B;AAAA,IACF;;;;;;;;;;;;;;;;;;;AC9CA,GAAG,gBAAgBC,SAAS;"}
{"version":3,"file":"Avatar.js","sources":["TUICallKit/src/Components/components/base/Avatar/Avatar.ts","TUICallKit/src/Components/components/base/Avatar/Avatar.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9BdmF0YXIvQXZhdGFyLnZ1ZQ"],"sourcesContent":["const Fit = ['fill', 'contain', 'cover'] as const;\nconst Shape = ['circle', 'square'] as const;\n\nexport const AvatarProps = {\n icon: {\n type: String,\n },\n size: {\n type: [Number, String],\n default: 100,\n },\n shape: {\n type: String,\n values: Shape,\n default: 'square',\n },\n src: {\n type: String,\n },\n defaultSrc: {\n type: String,\n },\n text: {\n type: String,\n },\n fit: {\n type: String,\n values: Fit,\n default: 'cover',\n },\n customClass: {\n type: String,\n },\n} as const;\n\nexport const avatarEmits = {\n error: (evt) => evt,\n};\n","<template>\n <div :class=\"classname\" :style=\"[avatarStyle]\">\n <TKImage v-if=\"avatarSrc\" :fit=\"fit\" :width=\"width\" :height=\"height\" :src=\"avatarSrc\" @error=\"handleError\" />\n <slot v-else />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, ref, watch } from '../../../../adapter-vue';\nimport TKImage from '../TKImage/TKImage.vue';\nimport { classNames } from '../util';\nimport { AvatarProps } from './Avatar';\nimport { PREFIX } from '../constants/index';\n\nconst props = defineProps(AvatarProps);\n\nconst avatarSrc = ref('');\n\nwatch(() => props.src, () => {\n avatarSrc.value = props.src;\n}, {\n immediate: true,\n});\n\nconst classname = computed(() => classNames([\n `${PREFIX}-avatar`,\n `${PREFIX}-avatar--${props.shape}`,\n `${PREFIX}-avatar--${props.size}`,\n props.customClass,\n]));\nconst width = computed(() => typeof props.size === 'number' ? `${props.size}px` : props.size);\nconst height = computed(() => typeof props.size === 'number' ? `${props.size}px` : props.size);\nconst avatarStyle = computed(() => ({ width: width.value, height: height.value }));\n\nfunction handleError(e) {\n uni.__f__('error','at TUICallKit/src/Components/components/base/Avatar/Avatar.vue:44',e);\n if (props.defaultSrc) {\n avatarSrc.value = props.defaultSrc;\n }\n}\n</script>\n\n<style lang=\"scss\">\n@import './style/Avatar.scss';\n</style>","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Avatar/Avatar.vue'\nwx.createComponent(Component)"],"names":["ref","watch","computed","classNames","PREFIX","uni","Component"],"mappings":";;;;;AAAA,MAAM,MAAM,CAAC,QAAQ,WAAW,OAAO;AACvC,MAAM,QAAQ,CAAC,UAAU,QAAQ;AAE1B,MAAM,cAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,MAAM,CAAC,QAAQ,MAAM;AAAA,IACrB,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA,IACV,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,EACR;AACF;;;;AChBA,MAAA,UAAoB,MAAA;AATpB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUA,UAAM,QAAQ;AAER,UAAA,YAAYA,kBAAI,EAAE;AAElBC,wBAAA,MAAM,MAAM,KAAK,MAAM;AAC3B,gBAAU,QAAQ,MAAM;AAAA,IAAA,GACvB;AAAA,MACD,WAAW;AAAA,IAAA,CACZ;AAEK,UAAA,YAAYC,uBAAS,MAAMC,qEAAW;AAAA,MAC1C,GAAGC,0DAAM,MAAA;AAAA,MACT,GAAGA,0DAAAA,MAAM,YAAY,MAAM,KAAK;AAAA,MAChC,GAAGA,0DAAAA,MAAM,YAAY,MAAM,IAAI;AAAA,MAC/B,MAAM;AAAA,IACP,CAAA,CAAC;AACF,UAAM,QAAQF,cAAA,SAAS,MAAM,OAAO,MAAM,SAAS,WAAW,GAAG,MAAM,IAAI,OAAO,MAAM,IAAI;AAC5F,UAAM,SAASA,cAAA,SAAS,MAAM,OAAO,MAAM,SAAS,WAAW,GAAG,MAAM,IAAI,OAAO,MAAM,IAAI;AACvF,UAAA,cAAcA,cAAAA,SAAS,OAAO,EAAE,OAAO,MAAM,OAAO,QAAQ,OAAO,MAAA,EAAQ;AAEjF,aAAS,YAAY,GAAG;AAClBG,oBAAAA,MAAA,MAAM,SAAQ,qEAAoE,CAAC;AACvF,UAAI,MAAM,YAAY;AACpB,kBAAU,QAAQ,MAAM;AAAA,MAC1B;AAAA,IACF;;;;;;;;;;;;;;;;;;;AC9CA,GAAG,gBAAgBC,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Button.js","sources":["TUICallKit/src/Components/components/base/Button/Button.ts","TUICallKit/src/Components/components/base/Button/Button.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9CdXR0b24vQnV0dG9uLnZ1ZQ"],"sourcesContent":["const Size = ['small','middle','large'] as const;\nconst Direction = ['row','column'] as const;\nconst Shape = ['circle','round'] as const;\n\nexport const ButtonProps = {\n iconSrc: {\n type: String,\n },\n iconSize: {\n type: Number,\n },\n text: {\n type: String,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n loadingColor: {\n type: String,\n default: '#fff',\n },\n loadingWidth: {\n type: String,\n default: '40px',\n },\n loadingHeight: {\n type: String,\n default: '40px',\n },\n size: {\n type: String,\n values: Size,\n default: 'middle',\n },\n width: {\n type: String,\n },\n height: {\n type: String,\n },\n color: {\n type: String,\n },\n direction: {\n type: String,\n values: Direction,\n default: 'row',\n },\n shape: {\n type: String,\n values: Shape,\n },\n buttonStyle: {\n type: Object,\n },\n buttonTextStyle: {\n type: Object,\n },\n};\n","<template>\n <div :style=\"[style]\" :class=\"buttonClassName\" @click=\"handleClick\">\n <Loading\n v-if=\"loading\"\n :loadingWidth=\"loadingWidth\"\n :loadingHeight=\"loadingHeight\"\n :color=\"loadingColor\"\n />\n <Icon v-if=\"iconSrc && !loading\" :size=\"iconSize\" :src=\"iconSrc\"></Icon>\n <div\n v-if=\"text\"\n :style=\"[buttonTextStyle]\"\n :class=\"buttonTextClassName\"\n >\n {{ text }}\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../adapter-vue';\nimport Loading from '../Loading/Loading.vue';\nimport Icon from '../Icon/Icon.vue';\nimport { classNames, IS_PC } from '../util';\nimport { ButtonProps } from './Button';\nimport { PREFIX } from '../constants/index';\n\nconst props = defineProps(ButtonProps);\nconst buttonTextClassName = `${PREFIX}-button--content`;\nconst style = computed(() => ({\n width: props.width,\n height: props.height,\n backgroundColor: props.color,\n flexDirection: props.direction,\n cursor: IS_PC ? 'pointer' : 'auto',\n ...props.buttonStyle,\n}));\n\nconst buttonClassName = classNames([\n `${PREFIX}-button`,\n {[`${PREFIX}-${props.shape}`]: props.shape},\n `${PREFIX}-button--${props.size}`\n]);\n\nconst emit = defineEmits(['click']);\nconst handleClick = (event) => {\n !props.loading && emit('click', event);\n};\n</script>\n\n<style lang=\"scss\">\n@import './style/Button.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Button/Button.vue'\nwx.createComponent(Component)"],"names":["PREFIX","computed","IS_PC","classNames","Component"],"mappings":";;;;;AAAA,MAAM,OAAO,CAAC,SAAQ,UAAS,OAAO;AACtC,MAAM,YAAY,CAAC,OAAM,QAAQ;AACjC,MAAM,QAAQ,CAAC,UAAS,OAAO;AAExB,MAAM,cAAc;AAAA,EACzB,SAAS;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,EACR;AACF;;;;AC9BA,MAAA,UAAoB,MAAA;AACpB,MAAA,OAAiB,MAAA;AAVjB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;AAWA,UAAM,QAAQ;AACR,UAAA,sBAAsB,GAAGA,0DAAM,MAAA;AAC/B,UAAA,QAAQC,cAAAA,SAAS,OAAO;AAAA,MAC5B,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,iBAAiB,MAAM;AAAA,MACvB,eAAe,MAAM;AAAA,MACrB,QAAQC,wDAAAA,QAAQ,YAAY;AAAA,MAC5B,GAAG,MAAM;AAAA,IACT,EAAA;AAEF,UAAM,kBAAkBC,0DAAAA,WAAW;AAAA,MACjC,GAAGH,0DAAM,MAAA;AAAA,MACT,EAAC,CAAC,GAAGA,0DAAAA,MAAM,IAAI,MAAM,KAAK,EAAE,GAAG,MAAM,MAAK;AAAA,MACzC,GAAGA,0DAAAA,MAAM,YAAY,MAAM,IAAI;AAAA,IAAA,CACjC;AAED,UAAM,OAAO;AACP,UAAA,cAAc,CAAC,UAAU;AAC7B,OAAC,MAAM,WAAW,KAAK,SAAS,KAAK;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrDvC,GAAG,gBAAgBI,SAAS;"}
{"version":3,"file":"Button.js","sources":["TUICallKit/src/Components/components/base/Button/Button.ts","TUICallKit/src/Components/components/base/Button/Button.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9CdXR0b24vQnV0dG9uLnZ1ZQ"],"sourcesContent":["const Size = ['small','middle','large'] as const;\nconst Direction = ['row','column'] as const;\nconst Shape = ['circle','round'] as const;\n\nexport const ButtonProps = {\n iconSrc: {\n type: String,\n },\n iconSize: {\n type: Number,\n },\n text: {\n type: String,\n },\n loading: {\n type: Boolean,\n default: false,\n },\n loadingColor: {\n type: String,\n default: '#fff',\n },\n loadingWidth: {\n type: String,\n default: '40px',\n },\n loadingHeight: {\n type: String,\n default: '40px',\n },\n size: {\n type: String,\n values: Size,\n default: 'middle',\n },\n width: {\n type: String,\n },\n height: {\n type: String,\n },\n color: {\n type: String,\n },\n direction: {\n type: String,\n values: Direction,\n default: 'row',\n },\n shape: {\n type: String,\n values: Shape,\n },\n buttonStyle: {\n type: Object,\n },\n buttonTextStyle: {\n type: Object,\n },\n};\n","<template>\n <div :style=\"[style]\" :class=\"buttonClassName\" @click=\"handleClick\">\n <Loading\n v-if=\"loading\"\n :loadingWidth=\"loadingWidth\"\n :loadingHeight=\"loadingHeight\"\n :color=\"loadingColor\"\n />\n <Icon v-if=\"iconSrc && !loading\" :size=\"iconSize\" :src=\"iconSrc\"></Icon>\n <div\n v-if=\"text\"\n :style=\"[buttonTextStyle]\"\n :class=\"buttonTextClassName\"\n >\n {{ text }}\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../adapter-vue';\nimport Loading from '../Loading/Loading.vue';\nimport Icon from '../Icon/Icon.vue';\nimport { classNames, IS_PC } from '../util';\nimport { ButtonProps } from './Button';\nimport { PREFIX } from '../constants/index';\n\nconst props = defineProps(ButtonProps);\nconst buttonTextClassName = `${PREFIX}-button--content`;\nconst style = computed(() => ({\n width: props.width,\n height: props.height,\n backgroundColor: props.color,\n flexDirection: props.direction,\n cursor: IS_PC ? 'pointer' : 'auto',\n ...props.buttonStyle,\n}));\n\nconst buttonClassName = classNames([\n `${PREFIX}-button`,\n {[`${PREFIX}-${props.shape}`]: props.shape},\n `${PREFIX}-button--${props.size}`\n]);\n\nconst emit = defineEmits(['click']);\nconst handleClick = (event) => {\n !props.loading && emit('click', event);\n};\n</script>\n\n<style lang=\"scss\">\n@import './style/Button.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Button/Button.vue'\nwx.createComponent(Component)"],"names":["PREFIX","computed","IS_PC","classNames","Component"],"mappings":";;;;;AAAA,MAAM,OAAO,CAAC,SAAQ,UAAS,OAAO;AACtC,MAAM,YAAY,CAAC,OAAM,QAAQ;AACjC,MAAM,QAAQ,CAAC,UAAS,OAAO;AAExB,MAAM,cAAc;AAAA,EACzB,SAAS;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,EACV;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,EACR;AACF;;;;AC9BA,MAAA,UAAoB,MAAA;AACpB,MAAA,OAAiB,MAAA;AAVjB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;AAWA,UAAM,QAAQ;AACR,UAAA,sBAAsB,GAAGA,0DAAM,MAAA;AAC/B,UAAA,QAAQC,cAAAA,SAAS,OAAO;AAAA,MAC5B,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,MACd,iBAAiB,MAAM;AAAA,MACvB,eAAe,MAAM;AAAA,MACrB,QAAQC,wDAAAA,QAAQ,YAAY;AAAA,MAC5B,GAAG,MAAM;AAAA,IACT,EAAA;AAEF,UAAM,kBAAkBC,0DAAAA,WAAW;AAAA,MACjC,GAAGH,0DAAM,MAAA;AAAA,MACT,EAAC,CAAC,GAAGA,0DAAAA,MAAM,IAAI,MAAM,KAAK,EAAE,GAAG,MAAM,MAAK;AAAA,MACzC,GAAGA,0DAAAA,MAAM,YAAY,MAAM,IAAI;AAAA,IAAA,CACjC;AAED,UAAM,OAAO;AACP,UAAA,cAAc,CAAC,UAAU;AAC7B,OAAC,MAAM,WAAW,KAAK,SAAS,KAAK;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrDvC,GAAG,gBAAgBI,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Grid.js","sources":["TUICallKit/src/Components/components/base/Grid/Grid.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9HcmlkL0dyaWQudnVl"],"sourcesContent":["<template>\n <div :style=\"{ height: '100%'}\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { provide, watch, ref } from '../../../../adapter-vue';\nimport { ChangeFocusEmits, GridContextKey, GridProps } from './Grid';\n\nconst props = defineProps(GridProps);\nconst focus = ref(props.focus);\nconst layout = ref(props.layout);\nconst unit = ref(props.unit);\nconst emit = defineEmits(ChangeFocusEmits);\n\nfunction handleFocusChange(value) {\n emit('toggle', value);\n}\n\nwatch(() => props.focus, () => focus.value = props.focus);\nwatch(() => props.layout, () => layout.value = props.layout);\nwatch(() => props.unit, () => unit.value = props.unit);\n\nprovide(GridContextKey, {\n layout,\n enableFocus: props.enableFocus,\n handleFocusChange,\n focus,\n unit,\n});\n</script>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Grid/Grid.vue'\nwx.createComponent(Component)"],"names":["ref","watch","provide","GridContextKey","Component"],"mappings":";;;AAOA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;AAOA,UAAM,QAAQ;AACR,UAAA,QAAQA,cAAAA,IAAI,MAAM,KAAK;AACvB,UAAA,SAASA,cAAAA,IAAI,MAAM,MAAM;AACzB,UAAA,OAAOA,cAAAA,IAAI,MAAM,IAAI;AAC3B,UAAM,OAAO;AAEb,aAAS,kBAAkB,OAAO;AAChC,WAAK,UAAU,KAAK;AAAA,IACtB;AAEAC,wBAAM,MAAM,MAAM,OAAO,MAAM,MAAM,QAAQ,MAAM,KAAK;AACxDA,wBAAM,MAAM,MAAM,QAAQ,MAAM,OAAO,QAAQ,MAAM,MAAM;AAC3DA,wBAAM,MAAM,MAAM,MAAM,MAAM,KAAK,QAAQ,MAAM,IAAI;AAErDC,kBAAAA,QAAQC,KAAAA,gBAAgB;AAAA,MACtB;AAAA,MACA,aAAa,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;;;;;;ACrCD,GAAG,gBAAgBC,SAAS;"}
{"version":3,"file":"Grid.js","sources":["TUICallKit/src/Components/components/base/Grid/Grid.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9HcmlkL0dyaWQudnVl"],"sourcesContent":["<template>\n <div :style=\"{ height: '100%'}\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { provide, watch, ref } from '../../../../adapter-vue';\nimport { ChangeFocusEmits, GridContextKey, GridProps } from './Grid';\n\nconst props = defineProps(GridProps);\nconst focus = ref(props.focus);\nconst layout = ref(props.layout);\nconst unit = ref(props.unit);\nconst emit = defineEmits(ChangeFocusEmits);\n\nfunction handleFocusChange(value) {\n emit('toggle', value);\n}\n\nwatch(() => props.focus, () => focus.value = props.focus);\nwatch(() => props.layout, () => layout.value = props.layout);\nwatch(() => props.unit, () => unit.value = props.unit);\n\nprovide(GridContextKey, {\n layout,\n enableFocus: props.enableFocus,\n handleFocusChange,\n focus,\n unit,\n});\n</script>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Grid/Grid.vue'\nwx.createComponent(Component)"],"names":["ref","watch","provide","GridContextKey","Component"],"mappings":";;;AAOA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;AAOA,UAAM,QAAQ;AACR,UAAA,QAAQA,cAAAA,IAAI,MAAM,KAAK;AACvB,UAAA,SAASA,cAAAA,IAAI,MAAM,MAAM;AACzB,UAAA,OAAOA,cAAAA,IAAI,MAAM,IAAI;AAC3B,UAAM,OAAO;AAEb,aAAS,kBAAkB,OAAO;AAChC,WAAK,UAAU,KAAK;AAAA,IACtB;AAEAC,wBAAM,MAAM,MAAM,OAAO,MAAM,MAAM,QAAQ,MAAM,KAAK;AACxDA,wBAAM,MAAM,MAAM,QAAQ,MAAM,OAAO,QAAQ,MAAM,MAAM;AAC3DA,wBAAM,MAAM,MAAM,MAAM,MAAM,KAAK,QAAQ,MAAM,IAAI;AAErDC,kBAAAA,QAAQC,KAAAA,gBAAgB;AAAA,MACtB;AAAA,MACA,aAAa,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;;;;;;ACrCD,GAAG,gBAAgBC,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"GridItem.js","sources":["TUICallKit/src/Components/components/base/Grid/GridItem/GridItem.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9HcmlkL0dyaWRJdGVtL0dyaWRJdGVtLnZ1ZQ"],"sourcesContent":["<template>\n <div\n v-if=\"show\"\n :class=\"gridItemClassName\"\n :style=\"[style]\"\n @click=\"handleClick\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { inject, computed, ref, watchEffect, watch, onUnmounted } from '../../../../../adapter-vue';\nimport { GridContextKey } from '../Grid';\nimport { PREFIX } from '../../constants/index';\nimport { IS_PC, IS_H5, classNames, findTarget } from '../../util';\n\nconst props = defineProps(['index', 'height', 'customStyle']);\nconst {\n layout,\n enableFocus,\n handleFocusChange,\n focus,\n unit,\n} = inject(GridContextKey);\n\nconst colWidth = 100 / 12;\nconst rowHeight = colWidth;\nconst style = ref({});\nconst gridItemClassName = classNames([\n `${PREFIX}-grid-item`,\n {\n pc: IS_PC,\n mobile: !IS_PC,\n h5: IS_H5,\n },\n]);\n\nconst handleClick = () => {\n const value = String(props.index) === String(focus.value) ? null : props.index;\n enableFocus && handleFocusChange(value);\n};\n\nconst show = computed(() => !!findTarget(layout.value, { key: 'i', value: props.index}));\n\nwatchEffect(() => {\n const target = findTarget(layout.value, { key: 'i', value: props.index});\n\n if (!target) return;\n \n const { x, y, w, h, customStyle, customProps } = target;\n style.value = {\n width: w * colWidth + unit.value,\n height: props.height || h * rowHeight + unit.value,\n left: x * colWidth + unit.value,\n top: y * rowHeight + unit.value,\n position: 'absolute',\n visibility: customProps?.show === false ? 'hidden' : '',\n ...props.customStyle,\n ...customStyle,\n }; \n});\n\nonUnmounted(() => {\n if (String(props.index) === String(focus.value)) {\n enableFocus && handleFocusChange(null);\n }\n});\n</script>\n\n<style lang=\"scss\">\n@import './style/GridItem.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Grid/GridItem/GridItem.vue'\nwx.createComponent(Component)"],"names":["inject","GridContextKey","ref","classNames","PREFIX","IS_PC","IS_H5","computed","findTarget","watchEffect","onUnmounted","Component"],"mappings":";;;;;;;AAYA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AASA,UAAM,QAAQ;AACR,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,IACEA,cAAAA,OAAOC,KAAAA,cAAc;AAEzB,UAAM,WAAW,MAAM;AACvB,UAAM,YAAY;AACZ,UAAA,QAAQC,kBAAI,CAAA,CAAE;AACpB,UAAM,oBAAoBC,0DAAAA,WAAW;AAAA,MACnC,GAAGC,0DAAM,MAAA;AAAA,MACT;AAAA,QACE,IAAIC,wDAAA;AAAA,QACJ,QAAQ,CAACA,wDAAA;AAAA,QACT,IAAIC,wDAAA;AAAA,MACN;AAAA,IAAA,CACD;AAED,UAAM,cAAc,MAAM;AAClB,YAAA,QAAQ,OAAO,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK,IAAI,OAAO,MAAM;AACzE,qBAAe,kBAAkB,KAAK;AAAA,IAAA;AAGxC,UAAM,OAAOC,cAAA,SAAS,MAAM,CAAC,CAACC,qDAAAA,WAAW,OAAO,OAAO,EAAE,KAAK,KAAK,OAAO,MAAM,MAAA,CAAM,CAAC;AAEvFC,kBAAAA,YAAY,MAAM;AACV,YAAA,SAASD,qDAAAA,WAAW,OAAO,OAAO,EAAE,KAAK,KAAK,OAAO,MAAM,MAAM,CAAA;AAEvE,UAAI,CAAC;AAAQ;AAEb,YAAM,EAAE,GAAG,GAAG,GAAG,GAAG,aAAa,YAAgB,IAAA;AACjD,YAAM,QAAQ;AAAA,QACZ,OAAO,IAAI,WAAW,KAAK;AAAA,QAC3B,QAAQ,MAAM,UAAU,IAAI,YAAY,KAAK;AAAA,QAC7C,MAAM,IAAI,WAAW,KAAK;AAAA,QAC1B,KAAK,IAAI,YAAY,KAAK;AAAA,QAC1B,UAAU;AAAA,QACV,aAAY,2CAAa,UAAS,QAAQ,WAAW;AAAA,QACrD,GAAG,MAAM;AAAA,QACT,GAAG;AAAA,MAAA;AAAA,IACL,CACD;AAEDE,kBAAAA,YAAY,MAAM;AAChB,UAAI,OAAO,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK,GAAG;AAC/C,uBAAe,kBAAkB,IAAI;AAAA,MACvC;AAAA,IAAA,CACD;;;;;;;;;;;;AC1ED,GAAG,gBAAgBC,SAAS;"}
{"version":3,"file":"GridItem.js","sources":["TUICallKit/src/Components/components/base/Grid/GridItem/GridItem.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9HcmlkL0dyaWRJdGVtL0dyaWRJdGVtLnZ1ZQ"],"sourcesContent":["<template>\n <div\n v-if=\"show\"\n :class=\"gridItemClassName\"\n :style=\"[style]\"\n @click=\"handleClick\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { inject, computed, ref, watchEffect, watch, onUnmounted } from '../../../../../adapter-vue';\nimport { GridContextKey } from '../Grid';\nimport { PREFIX } from '../../constants/index';\nimport { IS_PC, IS_H5, classNames, findTarget } from '../../util';\n\nconst props = defineProps(['index', 'height', 'customStyle']);\nconst {\n layout,\n enableFocus,\n handleFocusChange,\n focus,\n unit,\n} = inject(GridContextKey);\n\nconst colWidth = 100 / 12;\nconst rowHeight = colWidth;\nconst style = ref({});\nconst gridItemClassName = classNames([\n `${PREFIX}-grid-item`,\n {\n pc: IS_PC,\n mobile: !IS_PC,\n h5: IS_H5,\n },\n]);\n\nconst handleClick = () => {\n const value = String(props.index) === String(focus.value) ? null : props.index;\n enableFocus && handleFocusChange(value);\n};\n\nconst show = computed(() => !!findTarget(layout.value, { key: 'i', value: props.index}));\n\nwatchEffect(() => {\n const target = findTarget(layout.value, { key: 'i', value: props.index});\n\n if (!target) return;\n \n const { x, y, w, h, customStyle, customProps } = target;\n style.value = {\n width: w * colWidth + unit.value,\n height: props.height || h * rowHeight + unit.value,\n left: x * colWidth + unit.value,\n top: y * rowHeight + unit.value,\n position: 'absolute',\n visibility: customProps?.show === false ? 'hidden' : '',\n ...props.customStyle,\n ...customStyle,\n }; \n});\n\nonUnmounted(() => {\n if (String(props.index) === String(focus.value)) {\n enableFocus && handleFocusChange(null);\n }\n});\n</script>\n\n<style lang=\"scss\">\n@import './style/GridItem.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Grid/GridItem/GridItem.vue'\nwx.createComponent(Component)"],"names":["inject","GridContextKey","ref","classNames","PREFIX","IS_PC","IS_H5","computed","findTarget","watchEffect","onUnmounted","Component"],"mappings":";;;;;;;AAYA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AASA,UAAM,QAAQ;AACR,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,IACEA,cAAAA,OAAOC,KAAAA,cAAc;AAEzB,UAAM,WAAW,MAAM;AACvB,UAAM,YAAY;AACZ,UAAA,QAAQC,kBAAI,CAAA,CAAE;AACpB,UAAM,oBAAoBC,0DAAAA,WAAW;AAAA,MACnC,GAAGC,0DAAM,MAAA;AAAA,MACT;AAAA,QACE,IAAIC,wDAAA;AAAA,QACJ,QAAQ,CAACA,wDAAA;AAAA,QACT,IAAIC,wDAAA;AAAA,MACN;AAAA,IAAA,CACD;AAED,UAAM,cAAc,MAAM;AAClB,YAAA,QAAQ,OAAO,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK,IAAI,OAAO,MAAM;AACzE,qBAAe,kBAAkB,KAAK;AAAA,IAAA;AAGxC,UAAM,OAAOC,cAAA,SAAS,MAAM,CAAC,CAACC,qDAAAA,WAAW,OAAO,OAAO,EAAE,KAAK,KAAK,OAAO,MAAM,MAAA,CAAM,CAAC;AAEvFC,kBAAAA,YAAY,MAAM;AACV,YAAA,SAASD,qDAAAA,WAAW,OAAO,OAAO,EAAE,KAAK,KAAK,OAAO,MAAM,MAAM,CAAA;AAEvE,UAAI,CAAC;AAAQ;AAEb,YAAM,EAAE,GAAG,GAAG,GAAG,GAAG,aAAa,YAAgB,IAAA;AACjD,YAAM,QAAQ;AAAA,QACZ,OAAO,IAAI,WAAW,KAAK;AAAA,QAC3B,QAAQ,MAAM,UAAU,IAAI,YAAY,KAAK;AAAA,QAC7C,MAAM,IAAI,WAAW,KAAK;AAAA,QAC1B,KAAK,IAAI,YAAY,KAAK;AAAA,QAC1B,UAAU;AAAA,QACV,aAAY,2CAAa,UAAS,QAAQ,WAAW;AAAA,QACrD,GAAG,MAAM;AAAA,QACT,GAAG;AAAA,MAAA;AAAA,IACL,CACD;AAEDE,kBAAAA,YAAY,MAAM;AAChB,UAAI,OAAO,MAAM,KAAK,MAAM,OAAO,MAAM,KAAK,GAAG;AAC/C,uBAAe,kBAAkB,IAAI;AAAA,MACvC;AAAA,IAAA,CACD;;;;;;;;;;;;AC1ED,GAAG,gBAAgBC,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Icon.js","sources":["TUICallKit/src/Components/components/base/Icon/Icon.ts","TUICallKit/src/Components/components/base/Icon/Icon.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9JY29uL0ljb24udnVl"],"sourcesContent":["export const IconProps = {\n src: {\n type: String\n },\n size: {\n type: Number,\n default: 20,\n },\n};\n","<template>\n <TKImage :src=\"src\" :width=\"width\" :height=\"height\"></TKImage>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../adapter-vue';\nimport { IconProps } from './Icon';\nimport TKImage from '../TKImage/TKImage.vue';\n\nconst props = defineProps(IconProps);\nconst width = computed(() => `${props.size}px`);\nconst height = computed(() => `${props.size}px`);\n</script>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Icon/Icon.vue'\nwx.createComponent(Component)"],"names":["computed","Component"],"mappings":";;AAAO,MAAM,YAAY;AAAA,EACvB,KAAK;AAAA,IACH,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;;;;ACOA,MAAA,UAAoB,MAAA;AAVpB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAQA,UAAM,QAAQ;AACd,UAAM,QAAQA,cAAAA,SAAS,MAAM,GAAG,MAAM,IAAI,IAAI;AAC9C,UAAM,SAASA,cAAAA,SAAS,MAAM,GAAG,MAAM,IAAI,IAAI;;;;;;;;;;;;AClB/C,GAAG,gBAAgBC,SAAS;"}
{"version":3,"file":"Icon.js","sources":["TUICallKit/src/Components/components/base/Icon/Icon.ts","TUICallKit/src/Components/components/base/Icon/Icon.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9JY29uL0ljb24udnVl"],"sourcesContent":["export const IconProps = {\n src: {\n type: String\n },\n size: {\n type: Number,\n default: 20,\n },\n};\n","<template>\n <TKImage :src=\"src\" :width=\"width\" :height=\"height\"></TKImage>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../adapter-vue';\nimport { IconProps } from './Icon';\nimport TKImage from '../TKImage/TKImage.vue';\n\nconst props = defineProps(IconProps);\nconst width = computed(() => `${props.size}px`);\nconst height = computed(() => `${props.size}px`);\n</script>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Icon/Icon.vue'\nwx.createComponent(Component)"],"names":["computed","Component"],"mappings":";;AAAO,MAAM,YAAY;AAAA,EACvB,KAAK;AAAA,IACH,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;;;;ACOA,MAAA,UAAoB,MAAA;AAVpB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAQA,UAAM,QAAQ;AACd,UAAM,QAAQA,cAAAA,SAAS,MAAM,GAAG,MAAM,IAAI,IAAI;AAC9C,UAAM,SAASA,cAAAA,SAAS,MAAM,GAAG,MAAM,IAAI,IAAI;;;;;;;;;;;;AClB/C,GAAG,gBAAgBC,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Col.js","sources":["TUICallKit/src/Components/components/base/Layout/Col/Col.ts","TUICallKit/src/Components/components/base/Layout/Col/Col.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9MYXlvdXQvQ29sL0NvbC52dWU"],"sourcesContent":["const ColJustify = ['start', 'center', 'end', 'space-around', 'space-between', 'space-evenly'] as const;\nconst ColAlign = ['top', 'middle', 'bottom'] as const;\n\nexport const colProps = {\n span: {\n type: Number,\n default: 24,\n },\n justify: {\n type: String,\n values: ColJustify,\n default: 'start',\n },\n align: {\n type: String,\n values: ColAlign,\n default: 'middle',\n },\n offset: {\n type: Number,\n default: 0,\n },\n};\n","<template>\n <div\n :class=\"classname\"\n :style=\"{\n width,\n marginLeft,\n paddingLeft,\n paddingRight,\n }\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, inject } from '../../../../../adapter-vue';\nimport { classNames } from '../../util';\nimport { colProps } from './Col';\nimport { RowContextKey } from '../constant';\nimport { PREFIX } from '../../constants/index';\n\nconst props = defineProps(colProps);\nconst { gutter } = inject(RowContextKey, { gutter: computed(() => 0)});\n\nconst classname = classNames([\n `${PREFIX}-col`,\n `${PREFIX}-justify-${props.justify}`,\n `${PREFIX}-align-${props.align}`,\n]);\n\nconst width = computed(() => `${props.span / 24 * 100}%`);\nconst marginLeft = computed(() => `${props.offset / 24 * 100}%`);\nconst paddingLeft = computed(() => `${gutter.value / 2}px`);\nconst paddingRight = paddingLeft;\n</script>\n\n<style lang=\"scss\">\n@import './style/Col.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Layout/Col/Col.vue'\nwx.createComponent(Component)"],"names":["inject","RowContextKey","computed","classNames","PREFIX","Component"],"mappings":";;;;;;AAAA,MAAM,aAAa,CAAC,SAAS,UAAU,OAAO,gBAAgB,iBAAiB,cAAc;AAC7F,MAAM,WAAW,CAAC,OAAO,UAAU,QAAQ;AAEpC,MAAM,WAAW;AAAA,EACtB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;ACRA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUA,UAAM,QAAQ;AACR,UAAA,EAAE,WAAWA,cAAAA,OAAOC,0DAAA,eAAe,EAAE,QAAQC,uBAAS,MAAM,CAAC,EAAA,CAAE;AAErE,UAAM,YAAYC,0DAAAA,WAAW;AAAA,MAC3B,GAAGC,0DAAM,MAAA;AAAA,MACT,GAAGA,0DAAAA,MAAM,YAAY,MAAM,OAAO;AAAA,MAClC,GAAGA,0DAAAA,MAAM,UAAU,MAAM,KAAK;AAAA,IAAA,CAC/B;AAEK,UAAA,QAAQF,uBAAS,MAAM,GAAG,MAAM,OAAO,KAAK,GAAG,GAAG;AAClD,UAAA,aAAaA,uBAAS,MAAM,GAAG,MAAM,SAAS,KAAK,GAAG,GAAG;AAC/D,UAAM,cAAcA,cAAS,SAAA,MAAM,GAAG,OAAO,QAAQ,CAAC,IAAI;AAC1D,UAAM,eAAe;;;;;;;;;;;;ACvCrB,GAAG,gBAAgBG,SAAS;"}
{"version":3,"file":"Col.js","sources":["TUICallKit/src/Components/components/base/Layout/Col/Col.ts","TUICallKit/src/Components/components/base/Layout/Col/Col.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9MYXlvdXQvQ29sL0NvbC52dWU"],"sourcesContent":["const ColJustify = ['start', 'center', 'end', 'space-around', 'space-between', 'space-evenly'] as const;\nconst ColAlign = ['top', 'middle', 'bottom'] as const;\n\nexport const colProps = {\n span: {\n type: Number,\n default: 24,\n },\n justify: {\n type: String,\n values: ColJustify,\n default: 'start',\n },\n align: {\n type: String,\n values: ColAlign,\n default: 'middle',\n },\n offset: {\n type: Number,\n default: 0,\n },\n};\n","<template>\n <div\n :class=\"classname\"\n :style=\"{\n width,\n marginLeft,\n paddingLeft,\n paddingRight,\n }\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, inject } from '../../../../../adapter-vue';\nimport { classNames } from '../../util';\nimport { colProps } from './Col';\nimport { RowContextKey } from '../constant';\nimport { PREFIX } from '../../constants/index';\n\nconst props = defineProps(colProps);\nconst { gutter } = inject(RowContextKey, { gutter: computed(() => 0)});\n\nconst classname = classNames([\n `${PREFIX}-col`,\n `${PREFIX}-justify-${props.justify}`,\n `${PREFIX}-align-${props.align}`,\n]);\n\nconst width = computed(() => `${props.span / 24 * 100}%`);\nconst marginLeft = computed(() => `${props.offset / 24 * 100}%`);\nconst paddingLeft = computed(() => `${gutter.value / 2}px`);\nconst paddingRight = paddingLeft;\n</script>\n\n<style lang=\"scss\">\n@import './style/Col.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Layout/Col/Col.vue'\nwx.createComponent(Component)"],"names":["inject","RowContextKey","computed","classNames","PREFIX","Component"],"mappings":";;;;;;AAAA,MAAM,aAAa,CAAC,SAAS,UAAU,OAAO,gBAAgB,iBAAiB,cAAc;AAC7F,MAAM,WAAW,CAAC,OAAO,UAAU,QAAQ;AAEpC,MAAM,WAAW;AAAA,EACtB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;ACRA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUA,UAAM,QAAQ;AACR,UAAA,EAAE,WAAWA,cAAAA,OAAOC,0DAAA,eAAe,EAAE,QAAQC,uBAAS,MAAM,CAAC,EAAA,CAAE;AAErE,UAAM,YAAYC,0DAAAA,WAAW;AAAA,MAC3B,GAAGC,0DAAM,MAAA;AAAA,MACT,GAAGA,0DAAAA,MAAM,YAAY,MAAM,OAAO;AAAA,MAClC,GAAGA,0DAAAA,MAAM,UAAU,MAAM,KAAK;AAAA,IAAA,CAC/B;AAEK,UAAA,QAAQF,uBAAS,MAAM,GAAG,MAAM,OAAO,KAAK,GAAG,GAAG;AAClD,UAAA,aAAaA,uBAAS,MAAM,GAAG,MAAM,SAAS,KAAK,GAAG,GAAG;AAC/D,UAAM,cAAcA,cAAS,SAAA,MAAM,GAAG,OAAO,QAAQ,CAAC,IAAI;AAC1D,UAAM,eAAe;;;;;;;;;;;;ACvCrB,GAAG,gBAAgBG,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Row.js","sources":["TUICallKit/src/Components/components/base/Layout/Row/Row.ts","TUICallKit/src/Components/components/base/Layout/Row/Row.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9MYXlvdXQvUm93L1Jvdy52dWU"],"sourcesContent":["const RowJustify = ['start', 'center', 'end', 'space-around', 'space-between', 'space-evenly'] as const;\nconst RowAlign = ['top', 'middle' , 'bottom'] as const;\n\nexport const rowProps = {\n gutter: {\n type: Number,\n default: 0,\n },\n justify: {\n type: String,\n values: RowJustify,\n default: 'start',\n },\n align: {\n type: String,\n values: RowAlign,\n default: 'top',\n },\n customStyle: {\n type: Object,\n default: () => {},\n },\n} as const;\n","<template>\n <div :class=\"classname\" :style=\"[customStyle]\" >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { provide, computed } from '../../../../../adapter-vue';\nimport { rowProps } from './Row';\nimport { classNames } from '../../util';\nimport { RowContextKey } from '../constant';\nimport { PREFIX } from '../../constants/index';\n\nconst props = defineProps(rowProps);\nconst gutter = computed(() => props.gutter);\n\nprovide(RowContextKey, {\n gutter,\n});\n\nconst classname = classNames([\n `${PREFIX}-row`,\n `${PREFIX}-justify-${props.justify}`,\n `${PREFIX}-align-${props.align}`,\n]);\n</script>\n\n<style lang=\"scss\">\n@import './style/Row.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Layout/Row/Row.vue'\nwx.createComponent(Component)"],"names":["computed","provide","RowContextKey","classNames","PREFIX","Component"],"mappings":";;;;;;AAAA,MAAM,aAAa,CAAC,SAAS,UAAU,OAAO,gBAAgB,iBAAiB,cAAc;AAC7F,MAAM,WAAW,CAAC,OAAO,UAAW,QAAQ;AAErC,MAAM,WAAW;AAAA,EACtB,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,SAAS,MAAM;AAAA,IAAC;AAAA,EAClB;AACF;ACfA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUA,UAAM,QAAQ;AACd,UAAM,SAASA,cAAA,SAAS,MAAM,MAAM,MAAM;AAE1CC,kBAAAA,QAAQC,0DAAAA,eAAe;AAAA,MACrB;AAAA,IAAA,CACD;AAED,UAAM,YAAYC,0DAAAA,WAAW;AAAA,MAC3B,GAAGC,0DAAM,MAAA;AAAA,MACT,GAAGA,0DAAAA,MAAM,YAAY,MAAM,OAAO;AAAA,MAClC,GAAGA,0DAAAA,MAAM,UAAU,MAAM,KAAK;AAAA,IAAA,CAC/B;;;;;;;;;AC/BD,GAAG,gBAAgBC,SAAS;"}
{"version":3,"file":"Row.js","sources":["TUICallKit/src/Components/components/base/Layout/Row/Row.ts","TUICallKit/src/Components/components/base/Layout/Row/Row.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9MYXlvdXQvUm93L1Jvdy52dWU"],"sourcesContent":["const RowJustify = ['start', 'center', 'end', 'space-around', 'space-between', 'space-evenly'] as const;\nconst RowAlign = ['top', 'middle' , 'bottom'] as const;\n\nexport const rowProps = {\n gutter: {\n type: Number,\n default: 0,\n },\n justify: {\n type: String,\n values: RowJustify,\n default: 'start',\n },\n align: {\n type: String,\n values: RowAlign,\n default: 'top',\n },\n customStyle: {\n type: Object,\n default: () => {},\n },\n} as const;\n","<template>\n <div :class=\"classname\" :style=\"[customStyle]\" >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { provide, computed } from '../../../../../adapter-vue';\nimport { rowProps } from './Row';\nimport { classNames } from '../../util';\nimport { RowContextKey } from '../constant';\nimport { PREFIX } from '../../constants/index';\n\nconst props = defineProps(rowProps);\nconst gutter = computed(() => props.gutter);\n\nprovide(RowContextKey, {\n gutter,\n});\n\nconst classname = classNames([\n `${PREFIX}-row`,\n `${PREFIX}-justify-${props.justify}`,\n `${PREFIX}-align-${props.align}`,\n]);\n</script>\n\n<style lang=\"scss\">\n@import './style/Row.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Layout/Row/Row.vue'\nwx.createComponent(Component)"],"names":["computed","provide","RowContextKey","classNames","PREFIX","Component"],"mappings":";;;;;;AAAA,MAAM,aAAa,CAAC,SAAS,UAAU,OAAO,gBAAgB,iBAAiB,cAAc;AAC7F,MAAM,WAAW,CAAC,OAAO,UAAW,QAAQ;AAErC,MAAM,WAAW;AAAA,EACtB,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,IACN,SAAS,MAAM;AAAA,IAAC;AAAA,EAClB;AACF;ACfA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUA,UAAM,QAAQ;AACd,UAAM,SAASA,cAAA,SAAS,MAAM,MAAM,MAAM;AAE1CC,kBAAAA,QAAQC,0DAAAA,eAAe;AAAA,MACrB;AAAA,IAAA,CACD;AAED,UAAM,YAAYC,0DAAAA,WAAW;AAAA,MAC3B,GAAGC,0DAAM,MAAA;AAAA,MACT,GAAGA,0DAAAA,MAAM,YAAY,MAAM,OAAO;AAAA,MAClC,GAAGA,0DAAAA,MAAM,UAAU,MAAM,KAAK;AAAA,IAAA,CAC/B;;;;;;;;;AC/BD,GAAG,gBAAgBC,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Circle.js","sources":["TUICallKit/src/Components/components/base/Loading/Circle/Circle.ts","TUICallKit/src/Components/components/base/Loading/Circle/Circle.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9Mb2FkaW5nL0NpcmNsZS9DaXJjbGUudnVl"],"sourcesContent":["export const LoadingCircleProps = {\n width: {\n type: String,\n default: '40px',\n },\n height: {\n type: String,\n default: '40px',\n },\n color: {\n type: String,\n },\n} as const;\n","<template>\n <div :class=\"circleContainerClassName\" :style=\"[circleContainerStyle]\"></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../../adapter-vue';\nimport { LoadingCircleProps } from './Circle';\nimport { PREFIX } from '../../constants';\n\nconst props = defineProps(LoadingCircleProps);\nconst circleContainerStyle = computed(() => {\n const style = {\n width: props.width,\n height: props.height,\n };\n\n if (props.color) {\n style['--tk-loading-primary-color'] = props.color;\n }\n\n return style;\n});\nconst circleContainerClassName = `${PREFIX}-loading_circle-container`;\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n }\n}\n</script>\n\n<style lang=\"scss\">\n@import './style/Circle.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Loading/Circle/Circle.vue'\nwx.createComponent(Component)"],"names":["computed","PREFIX","Component"],"mappings":";;;AAAO,MAAM,qBAAqB;AAAA,EAChC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AACF;ACcA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AArBA,UAAM,QAAQ;AACR,UAAA,uBAAuBA,cAAAA,SAAS,MAAM;AAC1C,YAAM,QAAQ;AAAA,QACZ,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,MAAA;AAGhB,UAAI,MAAM,OAAO;AACT,cAAA,4BAA4B,IAAI,MAAM;AAAA,MAC9C;AAEO,aAAA;AAAA,IAAA,CACR;AACK,UAAA,2BAA2B,GAAGC,0DAAM,MAAA;;;;;;;;;ACrB1C,GAAG,gBAAgBC,SAAS;"}
{"version":3,"file":"Circle.js","sources":["TUICallKit/src/Components/components/base/Loading/Circle/Circle.ts","TUICallKit/src/Components/components/base/Loading/Circle/Circle.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9Mb2FkaW5nL0NpcmNsZS9DaXJjbGUudnVl"],"sourcesContent":["export const LoadingCircleProps = {\n width: {\n type: String,\n default: '40px',\n },\n height: {\n type: String,\n default: '40px',\n },\n color: {\n type: String,\n },\n} as const;\n","<template>\n <div :class=\"circleContainerClassName\" :style=\"[circleContainerStyle]\"></div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../../adapter-vue';\nimport { LoadingCircleProps } from './Circle';\nimport { PREFIX } from '../../constants';\n\nconst props = defineProps(LoadingCircleProps);\nconst circleContainerStyle = computed(() => {\n const style = {\n width: props.width,\n height: props.height,\n };\n\n if (props.color) {\n style['--tk-loading-primary-color'] = props.color;\n }\n\n return style;\n});\nconst circleContainerClassName = `${PREFIX}-loading_circle-container`;\n</script>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n }\n}\n</script>\n\n<style lang=\"scss\">\n@import './style/Circle.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Loading/Circle/Circle.vue'\nwx.createComponent(Component)"],"names":["computed","PREFIX","Component"],"mappings":";;;AAAO,MAAM,qBAAqB;AAAA,EAChC,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AACF;ACcA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AArBA,UAAM,QAAQ;AACR,UAAA,uBAAuBA,cAAAA,SAAS,MAAM;AAC1C,YAAM,QAAQ;AAAA,QACZ,OAAO,MAAM;AAAA,QACb,QAAQ,MAAM;AAAA,MAAA;AAGhB,UAAI,MAAM,OAAO;AACT,cAAA,4BAA4B,IAAI,MAAM;AAAA,MAC9C;AAEO,aAAA;AAAA,IAAA,CACR;AACK,UAAA,2BAA2B,GAAGC,0DAAM,MAAA;;;;;;;;;ACrB1C,GAAG,gBAAgBC,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Dot.js","sources":["TUICallKit/src/Components/components/base/Loading/Dot/Dot.ts","TUICallKit/src/Components/components/base/Loading/Dot/Dot.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9Mb2FkaW5nL0RvdC9Eb3QudnVl"],"sourcesContent":["export const LoadingDotProps = {\n width: {\n type: String,\n default: '40px',\n },\n height: {\n type: String,\n default: '40px',\n },\n color: {\n type: String,\n },\n} as const;\n","<template>\n <div :class=\"dotContainerClassName\" :style=\"[dotContainerStyle]\">\n <div :class=\"dotClassName\" :style=\"[dotStyle]\" />\n <div :class=\"dotClassName\" :style=\"[dotStyle]\" />\n <div :class=\"dotClassName\" :style=\"[dotStyle]\" />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../../adapter-vue';\nimport { LoadingDotProps } from './Dot';\nimport { PREFIX } from '../../constants';\n\nconst props = defineProps(LoadingDotProps);\n\nconst dotContainerClassName = `${PREFIX}-loading_dot-container`;\nconst dotClassName = `${PREFIX}-loading_dot`\n\nconst dotContainerStyle = computed(() => ({\n width: props.width,\n height: props.height,\n}));\n\nconst dotStyle = computed(() => {\n const style = {};\n if (props.color) {\n style.backgroundColor = props.color;\n }\n\n return style;\n});\n</script>\n\n<style lang=\"scss\">\n@import './style/Dot.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Loading/Dot/Dot.vue'\nwx.createComponent(Component)"],"names":["PREFIX","computed","Component"],"mappings":";;;AAAO,MAAM,kBAAkB;AAAA,EAC7B,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AACF;ACHA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAQA,UAAM,QAAQ;AAER,UAAA,wBAAwB,GAAGA,0DAAM,MAAA;AACjC,UAAA,eAAe,GAAGA,0DAAM,MAAA;AAExB,UAAA,oBAAoBC,cAAAA,SAAS,OAAO;AAAA,MACxC,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,IACd,EAAA;AAEI,UAAA,WAAWA,cAAAA,SAAS,MAAM;AAC9B,YAAM,QAAQ,CAAA;AACd,UAAI,MAAM,OAAO;AACf,cAAM,kBAAkB,MAAM;AAAA,MAChC;AAEO,aAAA;AAAA,IAAA,CACR;;;;;;;;;;;;;;;ACrCD,GAAG,gBAAgBC,SAAS;"}
{"version":3,"file":"Dot.js","sources":["TUICallKit/src/Components/components/base/Loading/Dot/Dot.ts","TUICallKit/src/Components/components/base/Loading/Dot/Dot.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9Mb2FkaW5nL0RvdC9Eb3QudnVl"],"sourcesContent":["export const LoadingDotProps = {\n width: {\n type: String,\n default: '40px',\n },\n height: {\n type: String,\n default: '40px',\n },\n color: {\n type: String,\n },\n} as const;\n","<template>\n <div :class=\"dotContainerClassName\" :style=\"[dotContainerStyle]\">\n <div :class=\"dotClassName\" :style=\"[dotStyle]\" />\n <div :class=\"dotClassName\" :style=\"[dotStyle]\" />\n <div :class=\"dotClassName\" :style=\"[dotStyle]\" />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../../adapter-vue';\nimport { LoadingDotProps } from './Dot';\nimport { PREFIX } from '../../constants';\n\nconst props = defineProps(LoadingDotProps);\n\nconst dotContainerClassName = `${PREFIX}-loading_dot-container`;\nconst dotClassName = `${PREFIX}-loading_dot`\n\nconst dotContainerStyle = computed(() => ({\n width: props.width,\n height: props.height,\n}));\n\nconst dotStyle = computed(() => {\n const style = {};\n if (props.color) {\n style.backgroundColor = props.color;\n }\n\n return style;\n});\n</script>\n\n<style lang=\"scss\">\n@import './style/Dot.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Loading/Dot/Dot.vue'\nwx.createComponent(Component)"],"names":["PREFIX","computed","Component"],"mappings":";;;AAAO,MAAM,kBAAkB;AAAA,EAC7B,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AACF;ACHA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAQA,UAAM,QAAQ;AAER,UAAA,wBAAwB,GAAGA,0DAAM,MAAA;AACjC,UAAA,eAAe,GAAGA,0DAAM,MAAA;AAExB,UAAA,oBAAoBC,cAAAA,SAAS,OAAO;AAAA,MACxC,OAAO,MAAM;AAAA,MACb,QAAQ,MAAM;AAAA,IACd,EAAA;AAEI,UAAA,WAAWA,cAAAA,SAAS,MAAM;AAC9B,YAAM,QAAQ,CAAA;AACd,UAAI,MAAM,OAAO;AACf,cAAM,kBAAkB,MAAM;AAAA,MAChC;AAEO,aAAA;AAAA,IAAA,CACR;;;;;;;;;;;;;;;ACrCD,GAAG,gBAAgBC,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Loading.js","sources":["TUICallKit/src/Components/components/base/Loading/Loading.ts","TUICallKit/src/Components/components/base/Loading/Loading.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9Mb2FkaW5nL0xvYWRpbmcudnVl"],"sourcesContent":["const LoadingMode = ['circle', 'dot'] as const;\nconst LoadingLayout = ['row', 'column'] as const;\n\nexport const LoadingProps = {\n mode: {\n type: String,\n values: LoadingMode,\n default: 'circle',\n },\n loadingWidth: {\n type: String,\n default: '40px',\n },\n loadingHeight: {\n type: String,\n default: '40px',\n },\n color: {\n type: String,\n },\n text: {\n type: String,\n },\n layout: {\n type: String,\n values: LoadingLayout,\n default: 'column',\n },\n} as const;\n","<template>\n <div :class=\"loadingContainerClassName\" :style=\"[loadingContainerStyle]\">\n <LoadingDot v-if=\"mode === 'dot'\" :width=\"loadingWidth\" :height=\"loadingHeight\" :color=\"color\" />\n <LoadingCircle v-else :width=\"loadingWidth\" :height=\"loadingHeight\" :color=\"color\" />\n <div v-if=\"text\" :class=\"loadingTextClassName\">{{ text }}</div>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../adapter-vue';\nimport LoadingDot from './Dot/Dot.vue';\nimport LoadingCircle from './Circle/Circle.vue';\nimport { LoadingProps } from './Loading';\nimport { PREFIX } from '../constants/index';\n\nconst props = defineProps(LoadingProps);\n\nconst loadingContainerClassName = `${PREFIX}-loading ${PREFIX}-loading--${props.mode}`;\nconst loadingTextClassName = `${PREFIX}-loading_text`;\n\nconst loadingContainerStyle = computed(() => ({\n flexDirection: props.layout,\n}));\n</script>\n\n<style lang=\"scss\">\n@import './style/Loading.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Loading/Loading.vue'\nwx.createComponent(Component)"],"names":["PREFIX","computed","Component"],"mappings":";;;AAAA,MAAM,cAAc,CAAC,UAAU,KAAK;AACpC,MAAM,gBAAgB,CAAC,OAAO,QAAQ;AAE/B,MAAM,eAAe;AAAA,EAC1B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF;;;;ACVA,MAAA,aAAuB,MAAA;AACvB,MAAA,gBAA0B,MAAA;AAV1B,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUA,UAAM,QAAQ;AAEd,UAAM,4BAA4B,GAAGA,0DAAAA,MAAM,YAAYA,0DAAM,MAAA,aAAa,MAAM,IAAI;AAC9E,UAAA,uBAAuB,GAAGA,0DAAM,MAAA;AAEhC,UAAA,wBAAwBC,cAAAA,SAAS,OAAO;AAAA,MAC5C,eAAe,MAAM;AAAA,IACrB,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7BF,GAAG,gBAAgBC,SAAS;"}
{"version":3,"file":"Loading.js","sources":["TUICallKit/src/Components/components/base/Loading/Loading.ts","TUICallKit/src/Components/components/base/Loading/Loading.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9Mb2FkaW5nL0xvYWRpbmcudnVl"],"sourcesContent":["const LoadingMode = ['circle', 'dot'] as const;\nconst LoadingLayout = ['row', 'column'] as const;\n\nexport const LoadingProps = {\n mode: {\n type: String,\n values: LoadingMode,\n default: 'circle',\n },\n loadingWidth: {\n type: String,\n default: '40px',\n },\n loadingHeight: {\n type: String,\n default: '40px',\n },\n color: {\n type: String,\n },\n text: {\n type: String,\n },\n layout: {\n type: String,\n values: LoadingLayout,\n default: 'column',\n },\n} as const;\n","<template>\n <div :class=\"loadingContainerClassName\" :style=\"[loadingContainerStyle]\">\n <LoadingDot v-if=\"mode === 'dot'\" :width=\"loadingWidth\" :height=\"loadingHeight\" :color=\"color\" />\n <LoadingCircle v-else :width=\"loadingWidth\" :height=\"loadingHeight\" :color=\"color\" />\n <div v-if=\"text\" :class=\"loadingTextClassName\">{{ text }}</div>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../adapter-vue';\nimport LoadingDot from './Dot/Dot.vue';\nimport LoadingCircle from './Circle/Circle.vue';\nimport { LoadingProps } from './Loading';\nimport { PREFIX } from '../constants/index';\n\nconst props = defineProps(LoadingProps);\n\nconst loadingContainerClassName = `${PREFIX}-loading ${PREFIX}-loading--${props.mode}`;\nconst loadingTextClassName = `${PREFIX}-loading_text`;\n\nconst loadingContainerStyle = computed(() => ({\n flexDirection: props.layout,\n}));\n</script>\n\n<style lang=\"scss\">\n@import './style/Loading.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Loading/Loading.vue'\nwx.createComponent(Component)"],"names":["PREFIX","computed","Component"],"mappings":";;;AAAA,MAAM,cAAc,CAAC,UAAU,KAAK;AACpC,MAAM,gBAAgB,CAAC,OAAO,QAAQ;AAE/B,MAAM,eAAe;AAAA,EAC1B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,cAAc;AAAA,IACZ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF;;;;ACVA,MAAA,aAAuB,MAAA;AACvB,MAAA,gBAA0B,MAAA;AAV1B,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUA,UAAM,QAAQ;AAEd,UAAM,4BAA4B,GAAGA,0DAAAA,MAAM,YAAYA,0DAAM,MAAA,aAAa,MAAM,IAAI;AAC9E,UAAA,uBAAuB,GAAGA,0DAAM,MAAA;AAEhC,UAAA,wBAAwBC,cAAAA,SAAS,OAAO;AAAA,MAC5C,eAAe,MAAM;AAAA,IACrB,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7BF,GAAG,gBAAgBC,SAAS;"}
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"version":3,"file":"Overlay.js","sources":["TUICallKit/src/Components/components/base/Overlay/Overlay.ts","TUICallKit/src/Components/components/base/Overlay/Overlay.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9PdmVybGF5L092ZXJsYXkudnVl"],"sourcesContent":["export const OverlayProps = {\n show: {\n type: Boolean,\n default: true,\n },\n showMask: {\n type: Boolean,\n default: true,\n },\n showBackgroundImage: {\n type: Boolean,\n default: true,\n },\n blur: {\n type: Boolean,\n default: true,\n },\n bgColor: {\n type: String,\n },\n bgImage: {\n type: String,\n },\n zIndex: {\n type: Number,\n default: 11000,\n },\n customClass: {\n type: String,\n },\n customStyle: {\n type: Object,\n },\n customMaskStyle: {\n type: Object,\n },\n fit: {\n type: String,\n default: 'cover',\n },\n defaultSrc: {\n type: String,\n },\n} as const;\n\nexport const OverlayEmits = ['click', 'error'];\n","<template>\n <div\n v-if=\"show\"\n :class=\"overlayContainerClassName\"\n :style=\"[overlayStyle]\"\n @click=\"handleClick\"\n >\n <div :class=\"maskContainerClassName\">\n <div\n v-if=\"showMask\"\n :class=\"maskClassName\"\n :style=\"[maskStyle]\"\n />\n <TKImage \n v-if=\"showBackgroundImage\" \n :fit=\"fit\" \n :src=\"bgImage\" \n width=\"100%\" \n height=\"100%\" \n :defaultSrc=\"defaultSrc\" \n @error=\"handleError\" \n />\n </div>\n <div :class=\"slotClassName\">\n <slot />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../adapter-vue';\nimport TKImage from '../TKImage/TKImage.vue';\nimport { OverlayProps, OverlayEmits } from './Overlay';\nimport { classNames } from '../util';\nimport { PREFIX } from '../constants/index';\n\nconst props = defineProps(OverlayProps);\nconst emit = defineEmits(OverlayEmits);\n\nconst overlayContainerClassName = classNames([\n `${PREFIX}-overlay`,\n props.customClass,\n]);\nconst maskContainerClassName = `${PREFIX}-overlay_mask-container`;\nconst maskClassName = computed(() => classNames([\n `${PREFIX}-overlay_mask`,\n { [`${PREFIX}-blur`]: props.blur },\n]));\nconst slotClassName = `${PREFIX}-overlay_slot`;\nconst overlayStyle = computed(() => ({ zIndex: props.zIndex, ...props.customStyle }));\nconst maskStyle = computed(() => (\n {\n backgroundColor: props.bgColor,\n ...props.customMaskStyle,\n }\n));\nfunction handleClick() {\n emit('click');\n}\nconst handleError = (event) => {\n emit('error', event);\n}\n</script>\n\n<style lang=\"scss\">\n@import './style/Overlay.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Overlay/Overlay.vue'\nwx.createComponent(Component)"],"names":["classNames","PREFIX","computed","Component"],"mappings":";;;;;AAAO,MAAM,eAAe;AAAA,EAC1B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,qBAAqB;AAAA,IACnB,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,YAAY;AAAA,IACV,MAAM;AAAA,EACR;AACF;AAEa,MAAA,eAAe,CAAC,SAAS,OAAO;;;;ACN7C,MAAA,UAAoB,MAAA;AATpB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;AAUA,UAAM,QAAQ;AACd,UAAM,OAAO;AAEb,UAAM,4BAA4BA,0DAAAA,WAAW;AAAA,MAC3C,GAAGC,0DAAM,MAAA;AAAA,MACT,MAAM;AAAA,IAAA,CACP;AACK,UAAA,yBAAyB,GAAGA,0DAAM,MAAA;AAClC,UAAA,gBAAgBC,uBAAS,MAAMF,qEAAW;AAAA,MAC9C,GAAGC,0DAAM,MAAA;AAAA,MACT,EAAE,CAAC,GAAGA,0DAAM,MAAA,OAAO,GAAG,MAAM,KAAK;AAAA,IAClC,CAAA,CAAC;AACI,UAAA,gBAAgB,GAAGA,0DAAM,MAAA;AACzB,UAAA,eAAeC,cAAAA,SAAS,OAAO,EAAE,QAAQ,MAAM,QAAQ,GAAG,MAAM,YAAc,EAAA;AAC9E,UAAA,YAAYA,cAAAA,SAAS,OACzB;AAAA,MACE,iBAAiB,MAAM;AAAA,MACvB,GAAG,MAAM;AAAA,IAEZ,EAAA;AACD,aAAS,cAAc;AACrB,WAAK,OAAO;AAAA,IACd;AACM,UAAA,cAAc,CAAC,UAAU;AAC7B,WAAK,SAAS,KAAK;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnErB,GAAG,gBAAgBC,SAAS;"}
{"version":3,"file":"Overlay.js","sources":["TUICallKit/src/Components/components/base/Overlay/Overlay.ts","TUICallKit/src/Components/components/base/Overlay/Overlay.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9PdmVybGF5L092ZXJsYXkudnVl"],"sourcesContent":["export const OverlayProps = {\n show: {\n type: Boolean,\n default: true,\n },\n showMask: {\n type: Boolean,\n default: true,\n },\n showBackgroundImage: {\n type: Boolean,\n default: true,\n },\n blur: {\n type: Boolean,\n default: true,\n },\n bgColor: {\n type: String,\n },\n bgImage: {\n type: String,\n },\n zIndex: {\n type: Number,\n default: 11000,\n },\n customClass: {\n type: String,\n },\n customStyle: {\n type: Object,\n },\n customMaskStyle: {\n type: Object,\n },\n fit: {\n type: String,\n default: 'cover',\n },\n defaultSrc: {\n type: String,\n },\n} as const;\n\nexport const OverlayEmits = ['click', 'error'];\n","<template>\n <div\n v-if=\"show\"\n :class=\"overlayContainerClassName\"\n :style=\"[overlayStyle]\"\n @click=\"handleClick\"\n >\n <div :class=\"maskContainerClassName\">\n <div\n v-if=\"showMask\"\n :class=\"maskClassName\"\n :style=\"[maskStyle]\"\n />\n <TKImage \n v-if=\"showBackgroundImage\" \n :fit=\"fit\" \n :src=\"bgImage\" \n width=\"100%\" \n height=\"100%\" \n :defaultSrc=\"defaultSrc\" \n @error=\"handleError\" \n />\n </div>\n <div :class=\"slotClassName\">\n <slot />\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../adapter-vue';\nimport TKImage from '../TKImage/TKImage.vue';\nimport { OverlayProps, OverlayEmits } from './Overlay';\nimport { classNames } from '../util';\nimport { PREFIX } from '../constants/index';\n\nconst props = defineProps(OverlayProps);\nconst emit = defineEmits(OverlayEmits);\n\nconst overlayContainerClassName = classNames([\n `${PREFIX}-overlay`,\n props.customClass,\n]);\nconst maskContainerClassName = `${PREFIX}-overlay_mask-container`;\nconst maskClassName = computed(() => classNames([\n `${PREFIX}-overlay_mask`,\n { [`${PREFIX}-blur`]: props.blur },\n]));\nconst slotClassName = `${PREFIX}-overlay_slot`;\nconst overlayStyle = computed(() => ({ zIndex: props.zIndex, ...props.customStyle }));\nconst maskStyle = computed(() => (\n {\n backgroundColor: props.bgColor,\n ...props.customMaskStyle,\n }\n));\nfunction handleClick() {\n emit('click');\n}\nconst handleError = (event) => {\n emit('error', event);\n}\n</script>\n\n<style lang=\"scss\">\n@import './style/Overlay.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Overlay/Overlay.vue'\nwx.createComponent(Component)"],"names":["classNames","PREFIX","computed","Component"],"mappings":";;;;;AAAO,MAAM,eAAe;AAAA,EAC1B,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,qBAAqB;AAAA,IACnB,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,YAAY;AAAA,IACV,MAAM;AAAA,EACR;AACF;AAEa,MAAA,eAAe,CAAC,SAAS,OAAO;;;;ACN7C,MAAA,UAAoB,MAAA;AATpB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;AAUA,UAAM,QAAQ;AACd,UAAM,OAAO;AAEb,UAAM,4BAA4BA,0DAAAA,WAAW;AAAA,MAC3C,GAAGC,0DAAM,MAAA;AAAA,MACT,MAAM;AAAA,IAAA,CACP;AACK,UAAA,yBAAyB,GAAGA,0DAAM,MAAA;AAClC,UAAA,gBAAgBC,uBAAS,MAAMF,qEAAW;AAAA,MAC9C,GAAGC,0DAAM,MAAA;AAAA,MACT,EAAE,CAAC,GAAGA,0DAAM,MAAA,OAAO,GAAG,MAAM,KAAK;AAAA,IAClC,CAAA,CAAC;AACI,UAAA,gBAAgB,GAAGA,0DAAM,MAAA;AACzB,UAAA,eAAeC,cAAAA,SAAS,OAAO,EAAE,QAAQ,MAAM,QAAQ,GAAG,MAAM,YAAc,EAAA;AAC9E,UAAA,YAAYA,cAAAA,SAAS,OACzB;AAAA,MACE,iBAAiB,MAAM;AAAA,MACvB,GAAG,MAAM;AAAA,IAEZ,EAAA;AACD,aAAS,cAAc;AACrB,WAAK,OAAO;AAAA,IACd;AACM,UAAA,cAAc,CAAC,UAAU;AAC7B,WAAK,SAAS,KAAK;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnErB,GAAG,gBAAgBC,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Portal.js","sources":["TUICallKit/src/Components/components/base/Portal/Portal.ts","TUICallKit/src/Components/components/base/Portal/Portal.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9Qb3J0YWwvUG9ydGFsLnZ1ZQ"],"sourcesContent":["export const PortalProps = {\n disabled: {\n type: Boolean,\n default: false,\n },\n to: {\n type: String,\n default: 'body',\n },\n source: {\n type: String,\n default: 'body',\n },\n} as const;\n","<template>\n <div>\n <PortalMini :disabled=\"disabled\" v-if=\"IN_MINI_APP\" ><slot /></PortalMini>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../adapter-vue';\nimport PortalMini from './miniprogram/Portal.vue';\nimport { PortalProps } from './Portal';\nimport { checkVueVersion, IN_MINI_APP } from '../util';\n\ndefineProps(PortalProps);\n\nconst { majorVersion } = checkVueVersion();\nconst isVue3 = computed(() => majorVersion === '3');\nconst isVue2 = computed(() => majorVersion === '2');\n</script>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Portal/Portal.vue'\nwx.createComponent(Component)"],"names":["checkVueVersion","computed","Component"],"mappings":";;;;AAAO,MAAM,cAAc;AAAA,EACzB,UAAU;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,IAAI;AAAA,IACF,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;;;;ACLA,MAAA,aAAuB,MAAA;;;;;AAMjB,UAAA,EAAE,iBAAiBA,+DAAAA;AACVC,2BAAS,MAAM,iBAAiB,GAAG;AACnCA,2BAAS,MAAM,iBAAiB,GAAG;;;;;;;;;;;;ACflD,GAAG,gBAAgBC,SAAS;"}
{"version":3,"file":"Portal.js","sources":["TUICallKit/src/Components/components/base/Portal/Portal.ts","TUICallKit/src/Components/components/base/Portal/Portal.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9Qb3J0YWwvUG9ydGFsLnZ1ZQ"],"sourcesContent":["export const PortalProps = {\n disabled: {\n type: Boolean,\n default: false,\n },\n to: {\n type: String,\n default: 'body',\n },\n source: {\n type: String,\n default: 'body',\n },\n} as const;\n","<template>\n <div>\n <PortalMini :disabled=\"disabled\" v-if=\"IN_MINI_APP\" ><slot /></PortalMini>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../adapter-vue';\nimport PortalMini from './miniprogram/Portal.vue';\nimport { PortalProps } from './Portal';\nimport { checkVueVersion, IN_MINI_APP } from '../util';\n\ndefineProps(PortalProps);\n\nconst { majorVersion } = checkVueVersion();\nconst isVue3 = computed(() => majorVersion === '3');\nconst isVue2 = computed(() => majorVersion === '2');\n</script>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Portal/Portal.vue'\nwx.createComponent(Component)"],"names":["checkVueVersion","computed","Component"],"mappings":";;;;AAAO,MAAM,cAAc;AAAA,EACzB,UAAU;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,IAAI;AAAA,IACF,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;;;;ACLA,MAAA,aAAuB,MAAA;;;;;AAMjB,UAAA,EAAE,iBAAiBA,+DAAAA;AACVC,2BAAS,MAAM,iBAAiB,GAAG;AACnCA,2BAAS,MAAM,iBAAiB,GAAG;;;;;;;;;;;;ACflD,GAAG,gBAAgBC,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Portal.js","sources":["TUICallKit/src/Components/components/base/Portal/miniprogram/Portal.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9Qb3J0YWwvbWluaXByb2dyYW0vUG9ydGFsLnZ1ZQ"],"sourcesContent":["<template>\n <root-portal :enable=\"!disabled\">\n <slot />\n </root-portal>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = defineProps(['disabled']);\n</script>\n\n<style scoped>\n</style>","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Portal/miniprogram/Portal.vue'\nwx.createComponent(Component)"],"names":["Component"],"mappings":";;AAOA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;;;;;;;ACVA,GAAG,gBAAgBA,SAAS;"}
{"version":3,"file":"Portal.js","sources":["TUICallKit/src/Components/components/base/Portal/miniprogram/Portal.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9Qb3J0YWwvbWluaXByb2dyYW0vUG9ydGFsLnZ1ZQ"],"sourcesContent":["<template>\n <root-portal :enable=\"!disabled\">\n <slot />\n </root-portal>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nconst props = defineProps(['disabled']);\n</script>\n\n<style scoped>\n</style>","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/Portal/miniprogram/Portal.vue'\nwx.createComponent(Component)"],"names":["Component"],"mappings":";;AAOA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;;;;;;;ACVA,GAAG,gBAAgBA,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"TKImage.js","sources":["TUICallKit/src/Components/components/base/TKImage/TKImage.ts","TUICallKit/src/Components/components/base/TKImage/TKImage.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9US0ltYWdlL1RLSW1hZ2UudnVl"],"sourcesContent":["export const Fit = ['fill', 'contain', 'cover'] as const;\nexport const MiniProgramImageFitMap = {\n fill: 'scaleToFill',\n contain: 'aspectFit',\n cover: 'aspectFill',\n} as const;\nexport const ImageProps = {\n width: {\n type: String,\n default: '320px',\n },\n height: {\n type: String,\n default: '240px',\n },\n src: {\n type: String,\n },\n fit: {\n type: String,\n values: Fit,\n default: 'fill',\n },\n customStyle: {\n type: Object,\n },\n defaultSrc: {\n type: String,\n },\n} as const;\n\nexport const imageEmits = {\n error: (evt) => evt,\n};\n","<template>\n <div :class=\"classname\" :style=\"[imgStyle]\">\n <template v-if=\"hasLoadError && !defaultSrc\">\n <slot name=\"error\" />\n </template>\n <template v-else>\n <img\n v-if=\"!IN_WX_MINI_APP\"\n :class=\"imageClassName\"\n :src=\"imgSrc\"\n :style=\"{ objectFit }\"\n @error=\"handleError\"\n />\n <image\n v-if=\"IN_WX_MINI_APP\"\n :class=\"imageClassName\"\n :src=\"imgSrc\"\n :mode=\"objectFit\"\n @error=\"handleError\"\n />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch } from '../../../../adapter-vue';\nimport { IN_WX_MINI_APP, classNames } from '../util';\nimport { ImageProps, MiniProgramImageFitMap, imageEmits } from './TKImage';\nimport { PREFIX } from '../constants/index';\n\nconst props = defineProps(ImageProps);\nconst emit = defineEmits(imageEmits);\nconst hasLoadError = ref(false);\nconst imgSrc = ref(props.src);\n\nwatch(() => props.src, () => {\n hasLoadError.value = false;\n imgSrc.value = props.src;\n});\n\nconst classname = computed(() => classNames([`${PREFIX}-image`]));\nconst imgStyle = computed(() => {\n return {\n \"width\": props.width,\n \"height\": props.height,\n ...props.customStyle,\n }\n})\nconst imageClassName = computed(() => classNames([\n `${PREFIX}-image_inner`,\n]));\nconst objectFit = computed(() => {\n if (IN_WX_MINI_APP) {\n return MiniProgramImageFitMap[props.fit] || MiniProgramImageFitMap.cover;\n } else {\n return props.fit;\n }\n});\n\nfunction handleError(e) {\n hasLoadError.value = true;\n imgSrc.value = props.defaultSrc;\n emit('error', e);\n}\n</script>\n\n<style lang=\"scss\">\n@import './style/TKImage.scss';\n</style>","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/TKImage/TKImage.vue'\nwx.createComponent(Component)"],"names":["ref","watch","computed","classNames","PREFIX","IN_WX_MINI_APP","Component"],"mappings":";;;;;AAAO,MAAM,MAAM,CAAC,QAAQ,WAAW,OAAO;AACvC,MAAM,yBAAyB;AAAA,EACpC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AACT;AACO,MAAM,aAAa;AAAA,EACxB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA,IACV,MAAM;AAAA,EACR;AACF;AAEO,MAAM,aAAa;AAAA,EACxB,OAAO,CAAC,QAAQ;AAClB;ACRA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;AASA,UAAM,QAAQ;AACd,UAAM,OAAO;AACP,UAAA,eAAeA,kBAAI,KAAK;AACxB,UAAA,SAASA,cAAAA,IAAI,MAAM,GAAG;AAEtBC,wBAAA,MAAM,MAAM,KAAK,MAAM;AAC3B,mBAAa,QAAQ;AACrB,aAAO,QAAQ,MAAM;AAAA,IAAA,CACtB;AAEK,UAAA,YAAYC,uBAAS,MAAMC,qEAAW,CAAC,GAAGC,gEAAM,QAAQ,CAAC,CAAC;AAC1D,UAAA,WAAWF,cAAAA,SAAS,MAAM;AACvB,aAAA;AAAA,QACL,SAAS,MAAM;AAAA,QACf,UAAU,MAAM;AAAA,QAChB,GAAG,MAAM;AAAA,MAAA;AAAA,IACX,CACD;AACK,UAAA,iBAAiBA,uBAAS,MAAMC,qEAAW;AAAA,MAC/C,GAAGC,0DAAM,MAAA;AAAA,IACV,CAAA,CAAC;AACI,UAAA,YAAYF,cAAAA,SAAS,MAAM;AAC/B,UAAIG,wEAAgB;AAClB,eAAO,uBAAuB,MAAM,GAAG,KAAK,uBAAuB;AAAA,MAAA,OAC9D;AACL,eAAO,MAAM;AAAA,MACf;AAAA,IAAA,CACD;AAED,aAAS,YAAY,GAAG;AACtB,mBAAa,QAAQ;AACrB,aAAO,QAAQ,MAAM;AACrB,WAAK,SAAS,CAAC;AAAA,IACjB;;;;;;;;;;;;;;;;;;;;;;;;;ACtEA,GAAG,gBAAgBC,SAAS;"}
{"version":3,"file":"TKImage.js","sources":["TUICallKit/src/Components/components/base/TKImage/TKImage.ts","TUICallKit/src/Components/components/base/TKImage/TKImage.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9US0ltYWdlL1RLSW1hZ2UudnVl"],"sourcesContent":["export const Fit = ['fill', 'contain', 'cover'] as const;\nexport const MiniProgramImageFitMap = {\n fill: 'scaleToFill',\n contain: 'aspectFit',\n cover: 'aspectFill',\n} as const;\nexport const ImageProps = {\n width: {\n type: String,\n default: '320px',\n },\n height: {\n type: String,\n default: '240px',\n },\n src: {\n type: String,\n },\n fit: {\n type: String,\n values: Fit,\n default: 'fill',\n },\n customStyle: {\n type: Object,\n },\n defaultSrc: {\n type: String,\n },\n} as const;\n\nexport const imageEmits = {\n error: (evt) => evt,\n};\n","<template>\n <div :class=\"classname\" :style=\"[imgStyle]\">\n <template v-if=\"hasLoadError && !defaultSrc\">\n <slot name=\"error\" />\n </template>\n <template v-else>\n <img\n v-if=\"!IN_WX_MINI_APP\"\n :class=\"imageClassName\"\n :src=\"imgSrc\"\n :style=\"{ objectFit }\"\n @error=\"handleError\"\n />\n <image\n v-if=\"IN_WX_MINI_APP\"\n :class=\"imageClassName\"\n :src=\"imgSrc\"\n :mode=\"objectFit\"\n @error=\"handleError\"\n />\n </template>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch } from '../../../../adapter-vue';\nimport { IN_WX_MINI_APP, classNames } from '../util';\nimport { ImageProps, MiniProgramImageFitMap, imageEmits } from './TKImage';\nimport { PREFIX } from '../constants/index';\n\nconst props = defineProps(ImageProps);\nconst emit = defineEmits(imageEmits);\nconst hasLoadError = ref(false);\nconst imgSrc = ref(props.src);\n\nwatch(() => props.src, () => {\n hasLoadError.value = false;\n imgSrc.value = props.src;\n});\n\nconst classname = computed(() => classNames([`${PREFIX}-image`]));\nconst imgStyle = computed(() => {\n return {\n \"width\": props.width,\n \"height\": props.height,\n ...props.customStyle,\n }\n})\nconst imageClassName = computed(() => classNames([\n `${PREFIX}-image_inner`,\n]));\nconst objectFit = computed(() => {\n if (IN_WX_MINI_APP) {\n return MiniProgramImageFitMap[props.fit] || MiniProgramImageFitMap.cover;\n } else {\n return props.fit;\n }\n});\n\nfunction handleError(e) {\n hasLoadError.value = true;\n imgSrc.value = props.defaultSrc;\n emit('error', e);\n}\n</script>\n\n<style lang=\"scss\">\n@import './style/TKImage.scss';\n</style>","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/TKImage/TKImage.vue'\nwx.createComponent(Component)"],"names":["ref","watch","computed","classNames","PREFIX","IN_WX_MINI_APP","Component"],"mappings":";;;;;AAAO,MAAM,MAAM,CAAC,QAAQ,WAAW,OAAO;AACvC,MAAM,yBAAyB;AAAA,EACpC,MAAM;AAAA,EACN,SAAS;AAAA,EACT,OAAO;AACT;AACO,MAAM,aAAa;AAAA,EACxB,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,EACR;AAAA,EACA,KAAK;AAAA,IACH,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AAAA,EACA,aAAa;AAAA,IACX,MAAM;AAAA,EACR;AAAA,EACA,YAAY;AAAA,IACV,MAAM;AAAA,EACR;AACF;AAEO,MAAM,aAAa;AAAA,EACxB,OAAO,CAAC,QAAQ;AAClB;ACRA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;AASA,UAAM,QAAQ;AACd,UAAM,OAAO;AACP,UAAA,eAAeA,kBAAI,KAAK;AACxB,UAAA,SAASA,cAAAA,IAAI,MAAM,GAAG;AAEtBC,wBAAA,MAAM,MAAM,KAAK,MAAM;AAC3B,mBAAa,QAAQ;AACrB,aAAO,QAAQ,MAAM;AAAA,IAAA,CACtB;AAEK,UAAA,YAAYC,uBAAS,MAAMC,qEAAW,CAAC,GAAGC,gEAAM,QAAQ,CAAC,CAAC;AAC1D,UAAA,WAAWF,cAAAA,SAAS,MAAM;AACvB,aAAA;AAAA,QACL,SAAS,MAAM;AAAA,QACf,UAAU,MAAM;AAAA,QAChB,GAAG,MAAM;AAAA,MAAA;AAAA,IACX,CACD;AACK,UAAA,iBAAiBA,uBAAS,MAAMC,qEAAW;AAAA,MAC/C,GAAGC,0DAAM,MAAA;AAAA,IACV,CAAA,CAAC;AACI,UAAA,YAAYF,cAAAA,SAAS,MAAM;AAC/B,UAAIG,wEAAgB;AAClB,eAAO,uBAAuB,MAAM,GAAG,KAAK,uBAAuB;AAAA,MAAA,OAC9D;AACL,eAAO,MAAM;AAAA,MACf;AAAA,IAAA,CACD;AAED,aAAS,YAAY,GAAG;AACtB,mBAAa,QAAQ;AACrB,aAAO,QAAQ,MAAM;AACrB,WAAK,SAAS,CAAC;AAAA,IACjB;;;;;;;;;;;;;;;;;;;;;;;;;ACtEA,GAAG,gBAAgBC,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"TKText.js","sources":["TUICallKit/src/Components/components/base/TKText/TKText.ts","TUICallKit/src/Components/components/base/TKText/TKText.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9US1RleHQvVEtUZXh0LnZ1ZQ"],"sourcesContent":["export const TextProps = {\n width: {\n type: String,\n },\n color: {\n type: String,\n },\n size: {\n type: String,\n },\n weight: {\n type: Number,\n },\n truncated: {\n type: Boolean,\n default: false,\n },\n lineClamp: {\n type: Number,\n },\n textStyle: {\n type: Object,\n },\n};\n","<template>\n <span :class=\"textClassName\" :style=\"[style]\" @click=\"handleClick\">\n <slot></slot>\n </span>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../adapter-vue';\nimport { TextProps } from './TKText';\nimport { PREFIX } from '../constants/index';\nimport { classNames, filterObject } from '../util';\n\nconst props = defineProps(TextProps);\nconst emit = defineEmits(['click']);\nconst textClassName = classNames([\n `${PREFIX}-text`,\n {[`${PREFIX}-text--line-clamp`]: props.lineClamp},\n]);\nconst style = computed(() => (filterObject({\n maxWidth: props.width,\n fontSize: props.size,\n fontWeight: props.weight,\n color: props.color,\n textOverflow: props.truncated ? 'ellipsis' : 'auto',\n '-webkit-line-clamp': props.lineClamp,\n ...props.textStyle,\n})));\nconst handleClick = () => {\n emit('click');\n};\n</script>\n\n<style lang=\"scss\">\n@import './style/TKText.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/TKText/TKText.vue'\nwx.createComponent(Component)"],"names":["classNames","PREFIX","computed","filterObject","Component"],"mappings":";;;;;;AAAO,MAAM,YAAY;AAAA,EACvB,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,EACR;AACF;AChBA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;AASA,UAAM,QAAQ;AACd,UAAM,OAAO;AACb,UAAM,gBAAgBA,0DAAAA,WAAW;AAAA,MAC/B,GAAGC,0DAAM,MAAA;AAAA,MACT,EAAC,CAAC,GAAGA,0DAAM,MAAA,mBAAmB,GAAG,MAAM,UAAS;AAAA,IAAA,CACjD;AACK,UAAA,QAAQC,uBAAS,MAAOC,yEAAa;AAAA,MACzC,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,YAAY,MAAM;AAAA,MAClB,OAAO,MAAM;AAAA,MACb,cAAc,MAAM,YAAY,aAAa;AAAA,MAC7C,sBAAsB,MAAM;AAAA,MAC5B,GAAG,MAAM;AAAA,IACV,CAAA,CAAE;AACH,UAAM,cAAc,MAAM;AACxB,WAAK,OAAO;AAAA,IAAA;;;;;;;;;;ACnCd,GAAG,gBAAgBC,SAAS;"}
{"version":3,"file":"TKText.js","sources":["TUICallKit/src/Components/components/base/TKText/TKText.ts","TUICallKit/src/Components/components/base/TKText/TKText.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9US1RleHQvVEtUZXh0LnZ1ZQ"],"sourcesContent":["export const TextProps = {\n width: {\n type: String,\n },\n color: {\n type: String,\n },\n size: {\n type: String,\n },\n weight: {\n type: Number,\n },\n truncated: {\n type: Boolean,\n default: false,\n },\n lineClamp: {\n type: Number,\n },\n textStyle: {\n type: Object,\n },\n};\n","<template>\n <span :class=\"textClassName\" :style=\"[style]\" @click=\"handleClick\">\n <slot></slot>\n </span>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script setup lang=\"ts\">\nimport { computed } from '../../../../adapter-vue';\nimport { TextProps } from './TKText';\nimport { PREFIX } from '../constants/index';\nimport { classNames, filterObject } from '../util';\n\nconst props = defineProps(TextProps);\nconst emit = defineEmits(['click']);\nconst textClassName = classNames([\n `${PREFIX}-text`,\n {[`${PREFIX}-text--line-clamp`]: props.lineClamp},\n]);\nconst style = computed(() => (filterObject({\n maxWidth: props.width,\n fontSize: props.size,\n fontWeight: props.weight,\n color: props.color,\n textOverflow: props.truncated ? 'ellipsis' : 'auto',\n '-webkit-line-clamp': props.lineClamp,\n ...props.textStyle,\n})));\nconst handleClick = () => {\n emit('click');\n};\n</script>\n\n<style lang=\"scss\">\n@import './style/TKText.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/TKText/TKText.vue'\nwx.createComponent(Component)"],"names":["classNames","PREFIX","computed","filterObject","Component"],"mappings":";;;;;;AAAO,MAAM,YAAY;AAAA,EACvB,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACJ,MAAM;AAAA,EACR;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,EACR;AACF;AChBA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;AASA,UAAM,QAAQ;AACd,UAAM,OAAO;AACb,UAAM,gBAAgBA,0DAAAA,WAAW;AAAA,MAC/B,GAAGC,0DAAM,MAAA;AAAA,MACT,EAAC,CAAC,GAAGA,0DAAM,MAAA,mBAAmB,GAAG,MAAM,UAAS;AAAA,IAAA,CACjD;AACK,UAAA,QAAQC,uBAAS,MAAOC,yEAAa;AAAA,MACzC,UAAU,MAAM;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,YAAY,MAAM;AAAA,MAClB,OAAO,MAAM;AAAA,MACb,cAAc,MAAM,YAAY,aAAa;AAAA,MAC7C,sBAAsB,MAAM;AAAA,MAC5B,GAAG,MAAM;AAAA,IACV,CAAA,CAAE;AACH,UAAM,cAAc,MAAM;AACxB,WAAK,OAAO;AAAA,IAAA;;;;;;;;;;ACnCd,GAAG,gBAAgBC,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"ToggleWindow.js","sources":["TUICallKit/src/Components/components/base/ToggleWindow/ToggleWindow.ts","TUICallKit/src/Components/components/base/ToggleWindow/ToggleWindow.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9Ub2dnbGVXaW5kb3cvVG9nZ2xlV2luZG93LnZ1ZQ"],"sourcesContent":["export const ToggleWindowProps = {\n bigWindow: {\n type: String,\n },\n showSmallWindow: {\n type: Boolean,\n default: true,\n },\n smallWindowWidth: {\n type: String,\n default: '30%',\n },\n smallWindowHeight: {\n type: String,\n default: '30%',\n },\n} as const;\n\nexport const ToggleWindowEmits = ['toggle'];\n","<template>\n <div :class=\"toggleWindowContainerClassName\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { watch, provide, toRef, ref } from '../../../../adapter-vue';\nimport { ToggleWindowProps, ToggleWindowEmits } from './ToggleWindow';\nimport { ToggleWindowContextKey } from './constant';\nimport { PREFIX } from '../constants/index';\n\nconst props = defineProps(ToggleWindowProps);\nconst emit = defineEmits(ToggleWindowEmits);\n\nconst currentBigWindow = ref(props.bigWindow);\nconst toggleWindowContainerClassName = `${PREFIX}-toggle-window`;\nconst toggleWindow = (value) => {\n currentBigWindow.value = value;\n emit('toggle', value);\n};\n\nwatch(() => props.bigWindow, () => { \n currentBigWindow.value = props.bigWindow;\n});\n\nprovide(ToggleWindowContextKey, {\n bigWindow: currentBigWindow,\n toggleWindow,\n smallWindowWidth: toRef(props, 'smallWindowWidth'),\n smallWindowHeight: toRef(props, 'smallWindowHeight'),\n showSmallWindow: toRef(props, 'showSmallWindow'),\n});\n</script>\n\n<style lang=\"scss\">\n@import './style/ToggleWindow.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/ToggleWindow/ToggleWindow.vue'\nwx.createComponent(Component)"],"names":["ref","PREFIX","watch","provide","ToggleWindowContextKey","toRef","Component"],"mappings":";;;;AAAO,MAAM,oBAAoB;AAAA,EAC/B,WAAW;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEa,MAAA,oBAAoB,CAAC,QAAQ;ACX1C,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;AASA,UAAM,QAAQ;AACd,UAAM,OAAO;AAEP,UAAA,mBAAmBA,cAAAA,IAAI,MAAM,SAAS;AACtC,UAAA,iCAAiC,GAAGC,0DAAM,MAAA;AAC1C,UAAA,eAAe,CAAC,UAAU;AAC9B,uBAAiB,QAAQ;AACzB,WAAK,UAAU,KAAK;AAAA,IAAA;AAGhBC,wBAAA,MAAM,MAAM,WAAW,MAAM;AACjC,uBAAiB,QAAQ,MAAM;AAAA,IAAA,CAChC;AAEDC,kBAAAA,QAAQC,gEAAAA,wBAAwB;AAAA,MAC9B,WAAW;AAAA,MACX;AAAA,MACA,kBAAkBC,cAAAA,MAAM,OAAO,kBAAkB;AAAA,MACjD,mBAAmBA,cAAAA,MAAM,OAAO,mBAAmB;AAAA,MACnD,iBAAiBA,cAAAA,MAAM,OAAO,iBAAiB;AAAA,IAAA,CAChD;;;;;;;;ACvCD,GAAG,gBAAgBC,SAAS;"}
{"version":3,"file":"ToggleWindow.js","sources":["TUICallKit/src/Components/components/base/ToggleWindow/ToggleWindow.ts","TUICallKit/src/Components/components/base/ToggleWindow/ToggleWindow.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9Ub2dnbGVXaW5kb3cvVG9nZ2xlV2luZG93LnZ1ZQ"],"sourcesContent":["export const ToggleWindowProps = {\n bigWindow: {\n type: String,\n },\n showSmallWindow: {\n type: Boolean,\n default: true,\n },\n smallWindowWidth: {\n type: String,\n default: '30%',\n },\n smallWindowHeight: {\n type: String,\n default: '30%',\n },\n} as const;\n\nexport const ToggleWindowEmits = ['toggle'];\n","<template>\n <div :class=\"toggleWindowContainerClassName\">\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { watch, provide, toRef, ref } from '../../../../adapter-vue';\nimport { ToggleWindowProps, ToggleWindowEmits } from './ToggleWindow';\nimport { ToggleWindowContextKey } from './constant';\nimport { PREFIX } from '../constants/index';\n\nconst props = defineProps(ToggleWindowProps);\nconst emit = defineEmits(ToggleWindowEmits);\n\nconst currentBigWindow = ref(props.bigWindow);\nconst toggleWindowContainerClassName = `${PREFIX}-toggle-window`;\nconst toggleWindow = (value) => {\n currentBigWindow.value = value;\n emit('toggle', value);\n};\n\nwatch(() => props.bigWindow, () => { \n currentBigWindow.value = props.bigWindow;\n});\n\nprovide(ToggleWindowContextKey, {\n bigWindow: currentBigWindow,\n toggleWindow,\n smallWindowWidth: toRef(props, 'smallWindowWidth'),\n smallWindowHeight: toRef(props, 'smallWindowHeight'),\n showSmallWindow: toRef(props, 'showSmallWindow'),\n});\n</script>\n\n<style lang=\"scss\">\n@import './style/ToggleWindow.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/ToggleWindow/ToggleWindow.vue'\nwx.createComponent(Component)"],"names":["ref","PREFIX","watch","provide","ToggleWindowContextKey","toRef","Component"],"mappings":";;;;AAAO,MAAM,oBAAoB;AAAA,EAC/B,WAAW;AAAA,IACT,MAAM;AAAA,EACR;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AACF;AAEa,MAAA,oBAAoB,CAAC,QAAQ;ACX1C,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;;AASA,UAAM,QAAQ;AACd,UAAM,OAAO;AAEP,UAAA,mBAAmBA,cAAAA,IAAI,MAAM,SAAS;AACtC,UAAA,iCAAiC,GAAGC,0DAAM,MAAA;AAC1C,UAAA,eAAe,CAAC,UAAU;AAC9B,uBAAiB,QAAQ;AACzB,WAAK,UAAU,KAAK;AAAA,IAAA;AAGhBC,wBAAA,MAAM,MAAM,WAAW,MAAM;AACjC,uBAAiB,QAAQ,MAAM;AAAA,IAAA,CAChC;AAEDC,kBAAAA,QAAQC,gEAAAA,wBAAwB;AAAA,MAC9B,WAAW;AAAA,MACX;AAAA,MACA,kBAAkBC,cAAAA,MAAM,OAAO,kBAAkB;AAAA,MACjD,mBAAmBA,cAAAA,MAAM,OAAO,mBAAmB;AAAA,MACnD,iBAAiBA,cAAAA,MAAM,OAAO,iBAAiB;AAAA,IAAA,CAChD;;;;;;;;ACvCD,GAAG,gBAAgBC,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"ToggleWindowItem.js","sources":["TUICallKit/src/Components/components/base/ToggleWindow/ToggleWindowItem/ToggleWindowItem.ts","TUICallKit/src/Components/components/base/ToggleWindow/ToggleWindowItem/ToggleWindowItem.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9Ub2dnbGVXaW5kb3cvVG9nZ2xlV2luZG93SXRlbS9Ub2dnbGVXaW5kb3dJdGVtLnZ1ZQ"],"sourcesContent":["export const ToggleWindowItemProps = {\n value: {\n type: String,\n },\n} as const;\n","<template>\n <div\n :class=\"classname\"\n :style=\"[windowItemStyle]\"\n @click=\"() => toggleWindow(value)\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, inject } from '../../../../../adapter-vue';\nimport { ToggleWindowItemProps } from './ToggleWindowItem';\nimport { ToggleWindowContextKey } from '../constant';\nimport { classNames, IS_PC } from '../../util';\nimport { PREFIX } from '../../constants/index';\n\nconst props = defineProps(ToggleWindowItemProps);\n\nconst {\n bigWindow,\n toggleWindow,\n smallWindowWidth, \n smallWindowHeight,\n showSmallWindow,\n} = inject(ToggleWindowContextKey);\nconst classname = computed(() => classNames([\n `${PREFIX}-toggle-window-item`,\n `${PREFIX}-toggle-window-item--${bigWindow.value === props.value ? 'big' : 'small'}`,\n {\n pc: IS_PC,\n mobile: !IS_PC,\n },\n]));\n\nconst windowItemStyle = computed(() => {\n let style: any = {};\n if (bigWindow.value !== props.value) {\n style = { width: smallWindowWidth.value, height: smallWindowHeight.value };\n \n if (!showSmallWindow.value) {\n style.visibility = 'hidden';\n } else {\n style.visibility = '';\n }\n }\n\n return style;\n});\n</script>\n\n<style lang=\"scss\">\n@import './style/ToggleWindowItem.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/ToggleWindow/ToggleWindowItem/ToggleWindowItem.vue'\nwx.createComponent(Component)"],"names":["inject","ToggleWindowContextKey","computed","classNames","PREFIX","IS_PC","Component"],"mappings":";;;;;;AAAO,MAAM,wBAAwB;AAAA,EACnC,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AACF;ACOA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUA,UAAM,QAAQ;AAER,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,IACEA,cAAAA,OAAOC,gEAAAA,sBAAsB;AAC3B,UAAA,YAAYC,uBAAS,MAAMC,qEAAW;AAAA,MAC1C,GAAGC,0DAAM,MAAA;AAAA,MACT,GAAGA,0DAAAA,MAAM,wBAAwB,UAAU,UAAU,MAAM,QAAQ,QAAQ,OAAO;AAAA,MAClF;AAAA,QACE,IAAIC,wDAAA;AAAA,QACJ,QAAQ,CAACA,wDAAA;AAAA,MACX;AAAA,IACD,CAAA,CAAC;AAEI,UAAA,kBAAkBH,cAAAA,SAAS,MAAM;AACrC,UAAI,QAAa,CAAA;AACb,UAAA,UAAU,UAAU,MAAM,OAAO;AACnC,gBAAQ,EAAE,OAAO,iBAAiB,OAAO,QAAQ,kBAAkB;AAE/D,YAAA,CAAC,gBAAgB,OAAO;AAC1B,gBAAM,aAAa;AAAA,QAAA,OACd;AACL,gBAAM,aAAa;AAAA,QACrB;AAAA,MACF;AAEO,aAAA;AAAA,IAAA,CACR;;;;;;;;;;ACvDD,GAAG,gBAAgBI,SAAS;"}
{"version":3,"file":"ToggleWindowItem.js","sources":["TUICallKit/src/Components/components/base/ToggleWindow/ToggleWindowItem/ToggleWindowItem.ts","TUICallKit/src/Components/components/base/ToggleWindow/ToggleWindowItem/ToggleWindowItem.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvYmFzZS9Ub2dnbGVXaW5kb3cvVG9nZ2xlV2luZG93SXRlbS9Ub2dnbGVXaW5kb3dJdGVtLnZ1ZQ"],"sourcesContent":["export const ToggleWindowItemProps = {\n value: {\n type: String,\n },\n} as const;\n","<template>\n <div\n :class=\"classname\"\n :style=\"[windowItemStyle]\"\n @click=\"() => toggleWindow(value)\"\n >\n <slot />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, inject } from '../../../../../adapter-vue';\nimport { ToggleWindowItemProps } from './ToggleWindowItem';\nimport { ToggleWindowContextKey } from '../constant';\nimport { classNames, IS_PC } from '../../util';\nimport { PREFIX } from '../../constants/index';\n\nconst props = defineProps(ToggleWindowItemProps);\n\nconst {\n bigWindow,\n toggleWindow,\n smallWindowWidth, \n smallWindowHeight,\n showSmallWindow,\n} = inject(ToggleWindowContextKey);\nconst classname = computed(() => classNames([\n `${PREFIX}-toggle-window-item`,\n `${PREFIX}-toggle-window-item--${bigWindow.value === props.value ? 'big' : 'small'}`,\n {\n pc: IS_PC,\n mobile: !IS_PC,\n },\n]));\n\nconst windowItemStyle = computed(() => {\n let style: any = {};\n if (bigWindow.value !== props.value) {\n style = { width: smallWindowWidth.value, height: smallWindowHeight.value };\n \n if (!showSmallWindow.value) {\n style.visibility = 'hidden';\n } else {\n style.visibility = '';\n }\n }\n\n return style;\n});\n</script>\n\n<style lang=\"scss\">\n@import './style/ToggleWindowItem.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/base/ToggleWindow/ToggleWindowItem/ToggleWindowItem.vue'\nwx.createComponent(Component)"],"names":["inject","ToggleWindowContextKey","computed","classNames","PREFIX","IS_PC","Component"],"mappings":";;;;;;AAAO,MAAM,wBAAwB;AAAA,EACnC,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AACF;ACOA,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUA,UAAM,QAAQ;AAER,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,IACEA,cAAAA,OAAOC,gEAAAA,sBAAsB;AAC3B,UAAA,YAAYC,uBAAS,MAAMC,qEAAW;AAAA,MAC1C,GAAGC,0DAAM,MAAA;AAAA,MACT,GAAGA,0DAAAA,MAAM,wBAAwB,UAAU,UAAU,MAAM,QAAQ,QAAQ,OAAO;AAAA,MAClF;AAAA,QACE,IAAIC,wDAAA;AAAA,QACJ,QAAQ,CAACA,wDAAA;AAAA,MACX;AAAA,IACD,CAAA,CAAC;AAEI,UAAA,kBAAkBH,cAAAA,SAAS,MAAM;AACrC,UAAI,QAAa,CAAA;AACb,UAAA,UAAU,UAAU,MAAM,OAAO;AACnC,gBAAQ,EAAE,OAAO,iBAAiB,OAAO,QAAQ,kBAAkB;AAE/D,YAAA,CAAC,gBAAgB,OAAO;AAC1B,gBAAM,aAAa;AAAA,QAAA,OACd;AACL,gBAAM,aAAa;AAAA,QACrB;AAAA,MACF;AAEO,aAAA;AAAA,IAAA,CACR;;;;;;;;;;ACvDD,GAAG,gBAAgBI,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"AudioStream.js","sources":["TUICallKit/src/Components/components/common/AudioStream/AudioStream.ts","TUICallKit/src/Components/components/common/AudioStream/AudioStream.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0F1ZGlvU3RyZWFtL0F1ZGlvU3RyZWFtLnZ1ZQ"],"sourcesContent":["export const AudioStreamProps = {\n avatar: {\n type: String,\n },\n username: {\n type: String,\n },\n isVideoAvailable: {\n type: Boolean,\n },\n showStreamInfo: {\n type: Boolean,\n },\n isSmallWindow: {\n type: Boolean,\n default: false,\n },\n isMuted: {\n type: Boolean,\n default: true,\n },\n volume: {\n type: Number,\n default: 0,\n },\n userId: {\n type: String,\n },\n};\n","<template>\n <OverlayStream\n :avatar=\"avatar\"\n :bg-image=\"bgImage\"\n :show-avatar=\"showAvatar\"\n :username=\"username\"\n :show-user-name=\"showUserName\"\n :show-mask=\"!isGroupCall && showViewMask\"\n :fit=\"fit\"\n :blur=\"!isGroupCall\"\n :show-mic-volume=\"showMicVolume\"\n :show-tip=\"!isGroupCall && !isFloatWindow\"\n :custom-style=\"audioStreamStyle\"\n :is-small-window=\"isSmallWindow\"\n :is-muted=\"isMuted\"\n :volume=\"volume\"\n bg-color=\"rgba(0, 0, 0, 0.5)\"\n @error=\"handleError\"\n />\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script setup lang=\"ts\">\nimport { toRefs, computed, ref, watch } from '../../../../adapter-vue';\nimport { CallMediaType, TUIGlobal } from '../../../../TUICallService';\nimport OverlayStream from '../OverlayStream/OverlayStream.vue';\nimport { useCallInfoContext, useFloatWindowContext, useViewBackgroundConfig } from '../../../hooks';\nimport { AudioStreamProps } from './AudioStream';\n\nconst props = defineProps(AudioStreamProps);\nconst viewBackgroundConfigObj = useViewBackgroundConfig();\nconst { callType, isGroupCall } = toRefs(useCallInfoContext());\nconst { isFloatWindow } = toRefs(useFloatWindowContext());\nconst showAvatar = computed(() => !isGroupCall.value && !TUIGlobal.isPC);\nconst showUserName = computed(() => isGroupCall.value ? TUIGlobal.isPC : callType.value === CallMediaType.AUDIO);\nconst showMicVolume = computed(() => !isGroupCall.value && TUIGlobal.isPC && callType.value === CallMediaType.AUDIO);\nconst audioStreamStyle = computed(() => ({ zIndex: 1 }));\nconst bgImage = computed(() => viewBackgroundConfigObj.value[props.userId] || props.avatar);\nconst showViewMask = ref<boolean>(!viewBackgroundConfigObj.value[props.userId]);\nconst fit = ref<string>(viewBackgroundConfigObj.value[props.userId] ? 'fill' : 'cover');\n\nwatch([() => props.userId, viewBackgroundConfigObj], () => {\n if (viewBackgroundConfigObj.value[props.userId]) {\n fit.value = 'fill';\n showViewMask.value = false;\n } else {\n fit.value = 'cover';\n showViewMask.value = true;\n }\n}, {\n immediate: true,\n})\n\nconst handleError = () => {\n showViewMask.value = true;\n fit.value = 'cover';\n};\n</script>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/AudioStream/AudioStream.vue'\nwx.createComponent(Component)"],"names":["useViewBackgroundConfig","toRefs","useCallInfoContext","useFloatWindowContext","computed","TUIGlobal","CallMediaType","ref","watch","Component"],"mappings":";;;;;;;;;;AAAO,MAAM,mBAAmB;AAAA,EAC9B,QAAQ;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,EACR;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,EACR;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,EACR;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,EACR;AACF;;;;ACIA,MAAA,gBAA0B,MAAA;AAV1B,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUA,UAAM,QAAQ;AACd,UAAM,0BAA0BA,wDAAAA;AAChC,UAAM,EAAE,UAAU,YAAA,IAAgBC,cAAAA,OAAOC,mDAAAA,mBAAoB,CAAA;AAC7D,UAAM,EAAE,cAAkB,IAAAD,qBAAOE,sDAAAA,sBAAuB,CAAA;AAClD,UAAA,aAAaC,uBAAS,MAAM,CAAC,YAAY,SAAS,CAACC,gDAAAA,UAAU,IAAI;AACjE,UAAA,eAAeD,cAAAA,SAAS,MAAM,YAAY,QAAQC,gDAAAA,UAAU,OAAO,SAAS,UAAUC,yCAAA,cAAc,KAAK;AACzG,UAAA,gBAAgBF,cAAAA,SAAS,MAAM,CAAC,YAAY,SAASC,0DAAU,QAAQ,SAAS,UAAUC,yCAAA,cAAc,KAAK;AACnH,UAAM,mBAAmBF,cAAAA,SAAS,OAAO,EAAE,QAAQ,EAAI,EAAA;AACjD,UAAA,UAAUA,uBAAS,MAAM,wBAAwB,MAAM,MAAM,MAAM,KAAK,MAAM,MAAM;AAC1F,UAAM,eAAeG,cAAAA,IAAa,CAAC,wBAAwB,MAAM,MAAM,MAAM,CAAC;AACxE,UAAA,MAAMA,kBAAY,wBAAwB,MAAM,MAAM,MAAM,IAAI,SAAS,OAAO;AAEtFC,kBAAAA,MAAM,CAAC,MAAM,MAAM,QAAQ,uBAAuB,GAAG,MAAM;AACzD,UAAI,wBAAwB,MAAM,MAAM,MAAM,GAAG;AAC/C,YAAI,QAAQ;AACZ,qBAAa,QAAQ;AAAA,MAAA,OAChB;AACL,YAAI,QAAQ;AACZ,qBAAa,QAAQ;AAAA,MACvB;AAAA,IAAA,GACC;AAAA,MACD,WAAW;AAAA,IAAA,CACZ;AAED,UAAM,cAAc,MAAM;AACxB,mBAAa,QAAQ;AACrB,UAAI,QAAQ;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;AC7Dd,GAAG,gBAAgBC,SAAS;"}
{"version":3,"file":"AudioStream.js","sources":["TUICallKit/src/Components/components/common/AudioStream/AudioStream.ts","TUICallKit/src/Components/components/common/AudioStream/AudioStream.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0F1ZGlvU3RyZWFtL0F1ZGlvU3RyZWFtLnZ1ZQ"],"sourcesContent":["export const AudioStreamProps = {\n avatar: {\n type: String,\n },\n username: {\n type: String,\n },\n isVideoAvailable: {\n type: Boolean,\n },\n showStreamInfo: {\n type: Boolean,\n },\n isSmallWindow: {\n type: Boolean,\n default: false,\n },\n isMuted: {\n type: Boolean,\n default: true,\n },\n volume: {\n type: Number,\n default: 0,\n },\n userId: {\n type: String,\n },\n};\n","<template>\n <OverlayStream\n :avatar=\"avatar\"\n :bg-image=\"bgImage\"\n :show-avatar=\"showAvatar\"\n :username=\"username\"\n :show-user-name=\"showUserName\"\n :show-mask=\"!isGroupCall && showViewMask\"\n :fit=\"fit\"\n :blur=\"!isGroupCall\"\n :show-mic-volume=\"showMicVolume\"\n :show-tip=\"!isGroupCall && !isFloatWindow\"\n :custom-style=\"audioStreamStyle\"\n :is-small-window=\"isSmallWindow\"\n :is-muted=\"isMuted\"\n :volume=\"volume\"\n bg-color=\"rgba(0, 0, 0, 0.5)\"\n @error=\"handleError\"\n />\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script setup lang=\"ts\">\nimport { toRefs, computed, ref, watch } from '../../../../adapter-vue';\nimport { CallMediaType, TUIGlobal } from '../../../../TUICallService';\nimport OverlayStream from '../OverlayStream/OverlayStream.vue';\nimport { useCallInfoContext, useFloatWindowContext, useViewBackgroundConfig } from '../../../hooks';\nimport { AudioStreamProps } from './AudioStream';\n\nconst props = defineProps(AudioStreamProps);\nconst viewBackgroundConfigObj = useViewBackgroundConfig();\nconst { callType, isGroupCall } = toRefs(useCallInfoContext());\nconst { isFloatWindow } = toRefs(useFloatWindowContext());\nconst showAvatar = computed(() => !isGroupCall.value && !TUIGlobal.isPC);\nconst showUserName = computed(() => isGroupCall.value ? TUIGlobal.isPC : callType.value === CallMediaType.AUDIO);\nconst showMicVolume = computed(() => !isGroupCall.value && TUIGlobal.isPC && callType.value === CallMediaType.AUDIO);\nconst audioStreamStyle = computed(() => ({ zIndex: 1 }));\nconst bgImage = computed(() => viewBackgroundConfigObj.value[props.userId] || props.avatar);\nconst showViewMask = ref<boolean>(!viewBackgroundConfigObj.value[props.userId]);\nconst fit = ref<string>(viewBackgroundConfigObj.value[props.userId] ? 'fill' : 'cover');\n\nwatch([() => props.userId, viewBackgroundConfigObj], () => {\n if (viewBackgroundConfigObj.value[props.userId]) {\n fit.value = 'fill';\n showViewMask.value = false;\n } else {\n fit.value = 'cover';\n showViewMask.value = true;\n }\n}, {\n immediate: true,\n})\n\nconst handleError = () => {\n showViewMask.value = true;\n fit.value = 'cover';\n};\n</script>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/AudioStream/AudioStream.vue'\nwx.createComponent(Component)"],"names":["useViewBackgroundConfig","toRefs","useCallInfoContext","useFloatWindowContext","computed","TUIGlobal","CallMediaType","ref","watch","Component"],"mappings":";;;;;;;;;;AAAO,MAAM,mBAAmB;AAAA,EAC9B,QAAQ;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,EACR;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,EACR;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,EACR;AAAA,EACA,eAAe;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,QAAQ;AAAA,IACN,MAAM;AAAA,EACR;AACF;;;;ACIA,MAAA,gBAA0B,MAAA;AAV1B,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUA,UAAM,QAAQ;AACd,UAAM,0BAA0BA,wDAAAA;AAChC,UAAM,EAAE,UAAU,YAAA,IAAgBC,cAAAA,OAAOC,mDAAAA,mBAAoB,CAAA;AAC7D,UAAM,EAAE,cAAkB,IAAAD,qBAAOE,sDAAAA,sBAAuB,CAAA;AAClD,UAAA,aAAaC,uBAAS,MAAM,CAAC,YAAY,SAAS,CAACC,gDAAAA,UAAU,IAAI;AACjE,UAAA,eAAeD,cAAAA,SAAS,MAAM,YAAY,QAAQC,gDAAAA,UAAU,OAAO,SAAS,UAAUC,yCAAA,cAAc,KAAK;AACzG,UAAA,gBAAgBF,cAAAA,SAAS,MAAM,CAAC,YAAY,SAASC,0DAAU,QAAQ,SAAS,UAAUC,yCAAA,cAAc,KAAK;AACnH,UAAM,mBAAmBF,cAAAA,SAAS,OAAO,EAAE,QAAQ,EAAI,EAAA;AACjD,UAAA,UAAUA,uBAAS,MAAM,wBAAwB,MAAM,MAAM,MAAM,KAAK,MAAM,MAAM;AAC1F,UAAM,eAAeG,cAAAA,IAAa,CAAC,wBAAwB,MAAM,MAAM,MAAM,CAAC;AACxE,UAAA,MAAMA,kBAAY,wBAAwB,MAAM,MAAM,MAAM,IAAI,SAAS,OAAO;AAEtFC,kBAAAA,MAAM,CAAC,MAAM,MAAM,QAAQ,uBAAuB,GAAG,MAAM;AACzD,UAAI,wBAAwB,MAAM,MAAM,MAAM,GAAG;AAC/C,YAAI,QAAQ;AACZ,qBAAa,QAAQ;AAAA,MAAA,OAChB;AACL,YAAI,QAAQ;AACZ,qBAAa,QAAQ;AAAA,MACvB;AAAA,IAAA,GACC;AAAA,MACD,WAAW;AAAA,IAAA,CACZ;AAED,UAAM,cAAc,MAAM;AACxB,mBAAa,QAAQ;AACrB,UAAI,QAAQ;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;AC7Dd,GAAG,gBAAgBC,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Accept.js","sources":["TUICallKit/src/Components/components/common/Button/Accept.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9BY2NlcHQudnVl"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"props.iconSize || config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :shape=\"config.shape\"\n :loading=\"!clickAble\"\n :loadingWidth=\"config.loadingWidth\"\n :loadingHeight=\"config.loadingHeight\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText \n v-if=\"config.showText\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ t('accept') }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { ref, computed } from '../../../../adapter-vue';\nimport { TUICallKitAPI } from '../../../../TUICallService/index';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { ButtonProps } from './props/Button';\nimport { useBtnConfig } from './hooks/useConfig';\nimport { useTranslate } from '../../../hooks';\n\nconst clickAble = ref(true);\nconst props = defineProps(ButtonProps);\nconst configState = computed(() => {\n if (!clickAble.value) {\n return 'loadingConfig';\n }\n\n return 'basicConfig';\n});\nconst config = useBtnConfig('accept', configState);\nconst t = useTranslate();\n\nconst handleClick = async () => {\n clickAble.value = false;\n await TUICallKitAPI.accept();\n clickAble.value = true;\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/Accept.vue'\nwx.createComponent(Component)"],"names":["ref","computed","useBtnConfig","useTranslate","TUICallKitAPI"],"mappings":";;;;;;;;;;AAqCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAXnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAYM,UAAA,YAAYA,kBAAI,IAAI;AAC1B,UAAM,QAAQ;AACR,UAAA,cAAcC,cAAAA,SAAS,MAAM;AAC7B,UAAA,CAAC,UAAU,OAAO;AACb,eAAA;AAAA,MACT;AAEO,aAAA;AAAA,IAAA,CACR;AACK,UAAA,SAASC,mEAAAA,aAAa,UAAU,WAAW;AACjD,UAAM,IAAIC,6CAAAA;AAEV,UAAM,cAAc,YAAY;AAC9B,gBAAU,QAAQ;AAClB,YAAMC,oCAAAA,cAAc;AACpB,gBAAU,QAAQ;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzDpB,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"Accept.js","sources":["TUICallKit/src/Components/components/common/Button/Accept.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9BY2NlcHQudnVl"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"props.iconSize || config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :shape=\"config.shape\"\n :loading=\"!clickAble\"\n :loadingWidth=\"config.loadingWidth\"\n :loadingHeight=\"config.loadingHeight\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText \n v-if=\"config.showText\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ t('accept') }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { ref, computed } from '../../../../adapter-vue';\nimport { TUICallKitAPI } from '../../../../TUICallService/index';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { ButtonProps } from './props/Button';\nimport { useBtnConfig } from './hooks/useConfig';\nimport { useTranslate } from '../../../hooks';\n\nconst clickAble = ref(true);\nconst props = defineProps(ButtonProps);\nconst configState = computed(() => {\n if (!clickAble.value) {\n return 'loadingConfig';\n }\n\n return 'basicConfig';\n});\nconst config = useBtnConfig('accept', configState);\nconst t = useTranslate();\n\nconst handleClick = async () => {\n clickAble.value = false;\n await TUICallKitAPI.accept();\n clickAble.value = true;\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/Accept.vue'\nwx.createComponent(Component)"],"names":["ref","computed","useBtnConfig","useTranslate","TUICallKitAPI"],"mappings":";;;;;;;;;;AAqCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAXnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAYM,UAAA,YAAYA,kBAAI,IAAI;AAC1B,UAAM,QAAQ;AACR,UAAA,cAAcC,cAAAA,SAAS,MAAM;AAC7B,UAAA,CAAC,UAAU,OAAO;AACb,eAAA;AAAA,MACT;AAEO,aAAA;AAAA,IAAA,CACR;AACK,UAAA,SAASC,mEAAAA,aAAa,UAAU,WAAW;AACjD,UAAM,IAAIC,6CAAAA;AAEV,UAAM,cAAc,YAAY;AAC9B,gBAAU,QAAQ;AAClB,YAAMC,oCAAAA,cAAc;AACpB,gBAAU,QAAQ;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzDpB,GAAG,gBAAgB,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Camera.js","sources":["TUICallKit/src/Components/components/common/Button/Camera.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9DYW1lcmEudnVl"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n v-if='!isPC'\n :loading=\"!clickAble\"\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"props.iconSize || config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :loadingWidth=\"config.loadingWidth\"\n :loadingHeight=\"config.loadingHeight\"\n shape=\"circle\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText\n v-if=\"config.showText\" \n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ btnText }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { computed, toRefs, ref } from '../../../../adapter-vue';\nimport { TUICallKitAPI, TUIGlobal } from '../../../../TUICallService/index';\nimport { DeviceType } from '../../../../TUICallService/const';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { useUserInfoExcludeVolumeContext, usePopover } from '../../../hooks';\nimport { ButtonProps } from './props/Button';\nimport { useBtnConfig } from './hooks/useConfig'\nimport { useTranslate } from '../../../hooks/useTranslate';\n\nconst t = useTranslate();\nconst props = defineProps(ButtonProps);\nconst clickAble = ref(true);\nconst isPC = TUIGlobal.isPC;\nconst { localUserInfoExcludeVolume : localUserInfo } = toRefs(useUserInfoExcludeVolumeContext());\nconst targetVideoAvailable = ref(localUserInfo?.value.isVideoAvailable);\nconst isVideoAvailable = computed(() => localUserInfo?.value.isVideoAvailable);\nconst popoverValue = usePopover();\nconst configState = computed(() => {\n if (!clickAble.value) {\n return 'loadingConfig';\n }\n\n return isVideoAvailable.value ? 'basicConfig' : 'closedConfig';\n});\nconst btnText = computed(() => (localUserInfo?.value.isVideoAvailable ? t.value('camera enabled') : t.value('camera disabled')));\nconst config = useBtnConfig('camera', configState);\n\nconst handleClick = async () => {\n clickAble.value = false;\n targetVideoAvailable.value = !isVideoAvailable.value;\n if (isVideoAvailable.value) {\n await TUICallKitAPI.closeCamera();\n } else {\n await TUICallKitAPI.openCamera('localVideo');\n }\n clickAble.value = true;\n};\nconst handleMouseEnter = () => {\n popoverValue.value = 'camera';\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/Camera.vue'\nwx.createComponent(Component)"],"names":["useTranslate","ref","TUIGlobal","toRefs","useUserInfoExcludeVolumeContext","computed","usePopover","useBtnConfig","TUICallKitAPI"],"mappings":";;;;;;;;;;;;;AAuCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAZnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAcA,UAAM,IAAIA,6CAAAA;AACV,UAAM,QAAQ;AACR,UAAA,YAAYC,kBAAI,IAAI;AAC1B,UAAM,OAAOC,gDAAU,UAAA;AACvB,UAAM,EAAE,4BAA6B,cAAA,IAAkBC,cAAAA,OAAOC,gEAAAA,gCAAiC,CAAA;AAC/F,UAAM,uBAAuBH,cAAA,IAAI,+CAAe,MAAM,gBAAgB;AACtE,UAAM,mBAAmBI,cAAAA,SAAS,MAAM,+CAAe,MAAM,gBAAgB;AACxDC,0DAAW;AAC1B,UAAA,cAAcD,cAAAA,SAAS,MAAM;AAC7B,UAAA,CAAC,UAAU,OAAO;AACb,eAAA;AAAA,MACT;AAEO,aAAA,iBAAiB,QAAQ,gBAAgB;AAAA,IAAA,CACjD;AACD,UAAM,UAAUA,cAAA,SAAS,OAAO,+CAAe,MAAM,oBAAmB,EAAE,MAAM,gBAAgB,IAAI,EAAE,MAAM,iBAAiB,CAAE;AACzH,UAAA,SAASE,mEAAAA,aAAa,UAAU,WAAW;AAEjD,UAAM,cAAc,YAAY;AAC9B,gBAAU,QAAQ;AACG,2BAAA,QAAQ,CAAC,iBAAiB;AAC/C,UAAI,iBAAiB,OAAO;AAC1B,cAAMC,oCAAAA,cAAc;MAAY,OAC3B;AACC,cAAAA,oCAAA,cAAc,WAAW,YAAY;AAAA,MAC7C;AACA,gBAAU,QAAQ;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvEpB,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"Camera.js","sources":["TUICallKit/src/Components/components/common/Button/Camera.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9DYW1lcmEudnVl"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n v-if='!isPC'\n :loading=\"!clickAble\"\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"props.iconSize || config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :loadingWidth=\"config.loadingWidth\"\n :loadingHeight=\"config.loadingHeight\"\n shape=\"circle\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText\n v-if=\"config.showText\" \n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ btnText }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { computed, toRefs, ref } from '../../../../adapter-vue';\nimport { TUICallKitAPI, TUIGlobal } from '../../../../TUICallService/index';\nimport { DeviceType } from '../../../../TUICallService/const';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { useUserInfoExcludeVolumeContext, usePopover } from '../../../hooks';\nimport { ButtonProps } from './props/Button';\nimport { useBtnConfig } from './hooks/useConfig'\nimport { useTranslate } from '../../../hooks/useTranslate';\n\nconst t = useTranslate();\nconst props = defineProps(ButtonProps);\nconst clickAble = ref(true);\nconst isPC = TUIGlobal.isPC;\nconst { localUserInfoExcludeVolume : localUserInfo } = toRefs(useUserInfoExcludeVolumeContext());\nconst targetVideoAvailable = ref(localUserInfo?.value.isVideoAvailable);\nconst isVideoAvailable = computed(() => localUserInfo?.value.isVideoAvailable);\nconst popoverValue = usePopover();\nconst configState = computed(() => {\n if (!clickAble.value) {\n return 'loadingConfig';\n }\n\n return isVideoAvailable.value ? 'basicConfig' : 'closedConfig';\n});\nconst btnText = computed(() => (localUserInfo?.value.isVideoAvailable ? t.value('camera enabled') : t.value('camera disabled')));\nconst config = useBtnConfig('camera', configState);\n\nconst handleClick = async () => {\n clickAble.value = false;\n targetVideoAvailable.value = !isVideoAvailable.value;\n if (isVideoAvailable.value) {\n await TUICallKitAPI.closeCamera();\n } else {\n await TUICallKitAPI.openCamera('localVideo');\n }\n clickAble.value = true;\n};\nconst handleMouseEnter = () => {\n popoverValue.value = 'camera';\n}\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/Camera.vue'\nwx.createComponent(Component)"],"names":["useTranslate","ref","TUIGlobal","toRefs","useUserInfoExcludeVolumeContext","computed","usePopover","useBtnConfig","TUICallKitAPI"],"mappings":";;;;;;;;;;;;;AAuCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAZnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAcA,UAAM,IAAIA,6CAAAA;AACV,UAAM,QAAQ;AACR,UAAA,YAAYC,kBAAI,IAAI;AAC1B,UAAM,OAAOC,gDAAU,UAAA;AACvB,UAAM,EAAE,4BAA6B,cAAA,IAAkBC,cAAAA,OAAOC,gEAAAA,gCAAiC,CAAA;AAC/F,UAAM,uBAAuBH,cAAA,IAAI,+CAAe,MAAM,gBAAgB;AACtE,UAAM,mBAAmBI,cAAAA,SAAS,MAAM,+CAAe,MAAM,gBAAgB;AACxDC,0DAAW;AAC1B,UAAA,cAAcD,cAAAA,SAAS,MAAM;AAC7B,UAAA,CAAC,UAAU,OAAO;AACb,eAAA;AAAA,MACT;AAEO,aAAA,iBAAiB,QAAQ,gBAAgB;AAAA,IAAA,CACjD;AACD,UAAM,UAAUA,cAAA,SAAS,OAAO,+CAAe,MAAM,oBAAmB,EAAE,MAAM,gBAAgB,IAAI,EAAE,MAAM,iBAAiB,CAAE;AACzH,UAAA,SAASE,mEAAAA,aAAa,UAAU,WAAW;AAEjD,UAAM,cAAc,YAAY;AAC9B,gBAAU,QAAQ;AACG,2BAAA,QAAQ,CAAC,iBAAiB;AAC/C,UAAI,iBAAiB,OAAO;AAC1B,cAAMC,oCAAAA,cAAc;MAAY,OAC3B;AACC,cAAAA,oCAAA,cAAc,WAAW,YAAY;AAAA,MAC7C;AACA,gBAAU,QAAQ;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACvEpB,GAAG,gBAAgB,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Hangup.js","sources":["TUICallKit/src/Components/components/common/Button/Hangup.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9IYW5ndXAudnVl"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :loading=\"!isClickable\"\n :loadingWidth=\"config.loadingWidth\"\n :loadingHeight=\"config.loadingHeight\"\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"props.iconSize || config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :shape=\"config.shape\"\n @click=\"handleClick\"\n />\n <TKText\n v-if=\"config.showText\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ t('hangup') }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { computed } from '../../../../adapter-vue';\nimport { TUICallKitAPI } from '../../../../TUICallService/index';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { ButtonProps } from './props/Button';\nimport { useBtnConfig } from './hooks/useConfig'\nimport { useIsClickableContext, useTranslate } from '../../../hooks';\n\nconst props = defineProps(ButtonProps);\nconst isClickable = useIsClickableContext();\n\nconst hangupState = computed(() => isClickable.value ? 'basicConfig' : 'loadingConfig');\nconst config = useBtnConfig('hangup', hangupState);\nconst t = useTranslate();\n\nconst handleClick = async () => {\n await TUICallKitAPI.hangup();\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/Hangup.vue'\nwx.createComponent(Component)"],"names":["useIsClickableContext","computed","useBtnConfig","useTranslate","TUICallKitAPI"],"mappings":";;;;;;;;;;;AAoCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAXnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAYA,UAAM,QAAQ;AACd,UAAM,cAAcA,sDAAAA;AAEpB,UAAM,cAAcC,cAAAA,SAAS,MAAM,YAAY,QAAQ,gBAAgB,eAAe;AAChF,UAAA,SAASC,mEAAAA,aAAa,UAAU,WAAW;AACjD,UAAM,IAAIC,6CAAAA;AAEV,UAAM,cAAc,YAAY;AAC9B,YAAMC,oCAAAA,cAAc;IAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjD7B,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"Hangup.js","sources":["TUICallKit/src/Components/components/common/Button/Hangup.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9IYW5ndXAudnVl"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :loading=\"!isClickable\"\n :loadingWidth=\"config.loadingWidth\"\n :loadingHeight=\"config.loadingHeight\"\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"props.iconSize || config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :shape=\"config.shape\"\n @click=\"handleClick\"\n />\n <TKText\n v-if=\"config.showText\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ t('hangup') }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { computed } from '../../../../adapter-vue';\nimport { TUICallKitAPI } from '../../../../TUICallService/index';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { ButtonProps } from './props/Button';\nimport { useBtnConfig } from './hooks/useConfig'\nimport { useIsClickableContext, useTranslate } from '../../../hooks';\n\nconst props = defineProps(ButtonProps);\nconst isClickable = useIsClickableContext();\n\nconst hangupState = computed(() => isClickable.value ? 'basicConfig' : 'loadingConfig');\nconst config = useBtnConfig('hangup', hangupState);\nconst t = useTranslate();\n\nconst handleClick = async () => {\n await TUICallKitAPI.hangup();\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/Hangup.vue'\nwx.createComponent(Component)"],"names":["useIsClickableContext","computed","useBtnConfig","useTranslate","TUICallKitAPI"],"mappings":";;;;;;;;;;;AAoCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAXnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAYA,UAAM,QAAQ;AACd,UAAM,cAAcA,sDAAAA;AAEpB,UAAM,cAAcC,cAAAA,SAAS,MAAM,YAAY,QAAQ,gBAAgB,eAAe;AAChF,UAAA,SAASC,mEAAAA,aAAa,UAAU,WAAW;AACjD,UAAM,IAAIC,6CAAAA;AAEV,UAAM,cAAc,YAAY;AAC9B,YAAMC,oCAAAA,cAAc;IAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjD7B,GAAG,gBAAgB,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"InviteUser.js","sources":["TUICallKit/src/Components/components/common/Button/InviteUser.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9JbnZpdGVVc2VyLnZ1ZQ"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :shape=\"config.shape\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText\n v-if=\"showText\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ t('invite member') }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { ref, watch } from '../../../../adapter-vue';\nimport { TUIStore, StoreName, NAME } from '../../../../TUICallService/index';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { ButtonProps } from './props/Button';\nimport { useBtnConfig } from './hooks/useConfig'\nimport { useTranslate } from '../../../hooks';\n\nconst props = defineProps(ButtonProps);\nconst config = useBtnConfig('inviteUser', ref('basicConfig'));\nconst t = useTranslate();\n\nconst handleClick = async () => {\n TUIStore.update(StoreName.CALL, NAME.SHOW_SELECT_USER, true);\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/InviteUser.vue'\nwx.createComponent(Component)"],"names":["useBtnConfig","ref","useTranslate","TUIStore","StoreName","NAME"],"mappings":";;;;;;;;;;;;;AAkCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAXnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAYA,UAAM,QAAQ;AACd,UAAM,SAASA,mEAAAA,aAAa,cAAcC,cAAAA,IAAI,aAAa,CAAC;AAC5D,UAAM,IAAIC,6CAAAA;AAEV,UAAM,cAAc,YAAY;AAC9BC,sDAAA,SAAS,OAAOC,mDAAU,MAAMC,0CAAAA,KAAK,kBAAkB,IAAI;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;AC5C7D,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"InviteUser.js","sources":["TUICallKit/src/Components/components/common/Button/InviteUser.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9JbnZpdGVVc2VyLnZ1ZQ"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :shape=\"config.shape\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText\n v-if=\"showText\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ t('invite member') }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { ref, watch } from '../../../../adapter-vue';\nimport { TUIStore, StoreName, NAME } from '../../../../TUICallService/index';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { ButtonProps } from './props/Button';\nimport { useBtnConfig } from './hooks/useConfig'\nimport { useTranslate } from '../../../hooks';\n\nconst props = defineProps(ButtonProps);\nconst config = useBtnConfig('inviteUser', ref('basicConfig'));\nconst t = useTranslate();\n\nconst handleClick = async () => {\n TUIStore.update(StoreName.CALL, NAME.SHOW_SELECT_USER, true);\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/InviteUser.vue'\nwx.createComponent(Component)"],"names":["useBtnConfig","ref","useTranslate","TUIStore","StoreName","NAME"],"mappings":";;;;;;;;;;;;;AAkCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAXnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAYA,UAAM,QAAQ;AACd,UAAM,SAASA,mEAAAA,aAAa,cAAcC,cAAAA,IAAI,aAAa,CAAC;AAC5D,UAAM,IAAIC,6CAAAA;AAEV,UAAM,cAAc,YAAY;AAC9BC,sDAAA,SAAS,OAAOC,mDAAU,MAAMC,0CAAAA,KAAK,kBAAkB,IAAI;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;AC5C7D,GAAG,gBAAgB,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Microphone.js","sources":["TUICallKit/src/Components/components/common/Button/Microphone.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9NaWNyb3Bob25lLnZ1ZQ"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n v-if=\"!isPC\"\n :loading=\"!clickAble\"\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"config.iconSize\"\n :width=\"config.width\"\n :height=\"config.height\"\n :loadingWidth=\"config.loadingWidth\"\n :loadingHeight=\"config.loadingHeight\"\n :shape=\"config.shape\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText\n v-if=\"config.showText\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ btnText }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { computed, toRefs, ref } from '../../../../adapter-vue';\nimport { TUICallKitAPI, TUIGlobal } from '../../../../TUICallService/index';\nimport { DeviceType } from '../../../../TUICallService/const';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { useUserInfoExcludeVolumeContext, usePopover } from '../../../hooks';\nimport { ButtonProps } from './props/Button';\nimport { useBtnConfig } from './hooks/useConfig'\nimport { useTranslate } from '../../../hooks';\n\ndefineProps(ButtonProps);\nconst isPC = TUIGlobal.isPC;\nconst clickAble = ref(true);\nconst { localUserInfoExcludeVolume : localUserInfo } = toRefs(useUserInfoExcludeVolumeContext());\nconst popoverValue = usePopover();\nconst configState = computed(() => {\n if (!clickAble.value) {\n return 'loadingConfig';\n }\n\n return localUserInfo?.value.isAudioAvailable ? 'basicConfig' : 'closedConfig';\n});\nconst config = useBtnConfig('microphone', configState);\nconst t = useTranslate();\nconst btnText = computed(() => (localUserInfo?.value.isAudioAvailable ? t.value('microphone enabled') : t.value('microphone disabled')));\nconst handleClick = async () => {\n if (localUserInfo?.value.isAudioAvailable) {\n await TUICallKitAPI.closeMicrophone();\n } else {\n await TUICallKitAPI.openMicrophone();\n }\n};\nconst handleMouseEnter = () => {\n popoverValue.value = 'microphone';\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/Microphone.vue'\nwx.createComponent(Component)"],"names":["TUIGlobal","ref","toRefs","useUserInfoExcludeVolumeContext","usePopover","computed","useBtnConfig","useTranslate","TUICallKitAPI"],"mappings":";;;;;;;;;;;;;AAuCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAZnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAeA,UAAM,OAAOA,gDAAU,UAAA;AACjB,UAAA,YAAYC,kBAAI,IAAI;AAC1B,UAAM,EAAE,4BAA6B,cAAA,IAAkBC,cAAAA,OAAOC,gEAAAA,gCAAiC,CAAA;AAC1EC,0DAAW;AAC1B,UAAA,cAAcC,cAAAA,SAAS,MAAM;AAC7B,UAAA,CAAC,UAAU,OAAO;AACb,eAAA;AAAA,MACT;AAEO,cAAA,+CAAe,MAAM,oBAAmB,gBAAgB;AAAA,IAAA,CAChE;AACK,UAAA,SAASC,mEAAAA,aAAa,cAAc,WAAW;AACrD,UAAM,IAAIC,6CAAAA;AACV,UAAM,UAAUF,cAAA,SAAS,OAAO,+CAAe,MAAM,oBAAmB,EAAE,MAAM,oBAAoB,IAAI,EAAE,MAAM,qBAAqB,CAAE;AACvI,UAAM,cAAc,YAAY;AAC1B,UAAA,+CAAe,MAAM,kBAAkB;AACzC,cAAMG,oCAAAA,cAAc;MAAgB,OAC/B;AACL,cAAMA,oCAAAA,cAAc;MACtB;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjEF,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"Microphone.js","sources":["TUICallKit/src/Components/components/common/Button/Microphone.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9NaWNyb3Bob25lLnZ1ZQ"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n v-if=\"!isPC\"\n :loading=\"!clickAble\"\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"config.iconSize\"\n :width=\"config.width\"\n :height=\"config.height\"\n :loadingWidth=\"config.loadingWidth\"\n :loadingHeight=\"config.loadingHeight\"\n :shape=\"config.shape\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText\n v-if=\"config.showText\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ btnText }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { computed, toRefs, ref } from '../../../../adapter-vue';\nimport { TUICallKitAPI, TUIGlobal } from '../../../../TUICallService/index';\nimport { DeviceType } from '../../../../TUICallService/const';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { useUserInfoExcludeVolumeContext, usePopover } from '../../../hooks';\nimport { ButtonProps } from './props/Button';\nimport { useBtnConfig } from './hooks/useConfig'\nimport { useTranslate } from '../../../hooks';\n\ndefineProps(ButtonProps);\nconst isPC = TUIGlobal.isPC;\nconst clickAble = ref(true);\nconst { localUserInfoExcludeVolume : localUserInfo } = toRefs(useUserInfoExcludeVolumeContext());\nconst popoverValue = usePopover();\nconst configState = computed(() => {\n if (!clickAble.value) {\n return 'loadingConfig';\n }\n\n return localUserInfo?.value.isAudioAvailable ? 'basicConfig' : 'closedConfig';\n});\nconst config = useBtnConfig('microphone', configState);\nconst t = useTranslate();\nconst btnText = computed(() => (localUserInfo?.value.isAudioAvailable ? t.value('microphone enabled') : t.value('microphone disabled')));\nconst handleClick = async () => {\n if (localUserInfo?.value.isAudioAvailable) {\n await TUICallKitAPI.closeMicrophone();\n } else {\n await TUICallKitAPI.openMicrophone();\n }\n};\nconst handleMouseEnter = () => {\n popoverValue.value = 'microphone';\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/Microphone.vue'\nwx.createComponent(Component)"],"names":["TUIGlobal","ref","toRefs","useUserInfoExcludeVolumeContext","usePopover","computed","useBtnConfig","useTranslate","TUICallKitAPI"],"mappings":";;;;;;;;;;;;;AAuCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAZnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAeA,UAAM,OAAOA,gDAAU,UAAA;AACjB,UAAA,YAAYC,kBAAI,IAAI;AAC1B,UAAM,EAAE,4BAA6B,cAAA,IAAkBC,cAAAA,OAAOC,gEAAAA,gCAAiC,CAAA;AAC1EC,0DAAW;AAC1B,UAAA,cAAcC,cAAAA,SAAS,MAAM;AAC7B,UAAA,CAAC,UAAU,OAAO;AACb,eAAA;AAAA,MACT;AAEO,cAAA,+CAAe,MAAM,oBAAmB,gBAAgB;AAAA,IAAA,CAChE;AACK,UAAA,SAASC,mEAAAA,aAAa,cAAc,WAAW;AACrD,UAAM,IAAIC,6CAAAA;AACV,UAAM,UAAUF,cAAA,SAAS,OAAO,+CAAe,MAAM,oBAAmB,EAAE,MAAM,oBAAoB,IAAI,EAAE,MAAM,qBAAqB,CAAE;AACvI,UAAM,cAAc,YAAY;AAC1B,UAAA,+CAAe,MAAM,kBAAkB;AACzC,cAAMG,oCAAAA,cAAc;MAAgB,OAC/B;AACL,cAAMA,oCAAAA,cAAc;MACtB;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjEF,GAAG,gBAAgB,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Minimize.js","sources":["TUICallKit/src/Components/components/common/Button/Minimize.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9NaW5pbWl6ZS52dWU"],"sourcesContent":["<template>\n <Button \n :iconSrc=\"config.iconSrc\"\n :iconSize=\"config.iconSize\"\n @click=\"handleClick\"\n >\n </Button>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { ref } from '../../../../adapter-vue';\nimport { TUICallKitAPI } from '../../../../TUICallService/index';\nimport Button from '../../base/Button/Button.vue';\nimport { useBtnConfig } from './hooks/useConfig';\n\nconst config = useBtnConfig('minimize', ref('basicConfig'));\nconst handleClick = async () => {\n await TUICallKitAPI.toggleMinimize();\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/Minimize.vue'\nwx.createComponent(Component)"],"names":["useBtnConfig","ref","TUICallKitAPI"],"mappings":";;;;;;;AAoBA,MAAA,SAAmB,MAAA;AAVnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;AASA,UAAM,SAASA,mEAAAA,aAAa,YAAYC,cAAAA,IAAI,aAAa,CAAC;AAC1D,UAAM,cAAc,YAAY;AAC9B,YAAMC,oCAAAA,cAAc;IAAe;;;;;;;;;;;;;ACxBrC,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"Minimize.js","sources":["TUICallKit/src/Components/components/common/Button/Minimize.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9NaW5pbWl6ZS52dWU"],"sourcesContent":["<template>\n <Button \n :iconSrc=\"config.iconSrc\"\n :iconSize=\"config.iconSize\"\n @click=\"handleClick\"\n >\n </Button>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { ref } from '../../../../adapter-vue';\nimport { TUICallKitAPI } from '../../../../TUICallService/index';\nimport Button from '../../base/Button/Button.vue';\nimport { useBtnConfig } from './hooks/useConfig';\n\nconst config = useBtnConfig('minimize', ref('basicConfig'));\nconst handleClick = async () => {\n await TUICallKitAPI.toggleMinimize();\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/Minimize.vue'\nwx.createComponent(Component)"],"names":["useBtnConfig","ref","TUICallKitAPI"],"mappings":";;;;;;;AAoBA,MAAA,SAAmB,MAAA;AAVnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;AASA,UAAM,SAASA,mEAAAA,aAAa,YAAYC,cAAAA,IAAI,aAAa,CAAC;AAC1D,UAAM,cAAc,YAAY;AAC9B,YAAMC,oCAAAA,cAAc;IAAe;;;;;;;;;;;;;ACxBrC,GAAG,gBAAgB,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Reject.js","sources":["TUICallKit/src/Components/components/common/Button/Reject.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9SZWplY3QudnVl"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :shape=\"config.shape\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText\n v-if=\"config.showText\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ t('reject') }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { ref } from '../../../../adapter-vue';\nimport { TUICallKitAPI } from '../../../../TUICallService/index';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { useBtnConfig } from './hooks/useConfig';\nimport { useTranslate } from '../../../hooks';\nimport { ButtonProps } from './props/Button';\n\nconst props = defineProps(ButtonProps);\nconst config = useBtnConfig('reject', ref('basicConfig'));\nconst t = useTranslate();\n\nconst handleClick = async () => {\n await TUICallKitAPI.reject();\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/Reject.vue'\nwx.createComponent(Component)"],"names":["useBtnConfig","ref","useTranslate","TUICallKitAPI"],"mappings":";;;;;;;;;;AAkCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAXnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAYA,UAAM,QAAQ;AACd,UAAM,SAASA,mEAAAA,aAAa,UAAUC,cAAAA,IAAI,aAAa,CAAC;AACxD,UAAM,IAAIC,6CAAAA;AAEV,UAAM,cAAc,YAAY;AAC9B,YAAMC,oCAAAA,cAAc;IAAO;;;;;;;;;;;;;;;;;;;;;;;;;AC5C7B,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"Reject.js","sources":["TUICallKit/src/Components/components/common/Button/Reject.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9SZWplY3QudnVl"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :shape=\"config.shape\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText\n v-if=\"config.showText\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ t('reject') }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { ref } from '../../../../adapter-vue';\nimport { TUICallKitAPI } from '../../../../TUICallService/index';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { useBtnConfig } from './hooks/useConfig';\nimport { useTranslate } from '../../../hooks';\nimport { ButtonProps } from './props/Button';\n\nconst props = defineProps(ButtonProps);\nconst config = useBtnConfig('reject', ref('basicConfig'));\nconst t = useTranslate();\n\nconst handleClick = async () => {\n await TUICallKitAPI.reject();\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/Reject.vue'\nwx.createComponent(Component)"],"names":["useBtnConfig","ref","useTranslate","TUICallKitAPI"],"mappings":";;;;;;;;;;AAkCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAXnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAYA,UAAM,QAAQ;AACd,UAAM,SAASA,mEAAAA,aAAa,UAAUC,cAAAA,IAAI,aAAa,CAAC;AACxD,UAAM,IAAIC,6CAAAA;AAEV,UAAM,cAAc,YAAY;AAC9B,YAAMC,oCAAAA,cAAc;IAAO;;;;;;;;;;;;;;;;;;;;;;;;;AC5C7B,GAAG,gBAAgB,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Speaker.js","sources":["TUICallKit/src/Components/components/common/Button/Speaker.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9TcGVha2VyLnZ1ZQ"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"props.iconSize || config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :shape=\"config.shape\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText\n v-if=\"config.showText\"\n width=\"60px\"\n :truncated=\"true\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n :lineClamp='2'\n >\n {{getButtonText()}}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { computed, toRefs } from '../../../../adapter-vue';\nimport { TUICallKitAPI, TUIGlobal } from '../../../../TUICallService/index';\nimport { DeviceType } from '../../../../TUICallService/const';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { useBtnConfig } from './hooks/useConfig';\nimport { useTranslate } from '../../../hooks';\nimport { ButtonProps } from './props/Button';\nimport { useCallInfoContext, usePopover } from '../../../hooks';\n\nconst isWeChat = TUIGlobal.isWeChat;\nconst isPC = TUIGlobal.isPC;\nconst props = defineProps(ButtonProps);\nconst { isEarPhone, isMuteSpeaker } = toRefs(useCallInfoContext());\nconst popoverValue = usePopover();\nconst t = useTranslate();\nconst wxConfigState = computed(() => (isEarPhone.value ? 'closedConfig' : 'basicConfig'));\nconst webConfigState = computed(() => (isMuteSpeaker.value ? 'closedConfig' : 'basicConfig'));\nconst config = isWeChat ? useBtnConfig('speaker', wxConfigState) : useBtnConfig('speaker', webConfigState);\nconst btnText = computed(() => (isEarPhone.value ? t.value('speaker disabled') : t.value('speaker enabled')));\nconst handleClick = async () => {\n TUICallKitAPI.setSoundMode();\n};\nconst getButtonText = () => {\n return btnText.value;\n};\nconst handleMouseEnter = () => {\n popoverValue.value = 'speaker';\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/Speaker.vue'\nwx.createComponent(Component)"],"names":["TUIGlobal","toRefs","useCallInfoContext","usePopover","useTranslate","computed","useBtnConfig","TUICallKitAPI"],"mappings":";;;;;;;;;;;;;AAsCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAZnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAcA,UAAM,WAAWA,gDAAU,UAAA;AACdA,oDAAAA,UAAU;AACvB,UAAM,QAAQ;AACd,UAAM,EAAE,YAAY,cAAA,IAAkBC,cAAAA,OAAOC,mDAAAA,mBAAoB,CAAA;AAC5CC,0DAAW;AAChC,UAAM,IAAIC,6CAAAA;AACV,UAAM,gBAAgBC,cAAAA,SAAS,MAAO,WAAW,QAAQ,iBAAiB,aAAc;AACxF,UAAM,iBAAiBA,cAAAA,SAAS,MAAO,cAAc,QAAQ,iBAAiB,aAAc;AACtF,UAAA,SAAS,WAAWC,mEAAAA,aAAa,WAAW,aAAa,IAAIA,mEAAA,aAAa,WAAW,cAAc;AACzG,UAAM,UAAUD,cAAA,SAAS,MAAO,WAAW,QAAQ,EAAE,MAAM,kBAAkB,IAAI,EAAE,MAAM,iBAAiB,CAAE;AAC5G,UAAM,cAAc,YAAY;AAC9BE,0CAAA,cAAc,aAAa;AAAA,IAAA;AAE7B,UAAM,gBAAgB,MAAM;AAC1B,aAAO,QAAQ;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1DjB,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"Speaker.js","sources":["TUICallKit/src/Components/components/common/Button/Speaker.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9TcGVha2VyLnZ1ZQ"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"props.iconSize || config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :shape=\"config.shape\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText\n v-if=\"config.showText\"\n width=\"60px\"\n :truncated=\"true\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n :lineClamp='2'\n >\n {{getButtonText()}}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { computed, toRefs } from '../../../../adapter-vue';\nimport { TUICallKitAPI, TUIGlobal } from '../../../../TUICallService/index';\nimport { DeviceType } from '../../../../TUICallService/const';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { useBtnConfig } from './hooks/useConfig';\nimport { useTranslate } from '../../../hooks';\nimport { ButtonProps } from './props/Button';\nimport { useCallInfoContext, usePopover } from '../../../hooks';\n\nconst isWeChat = TUIGlobal.isWeChat;\nconst isPC = TUIGlobal.isPC;\nconst props = defineProps(ButtonProps);\nconst { isEarPhone, isMuteSpeaker } = toRefs(useCallInfoContext());\nconst popoverValue = usePopover();\nconst t = useTranslate();\nconst wxConfigState = computed(() => (isEarPhone.value ? 'closedConfig' : 'basicConfig'));\nconst webConfigState = computed(() => (isMuteSpeaker.value ? 'closedConfig' : 'basicConfig'));\nconst config = isWeChat ? useBtnConfig('speaker', wxConfigState) : useBtnConfig('speaker', webConfigState);\nconst btnText = computed(() => (isEarPhone.value ? t.value('speaker disabled') : t.value('speaker enabled')));\nconst handleClick = async () => {\n TUICallKitAPI.setSoundMode();\n};\nconst getButtonText = () => {\n return btnText.value;\n};\nconst handleMouseEnter = () => {\n popoverValue.value = 'speaker';\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/Speaker.vue'\nwx.createComponent(Component)"],"names":["TUIGlobal","toRefs","useCallInfoContext","usePopover","useTranslate","computed","useBtnConfig","TUICallKitAPI"],"mappings":";;;;;;;;;;;;;AAsCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAZnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAcA,UAAM,WAAWA,gDAAU,UAAA;AACdA,oDAAAA,UAAU;AACvB,UAAM,QAAQ;AACd,UAAM,EAAE,YAAY,cAAA,IAAkBC,cAAAA,OAAOC,mDAAAA,mBAAoB,CAAA;AAC5CC,0DAAW;AAChC,UAAM,IAAIC,6CAAAA;AACV,UAAM,gBAAgBC,cAAAA,SAAS,MAAO,WAAW,QAAQ,iBAAiB,aAAc;AACxF,UAAM,iBAAiBA,cAAAA,SAAS,MAAO,cAAc,QAAQ,iBAAiB,aAAc;AACtF,UAAA,SAAS,WAAWC,mEAAAA,aAAa,WAAW,aAAa,IAAIA,mEAAA,aAAa,WAAW,cAAc;AACzG,UAAM,UAAUD,cAAA,SAAS,MAAO,WAAW,QAAQ,EAAE,MAAM,kBAAkB,IAAI,EAAE,MAAM,iBAAiB,CAAE;AAC5G,UAAM,cAAc,YAAY;AAC9BE,0CAAA,cAAc,aAAa;AAAA,IAAA;AAE7B,UAAM,gBAAgB,MAAM;AAC1B,aAAO,QAAQ;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1DjB,GAAG,gBAAgB,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"SwitchCamera.js","sources":["TUICallKit/src/Components/components/common/Button/SwitchCamera.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9Td2l0Y2hDYW1lcmEudnVl"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :iconSrc=\"config.iconSrc\"\n :iconSize=\"config.iconSize\"\n :color=\"config.color\"\n :width=\"config.width\"\n :height=\"config.height\"\n :buttonStyle=\"config.buttonStyle\"\n shape=\"circle\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText\n v-if=\"config.showText\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ t('switch camera') }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { toRefs, computed } from '../../../../adapter-vue';\nimport { TUICallKitAPI } from '../../../../TUICallService/index';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { useBtnConfig } from './hooks/useConfig'\nimport { useTranslate } from '../../../hooks';\nimport { useUserInfoExcludeVolumeContext } from '../../../hooks';\n\nconst { localUserInfoExcludeVolume : localUserInfo } = toRefs(useUserInfoExcludeVolumeContext());\nconst isVideoAvailable = computed(() => localUserInfo?.value.isVideoAvailable);\nconst configState = computed(() => {\n return isVideoAvailable.value ? 'basicConfig' : 'disableConfig';\n});\nconst config = useBtnConfig('switchCamera', configState);\nconst t = useTranslate();\n\nconst handleClick = async () => {\n if(!isVideoAvailable.value) return\n await TUICallKitAPI.switchCamera();\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/SwitchCamera.vue'\nwx.createComponent(Component)"],"names":["toRefs","useUserInfoExcludeVolumeContext","computed","useBtnConfig","useTranslate","TUICallKitAPI"],"mappings":";;;;;;;;;;AAmCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAXnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;AAYA,UAAM,EAAE,4BAA6B,cAAA,IAAkBA,cAAAA,OAAOC,gEAAAA,gCAAiC,CAAA;AAC/F,UAAM,mBAAmBC,cAAAA,SAAS,MAAM,+CAAe,MAAM,gBAAgB;AACvE,UAAA,cAAcA,cAAAA,SAAS,MAAM;AAC1B,aAAA,iBAAiB,QAAQ,gBAAgB;AAAA,IAAA,CACjD;AACK,UAAA,SAASC,mEAAAA,aAAa,gBAAgB,WAAW;AACvD,UAAM,IAAIC,6CAAAA;AAEV,UAAM,cAAc,YAAY;AAC9B,UAAG,CAAC,iBAAiB;AAAO;AAC5B,YAAMC,oCAAAA,cAAc;IAAa;;;;;;;;;;;;;;;;;;;;;;;;;;AClDnC,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"SwitchCamera.js","sources":["TUICallKit/src/Components/components/common/Button/SwitchCamera.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9Td2l0Y2hDYW1lcmEudnVl"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :iconSrc=\"config.iconSrc\"\n :iconSize=\"config.iconSize\"\n :color=\"config.color\"\n :width=\"config.width\"\n :height=\"config.height\"\n :buttonStyle=\"config.buttonStyle\"\n shape=\"circle\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText\n v-if=\"config.showText\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ t('switch camera') }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { toRefs, computed } from '../../../../adapter-vue';\nimport { TUICallKitAPI } from '../../../../TUICallService/index';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { useBtnConfig } from './hooks/useConfig'\nimport { useTranslate } from '../../../hooks';\nimport { useUserInfoExcludeVolumeContext } from '../../../hooks';\n\nconst { localUserInfoExcludeVolume : localUserInfo } = toRefs(useUserInfoExcludeVolumeContext());\nconst isVideoAvailable = computed(() => localUserInfo?.value.isVideoAvailable);\nconst configState = computed(() => {\n return isVideoAvailable.value ? 'basicConfig' : 'disableConfig';\n});\nconst config = useBtnConfig('switchCamera', configState);\nconst t = useTranslate();\n\nconst handleClick = async () => {\n if(!isVideoAvailable.value) return\n await TUICallKitAPI.switchCamera();\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/SwitchCamera.vue'\nwx.createComponent(Component)"],"names":["toRefs","useUserInfoExcludeVolumeContext","computed","useBtnConfig","useTranslate","TUICallKitAPI"],"mappings":";;;;;;;;;;AAmCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAXnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;AAYA,UAAM,EAAE,4BAA6B,cAAA,IAAkBA,cAAAA,OAAOC,gEAAAA,gCAAiC,CAAA;AAC/F,UAAM,mBAAmBC,cAAAA,SAAS,MAAM,+CAAe,MAAM,gBAAgB;AACvE,UAAA,cAAcA,cAAAA,SAAS,MAAM;AAC1B,aAAA,iBAAiB,QAAQ,gBAAgB;AAAA,IAAA,CACjD;AACK,UAAA,SAASC,mEAAAA,aAAa,gBAAgB,WAAW;AACvD,UAAM,IAAIC,6CAAAA;AAEV,UAAM,cAAc,YAAY;AAC9B,UAAG,CAAC,iBAAiB;AAAO;AAC5B,YAAMC,oCAAAA,cAAc;IAAa;;;;;;;;;;;;;;;;;;;;;;;;;;AClDnC,GAAG,gBAAgB,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"ToggleButtonPanel.js","sources":["TUICallKit/src/Components/components/common/Button/ToggleButtonPanel.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9Ub2dnbGVCdXR0b25QYW5lbC52dWU"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"props.iconSize || config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :shape=\"config.shape\"\n @click=\"handleClick\"\n >\n </Button>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { ref } from '../../../../adapter-vue';\nimport Button from '../../base/Button/Button.vue';\nimport { ButtonProps } from './props/Button';\nimport { useBtnConfig } from './hooks/useConfig';\nimport { useButtonPanelStatus } from '../../../hooks';\n\nconst { status: panelStatus } = useButtonPanelStatus();\n\nconst props = defineProps(ButtonProps);\nconst config = useBtnConfig('toggleButtonPanel', ref('basicConfig'));\n\nconst handleClick = async () => {\n panelStatus.value = panelStatus.value === 'close' ? 'open' : 'close';\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/ToggleButtonPanel.vue'\nwx.createComponent(Component)"],"names":["useButtonPanelStatus","useBtnConfig","ref"],"mappings":";;;;;;;;;;;AAyBA,MAAA,SAAmB,MAAA;AATnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUA,UAAM,EAAE,QAAQ,YAAY,IAAIA,qDAAqB,qBAAA;AAErD,UAAM,QAAQ;AACd,UAAM,SAASC,mEAAAA,aAAa,qBAAqBC,cAAAA,IAAI,aAAa,CAAC;AAEnE,UAAM,cAAc,YAAY;AAC9B,kBAAY,QAAQ,YAAY,UAAU,UAAU,SAAS;AAAA,IAAA;;;;;;;;;;;;;;;;;ACnC/D,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"ToggleButtonPanel.js","sources":["TUICallKit/src/Components/components/common/Button/ToggleButtonPanel.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9Ub2dnbGVCdXR0b25QYW5lbC52dWU"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"props.iconSize || config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :shape=\"config.shape\"\n @click=\"handleClick\"\n >\n </Button>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { ref } from '../../../../adapter-vue';\nimport Button from '../../base/Button/Button.vue';\nimport { ButtonProps } from './props/Button';\nimport { useBtnConfig } from './hooks/useConfig';\nimport { useButtonPanelStatus } from '../../../hooks';\n\nconst { status: panelStatus } = useButtonPanelStatus();\n\nconst props = defineProps(ButtonProps);\nconst config = useBtnConfig('toggleButtonPanel', ref('basicConfig'));\n\nconst handleClick = async () => {\n panelStatus.value = panelStatus.value === 'close' ? 'open' : 'close';\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/ToggleButtonPanel.vue'\nwx.createComponent(Component)"],"names":["useButtonPanelStatus","useBtnConfig","ref"],"mappings":";;;;;;;;;;;AAyBA,MAAA,SAAmB,MAAA;AATnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUA,UAAM,EAAE,QAAQ,YAAY,IAAIA,qDAAqB,qBAAA;AAErD,UAAM,QAAQ;AACd,UAAM,SAASC,mEAAAA,aAAa,qBAAqBC,cAAAA,IAAI,aAAa,CAAC;AAEnE,UAAM,cAAc,YAAY;AAC9B,kBAAY,QAAQ,YAAY,UAAU,UAAU,SAAS;AAAA,IAAA;;;;;;;;;;;;;;;;;ACnC/D,GAAG,gBAAgB,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"VirtualBackground.js","sources":["TUICallKit/src/Components/components/common/Button/VirtualBackground.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9WaXJ0dWFsQmFja2dyb3VuZC52dWU"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :loading=\"!clickAble\"\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"props.iconSize || config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :shape=\"config.shape\"\n :loadingWidth=\"config.loadingWidth\"\n :loadingHeight=\"config.loadingHeight\"\n :buttonStyle=\"config.buttonStyle\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText \n v-if=\"config.showText\"\n width=\"70px\"\n :lineClamp=\"2\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ t('virtual-background') }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { ref, computed, toRefs } from '../../../../adapter-vue';\nimport { TUICallKitAPI } from '../../../../TUICallService/index';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { ButtonProps } from './props/Button';\nimport { useBtnConfig } from './hooks/useConfig';\nimport { useCallInfoContext, useUserInfoExcludeVolumeContext, useTranslate } from '../../../hooks';\n\nconst props = defineProps(ButtonProps);\nconst clickAble = ref(true);\nconst { localUserInfoExcludeVolume : localUserInfo } = toRefs(useUserInfoExcludeVolumeContext());\nconst isVideoAvailable = computed(() => localUserInfo?.value.isVideoAvailable);\nconst { enableVirtualBackground } = toRefs(useCallInfoContext());\nconst configState = computed(() => {\n if (!clickAble.value) {\n return 'loadingConfig';\n }\n\n if (enableVirtualBackground.value) {\n return 'closedConfig';\n }\n\n return isVideoAvailable.value ? 'basicConfig' : 'disableConfig';\n});\nconst config = useBtnConfig('virtualBackground', configState);\nconst t = useTranslate();\nconst handleClick = async () => {\n if(!isVideoAvailable.value) return\n clickAble.value = false;\n await TUICallKitAPI.setBlurBackground(!enableVirtualBackground.value);\n clickAble.value = true;\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/VirtualBackground.vue'\nwx.createComponent(Component)"],"names":["ref","toRefs","useUserInfoExcludeVolumeContext","computed","useCallInfoContext","useBtnConfig","useTranslate","TUICallKitAPI"],"mappings":";;;;;;;;;;;;AAwCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAXnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAYA,UAAM,QAAQ;AACR,UAAA,YAAYA,kBAAI,IAAI;AAC1B,UAAM,EAAE,4BAA6B,cAAA,IAAkBC,cAAAA,OAAOC,gEAAAA,gCAAiC,CAAA;AAC/F,UAAM,mBAAmBC,cAAAA,SAAS,MAAM,+CAAe,MAAM,gBAAgB;AAC7E,UAAM,EAAE,wBAA4B,IAAAF,qBAAOG,mDAAAA,mBAAoB,CAAA;AACzD,UAAA,cAAcD,cAAAA,SAAS,MAAM;AAC7B,UAAA,CAAC,UAAU,OAAO;AACb,eAAA;AAAA,MACT;AAEA,UAAI,wBAAwB,OAAO;AAC1B,eAAA;AAAA,MACT;AAEO,aAAA,iBAAiB,QAAQ,gBAAgB;AAAA,IAAA,CACjD;AACK,UAAA,SAASE,mEAAAA,aAAa,qBAAqB,WAAW;AAC5D,UAAM,IAAIC,6CAAAA;AACV,UAAM,cAAc,YAAY;AAC9B,UAAG,CAAC,iBAAiB;AAAO;AAC5B,gBAAU,QAAQ;AAClB,YAAMC,oCAAc,cAAA,kBAAkB,CAAC,wBAAwB,KAAK;AACpE,gBAAU,QAAQ;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnEpB,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"VirtualBackground.js","sources":["TUICallKit/src/Components/components/common/Button/VirtualBackground.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0J1dHRvbi9WaXJ0dWFsQmFja2dyb3VuZC52dWU"],"sourcesContent":["<template>\n <div class=\"btn-content\">\n <Button\n :loading=\"!clickAble\"\n :iconSrc=\"config.iconSrc\"\n :color=\"config.color\"\n :iconSize=\"props.iconSize || config.iconSize\"\n :width=\"props.width || config.width\"\n :height=\"props.height || config.height\"\n :shape=\"config.shape\"\n :loadingWidth=\"config.loadingWidth\"\n :loadingHeight=\"config.loadingHeight\"\n :buttonStyle=\"config.buttonStyle\"\n @click=\"handleClick\"\n >\n </Button>\n <TKText \n v-if=\"config.showText\"\n width=\"70px\"\n :lineClamp=\"2\"\n :textStyle=\"config.textStyle\"\n :color=\"config.textColor\"\n :size=\"config.textSize\"\n >\n {{ t('virtual-background') }}\n </TKText>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true,\n },\n};\n</script>\n\n<script lang=\"ts\" setup>\nimport { ref, computed, toRefs } from '../../../../adapter-vue';\nimport { TUICallKitAPI } from '../../../../TUICallService/index';\nimport Button from '../../base/Button/Button.vue';\nimport TKText from '../../base/TKText/TKText.vue';\nimport { ButtonProps } from './props/Button';\nimport { useBtnConfig } from './hooks/useConfig';\nimport { useCallInfoContext, useUserInfoExcludeVolumeContext, useTranslate } from '../../../hooks';\n\nconst props = defineProps(ButtonProps);\nconst clickAble = ref(true);\nconst { localUserInfoExcludeVolume : localUserInfo } = toRefs(useUserInfoExcludeVolumeContext());\nconst isVideoAvailable = computed(() => localUserInfo?.value.isVideoAvailable);\nconst { enableVirtualBackground } = toRefs(useCallInfoContext());\nconst configState = computed(() => {\n if (!clickAble.value) {\n return 'loadingConfig';\n }\n\n if (enableVirtualBackground.value) {\n return 'closedConfig';\n }\n\n return isVideoAvailable.value ? 'basicConfig' : 'disableConfig';\n});\nconst config = useBtnConfig('virtualBackground', configState);\nconst t = useTranslate();\nconst handleClick = async () => {\n if(!isVideoAvailable.value) return\n clickAble.value = false;\n await TUICallKitAPI.setBlurBackground(!enableVirtualBackground.value);\n clickAble.value = true;\n};\n</script>\n\n<style lang=\"scss\" scoped>\n@import './style/common.scss';\n</style>\n\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Button/VirtualBackground.vue'\nwx.createComponent(Component)"],"names":["ref","toRefs","useUserInfoExcludeVolumeContext","computed","useCallInfoContext","useBtnConfig","useTranslate","TUICallKitAPI"],"mappings":";;;;;;;;;;;;AAwCA,MAAA,SAAmB,MAAA;AACnB,MAAA,SAAmB,MAAA;AAXnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAYA,UAAM,QAAQ;AACR,UAAA,YAAYA,kBAAI,IAAI;AAC1B,UAAM,EAAE,4BAA6B,cAAA,IAAkBC,cAAAA,OAAOC,gEAAAA,gCAAiC,CAAA;AAC/F,UAAM,mBAAmBC,cAAAA,SAAS,MAAM,+CAAe,MAAM,gBAAgB;AAC7E,UAAM,EAAE,wBAA4B,IAAAF,qBAAOG,mDAAAA,mBAAoB,CAAA;AACzD,UAAA,cAAcD,cAAAA,SAAS,MAAM;AAC7B,UAAA,CAAC,UAAU,OAAO;AACb,eAAA;AAAA,MACT;AAEA,UAAI,wBAAwB,OAAO;AAC1B,eAAA;AAAA,MACT;AAEO,aAAA,iBAAiB,QAAQ,gBAAgB;AAAA,IAAA,CACjD;AACK,UAAA,SAASE,mEAAAA,aAAa,qBAAqB,WAAW;AAC5D,UAAM,IAAIC,6CAAAA;AACV,UAAM,cAAc,YAAY;AAC9B,UAAG,CAAC,iBAAiB;AAAO;AAC5B,gBAAU,QAAQ;AAClB,YAAMC,oCAAc,cAAA,kBAAkB,CAAC,wBAAwB,KAAK;AACpE,gBAAU,QAAQ;AAAA,IAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnEpB,GAAG,gBAAgB,SAAS;"}
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"version":3,"file":"FloatWindow.js","sources":["TUICallKit/src/Components/components/common/FloatWindow/FloatWindow.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0Zsb2F0V2luZG93L0Zsb2F0V2luZG93LnZ1ZQ"],"sourcesContent":["<template>\n <div :class=\"floatWindowContainerClassName\">\n <FloatWindowMobile v-if=\"!TUIGlobal.isPC\">\n <slot />\n </FloatWindowMobile>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, toRefs } from '../../../../adapter-vue';\nimport FloatWindowMobile from './mobile/FloatWindow.vue';\nimport { TUIGlobal } from '../../../../TUICallService';\nimport { classNames } from '../../base/util';\nimport { useFloatWindowContext } from '../../../hooks';\n\nconst { isFloatWindow } = toRefs(useFloatWindowContext());\n\nconst floatWindowContainerClassName = computed(() => classNames([\n 'float-window-container',\n {\n float: isFloatWindow.value,\n 'not-float': !isFloatWindow.value,\n pc: TUIGlobal.isPC,\n mobile: !TUIGlobal.isPC,\n },\n]));\n\n</script>\n\n<style lang=\"scss\" scoped>\n.float-window-container {\n &.not-float {\n width: 100%;\n height: 100%;\n }\n\n &.float {\n position: absolute;\n\n &.pc {\n top: 50px;\n left: 50%;\n transform: translateX(-50%);\n }\n\n &.mobile {\n top: 150px;\n right: 0;\n }\n }\n}\n</style>","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/FloatWindow/FloatWindow.vue'\nwx.createComponent(Component)"],"names":["toRefs","useFloatWindowContext","computed","classNames","TUIGlobal"],"mappings":";;;;;;;;;;;;AAkBA,MAAA,oBAA8B,MAAA;AAT9B,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;AAUA,UAAM,EAAE,cAAkB,IAAAA,qBAAOC,sDAAAA,sBAAuB,CAAA;AAElD,UAAA,gCAAgCC,uBAAS,MAAMC,qEAAW;AAAA,MAC9D;AAAA,MACA;AAAA,QACE,OAAO,cAAc;AAAA,QACrB,aAAa,CAAC,cAAc;AAAA,QAC5B,IAAIC,gDAAU,UAAA;AAAA,QACd,QAAQ,CAACA,gDAAAA,UAAU;AAAA,MACrB;AAAA,IACD,CAAA,CAAC;;;;;;;;;;;AChCF,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"FloatWindow.js","sources":["TUICallKit/src/Components/components/common/FloatWindow/FloatWindow.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0Zsb2F0V2luZG93L0Zsb2F0V2luZG93LnZ1ZQ"],"sourcesContent":["<template>\n <div :class=\"floatWindowContainerClassName\">\n <FloatWindowMobile v-if=\"!TUIGlobal.isPC\">\n <slot />\n </FloatWindowMobile>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { computed, toRefs } from '../../../../adapter-vue';\nimport FloatWindowMobile from './mobile/FloatWindow.vue';\nimport { TUIGlobal } from '../../../../TUICallService';\nimport { classNames } from '../../base/util';\nimport { useFloatWindowContext } from '../../../hooks';\n\nconst { isFloatWindow } = toRefs(useFloatWindowContext());\n\nconst floatWindowContainerClassName = computed(() => classNames([\n 'float-window-container',\n {\n float: isFloatWindow.value,\n 'not-float': !isFloatWindow.value,\n pc: TUIGlobal.isPC,\n mobile: !TUIGlobal.isPC,\n },\n]));\n\n</script>\n\n<style lang=\"scss\" scoped>\n.float-window-container {\n &.not-float {\n width: 100%;\n height: 100%;\n }\n\n &.float {\n position: absolute;\n\n &.pc {\n top: 50px;\n left: 50%;\n transform: translateX(-50%);\n }\n\n &.mobile {\n top: 150px;\n right: 0;\n }\n }\n}\n</style>","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/FloatWindow/FloatWindow.vue'\nwx.createComponent(Component)"],"names":["toRefs","useFloatWindowContext","computed","classNames","TUIGlobal"],"mappings":";;;;;;;;;;;;AAkBA,MAAA,oBAA8B,MAAA;AAT9B,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;AAUA,UAAM,EAAE,cAAkB,IAAAA,qBAAOC,sDAAAA,sBAAuB,CAAA;AAElD,UAAA,gCAAgCC,uBAAS,MAAMC,qEAAW;AAAA,MAC9D;AAAA,MACA;AAAA,QACE,OAAO,cAAc;AAAA,QACrB,aAAa,CAAC,cAAc;AAAA,QAC5B,IAAIC,gDAAU,UAAA;AAAA,QACd,QAAQ,CAACA,gDAAAA,UAAU;AAAA,MACrB;AAAA,IACD,CAAA,CAAC;;;;;;;;;;;AChCF,GAAG,gBAAgB,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"FloatWindow.js","sources":["TUICallKit/src/Components/components/common/FloatWindow/mobile/FloatWindow.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0Zsb2F0V2luZG93L21vYmlsZS9GbG9hdFdpbmRvdy52dWU"],"sourcesContent":["<template>\n <div id=\"float-window-id\">\n <FloatWindowSingleCall v-if=\"!isGroupCall\">\n <slot />\n </FloatWindowSingleCall>\n <FloatWindowGroupCall v-else>\n <slot />\n </FloatWindowGroupCall>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { toRefs } from '../../../../../adapter-vue';\nimport FloatWindowSingleCall from './FloatWindowSingleCall.vue';\nimport FloatWindowGroupCall from './FloatWindowGroupCall.vue';\nimport { useCallInfoContext } from '../../../../hooks';\n\nconst { isGroupCall } = toRefs(useCallInfoContext());\n\n</script>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/FloatWindow/mobile/FloatWindow.vue'\nwx.createComponent(Component)"],"names":["toRefs","useCallInfoContext","Component"],"mappings":";;;;;;;;;AAqBA,MAAA,wBAAkC,MAAA;AAClC,MAAA,uBAAiC,MAAA;AAVjC,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;AASA,UAAM,EAAE,YAAgB,IAAAA,qBAAOC,mDAAAA,mBAAoB,CAAA;;;;;;;;ACxBnD,GAAG,gBAAgBC,SAAS;"}
{"version":3,"file":"FloatWindow.js","sources":["TUICallKit/src/Components/components/common/FloatWindow/mobile/FloatWindow.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0Zsb2F0V2luZG93L21vYmlsZS9GbG9hdFdpbmRvdy52dWU"],"sourcesContent":["<template>\n <div id=\"float-window-id\">\n <FloatWindowSingleCall v-if=\"!isGroupCall\">\n <slot />\n </FloatWindowSingleCall>\n <FloatWindowGroupCall v-else>\n <slot />\n </FloatWindowGroupCall>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script setup lang=\"ts\">\nimport { toRefs } from '../../../../../adapter-vue';\nimport FloatWindowSingleCall from './FloatWindowSingleCall.vue';\nimport FloatWindowGroupCall from './FloatWindowGroupCall.vue';\nimport { useCallInfoContext } from '../../../../hooks';\n\nconst { isGroupCall } = toRefs(useCallInfoContext());\n\n</script>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/FloatWindow/mobile/FloatWindow.vue'\nwx.createComponent(Component)"],"names":["toRefs","useCallInfoContext","Component"],"mappings":";;;;;;;;;AAqBA,MAAA,wBAAkC,MAAA;AAClC,MAAA,uBAAiC,MAAA;AAVjC,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;AASA,UAAM,EAAE,YAAgB,IAAAA,qBAAOC,mDAAAA,mBAAoB,CAAA;;;;;;;;ACxBnD,GAAG,gBAAgBC,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"FloatWindowSingleCall.js","sources":["TUICallKit/src/Components/components/common/FloatWindow/mobile/FloatWindowSingleCall.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0Zsb2F0V2luZG93L21vYmlsZS9GbG9hdFdpbmRvd1NpbmdsZUNhbGwudnVl"],"sourcesContent":["<template>\n <div :class=\"floatWindowClassName\">\n <div\n v-show=\"!(isFloatWindow && callType === CallMediaType.AUDIO)\"\n class=\"singlecall-video-float-content\"\n @click=\"closeFloatWindow\"\n >\n <slot></slot>\n <div class=\"float-window-tip-container\">\n <TKText v-if=\"callStatus === CallStatus.CALLING && isFloatWindow\" color=\"#FFF\" size=\"12px\">{{ t('wait to be called') }}</TKText>\n </div>\n </div>\n <div\n v-show=\"isFloatWindow && callType === CallMediaType.AUDIO\"\n class=\"singlecall-audio-float-content\"\n @click=\"closeFloatWindow\"\n >\n <TKImage width=\"36px\" height=\"36px\" :src=\"earphoneSrc\" />\n <Timer v-if=\"callStatus === CallStatus.CONNECTED\" fontSize=\"12px\" :callDuration=\"callDuration\" color=\"#12b969\" />\n <TKText v-if=\"callStatus === CallStatus.CALLING && isFloatWindow\" color=\"#12b969\" size=\"12px\">{{ t('wait to be called') }}</TKText>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script lang=\"ts\" setup>\nimport { toRefs, computed } from '../../../../../adapter-vue';\nimport { TUICallKitAPI, CallMediaType, CallStatus } from '../../../../../TUICallService';\nimport TKImage from '../../../base/TKImage/TKImage.vue';\nimport Timer from '../../Timer/Timer.vue';\nimport TKText from '../../../base/TKText/TKText.vue';\nimport { useCallDuration, useCallInfoContext, useFloatWindowContext, useTranslate } from '../../../../hooks';\nimport { classNames } from '../../../base/util/classNames';\nimport earphoneSrc from '../../../../assets/floatingWindow/mobile/earphone.svg';\n\nconst { callType, callStatus } = toRefs(useCallInfoContext());\nconst { isFloatWindow } = toRefs(useFloatWindowContext());\nconst { callDuration } = useCallDuration();\nconst t = useTranslate();\n\nconst floatWindowClassName = computed(() => classNames([\n 'float-window-container',\n {\n 'singlecall-video-float': callType.value === CallMediaType.VIDEO && isFloatWindow.value,\n 'singlecall-audio-float': callType.value === CallMediaType.AUDIO && isFloatWindow.value,\n }\n]));\n\nfunction closeFloatWindow() {\n isFloatWindow.value && TUICallKitAPI.toggleMinimize();\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.singlecall-video-float {\n width: 110px;\n height: 196px;\n display: flex;\n z-index: 99;\n flex-direction: column;\n align-items: center;\n background: #000;\n border-radius: 12px;\n box-shadow: 0 0 10px #35394166;\n overflow: hidden;\n\n .singlecall-video-float-content {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n flex-direction: column;\n align-items: center;\n }\n\n .float-window-tip-container {\n position: absolute;\n bottom: 8px;\n }\n}\n\n.singlecall-audio-float {\n width: 72px;\n height: 72px;\n display: flex;\n z-index: 99;\n flex-direction: column;\n align-items: center;\n background: #FFF;\n border-radius: 12px;\n box-shadow: 0 0 10px #35394166;\n\n .singlecall-audio-float-content {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n flex-direction: column;\n align-items: center;\n }\n}\n</style>","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/FloatWindow/mobile/FloatWindowSingleCall.vue'\nwx.createComponent(Component)"],"names":["toRefs","useCallInfoContext","useFloatWindowContext","useCallDuration","useTranslate","computed","classNames","CallMediaType","TUICallKitAPI"],"mappings":";;;;;;;;;;;;;;AAmCA,MAAA,UAAoB,MAAA;AACpB,MAAA,QAAkB,MAAA;AAClB,MAAA,SAAmB,MAAA;AAZnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;AAaA,UAAM,EAAE,UAAU,WAAA,IAAeA,cAAAA,OAAOC,mDAAAA,mBAAoB,CAAA;AAC5D,UAAM,EAAE,cAAkB,IAAAD,qBAAOE,sDAAAA,sBAAuB,CAAA;AAClD,UAAA,EAAE,iBAAiBC,gDAAAA;AACzB,UAAM,IAAIC,6CAAAA;AAEJ,UAAA,uBAAuBC,uBAAS,MAAMC,qEAAW;AAAA,MACrD;AAAA,MACA;AAAA,QACE,0BAA0B,SAAS,UAAUC,yCAAA,cAAc,SAAS,cAAc;AAAA,QAClF,0BAA0B,SAAS,UAAUA,yCAAA,cAAc,SAAS,cAAc;AAAA,MACpF;AAAA,IACD,CAAA,CAAC;AAEF,aAAS,mBAAmB;AACZ,oBAAA,SAASC,kDAAc;IACvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxDA,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"FloatWindowSingleCall.js","sources":["TUICallKit/src/Components/components/common/FloatWindow/mobile/FloatWindowSingleCall.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL0Zsb2F0V2luZG93L21vYmlsZS9GbG9hdFdpbmRvd1NpbmdsZUNhbGwudnVl"],"sourcesContent":["<template>\n <div :class=\"floatWindowClassName\">\n <div\n v-show=\"!(isFloatWindow && callType === CallMediaType.AUDIO)\"\n class=\"singlecall-video-float-content\"\n @click=\"closeFloatWindow\"\n >\n <slot></slot>\n <div class=\"float-window-tip-container\">\n <TKText v-if=\"callStatus === CallStatus.CALLING && isFloatWindow\" color=\"#FFF\" size=\"12px\">{{ t('wait to be called') }}</TKText>\n </div>\n </div>\n <div\n v-show=\"isFloatWindow && callType === CallMediaType.AUDIO\"\n class=\"singlecall-audio-float-content\"\n @click=\"closeFloatWindow\"\n >\n <TKImage width=\"36px\" height=\"36px\" :src=\"earphoneSrc\" />\n <Timer v-if=\"callStatus === CallStatus.CONNECTED\" fontSize=\"12px\" :callDuration=\"callDuration\" color=\"#12b969\" />\n <TKText v-if=\"callStatus === CallStatus.CALLING && isFloatWindow\" color=\"#12b969\" size=\"12px\">{{ t('wait to be called') }}</TKText>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script lang=\"ts\" setup>\nimport { toRefs, computed } from '../../../../../adapter-vue';\nimport { TUICallKitAPI, CallMediaType, CallStatus } from '../../../../../TUICallService';\nimport TKImage from '../../../base/TKImage/TKImage.vue';\nimport Timer from '../../Timer/Timer.vue';\nimport TKText from '../../../base/TKText/TKText.vue';\nimport { useCallDuration, useCallInfoContext, useFloatWindowContext, useTranslate } from '../../../../hooks';\nimport { classNames } from '../../../base/util/classNames';\nimport earphoneSrc from '../../../../assets/floatingWindow/mobile/earphone.svg';\n\nconst { callType, callStatus } = toRefs(useCallInfoContext());\nconst { isFloatWindow } = toRefs(useFloatWindowContext());\nconst { callDuration } = useCallDuration();\nconst t = useTranslate();\n\nconst floatWindowClassName = computed(() => classNames([\n 'float-window-container',\n {\n 'singlecall-video-float': callType.value === CallMediaType.VIDEO && isFloatWindow.value,\n 'singlecall-audio-float': callType.value === CallMediaType.AUDIO && isFloatWindow.value,\n }\n]));\n\nfunction closeFloatWindow() {\n isFloatWindow.value && TUICallKitAPI.toggleMinimize();\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.singlecall-video-float {\n width: 110px;\n height: 196px;\n display: flex;\n z-index: 99;\n flex-direction: column;\n align-items: center;\n background: #000;\n border-radius: 12px;\n box-shadow: 0 0 10px #35394166;\n overflow: hidden;\n\n .singlecall-video-float-content {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n flex-direction: column;\n align-items: center;\n }\n\n .float-window-tip-container {\n position: absolute;\n bottom: 8px;\n }\n}\n\n.singlecall-audio-float {\n width: 72px;\n height: 72px;\n display: flex;\n z-index: 99;\n flex-direction: column;\n align-items: center;\n background: #FFF;\n border-radius: 12px;\n box-shadow: 0 0 10px #35394166;\n\n .singlecall-audio-float-content {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: center;\n flex-direction: column;\n align-items: center;\n }\n}\n</style>","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/FloatWindow/mobile/FloatWindowSingleCall.vue'\nwx.createComponent(Component)"],"names":["toRefs","useCallInfoContext","useFloatWindowContext","useCallDuration","useTranslate","computed","classNames","CallMediaType","TUICallKitAPI"],"mappings":";;;;;;;;;;;;;;AAmCA,MAAA,UAAoB,MAAA;AACpB,MAAA,QAAkB,MAAA;AAClB,MAAA,SAAmB,MAAA;AAZnB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;AAaA,UAAM,EAAE,UAAU,WAAA,IAAeA,cAAAA,OAAOC,mDAAAA,mBAAoB,CAAA;AAC5D,UAAM,EAAE,cAAkB,IAAAD,qBAAOE,sDAAAA,sBAAuB,CAAA;AAClD,UAAA,EAAE,iBAAiBC,gDAAAA;AACzB,UAAM,IAAIC,6CAAAA;AAEJ,UAAA,uBAAuBC,uBAAS,MAAMC,qEAAW;AAAA,MACrD;AAAA,MACA;AAAA,QACE,0BAA0B,SAAS,UAAUC,yCAAA,cAAc,SAAS,cAAc;AAAA,QAClF,0BAA0B,SAAS,UAAUA,yCAAA,cAAc,SAAS,cAAc;AAAA,MACpF;AAAA,IACD,CAAA,CAAC;AAEF,aAAS,mBAAmB;AACZ,oBAAA,SAASC,kDAAc;IACvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACxDA,GAAG,gBAAgB,SAAS;"}
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
{"version":3,"file":"Player.js","sources":["TUICallKit/src/Components/components/common/Player/Player.ts","TUICallKit/src/Components/components/common/Player/Player.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL1BsYXllci9QbGF5ZXIudnVl"],"sourcesContent":["export const PlayerProps = {\n show: {\n type: Boolean,\n default: true,\n },\n domId: {\n type: String,\n },\n loading: {\n type: Boolean,\n },\n showStreamInfo: {\n type: Boolean,\n },\n showAudioStream: {\n type: Boolean,\n },\n};\n","<template>\n <div v-show=\"show\" :id=\"domId\" class=\"player-container\">\n <div v-show=\"showAudioStream\" class=\"audio-stream-container\">\n <slot name=\"audio-stream\" />\n </div>\n <slot name=\"loading\" />\n <div :class=\"streamInfoContainerClassName\">\n <slot name=\"stream-info\" />\n </div>\n <WXPlayer :dom-id=\"domId\" v-if=\"TUIGlobal.isWeChat && domId\" remoteClass=\"small-view\" />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script lang=\"ts\" setup>\nimport { TUIGlobal } from '../../../../TUICallService';\nimport WXPlayer from './WeChatPlayer/WeChatPlayer.vue';\nimport { classNames } from '../../base/util';\nimport { PlayerProps } from './Player';\n\ndefineProps(PlayerProps);\n\nconst streamInfoContainerClassName = classNames([\n 'stream-info-container',\n { mobile: !TUIGlobal.isPC },\n]);\n</script>\n\n<style lang=\"scss\" scoped>\n.player-container {\n width: 100%;\n height: 100%;\n position: relative;\n background-color: #4c515a;\n\n .audio-stream-container {\n position: absolute;\n z-index: 1;\n width: 100%;\n height: 100%;\n }\n\n .stream-info-container {\n position: absolute;\n bottom: 0;\n z-index: 10;\n width: 100%;\n\n &.mobile {\n margin-bottom: 8px;\n }\n }\n}\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Player/Player.vue'\nwx.createComponent(Component)"],"names":["classNames","TUIGlobal"],"mappings":";;;;;;AAAO,MAAM,cAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,EACR;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,EACR;AACF;;;;ACMA,MAAA,WAAqB,MAAA;AATrB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAWA,UAAM,+BAA+BA,0DAAAA,WAAW;AAAA,MAC9C;AAAA,MACA,EAAE,QAAQ,CAACC,gDAAA,UAAU,KAAK;AAAA,IAAA,CAC3B;;;;;;;;;;;;;;;;;;;AC/BD,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"Player.js","sources":["TUICallKit/src/Components/components/common/Player/Player.ts","TUICallKit/src/Components/components/common/Player/Player.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL1BsYXllci9QbGF5ZXIudnVl"],"sourcesContent":["export const PlayerProps = {\n show: {\n type: Boolean,\n default: true,\n },\n domId: {\n type: String,\n },\n loading: {\n type: Boolean,\n },\n showStreamInfo: {\n type: Boolean,\n },\n showAudioStream: {\n type: Boolean,\n },\n};\n","<template>\n <div v-show=\"show\" :id=\"domId\" class=\"player-container\">\n <div v-show=\"showAudioStream\" class=\"audio-stream-container\">\n <slot name=\"audio-stream\" />\n </div>\n <slot name=\"loading\" />\n <div :class=\"streamInfoContainerClassName\">\n <slot name=\"stream-info\" />\n </div>\n <WXPlayer :dom-id=\"domId\" v-if=\"TUIGlobal.isWeChat && domId\" remoteClass=\"small-view\" />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n\n<script lang=\"ts\" setup>\nimport { TUIGlobal } from '../../../../TUICallService';\nimport WXPlayer from './WeChatPlayer/WeChatPlayer.vue';\nimport { classNames } from '../../base/util';\nimport { PlayerProps } from './Player';\n\ndefineProps(PlayerProps);\n\nconst streamInfoContainerClassName = classNames([\n 'stream-info-container',\n { mobile: !TUIGlobal.isPC },\n]);\n</script>\n\n<style lang=\"scss\" scoped>\n.player-container {\n width: 100%;\n height: 100%;\n position: relative;\n background-color: #4c515a;\n\n .audio-stream-container {\n position: absolute;\n z-index: 1;\n width: 100%;\n height: 100%;\n }\n\n .stream-info-container {\n position: absolute;\n bottom: 0;\n z-index: 10;\n width: 100%;\n\n &.mobile {\n margin-bottom: 8px;\n }\n }\n}\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Player/Player.vue'\nwx.createComponent(Component)"],"names":["classNames","TUIGlobal"],"mappings":";;;;;;AAAO,MAAM,cAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,EACR;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,EACR;AACF;;;;ACMA,MAAA,WAAqB,MAAA;AATrB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAWA,UAAM,+BAA+BA,0DAAAA,WAAW;AAAA,MAC9C;AAAA,MACA,EAAE,QAAQ,CAACC,gDAAA,UAAU,KAAK;AAAA,IAAA,CAC3B;;;;;;;;;;;;;;;;;;;AC/BD,GAAG,gBAAgB,SAAS;"}
@@ -1 +1 @@
{"version":3,"file":"Pusher.js","sources":["TUICallKit/src/Components/components/common/Pusher/Pusher.ts","TUICallKit/src/Components/components/common/Pusher/Pusher.vue","../../../soft/HBuilderX.4.87.2025121004/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL1B1c2hlci9QdXNoZXIudnVl"],"sourcesContent":["export const PusherProps = {\n show: {\n type: Boolean,\n default: true,\n },\n domId: {\n type: String,\n },\n loading: {\n type: Boolean,\n },\n showStreamInfo: {\n type: Boolean,\n },\n showAudioStream: {\n type: Boolean,\n },\n};\n","<template>\n <div v-show=\"show\" :id=\"domId\" class=\"pusher-container\">\n <div v-show=\"showAudioStream\" class=\"audio-stream-container\">\n <slot name=\"audio-stream\" />\n </div>\n <slot name=\"loading\" />\n <div :class=\"streamInfoContainerClassName\">\n <slot name=\"stream-info\" />\n </div>\n <!-- 升级到 TRTCPusher 后, 授权后挂载新的 pusher 也会存在进不了房的问题, 因此未授权前不挂载 pusher, 授权后才能挂载 pusher -->\n <WXPusher v-if=\"pusherId\" localClass=\"large-view\" />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n<script lang=\"ts\" setup>\nimport { onMounted, ref, onUnmounted } from '../../../../adapter-vue';\nimport { StoreName, NAME, TUIStore } from '../../../../TUICallService/index';\nimport { TUIGlobal } from '../../../../TUICallService';\nimport WXPusher from './WeChatPusher/WeChatPusher.vue';\nimport { classNames } from '../../base/util';\nimport { PusherProps } from './Pusher';\n\nconst pusherId = ref(TUIStore.getData(StoreName.CALL, NAME.PUSHER_ID));\n\nconst props = defineProps(PusherProps);\n\nconst streamInfoContainerClassName = classNames([\n 'stream-info-container',\n { mobile: !TUIGlobal.isPC },\n]);\n\nconst handleReloadPusher =(value) =>{\n pusherId.value = value;\n};\n\nconst watchOptions = {\n [NAME.PUSHER_ID]: handleReloadPusher,\n};\n\nonMounted(() => {\n TUIStore.watch(StoreName.CALL, watchOptions, { notifyRangeWhenWatch: NAME.MYSELF });\n});\n\nonUnmounted(() => {\n TUIStore.unwatch(StoreName.CALL, watchOptions);\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.pusher-container {\n width: 100%;\n height: 100%;\n position: relative;\n background-color: #4c515a;\n\n .audio-stream-container {\n position: absolute;\n z-index: 3;\n width: 100%;\n height: 100%;\n }\n\n .stream-info-container {\n position: absolute;\n bottom: 0;\n z-index: 3;\n width: 100%;\n\n &.mobile {\n margin-bottom: 8px;\n }\n }\n}\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Pusher/Pusher.vue'\nwx.createComponent(Component)"],"names":["ref","TUIStore","StoreName","NAME","classNames","TUIGlobal","onMounted","onUnmounted"],"mappings":";;;;;;;;AAAO,MAAM,cAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,EACR;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,EACR;AACF;;;;ACQA,MAAA,WAAqB,MAAA;AAVrB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUM,UAAA,WAAWA,kBAAIC,gDAAAA,SAAS,QAAQC,mDAAU,MAAMC,0CAAAA,KAAK,SAAS,CAAC;AAIrE,UAAM,+BAA+BC,0DAAAA,WAAW;AAAA,MAC9C;AAAA,MACA,EAAE,QAAQ,CAACC,gDAAA,UAAU,KAAK;AAAA,IAAA,CAC3B;AAEK,UAAA,qBAAoB,CAAC,UAAS;AAClC,eAAS,QAAQ;AAAA,IAAA;AAGnB,UAAM,eAAe;AAAA,MACnB,CAACF,0CAAAA,KAAK,SAAS,GAAG;AAAA,IAAA;AAGpBG,kBAAAA,UAAU,MAAM;AACLL,+DAAA,MAAMC,mDAAU,MAAM,cAAc,EAAE,sBAAsBC,0CAAAA,KAAK,QAAQ;AAAA,IAAA,CACnF;AAEDI,kBAAAA,YAAY,MAAM;AACPN,sDAAAA,SAAA,QAAQC,yCAAAA,UAAU,MAAM,YAAY;AAAA,IAAA,CAC9C;;;;;;;;;;;;;;;;;;ACnDD,GAAG,gBAAgB,SAAS;"}
{"version":3,"file":"Pusher.js","sources":["TUICallKit/src/Components/components/common/Pusher/Pusher.ts","TUICallKit/src/Components/components/common/Pusher/Pusher.vue","../../../soft/HBuilderX/plugins/uniapp-cli-vite/uniComponent:/RDovd2ViL3p5dC93eC9UVUlDYWxsS2l0L3NyYy9Db21wb25lbnRzL2NvbXBvbmVudHMvY29tbW9uL1B1c2hlci9QdXNoZXIudnVl"],"sourcesContent":["export const PusherProps = {\n show: {\n type: Boolean,\n default: true,\n },\n domId: {\n type: String,\n },\n loading: {\n type: Boolean,\n },\n showStreamInfo: {\n type: Boolean,\n },\n showAudioStream: {\n type: Boolean,\n },\n};\n","<template>\n <div v-show=\"show\" :id=\"domId\" class=\"pusher-container\">\n <div v-show=\"showAudioStream\" class=\"audio-stream-container\">\n <slot name=\"audio-stream\" />\n </div>\n <slot name=\"loading\" />\n <div :class=\"streamInfoContainerClassName\">\n <slot name=\"stream-info\" />\n </div>\n <!-- 升级到 TRTCPusher 后, 授权后挂载新的 pusher 也会存在进不了房的问题, 因此未授权前不挂载 pusher, 授权后才能挂载 pusher -->\n <WXPusher v-if=\"pusherId\" localClass=\"large-view\" />\n </div>\n</template>\n\n<script lang=\"ts\">\nexport default {\n options: {\n virtualHost: true\n }\n}\n</script>\n<script lang=\"ts\" setup>\nimport { onMounted, ref, onUnmounted } from '../../../../adapter-vue';\nimport { StoreName, NAME, TUIStore } from '../../../../TUICallService/index';\nimport { TUIGlobal } from '../../../../TUICallService';\nimport WXPusher from './WeChatPusher/WeChatPusher.vue';\nimport { classNames } from '../../base/util';\nimport { PusherProps } from './Pusher';\n\nconst pusherId = ref(TUIStore.getData(StoreName.CALL, NAME.PUSHER_ID));\n\nconst props = defineProps(PusherProps);\n\nconst streamInfoContainerClassName = classNames([\n 'stream-info-container',\n { mobile: !TUIGlobal.isPC },\n]);\n\nconst handleReloadPusher =(value) =>{\n pusherId.value = value;\n};\n\nconst watchOptions = {\n [NAME.PUSHER_ID]: handleReloadPusher,\n};\n\nonMounted(() => {\n TUIStore.watch(StoreName.CALL, watchOptions, { notifyRangeWhenWatch: NAME.MYSELF });\n});\n\nonUnmounted(() => {\n TUIStore.unwatch(StoreName.CALL, watchOptions);\n});\n</script>\n\n<style lang=\"scss\" scoped>\n.pusher-container {\n width: 100%;\n height: 100%;\n position: relative;\n background-color: #4c515a;\n\n .audio-stream-container {\n position: absolute;\n z-index: 3;\n width: 100%;\n height: 100%;\n }\n\n .stream-info-container {\n position: absolute;\n bottom: 0;\n z-index: 3;\n width: 100%;\n\n &.mobile {\n margin-bottom: 8px;\n }\n }\n}\n</style>\n","import Component from 'D:/web/zyt/wx/TUICallKit/src/Components/components/common/Pusher/Pusher.vue'\nwx.createComponent(Component)"],"names":["ref","TUIStore","StoreName","NAME","classNames","TUIGlobal","onMounted","onUnmounted"],"mappings":";;;;;;;;AAAO,MAAM,cAAc;AAAA,EACzB,MAAM;AAAA,IACJ,MAAM;AAAA,IACN,SAAS;AAAA,EACX;AAAA,EACA,OAAO;AAAA,IACL,MAAM;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,EACR;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM;AAAA,EACR;AACF;;;;ACQA,MAAA,WAAqB,MAAA;AAVrB,MAAA,cAAe;AAAA,EACb,SAAS;AAAA,IACP,aAAa;AAAA,EACf;AACF;;;;;;AAUM,UAAA,WAAWA,kBAAIC,gDAAAA,SAAS,QAAQC,mDAAU,MAAMC,0CAAAA,KAAK,SAAS,CAAC;AAIrE,UAAM,+BAA+BC,0DAAAA,WAAW;AAAA,MAC9C;AAAA,MACA,EAAE,QAAQ,CAACC,gDAAA,UAAU,KAAK;AAAA,IAAA,CAC3B;AAEK,UAAA,qBAAoB,CAAC,UAAS;AAClC,eAAS,QAAQ;AAAA,IAAA;AAGnB,UAAM,eAAe;AAAA,MACnB,CAACF,0CAAAA,KAAK,SAAS,GAAG;AAAA,IAAA;AAGpBG,kBAAAA,UAAU,MAAM;AACLL,+DAAA,MAAMC,mDAAU,MAAM,cAAc,EAAE,sBAAsBC,0CAAAA,KAAK,QAAQ;AAAA,IAAA,CACnF;AAEDI,kBAAAA,YAAY,MAAM;AACPN,sDAAAA,SAAA,QAAQC,yCAAAA,UAAU,MAAM,YAAY;AAAA,IAAA,CAC9C;;;;;;;;;;;;;;;;;;ACnDD,GAAG,gBAAgB,SAAS;"}

Some files were not shown because too many files have changed in this diff Show More