refactor: lots updates

This commit is contained in:
zerosoul
2022-03-17 11:15:13 +08:00
parent 4bc9932d0f
commit f22c7a01cb
69 changed files with 4625 additions and 1640 deletions
+15 -2
View File
@@ -1,6 +1,15 @@
import { createApi } from "@reduxjs/toolkit/query/react";
import { nanoid } from "@reduxjs/toolkit";
import baseQuery from "./base.query";
import BASE_URL from "../config";
import BASE_URL, { KEY_DEVICE_KEY } from "../config";
const getDeviceId = () => {
let d = localStorage.getItem(KEY_DEVICE_KEY);
if (!d) {
d = `web:${nanoid()}`;
localStorage.setItem(KEY_DEVICE_KEY, d);
}
return d;
};
export const authApi = createApi({
reducerPath: "authApi",
baseQuery,
@@ -9,7 +18,11 @@ export const authApi = createApi({
query: (credentials) => ({
url: "token/login",
method: "POST",
body: { credential: credentials, device: "web", device_token: "test" },
body: {
credential: credentials,
device: getDeviceId(),
device_token: "test",
},
}),
transformResponse: (data) => {
const { avatar_updated_at } = data.user;
+8 -2
View File
@@ -5,6 +5,7 @@ import { updateToken, resetAuthData } from "../slices/auth.data";
import BASE_URL, { tokenHeader } from "../config";
const whiteList = [
"login",
"register",
"checkInviteTokenValid",
"getServer",
"getOpenid",
@@ -64,8 +65,13 @@ const baseQueryWithTokenCheck = async (args, api, extraOptions) => {
result = await baseQuery(args, api, extraOptions);
}
if (result?.error) {
console.log("api error", result.error.originalStatus, api.endpoint);
console.log("api error", result.error, api.endpoint);
switch (result.error.originalStatus || result.error.status) {
case "FETCH_ERROR":
{
toast.error(`${api.endpoint}: Failed to fetch`);
}
break;
case 404:
{
toast.error("Request Not Found");
@@ -84,7 +90,7 @@ const baseQueryWithTokenCheck = async (args, api, extraOptions) => {
location.href = "/#/login";
// } else {
toast.error("API Not Authenticated");
return;
// return;
// }
}
break;
+8
View File
@@ -61,6 +61,13 @@ export const channelApi = createApi({
await onMessageSendStarted.call(this, param1, param2, "channel");
},
}),
addMembers: builder.mutation({
query: ({ id, members }) => ({
url: `group/${id}/members/add`,
method: "POST",
body: members,
}),
}),
}),
});
@@ -71,4 +78,5 @@ export const {
useGetChannelsQuery,
useCreateChannelMutation,
useSendChannelMsgMutation,
useAddMembersMutation,
} = channelApi;
+34
View File
@@ -1,5 +1,8 @@
import { createApi } from "@reduxjs/toolkit/query/react";
import { batch } from "react-redux";
import { ContentTypes } from "../config";
import { updateReadChannels, updateReadUsers } from "../slices/footprint";
import { onMessageSendStarted } from "./handlers";
// import { updateMessage } from "../slices/message";
@@ -48,6 +51,36 @@ export const messageApi = createApi({
await onMessageSendStarted.call(this, param1, param2, param1.context);
},
}),
readMessage: builder.mutation({
query: (data) => ({
url: `/user/read-index`,
method: "POST",
body: data,
}),
async onQueryStarted(data, { dispatch, getState, queryFulfilled }) {
const { users = [], groups = [] } = data;
const { readUsers, readChannels } = getState().footprint.readUsers;
const prevUsers = users.map(({ uid }) => {
return { uid, mid: readUsers[uid] };
});
const prevChannels = users.map(({ gid }) => {
return { gid, mid: readChannels[gid] };
});
batch(() => {
dispatch(updateReadChannels(groups));
dispatch(updateReadUsers(users));
});
try {
await queryFulfilled;
} catch {
// todo
batch(() => {
dispatch(updateReadChannels(prevChannels));
dispatch(updateReadUsers(prevUsers));
});
}
},
}),
}),
});
@@ -56,4 +89,5 @@ export const {
useReactMessageMutation,
useReplyMessageMutation,
useLazyDeleteMessageQuery,
useReadMessageMutation,
} = messageApi;
+25 -1
View File
@@ -1,6 +1,6 @@
import { createApi } from "@reduxjs/toolkit/query/react";
import BASE_URL from "../config";
import { updateInviteLink } from "../slices/server";
import baseQuery from "./base.query";
export const serverApi = createApi({
@@ -57,6 +57,29 @@ export const serverApi = createApi({
body: data,
}),
}),
createInviteLink: builder.query({
query: (expired_in = 7 * 24 * 60 * 60) => ({
headers: {
"content-type": "text/plain",
accept: "text/plain",
},
url: `/admin/user/create_invite_link?expired_in=${expired_in}`,
responseHandler: (response) => response.text(),
}),
async onQueryStarted(expire, { dispatch, queryFulfilled, getState }) {
const {
expire: prevExp,
link: prevLink,
} = getState().server.inviteLink;
try {
const { data: link } = await queryFulfilled;
console.log("link", link);
dispatch(updateInviteLink({ expire, link }));
} catch {
dispatch(updateInviteLink({ expire: prevExp, link: prevLink }));
}
},
}),
updateServer: builder.mutation({
query: (data) => ({
url: `admin/system/organization`,
@@ -79,4 +102,5 @@ export const {
useLazyGetServerQuery,
useUpdateServerMutation,
useUpdateLogoMutation,
useLazyCreateInviteLinkQuery,
} = serverApi;
+5 -4
View File
@@ -35,13 +35,14 @@ const handler = (data, dispatch, currState) => {
dispatch(updateAfterMid(mid));
break;
}
const { ready, loginUid } = currState;
const { ready, loginUid, readUsers = {}, readChannels = {} } = currState;
const to = typeof target.gid !== "undefined" ? "channel" : "user";
const appendMessage = to == "user" ? addUserMsg : addChannelMsg;
const self = from_uid == loginUid;
// 此处有点绕
const id = to == "user" ? (self ? target.uid : from_uid) : target.gid;
const readIndex = (to == "user" ? readUsers[id] : readChannels[id]) || 0;
const read = self ? true : mid < readIndex ? true : false;
switch (type) {
case "normal":
{
@@ -50,7 +51,7 @@ const handler = (data, dispatch, currState) => {
addMessage({
mid,
// 如果是自己发的消息,就是已读
read: self,
read,
...common,
})
);
@@ -70,7 +71,7 @@ const handler = (data, dispatch, currState) => {
mid,
reply_mid: detailMid,
// 如果是自己发的消息,就是已读
read: self,
read,
...common,
})
);
+27 -4
View File
@@ -9,7 +9,11 @@ import {
addChannel,
removeChannel,
} from "../../slices/channels";
import { updateUsersVersion } from "../../slices/footprint";
import {
updateUsersVersion,
updateReadChannels,
updateReadUsers,
} from "../../slices/footprint";
import { updateUsersByLogs, updateUsersStatus } from "../../slices/contacts";
import { resetAuthData } from "../../slices/auth.data";
import baseQuery from "../base.query";
@@ -58,6 +62,7 @@ export const streamingApi = createApi({
const {
ui: { ready },
authData: { uid: loginUid },
footprint: { readUsers, readChannels },
} = getState();
const data = JSON.parse(evt.data);
const { type } = data;
@@ -83,6 +88,18 @@ export const streamingApi = createApi({
dispatch(updateUsersByLogs(logs));
}
break;
case "user_settings":
case "user_settings_changed":
{
console.log("users settings");
const {
read_index_users = [],
read_index_groups = [],
} = data;
dispatch(updateReadChannels(read_index_groups));
dispatch(updateReadUsers(read_index_users));
}
break;
case "users_state":
case "users_state_changed":
{
@@ -123,7 +140,12 @@ export const streamingApi = createApi({
break;
case "chat":
{
chatMessageHandler(data, dispatch, { ready, loginUid });
chatMessageHandler(data, dispatch, {
ready,
loginUid,
readUsers,
readChannels,
});
}
break;
@@ -132,8 +154,8 @@ export const streamingApi = createApi({
break;
}
};
streaming.onopen = () => {
console.info("sse opened");
streaming.onopen = (wtf) => {
console.info("sse opened", wtf);
};
streaming.onerror = (err) => {
switch (err.eventPhase) {
@@ -148,6 +170,7 @@ export const streamingApi = createApi({
break;
default:
streaming.close();
console.error("sse error error", err);
// renewToken({ token, refreshToken });
break;