Skip to content

Commit 8b2137b

Browse files
authored
Merge pull request #178 from a-kriya/store
Push root props in store for direct access
2 parents 85b6f48 + 3c9c47a commit 8b2137b

File tree

8 files changed

+85
-81
lines changed

8 files changed

+85
-81
lines changed

src/ChatWindow.vue

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,9 @@
22
<div class="sc-chat-window" :class="{opened: isOpen, closed: !isOpen}">
33
<Header
44
v-if="showHeader"
5-
:show-close-button="showCloseButton"
65
:title="title"
7-
:image-url="titleImageUrl"
8-
:on-close="onClose"
96
:colors="colors"
10-
:disable-user-list-toggle="disableUserListToggle"
7+
@close="$emit('close')"
118
@userList="handleUserListToggle"
129
>
1310
<template>
@@ -83,10 +80,6 @@ export default {
8380
type: Boolean,
8481
default: false
8582
},
86-
showCloseButton: {
87-
type: Boolean,
88-
default: true
89-
},
9083
showFile: {
9184
type: Boolean,
9285
default: false
@@ -103,18 +96,10 @@ export default {
10396
type: String,
10497
required: true
10598
},
106-
titleImageUrl: {
107-
type: String,
108-
default: ''
109-
},
11099
onUserInputSubmit: {
111100
type: Function,
112101
required: true
113102
},
114-
onClose: {
115-
type: Function,
116-
required: true
117-
},
118103
messageList: {
119104
type: Array,
120105
default: () => []
@@ -143,10 +128,6 @@ export default {
143128
type: Boolean,
144129
required: true
145130
},
146-
disableUserListToggle: {
147-
type: Boolean,
148-
default: false
149-
},
150131
showEdition: {
151132
type: Boolean,
152133
required: true

src/Header.vue

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
<template>
22
<div class="sc-header" :style="{background: colors.header.bg, color: colors.header.text}">
33
<slot>
4-
<img v-if="imageUrl" class="sc-header--img" :src="imageUrl" alt="" />
4+
<img v-if="titleImageUrl" class="sc-header--img" :src="titleImageUrl" alt="" />
55
<div v-if="!disableUserListToggle" class="sc-header--title enabled" @click="toggleUserList">
66
{{ title }}
77
</div>
88
<div v-else class="sc-header--title">{{ title }}</div>
99
</slot>
10-
<div v-if="showCloseButton" class="sc-header--close-button" @click="onClose">
10+
<div v-if="showCloseButton" class="sc-header--close-button" @click="$emit('close')">
1111
<img :src="icons.close.img" :alt="icons.close.name" />
1212
</div>
1313
</div>
1414
</template>
1515

1616
<script>
17+
import {mapState} from './store/'
1718
import CloseIcon from './assets/close-icon-big.png'
1819
1920
export default {
@@ -29,36 +30,23 @@ export default {
2930
}
3031
}
3132
},
32-
imageUrl: {
33-
type: String,
34-
required: true
35-
},
3633
title: {
3734
type: String,
3835
required: true
3936
},
40-
onClose: {
41-
type: Function,
42-
required: true
43-
},
4437
colors: {
4538
type: Object,
4639
required: true
47-
},
48-
disableUserListToggle: {
49-
type: Boolean,
50-
default: false
51-
},
52-
showCloseButton: {
53-
type: Boolean,
54-
default: false
5540
}
5641
},
5742
data() {
5843
return {
5944
inUserList: false
6045
}
6146
},
47+
computed: {
48+
...mapState(['disableUserListToggle', 'titleImageUrl', 'showCloseButton'])
49+
},
6250
methods: {
6351
toggleUserList() {
6452
this.inUserList = !this.inUserList

src/Launcher.vue

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,11 @@
1414
<img v-else class="sc-open-icon" :src="icons.open.img" :alt="icons.open.name" />
1515
</div>
1616
<ChatWindow
17-
:show-launcher="showLauncher"
18-
:show-close-button="showCloseButton"
1917
:message-list="messageList"
2018
:on-user-input-submit="onMessageWasSent"
2119
:participants="participants"
2220
:title="chatWindowTitle"
23-
:title-image-url="titleImageUrl"
2421
:is-open="isOpen"
25-
:on-close="close"
2622
:show-emoji="showEmoji"
2723
:show-file="showFile"
2824
:show-edition="showEdition"
@@ -35,7 +31,7 @@
3531
:colors="colors"
3632
:always-scroll-to-bottom="alwaysScrollToBottom"
3733
:message-styling="messageStyling"
38-
:disable-user-list-toggle="disableUserListToggle"
34+
@close="close"
3935
@scrollToTop="$emit('scrollToTop')"
4036
@onType="$emit('onType')"
4137
@edit="$emit('edit', $event)"
@@ -69,6 +65,7 @@
6965
</template>
7066

7167
<script>
68+
import store from './store/'
7269
import ChatWindow from './ChatWindow.vue'
7370
7471
import CloseIcon from './assets/close-icon.png'
@@ -235,15 +232,23 @@ export default {
235232
},
236233
computed: {
237234
chatWindowTitle() {
238-
if (this.title !== '') {
239-
return this.title
240-
}
241-
if (this.participants.length === 0) {
242-
return 'You'
243-
} else if (this.participants.length > 1) {
244-
return 'You, ' + this.participants[0].name + ' & others'
245-
} else {
246-
return 'You & ' + this.participants[0].name
235+
if (this.title !== '') return this.title
236+
237+
if (this.participants.length === 0) return 'You'
238+
if (this.participants.length > 1) return 'You, ' + this.participants[0].name + ' & others'
239+
240+
return 'You & ' + this.participants[0].name
241+
}
242+
},
243+
watch: {
244+
$props: {
245+
deep: true,
246+
immediate: true,
247+
handler(props) {
248+
// TODO: optimize
249+
for (const prop in props) {
250+
store.setState(prop, props[prop])
251+
}
247252
}
248253
}
249254
},

src/Message.vue

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<div class="sc-message" :id="message.id">
2+
<div :id="message.id" class="sc-message">
33
<div
44
class="sc-message--content"
55
:class="{
@@ -71,7 +71,6 @@ import EmojiMessage from './messages/EmojiMessage.vue'
7171
import TypingMessage from './messages/TypingMessage.vue'
7272
import SystemMessage from './messages/SystemMessage.vue'
7373
import chatIcon from './assets/chat-icon.svg'
74-
import store from './store/'
7574
7675
export default {
7776
components: {
@@ -219,7 +218,7 @@ export default {
219218
&.confirm-delete .sc-message--toolbox {
220219
width: auto;
221220
}
222-
.sc-message--toolbox{
221+
.sc-message--toolbox {
223222
transition: left 0.2s ease-out 0s;
224223
white-space: normal;
225224
opacity: 0;

src/MessageList.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ export default {
100100
},
101101
confirmationDeletionMessage: {
102102
type: String,
103-
required: true,
103+
required: true
104104
}
105105
},
106106
computed: {

src/UserInput.vue

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -145,23 +145,22 @@ export default {
145145
data() {
146146
return {
147147
file: null,
148-
inputActive: false,
149-
store
148+
inputActive: false
150149
}
151150
},
152151
computed: {
153152
editMessageId() {
154-
return this.isEditing && store.editMessage.id
153+
return this.isEditing && store.state.editMessage.id
155154
},
156155
isEditing() {
157-
return store.editMessage && store.editMessage.id
156+
return store.state.editMessage && store.state.editMessage.id
158157
}
159158
},
160159
watch: {
161160
editMessageId(m) {
162-
if (store.editMessage != null && store.editMessage != undefined) {
161+
if (store.state.editMessage != null && store.state.editMessage != undefined) {
163162
this.$refs.userInput.focus()
164-
this.$refs.userInput.textContent = store.editMessage.data.text
163+
this.$refs.userInput.textContent = store.state.editMessage.data.text
165164
} else {
166165
this.$refs.userInput.textContent = ''
167166
}
@@ -262,7 +261,7 @@ export default {
262261
this.$emit('edit', {
263262
author: 'me',
264263
type: 'text',
265-
id: store.editMessage.id,
264+
id: store.state.editMessage.id,
266265
data: {text}
267266
})
268267
this._editFinish()
@@ -281,7 +280,7 @@ export default {
281280
this.file = file
282281
},
283282
_editFinish() {
284-
this.store.editMessage = null
283+
store.setState('editMessage', null)
285284
}
286285
}
287286
}

src/messages/TextMessage.vue

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,22 @@
22
<div class="sc-message--text" :style="messageColors">
33
<template>
44
<div class="sc-message--toolbox" :style="{background: messageColors.backgroundColor}">
5-
<button v-if="showEdition && me && message.id" @click="edit" :disabled="isEditing">
6-
<IconBase :color="isEditing? 'black': messageColors.color" width="10" icon-name="edit">
5+
<button v-if="showEdition && me && message.id" :disabled="isEditing" @click="edit">
6+
<IconBase :color="isEditing ? 'black' : messageColors.color" width="10" icon-name="edit">
77
<IconEdit />
88
</IconBase>
99
</button>
1010
<div v-if="showDeletion">
11-
<button v-if="me && message.id != null && message.id != undefined" @click="ifelse(showConfirmationDeletion, withConfirm(confirmationDeletionMessage, () => $emit('remove')), () => $emit('remove'))()">
11+
<button
12+
v-if="me && message.id != null && message.id != undefined"
13+
@click="
14+
ifelse(
15+
showConfirmationDeletion,
16+
withConfirm(confirmationDeletionMessage, () => $emit('remove')),
17+
() => $emit('remove')
18+
)()
19+
"
20+
>
1221
<IconBase :color="messageColors.color" width="10" icon-name="remove">
1322
<IconCross />
1423
</IconBase>
@@ -38,14 +47,15 @@ import IconEdit from './../components/icons/IconEdit.vue'
3847
import IconCross from './../components/icons/IconCross.vue'
3948
import escapeGoat from 'escape-goat'
4049
import Autolinker from 'autolinker'
41-
import store from './../store/'
50+
import store from '../store/'
51+
4252
const fmt = require('msgdown')
4353
4454
export default {
45-
data() {
46-
return {
47-
store
48-
}
55+
components: {
56+
IconBase,
57+
IconCross,
58+
IconEdit
4959
},
5060
props: {
5161
message: {
@@ -90,12 +100,12 @@ export default {
90100
return this.message.author === 'me'
91101
},
92102
isEditing() {
93-
return (store.editMessage && store.editMessage.id) == this.message.id
103+
return (store.state.editMessage && store.state.editMessage.id) === this.message.id
94104
}
95105
},
96106
methods: {
97107
edit() {
98-
this.store.editMessage = this.message
108+
store.setState('editMessage', this.message)
99109
},
100110
ifelse(cond, funcIf, funcElse) {
101111
return () => {
@@ -107,12 +117,7 @@ export default {
107117
return () => {
108118
if (confirm(msg)) func()
109119
}
110-
},
111-
},
112-
components:{
113-
IconBase,
114-
IconCross,
115-
IconEdit,
120+
}
116121
}
117122
}
118123
</script>

src/store/index.js

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,29 @@
1+
/*
2+
* Use store pattern instead of Vuex since this is a plugin
3+
* and instantiated externally
4+
**/
5+
16
import Vue from 'vue'
2-
export default Vue.observable({editMessage: null})
7+
8+
const store = {
9+
state: Vue.observable({
10+
editMessage: null
11+
}),
12+
13+
setState(key, val) {
14+
Vue.set(this.state, key, val)
15+
}
16+
}
17+
18+
function mapState(keys) {
19+
const map = {}
20+
keys.forEach((key) => {
21+
map[key] = function () {
22+
return store.state[key]
23+
}
24+
})
25+
return map
26+
}
27+
28+
export default store
29+
export {mapState}

0 commit comments

Comments
 (0)