From 5204c58d138a87b798d53ae5d4c1d07138f67da3 Mon Sep 17 00:00:00 2001 From: zerosoul Date: Thu, 28 Apr 2022 10:52:16 +0800 Subject: [PATCH] feat: pin message --- package.json | 23 ++- src/app/slices/channels.js | 23 +++ src/assets/icons/emoji.suprise.svg | 3 + src/common/component/Message/Commands.js | 11 +- src/common/hook/useNormalizeMessage.js | 4 +- src/common/hook/usePinMessage.js | 46 ++++++ src/routes/chat/ChannelChat/PinList.js | 134 ++++++++++++++++ src/routes/chat/ChannelChat/index.js | 44 +++++- src/routes/chat/Layout/styled.js | 21 +++ yarn.lock | 190 +++++++++++------------ 10 files changed, 374 insertions(+), 125 deletions(-) create mode 100644 src/assets/icons/emoji.suprise.svg create mode 100644 src/common/hook/usePinMessage.js create mode 100644 src/routes/chat/ChannelChat/PinList.js diff --git a/package.json b/package.json index fdec8579..3dfcb2ba 100644 --- a/package.json +++ b/package.json @@ -13,16 +13,15 @@ "@tippyjs/react": "^4.2.6", "@toast-ui/editor": "^3.1.5", "@toast-ui/editor-plugin-code-syntax-highlight": "^3.0.0", - "@toast-ui/react-editor": "^3.1.3", + "@toast-ui/react-editor": "^3.1.5", "@udecode/plate": "^10.6.3", "@uiball/loaders": "^1.2.4", "animate.css": "^4.1.1", - "axios": "^0.26.1", "babel-loader": "^8.2.5", "babel-plugin-named-asset-import": "^0.3.8", "babel-preset-react-app": "^10.0.1", "bfj": "^7.0.2", - "browserslist": "^4.20.2", + "browserslist": "^4.20.3", "camelcase": "^6.3.0", "case-sensitive-paths-webpack-plugin": "^2.4.0", "css-loader": "^6.7.1", @@ -43,13 +42,13 @@ "localforage": "^1.10.0", "masonry-layout": "^4.2.2", "mini-css-extract-plugin": "^2.6.0", - "re-resizable": "^6.9.8", - "react": "^18.0.0", + "re-resizable": "^6.9.9", + "react": "^18.1.0", "react-circular-progressbar": "^2.0.4", "react-dev-utils": "^12.0.1", "react-dnd": "16.0.1", "react-dnd-html5-backend": "16.0.1", - "react-dom": "^18.0.0", + "react-dom": "^18.1.0", "react-google-login": "^5.2.2", "react-helmet": "^6.1.0", "react-hot-toast": "^2.2.0", @@ -57,7 +56,7 @@ "react-linkify": "^1.0.0-alpha", "react-pdf": "^5.7.2", "react-redux": "^8.0.1", - "react-refresh": "0.12.0", + "react-refresh": "0.13.0", "react-router-dom": "6", "react-string-replace": "^1.0.0", "react-textarea-autosize": "^8.3.3", @@ -65,11 +64,11 @@ "resolve": "^1.22.0", "rooks": "^5.11.0", "semver": "^7.3.7", - "slate": "^0.77.2", + "slate": "^0.78.0", "slate-auto-replace": "^0.12.1", "slate-history": "^0.66.0", "slate-hyperscript": "^0.77.0", - "slate-react": "^0.77.3", + "slate-react": "^0.77.4", "source-map-loader": "^3.0.1", "style-loader": "^3.3.1", "styled-components": "^5.3.5", @@ -117,15 +116,15 @@ "eslint-plugin-import": "^2.26.0", "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-react": "^7.29.4", - "eslint-plugin-react-hooks": "^4.4.0", + "eslint-plugin-react-hooks": "^4.5.0", "gh-pages": "^3.2.3", "husky": "^7.0.4", - "lint-staged": "^12.4.0", + "lint-staged": "^12.4.1", "patch-package": "^6.4.7", "postcss": "^8.4.12", "postcss-flexbugs-fixes": "^5.0.2", "postcss-loader": "^6.2.1", - "postcss-preset-env": "^7.4.3", + "postcss-preset-env": "^7.4.4", "postinstall-postinstall": "^2.1.0", "prettier": "^2.6.2" } diff --git a/src/app/slices/channels.js b/src/app/slices/channels.js index 3ebdfc10..94d94dc0 100644 --- a/src/app/slices/channels.js +++ b/src/app/slices/channels.js @@ -79,6 +79,28 @@ const channelsSlice = createSlice({ break; } }, + updatePinMessage(state, action) { + const { gid, mid, msg } = action.payload; + let msgs = state.byId[gid]?.pinned_messages; + if (!msgs) return; + if (msg) { + if (!msgs) { + msgs = [msg]; + } else { + const idx = msgs.findIndex((msg) => msg.mid == mid); + if (idx > -1) { + msgs.splice(idx, 1); + } + msgs.push(msg); + } + } else { + // remove + const idx = msgs.findIndex((msg) => msg.mid == mid); + if (idx > -1) { + msgs.splice(idx, 1); + } + } + }, removeChannel(state, action) { const gid = action.payload; const idx = state.ids.findIndex((i) => i == gid); @@ -90,6 +112,7 @@ const channelsSlice = createSlice({ }, }); export const { + updatePinMessage, resetChannels, fullfillChannels, addChannel, diff --git a/src/assets/icons/emoji.suprise.svg b/src/assets/icons/emoji.suprise.svg new file mode 100644 index 00000000..a9867cd1 --- /dev/null +++ b/src/assets/icons/emoji.suprise.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/common/component/Message/Commands.js b/src/common/component/Message/Commands.js index 873bcfcd..121dfb21 100644 --- a/src/common/component/Message/Commands.js +++ b/src/common/component/Message/Commands.js @@ -8,7 +8,7 @@ import { updateSelectMessages } from "../../../app/slices/ui"; import { addReplyingMessage } from "../../../app/slices/message"; import StyledMenu from "../styled/Menu"; import Tooltip from "../../component/Tooltip"; -import DeleteMessageConfirm from "./DeleteMessageConfirm"; +import DeleteMessageConfirm from "../DeleteMessageConfirm"; import EmojiPicker from "./EmojiPicker"; import replyIcon from "../../../assets/icons/reply.svg?url"; import reactIcon from "../../../assets/icons/reaction.svg?url"; @@ -17,6 +17,7 @@ import editIcon from "../../../assets/icons/edit.svg?url"; import moreIcon from "../../../assets/icons/more.svg?url"; import ForwardModal from "../ForwardModal"; import PinMessageModal from "./PinMessageModal"; +import usePinMessage from "../../hook/usePinMessage"; const StyledCmds = styled.ul` z-index: 9999; position: absolute; @@ -63,6 +64,9 @@ export default function Commands({ const [deleteModalVisible, setDeleteModalVisible] = useState(false); const [forwardModalVisible, setForwardModalVisible] = useState(false); const [tippyVisible, setTippyVisible] = useState(false); + const { canPin } = usePinMessage( + context == "channel" ? contextId : undefined + ); const currUid = useSelector((store) => store.authData.uid); const cmdsRef = useRef(null); const handleReply = (fromMenu) => { @@ -92,6 +96,7 @@ export default function Commands({ dispatch(updateSelectMessages({ context, id: contextId, data: mid })); hideAll(); }; + const enablePin = context == "channel" && canPin; return ( {/*
  • Edit Message
  • */} - {context == "channel" && ( + {enablePin && (
  • Pin Message
  • @@ -169,7 +174,7 @@ export default function Commands({ {deleteModalVisible && ( - + )} {forwardModalVisible && ( diff --git a/src/common/hook/useNormalizeMessage.js b/src/common/hook/useNormalizeMessage.js index e8ea8bf1..faa53a34 100644 --- a/src/common/hook/useNormalizeMessage.js +++ b/src/common/hook/useNormalizeMessage.js @@ -33,9 +33,11 @@ export default function useNormalizeMessage() { : ""; let user = { ...(data.users[from_user] || {}) }; user.avatar = - typeof user.avatar !== "undefined" + user.avatar !== null ? `${BASE_URL}/resource/archive/attachment?file_path=${filePath}&attachment_id=${user.avatar}` : ""; + + console.log("user data", transformedContent, user); return { user, content: transformedContent, diff --git a/src/common/hook/usePinMessage.js b/src/common/hook/usePinMessage.js new file mode 100644 index 00000000..3fe2f23d --- /dev/null +++ b/src/common/hook/usePinMessage.js @@ -0,0 +1,46 @@ +import { useState, useEffect } from "react"; +import { useSelector } from "react-redux"; +import { + usePinMessageMutation, + useUnpinMessageMutation, +} from "../../app/services/message"; +export default function usePinMessage(cid = null) { + const [pins, setPins] = useState([]); + const { channel, loginUser } = useSelector((store) => { + return { + channel: store.channels.byId[cid], + loginUser: store.contacts.byId[store.authData.uid], + }; + }); + const [pin, { isError, isLoading, isSuccess }] = usePinMessageMutation(); + const [ + unpin, + { isError: isUnpinError, isLoading: isUnpining, isSuccess: isUnpinSuccess }, + ] = useUnpinMessageMutation(); + const pinMessage = (mid) => { + if (!mid || !cid) return; + pin({ mid, gid: +cid }); + }; + const unpinMessage = (mid) => { + if (!mid || !cid) return; + unpin({ mid, gid: +cid }); + }; + useEffect(() => { + if (channel) { + setPins(channel.pinned_messages); + } + }, [channel]); + + return { + pins, + canPin: loginUser.is_admin || channel?.owner == loginUser.uid, + pinMessage, + unpinMessage, + isError, + isPining: isLoading, + isSuccess, + isUnpinError, + isUnpining, + isUnpinSuccess, + }; +} diff --git a/src/routes/chat/ChannelChat/PinList.js b/src/routes/chat/ChannelChat/PinList.js new file mode 100644 index 00000000..c9faffe5 --- /dev/null +++ b/src/routes/chat/ChannelChat/PinList.js @@ -0,0 +1,134 @@ +// import React from "react"; +// import { useSelector } from "react-redux"; +import styled from "styled-components"; +import usePinMessage from "../../../common/hook/usePinMessage"; +import PreviewMessage from "../../../common/component/Message/PreviewMessage"; +import IconSurprise from "../../../assets/icons/emoji.suprise.svg"; +// import IconForward from "../../../assets/icons/forward.svg"; +import IconClose from "../../../assets/icons/close.svg"; +const Styled = styled.div` + padding: 16px; + background: #f9fafb; + filter: drop-shadow(0px 25px 50px rgba(31, 41, 55, 0.25)); + border-radius: 12px; + width: 406px; + > .head { + font-weight: 600; + font-size: 16px; + line-height: 24px; + color: #344054; + margin-bottom: 16px; + } + > .none { + padding: 16px; + width: 100%; + display: flex; + flex-direction: column; + gap: 8px; + align-items: center; + .tip { + width: 240px; + font-weight: 600; + font-size: 16px; + line-height: 24px; + text-align: center; + color: #475467; + } + } + > .list { + display: flex; + flex-direction: column; + gap: 8px; + .pin { + position: relative; + border: 1px solid #f2f4f7; + border-radius: var(--br); + > .preview { + background: none; + .down img { + width: 100% !important; + height: auto !important; + } + } + > .opts { + visibility: hidden; + display: flex; + align-items: center; + gap: 4px; + position: absolute; + top: 4px; + right: 4px; + padding: 4px; + border: 1px solid rgba(0, 0, 0, 0.08); + border-radius: 6px; + .btn { + display: flex; + background: none; + border: none; + svg { + width: 16px; + height: 16px; + path { + fill-opacity: 1; + fill: #667085; + } + } + } + } + &:hover .opts { + visibility: visible; + } + } + } +`; +export default function PinList({ id }) { + const { pins, unpinMessage, canPin } = usePinMessage(id); + const handleUnpin = (evt) => { + const { mid } = evt.currentTarget.dataset; + console.log("unpin msg", mid); + unpinMessage(+mid); + }; + const noPins = pins.length == 0; + return ( + +

    Pinned Message({pins.length})

    + + {noPins ? ( +
    + +
    + This channel doesn’t have any pinned message yet. +
    +
    + ) : ( +
      + {pins.map(({ mid }) => { + return ( +
    • + +
      + {/* */} + {canPin && ( + + )} +
      +
    • + ); + })} +
    + )} +
    + ); +} diff --git a/src/routes/chat/ChannelChat/index.js b/src/routes/chat/ChannelChat/index.js index d56f0d51..1eb717cc 100644 --- a/src/routes/chat/ChannelChat/index.js +++ b/src/routes/chat/ChannelChat/index.js @@ -1,6 +1,7 @@ import { useState } from "react"; import { useDebounce } from "rooks"; import { useSelector } from "react-redux"; +import PinList from "./PinList"; import { useReadMessageMutation } from "../../../app/services/message"; import useChatScroll from "../../../common/hook/useChatScroll"; import ChannelIcon from "../../../common/component/ChannelIcon"; @@ -9,7 +10,7 @@ import Contact from "../../../common/component/Contact"; import Layout from "../Layout"; import { renderMessageFragment } from "../utils"; import EditIcon from "../../../assets/icons/edit.svg"; -import alertIcon from "../../../assets/icons/alert.svg?url"; +// import alertIcon from "../../../assets/icons/alert.svg?url"; import peopleIcon from "../../../assets/icons/people.svg?url"; import pinIcon from "../../../assets/icons/pin.svg?url"; // import searchIcon from "../../../assets/icons/search.svg?url"; @@ -25,8 +26,10 @@ import { } from "./styled"; import ChannelInviteModal from "../../../common/component/ChannelInviteModal"; import { NavLink, useLocation } from "react-router-dom"; +import Tippy from "@tippyjs/react"; export default function ChannelChat({ cid = "", dropFiles = [] }) { + const [toolVisible, setToolVisible] = useState(""); const { pathname } = useLocation(); const [updateReadIndex] = useReadMessageMutation(); const updateReadDebounced = useDebounce(updateReadIndex, 300); @@ -70,6 +73,7 @@ export default function ChannelChat({ cid = "", dropFiles = [] }) { const addVisible = loginUser?.is_admin || owner == loginUid; console.log("channel message list", msgIds); const readIndex = footprint.readChannels[cid]; + const pinCount = data?.pinned_messages?.length || 0; return ( <> {addMemberModalVisible && ( @@ -93,16 +97,40 @@ export default function ChannelChat({ cid = "", dropFiles = [] }) { opt icon -
  • + {/*
  • opt icon -
  • -
  • - - opt icon - -
  • + */} + + { + setToolVisible("pin"); + }} + onHide={() => { + setToolVisible(""); + }} + delay={[0, 0]} + duration={0} + placement="left-start" + popperOptions={{ strategy: "fixed" }} + offset={[0, 80]} + interactive + trigger="click" + content={} + > +
  • 0 ? "badge" : ""}`} + data-count={pinCount} + > + opt icon +
  • +
    +
  • opt icon diff --git a/src/routes/chat/Layout/styled.js b/src/routes/chat/Layout/styled.js index 65ad82e8..8700e286 100644 --- a/src/routes/chat/Layout/styled.js +++ b/src/routes/chat/Layout/styled.js @@ -65,7 +65,28 @@ const Styled = styled.article` .tools { gap: 24px; .tool { + position: relative; cursor: pointer; + &.badge:after { + position: absolute; + top: -8px; + right: -8px; + content: attr(data-count); + display: flex; + justify-content: center; + align-items: center; + width: 16px; + height: 16px; + + border-radius: 50%; + background-color: #22ccee; + color: #fff; + font-weight: 900; + font-size: 10px; + line-height: 10px; + text-align: center; + color: #ffffff; + } } } .apps { diff --git a/yarn.lock b/yarn.lock index 26afaaab..1e45b462 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1190,9 +1190,9 @@ dependencies: "@cspotcode/source-map-consumer" "0.8.0" -"@csstools/postcss-color-function@^1.0.3": +"@csstools/postcss-color-function@^1.1.0": version "1.1.0" - resolved "http://mirrors.cloud.tencent.com/npm/@csstools%2fpostcss-color-function/-/postcss-color-function-1.1.0.tgz#229966327747f58fbe586de35daa139db3ce1e5d" + resolved "https://mirrors.cloud.tencent.com/npm/@csstools%2fpostcss-color-function/-/postcss-color-function-1.1.0.tgz#229966327747f58fbe586de35daa139db3ce1e5d" integrity sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" @@ -1220,9 +1220,9 @@ "@csstools/postcss-progressive-custom-properties" "^1.1.0" postcss-value-parser "^4.2.0" -"@csstools/postcss-is-pseudo-class@^2.0.1": +"@csstools/postcss-is-pseudo-class@^2.0.2": version "2.0.2" - resolved "http://mirrors.cloud.tencent.com/npm/@csstools%2fpostcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.2.tgz#a834ca11a43d6ed9bc9e3ff53c80d490a4b1aaad" + resolved "https://mirrors.cloud.tencent.com/npm/@csstools%2fpostcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.2.tgz#a834ca11a43d6ed9bc9e3ff53c80d490a4b1aaad" integrity sha512-L9h1yxXMj7KpgNzlMrw3isvHJYkikZgZE4ASwssTnGEH8tm50L6QsM9QQT5wR4/eO5mU0rN5axH7UzNxEYg5CA== dependencies: postcss-selector-parser "^6.0.10" @@ -1234,9 +1234,9 @@ dependencies: postcss-value-parser "^4.2.0" -"@csstools/postcss-oklab-function@^1.0.2": +"@csstools/postcss-oklab-function@^1.1.0": version "1.1.0" - resolved "http://mirrors.cloud.tencent.com/npm/@csstools%2fpostcss-oklab-function/-/postcss-oklab-function-1.1.0.tgz#e9a269487a292e0930760948e923e1d46b638ee6" + resolved "https://mirrors.cloud.tencent.com/npm/@csstools%2fpostcss-oklab-function/-/postcss-oklab-function-1.1.0.tgz#e9a269487a292e0930760948e923e1d46b638ee6" integrity sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" @@ -2032,20 +2032,6 @@ dependencies: prismjs "^1.23.0" -"@toast-ui/editor@^3.1.3": - version "3.1.4" - resolved "http://mirrors.cloud.tencent.com/npm/@toast-ui%2feditor/-/editor-3.1.4.tgz#7f011a138c3aae6c7521b0025146ab202daa8d6b" - integrity sha512-n+QbUVkiCWD5Qavm1wd198lga64uPj0F/3e7ZHfK+aU07xW+hUjsCnp+C+iIPGaiiQ3OL9I0oNRLW7PwbRn9Ug== - dependencies: - dompurify "^2.3.3" - prosemirror-commands "^1.1.9" - prosemirror-history "^1.1.3" - prosemirror-inputrules "^1.1.3" - prosemirror-keymap "^1.1.4" - prosemirror-model "^1.14.1" - prosemirror-state "^1.3.4" - prosemirror-view "^1.18.7" - "@toast-ui/editor@^3.1.5": version "3.1.5" resolved "http://mirrors.cloud.tencent.com/npm/@toast-ui%2feditor/-/editor-3.1.5.tgz#b47c3d94c23a4f0f6a653975b0b4b35b0035d31f" @@ -2060,12 +2046,12 @@ prosemirror-state "^1.3.4" prosemirror-view "^1.18.7" -"@toast-ui/react-editor@^3.1.3": - version "3.1.3" - resolved "http://mirrors.cloud.tencent.com/npm/@toast-ui%2freact-editor/-/react-editor-3.1.3.tgz#5d55ecf08df4c6a230c104f5e4dbab9212107941" - integrity sha512-k5W53y/R3cZvSH3UfDgeT8L1k8MpRri4O9hcTeuXtnbkkCtPQjt0m696tKrZvSXRNeqa4mKT0m8uNbHJAqWD4g== +"@toast-ui/react-editor@^3.1.5": + version "3.1.5" + resolved "http://mirrors.cloud.tencent.com/npm/@toast-ui%2freact-editor/-/react-editor-3.1.5.tgz#5254a09944903c06ab3ce7184d2c939ae2219dd9" + integrity sha512-CD8jQ385gtR2XsJExk7J3A9g8X+kabY71MVVim7NVaBrOut+Kl0tZUZFC3LeViggMVWgc4qE/DEtEqX2pIKG8A== dependencies: - "@toast-ui/editor" "^3.1.3" + "@toast-ui/editor" "^3.1.5" "@trysound/sax@0.2.0": version "0.2.0" @@ -3297,18 +3283,6 @@ at-least-node@^1.0.0: resolved "http://mirrors.cloud.tencent.com/npm/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -autoprefixer@^10.4.4: - version "10.4.4" - resolved "https://mirrors.cloud.tencent.com/npm/autoprefixer/-/autoprefixer-10.4.4.tgz#3e85a245b32da876a893d3ac2ea19f01e7ea5a1e" - integrity sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA== - dependencies: - browserslist "^4.20.2" - caniuse-lite "^1.0.30001317" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - autoprefixer@^10.4.5: version "10.4.5" resolved "https://mirrors.tencent.com/npm/autoprefixer/-/autoprefixer-10.4.5.tgz#662193c744094b53d3637f39be477e07bd904998" @@ -3321,13 +3295,6 @@ autoprefixer@^10.4.5: picocolors "^1.0.0" postcss-value-parser "^4.2.0" -axios@^0.26.1: - version "0.26.1" - resolved "http://mirrors.cloud.tencent.com/npm/axios/-/axios-0.26.1.tgz#1ede41c51fcf51bbbd6fd43669caaa4f0495aaa9" - integrity sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA== - dependencies: - follow-redirects "^1.14.8" - babel-loader@^8.2.5: version "8.2.5" resolved "https://mirrors.tencent.com/npm/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e" @@ -3535,6 +3502,17 @@ browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4 node-releases "^2.0.2" picocolors "^1.0.0" +browserslist@^4.20.3: + version "4.20.3" + resolved "https://mirrors.cloud.tencent.com/npm/browserslist/-/browserslist-4.20.3.tgz#eb7572f49ec430e054f56d52ff0ebe9be915f8bf" + integrity sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg== + dependencies: + caniuse-lite "^1.0.30001332" + electron-to-chromium "^1.4.118" + escalade "^3.1.1" + node-releases "^2.0.3" + picocolors "^1.0.0" + buffer-from@^1.0.0: version "1.1.2" resolved "https://mirrors.cloud.tencent.com/npm/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -4462,6 +4440,11 @@ ejs@^3.1.6: dependencies: jake "^10.8.5" +electron-to-chromium@^1.4.118: + version "1.4.123" + resolved "https://mirrors.cloud.tencent.com/npm/electron-to-chromium/-/electron-to-chromium-1.4.123.tgz#de88ea7fd29d7c868e63c88f129e91494bcf3266" + integrity sha512-0pHGE53WkYoFbsgwYcVKEpWa6jbzlvkohIEA2CUoZ9b5KC+w/zlMiQHvW/4IBcOh7YoEFqRNavgTk02TBoUTUw== + electron-to-chromium@^1.4.84: version "1.4.118" resolved "https://mirrors.cloud.tencent.com/npm/electron-to-chromium/-/electron-to-chromium-1.4.118.tgz#2d917c71712dac9652cc01af46c7d0bd51552974" @@ -4651,10 +4634,10 @@ eslint-plugin-prettier@^4.0.0: dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-react-hooks@^4.4.0: - version "4.4.0" - resolved "http://mirrors.cloud.tencent.com/npm/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.4.0.tgz#71c39e528764c848d8253e1aa2c7024ed505f6c4" - integrity sha512-U3RVIfdzJaeKDQKEJbz5p3NW8/L80PCATJAfuojwbaEL+gBjfGdhUcGde+WGUW46Q5sr/NgxevsIiDtNXrvZaQ== +eslint-plugin-react-hooks@^4.5.0: + version "4.5.0" + resolved "https://mirrors.cloud.tencent.com/npm/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz#5f762dfedf8b2cf431c689f533c9d3fa5dcf25ad" + integrity sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw== eslint-plugin-react@^7.29.4: version "7.29.4" @@ -5088,7 +5071,7 @@ flatted@^3.1.0: resolved "http://mirrors.cloud.tencent.com/npm/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== -follow-redirects@^1.0.0, follow-redirects@^1.14.8: +follow-redirects@^1.0.0: version "1.14.9" resolved "https://mirrors.tencent.com/npm/follow-redirects/-/follow-redirects-1.14.9.tgz#dd4ea157de7bfaf9ea9b3fbd85aa16951f78d8d7" integrity sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w== @@ -6196,10 +6179,10 @@ linkifyjs@^3.0.5: resolved "http://mirrors.cloud.tencent.com/npm/linkifyjs/-/linkifyjs-3.0.5.tgz#99e51a3a0c0e232fcb63ebb89eea3ff923378f34" integrity sha512-1Y9XQH65eQKA9p2xtk+zxvnTeQBG7rdAXSkUG97DmuI/Xhji9uaUzaWxRj6rf9YC0v8KKHkxav7tnLX82Sz5Fg== -lint-staged@^12.4.0: - version "12.4.0" - resolved "http://mirrors.cloud.tencent.com/npm/lint-staged/-/lint-staged-12.4.0.tgz#1fb8c73ac7a1c670b87bd2c1bf1e302c866e77af" - integrity sha512-3X7MR0h9b7qf4iXf/1n7RlVAx+EzpAZXoCEMhVSpaBlgKDfH2ewf+QUm7BddFyq29v4dgPP+8+uYpWuSWx035A== +lint-staged@^12.4.1: + version "12.4.1" + resolved "https://mirrors.tencent.com/npm/lint-staged/-/lint-staged-12.4.1.tgz#63fa27bfc8a33515f6902f63f6670864f1fb233c" + integrity sha512-PTXgzpflrQ+pODQTG116QNB+Q6uUTDg5B5HqGvNhoQSGt8Qy+MA/6zSnR8n38+sxP5TapzeQGTvoKni0KRS8Vg== dependencies: cli-truncate "^3.1.0" colorette "^2.0.16" @@ -6678,7 +6661,7 @@ node-forge@^1: resolved "http://mirrors.cloud.tencent.com/npm/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-releases@^2.0.2: +node-releases@^2.0.2, node-releases@^2.0.3: version "2.0.3" resolved "https://mirrors.cloud.tencent.com/npm/node-releases/-/node-releases-2.0.3.tgz#225ee7488e4a5e636da8da52854844f9d716ca96" integrity sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw== @@ -7206,9 +7189,9 @@ postcss-custom-media@^8.0.0: resolved "http://mirrors.cloud.tencent.com/npm/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz#1be6aff8be7dc9bf1fe014bde3b71b92bb4552f1" integrity sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g== -postcss-custom-properties@^12.1.5: +postcss-custom-properties@^12.1.7: version "12.1.7" - resolved "http://mirrors.cloud.tencent.com/npm/postcss-custom-properties/-/postcss-custom-properties-12.1.7.tgz#ca470fd4bbac5a87fd868636dafc084bc2a78b41" + resolved "https://mirrors.cloud.tencent.com/npm/postcss-custom-properties/-/postcss-custom-properties-12.1.7.tgz#ca470fd4bbac5a87fd868636dafc084bc2a78b41" integrity sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg== dependencies: postcss-value-parser "^4.2.0" @@ -7303,9 +7286,9 @@ postcss-initial@^4.0.1: resolved "http://mirrors.cloud.tencent.com/npm/postcss-initial/-/postcss-initial-4.0.1.tgz#529f735f72c5724a0fb30527df6fb7ac54d7de42" integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== -postcss-lab-function@^4.1.2: +postcss-lab-function@^4.2.0: version "4.2.0" - resolved "http://mirrors.cloud.tencent.com/npm/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz#e054e662c6480202f5760887ec1ae0d153357123" + resolved "https://mirrors.cloud.tencent.com/npm/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz#e054e662c6480202f5760887ec1ae0d153357123" integrity sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w== dependencies: "@csstools/postcss-progressive-custom-properties" "^1.1.0" @@ -7408,9 +7391,9 @@ postcss-modules-values@^4.0.0: dependencies: icss-utils "^5.0.0" -postcss-nesting@^10.1.3: +postcss-nesting@^10.1.4: version "10.1.4" - resolved "http://mirrors.cloud.tencent.com/npm/postcss-nesting/-/postcss-nesting-10.1.4.tgz#80de9d1c2717bc44df918dd7f118929300192a7a" + resolved "https://mirrors.cloud.tencent.com/npm/postcss-nesting/-/postcss-nesting-10.1.4.tgz#80de9d1c2717bc44df918dd7f118929300192a7a" integrity sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA== dependencies: postcss-selector-parser "^6.0.10" @@ -7508,21 +7491,21 @@ postcss-place@^7.0.4: dependencies: postcss-value-parser "^4.2.0" -postcss-preset-env@^7.4.3: - version "7.4.3" - resolved "http://mirrors.cloud.tencent.com/npm/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz#fb1c8b4cb405da042da0ddb8c5eda7842c08a449" - integrity sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg== +postcss-preset-env@^7.4.4: + version "7.4.4" + resolved "https://mirrors.cloud.tencent.com/npm/postcss-preset-env/-/postcss-preset-env-7.4.4.tgz#069e34e31e2a7345154da7936b9fc1fcbdbd6d43" + integrity sha512-MqzSEx/QsvOk562iV9mLTgIvLFEOq1os9QBQfkgnq8TW6yKhVFPGh0gdXSK5ZlmjuNQEga6/x833e86XZF/lug== dependencies: - "@csstools/postcss-color-function" "^1.0.3" + "@csstools/postcss-color-function" "^1.1.0" "@csstools/postcss-font-format-keywords" "^1.0.0" "@csstools/postcss-hwb-function" "^1.0.0" "@csstools/postcss-ic-unit" "^1.0.0" - "@csstools/postcss-is-pseudo-class" "^2.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.2" "@csstools/postcss-normalize-display-values" "^1.0.0" - "@csstools/postcss-oklab-function" "^1.0.2" + "@csstools/postcss-oklab-function" "^1.1.0" "@csstools/postcss-progressive-custom-properties" "^1.3.0" - autoprefixer "^10.4.4" - browserslist "^4.20.2" + autoprefixer "^10.4.5" + browserslist "^4.20.3" css-blank-pseudo "^3.0.3" css-has-pseudo "^3.0.4" css-prefers-color-scheme "^6.0.3" @@ -7533,7 +7516,7 @@ postcss-preset-env@^7.4.3: postcss-color-hex-alpha "^8.0.3" postcss-color-rebeccapurple "^7.0.2" postcss-custom-media "^8.0.0" - postcss-custom-properties "^12.1.5" + postcss-custom-properties "^12.1.7" postcss-custom-selectors "^6.0.0" postcss-dir-pseudo-class "^6.0.4" postcss-double-position-gradients "^3.1.1" @@ -7544,22 +7527,22 @@ postcss-preset-env@^7.4.3: postcss-gap-properties "^3.0.3" postcss-image-set-function "^4.0.6" postcss-initial "^4.0.1" - postcss-lab-function "^4.1.2" + postcss-lab-function "^4.2.0" postcss-logical "^5.0.4" postcss-media-minmax "^5.0.0" - postcss-nesting "^10.1.3" + postcss-nesting "^10.1.4" postcss-opacity-percentage "^1.1.2" postcss-overflow-shorthand "^3.0.3" postcss-page-break "^3.0.4" postcss-place "^7.0.4" - postcss-pseudo-class-any-link "^7.1.1" + postcss-pseudo-class-any-link "^7.1.2" postcss-replace-overflow-wrap "^4.0.0" postcss-selector-not "^5.0.0" postcss-value-parser "^4.2.0" -postcss-pseudo-class-any-link@^7.1.1: +postcss-pseudo-class-any-link@^7.1.2: version "7.1.2" - resolved "http://mirrors.cloud.tencent.com/npm/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz#81ec491aa43f97f9015e998b7a14263b4630bdf0" + resolved "https://mirrors.cloud.tencent.com/npm/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz#81ec491aa43f97f9015e998b7a14263b4630bdf0" integrity sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w== dependencies: postcss-selector-parser "^6.0.10" @@ -7852,13 +7835,18 @@ raw-body@2.4.3: iconv-lite "0.4.24" unpipe "1.0.0" -re-resizable@^6.9.0, re-resizable@^6.9.1, re-resizable@^6.9.8: +re-resizable@^6.9.0, re-resizable@^6.9.1: version "6.9.8" resolved "http://mirrors.cloud.tencent.com/npm/re-resizable/-/re-resizable-6.9.8.tgz#d9e8a785be18ab60921751e03a775096642ccd20" integrity sha512-eHqU6DngM6zQOM50cx7CEmjBK+sFh5o/mzkfn9mDGnjtJsB2iFPKfGQPFtRBhuEIgeE03H61aVVEBOV+U2ZkrA== dependencies: fast-memoize "^2.5.1" +re-resizable@^6.9.9: + version "6.9.9" + resolved "http://mirrors.cloud.tencent.com/npm/re-resizable/-/re-resizable-6.9.9.tgz#99e8b31c67a62115dc9c5394b7e55892265be216" + integrity sha512-l+MBlKZffv/SicxDySKEEh42hR6m5bAHfNu3Tvxks2c4Ah+ldnWjfnVRwxo/nxF27SsUsxDS0raAzFuJNKABXA== + react-circular-progressbar@^2.0.4: version "2.0.4" resolved "http://mirrors.cloud.tencent.com/npm/react-circular-progressbar/-/react-circular-progressbar-2.0.4.tgz#5b04a9cf6be8c522c180e4e99ec6db63677335b0" @@ -7930,13 +7918,13 @@ react-dnd@^14.0.2: fast-deep-equal "^3.1.3" hoist-non-react-statics "^3.3.2" -react-dom@^18.0.0: - version "18.0.0" - resolved "http://mirrors.cloud.tencent.com/npm/react-dom/-/react-dom-18.0.0.tgz#26b88534f8f1dbb80853e1eabe752f24100d8023" - integrity sha512-XqX7uzmFo0pUceWFCt7Gff6IyIMzFUn7QMZrbrQfGxtaxXZIcGQzoNpRLE3fQLnS4XzLLPMZX2T9TRcSrasicw== +react-dom@^18.1.0: + version "18.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/react-dom/-/react-dom-18.1.0.tgz#7f6dd84b706408adde05e1df575b3a024d7e8a2f" + integrity sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w== dependencies: loose-envify "^1.1.0" - scheduler "^0.21.0" + scheduler "^0.22.0" react-error-overlay@^6.0.11: version "6.0.11" @@ -8037,10 +8025,10 @@ react-redux@^8.0.1: react-is "^18.0.0" use-sync-external-store "^1.0.0" -react-refresh@0.12.0: - version "0.12.0" - resolved "http://mirrors.cloud.tencent.com/npm/react-refresh/-/react-refresh-0.12.0.tgz#28ac0a2c30ef2bb3433d5fd0621e69a6d774c3a4" - integrity sha512-suLIhrU2IHKL5JEKR/fAwJv7bbeq4kJ+pJopf77jHwuR+HmJS/HbrPIGsTBUVfw7tXPOmYv7UJ7PCaN49e8x4A== +react-refresh@0.13.0: + version "0.13.0" + resolved "https://mirrors.cloud.tencent.com/npm/react-refresh/-/react-refresh-0.13.0.tgz#cbd01a4482a177a5da8d44c9755ebb1f26d5a1c1" + integrity sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg== react-router-dom@6: version "6.3.0" @@ -8109,10 +8097,10 @@ react-window@^1.8.7: "@babel/runtime" "^7.0.0" memoize-one ">=3.1.1 <6" -react@^18.0.0: - version "18.0.0" - resolved "https://mirrors.cloud.tencent.com/npm/react/-/react-18.0.0.tgz#b468736d1f4a5891f38585ba8e8fb29f91c3cb96" - integrity sha512-x+VL6wbT4JRVPm7EGxXhZ8w8LTROaxPXOqhlGyVSrv0sB1jkyFGgXxJ8LVoPRLvPR6/CIZGFmfzqUa2NYeMr2A== +react@^18.1.0: + version "18.1.0" + resolved "https://mirrors.cloud.tencent.com/npm/react/-/react-18.1.0.tgz#6f8620382decb17fdc5cc223a115e2adbf104890" + integrity sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ== dependencies: loose-envify "^1.1.0" @@ -8446,10 +8434,10 @@ safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: resolved "http://mirrors.tencent.com/npm/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -scheduler@^0.21.0: - version "0.21.0" - resolved "http://mirrors.cloud.tencent.com/npm/scheduler/-/scheduler-0.21.0.tgz#6fd2532ff5a6d877b6edb12f00d8ab7e8f308820" - integrity sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ== +scheduler@^0.22.0: + version "0.22.0" + resolved "https://mirrors.cloud.tencent.com/npm/scheduler/-/scheduler-0.22.0.tgz#83a5d63594edf074add9a7198b1bae76c3db01b8" + integrity sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ== dependencies: loose-envify "^1.1.0" @@ -8723,10 +8711,10 @@ slate-hyperscript@^0.77.0: dependencies: is-plain-object "^5.0.0" -slate-react@^0.77.3: - version "0.77.3" - resolved "http://mirrors.cloud.tencent.com/npm/slate-react/-/slate-react-0.77.3.tgz#6882bc22f501d503f90015925bcbdce3f7462a16" - integrity sha512-j7DeGHJMwePT6OeCX/nqkTXcrbo0599UyBQsP+knoqlrW/SRLuyCrj4rgOo6hbahOLlTR6wvKshW9p6KAs+uJA== +slate-react@^0.77.4: + version "0.77.4" + resolved "http://mirrors.cloud.tencent.com/npm/slate-react/-/slate-react-0.77.4.tgz#b2532b57e47c4e088b1583ed8befc6e238a15ad5" + integrity sha512-e3gYuEhjbEX4IhydC4kWZgcvH5fgJkJMuu9paarO6gdW5vRRSWnys/EbOs5ALp4e9NWr5u1XzQkJnbpyW5AqBA== dependencies: "@types/is-hotkey" "^0.1.1" "@types/lodash" "^4.14.149" @@ -8737,10 +8725,10 @@ slate-react@^0.77.3: scroll-into-view-if-needed "^2.2.20" tiny-invariant "1.0.6" -slate@^0.77.2: - version "0.77.2" - resolved "http://mirrors.cloud.tencent.com/npm/slate/-/slate-0.77.2.tgz#ba66ac32d96f5e6f6793a53727930248ec2279fc" - integrity sha512-raG/eyYyRDThz+r/opUD+wxWxwXQi4fH0ViZh41x8qBu8uOPMTBYl10RA7KsF8IK48DS207uPrvWGGBsnMCLwg== +slate@^0.78.0: + version "0.78.0" + resolved "http://mirrors.cloud.tencent.com/npm/slate/-/slate-0.78.0.tgz#cd0328d22b0a99c543987d2a2dd30903bb950ee9" + integrity sha512-VwQ0RafT3JPf9SFrXI02Dh3S4Iz9en7d1nn50C/LJjjqjfgv+a2ORbgWMdYjhycPYldaxJwcI3OpP9D1g4SXEg== dependencies: immer "^9.0.6" is-plain-object "^5.0.0"