import type { FirmInfo, Lawyer } from '../types/card'; import { request } from '../utils/http'; interface OpenFirmResponse { name: string; logo: string; heroImage: string; intro: string; hotlinePhone: string; hqAddress: string; hqLatitude: number; hqLongitude: number; officeCount: number; lawyerCount: number; officeList: string[]; practiceAreas: string[]; } interface OpenCardListItem { id: number; name: string; title: string; office: string; phone: string; email: string; avatar: string; specialties: string[]; } interface OpenCardDetailResponse { id: number; name: string; title: string; office: string; phone: string; email: string; address: string; avatar: string; coverImage: string; wechatQrImage: string; bio: string; specialties: string[]; firmName: string; firmAddress: string; firmLatitude: number; firmLongitude: number; } function toFirmInfo(payload: OpenFirmResponse): FirmInfo { return { id: payload.name || 'firm', name: payload.name || '', logo: payload.logo || '', intro: payload.intro || '', hotlinePhone: payload.hotlinePhone || '', hqAddress: payload.hqAddress || '', hqLatitude: payload.hqLatitude || 0, hqLongitude: payload.hqLongitude || 0, officeCount: payload.officeCount || 0, lawyerCount: payload.lawyerCount || 0, heroImage: payload.heroImage || '', officeList: payload.officeList || [], practiceAreas: payload.practiceAreas || [], }; } function toLawyer(payload: OpenCardListItem | OpenCardDetailResponse): Lawyer { return { id: String(payload.id), name: payload.name || '', title: payload.title || '', office: payload.office || '', phone: payload.phone || '', email: payload.email || '', address: 'address' in payload ? payload.address || '' : '', avatar: payload.avatar || '', coverImage: 'coverImage' in payload ? payload.coverImage || '' : '', specialties: payload.specialties || [], bio: 'bio' in payload ? payload.bio || '' : '', wechatQrImage: 'wechatQrImage' in payload ? payload.wechatQrImage || '' : '', }; } export async function getFirmProfile(): Promise { const payload = await request({ url: '/api/open/firm/profile', }); return toFirmInfo(payload); } export async function listLawyers(params: { keyword?: string; office?: string; practiceArea?: string; }): Promise { const query = Object.entries(params) .filter(([, value]) => Boolean(value)) .map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(value as string)}`) .join('&'); const payload = await request({ url: `/api/open/cards${query ? `?${query}` : ''}`, }); return payload.map((item) => toLawyer(item)); } export async function getLawyerDetail(cardId: string, sourceType = 'DIRECT', shareFromCardId = ''): Promise<{ firm: FirmInfo; lawyer: Lawyer; }> { const queryParts = [`sourceType=${encodeURIComponent(sourceType)}`]; if (shareFromCardId) { queryParts.push(`shareFromCardId=${encodeURIComponent(shareFromCardId)}`); } const payload = await request({ url: `/api/open/cards/${encodeURIComponent(cardId)}?${queryParts.join('&')}`, }); return { firm: { id: payload.firmName || 'firm', name: payload.firmName || '', logo: '', intro: '', hotlinePhone: '', hqAddress: payload.firmAddress || '', hqLatitude: payload.firmLatitude || 0, hqLongitude: payload.firmLongitude || 0, officeCount: 0, lawyerCount: 0, heroImage: '', officeList: [], practiceAreas: [], }, lawyer: toLawyer(payload), }; } export async function recordCardShare(cardId: string, sharePath: string): Promise { await request({ url: `/api/open/cards/${encodeURIComponent(cardId)}/share`, method: 'POST', data: { shareChannel: 'WECHAT_FRIEND', sharePath, }, }); }