refactor: re-login modal
This commit is contained in:
+25
-25
@@ -1,5 +1,5 @@
|
|||||||
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
|
import { createSlice, PayloadAction } from "@reduxjs/toolkit";
|
||||||
import { isNull, omitBy } from "lodash";
|
// import { isNull, omitBy } from "lodash";
|
||||||
import {
|
import {
|
||||||
KEY_EXPIRE,
|
KEY_EXPIRE,
|
||||||
KEY_PWA_INSTALLED,
|
KEY_PWA_INSTALLED,
|
||||||
@@ -10,7 +10,7 @@ import {
|
|||||||
} from "../config";
|
} from "../config";
|
||||||
import { AuthData, RenewTokenResponse } from "../../types/auth";
|
import { AuthData, RenewTokenResponse } from "../../types/auth";
|
||||||
import { User } from "../../types/user";
|
import { User } from "../../types/user";
|
||||||
import { updateUsersByLogs } from './users';
|
// import { updateUsersByLogs } from './users';
|
||||||
|
|
||||||
interface State {
|
interface State {
|
||||||
initialized: boolean;
|
initialized: boolean;
|
||||||
@@ -50,7 +50,7 @@ const authDataSlice = createSlice({
|
|||||||
const { initialized = true, user, token, refresh_token, expired_in = 0 } = payload;
|
const { initialized = true, user, token, refresh_token, expired_in = 0 } = payload;
|
||||||
const { uid, create_by } = user;
|
const { uid, create_by } = user;
|
||||||
state.initialized = initialized;
|
state.initialized = initialized;
|
||||||
state.user = user;
|
state.user = { ...state.user, ...user };
|
||||||
state.guest = create_by == "guest";
|
state.guest = create_by == "guest";
|
||||||
state.token = token;
|
state.token = token;
|
||||||
state.refreshToken = refresh_token;
|
state.refreshToken = refresh_token;
|
||||||
@@ -79,8 +79,8 @@ const authDataSlice = createSlice({
|
|||||||
state.user = obj;
|
state.user = obj;
|
||||||
localStorage.setItem(KEY_LOGIN_USER, JSON.stringify(obj));
|
localStorage.setItem(KEY_LOGIN_USER, JSON.stringify(obj));
|
||||||
},
|
},
|
||||||
resetRoleChanged(state) {
|
updateRoleChanged(state, action: PayloadAction<boolean>) {
|
||||||
state.roleChanged = false;
|
state.roleChanged = action.payload;
|
||||||
},
|
},
|
||||||
resetAuthData() {
|
resetAuthData() {
|
||||||
// remove local data
|
// remove local data
|
||||||
@@ -106,27 +106,27 @@ const authDataSlice = createSlice({
|
|||||||
localStorage.setItem(KEY_REFRESH_TOKEN, refresh_token);
|
localStorage.setItem(KEY_REFRESH_TOKEN, refresh_token);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
extraReducers: (builder) => {
|
// extraReducers: (builder) => {
|
||||||
builder.addCase(updateUsersByLogs, (state, action) => {
|
// builder.addCase(updateUsersByLogs, (state, action) => {
|
||||||
const changeLogs = action.payload;
|
// const changeLogs = action.payload;
|
||||||
const currUid = Number(localStorage.getItem(KEY_UID) ?? 0);
|
// const currUid = Number(localStorage.getItem(KEY_UID) ?? 0);
|
||||||
changeLogs.forEach(({ action, uid, ...rest }) => {
|
// changeLogs.forEach(({ action, uid, ...rest }) => {
|
||||||
if (uid == currUid && action == "update") {
|
// if (uid == currUid && action == "update") {
|
||||||
const vals = omitBy(rest, isNull);
|
// const vals = omitBy(rest, isNull);
|
||||||
const logId = state.user?.log_id ?? 0;
|
// // const logId = state.user?.log_id ?? Number.MAX_SAFE_INTEGER;
|
||||||
Object.keys(vals).forEach((k) => {
|
// Object.keys(vals).forEach((k) => {
|
||||||
if (k == "is_admin" && vals.log_id > logId && vals.is_admin !== state.user?.is_admin) {
|
// console.log("upppp 2 ", vals.is_admin, state.user?.is_admin);
|
||||||
console.log("upppp 2 ", vals, state.user?.is_bot, state.user?.log_id);
|
// if (k == "is_admin" && vals.is_admin !== state.user?.is_admin) {
|
||||||
// 用户角色有变化
|
// // 用户角色有变化
|
||||||
state.roleChanged = true;
|
// state.roleChanged = true;
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
|
|
||||||
});
|
// });
|
||||||
}
|
// }
|
||||||
});
|
});
|
||||||
|
|
||||||
export const { updateInitialized, updateLoginUser, setAuthData, resetAuthData, updateToken, resetRoleChanged } = authDataSlice.actions;
|
export const { updateInitialized, updateLoginUser, setAuthData, resetAuthData, updateToken, updateRoleChanged } = authDataSlice.actions;
|
||||||
export default authDataSlice.reducer;
|
export default authDataSlice.reducer;
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import Button from "../../common/component/styled/Button";
|
|||||||
import useLogout from "../../common/hook/useLogout";
|
import useLogout from "../../common/hook/useLogout";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { useDispatch } from "react-redux";
|
import { useDispatch } from "react-redux";
|
||||||
import { resetRoleChanged } from "../../app/slices/auth.data";
|
import { updateRoleChanged } from "../../app/slices/auth.data";
|
||||||
|
|
||||||
interface Props {
|
interface Props {
|
||||||
reasonType?: "role_changed",
|
reasonType?: "role_changed",
|
||||||
@@ -21,7 +21,7 @@ const ReLoginModal: FC<Props> = ({ reasonType = "role_changed" }) => {
|
|||||||
logout();
|
logout();
|
||||||
};
|
};
|
||||||
const handleReset = () => {
|
const handleReset = () => {
|
||||||
dispatch(resetRoleChanged());
|
dispatch(updateRoleChanged(false));
|
||||||
};
|
};
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (exited) {
|
if (exited) {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import {
|
|||||||
updateAutoDeleteSetting
|
updateAutoDeleteSetting
|
||||||
} from "../../../app/slices/footprint";
|
} from "../../../app/slices/footprint";
|
||||||
import { updateUsersByLogs, updateUsersStatus } from "../../../app/slices/users";
|
import { updateUsersByLogs, updateUsersStatus } from "../../../app/slices/users";
|
||||||
import { resetAuthData, updateLoginUser } from "../../../app/slices/auth.data";
|
import { resetAuthData, updateLoginUser, updateRoleChanged } from "../../../app/slices/auth.data";
|
||||||
import chatMessageHandler from "./chat.handler";
|
import chatMessageHandler from "./chat.handler";
|
||||||
import { useAppDispatch, useAppSelector } from "../../../app/store";
|
import { useAppDispatch, useAppSelector } from "../../../app/store";
|
||||||
import { ServerEvent, UsersStateEvent } from "../../../types/sse";
|
import { ServerEvent, UsersStateEvent } from "../../../types/sse";
|
||||||
@@ -40,14 +40,13 @@ const getQueryString = (params: { [key: string]: string }) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let SSE: EventSource | undefined;
|
let SSE: EventSource | undefined;
|
||||||
// let opened = false; //标识SSE打开过
|
let ready = false; //是否已完成初始推送
|
||||||
let aliveInter: number | ReturnType<typeof setTimeout> = 0;
|
let aliveInter: number | ReturnType<typeof setTimeout> = 0;
|
||||||
export default function useStreaming() {
|
export default function useStreaming() {
|
||||||
const [renewToken] = useRenewMutation();
|
const [renewToken] = useRenewMutation();
|
||||||
const [streamingReady, setStreamingReady] = useState(false);
|
const [streamingReady, setStreamingReady] = useState(false);
|
||||||
const {
|
const {
|
||||||
authData: { user },
|
authData: { user, guest },
|
||||||
ui: { ready },
|
|
||||||
footprint: { afterMid, usersVersion, readUsers, readChannels }
|
footprint: { afterMid, usersVersion, readUsers, readChannels }
|
||||||
} = useAppSelector((store) => store);
|
} = useAppSelector((store) => store);
|
||||||
const dispatch = useAppDispatch();
|
const dispatch = useAppDispatch();
|
||||||
@@ -116,6 +115,7 @@ export default function useStreaming() {
|
|||||||
SSE = new EventSource(`${BASE_URL}/user/events?${getQueryString(params)}`);
|
SSE = new EventSource(`${BASE_URL}/user/events?${getQueryString(params)}`);
|
||||||
|
|
||||||
SSE.onopen = () => {
|
SSE.onopen = () => {
|
||||||
|
ready = false;
|
||||||
//todo
|
//todo
|
||||||
// opened = true;
|
// opened = true;
|
||||||
// connectionIsOpen = true;
|
// connectionIsOpen = true;
|
||||||
@@ -139,6 +139,7 @@ export default function useStreaming() {
|
|||||||
keepAlive();
|
keepAlive();
|
||||||
break;
|
break;
|
||||||
case "ready":
|
case "ready":
|
||||||
|
ready = true;
|
||||||
// 有时候,heartbeat不会发?
|
// 有时候,heartbeat不会发?
|
||||||
keepAlive();
|
keepAlive();
|
||||||
dispatch(setReady());
|
dispatch(setReady());
|
||||||
@@ -155,7 +156,14 @@ export default function useStreaming() {
|
|||||||
logs.forEach((log) => {
|
logs.forEach((log) => {
|
||||||
const { uid, action, ...rest } = log;
|
const { uid, action, ...rest } = log;
|
||||||
if (uid === loginUid && action === "update") {
|
if (uid === loginUid && action === "update") {
|
||||||
dispatch(updateLoginUser(omitBy(rest, isNull)));
|
const purified = omitBy(rest, isNull);
|
||||||
|
dispatch(updateLoginUser(purified));
|
||||||
|
console.log("upppp 3", purified, ready, user?.is_admin);
|
||||||
|
|
||||||
|
if (!guest && typeof purified.is_admin !== "undefined" && ready && user?.is_admin !== purified.is_admin) {
|
||||||
|
// ready 之后,登录用户有角色变动
|
||||||
|
dispatch(updateRoleChanged(true));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (action === "delete") {
|
if (action === "delete") {
|
||||||
// 同时删掉对应的聊天记录
|
// 同时删掉对应的聊天记录
|
||||||
@@ -294,7 +302,7 @@ export default function useStreaming() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}, [afterMid, usersVersion]);
|
}, [afterMid, usersVersion, user, guest]);
|
||||||
|
|
||||||
const stopStreaming = () => {
|
const stopStreaming = () => {
|
||||||
// 先清掉定时器
|
// 先清掉定时器
|
||||||
|
|||||||
Reference in New Issue
Block a user