@quantabit/friend-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../src/services/friendApi.js","../src/i18n/index.js","../src/context/FriendContext.jsx","../src/types/index.js","../src/components/FriendCard.jsx","../src/components/AddFriendButton.jsx","../src/index.js"],"sourcesContent":["/**\n * Friend SDK - API 客户端\n * 好友系统后端接口封装\n * \n * 使用 BaseApiClient 基类简化代码\n */\n\nimport { BaseApiClient } from '@quantabit/sdk-config';\n\n/**\n * 好友 API 客户端\n */\nexport class FriendApiClient extends BaseApiClient {\n constructor(config = {}) {\n super('/friend', config);\n }\n\n // ============ 好友列表 ============\n\n /**\n * 获取好友列表\n * @param {Object} params - 查询参数\n */\n async getFriends(params = {}) {\n return this.get('/list', params);\n }\n\n /**\n * 搜索好友\n * @param {string} keyword - 关键词\n */\n async searchFriends(keyword) {\n return this.get('/search', { keyword });\n }\n\n /**\n * 获取在线好友\n */\n async getOnlineFriends() {\n return this.get('/online');\n }\n\n /**\n * 获取好友分组\n */\n async getFriendGroups() {\n return this.get('/groups');\n }\n\n /**\n * 按分组获取好友\n * @param {string} groupId - 分组 ID\n */\n async getFriendsByGroup(groupId) {\n return this.get(`/groups/${groupId}/friends`);\n }\n\n // ============ 好友申请 ============\n\n /**\n * 发送好友申请\n * @param {string} userId - 目标用户 ID\n * @param {string} message - 申请消息\n */\n async sendRequest(userId, message = '') {\n return this.post('/request', { user_id: userId, message });\n }\n\n /**\n * 获取收到的申请\n * @param {Object} params - 查询参数\n */\n async getReceivedRequests(params = {}) {\n return this.get('/requests/received', params);\n }\n\n /**\n * 获取发出的申请\n * @param {Object} params - 查询参数\n */\n async getSentRequests(params = {}) {\n return this.get('/requests/sent', params);\n }\n\n /**\n * 接受好友申请\n * @param {string} requestId - 申请 ID\n */\n async acceptRequest(requestId) {\n return this.post(`/requests/${requestId}/accept`);\n }\n\n /**\n * 拒绝好友申请\n * @param {string} requestId - 申请 ID\n */\n async rejectRequest(requestId) {\n return this.post(`/requests/${requestId}/reject`);\n }\n\n /**\n * 取消好友申请\n * @param {string} requestId - 申请 ID\n */\n async cancelRequest(requestId) {\n return this.delete(`/requests/${requestId}`);\n }\n\n // ============ 好友操作 ============\n\n /**\n * 删除好友\n * @param {string} friendId - 好友 ID\n */\n async removeFriend(friendId) {\n return this.delete(`/${friendId}`);\n }\n\n /**\n * 设置好友备注\n * @param {string} friendId - 好友 ID\n * @param {string} remark - 备注名\n */\n async setRemark(friendId, remark) {\n return this.put(`/${friendId}/remark`, { remark });\n }\n\n /**\n * 移动好友到分组\n * @param {string} friendId - 好友 ID\n * @param {string} groupId - 分组 ID\n */\n async moveToGroup(friendId, groupId) {\n return this.put(`/${friendId}/group`, { group_id: groupId });\n }\n\n /**\n * 置顶好友\n * @param {string} friendId - 好友 ID\n * @param {boolean} pinned - 是否置顶\n */\n async pinFriend(friendId, pinned) {\n return this.put(`/${friendId}/pin`, { pinned });\n }\n\n // ============ 黑名单 ============\n\n /**\n * 获取黑名单\n */\n async getBlacklist() {\n return this.get('/blacklist');\n }\n\n /**\n * 拉黑用户\n * @param {string} userId - 用户 ID\n */\n async block(userId) {\n return this.post('/blacklist', { user_id: userId });\n }\n\n /**\n * 拉黑用户(兼容 SDK 顶层便捷方法命名)\n * @param {string} userId - 用户 ID\n */\n async blockUser(userId) {\n return this.block(userId);\n }\n\n /**\n * 取消拉黑\n * @param {string} userId - 用户 ID\n */\n async unblock(userId) {\n return this.delete(`/blacklist/${userId}`);\n }\n\n // ============ 分组管理 ============\n\n /**\n * 创建分组\n * @param {string} name - 分组名称\n */\n async createGroup(name) {\n return this.post('/groups', { name });\n }\n\n /**\n * 更新分组\n * @param {string} groupId - 分组 ID\n * @param {string} name - 新名称\n */\n async updateGroup(groupId, name) {\n return this.put(`/groups/${groupId}`, { name });\n }\n\n /**\n * 删除分组\n * @param {string} groupId - 分组 ID\n */\n async deleteGroup(groupId) {\n return this.delete(`/groups/${groupId}`);\n }\n\n // ============ 推荐 ============\n\n /**\n * 获取可能认识的人\n * @param {number} limit - 返回数量\n */\n async getPeopleYouMayKnow(limit = 10) {\n return this.get('/suggestions', { limit });\n }\n}\n\n// 创建默认实例\nexport const friendApi = new FriendApiClient();\n\n\n\nexport default friendApi;\n","/**\n * Friend SDK - 国际化 i18n\n */\n\nexport const SUPPORTED_LANGUAGES = ['en', 'zh', 'ja', 'ko'];\n\nexport const messages = {\n zh: {\n loading: '加载中...',\n friends: '好友',\n myFriends: '我的好友',\n friendRequests: '好友请求',\n \n // 关系状态\n statusFriend: '已是好友',\n statusPending: '待确认',\n statusBlocked: '已拉黑',\n statusStranger: '陌生人',\n \n // 亲密度\n intimacyLv1: '普通好友',\n intimacyLv2: '熟人',\n intimacyLv3: '闺蜜/兄弟',\n intimacyLv4: '挚友',\n intimacy: '亲密度',\n \n // 操作\n addFriend: '加好友',\n acceptRequest: '接受',\n rejectRequest: '拒绝',\n unfriend: '删除好友',\n block: '拉黑',\n unblock: '取消拉黑',\n sendMessage: '发消息',\n viewProfile: '查看资料',\n \n // 表单\n addNote: '添加备注',\n remarkPlaceholder: '给好友一个备注',\n requestMessage: '验证消息',\n messagePlaceholder: '向对方介绍自己',\n \n // 提示\n requestSent: '好友请求已发送',\n requestAccepted: '已添加好友',\n unfriendSuccess: '已删除好友',\n blocked: '已拉黑',\n noFriends: '暂无好友',\n noRequests: '暂无好友请求',\n \n // 搜索\n searchFriends: '搜索好友',\n searchPlaceholder: '输入昵称或ID搜索',\n \n // 分组\n groups: '分组',\n defaultGroup: '默认分组',\n newGroup: '新建分组',\n },\n ja: {\n loading: '読み込み中...',\n friends: 'フレンド',\n myFriends: 'マイフレンド',\n friendRequests: 'フレンドリクエスト',\n \n // 关系状态\n statusFriend: 'フレンドです',\n statusPending: '確認待ち',\n statusBlocked: 'ブロック済み',\n statusStranger: '見知らぬ人',\n \n // 亲密度\n intimacyLv1: '普通のフレンド',\n intimacyLv2: '知人',\n intimacyLv3: '親友',\n intimacyLv4: '大親友',\n intimacy: '親密度',\n \n // 操作\n addFriend: 'フレンド追加',\n acceptRequest: '承認',\n rejectRequest: '拒否',\n unfriend: 'フレンド削除',\n block: 'ブロック',\n unblock: 'ブロック解除',\n sendMessage: 'メッセージ送信',\n viewProfile: 'プロフィールを見る',\n \n // 表单\n addNote: 'メモを追加',\n remarkPlaceholder: 'フレンドにメモを追加',\n requestMessage: '認証メッセージ',\n messagePlaceholder: '自己紹介を記入',\n \n // 提示\n requestSent: 'フレンドリクエスト送信済み',\n requestAccepted: 'フレンドを追加しました',\n unfriendSuccess: 'フレンドを削除しました',\n blocked: 'ブロック済み',\n noFriends: 'フレンドなし',\n noRequests: 'フレンドリクエストなし',\n \n // 搜索\n searchFriends: 'フレンド検索',\n searchPlaceholder: 'ニックネームまたはIDで検索',\n \n // 分组\n groups: 'グループ',\n defaultGroup: 'デフォルトグループ',\n newGroup: '新しいグループ',\n },\n ko: {\n loading: '로딩 중...',\n friends: '친구',\n myFriends: '내 친구',\n friendRequests: '친구 요청',\n \n // 关系状态\n statusFriend: '이미 친구입니다',\n statusPending: '확인 대기 중',\n statusBlocked: '차단됨',\n statusStranger: '낯선 사람',\n \n // 亲密度\n intimacyLv1: '일반 친구',\n intimacyLv2: '지인',\n intimacyLv3: '절친',\n intimacyLv4: '베스트 프렌드',\n intimacy: '친밀도',\n \n // 操作\n addFriend: '친구 추가',\n acceptRequest: '수락',\n rejectRequest: '거부',\n unfriend: '친구 삭제',\n block: '차단',\n unblock: '차단 해제',\n sendMessage: '메시지 보내기',\n viewProfile: '프로필 보기',\n \n // 表单\n addNote: '메모 추가',\n remarkPlaceholder: '친구에게 메모 남기기',\n requestMessage: '인증 메시지',\n messagePlaceholder: '자신을 소개하세요',\n \n // 提示\n requestSent: '친구 요청을 보냈습니다',\n requestAccepted: '친구를 추가했습니다',\n unfriendSuccess: '친구를 삭제했습니다',\n blocked: '차단됨',\n noFriends: '친구 없음',\n noRequests: '친구 요청 없음',\n \n // 搜索\n searchFriends: '친구 검색',\n searchPlaceholder: '닉네임 또는 ID로 검색',\n \n // 分组\n groups: '그룹',\n defaultGroup: '기본 그룹',\n newGroup: '새 그룹',\n },\n \n en: {\n loading: 'Loading...',\n friends: 'Friends',\n myFriends: 'My Friends',\n friendRequests: 'Requests',\n \n statusFriend: 'Friends',\n statusPending: 'Pending',\n statusBlocked: 'Blocked',\n statusStranger: 'Stranger',\n \n intimacyLv1: 'Acquaintance',\n intimacyLv2: 'Friend',\n intimacyLv3: 'Close Friend',\n intimacyLv4: 'Best Friend',\n intimacy: 'Intimacy',\n \n addFriend: 'Add Friend',\n acceptRequest: 'Accept',\n rejectRequest: 'Decline',\n unfriend: 'Unfriend',\n block: 'Block',\n unblock: 'Unblock',\n sendMessage: 'Message',\n viewProfile: 'Profile',\n \n addNote: 'Add Note',\n remarkPlaceholder: 'Add a nickname',\n requestMessage: 'Message',\n messagePlaceholder: 'Introduce yourself',\n \n requestSent: 'Request sent',\n requestAccepted: 'Friend added',\n unfriendSuccess: 'Friend removed',\n blocked: 'Blocked',\n noFriends: 'No friends',\n noRequests: 'No requests',\n \n searchFriends: 'Search Friends',\n searchPlaceholder: 'Search by name or ID',\n \n groups: 'Groups',\n defaultGroup: 'Default',\n newGroup: 'New Group',\n },\n};\n\nlet currentLanguage = 'zh';\n\nexport function setLanguage(lang) {\n if (SUPPORTED_LANGUAGES.includes(lang)) currentLanguage = lang;\n}\n\nexport function getLanguage() {\n return currentLanguage;\n}\n\nexport function t(key, params) {\n const msgs = messages[getLanguage()] || messages.zh;\n let text = msgs[key] || key;\n if (params) {\n Object.keys(params).forEach(k => {\n text = text.replace(new RegExp(`\\\\{${k}\\\\}`, 'g'), params[k]);\n });\n }\n return text;\n}\n\nexport default { messages, SUPPORTED_LANGUAGES, setLanguage, getLanguage, t };\n","/**\n * Friend SDK - Context Provider\n */\n\nimport React, { createContext, useContext, useState, useCallback, useEffect } from 'react';\nimport { friendApi } from '../services/friendApi';\nimport { setLanguage } from '../i18n';\n\nconst FriendContext = createContext(null);\n\nexport function FriendProvider({ \n children, \n apiUrl, \n token, \n language = 'zh',\n onRequest,\n onAccept,\n onError,\n}) {\n const [friends, setFriends] = useState([]);\n const [requests, setRequests] = useState([]);\n const [blocklist, setBlocklist] = useState([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState(null);\n\n useEffect(() => {\n if (apiUrl) friendApi.setBaseUrl(apiUrl);\n if (token) friendApi.setToken(token);\n if (language) setLanguage(language);\n }, [apiUrl, token, language]);\n\n const handleError = useCallback((err) => {\n setError(err.message);\n onError?.(err);\n }, [onError]);\n\n // 加载好友列表\n const loadFriends = useCallback(async (params = {}) => {\n setLoading(true);\n try {\n const result = await friendApi.getFriends(params);\n const items = result.items || result.data || result || [];\n setFriends(items);\n return items;\n } catch (err) {\n handleError(err);\n } finally {\n setLoading(false);\n }\n }, [handleError]);\n\n // 加载好友请求\n const loadRequests = useCallback(async () => {\n try {\n const result = await friendApi.getRequests();\n const items = result.items || result.data || result || [];\n setRequests(items);\n return items;\n } catch (err) {\n handleError(err);\n }\n }, [handleError]);\n\n // 发送好友请求\n const sendRequest = useCallback(async (userId, message = '') => {\n setLoading(true);\n try {\n const result = await friendApi.sendRequest(userId, { message });\n onRequest?.(result);\n return result;\n } catch (err) {\n handleError(err);\n throw err;\n } finally {\n setLoading(false);\n }\n }, [handleError, onRequest]);\n\n // 接受好友请求\n const acceptRequest = useCallback(async (requestId) => {\n try {\n const result = await friendApi.acceptRequest(requestId);\n setRequests(prev => prev.filter(r => r.id !== requestId));\n await loadFriends();\n onAccept?.(result);\n return result;\n } catch (err) {\n handleError(err);\n throw err;\n }\n }, [handleError, loadFriends, onAccept]);\n\n // 拒绝好友请求\n const rejectRequest = useCallback(async (requestId) => {\n try {\n await friendApi.rejectRequest(requestId);\n setRequests(prev => prev.filter(r => r.id !== requestId));\n } catch (err) {\n handleError(err);\n }\n }, [handleError]);\n\n // 删除好友\n const unfriend = useCallback(async (friendId) => {\n try {\n await friendApi.unfriend(friendId);\n setFriends(prev => prev.filter(f => f.id !== friendId));\n } catch (err) {\n handleError(err);\n }\n }, [handleError]);\n\n // 拉黑用户\n const blockUser = useCallback(async (userId) => {\n try {\n await friendApi.block(userId);\n setFriends(prev => prev.filter(f => f.id !== userId));\n await loadBlocklist();\n } catch (err) {\n handleError(err);\n }\n }, [handleError]);\n\n // 加载黑名单\n const loadBlocklist = useCallback(async () => {\n try {\n const result = await friendApi.getBlocklist();\n const items = result.items || result.data || result || [];\n setBlocklist(items);\n return items;\n } catch (err) {\n handleError(err);\n }\n }, [handleError]);\n\n // 取消拉黑\n const unblockUser = useCallback(async (userId) => {\n try {\n await friendApi.unblock(userId);\n setBlocklist(prev => prev.filter(u => u.id !== userId));\n } catch (err) {\n handleError(err);\n }\n }, [handleError]);\n\n const value = {\n friends,\n requests,\n blocklist,\n loading,\n error,\n loadFriends,\n loadRequests,\n sendRequest,\n acceptRequest,\n rejectRequest,\n unfriend,\n blockUser,\n loadBlocklist,\n unblockUser,\n api: friendApi,\n };\n\n return (\n <FriendContext.Provider value={value}>\n {children}\n </FriendContext.Provider>\n );\n}\n\nexport function useFriend() {\n const context = useContext(FriendContext);\n if (!context) {\n throw new Error('useFriend must be used within a FriendProvider');\n }\n return context;\n}\n\nexport default FriendContext;\n","/**\n * Friend SDK - 类型定义\n */\n\n// 好友状态\nexport const FriendStatus = {\n NONE: 'none',\n PENDING: 'pending',\n ACCEPTED: 'accepted',\n BLOCKED: 'blocked',\n};\n\n// 亲密度等级\nexport const IntimacyLevel = {\n STRANGER: 'stranger',\n ACQUAINTANCE: 'acquaintance',\n FRIEND: 'friend',\n CLOSE_FRIEND: 'close_friend',\n BEST_FRIEND: 'best_friend',\n};\n\n// 请求来源\nexport const RequestSource = {\n SEARCH: 'search',\n QR_CODE: 'qr_code',\n NEARBY: 'nearby',\n GROUP: 'group',\n RECOMMEND: 'recommend',\n};\n\n// 亲密度配置\nexport const IntimacyConfig = {\n 1: { level: 1, label: 'intimacyLv1', icon: '🤝', color: '#8c8c8c' },\n 2: { level: 2, label: 'intimacyLv2', icon: '💚', color: '#52c41a' },\n 3: { level: 3, label: 'intimacyLv3', icon: '💙', color: '#1890ff' },\n 4: { level: 4, label: 'intimacyLv4', icon: '💜', color: '#722ed1' },\n};\n\n// 获取亲密度配置\nexport function getIntimacyConfig(level) {\n return IntimacyConfig[level] || IntimacyConfig[1];\n}\n\nexport default { FriendStatus, IntimacyLevel, RequestSource, IntimacyConfig, getIntimacyConfig };\n","/**\n * Friend SDK - FriendCard 组件\n * 好友卡片\n */\n\nimport React, { useState } from 'react';\nimport { t } from '../i18n';\nimport { useFriend } from '../context/FriendContext';\nimport { IntimacyLevel, getIntimacyConfig } from '../types';\n\nexport function FriendCard({\n friend,\n showIntimacy = true,\n showActions = true,\n onMessage,\n onProfile,\n className = '',\n}) {\n const { unfriend, blockUser, loading } = useFriend();\n const [showMenu, setShowMenu] = useState(false);\n\n const intimacyConfig = getIntimacyConfig(friend.intimacy || 1);\n\n const handleUnfriend = async () => {\n if (!confirm('确认删除好友?')) return;\n await unfriend(friend.id);\n setShowMenu(false);\n };\n\n const handleBlock = async () => {\n if (!confirm('确认拉黑该用户?')) return;\n await blockUser(friend.id);\n setShowMenu(false);\n };\n\n return (\n <div className={`friend-card ${className}`}>\n <div className=\"friend-avatar\">\n {friend.avatar ? (\n <img src={friend.avatar} alt={friend.nickname} />\n ) : (\n <span className=\"avatar-placeholder\">\n {friend.nickname?.charAt(0) || '?'}\n </span>\n )}\n {friend.online && <span className=\"online-dot\" />}\n </div>\n\n <div className=\"friend-info\">\n <div className=\"friend-name\">\n <span className=\"nickname\">{friend.remark || friend.nickname}</span>\n {friend.remark && (\n <span className=\"original-name\">({friend.nickname})</span>\n )}\n </div>\n \n {showIntimacy && (\n <div className=\"friend-intimacy\" style={{ color: intimacyConfig.color }}>\n <span className=\"intimacy-icon\">{intimacyConfig.icon}</span>\n <span className=\"intimacy-label\">{t(intimacyConfig.label)}</span>\n </div>\n )}\n </div>\n\n {showActions && (\n <div className=\"friend-actions\">\n <button \n className=\"btn-action btn-message\"\n onClick={() => onMessage?.(friend)}\n >\n 💬\n </button>\n \n <button \n className=\"btn-action btn-more\"\n onClick={() => setShowMenu(!showMenu)}\n >\n ⋮\n </button>\n\n {showMenu && (\n <div className=\"action-menu\">\n <button onClick={() => onProfile?.(friend)}>\n {t('viewProfile')}\n </button>\n <button onClick={handleUnfriend} disabled={loading}>\n {t('unfriend')}\n </button>\n <button onClick={handleBlock} className=\"danger\" disabled={loading}>\n {t('block')}\n </button>\n </div>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport default FriendCard;\n","/**\n * Friend SDK - AddFriendButton 组件\n * 添加好友按钮\n */\n\nimport React, { useState } from 'react';\nimport { t } from '../i18n';\nimport { useFriend } from '../context/FriendContext';\n\nexport function AddFriendButton({\n userId,\n status = 'stranger', // 'stranger' | 'pending' | 'friend' | 'blocked'\n onSuccess,\n className = '',\n}) {\n const { sendRequest, loading } = useFriend();\n const [showModal, setShowModal] = useState(false);\n const [message, setMessage] = useState('');\n const [sent, setSent] = useState(false);\n\n const getButtonConfig = () => {\n switch (status) {\n case 'friend':\n return { text: t('statusFriend'), disabled: true, icon: '✓' };\n case 'pending':\n return { text: t('statusPending'), disabled: true, icon: '⏳' };\n case 'blocked':\n return { text: t('statusBlocked'), disabled: true, icon: '🚫' };\n default:\n return { text: t('addFriend'), disabled: false, icon: '➕' };\n }\n };\n\n const config = getButtonConfig();\n\n const handleClick = () => {\n if (status === 'stranger') {\n setShowModal(true);\n }\n };\n\n const handleSend = async () => {\n try {\n await sendRequest(userId, message);\n setSent(true);\n setShowModal(false);\n onSuccess?.();\n } catch (err) {\n // 错误已在 Context 中处理\n }\n };\n\n if (sent) {\n return (\n <button className={`add-friend-btn sent ${className}`} disabled>\n <span className=\"btn-icon\">✓</span>\n <span>{t('requestSent')}</span>\n </button>\n );\n }\n\n return (\n <>\n <button\n className={`add-friend-btn ${status} ${className}`}\n onClick={handleClick}\n disabled={config.disabled || loading}\n >\n <span className=\"btn-icon\">{config.icon}</span>\n <span>{config.text}</span>\n </button>\n\n {showModal && (\n <div className=\"add-friend-modal-overlay\" onClick={() => setShowModal(false)}>\n <div className=\"add-friend-modal\" onClick={e => e.stopPropagation()}>\n <h3>{t('addFriend')}</h3>\n <div className=\"form-group\">\n <label>{t('requestMessage')}</label>\n <textarea\n value={message}\n onChange={e => setMessage(e.target.value)}\n placeholder={t('messagePlaceholder')}\n rows={3}\n maxLength={100}\n />\n </div>\n <div className=\"modal-actions\">\n <button className=\"btn-cancel\" onClick={() => setShowModal(false)}>\n 取消\n </button>\n <button \n className=\"btn-primary\" \n onClick={handleSend}\n disabled={loading}\n >\n {loading ? t('loading') : '发送请求'}\n </button>\n </div>\n </div>\n </div>\n )}\n </>\n );\n}\n\nexport default AddFriendButton;\n","/**\n * @quantabit/friend-sdk\n * \n * QuantaBit Friend System SDK\n * \n * Features:\n * - Strong-relation friend management\n * - Intimacy system\n * - Friend requests\n * - Blocklist management\n */\n\n// ============ Context & Hooks ============\nexport { FriendProvider, useFriend } from './context/FriendContext';\n\n// ============ Components ============\nexport { FriendCard } from './components/FriendCard';\nexport { AddFriendButton } from './components/AddFriendButton';\n\n// ============ Services ============\nexport { friendApi, FriendApiClient } from './services/friendApi';\n\n// ============ i18n ============\nexport {\n messages,\n SUPPORTED_LANGUAGES,\n setLanguage,\n getLanguage,\n t,\n} from './i18n';\n\n// ============ Types ============\nexport { \n FriendStatus, \n IntimacyLevel, \n RequestSource,\n IntimacyConfig,\n getIntimacyConfig,\n} from './types';\n\n// ============ 便捷方法 ============\nimport { friendApi } from './services/friendApi';\n\nexport const getFriends = (...args) => friendApi.getFriends(...args);\nexport const sendRequest = (...args) => friendApi.sendRequest(...args);\nexport const acceptRequest = (...args) => friendApi.acceptRequest(...args);\nexport const removeFriend = (...args) => friendApi.removeFriend(...args);\nexport const blockUser = (...args) => friendApi.blockUser(...args);\n\n// ============ Styles ============\nimport './styles/main.css';\n"],"names":["FriendApiClient","BaseApiClient","constructor","config","getFriends","params","get","searchFriends","keyword","getOnlineFriends","getFriendGroups","getFriendsByGroup","groupId","sendRequest","userId","message","post","user_id","getReceivedRequests","getSentRequests","acceptRequest","requestId","rejectRequest","cancelRequest","delete","removeFriend","friendId","setRemark","remark","put","moveToGroup","group_id","pinFriend","pinned","getBlacklist","block","blockUser","unblock","createGroup","name","updateGroup","deleteGroup","getPeopleYouMayKnow","limit","friendApi","SUPPORTED_LANGUAGES","messages","zh","loading","friends","myFriends","friendRequests","statusFriend","statusPending","statusBlocked","statusStranger","intimacyLv1","intimacyLv2","intimacyLv3","intimacyLv4","intimacy","addFriend","unfriend","sendMessage","viewProfile","addNote","remarkPlaceholder","requestMessage","messagePlaceholder","requestSent","requestAccepted","unfriendSuccess","blocked","noFriends","noRequests","searchPlaceholder","groups","defaultGroup","newGroup","ja","ko","en","currentLanguage","setLanguage","lang","includes","getLanguage","t","key","msgs","text","Object","keys","forEach","k","replace","RegExp","FriendContext","createContext","FriendProvider","children","apiUrl","token","language","onRequest","onAccept","onError","setFriends","useState","requests","setRequests","blocklist","setBlocklist","setLoading","error","setError","useEffect","setBaseUrl","setToken","handleError","useCallback","err","loadFriends","result","items","data","loadRequests","getRequests","prev","filter","r","id","f","loadBlocklist","getBlocklist","unblockUser","u","value","api","React","createElement","Provider","useFriend","context","useContext","Error","FriendStatus","NONE","PENDING","ACCEPTED","BLOCKED","IntimacyLevel","STRANGER","ACQUAINTANCE","FRIEND","CLOSE_FRIEND","BEST_FRIEND","RequestSource","SEARCH","QR_CODE","NEARBY","GROUP","RECOMMEND","IntimacyConfig","level","label","icon","color","getIntimacyConfig","FriendCard","friend","showIntimacy","showActions","onMessage","onProfile","className","showMenu","setShowMenu","intimacyConfig","handleUnfriend","confirm","handleBlock","avatar","src","alt","nickname","charAt","online","style","onClick","disabled","AddFriendButton","status","onSuccess","showModal","setShowModal","setMessage","sent","setSent","getButtonConfig","handleClick","handleSend","Fragment","e","stopPropagation","onChange","target","placeholder","rows","maxLength","args"],"mappings":";;;AAAA;AACA;AACA;AACA;AACA;AACA;;;AAIA;AACA;AACA;AACO,MAAMA,eAAe,SAASC,aAAa,CAAC;AACjDC,EAAAA,WAAWA,CAACC,MAAM,GAAG,EAAE,EAAE;AACvB,IAAA,KAAK,CAAC,SAAS,EAAEA,MAAM,CAAC;AAC1B,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;AACE,EAAA,MAAMC,UAAUA,CAACC,MAAM,GAAG,EAAE,EAAE;AAC5B,IAAA,OAAO,IAAI,CAACC,GAAG,CAAC,OAAO,EAAED,MAAM,CAAC;AAClC,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAME,aAAaA,CAACC,OAAO,EAAE;AAC3B,IAAA,OAAO,IAAI,CAACF,GAAG,CAAC,SAAS,EAAE;AAAEE,MAAAA;AAAQ,KAAC,CAAC;AACzC,EAAA;;AAEA;AACF;AACA;EACE,MAAMC,gBAAgBA,GAAG;AACvB,IAAA,OAAO,IAAI,CAACH,GAAG,CAAC,SAAS,CAAC;AAC5B,EAAA;;AAEA;AACF;AACA;EACE,MAAMI,eAAeA,GAAG;AACtB,IAAA,OAAO,IAAI,CAACJ,GAAG,CAAC,SAAS,CAAC;AAC5B,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMK,iBAAiBA,CAACC,OAAO,EAAE;AAC/B,IAAA,OAAO,IAAI,CAACN,GAAG,CAAC,CAAA,QAAA,EAAWM,OAAO,UAAU,CAAC;AAC/C,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;AACA;AACE,EAAA,MAAMC,WAAWA,CAACC,MAAM,EAAEC,OAAO,GAAG,EAAE,EAAE;AACtC,IAAA,OAAO,IAAI,CAACC,IAAI,CAAC,UAAU,EAAE;AAAEC,MAAAA,OAAO,EAAEH,MAAM;AAAEC,MAAAA;AAAQ,KAAC,CAAC;AAC5D,EAAA;;AAEA;AACF;AACA;AACA;AACE,EAAA,MAAMG,mBAAmBA,CAACb,MAAM,GAAG,EAAE,EAAE;AACrC,IAAA,OAAO,IAAI,CAACC,GAAG,CAAC,oBAAoB,EAAED,MAAM,CAAC;AAC/C,EAAA;;AAEA;AACF;AACA;AACA;AACE,EAAA,MAAMc,eAAeA,CAACd,MAAM,GAAG,EAAE,EAAE;AACjC,IAAA,OAAO,IAAI,CAACC,GAAG,CAAC,gBAAgB,EAAED,MAAM,CAAC;AAC3C,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMe,aAAaA,CAACC,SAAS,EAAE;AAC7B,IAAA,OAAO,IAAI,CAACL,IAAI,CAAC,CAAA,UAAA,EAAaK,SAAS,SAAS,CAAC;AACnD,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMC,aAAaA,CAACD,SAAS,EAAE;AAC7B,IAAA,OAAO,IAAI,CAACL,IAAI,CAAC,CAAA,UAAA,EAAaK,SAAS,SAAS,CAAC;AACnD,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAME,aAAaA,CAACF,SAAS,EAAE;AAC7B,IAAA,OAAO,IAAI,CAACG,MAAM,CAAC,CAAA,UAAA,EAAaH,SAAS,EAAE,CAAC;AAC9C,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;EACE,MAAMI,YAAYA,CAACC,QAAQ,EAAE;AAC3B,IAAA,OAAO,IAAI,CAACF,MAAM,CAAC,CAAA,CAAA,EAAIE,QAAQ,EAAE,CAAC;AACpC,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACE,EAAA,MAAMC,SAASA,CAACD,QAAQ,EAAEE,MAAM,EAAE;AAChC,IAAA,OAAO,IAAI,CAACC,GAAG,CAAC,CAAA,CAAA,EAAIH,QAAQ,SAAS,EAAE;AAAEE,MAAAA;AAAO,KAAC,CAAC;AACpD,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACE,EAAA,MAAME,WAAWA,CAACJ,QAAQ,EAAEd,OAAO,EAAE;AACnC,IAAA,OAAO,IAAI,CAACiB,GAAG,CAAC,CAAA,CAAA,EAAIH,QAAQ,QAAQ,EAAE;AAAEK,MAAAA,QAAQ,EAAEnB;AAAQ,KAAC,CAAC;AAC9D,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACE,EAAA,MAAMoB,SAASA,CAACN,QAAQ,EAAEO,MAAM,EAAE;AAChC,IAAA,OAAO,IAAI,CAACJ,GAAG,CAAC,CAAA,CAAA,EAAIH,QAAQ,MAAM,EAAE;AAAEO,MAAAA;AAAO,KAAC,CAAC;AACjD,EAAA;;AAEA;;AAEA;AACF;AACA;EACE,MAAMC,YAAYA,GAAG;AACnB,IAAA,OAAO,IAAI,CAAC5B,GAAG,CAAC,YAAY,CAAC;AAC/B,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAM6B,KAAKA,CAACrB,MAAM,EAAE;AAClB,IAAA,OAAO,IAAI,CAACE,IAAI,CAAC,YAAY,EAAE;AAAEC,MAAAA,OAAO,EAAEH;AAAO,KAAC,CAAC;AACrD,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMsB,SAASA,CAACtB,MAAM,EAAE;AACtB,IAAA,OAAO,IAAI,CAACqB,KAAK,CAACrB,MAAM,CAAC;AAC3B,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAMuB,OAAOA,CAACvB,MAAM,EAAE;AACpB,IAAA,OAAO,IAAI,CAACU,MAAM,CAAC,CAAA,WAAA,EAAcV,MAAM,EAAE,CAAC;AAC5C,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;EACE,MAAMwB,WAAWA,CAACC,IAAI,EAAE;AACtB,IAAA,OAAO,IAAI,CAACvB,IAAI,CAAC,SAAS,EAAE;AAAEuB,MAAAA;AAAK,KAAC,CAAC;AACvC,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACE,EAAA,MAAMC,WAAWA,CAAC5B,OAAO,EAAE2B,IAAI,EAAE;AAC/B,IAAA,OAAO,IAAI,CAACV,GAAG,CAAC,CAAA,QAAA,EAAWjB,OAAO,EAAE,EAAE;AAAE2B,MAAAA;AAAK,KAAC,CAAC;AACjD,EAAA;;AAEA;AACF;AACA;AACA;EACE,MAAME,WAAWA,CAAC7B,OAAO,EAAE;AACzB,IAAA,OAAO,IAAI,CAACY,MAAM,CAAC,CAAA,QAAA,EAAWZ,OAAO,EAAE,CAAC;AAC1C,EAAA;;AAEA;;AAEA;AACF;AACA;AACA;AACE,EAAA,MAAM8B,mBAAmBA,CAACC,KAAK,GAAG,EAAE,EAAE;AACpC,IAAA,OAAO,IAAI,CAACrC,GAAG,CAAC,cAAc,EAAE;AAAEqC,MAAAA;AAAM,KAAC,CAAC;AAC5C,EAAA;AACF;;AAEA;MACaC,SAAS,GAAG,IAAI5C,eAAe;;ACzN5C;AACA;AACA;;AAEO,MAAM6C,mBAAmB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;AAEnD,MAAMC,QAAQ,GAAG;AACtBC,EAAAA,EAAE,EAAE;AACFC,IAAAA,OAAO,EAAE,QAAQ;AACjBC,IAAAA,OAAO,EAAE,IAAI;AACbC,IAAAA,SAAS,EAAE,MAAM;AACjBC,IAAAA,cAAc,EAAE,MAAM;AAEtB;AACAC,IAAAA,YAAY,EAAE,MAAM;AACpBC,IAAAA,aAAa,EAAE,KAAK;AACpBC,IAAAA,aAAa,EAAE,KAAK;AACpBC,IAAAA,cAAc,EAAE,KAAK;AAErB;AACAC,IAAAA,WAAW,EAAE,MAAM;AACnBC,IAAAA,WAAW,EAAE,IAAI;AACjBC,IAAAA,WAAW,EAAE,OAAO;AACpBC,IAAAA,WAAW,EAAE,IAAI;AACjBC,IAAAA,QAAQ,EAAE,KAAK;AAEf;AACAC,IAAAA,SAAS,EAAE,KAAK;AAChBzC,IAAAA,aAAa,EAAE,IAAI;AACnBE,IAAAA,aAAa,EAAE,IAAI;AACnBwC,IAAAA,QAAQ,EAAE,MAAM;AAChB3B,IAAAA,KAAK,EAAE,IAAI;AACXE,IAAAA,OAAO,EAAE,MAAM;AACf0B,IAAAA,WAAW,EAAE,KAAK;AAClBC,IAAAA,WAAW,EAAE,MAAM;AAEnB;AACAC,IAAAA,OAAO,EAAE,MAAM;AACfC,IAAAA,iBAAiB,EAAE,SAAS;AAC5BC,IAAAA,cAAc,EAAE,MAAM;AACtBC,IAAAA,kBAAkB,EAAE,SAAS;AAE7B;AACAC,IAAAA,WAAW,EAAE,SAAS;AACtBC,IAAAA,eAAe,EAAE,OAAO;AACxBC,IAAAA,eAAe,EAAE,OAAO;AACxBC,IAAAA,OAAO,EAAE,KAAK;AACdC,IAAAA,SAAS,EAAE,MAAM;AACjBC,IAAAA,UAAU,EAAE,QAAQ;AAEpB;AACAnE,IAAAA,aAAa,EAAE,MAAM;AACrBoE,IAAAA,iBAAiB,EAAE,WAAW;AAE9B;AACAC,IAAAA,MAAM,EAAE,IAAI;AACZC,IAAAA,YAAY,EAAE,MAAM;AACpBC,IAAAA,QAAQ,EAAE;GACX;AACDC,EAAAA,EAAE,EAAE;AACF/B,IAAAA,OAAO,EAAE,UAAU;AACnBC,IAAAA,OAAO,EAAE,MAAM;AACfC,IAAAA,SAAS,EAAE,QAAQ;AACnBC,IAAAA,cAAc,EAAE,WAAW;AAE3B;AACAC,IAAAA,YAAY,EAAE,QAAQ;AACtBC,IAAAA,aAAa,EAAE,MAAM;AACrBC,IAAAA,aAAa,EAAE,QAAQ;AACvBC,IAAAA,cAAc,EAAE,OAAO;AAEvB;AACAC,IAAAA,WAAW,EAAE,SAAS;AACtBC,IAAAA,WAAW,EAAE,IAAI;AACjBC,IAAAA,WAAW,EAAE,IAAI;AACjBC,IAAAA,WAAW,EAAE,KAAK;AAClBC,IAAAA,QAAQ,EAAE,KAAK;AAEf;AACAC,IAAAA,SAAS,EAAE,QAAQ;AACnBzC,IAAAA,aAAa,EAAE,IAAI;AACnBE,IAAAA,aAAa,EAAE,IAAI;AACnBwC,IAAAA,QAAQ,EAAE,QAAQ;AAClB3B,IAAAA,KAAK,EAAE,MAAM;AACbE,IAAAA,OAAO,EAAE,QAAQ;AACjB0B,IAAAA,WAAW,EAAE,SAAS;AACtBC,IAAAA,WAAW,EAAE,WAAW;AAExB;AACAC,IAAAA,OAAO,EAAE,OAAO;AAChBC,IAAAA,iBAAiB,EAAE,YAAY;AAC/BC,IAAAA,cAAc,EAAE,SAAS;AACzBC,IAAAA,kBAAkB,EAAE,SAAS;AAE7B;AACAC,IAAAA,WAAW,EAAE,eAAe;AAC5BC,IAAAA,eAAe,EAAE,aAAa;AAC9BC,IAAAA,eAAe,EAAE,aAAa;AAC9BC,IAAAA,OAAO,EAAE,QAAQ;AACjBC,IAAAA,SAAS,EAAE,QAAQ;AACnBC,IAAAA,UAAU,EAAE,aAAa;AAEzB;AACAnE,IAAAA,aAAa,EAAE,QAAQ;AACvBoE,IAAAA,iBAAiB,EAAE,gBAAgB;AAEnC;AACAC,IAAAA,MAAM,EAAE,MAAM;AACdC,IAAAA,YAAY,EAAE,WAAW;AACzBC,IAAAA,QAAQ,EAAE;GACX;AACDE,EAAAA,EAAE,EAAE;AACFhC,IAAAA,OAAO,EAAE,SAAS;AAClBC,IAAAA,OAAO,EAAE,IAAI;AACbC,IAAAA,SAAS,EAAE,MAAM;AACjBC,IAAAA,cAAc,EAAE,OAAO;AAEvB;AACAC,IAAAA,YAAY,EAAE,UAAU;AACxBC,IAAAA,aAAa,EAAE,SAAS;AACxBC,IAAAA,aAAa,EAAE,KAAK;AACpBC,IAAAA,cAAc,EAAE,OAAO;AAEvB;AACAC,IAAAA,WAAW,EAAE,OAAO;AACpBC,IAAAA,WAAW,EAAE,IAAI;AACjBC,IAAAA,WAAW,EAAE,IAAI;AACjBC,IAAAA,WAAW,EAAE,SAAS;AACtBC,IAAAA,QAAQ,EAAE,KAAK;AAEf;AACAC,IAAAA,SAAS,EAAE,OAAO;AAClBzC,IAAAA,aAAa,EAAE,IAAI;AACnBE,IAAAA,aAAa,EAAE,IAAI;AACnBwC,IAAAA,QAAQ,EAAE,OAAO;AACjB3B,IAAAA,KAAK,EAAE,IAAI;AACXE,IAAAA,OAAO,EAAE,OAAO;AAChB0B,IAAAA,WAAW,EAAE,SAAS;AACtBC,IAAAA,WAAW,EAAE,QAAQ;AAErB;AACAC,IAAAA,OAAO,EAAE,OAAO;AAChBC,IAAAA,iBAAiB,EAAE,aAAa;AAChCC,IAAAA,cAAc,EAAE,QAAQ;AACxBC,IAAAA,kBAAkB,EAAE,WAAW;AAE/B;AACAC,IAAAA,WAAW,EAAE,cAAc;AAC3BC,IAAAA,eAAe,EAAE,YAAY;AAC7BC,IAAAA,eAAe,EAAE,YAAY;AAC7BC,IAAAA,OAAO,EAAE,KAAK;AACdC,IAAAA,SAAS,EAAE,OAAO;AAClBC,IAAAA,UAAU,EAAE,UAAU;AAEtB;AACAnE,IAAAA,aAAa,EAAE,OAAO;AACtBoE,IAAAA,iBAAiB,EAAE,eAAe;AAElC;AACAC,IAAAA,MAAM,EAAE,IAAI;AACZC,IAAAA,YAAY,EAAE,OAAO;AACrBC,IAAAA,QAAQ,EAAE;GACX;AAEDG,EAAAA,EAAE,EAAE;AACFjC,IAAAA,OAAO,EAAE,YAAY;AACrBC,IAAAA,OAAO,EAAE,SAAS;AAClBC,IAAAA,SAAS,EAAE,YAAY;AACvBC,IAAAA,cAAc,EAAE,UAAU;AAE1BC,IAAAA,YAAY,EAAE,SAAS;AACvBC,IAAAA,aAAa,EAAE,SAAS;AACxBC,IAAAA,aAAa,EAAE,SAAS;AACxBC,IAAAA,cAAc,EAAE,UAAU;AAE1BC,IAAAA,WAAW,EAAE,cAAc;AAC3BC,IAAAA,WAAW,EAAE,QAAQ;AACrBC,IAAAA,WAAW,EAAE,cAAc;AAC3BC,IAAAA,WAAW,EAAE,aAAa;AAC1BC,IAAAA,QAAQ,EAAE,UAAU;AAEpBC,IAAAA,SAAS,EAAE,YAAY;AACvBzC,IAAAA,aAAa,EAAE,QAAQ;AACvBE,IAAAA,aAAa,EAAE,SAAS;AACxBwC,IAAAA,QAAQ,EAAE,UAAU;AACpB3B,IAAAA,KAAK,EAAE,OAAO;AACdE,IAAAA,OAAO,EAAE,SAAS;AAClB0B,IAAAA,WAAW,EAAE,SAAS;AACtBC,IAAAA,WAAW,EAAE,SAAS;AAEtBC,IAAAA,OAAO,EAAE,UAAU;AACnBC,IAAAA,iBAAiB,EAAE,gBAAgB;AACnCC,IAAAA,cAAc,EAAE,SAAS;AACzBC,IAAAA,kBAAkB,EAAE,oBAAoB;AAExCC,IAAAA,WAAW,EAAE,cAAc;AAC3BC,IAAAA,eAAe,EAAE,cAAc;AAC/BC,IAAAA,eAAe,EAAE,gBAAgB;AACjCC,IAAAA,OAAO,EAAE,SAAS;AAClBC,IAAAA,SAAS,EAAE,YAAY;AACvBC,IAAAA,UAAU,EAAE,aAAa;AAEzBnE,IAAAA,aAAa,EAAE,gBAAgB;AAC/BoE,IAAAA,iBAAiB,EAAE,sBAAsB;AAEzCC,IAAAA,MAAM,EAAE,QAAQ;AAChBC,IAAAA,YAAY,EAAE,SAAS;AACvBC,IAAAA,QAAQ,EAAE;AACZ;AACF;AAEA,IAAII,eAAe,GAAG,IAAI;AAEnB,SAASC,WAAWA,CAACC,IAAI,EAAE;EAChC,IAAIvC,mBAAmB,CAACwC,QAAQ,CAACD,IAAI,CAAC,EAAEF,eAAe,GAAGE,IAAI;AAChE;AAEO,SAASE,WAAWA,GAAG;AAC5B,EAAA,OAAOJ,eAAe;AACxB;AAEO,SAASK,CAACA,CAACC,GAAG,EAAEnF,MAAM,EAAE;EAC7B,MAAMoF,IAAI,GAAG3C,QAAQ,CAACwC,WAAW,EAAE,CAAC,IAAIxC,QAAQ,CAACC,EAAE;AACnD,EAAA,IAAI2C,IAAI,GAAGD,IAAI,CAACD,GAAG,CAAC,IAAIA,GAAG;AAC3B,EAAA,IAAInF,MAAM,EAAE;IACVsF,MAAM,CAACC,IAAI,CAACvF,MAAM,CAAC,CAACwF,OAAO,CAACC,CAAC,IAAI;AAC/BJ,MAAAA,IAAI,GAAGA,IAAI,CAACK,OAAO,CAAC,IAAIC,MAAM,CAAC,CAAA,GAAA,EAAMF,CAAC,CAAA,GAAA,CAAK,EAAE,GAAG,CAAC,EAAEzF,MAAM,CAACyF,CAAC,CAAC,CAAC;AAC/D,IAAA,CAAC,CAAC;AACJ,EAAA;AACA,EAAA,OAAOJ,IAAI;AACb;;ACtOA;AACA;AACA;;AAMA,MAAMO,aAAa,gBAAGC,aAAa,CAAC,IAAI,CAAC;AAElC,SAASC,cAAcA,CAAC;EAC7BC,QAAQ;EACRC,MAAM;EACNC,KAAK;AACLC,EAAAA,QAAQ,GAAG,IAAI;EACfC,SAAS;EACTC,QAAQ;AACRC,EAAAA;AACF,CAAC,EAAE;EACD,MAAM,CAACzD,OAAO,EAAE0D,UAAU,CAAC,GAAGC,QAAQ,CAAC,EAAE,CAAC;EAC1C,MAAM,CAACC,QAAQ,EAAEC,WAAW,CAAC,GAAGF,QAAQ,CAAC,EAAE,CAAC;EAC5C,MAAM,CAACG,SAAS,EAAEC,YAAY,CAAC,GAAGJ,QAAQ,CAAC,EAAE,CAAC;EAC9C,MAAM,CAAC5D,OAAO,EAAEiE,UAAU,CAAC,GAAGL,QAAQ,CAAC,KAAK,CAAC;EAC7C,MAAM,CAACM,KAAK,EAAEC,QAAQ,CAAC,GAAGP,QAAQ,CAAC,IAAI,CAAC;AAExCQ,EAAAA,SAAS,CAAC,MAAM;AACd,IAAA,IAAIf,MAAM,EAAEzD,SAAS,CAACyE,UAAU,CAAChB,MAAM,CAAC;AACxC,IAAA,IAAIC,KAAK,EAAE1D,SAAS,CAAC0E,QAAQ,CAAChB,KAAK,CAAC;AACpC,IAAA,IAAIC,QAAQ,EAAEpB,WAAW,CAACoB,QAAQ,CAAC;EACrC,CAAC,EAAE,CAACF,MAAM,EAAEC,KAAK,EAAEC,QAAQ,CAAC,CAAC;AAE7B,EAAA,MAAMgB,WAAW,GAAGC,WAAW,CAAEC,GAAG,IAAK;AACvCN,IAAAA,QAAQ,CAACM,GAAG,CAAC1G,OAAO,CAAC;IACrB2F,OAAO,GAAGe,GAAG,CAAC;AAChB,EAAA,CAAC,EAAE,CAACf,OAAO,CAAC,CAAC;;AAEb;EACA,MAAMgB,WAAW,GAAGF,WAAW,CAAC,OAAOnH,MAAM,GAAG,EAAE,KAAK;IACrD4G,UAAU,CAAC,IAAI,CAAC;IAChB,IAAI;MACF,MAAMU,MAAM,GAAG,MAAM/E,SAAS,CAACxC,UAAU,CAACC,MAAM,CAAC;AACjD,MAAA,MAAMuH,KAAK,GAAGD,MAAM,CAACC,KAAK,IAAID,MAAM,CAACE,IAAI,IAAIF,MAAM,IAAI,EAAE;MACzDhB,UAAU,CAACiB,KAAK,CAAC;AACjB,MAAA,OAAOA,KAAK;IACd,CAAC,CAAC,OAAOH,GAAG,EAAE;MACZF,WAAW,CAACE,GAAG,CAAC;AAClB,IAAA,CAAC,SAAS;MACRR,UAAU,CAAC,KAAK,CAAC;AACnB,IAAA;AACF,EAAA,CAAC,EAAE,CAACM,WAAW,CAAC,CAAC;;AAEjB;AACA,EAAA,MAAMO,YAAY,GAAGN,WAAW,CAAC,YAAY;IAC3C,IAAI;AACF,MAAA,MAAMG,MAAM,GAAG,MAAM/E,SAAS,CAACmF,WAAW,EAAE;AAC5C,MAAA,MAAMH,KAAK,GAAGD,MAAM,CAACC,KAAK,IAAID,MAAM,CAACE,IAAI,IAAIF,MAAM,IAAI,EAAE;MACzDb,WAAW,CAACc,KAAK,CAAC;AAClB,MAAA,OAAOA,KAAK;IACd,CAAC,CAAC,OAAOH,GAAG,EAAE;MACZF,WAAW,CAACE,GAAG,CAAC;AAClB,IAAA;AACF,EAAA,CAAC,EAAE,CAACF,WAAW,CAAC,CAAC;;AAEjB;EACA,MAAM1G,WAAW,GAAG2G,WAAW,CAAC,OAAO1G,MAAM,EAAEC,OAAO,GAAG,EAAE,KAAK;IAC9DkG,UAAU,CAAC,IAAI,CAAC;IAChB,IAAI;MACF,MAAMU,MAAM,GAAG,MAAM/E,SAAS,CAAC/B,WAAW,CAACC,MAAM,EAAE;AAAEC,QAAAA;AAAQ,OAAC,CAAC;MAC/DyF,SAAS,GAAGmB,MAAM,CAAC;AACnB,MAAA,OAAOA,MAAM;IACf,CAAC,CAAC,OAAOF,GAAG,EAAE;MACZF,WAAW,CAACE,GAAG,CAAC;AAChB,MAAA,MAAMA,GAAG;AACX,IAAA,CAAC,SAAS;MACRR,UAAU,CAAC,KAAK,CAAC;AACnB,IAAA;AACF,EAAA,CAAC,EAAE,CAACM,WAAW,EAAEf,SAAS,CAAC,CAAC;;AAE5B;AACA,EAAA,MAAMpF,aAAa,GAAGoG,WAAW,CAAC,MAAOnG,SAAS,IAAK;IACrD,IAAI;MACF,MAAMsG,MAAM,GAAG,MAAM/E,SAAS,CAACxB,aAAa,CAACC,SAAS,CAAC;AACvDyF,MAAAA,WAAW,CAACkB,IAAI,IAAIA,IAAI,CAACC,MAAM,CAACC,CAAC,IAAIA,CAAC,CAACC,EAAE,KAAK9G,SAAS,CAAC,CAAC;MACzD,MAAMqG,WAAW,EAAE;MACnBjB,QAAQ,GAAGkB,MAAM,CAAC;AAClB,MAAA,OAAOA,MAAM;IACf,CAAC,CAAC,OAAOF,GAAG,EAAE;MACZF,WAAW,CAACE,GAAG,CAAC;AAChB,MAAA,MAAMA,GAAG;AACX,IAAA;EACF,CAAC,EAAE,CAACF,WAAW,EAAEG,WAAW,EAAEjB,QAAQ,CAAC,CAAC;;AAExC;AACA,EAAA,MAAMnF,aAAa,GAAGkG,WAAW,CAAC,MAAOnG,SAAS,IAAK;IACrD,IAAI;AACF,MAAA,MAAMuB,SAAS,CAACtB,aAAa,CAACD,SAAS,CAAC;AACxCyF,MAAAA,WAAW,CAACkB,IAAI,IAAIA,IAAI,CAACC,MAAM,CAACC,CAAC,IAAIA,CAAC,CAACC,EAAE,KAAK9G,SAAS,CAAC,CAAC;IAC3D,CAAC,CAAC,OAAOoG,GAAG,EAAE;MACZF,WAAW,CAACE,GAAG,CAAC;AAClB,IAAA;AACF,EAAA,CAAC,EAAE,CAACF,WAAW,CAAC,CAAC;;AAEjB;AACA,EAAA,MAAMzD,QAAQ,GAAG0D,WAAW,CAAC,MAAO9F,QAAQ,IAAK;IAC/C,IAAI;AACF,MAAA,MAAMkB,SAAS,CAACkB,QAAQ,CAACpC,QAAQ,CAAC;AAClCiF,MAAAA,UAAU,CAACqB,IAAI,IAAIA,IAAI,CAACC,MAAM,CAACG,CAAC,IAAIA,CAAC,CAACD,EAAE,KAAKzG,QAAQ,CAAC,CAAC;IACzD,CAAC,CAAC,OAAO+F,GAAG,EAAE;MACZF,WAAW,CAACE,GAAG,CAAC;AAClB,IAAA;AACF,EAAA,CAAC,EAAE,CAACF,WAAW,CAAC,CAAC;;AAEjB;AACA,EAAA,MAAMnF,SAAS,GAAGoF,WAAW,CAAC,MAAO1G,MAAM,IAAK;IAC9C,IAAI;AACF,MAAA,MAAM8B,SAAS,CAACT,KAAK,CAACrB,MAAM,CAAC;AAC7B6F,MAAAA,UAAU,CAACqB,IAAI,IAAIA,IAAI,CAACC,MAAM,CAACG,CAAC,IAAIA,CAAC,CAACD,EAAE,KAAKrH,MAAM,CAAC,CAAC;MACrD,MAAMuH,aAAa,EAAE;IACvB,CAAC,CAAC,OAAOZ,GAAG,EAAE;MACZF,WAAW,CAACE,GAAG,CAAC;AAClB,IAAA;AACF,EAAA,CAAC,EAAE,CAACF,WAAW,CAAC,CAAC;;AAEjB;AACA,EAAA,MAAMc,aAAa,GAAGb,WAAW,CAAC,YAAY;IAC5C,IAAI;AACF,MAAA,MAAMG,MAAM,GAAG,MAAM/E,SAAS,CAAC0F,YAAY,EAAE;AAC7C,MAAA,MAAMV,KAAK,GAAGD,MAAM,CAACC,KAAK,IAAID,MAAM,CAACE,IAAI,IAAIF,MAAM,IAAI,EAAE;MACzDX,YAAY,CAACY,KAAK,CAAC;AACnB,MAAA,OAAOA,KAAK;IACd,CAAC,CAAC,OAAOH,GAAG,EAAE;MACZF,WAAW,CAACE,GAAG,CAAC;AAClB,IAAA;AACF,EAAA,CAAC,EAAE,CAACF,WAAW,CAAC,CAAC;;AAEjB;AACA,EAAA,MAAMgB,WAAW,GAAGf,WAAW,CAAC,MAAO1G,MAAM,IAAK;IAChD,IAAI;AACF,MAAA,MAAM8B,SAAS,CAACP,OAAO,CAACvB,MAAM,CAAC;AAC/BkG,MAAAA,YAAY,CAACgB,IAAI,IAAIA,IAAI,CAACC,MAAM,CAACO,CAAC,IAAIA,CAAC,CAACL,EAAE,KAAKrH,MAAM,CAAC,CAAC;IACzD,CAAC,CAAC,OAAO2G,GAAG,EAAE;MACZF,WAAW,CAACE,GAAG,CAAC;AAClB,IAAA;AACF,EAAA,CAAC,EAAE,CAACF,WAAW,CAAC,CAAC;AAEjB,EAAA,MAAMkB,KAAK,GAAG;IACZxF,OAAO;IACP4D,QAAQ;IACRE,SAAS;IACT/D,OAAO;IACPkE,KAAK;IACLQ,WAAW;IACXI,YAAY;IACZjH,WAAW;IACXO,aAAa;IACbE,aAAa;IACbwC,QAAQ;IACR1B,SAAS;IACTiG,aAAa;IACbE,WAAW;AACXG,IAAAA,GAAG,EAAE9F;GACN;AAED,EAAA,oBACE+F,KAAA,CAAAC,aAAA,CAAC3C,aAAa,CAAC4C,QAAQ,EAAA;AAACJ,IAAAA,KAAK,EAAEA;AAAM,GAAA,EAClCrC,QACqB,CAAC;AAE7B;AAEO,SAAS0C,SAASA,GAAG;AAC1B,EAAA,MAAMC,OAAO,GAAGC,UAAU,CAAC/C,aAAa,CAAC;EACzC,IAAI,CAAC8C,OAAO,EAAE;AACZ,IAAA,MAAM,IAAIE,KAAK,CAAC,gDAAgD,CAAC;AACnE,EAAA;AACA,EAAA,OAAOF,OAAO;AAChB;;AChLA;AACA;AACA;;AAEA;AACO,MAAMG,YAAY,GAAG;AAC1BC,EAAAA,IAAI,EAAE,MAAM;AACZC,EAAAA,OAAO,EAAE,SAAS;AAClBC,EAAAA,QAAQ,EAAE,UAAU;AACpBC,EAAAA,OAAO,EAAE;AACX;;AAEA;AACO,MAAMC,aAAa,GAAG;AAC3BC,EAAAA,QAAQ,EAAE,UAAU;AACpBC,EAAAA,YAAY,EAAE,cAAc;AAC5BC,EAAAA,MAAM,EAAE,QAAQ;AAChBC,EAAAA,YAAY,EAAE,cAAc;AAC5BC,EAAAA,WAAW,EAAE;AACf;;AAEA;AACO,MAAMC,aAAa,GAAG;AAC3BC,EAAAA,MAAM,EAAE,QAAQ;AAChBC,EAAAA,OAAO,EAAE,SAAS;AAClBC,EAAAA,MAAM,EAAE,QAAQ;AAChBC,EAAAA,KAAK,EAAE,OAAO;AACdC,EAAAA,SAAS,EAAE;AACb;;AAEA;AACO,MAAMC,cAAc,GAAG;AAC5B,EAAA,CAAC,EAAE;AAAEC,IAAAA,KAAK,EAAE,CAAC;AAAEC,IAAAA,KAAK,EAAE,aAAa;AAAEC,IAAAA,IAAI,EAAE,IAAI;AAAEC,IAAAA,KAAK,EAAE;GAAW;AACnE,EAAA,CAAC,EAAE;AAAEH,IAAAA,KAAK,EAAE,CAAC;AAAEC,IAAAA,KAAK,EAAE,aAAa;AAAEC,IAAAA,IAAI,EAAE,IAAI;AAAEC,IAAAA,KAAK,EAAE;GAAW;AACnE,EAAA,CAAC,EAAE;AAAEH,IAAAA,KAAK,EAAE,CAAC;AAAEC,IAAAA,KAAK,EAAE,aAAa;AAAEC,IAAAA,IAAI,EAAE,IAAI;AAAEC,IAAAA,KAAK,EAAE;GAAW;AACnE,EAAA,CAAC,EAAE;AAAEH,IAAAA,KAAK,EAAE,CAAC;AAAEC,IAAAA,KAAK,EAAE,aAAa;AAAEC,IAAAA,IAAI,EAAE,IAAI;AAAEC,IAAAA,KAAK,EAAE;AAAU;AACpE;;AAEA;AACO,SAASC,iBAAiBA,CAACJ,KAAK,EAAE;EACvC,OAAOD,cAAc,CAACC,KAAK,CAAC,IAAID,cAAc,CAAC,CAAC,CAAC;AACnD;;ACzCA;AACA;AACA;AACA;;AAOO,SAASM,UAAUA,CAAC;EACzBC,MAAM;AACNC,EAAAA,YAAY,GAAG,IAAI;AACnBC,EAAAA,WAAW,GAAG,IAAI;EAClBC,SAAS;EACTC,SAAS;AACTC,EAAAA,SAAS,GAAG;AACd,CAAC,EAAE;EACD,MAAM;IAAEjH,QAAQ;IAAE1B,SAAS;AAAEY,IAAAA;GAAS,GAAG8F,SAAS,EAAE;EACpD,MAAM,CAACkC,QAAQ,EAAEC,WAAW,CAAC,GAAGrE,QAAQ,CAAC,KAAK,CAAC;EAE/C,MAAMsE,cAAc,GAAGV,iBAAiB,CAACE,MAAM,CAAC9G,QAAQ,IAAI,CAAC,CAAC;AAE9D,EAAA,MAAMuH,cAAc,GAAG,YAAY;AACjC,IAAA,IAAI,CAACC,OAAO,CAAC,SAAS,CAAC,EAAE;AACzB,IAAA,MAAMtH,QAAQ,CAAC4G,MAAM,CAACvC,EAAE,CAAC;IACzB8C,WAAW,CAAC,KAAK,CAAC;EACpB,CAAC;AAED,EAAA,MAAMI,WAAW,GAAG,YAAY;AAC9B,IAAA,IAAI,CAACD,OAAO,CAAC,UAAU,CAAC,EAAE;AAC1B,IAAA,MAAMhJ,SAAS,CAACsI,MAAM,CAACvC,EAAE,CAAC;IAC1B8C,WAAW,CAAC,KAAK,CAAC;EACpB,CAAC;EAED,oBACEtC,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;IAAKmC,SAAS,EAAE,eAAeA,SAAS,CAAA;GAAG,eACzCpC,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKmC,IAAAA,SAAS,EAAC;AAAe,GAAA,EAC3BL,MAAM,CAACY,MAAM,gBACZ3C,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;IAAK2C,GAAG,EAAEb,MAAM,CAACY,MAAO;IAACE,GAAG,EAAEd,MAAM,CAACe;AAAS,GAAE,CAAC,gBAEjD9C,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMmC,IAAAA,SAAS,EAAC;AAAoB,GAAA,EACjCL,MAAM,CAACe,QAAQ,EAAEC,MAAM,CAAC,CAAC,CAAC,IAAI,GAC3B,CACP,EACAhB,MAAM,CAACiB,MAAM,iBAAIhD,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMmC,IAAAA,SAAS,EAAC;AAAY,GAAE,CAC7C,CAAC,eAENpC,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKmC,IAAAA,SAAS,EAAC;GAAa,eAC1BpC,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKmC,IAAAA,SAAS,EAAC;GAAa,eAC1BpC,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMmC,IAAAA,SAAS,EAAC;AAAU,GAAA,EAAEL,MAAM,CAAC9I,MAAM,IAAI8I,MAAM,CAACe,QAAe,CAAC,EACnEf,MAAM,CAAC9I,MAAM,iBACZ+G,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMmC,IAAAA,SAAS,EAAC;AAAe,GAAA,EAAC,GAAC,EAACL,MAAM,CAACe,QAAQ,EAAC,GAAO,CAExD,CAAC,EAELd,YAAY,iBACXhC,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKmC,IAAAA,SAAS,EAAC,iBAAiB;AAACa,IAAAA,KAAK,EAAE;MAAErB,KAAK,EAAEW,cAAc,CAACX;AAAM;GAAE,eACtE5B,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMmC,IAAAA,SAAS,EAAC;AAAe,GAAA,EAAEG,cAAc,CAACZ,IAAW,CAAC,eAC5D3B,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMmC,IAAAA,SAAS,EAAC;AAAgB,GAAA,EAAExF,CAAC,CAAC2F,cAAc,CAACb,KAAK,CAAQ,CAC7D,CAEJ,CAAC,EAELO,WAAW,iBACVjC,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKmC,IAAAA,SAAS,EAAC;GAAgB,eAC7BpC,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AACEmC,IAAAA,SAAS,EAAC,wBAAwB;AAClCc,IAAAA,OAAO,EAAEA,MAAMhB,SAAS,GAAGH,MAAM;AAAE,GAAA,EACpC,cAEO,CAAC,eAET/B,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AACEmC,IAAAA,SAAS,EAAC,qBAAqB;AAC/Bc,IAAAA,OAAO,EAAEA,MAAMZ,WAAW,CAAC,CAACD,QAAQ;AAAE,GAAA,EACvC,QAEO,CAAC,EAERA,QAAQ,iBACPrC,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKmC,IAAAA,SAAS,EAAC;GAAa,eAC1BpC,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQiD,IAAAA,OAAO,EAAEA,MAAMf,SAAS,GAAGJ,MAAM;GAAE,EACxCnF,CAAC,CAAC,aAAa,CACV,CAAC,eACToD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQiD,IAAAA,OAAO,EAAEV,cAAe;AAACW,IAAAA,QAAQ,EAAE9I;GAAQ,EAChDuC,CAAC,CAAC,UAAU,CACP,CAAC,eACToD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQiD,IAAAA,OAAO,EAAER,WAAY;AAACN,IAAAA,SAAS,EAAC,QAAQ;AAACe,IAAAA,QAAQ,EAAE9I;AAAQ,GAAA,EAChEuC,CAAC,CAAC,OAAO,CACJ,CACL,CAEJ,CAEJ,CAAC;AAEV;;ACjGA;AACA;AACA;AACA;;AAMO,SAASwG,eAAeA,CAAC;EAC9BjL,MAAM;AACNkL,EAAAA,MAAM,GAAG,UAAU;AAAE;EACrBC,SAAS;AACTlB,EAAAA,SAAS,GAAG;AACd,CAAC,EAAE;EACD,MAAM;IAAElK,WAAW;AAAEmC,IAAAA;GAAS,GAAG8F,SAAS,EAAE;EAC5C,MAAM,CAACoD,SAAS,EAAEC,YAAY,CAAC,GAAGvF,QAAQ,CAAC,KAAK,CAAC;EACjD,MAAM,CAAC7F,OAAO,EAAEqL,UAAU,CAAC,GAAGxF,QAAQ,CAAC,EAAE,CAAC;EAC1C,MAAM,CAACyF,IAAI,EAAEC,OAAO,CAAC,GAAG1F,QAAQ,CAAC,KAAK,CAAC;EAEvC,MAAM2F,eAAe,GAAGA,MAAM;AAC5B,IAAA,QAAQP,MAAM;AACZ,MAAA,KAAK,QAAQ;QACX,OAAO;AAAEtG,UAAAA,IAAI,EAAEH,CAAC,CAAC,cAAc,CAAC;AAAEuG,UAAAA,QAAQ,EAAE,IAAI;AAAExB,UAAAA,IAAI,EAAE;SAAK;AAC/D,MAAA,KAAK,SAAS;QACZ,OAAO;AAAE5E,UAAAA,IAAI,EAAEH,CAAC,CAAC,eAAe,CAAC;AAAEuG,UAAAA,QAAQ,EAAE,IAAI;AAAExB,UAAAA,IAAI,EAAE;SAAK;AAChE,MAAA,KAAK,SAAS;QACZ,OAAO;AAAE5E,UAAAA,IAAI,EAAEH,CAAC,CAAC,eAAe,CAAC;AAAEuG,UAAAA,QAAQ,EAAE,IAAI;AAAExB,UAAAA,IAAI,EAAE;SAAM;AACjE,MAAA;QACE,OAAO;AAAE5E,UAAAA,IAAI,EAAEH,CAAC,CAAC,WAAW,CAAC;AAAEuG,UAAAA,QAAQ,EAAE,KAAK;AAAExB,UAAAA,IAAI,EAAE;SAAK;AAC/D;EACF,CAAC;AAED,EAAA,MAAMnK,MAAM,GAAGoM,eAAe,EAAE;EAEhC,MAAMC,WAAW,GAAGA,MAAM;IACxB,IAAIR,MAAM,KAAK,UAAU,EAAE;MACzBG,YAAY,CAAC,IAAI,CAAC;AACpB,IAAA;EACF,CAAC;AAED,EAAA,MAAMM,UAAU,GAAG,YAAY;IAC7B,IAAI;AACF,MAAA,MAAM5L,WAAW,CAACC,MAAM,EAAEC,OAAO,CAAC;MAClCuL,OAAO,CAAC,IAAI,CAAC;MACbH,YAAY,CAAC,KAAK,CAAC;AACnBF,MAAAA,SAAS,IAAI;IACf,CAAC,CAAC,OAAOxE,GAAG,EAAE;AACZ;AAAA,IAAA;EAEJ,CAAC;AAED,EAAA,IAAI4E,IAAI,EAAE;IACR,oBACE1D,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;MAAQmC,SAAS,EAAE,CAAA,oBAAA,EAAuBA,SAAS,CAAA,CAAG;MAACe,QAAQ,EAAA;KAAA,eAC7DnD,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMmC,MAAAA,SAAS,EAAC;AAAU,KAAA,EAAC,QAAO,CAAC,eACnCpC,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA,IAAA,EAAOrD,CAAC,CAAC,aAAa,CAAQ,CACxB,CAAC;AAEb,EAAA;EAEA,oBACEoD,KAAA,CAAAC,aAAA,CAAAD,KAAA,CAAA+D,QAAA,EAAA,IAAA,eACE/D,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AACEmC,IAAAA,SAAS,EAAE,CAAA,eAAA,EAAkBiB,MAAM,CAAA,CAAA,EAAIjB,SAAS,CAAA,CAAG;AACnDc,IAAAA,OAAO,EAAEW,WAAY;AACrBV,IAAAA,QAAQ,EAAE3L,MAAM,CAAC2L,QAAQ,IAAI9I;GAAQ,eAErC2F,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA;AAAMmC,IAAAA,SAAS,EAAC;AAAU,GAAA,EAAE5K,MAAM,CAACmK,IAAW,CAAC,eAC/C3B,KAAA,CAAAC,aAAA,CAAA,MAAA,EAAA,IAAA,EAAOzI,MAAM,CAACuF,IAAW,CACnB,CAAC,EAERwG,SAAS,iBACRvD,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKmC,IAAAA,SAAS,EAAC,0BAA0B;AAACc,IAAAA,OAAO,EAAEA,MAAMM,YAAY,CAAC,KAAK;GAAE,eAC3ExD,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKmC,IAAAA,SAAS,EAAC,kBAAkB;AAACc,IAAAA,OAAO,EAAEc,CAAC,IAAIA,CAAC,CAACC,eAAe;AAAG,GAAA,eAClEjE,KAAA,CAAAC,aAAA,CAAA,IAAA,EAAA,IAAA,EAAKrD,CAAC,CAAC,WAAW,CAAM,CAAC,eACzBoD,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKmC,IAAAA,SAAS,EAAC;AAAY,GAAA,eACzBpC,KAAA,CAAAC,aAAA,CAAA,OAAA,EAAA,IAAA,EAAQrD,CAAC,CAAC,gBAAgB,CAAS,CAAC,eACpCoD,KAAA,CAAAC,aAAA,CAAA,UAAA,EAAA;AACEH,IAAAA,KAAK,EAAE1H,OAAQ;IACf8L,QAAQ,EAAEF,CAAC,IAAIP,UAAU,CAACO,CAAC,CAACG,MAAM,CAACrE,KAAK,CAAE;AAC1CsE,IAAAA,WAAW,EAAExH,CAAC,CAAC,oBAAoB,CAAE;AACrCyH,IAAAA,IAAI,EAAE,CAAE;AACRC,IAAAA,SAAS,EAAE;AAAI,GAChB,CACE,CAAC,eACNtE,KAAA,CAAAC,aAAA,CAAA,KAAA,EAAA;AAAKmC,IAAAA,SAAS,EAAC;GAAe,eAC5BpC,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AAAQmC,IAAAA,SAAS,EAAC,YAAY;AAACc,IAAAA,OAAO,EAAEA,MAAMM,YAAY,CAAC,KAAK;AAAE,GAAA,EAAC,cAE3D,CAAC,eACTxD,KAAA,CAAAC,aAAA,CAAA,QAAA,EAAA;AACEmC,IAAAA,SAAS,EAAC,aAAa;AACvBc,IAAAA,OAAO,EAAEY,UAAW;AACpBX,IAAAA,QAAQ,EAAE9I;AAAQ,GAAA,EAEjBA,OAAO,GAAGuC,CAAC,CAAC,SAAS,CAAC,GAAG,MACpB,CACL,CACF,CACF,CAEP,CAAC;AAEP;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAiCO,MAAMnF,UAAU,GAAGA,CAAC,GAAG8M,IAAI,KAAKtK,SAAS,CAACxC,UAAU,CAAC,GAAG8M,IAAI;AAC5D,MAAMrM,WAAW,GAAGA,CAAC,GAAGqM,IAAI,KAAKtK,SAAS,CAAC/B,WAAW,CAAC,GAAGqM,IAAI;AAC9D,MAAM9L,aAAa,GAAGA,CAAC,GAAG8L,IAAI,KAAKtK,SAAS,CAACxB,aAAa,CAAC,GAAG8L,IAAI;AAClE,MAAMzL,YAAY,GAAGA,CAAC,GAAGyL,IAAI,KAAKtK,SAAS,CAACnB,YAAY,CAAC,GAAGyL,IAAI;AAChE,MAAM9K,SAAS,GAAGA,CAAC,GAAG8K,IAAI,KAAKtK,SAAS,CAACR,SAAS,CAAC,GAAG8K,IAAI;;;;"}
@@ -0,0 +1 @@
1
+ :root{--friend-primary:#1890ff;--friend-primary-hover:#40a9ff;--friend-success:#52c41a;--friend-warning:#faad14;--friend-danger:#ff4d4f;--friend-bg:#fff;--friend-bg-secondary:#f5f7fa;--friend-border:#e8e8e8;--friend-text:#333;--friend-text-secondary:#666;--friend-text-muted:#999;--friend-radius:8px;--friend-shadow:0 2px 8px rgba(0,0,0,.08);--friend-transition:all 0.2s ease}.friend-card{align-items:center;background:var(--friend-bg);border-radius:var(--friend-radius);display:flex;gap:12px;padding:12px 16px;transition:var(--friend-transition)}.friend-card:hover{background:var(--friend-bg-secondary)}.friend-avatar{flex-shrink:0;height:48px;position:relative;width:48px}.friend-avatar img{object-fit:cover}.avatar-placeholder,.friend-avatar img{border-radius:50%;height:100%;width:100%}.avatar-placeholder{align-items:center;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;display:flex;font-size:20px;font-weight:600;justify-content:center}.online-dot{background:var(--friend-success);border:2px solid var(--friend-bg);border-radius:50%;bottom:2px;height:12px;position:absolute;right:2px;width:12px}.friend-info{flex:1;min-width:0}.friend-name{align-items:center;display:flex;gap:4px}.nickname{color:var(--friend-text);font-size:15px;font-weight:500}.original-name{color:var(--friend-text-muted);font-size:12px}.friend-intimacy{align-items:center;display:flex;font-size:12px;gap:4px;margin-top:4px}.intimacy-icon{font-size:14px}.friend-actions{gap:4px;position:relative}.btn-action,.friend-actions{align-items:center;display:flex}.btn-action{background:transparent;border:none;border-radius:50%;cursor:pointer;font-size:16px;height:32px;justify-content:center;transition:var(--friend-transition);width:32px}.btn-action:hover{background:var(--friend-bg-secondary)}.action-menu{background:var(--friend-bg);border-radius:var(--friend-radius);box-shadow:0 4px 12px rgba(0,0,0,.12);min-width:120px;padding:8px 0;position:absolute;right:0;top:100%;z-index:100}.action-menu button{background:transparent;border:none;color:var(--friend-text);cursor:pointer;display:block;font-size:14px;padding:8px 16px;text-align:left;width:100%}.action-menu button:hover{background:var(--friend-bg-secondary)}.action-menu button.danger{color:var(--friend-danger)}.add-friend-btn{align-items:center;background:var(--friend-primary);border:none;border-radius:20px;color:#fff;cursor:pointer;display:inline-flex;font-size:14px;font-weight:500;gap:6px;padding:8px 16px;transition:var(--friend-transition)}.add-friend-btn:hover:not(:disabled){background:var(--friend-primary-hover)}.add-friend-btn:disabled{cursor:not-allowed;opacity:.6}.add-friend-btn.friend,.add-friend-btn.sent{background:var(--friend-success)}.add-friend-btn.pending{background:var(--friend-warning)}.add-friend-btn.blocked{background:var(--friend-text-muted)}.btn-icon{font-size:16px}.add-friend-modal-overlay{align-items:center;background:rgba(0,0,0,.5);bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:10000}.add-friend-modal{background:var(--friend-bg);border-radius:var(--friend-radius);box-shadow:0 8px 24px rgba(0,0,0,.15);max-width:400px;padding:24px;width:90%}.add-friend-modal h3{color:var(--friend-text);font-size:18px;margin:0 0 20px}.form-group{margin-bottom:20px}.form-group label{color:var(--friend-text);display:block;font-size:14px;font-weight:500;margin-bottom:8px}.form-group textarea{border:1px solid var(--friend-border);border-radius:6px;box-sizing:border-box;font-size:14px;padding:12px;resize:none;width:100%}.form-group textarea:focus{border-color:var(--friend-primary);outline:none}.modal-actions{display:flex;gap:12px}.btn-cancel,.btn-primary{border:none;border-radius:6px;cursor:pointer;flex:1;font-size:14px;font-weight:500;padding:10px}.btn-cancel{background:var(--friend-bg-secondary);color:var(--friend-text-secondary)}.btn-primary{background:var(--friend-primary);color:#fff}.friend-list{display:flex;flex-direction:column}.friend-list-header{align-items:center;border-bottom:1px solid var(--friend-border);display:flex;justify-content:space-between;padding:16px}.friend-list-empty{color:var(--friend-text-muted);padding:60px 20px;text-align:center}
package/package.json ADDED
@@ -0,0 +1,89 @@
1
+ {
2
+ "name": "@quantabit/friend-sdk",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "description": "QuantaBit Friend SDK - Friend management, intimacy levels, blocklist, and grouping",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.esm.js",
8
+ "files": [
9
+ "dist",
10
+ "README.md",
11
+ "LICENSE",
12
+ "types"
13
+ ],
14
+ "exports": {
15
+ ".": {
16
+ "types": "./types/index.d.ts",
17
+ "import": "./dist/index.esm.js",
18
+ "require": "./dist/index.cjs"
19
+ },
20
+ "./styles": "./dist/styles.css",
21
+ "./styles.css": "./dist/styles.css"
22
+ },
23
+ "scripts": {
24
+ "build": "rollup -c",
25
+ "dev": "rollup -c -w",
26
+ "clean": "rm -rf dist",
27
+ "prepublishOnly": "npm run build",
28
+ "test": "jest --passWithNoTests"
29
+ },
30
+ "devDependencies": {
31
+ "@babel/core": "^7.23.0",
32
+ "@babel/preset-env": "^7.23.0",
33
+ "@babel/preset-react": "^7.23.0",
34
+ "@rollup/plugin-babel": "^6.0.0",
35
+ "@rollup/plugin-commonjs": "^25.0.0",
36
+ "@rollup/plugin-node-resolve": "^15.0.0",
37
+ "babel-jest": "^29.7.0",
38
+ "identity-obj-proxy": "^3.0.0",
39
+ "jest": "^29.7.0",
40
+ "jest-environment-jsdom": "^29.7.0",
41
+ "react": "^18.2.0",
42
+ "react-dom": "^18.2.0",
43
+ "rollup": "^4.0.0",
44
+ "rollup-plugin-postcss": "^4.0.0"
45
+ },
46
+ "keywords": [
47
+ "friend",
48
+ "relationship",
49
+ "social",
50
+ "quantabit"
51
+ ],
52
+ "author": "QuantaBit Team",
53
+ "license": "MIT",
54
+ "publishConfig": {
55
+ "access": "public",
56
+ "registry": "https://registry.npmjs.org"
57
+ },
58
+ "dependencies": {
59
+ "@quantabit/sdk-config": "^1.0.6"
60
+ },
61
+ "peerDependencies": {
62
+ "react": ">=17.0.0",
63
+ "react-dom": ">=17.0.0"
64
+ },
65
+ "repository": {
66
+ "type": "git",
67
+ "url": "https://github.com/quantabit-chain/qbit-sdk.git",
68
+ "directory": "packages/friend-sdk"
69
+ },
70
+ "homepage": "https://github.com/quantabit-chain/qbit-sdk/tree/main/packages/friend-sdk#readme",
71
+ "bugs": {
72
+ "url": "https://github.com/quantabit-chain/qbit-sdk/issues"
73
+ },
74
+ "types": "types/index.d.ts",
75
+ "engines": {
76
+ "node": ">=18.0.0"
77
+ },
78
+ "sideEffects": [
79
+ "*.css"
80
+ ],
81
+ "qbit": {
82
+ "privacy": {
83
+ "level": "functional",
84
+ "dataCollection": "Feature-related data for personalization. Requires user consent.",
85
+ "gdprCompliant": true,
86
+ "ccpaCompliant": true
87
+ }
88
+ }
89
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * @quantabit/friend-sdk TypeScript Type Definitions
3
+ *
4
+ * Auto-generated type stubs. Enhance with specific types as the SDK matures.
5
+ */
6
+
7
+ import { FC, ReactNode } from 'react';
8
+
9
+ // ============ Provider ============
10
+
11
+ export interface FriendProviderProps {
12
+ children: ReactNode;
13
+ apiUrl?: string;
14
+ token?: string;
15
+ language?: string;
16
+ onError?: (error: Error) => void;
17
+ }
18
+
19
+ export declare const FriendProvider: FC<FriendProviderProps>;
20
+
21
+ // ============ Components ============
22
+
23
+ export interface FriendCardProps {
24
+ className?: string;
25
+ style?: React.CSSProperties;
26
+ [key: string]: any;
27
+ }
28
+
29
+ export declare const FriendCard: FC<FriendCardProps>;
30
+
31
+ export interface AddFriendButtonProps {
32
+ className?: string;
33
+ style?: React.CSSProperties;
34
+ [key: string]: any;
35
+ }
36
+
37
+ export declare const AddFriendButton: FC<AddFriendButtonProps>;
38
+
39
+ // ============ Hooks ============
40
+
41
+ export interface UseFriendReturn {
42
+ data: any;
43
+ loading: boolean;
44
+ error: string | null;
45
+ [key: string]: any;
46
+ }
47
+
48
+ export declare function useFriend(...args: any[]): UseFriendReturn;
49
+
50
+ // ============ Services ============
51
+
52
+ export declare const friendApi: any;
53
+
54
+ export declare class FriendApiClient {
55
+ constructor(config?: Record<string, any>);
56
+ setToken(token: string): void;
57
+ setBaseUrl(url: string): void;
58
+ destroy(): void;
59
+ getFriends(params?: Record<string, any>): Promise<any>;
60
+ searchFriends(keyword: string): Promise<any>;
61
+ getOnlineFriends(): Promise<any>;
62
+ getFriendGroups(): Promise<any>;
63
+ getFriendsByGroup(groupId: string): Promise<any>;
64
+ sendRequest(userId: string, message?: string): Promise<any>;
65
+ getReceivedRequests(params?: Record<string, any>): Promise<any>;
66
+ getSentRequests(params?: Record<string, any>): Promise<any>;
67
+ acceptRequest(requestId: string): Promise<any>;
68
+ rejectRequest(requestId: string): Promise<any>;
69
+ cancelRequest(requestId: string): Promise<any>;
70
+ removeFriend(friendId: string): Promise<any>;
71
+ setRemark(friendId: string, remark: string): Promise<any>;
72
+ moveToGroup(friendId: string, groupId: string): Promise<any>;
73
+ pinFriend(friendId: string, pinned: boolean): Promise<any>;
74
+ getBlacklist(): Promise<any>;
75
+ block(userId: string): Promise<any>;
76
+ blockUser(userId: string): Promise<any>;
77
+ unblock(userId: string): Promise<any>;
78
+ createGroup(name: string): Promise<any>;
79
+ updateGroup(groupId: string, name: string): Promise<any>;
80
+ deleteGroup(groupId: string): Promise<any>;
81
+ getPeopleYouMayKnow(limit?: number): Promise<any>;
82
+ }
83
+
84
+ // ============ Functions & Utilities ============
85
+
86
+ export declare function getFriends(...args: any[]): any;
87
+ export declare function sendRequest(...args: any[]): any;
88
+ export declare function acceptRequest(...args: any[]): any;
89
+ export declare function removeFriend(...args: any[]): any;
90
+ export declare function blockUser(...args: any[]): any;