From 0d01aeaf4a2bae53937573c1aa3bfa1c65b95d0e Mon Sep 17 00:00:00 2001 From: moonrailgun Date: Wed, 12 Aug 2020 16:49:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E5=A5=BD=E5=8F=8B=E9=82=80=E8=AF=B7=E7=9A=84=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/shared/api/listener.ts | 10 ++++++- src/shared/redux/actions/user.ts | 27 +++++++++++++++++++ src/shared/redux/constants/user.ts | 2 ++ src/shared/redux/reducers/user.ts | 6 +++++ .../Content/Personal/FriendPanel/index.tsx | 18 +++++++++++-- 5 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/shared/api/listener.ts b/src/shared/api/listener.ts index 1fa91d90e..8f0f54df1 100644 --- a/src/shared/api/listener.ts +++ b/src/shared/api/listener.ts @@ -13,7 +13,11 @@ import { startWriting, stopWriting, } from '@shared/redux/actions/chat'; -import { addFriendInvite, loginWithToken } from '@shared/redux/actions/user'; +import { + addFriendInvite, + loginWithToken, + removeFriendInvite, +} from '@shared/redux/actions/user'; import { updateGroupStatus, addGroup, @@ -75,6 +79,10 @@ export function bindEventFunc( api.on('player::invite', function(data) { store.dispatch(addFriendInvite(data)); }); + api.on('player::removeInvite', function(data) { + const { inviteUUID } = data; + store.dispatch(removeFriendInvite({ inviteUUID })); + }); api.on('player::tick', function(data) { store.dispatch(showAlert(data.msg)); store.dispatch({ type: RESET }); diff --git a/src/shared/redux/actions/user.ts b/src/shared/redux/actions/user.ts index b5b9d16e6..a2bdc577e 100644 --- a/src/shared/redux/actions/user.ts +++ b/src/shared/redux/actions/user.ts @@ -20,6 +20,8 @@ const { GET_FRIEND_INVITE_SUCCESS, REFUSE_FRIEND_INVITE_SUCCESS, ADD_FRIEND_INVITE, + REMOVE_FRIEND_INVITE, + REQUEST_REMOVE_FRIEND_INVITE, } = constants; import md5 from 'md5'; import rnStorage from '@shared/api/rn-storage.api'; @@ -42,6 +44,7 @@ import { getGroupList, getGroupInvite } from './group'; import { getNote, getNotes } from './note'; import { loadLocalCache } from './cache'; import { TRPGAction } from '../types/__all__'; +import { createAsyncThunk, createAction } from '@reduxjs/toolkit'; const api = trpgApi.getInstance(); @@ -405,6 +408,30 @@ export const addFriendInvite = function(invite: any): TRPGAction { return { type: ADD_FRIEND_INVITE, payload: invite }; }; +/** + * 移除好友请求 + */ +export const removeFriendInvite = createAction<{ + inviteUUID: string; +}>(REMOVE_FRIEND_INVITE); + +/** + * 发送请求移除好友请求 + */ +export const requestRemoveFriendInvite = createAsyncThunk< + void, + { inviteUUID: string } +>(REQUEST_REMOVE_FRIEND_INVITE, async ({ inviteUUID }, { dispatch }) => { + try { + await api.emitP('player::removeFriendInvite', { inviteUUID }); + + dispatch(removeFriendInvite({ inviteUUID })); + } catch (err) { + // TODO: 需要处理 showToast 的类型 + dispatch(showToast('取消好友邀请失败:' + String(err)) as any); + } +}); + export const saveSettings = function(): TRPGAction { return function(dispatch, getState) { const settings = getState().settings; diff --git a/src/shared/redux/constants/user.ts b/src/shared/redux/constants/user.ts index 832b0f627..b717105cc 100644 --- a/src/shared/redux/constants/user.ts +++ b/src/shared/redux/constants/user.ts @@ -19,4 +19,6 @@ export default { GET_FRIEND_INVITE_SUCCESS: 'GET_FRIEND_INVITE_SUCCESS', REFUSE_FRIEND_INVITE_SUCCESS: 'REFUSE_FRIEND_INVITE_SUCCESS', ADD_FRIEND_INVITE: 'ADD_FRIEND_INVITE', + REMOVE_FRIEND_INVITE: 'REMOVE_FRIEND_INVITE', + REQUEST_REMOVE_FRIEND_INVITE: 'REQUEST_REMOVE_FRIEND_INVITE', }; diff --git a/src/shared/redux/reducers/user.ts b/src/shared/redux/reducers/user.ts index 7271393b4..992d68ab6 100644 --- a/src/shared/redux/reducers/user.ts +++ b/src/shared/redux/reducers/user.ts @@ -2,6 +2,7 @@ import constants from '@redux/constants'; import { UserState } from '@redux/types/user'; import _remove from 'lodash/remove'; import { createReducer } from '@reduxjs/toolkit'; +import { removeFriendInvite } from '@redux/actions/user'; const { RESET, @@ -117,5 +118,10 @@ export default createReducer(initialState, (builder) => { }) .addCase(ADD_FRIEND_INVITE, (state, action: any) => { state.friendRequests.push(action.payload); + }) + .addCase(removeFriendInvite, (state, action) => { + const { inviteUUID } = action.payload; + _remove(state.friendInvite, (item) => item.uuid === inviteUUID); + _remove(state.friendRequests, (item) => item.uuid === inviteUUID); }); }); diff --git a/src/web/routes/Main/Content/Personal/FriendPanel/index.tsx b/src/web/routes/Main/Content/Personal/FriendPanel/index.tsx index 30296a93f..c51fa3ff5 100644 --- a/src/web/routes/Main/Content/Personal/FriendPanel/index.tsx +++ b/src/web/routes/Main/Content/Personal/FriendPanel/index.tsx @@ -13,6 +13,7 @@ import { AddFriend } from './AddFriend'; import { t } from '@shared/i18n'; import { useHistory } from 'react-router'; import { addUserConverse } from '@redux/actions/chat'; +import { requestRemoveFriendInvite } from '@redux/actions/user'; const { TabPane } = Tabs; const PaneContainer = styled.div` @@ -35,6 +36,15 @@ export const FriendPanel: React.FC = TMemo(() => { history.push(`/main/personal/converse/${userUUID}`); }; + // 取消好友邀请 + const handleCancelFriendInvite = (inviteUUID: string) => { + dispatch( + requestRemoveFriendInvite({ + inviteUUID, + }) + ); + }; + const friendListPane = useMemo( () => ( @@ -65,7 +75,7 @@ export const FriendPanel: React.FC = TMemo(() => { - 好友邀请 + 已发送 } key="2" @@ -77,7 +87,11 @@ export const FriendPanel: React.FC = TMemo(() => { userUUID={inv.to_uuid} actions={[ -