feat: server update message in SSE

This commit is contained in:
Tristan Yang
2023-06-16 17:08:14 +08:00
parent e8782492aa
commit f2a0812d05
9 changed files with 1302 additions and 1624 deletions
+1
View File
@@ -109,6 +109,7 @@ export const ChatPrefixes = {
};
export const vapidKey = `BOmzyZhw-DcIGYQ77mzQUVqLlcvn0bm_76P_kc7rpwRxzXNbui-JP8iPyEQYfyoxyJeq43Ud4IiIsJSMNHNujn0`;
export const tokenHeader = "X-API-Key";
export const KEY_SERVER_VERSION = "VC_SERVER_VERSION"; //
export const FILE_SLICE_SIZE = 1000 * 1000; //
export const FILE_IMAGE_SIZE = 1000 * 10000 * 8; //10mb
export const KEY_MOBILE_APP_TIP = "MOBILE_APP_TIP";
+1
View File
@@ -1,4 +1,5 @@
import { createApi } from "@reduxjs/toolkit/query/react";
import { unescape } from "lodash";
import { ChatContext } from "@/types/common";
import { ChatMessage, ContentTypeKey, UploadFileResponse } from "@/types/message";
+13 -3
View File
@@ -21,7 +21,13 @@ import {
TestEmailDTO
} from "@/types/server";
import { User } from "@/types/user";
import BASE_URL, { ContentTypes, IS_OFFICIAL_DEMO, PAYMENT_URL_PREFIX } from "../config";
import { compareVersion } from "@/utils";
import BASE_URL, {
ContentTypes,
IS_OFFICIAL_DEMO,
KEY_SERVER_VERSION,
PAYMENT_URL_PREFIX
} from "../config";
import { updateInfo } from "../slices/server";
import { updateCallInfo, upsertVoiceList } from "../slices/voice";
import { RootState } from "../store";
@@ -68,6 +74,7 @@ export const serverApi = createApi({
async onQueryStarted(data, { dispatch, queryFulfilled }) {
try {
const resp = await queryFulfilled;
localStorage.setItem(KEY_SERVER_VERSION, resp.data);
dispatch(updateInfo({ version: resp.data }));
} catch {
console.error("get server version error");
@@ -260,10 +267,13 @@ export const serverApi = createApi({
}
}
}),
updateServer: builder.mutation<void, Server>({
updateServer: builder.mutation<void, Partial<Server>>({
query: (data) => ({
url: "admin/system/organization",
method: "POST",
method:
compareVersion(localStorage.getItem(KEY_SERVER_VERSION) ?? "", "0.3.7") > 0
? "PUT"
: "POST",
body: data
}),
async onQueryStarted(data, { dispatch, queryFulfilled, getState }) {
+3 -2
View File
@@ -14,11 +14,12 @@ export default function useLogout() {
const dispatch = useDispatch();
const [logout, { isLoading, isSuccess }] = useLazyLogoutQuery();
const clearLocalData = () => {
dispatch(resetChannels());
dispatch(resetUsers());
// 和消息相关的数据
dispatch(resetFootprint());
dispatch(resetChannelMsg());
dispatch(resetUserMsg());
dispatch(resetChannels());
dispatch(resetUsers());
dispatch(resetMessage());
dispatch(resetReactionMessage());
dispatch(resetFileMessage());
+31 -5
View File
@@ -15,6 +15,7 @@ import {
} from "@/app/slices/channels";
import {
removePinChats,
resetFootprint,
updateAutoDeleteSetting,
updateMute,
updateReadChannels,
@@ -22,8 +23,15 @@ import {
updateUsersVersion,
upsertPinChats
} from "@/app/slices/footprint";
import { clearChannelMessage, removeChannelSession } from "@/app/slices/message.channel";
import { removeUserSession } from "@/app/slices/message.user";
import { resetMessage } from "@/app/slices/message";
import {
clearChannelMessage,
removeChannelSession,
resetChannelMsg
} from "@/app/slices/message.channel";
import { resetFileMessage } from "@/app/slices/message.file";
import { resetReactionMessage } from "@/app/slices/message.reaction";
import { removeUserSession, resetUserMsg } from "@/app/slices/message.user";
import { updateInfo } from "@/app/slices/server";
import { setReady } from "@/app/slices/ui";
import { updateContactStatus, updateUsersByLogs, updateUsersStatus } from "@/app/slices/users";
@@ -106,10 +114,12 @@ export default function useStreaming() {
}
// 开始初始化
const params: {
limit: string;
"api-key": string;
after_mid?: string;
users_version?: string;
} = {
limit: "500",
"api-key": _token
};
// 如果afterMid是0,则不传该参数
@@ -147,15 +157,31 @@ export default function useStreaming() {
case "heartbeat":
keepAlive();
break;
case "message_cleared": {
dispatch(resetFootprint());
dispatch(resetChannelMsg());
dispatch(resetUserMsg());
dispatch(resetMessage());
dispatch(resetReactionMessage());
dispatch(resetFileMessage());
break;
}
case "ready":
ready = true;
// 有时候,heartbeat不会发?
keepAlive();
dispatch(setReady());
break;
case "organization_config_changed": {
const { name, description } = data;
dispatch(updateInfo({ name, description }));
case "server_config_changed": {
const { type, ...rest } = data;
const { organization_name, organization_logo, organization_description, ...tmp } = rest;
const transformed = {
name: organization_name,
description: organization_description,
...tmp
};
const purified = omitBy(transformed, isNull);
dispatch(updateInfo(purified));
break;
}
case "group_message_cleared": {
@@ -5,11 +5,7 @@ import { useDispatch } from "react-redux";
import { useWizard } from "react-use-wizard";
import { useLoginMutation } from "@/app/services/auth";
import {
useCreateAdminMutation,
useGetServerQuery,
useUpdateServerMutation
} from "@/app/services/server";
import { useCreateAdminMutation, useUpdateServerMutation } from "@/app/services/server";
import { updateInitialized } from "@/app/slices/auth.data";
import { useAppSelector } from "@/app/store";
import StyledButton from "@/components/styled/Button";
@@ -27,7 +23,6 @@ const AdminAccount: FC<Props> = ({ serverName }) => {
const [createAdmin, { isLoading: isSigningUp, isError: signUpError, isSuccess: signUpOk }] =
useCreateAdminMutation();
const [login, { isLoading: isLoggingIn, isError: loginError }] = useLoginMutation();
const { data: serverData } = useGetServerQuery();
const [updateServer, { isLoading: isUpdatingServer, isSuccess: isUpdatedServer }] =
useUpdateServerMutation();
@@ -58,11 +53,10 @@ const AdminAccount: FC<Props> = ({ serverName }) => {
// After logged in
useEffect(() => {
if (loggedIn && serverData) {
if (loggedIn) {
dispatch(updateInitialized(true));
// Set server name
updateServer({
...serverData,
name: serverName
});
}
+12 -5
View File
@@ -1,5 +1,6 @@
import { Channel } from "./channel";
import { ContentType } from "./message";
import { SystemCommon } from "./server";
import { ContactInfo, User } from "./user";
export interface ReadyEvent {
@@ -178,10 +179,11 @@ interface KickFromGroupEvent {
gid: number;
reason: string;
}
interface OrgInfoChangedEvent {
type: "organization_config_changed";
name: string;
description: string;
interface ServerConfigChangedEvent extends SystemCommon {
type: "server_config_changed";
organization_name: string;
organization_description: string;
organization_logo: string;
}
interface GroupChangedEvent {
@@ -220,6 +222,10 @@ interface UserCallEvent {
target: number;
uid: number;
}
interface MessageClearedEvent {
type: "message_cleared";
mid: number;
}
export type ServerEvent =
| ReadyEvent
@@ -241,4 +247,5 @@ export type ServerEvent =
| HeartbeatEvent
| GroupClearEvent
| UserCallEvent
| OrgInfoChangedEvent;
| ServerConfigChangedEvent
| MessageClearedEvent;