1
- import React , { useEffect , useState } from 'react' ;
1
+ import React , { useEffect , useRef , useState } from 'react' ;
2
2
import styled from 'styled-components' ;
3
3
import { EmojiOfThread , Thread } from '@/types/thread' ;
4
4
import { flex } from '@/styles/mixin' ;
5
5
import { useChannelState , useEmojiState , useUserState } from '@/hooks' ;
6
6
import { useDispatch } from 'react-redux' ;
7
7
import { SOCKET_MESSAGE_TYPE } from '@/utils/constants' ;
8
8
import { sendMessageRequest } from '@/store/modules/socket.slice' ;
9
- import { JoinedUser } from '@/types ' ;
9
+ import TooltipPopup from './TooltipPopup/TooltipPopup ' ;
10
10
11
- const Container = styled . div `
12
- background-color: ${ ( props ) => props . color } ;
13
- box-shadow: inset 0 0 0 1px rgba(29, 155, 209);
14
- ${ flex ( 'center' , 'flex-start' , 'row' ) } ;
11
+ interface ContainerProps {
12
+ isMine : boolean ;
13
+ }
14
+
15
+ const Container = styled . div < ContainerProps > `
16
+ background-color: ${ ( props ) => ( props . isMine ? '#E2EFF4' : '#EFEFEF' ) } ;
17
+ box-shadow: inset 0 0 0 1px ${ ( props ) => ( props . isMine ? '#1D9BD1' : '#EFEFEF' ) } ;
18
+ ${ flex ( ) } ;
15
19
position: relative;
16
20
cursor: pointer;
17
- padding: 0.15rem 0.4rem;
21
+ width: 2.6rem;
22
+ height: 1.6rem;
18
23
border-radius: 999em;
19
24
margin-right: 0.2rem;
20
25
` ;
21
- // EFEFEF
22
26
23
27
const EmojiToolTip = styled . div `
28
+ width: 12rem;
29
+ ${ flex ( 'center' , 'center' , 'column' ) } ;
30
+ padding: 0.8rem;
24
31
background-color: black;
25
- /* color: #505050; */
26
32
color: white;
27
33
border: 1px solid black;
28
- visibility: hidden;
29
- position: absolute;
30
- z-index: 1;
31
- bottom: 2rem;
32
- width: 10rem;
33
- ${ Container } :hover & {
34
- visibility: visible;
35
- }
34
+ border-radius: 8px;
36
35
` ;
37
36
38
- const EmojiItem = styled . div `` ;
37
+ const EmojiItem = styled . div `
38
+ ${ flex ( ) } ;
39
+ ` ;
40
+ const TooltipImg = styled . img `
41
+ width: 36px;
42
+ height: 36px;
43
+ margin-bottom: 0.4rem;
44
+ background-color: white;
45
+ border-radius: 8px;
46
+ padding: 4px;
47
+ ` ;
39
48
40
- const ToolTipDescribe = styled . div `` ;
49
+ const ToolTipDescribe = styled . div `
50
+ font-size: 0.9rem;
51
+ word-break: break-all;
52
+ ` ;
53
+
54
+ const EmojiCount = styled . span `
55
+ font-size: 0.8rem;
56
+ font-weight: 800;
57
+ margin: 0 3px;
58
+ color: ${ ( props ) => props . theme . color . blue1 } ;
59
+ ` ;
41
60
42
61
interface EmojiBoxItemProps {
43
62
emoji : EmojiOfThread ;
@@ -49,13 +68,15 @@ const EmojiBoxItem: React.FC<EmojiBoxItemProps> = ({ emoji, thread }: EmojiBoxIt
49
68
const { users, current } = useChannelState ( ) ;
50
69
const { emojiList } = useEmojiState ( ) ;
51
70
const dispatch = useDispatch ( ) ;
52
- const [ backgroundColor , setbackgroundColor ] = useState ( '#EFEFEF' ) ;
71
+ const [ isMine , setIsMine ] = useState ( false ) ;
53
72
54
73
useEffect ( ( ) => {
55
74
if ( userInfo && emoji . userList . includes ( userInfo . id ) ) {
56
- setbackgroundColor ( '#E2EFF4' ) ;
75
+ setIsMine ( true ) ;
76
+ } else {
77
+ setIsMine ( false ) ;
57
78
}
58
- } , [ ] ) ;
79
+ } , [ emoji ] ) ;
59
80
60
81
const getUserListNameInEmoji = ( emojiProp : EmojiOfThread ) => {
61
82
return emojiProp . userList . reduce ( ( acc , userIdInEmojiOfThread , idx , arr ) => {
@@ -83,7 +104,7 @@ const EmojiBoxItem: React.FC<EmojiBoxItemProps> = ({ emoji, thread }: EmojiBoxIt
83
104
} ;
84
105
85
106
const getToolTipDescribe = ( emojiId : number ) => {
86
- return `reacted width ${ getEmojiName ( emojiId ) } ` ;
107
+ return `${ getEmojiName ( emojiId ) } ` ;
87
108
} ;
88
109
89
110
const getEmojiUrl = ( emojiId : number ) => {
@@ -104,36 +125,34 @@ const EmojiBoxItem: React.FC<EmojiBoxItemProps> = ({ emoji, thread }: EmojiBoxIt
104
125
} ) ,
105
126
) ;
106
127
}
107
- if ( backgroundColor === '#EFEFEF' ) {
108
- return setbackgroundColor ( '#E2EFF4' ) ;
109
- }
110
- return setbackgroundColor ( '#EFEFEF' ) ;
128
+ setIsMine ( ( mine ) => ! mine ) ;
111
129
} ;
112
130
131
+ const ref = useRef < HTMLDivElement > ( null ) ;
132
+ const [ tooltipVisible , setTooltipVisible ] = useState ( false ) ;
133
+
113
134
return (
114
- < Container color = { backgroundColor } onClick = { clickEmojiHandler } >
115
- < EmojiToolTip >
116
- < img
117
- key = { `${ emoji . id } ToolTip` }
118
- src = { getEmojiUrl ( emoji . id ) }
119
- alt = "emoji url"
120
- width = "36px"
121
- height = "36px"
122
- />
123
- < ToolTipDescribe >
124
- { getUserListNameInEmoji ( emoji ) }
125
- { getToolTipDescribe ( emoji . id ) }
126
- </ ToolTipDescribe >
127
- </ EmojiToolTip >
135
+ < Container
136
+ isMine = { isMine }
137
+ onClick = { clickEmojiHandler }
138
+ ref = { ref }
139
+ onMouseEnter = { ( ) => setTooltipVisible ( true ) }
140
+ onMouseLeave = { ( ) => setTooltipVisible ( false ) }
141
+ >
142
+ { ref . current && tooltipVisible && (
143
+ < TooltipPopup anchorEl = { ref . current } top = { - 10 } left = { - 30 } >
144
+ < EmojiToolTip >
145
+ < TooltipImg src = { getEmojiUrl ( emoji . id ) } />
146
+ < ToolTipDescribe >
147
+ { getUserListNameInEmoji ( emoji ) }
148
+ { `reacted with :${ getToolTipDescribe ( emoji . id ) } :` }
149
+ </ ToolTipDescribe >
150
+ </ EmojiToolTip >
151
+ </ TooltipPopup >
152
+ ) }
128
153
< EmojiItem >
129
- < img
130
- key = { emoji . id }
131
- src = { getEmojiUrl ( emoji . id ) }
132
- alt = "emoji url"
133
- width = "16px"
134
- height = "16px"
135
- />
136
- { emoji . userList && < span key = { `${ emoji . id } length` } > { emoji . userList . length } </ span > }
154
+ < img src = { getEmojiUrl ( emoji . id ) } alt = "emoji url" width = "16px" height = "16px" />
155
+ { emoji . userList && < EmojiCount > { emoji . userList . length } </ EmojiCount > }
137
156
</ EmojiItem >
138
157
</ Container >
139
158
) ;
0 commit comments