import { Dropdown, Menu, MenuButton } from "@mui/joy"; import { SmilePlusIcon } from "lucide-react"; import { useRef, useState } from "react"; import useClickAway from "react-use/lib/useClickAway"; import { memoServiceClient } from "@/grpcweb"; import useCurrentUser from "@/hooks/useCurrentUser"; import { useMemoStore, useWorkspaceSettingStore } from "@/store/v1"; import { Memo } from "@/types/proto/api/v1/memo_service"; import { WorkspaceMemoRelatedSetting } from "@/types/proto/api/v1/workspace_setting_service"; import { WorkspaceSettingKey } from "@/types/proto/store/workspace_setting"; import { cn } from "@/utils"; interface Props { memo: Memo; className?: string; } const ReactionSelector = (props: Props) => { const { memo, className } = props; const currentUser = useCurrentUser(); const memoStore = useMemoStore(); const workspaceSettingStore = useWorkspaceSettingStore(); const [open, setOpen] = useState(false); const containerRef = useRef(null); const workspaceMemoRelatedSetting = workspaceSettingStore.getWorkspaceSettingByKey(WorkspaceSettingKey.MEMO_RELATED)?.memoRelatedSetting || WorkspaceMemoRelatedSetting.fromPartial({}); useClickAway(containerRef, () => { setOpen(false); }); const hasReacted = (reactionType: string) => { return memo.reactions.some((r) => r.reactionType === reactionType && r.creator === currentUser?.name); }; const handleReactionClick = async (reactionType: string) => { try { if (hasReacted(reactionType)) { const reactions = memo.reactions.filter( (reaction) => reaction.reactionType === reactionType && reaction.creator === currentUser.name, ); for (const reaction of reactions) { await memoServiceClient.deleteMemoReaction({ id: reaction.id }); } } else { await memoServiceClient.upsertMemoReaction({ name: memo.name, reaction: { contentId: memo.name, reactionType: reactionType, }, }); } await memoStore.getOrFetchMemoByName(memo.name, { skipCache: true }); } catch (error) { // skip error. } setOpen(false); }; return ( setOpen(isOpen)}>
{workspaceMemoRelatedSetting.reactions.map((reactionType) => { return ( handleReactionClick(reactionType)} > {reactionType} ); })}
); }; export default ReactionSelector;