feat: server update message in SSE
This commit is contained in:
@@ -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,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";
|
||||
|
||||
@@ -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 }) {
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user