import { useState, useRef } from "react"; import { useDispatch } from "react-redux"; import styled from "styled-components"; import Tippy from "@tippyjs/react"; import { hideAll } from "tippy.js"; import { updateSelectMessages } from "../../../app/slices/ui"; // import StyledMenu from "../styled/Menu"; import ContextMenu from "../ContextMenu"; import Tooltip from "../../component/Tooltip"; import useFavMessage from "../../hook/useFavMessage"; import useSendMessage from "../../hook/useSendMessage"; import ReactionPicker from "./ReactionPicker"; import replyIcon from "../../../assets/icons/reply.svg?url"; import reactIcon from "../../../assets/icons/reaction.svg?url"; import editIcon from "../../../assets/icons/edit.svg?url"; import IconBookmark from "../../../assets/icons/bookmark.add.svg"; import IconPin from "../../../assets/icons/pin.svg"; import IconForward from "../../../assets/icons/forward.svg"; import IconSelect from "../../../assets/icons/select.svg"; import IconDelete from "../../../assets/icons/delete.svg"; import moreIcon from "../../../assets/icons/more.svg?url"; import toast from "react-hot-toast"; import useMessageOperation from "./useMessageOperation"; const StyledCmds = styled.ul` z-index: 999; position: absolute; right: 10px; top: 0; transform: translateY(-50%); display: flex; align-items: center; border: 1px solid rgba(0, 0, 0, 0.08); border-radius: 6px; background-color: #fff; visibility: hidden; &.visible { visibility: visible; } .cmd { display: flex; cursor: pointer; padding: 4px; &:hover { background-color: #f3f4f6; } img, svg { width: 24px; height: 24px; } &.fav { svg path { fill: #667085; } } } > .picker { position: absolute; left: -10px; top: 0; transform: translateX(-100%); } `; export default function Commands({ context = "user", contextId = 0, mid = 0, toggleEditMessage, }) { const { canDelete, canReply, canEdit, canPin, unPin, pinned, toggleDeleteModal, toggleForwardModal, togglePinModal, PinModal, DeleteModal, ForwardModal, } = useMessageOperation({ mid, context, contextId }); const { setReplying } = useSendMessage({ context, to: contextId }); const { addFavorite, isFavorited } = useFavMessage({ cid: context == "channel" ? contextId : null, }); const dispatch = useDispatch(); const [tippyVisible, setTippyVisible] = useState(false); const cmdsRef = useRef(null); const handleReply = (fromMenu) => { if (contextId) { setReplying(mid); } if (fromMenu) { hideAll(); } }; const handleTippyVisible = (visible = true) => { setTippyVisible(visible); }; const handleSelect = (mid) => { dispatch(updateSelectMessages({ context, id: contextId, data: mid })); hideAll(); }; const handleUnpin = () => { hideAll(); unPin(mid); }; const handleAddFav = async () => { hideAll(); const faved = isFavorited(mid); if (faved) { toast.success("Favorited!"); return; } const added = await addFavorite(mid); if (added) { toast.success("Added Favorites!"); } else { toast.error("Added Favorites Failed!"); } }; return ( <> } >
  • icon emoji
  • {canEdit && (
  • icon edit
  • )} {canReply && (
  • icon reply
  • )}
  • , handler: pinned ? handleUnpin : togglePinModal, }, { title: "Forward", icon: , handler: toggleForwardModal, }, { title: "Select", icon: , handler: handleSelect.bind(null, mid), }, canDelete && { title: " Delete", danger: true, icon: , handler: toggleDeleteModal, }, ]} /> } >
  • icon more
  • {PinModal} {ForwardModal} {DeleteModal} ); }