1
- import { Avatar } from '@/ui'
1
+ import { Avatar , Menu } from '@/ui'
2
2
import React , { useState } from 'react'
3
- import { Markdown , A , LikeModal , useLikes } from '@/components'
3
+ import { Markdown , A , LikeModal , useLikes , EditComment } from '@/components'
4
4
import { DateTime } from 'luxon'
5
5
import { UpdateCommentType } from 'src/pages'
6
6
import { useSession } from 'next-auth/client'
7
7
import classNames from 'classnames'
8
- import { ThumbsUp } from 'phosphor-react'
8
+ import {
9
+ DotsThreeOutlineVertical ,
10
+ Pencil ,
11
+ ThumbsUp ,
12
+ Trash ,
13
+ } from 'phosphor-react'
14
+ import { User } from 'src/pages/members'
9
15
10
16
export type GoalUpdateType = {
11
17
id : string
@@ -14,14 +20,17 @@ export type GoalUpdateType = {
14
20
}
15
21
16
22
export default function UpdateComment ( {
23
+ updateId,
17
24
comment,
18
25
children,
19
26
isLastComment = false ,
20
27
} : {
28
+ updateId : string
21
29
children : string
22
30
comment : UpdateCommentType
23
31
isLastComment ?: boolean
24
32
} ) {
33
+ const [ isInEditMode , setIsInEditMode ] = useState ( false )
25
34
const postedOn = DateTime . fromMillis ( comment . createdAt )
26
35
const [ session ] = useSession ( )
27
36
const [ isLikeModalOpen , setIsLikeModalOpen ] = useState ( false )
@@ -43,75 +52,120 @@ export default function UpdateComment({
43
52
} )
44
53
return (
45
54
< li >
46
- < div className = "relative pb-6" >
47
- < div className = "relative flex items-start space-x-3" >
48
- < div className = "relative" >
49
- < A href = { `/${ comment . postedBy . username } ` } >
50
- < Avatar
51
- src = { comment . postedBy . image }
52
- alt = { comment . postedBy . account ?. firstName }
53
- />
54
- </ A >
55
- </ div >
56
- < div className = "min-w-0 flex-1" >
57
- < div >
58
- < div className = "text-sm" >
59
- < a
60
- href = { `/${ comment . postedBy . username } ` }
61
- className = "font-medium text-gray-900"
62
- >
63
- { comment . postedBy . account ?. firstName ?? comment . postedBy . name }
64
- </ a >
65
- </ div >
66
- < p className = "mt-0.5 text-sm text-gray-500" >
67
- Posted on{ ' ' }
68
- < time dateTime = { postedOn . toISO ( ) } >
69
- { postedOn . toLocaleString ( DateTime . DATE_MED_WITH_WEEKDAY ) }
70
- </ time >
71
- </ p >
55
+ { isInEditMode ? (
56
+ < EditComment
57
+ updateId = { updateId }
58
+ comment = { comment }
59
+ cancelEditMode = { ( ) => setIsInEditMode ( false ) }
60
+ />
61
+ ) : (
62
+ < div className = "relative pb-6" >
63
+ < div className = "relative flex items-start space-x-3" >
64
+ < div className = "relative" >
65
+ < A href = { `/${ comment . postedBy . username } ` } >
66
+ < Avatar
67
+ src = { comment . postedBy . image }
68
+ alt = { comment . postedBy . account ?. firstName }
69
+ />
70
+ </ A >
72
71
</ div >
73
- < div className = "mt-2 text-sm text-gray-700" >
74
- < div className = "prose prose-sm max-w-none" >
75
- < Markdown > { children } </ Markdown >
72
+ < div className = "min-w-0 flex-1" >
73
+ < div className = "flex space-x-3" >
74
+ < div className = "flex-1" >
75
+ < div className = "text-sm" >
76
+ < a
77
+ href = { `/${ comment . postedBy . username } ` }
78
+ className = "font-medium text-gray-900"
79
+ >
80
+ { comment . postedBy . account ?. firstName ??
81
+ comment . postedBy . name }
82
+ </ a >
83
+ </ div >
84
+ < p className = "mt-0.5 text-sm text-gray-500" >
85
+ Posted on{ ' ' }
86
+ < time dateTime = { postedOn . toISO ( ) } >
87
+ { postedOn . toLocaleString ( DateTime . DATE_MED_WITH_WEEKDAY ) }
88
+ </ time >
89
+ </ p >
90
+ </ div >
91
+ { session && ( session . user as User ) . id === comment . postedBy . id && (
92
+ < div className = "flex-shrink-0 self-center flex" >
93
+ < div className = "relative inline-block text-left" >
94
+ < Menu
95
+ trigger = {
96
+ < button className = "-m-2 p-2 rounded-full flex items-center text-gray-400 hover:text-gray-600" >
97
+ < span className = "sr-only" > Open quick actions</ span >
98
+ < DotsThreeOutlineVertical
99
+ className = "h-5 w-5"
100
+ aria-hidden = { true }
101
+ />
102
+ </ button >
103
+ }
104
+ >
105
+ < Menu . Item
106
+ icon = { Pencil }
107
+ onClick = { ( ) => setIsInEditMode ( true ) }
108
+ >
109
+ Edit
110
+ </ Menu . Item >
111
+ < Menu . Item
112
+ icon = { Trash }
113
+ onClick = { ( ) => {
114
+ // deleteUpdate()
115
+ // const id = toast.loading('Deleting your update...')
116
+ // toastId.current = id
117
+ } }
118
+ >
119
+ Delete
120
+ </ Menu . Item >
121
+ </ Menu >
122
+ </ div >
123
+ </ div >
124
+ ) }
125
+ </ div >
126
+ < div className = "mt-2 text-sm text-gray-700" >
127
+ < div className = "prose prose-sm max-w-none" >
128
+ < Markdown > { children } </ Markdown >
129
+ </ div >
76
130
</ div >
77
- </ div >
78
131
79
- < div className = "mt-3 flex justify-between space-x-8" >
80
- < div className = "flex space-x-6" >
81
- < span className = "inline-flex items-center text-sm" >
82
- < button
83
- className = "inline-flex space-x-2 text-gray-400 hover:text-gray-500"
84
- onClick = { ( ) => {
85
- if ( ! session ) {
86
- setIsLikeModalOpen ( true )
87
- return
88
- }
89
- toggleLike ( )
90
- } }
91
- >
92
- < ThumbsUp
93
- className = { classNames (
94
- 'h-5 w-5' ,
95
- hasLiked && 'text-brand-600'
96
- ) }
97
- weight = { hasLiked ? 'bold' : 'regular' }
132
+ < div className = "mt-3 flex justify-between space-x-8" >
133
+ < div className = "flex space-x-6" >
134
+ < span className = "inline-flex items-center text-sm" >
135
+ < button
136
+ className = "inline-flex space-x-2 text-gray-400 hover:text-gray-500"
137
+ onClick = { ( ) => {
138
+ if ( ! session ) {
139
+ setIsLikeModalOpen ( true )
140
+ return
141
+ }
142
+ toggleLike ( )
143
+ } }
144
+ >
145
+ < ThumbsUp
146
+ className = { classNames (
147
+ 'h-5 w-5' ,
148
+ hasLiked && 'text-brand-600'
149
+ ) }
150
+ weight = { hasLiked ? 'bold' : 'regular' }
151
+ />
152
+ < span className = "font-medium text-gray-900" >
153
+ { likesCount }
154
+ </ span >
155
+ < span className = "sr-only" > likes</ span >
156
+ </ button >
157
+ < LikeModal
158
+ user = { comment . postedBy }
159
+ isOpen = { isLikeModalOpen }
160
+ setIsOpen = { setIsLikeModalOpen }
98
161
/>
99
- < span className = "font-medium text-gray-900" >
100
- { likesCount }
101
- </ span >
102
- < span className = "sr-only" > likes</ span >
103
- </ button >
104
- < LikeModal
105
- user = { comment . postedBy }
106
- isOpen = { isLikeModalOpen }
107
- setIsOpen = { setIsLikeModalOpen }
108
- />
109
- </ span >
162
+ </ span >
163
+ </ div >
110
164
</ div >
111
165
</ div >
112
166
</ div >
113
167
</ div >
114
- </ div >
168
+ ) }
115
169
</ li >
116
170
)
117
171
}
0 commit comments