1
1
import copy from "copy-to-clipboard" ;
2
2
import { observer } from "mobx-react" ;
3
+ import { CopyIcon , EditIcon } from "outline-icons" ;
3
4
import * as React from "react" ;
4
5
import { useTranslation } from "react-i18next" ;
5
6
import { useMenuState } from "reakit/Menu" ;
6
7
import { toast } from "sonner" ;
7
8
import EventBoundary from "@shared/components/EventBoundary" ;
8
9
import Comment from "~/models/Comment" ;
9
- import CommentDeleteDialog from "~/components/CommentDeleteDialog" ;
10
10
import ContextMenu from "~/components/ContextMenu" ;
11
- import MenuItem from "~/components/ContextMenu/MenuItem" ;
12
11
import OverflowMenuButton from "~/components/ContextMenu/OverflowMenuButton" ;
13
- import Separator from "~/components/ContextMenu/Separator" ;
12
+ import Template from "~/components/ContextMenu/Template" ;
13
+ import { actionToMenuItem } from "~/actions" ;
14
+ import {
15
+ deleteCommentFactory ,
16
+ resolveCommentFactory ,
17
+ unresolveCommentFactory ,
18
+ } from "~/actions/definitions/comments" ;
19
+ import useActionContext from "~/hooks/useActionContext" ;
14
20
import usePolicy from "~/hooks/usePolicy" ;
15
21
import useStores from "~/hooks/useStores" ;
16
22
import { commentPath , urlify } from "~/utils/routeHelpers" ;
@@ -24,24 +30,26 @@ type Props = {
24
30
onEdit : ( ) => void ;
25
31
/** Callback when the comment has been deleted */
26
32
onDelete : ( ) => void ;
33
+ /** Callback when the comment has been updated */
34
+ onUpdate : ( attrs : { resolved : boolean } ) => void ;
27
35
} ;
28
36
29
- function CommentMenu ( { comment, onEdit, onDelete, className } : Props ) {
37
+ function CommentMenu ( {
38
+ comment,
39
+ onEdit,
40
+ onDelete,
41
+ onUpdate,
42
+ className,
43
+ } : Props ) {
30
44
const menu = useMenuState ( {
31
45
modal : true ,
32
46
} ) ;
33
- const { documents, dialogs } = useStores ( ) ;
47
+ const { documents } = useStores ( ) ;
34
48
const { t } = useTranslation ( ) ;
35
49
const can = usePolicy ( comment ) ;
50
+ const context = useActionContext ( { isContextMenu : true } ) ;
36
51
const document = documents . get ( comment . documentId ) ;
37
52
38
- const handleDelete = React . useCallback ( ( ) => {
39
- dialogs . openModal ( {
40
- title : t ( "Delete comment" ) ,
41
- content : < CommentDeleteDialog comment = { comment } onSubmit = { onDelete } /> ,
42
- } ) ;
43
- } , [ dialogs , comment , onDelete , t ] ) ;
44
-
45
53
const handleCopyLink = React . useCallback ( ( ) => {
46
54
if ( document ) {
47
55
copy ( urlify ( commentPath ( document , comment ) ) ) ;
@@ -58,24 +66,46 @@ function CommentMenu({ comment, onEdit, onDelete, className }: Props) {
58
66
{ ...menu }
59
67
/>
60
68
</ EventBoundary >
61
-
62
69
< ContextMenu { ...menu } aria-label = { t ( "Comment options" ) } >
63
- { can . update && (
64
- < MenuItem { ...menu } onClick = { onEdit } >
65
- { t ( "Edit" ) }
66
- </ MenuItem >
67
- ) }
68
- < MenuItem { ...menu } onClick = { handleCopyLink } >
69
- { t ( "Copy link" ) }
70
- </ MenuItem >
71
- { can . delete && (
72
- < >
73
- < Separator />
74
- < MenuItem { ...menu } onClick = { handleDelete } dangerous >
75
- { t ( "Delete" ) }
76
- </ MenuItem >
77
- </ >
78
- ) }
70
+ < Template
71
+ { ...menu }
72
+ items = { [
73
+ {
74
+ type : "button" ,
75
+ title : `${ t ( "Edit" ) } …` ,
76
+ icon : < EditIcon /> ,
77
+ onClick : onEdit ,
78
+ visible : can . update ,
79
+ } ,
80
+ actionToMenuItem (
81
+ resolveCommentFactory ( {
82
+ comment,
83
+ onResolve : ( ) => onUpdate ( { resolved : true } ) ,
84
+ } ) ,
85
+ context
86
+ ) ,
87
+ actionToMenuItem (
88
+ unresolveCommentFactory ( {
89
+ comment,
90
+ onUnresolve : ( ) => onUpdate ( { resolved : false } ) ,
91
+ } ) ,
92
+ context
93
+ ) ,
94
+ {
95
+ type : "button" ,
96
+ icon : < CopyIcon /> ,
97
+ title : t ( "Copy link" ) ,
98
+ onClick : handleCopyLink ,
99
+ } ,
100
+ {
101
+ type : "separator" ,
102
+ } ,
103
+ actionToMenuItem (
104
+ deleteCommentFactory ( { comment, onDelete } ) ,
105
+ context
106
+ ) ,
107
+ ] }
108
+ />
79
109
</ ContextMenu >
80
110
</ >
81
111
) ;
0 commit comments