1
1
<template >
2
2
<div class =" vac-emoji-wrapper" >
3
- <emoji-picker :search =" search" @emoji =" append" >
4
- <template #emoji-invoker =" { events: { click: clickEvent } } " >
3
+ <div
4
+ class =" vac-svg-button"
5
+ :class =" { 'vac-emoji-reaction': emojiReaction }"
6
+ @click =" openEmoji"
7
+ >
8
+ <slot name =" emoji-picker-icon" >
9
+ <svg-icon name =" emoji" :param =" emojiReaction ? 'reaction' : ''" />
10
+ </slot >
11
+ </div >
12
+
13
+ <template v-if =" emojiOpened " >
14
+ <transition name =" vac-slide-up" appear >
5
15
<div
6
- class =" vac-svg-button"
7
- :class =" { 'vac-emoji-reaction': emojiReaction }"
8
- @click.stop =" clickEvent"
9
- @click =" openEmoji"
16
+ class =" vac-emoji-picker"
17
+ :class =" { 'vac-picker-reaction': emojiReaction }"
18
+ :style =" {
19
+ height: `${emojiPickerHeight}px`,
20
+ top: positionTop ? emojiPickerHeight : `${emojiPickerTop}px`,
21
+ right: emojiPickerRight,
22
+ display: emojiPickerTop || !emojiReaction ? 'initial' : 'none'
23
+ }"
10
24
>
11
- <slot name =" emoji-picker-icon" >
12
- <svg-icon name =" emoji" :param =" emojiReaction ? 'reaction' : ''" />
13
- </slot >
25
+ <emoji-picker v-if =" emojiOpened" ref =" emojiPicker" />
14
26
</div >
15
- </template >
16
- <template v-if =" emojiOpened " #emoji-picker =" { emojis , insert } " >
17
- <transition name =" vac-slide-up" appear >
18
- <div
19
- class =" vac-emoji-picker"
20
- :class =" { 'vac-picker-reaction': emojiReaction }"
21
- :style =" {
22
- height: `${emojiPickerHeight}px`,
23
- top: positionTop ? emojiPickerHeight : `${emojiPickerTop}px`,
24
- right: emojiPickerRight,
25
- display: emojiPickerTop || !emojiReaction ? 'initial' : 'none'
26
- }"
27
- >
28
- <div class =" vac-emoji-picker__search" >
29
- <input v-model =" search" type =" text" />
30
- </div >
31
- <div >
32
- <div v-for =" (emojiGroup, category) in emojis" :key =" category" >
33
- <h5 v-if =" category !== 'Frequently used'" >
34
- {{ category }}
35
- </h5 >
36
- <div v-if =" category !== 'Frequently used'" class =" vac-emojis" >
37
- <span
38
- v-for =" (emoji, emojiName) in emojiGroup"
39
- :key =" emojiName"
40
- :title =" emojiName"
41
- @click =" insert({ emoji, emojiName })"
42
- >
43
- {{ emoji }}
44
- </span >
45
- </div >
46
- </div >
47
- </div >
48
- </div >
49
- </transition >
50
- </template >
51
- </emoji-picker >
27
+ </transition >
28
+ </template >
52
29
</div >
53
30
</template >
54
31
55
32
<script >
56
- import EmojiPicker from ' vue- emoji-picker'
33
+ import { EmojiPicker } from ' emoji-picker-element '
57
34
58
35
import SvgIcon from ' ../SvgIcon/SvgIcon'
59
36
@@ -75,19 +52,63 @@ export default {
75
52
76
53
data () {
77
54
return {
78
- search: ' ' ,
79
55
emojiPickerHeight: 320 ,
80
56
emojiPickerTop: 0 ,
81
57
emojiPickerRight: ' '
82
58
}
83
59
},
84
60
61
+ watch: {
62
+ emojiOpened (val ) {
63
+ if (val) {
64
+ setTimeout (() => {
65
+ this .addCustomStyling ()
66
+
67
+ document
68
+ .querySelector (' emoji-picker' )
69
+ .addEventListener (' emoji-click' , ({ detail }) => {
70
+ this .$emit (' add-emoji' , {
71
+ icon: detail .unicode ,
72
+ name: detail .annotation
73
+ })
74
+ })
75
+ }, 0 )
76
+ }
77
+ }
78
+ },
79
+
85
80
methods: {
86
- append ({ emoji, emojiName }) {
87
- this .$emit (' add-emoji' , { icon: emoji, name: emojiName })
81
+ addCustomStyling () {
82
+ const picker = ` .picker {
83
+ border: none;
84
+ }`
85
+
86
+ const nav = ` .nav {
87
+ overflow-x: auto;
88
+ }`
89
+
90
+ const searchBox = ` .search-wrapper {
91
+ padding-right: 2px;
92
+ padding-left: 2px;
93
+ }`
94
+
95
+ const search = ` input.search {
96
+ height: 32px;
97
+ font-size: 14px;
98
+ border-radius: 10rem;
99
+ border: var(--chat-border-style);
100
+ padding: 5px 10px;
101
+ outline: none;
102
+ background: var(--chat-bg-color-input);
103
+ color: var(--chat-color);
104
+ }`
105
+
106
+ const style = document .createElement (' style' )
107
+ style .textContent = picker + nav + searchBox + search
108
+ this .$refs .emojiPicker .shadowRoot .appendChild (style)
88
109
},
89
110
openEmoji (ev ) {
90
- this .$emit (' open-emoji' , true )
111
+ this .$emit (' open-emoji' , ! this . emojiOpened )
91
112
this .setEmojiPickerPosition (
92
113
ev .clientY ,
93
114
ev .view .innerWidth ,
@@ -99,12 +120,12 @@ export default {
99
120
const mobileSize = innerWidth < 500 || innerHeight < 700
100
121
101
122
if (! this .roomFooterRef ) {
102
- if (mobileSize) this .emojiPickerRight = ' 0px '
123
+ if (mobileSize) this .emojiPickerRight = ' -50px '
103
124
return
104
125
}
105
126
106
127
if (mobileSize) {
107
- this .emojiPickerRight = innerWidth / 2 - 120 + ' px'
128
+ this .emojiPickerRight = innerWidth / 2 - 150 + ' px'
108
129
this .emojiPickerTop = 100
109
130
this .emojiPickerHeight = innerHeight - 200
110
131
} else {
0 commit comments