diff --git a/src/im/api.ts b/src/im/api.ts index 0af7d58..955523a 100644 --- a/src/im/api.ts +++ b/src/im/api.ts @@ -3,7 +3,10 @@ import { http } from '../core/http' import type { ChatType, ConversationView, + FriendRequest, HistoryQuery, + GroupJoinRequest, + ImGroup, ImMessage, PageResult, UserProfile, @@ -100,3 +103,68 @@ export function updateProfile( appQuery({ nickname, avatar, gender }), ) } + +export function listFriends(): Promise { + return http.get('/api/im/friends', appQuery()) +} + +export function listGroups(): Promise { + return http.get('/api/im/groups', appQuery()) +} + +export function getGroupInfo(groupId: string): Promise { + return http.get(`/api/im/groups/${encodeURIComponent(groupId)}`, appQuery()) +} + +export function sendFriendRequest(toUserId: string, remark?: string): Promise { + return http.post( + '/api/im/friend-requests', + undefined, + appQuery({ + toUserId, + ...(remark ? { remark } : {}), + }), + ) +} + +export function listFriendRequests(direction: 'incoming' | 'outgoing' = 'incoming'): Promise { + return http.get('/api/im/friend-requests', appQuery({ direction })) +} + +export function acceptFriendRequest(requestId: string): Promise { + return http.post(`/api/im/friend-requests/${encodeURIComponent(requestId)}/accept`, undefined, appQuery()) +} + +export function rejectFriendRequest(requestId: string): Promise { + return http.post(`/api/im/friend-requests/${encodeURIComponent(requestId)}/reject`, undefined, appQuery()) +} + +export function sendGroupJoinRequest(groupId: string, remark?: string): Promise { + return http.post( + `/api/im/groups/${encodeURIComponent(groupId)}/join-requests`, + undefined, + appQuery({ + ...(remark ? { remark } : {}), + }), + ) +} + +export function listGroupJoinRequests(groupId: string): Promise { + return http.get(`/api/im/groups/${encodeURIComponent(groupId)}/join-requests`, appQuery()) +} + +export function acceptGroupJoinRequest(groupId: string, requestId: string): Promise { + return http.post( + `/api/im/groups/${encodeURIComponent(groupId)}/join-requests/${encodeURIComponent(requestId)}/accept`, + undefined, + appQuery(), + ) +} + +export function rejectGroupJoinRequest(groupId: string, requestId: string): Promise { + return http.post( + `/api/im/groups/${encodeURIComponent(groupId)}/join-requests/${encodeURIComponent(requestId)}/reject`, + undefined, + appQuery(), + ) +} diff --git a/src/im/useIm.ts b/src/im/useIm.ts index ba6d5c3..60b6f64 100644 --- a/src/im/useIm.ts +++ b/src/im/useIm.ts @@ -2,10 +2,21 @@ import { ref, shallowRef, onUnmounted } from 'vue' import { ImClient } from './ImClient' import { deleteConversation, + acceptFriendRequest, + acceptGroupJoinRequest, + getGroupInfo, fetchGroupHistory, fetchHistory, + listFriendRequests, + listFriends, + listGroupJoinRequests, + listGroups, listConversations, markRead, + rejectFriendRequest, + rejectGroupJoinRequest, + sendFriendRequest, + sendGroupJoinRequest, setConversationMuted, setConversationPinned, setDraft, @@ -107,6 +118,50 @@ export function useIm() { return deleteConversation(targetId, chatType) } + function getFriends() { + return listFriends() + } + + function getGroups() { + return listGroups() + } + + function getGroup(groupId: string) { + return getGroupInfo(groupId) + } + + function sendFriend(toUserId: string, remark?: string) { + return sendFriendRequest(toUserId, remark) + } + + function loadFriendRequests(direction: 'incoming' | 'outgoing' = 'incoming') { + return listFriendRequests(direction) + } + + function approveFriendRequest(requestId: string) { + return acceptFriendRequest(requestId) + } + + function declineFriendRequest(requestId: string) { + return rejectFriendRequest(requestId) + } + + function sendGroupJoin(groupId: string, remark?: string) { + return sendGroupJoinRequest(groupId, remark) + } + + function loadGroupJoinRequests(groupId: string) { + return listGroupJoinRequests(groupId) + } + + function approveGroupJoinRequest(groupId: string, requestId: string) { + return acceptGroupJoinRequest(groupId, requestId) + } + + function declineGroupJoinRequest(groupId: string, requestId: string) { + return rejectGroupJoinRequest(groupId, requestId) + } + onUnmounted(disconnect) return { @@ -126,5 +181,16 @@ export function useIm() { setConversationMutedState, setConversationDraft, removeConversation, + getFriends, + getGroups, + getGroup, + sendFriend, + loadFriendRequests, + approveFriendRequest, + declineFriendRequest, + sendGroupJoin, + loadGroupJoinRequests, + approveGroupJoinRequest, + declineGroupJoinRequest, } } diff --git a/src/index.ts b/src/index.ts index f32ad8d..1972505 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,12 +2,23 @@ export { init, setToken, setUserId, getToken, getUserId, getConfig } from './cor export { http } from './core/http' export { ImClient } from './im/ImClient' export { + acceptFriendRequest, + acceptGroupJoinRequest, deleteConversation, + getGroupInfo, fetchGroupHistory, fetchHistory, + listFriendRequests, + listFriends, + listGroupJoinRequests, + listGroups, listConversations, markRead, getProfile, + rejectFriendRequest, + rejectGroupJoinRequest, + sendFriendRequest, + sendGroupJoinRequest, setConversationMuted, setConversationPinned, setDraft, @@ -22,6 +33,9 @@ export type { ImMessage, ConversationView, HistoryQuery, + ImGroup, + FriendRequest, + GroupJoinRequest, PageResult, UserProfile, SendMessageParams, diff --git a/src/types/index.ts b/src/types/index.ts index 20d9536..f517088 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -84,6 +84,40 @@ export interface UserProfile { createdAt?: string | number | null } +export interface ImGroup { + id: string + appId?: string + name: string + groupType?: string + creatorId: string + memberIds: string + adminIds: string + announcement?: string | null + createdAt?: string | number | null +} + +export interface FriendRequest { + id: string + appId?: string + fromUserId: string + toUserId: string + remark?: string | null + status: 'PENDING' | 'ACCEPTED' | 'REJECTED' + createdAt: string | number + reviewedAt?: string | number | null +} + +export interface GroupJoinRequest { + id: string + appId?: string + groupId: string + requesterId: string + remark?: string | null + status: 'PENDING' | 'ACCEPTED' | 'REJECTED' + createdAt: string | number + reviewedAt?: string | number | null +} + export interface SendMessageParams { messageId?: string toId: string