imBll.js 5.5 KB

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