import { IM_HTTP, OA_BASE } from './config.js' function unwrap(json) { if (!json || typeof json !== 'object') return json const code = json.code if (code != null && code !== 0 && code !== 200) { const err = new Error(json.message || '请求失败') err.status = code throw err } return Object.prototype.hasOwnProperty.call(json, 'data') ? json.data : json } export function request(path, { method = 'GET', data, token } = {}) { const url = path.startsWith('http') ? path : `${IM_HTTP}${path.startsWith('/') ? path : '/' + path}` return new Promise((resolve, reject) => { uni.request({ url, method, data, timeout: 20000, header: { Accept: 'application/json', ...(data != null ? { 'Content-Type': 'application/json' } : {}), ...(token ? { Authorization: `Bearer ${token}` } : {}) }, success(res) { const body = res.data if (res.statusCode >= 400) { const msg = body && body.message ? body.message : `HTTP ${res.statusCode}` const err = new Error(msg) err.status = res.statusCode reject(err) return } try { resolve(unwrap(body)) } catch (e) { reject(e) } }, fail(e) { reject(new Error((e && e.errMsg) || '网络异常')) } }) }) } export function loginOptions() { return request('/api/im/sms/login-options') } export function login(body) { return request('/api/im/login', { method: 'POST', data: body }) } export function sendLoginCode(account) { return request('/api/im/sms/login-code', { method: 'POST', data: { account } }) } export function changePassword(body, token) { return request('/api/im/change-password', { method: 'POST', data: body, token }) } export function bootstrap(token) { return request('/api/im/bootstrap', { token }) } export function messages(sessionId, token) { return request(`/api/im/messages?sessionId=${encodeURIComponent(sessionId)}`, { token }) } export function markRead(sessionId, token) { return request('/api/im/read', { method: 'POST', data: { sessionId }, token }) } export function createGroup(body, token) { return request('/api/im/groups', { method: 'POST', data: body, token }) } export function sessionAction(body, token) { return request('/api/im/sessions/action', { method: 'POST', data: body, token }) } export function recall(body, token) { return request('/api/im/recall', { method: 'POST', data: body, token }) } export function livekitToken(body, token) { return request('/api/im/livekit/token', { method: 'POST', data: body, token }) } export function oaGet(path, token) { return request(`/api/im/oa${path}`, { token }) } export function oaPost(path, data, token) { return request(`/api/im/oa${path}`, { method: 'POST', data, token }) } export function oaPut(path, data, token) { return request(`/api/im/oa${path}`, { method: 'PUT', data, token }) } export function absUrl(path) { if (!path) return '' const s = String(path) if (s.startsWith('http') || s.startsWith('data:') || s.startsWith('blob:')) return s // 证件照 / 附件票在 OA 域名,不能拼到 /im 后面 if ( s.startsWith('/api/org/') || s.startsWith('/api/files') || s.startsWith('/api/auth/') || s.startsWith('/api/profile/') || s.startsWith('/api/hr/') ) { return `${OA_BASE}${s}` } const base = IM_HTTP || OA_BASE return s.startsWith('/') ? `${base}${s}` : `${base}/${s}` } /** 证件照完整地址:优先 avatar 票,否则用用户 ID 拼 org/photo(需票,一般走 refreshPeoplePhotos) */ export function photoUrl(raw) { if (!raw) return '' if (typeof raw === 'string') return absUrl(raw) const av = raw.avatar || raw.photo || raw.faceUrl || '' if (av) return absUrl(av) return '' }