imBll.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import { getImAdminToken,imAccountCheck,registerImUser,getImUserToken,updateImUser } from "@/pages_im/api/imApi";
  2. // 保证管理员 Token 存在且可用
  3. const ensureAdminToken = async () => {
  4. let adminToken = uni.getStorageSync('IMAdminToken');
  5. if (adminToken) return adminToken;
  6. const resp = await getImAdminToken();
  7. const token = resp?.token ?? resp?.data?.token;
  8. if (!token) throw new Error('IMAdminToken 获取失败');
  9. uni.setStorageSync('IMAdminToken', token);
  10. return token;
  11. };
  12. const delay = (ms) => new Promise((r) => setTimeout(r, ms));
  13. export const imAccountCheckReg = (userID) => {
  14. return new Promise(async (resolve, reject) => {
  15. let data={};
  16. let hasReg=false;
  17. try {
  18. let token = uni.getStorageSync('IMAdminToken');
  19. let tokenData={};
  20. if(!token){
  21. const respTokenObj = await getImAdminToken();
  22. if(respTokenObj.errCode==0){
  23. tokenData = respTokenObj.data;
  24. token=tokenData.token;
  25. uni.setStorageSync("IMAdminToken",token);
  26. }
  27. }
  28. data = await imAccountCheck(userID);
  29. if(data.results.lenth>0){
  30. uni.setStorage({key: "IMUserID",data: userID});
  31. hasReg=true;
  32. }
  33. data={hasReg:hasReg};
  34. resolve(data);
  35. } catch (e) {
  36. reject(e);
  37. }
  38. });
  39. };
  40. export const getImUserTokenReq = async (userID, maxRetries = 3) => {
  41. for (let attempt = 1; attempt <= maxRetries; attempt++) {
  42. try {
  43. await ensureAdminToken();
  44. const userTokenData = await getImUserToken(userID);
  45. console.log("qxj getImUserTokenReq userTokenData",userTokenData);
  46. uni.setStorage({ key: 'IMToken', data: userTokenData.token });
  47. uni.setStorage({ key: 'IMUserID', data: userID });
  48. return userTokenData;
  49. } catch (err) {
  50. console.log("qxj getImUserTokenReq err",err);
  51. const isExpired = err?.errCode === 1501 || /TokenExpired/i.test(err?.errMsg || '');
  52. if (!isExpired || attempt === maxRetries) {
  53. console.error('获取 IM 用户 token 失败:', err);
  54. throw err;
  55. }
  56. // 刷新管理员 token 后重试
  57. uni.removeStorageSync('IMAdminToken');
  58. try { await ensureAdminToken(); } catch (_) {}
  59. await delay(Math.min(1000 * attempt, 3000));
  60. }
  61. }
  62. };
  63. export const registerImUserReq = async (userID, nickname, faceURL, maxRetries = 3) => {
  64. for (let attempt = 1; attempt <= maxRetries; attempt++) {
  65. try {
  66. await ensureAdminToken();
  67. const params = { users: [{ userID, nickname, faceURL }] };
  68. await registerImUser(params);
  69. const data = await getImUserToken(userID);
  70. uni.setStorage({ key: 'IMToken', data: data.token });
  71. uni.setStorage({ key: 'IMUserID', data: userID });
  72. return data;
  73. } catch (err) {
  74. const isExpired = err?.errCode === 1501 || /TokenExpired/i.test(err?.errMsg || '');
  75. if (!isExpired || attempt === maxRetries) {
  76. console.error('注册 IM 用户失败:', err);
  77. throw err;
  78. }
  79. uni.removeStorageSync('IMAdminToken');
  80. try { await ensureAdminToken(); } catch (_) {}
  81. await delay(Math.min(1000 * attempt, 3000));
  82. }
  83. }
  84. };
  85. export const updateImUserReq = async (userID, nickname, faceURL, maxRetries = 3) => {
  86. for (let attempt = 1; attempt <= maxRetries; attempt++) {
  87. try {
  88. await ensureAdminToken();
  89. const params = { userInfo: { userID, nickname, faceURL } };
  90. await updateImUser(params);
  91. const data = await getImUserToken(userID);
  92. uni.setStorage({ key: 'IMToken', data: data.token });
  93. uni.setStorage({ key: 'IMUserID', data: userID });
  94. return data;
  95. } catch (err) {
  96. const isExpired = err?.errCode === 1501 || /TokenExpired/i.test(err?.errMsg || '');
  97. if (!isExpired || attempt === maxRetries) {
  98. console.error('更新 IM 用户失败:', err);
  99. throw err;
  100. }
  101. uni.removeStorageSync('IMAdminToken');
  102. try { await ensureAdminToken(); } catch (_) {}
  103. await delay(Math.min(1000 * attempt, 3000));
  104. }
  105. }
  106. };
  107. export const openImLoginApi =async (data,IMToken,IMUserID,succCallBack,failCallBack) => {
  108. console.log("----qxj IMUserID:"+IMUserID+" IMToken:"+IMToken);
  109. let userID=data.userID;
  110. let nickName=data.nickName;
  111. let faceURL=data.avatar;
  112. if(!!IMUserID || !!IMToken){
  113. getImUserTokenReq(IMUserID).then(res => {
  114. updateImUserReq(userID,nickName,faceURL).then(res1 => {
  115. succCallBack(res.token);
  116. },
  117. rej => {
  118. failCallBack();
  119. }
  120. ).catch((res) => {
  121. failCallBack();
  122. });
  123. },
  124. rej => {
  125. if(rej.errCode==1004 && rej.errMsg=="RecordNotFoundError"){ //未找到
  126. registerImUserReq(userID,nickName,faceURL).then(res => {
  127. succCallBack();
  128. },
  129. rej => {
  130. failCallBack();
  131. }
  132. ).catch((res) => {
  133. failCallBack();
  134. });
  135. }
  136. }
  137. ).catch((err) => {
  138. failCallBack();
  139. });
  140. }
  141. else{
  142. registerImUserReq(userID,nickName,faceURL).then(res => {
  143. succCallBack();
  144. },
  145. rej => {
  146. failCallBack();
  147. }
  148. ).catch(() => {
  149. });
  150. }
  151. };