Skip to content

Commit fe9b6ef

Browse files
Merge pull request #476 from hamiltoes/feature/handle-complex-events
feature: handle complex events
2 parents 3ce8647 + 301d71c commit fe9b6ef

File tree

2 files changed

+105
-3
lines changed

2 files changed

+105
-3
lines changed

src/service-module/make-service-plugin.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,14 +117,18 @@ export default function prepareMakeServicePlugin(
117117
// (3^) Setup real-time events
118118
if (options.enableEvents) {
119119
const handleEvent = (eventName, item, mutationName) => {
120-
const affectsStore = options.handleEvents[eventName](item, {
120+
const handler = options.handleEvents[eventName]
121+
const confirmOrArray = handler(item, {
121122
model: Model,
122123
models: globalModels
123124
})
125+
const [affectsStore, modified = item] = Array.isArray(confirmOrArray)
126+
? confirmOrArray
127+
: [confirmOrArray]
124128
if (affectsStore) {
125129
eventName === 'removed'
126-
? store.commit(`${options.namespace}/removeItem`, item)
127-
: store.dispatch(`${options.namespace}/${mutationName}`, item)
130+
? store.commit(`${options.namespace}/removeItem`, modified)
131+
: store.dispatch(`${options.namespace}/${mutationName}`, modified)
128132
}
129133
}
130134

test/service-module/make-service-plugin.test.ts

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ eslint
66
import { assert } from 'chai'
77
import Vue from 'vue'
88
import Vuex from 'vuex'
9+
import { ServiceState } from './types'
910
import { clearModels } from '../../src/service-module/global-models'
1011
import { clients } from '../../src/service-module/global-clients'
1112
import { feathersRestClient as feathers } from '../../test/fixtures/feathers-client'
@@ -337,4 +338,101 @@ describe('makeServicePlugin', function() {
337338
await todo.remove()
338339
assert(globalRemovedCalled, 'global removed handler called')
339340
})
341+
342+
it('allow handleEvents handlers to return extracted event data', async function() {
343+
const serverAlias = 'default'
344+
345+
const { makeServicePlugin, BaseModel } = feathersVuex(feathers, {
346+
idField: '_id',
347+
serverAlias,
348+
handleEvents: {
349+
created(e) {
350+
return [true, e.myCreatedPropWithActualData]
351+
},
352+
updated(e) {
353+
return [true, e.myUpdatedPropWithActualData]
354+
},
355+
patched(e) {
356+
return [true, e.myPatchedPropWithActualData]
357+
},
358+
removed(e) {
359+
return [true, e.myRemovedPropWithActualData]
360+
}
361+
}
362+
})
363+
364+
const servicePath = 'todos'
365+
class Todo extends BaseModel {
366+
public static modelName = 'Todo'
367+
public static servicePath = servicePath
368+
}
369+
370+
const todosService = feathers.service(servicePath)
371+
const todosPlugin = makeServicePlugin({
372+
servicePath,
373+
Model: Todo,
374+
service: todosService
375+
})
376+
377+
const store = new Vuex.Store<{ todos: ServiceState }>({
378+
plugins: [todosPlugin]
379+
})
380+
const { keyedById } = store.state.todos
381+
382+
let createdData = null
383+
let updatedData = null
384+
let patchedData = null
385+
let removedData = null
386+
Todo.on('created', e => (createdData = e))
387+
Todo.on('updated', e => (updatedData = e))
388+
Todo.on('patched', e => (patchedData = e))
389+
Todo.on('removed', e => (removedData = e))
390+
391+
assert(Object.keys(keyedById).length === 0, 'no todos in store')
392+
393+
todosService.emit('created', {
394+
context: 'foo',
395+
myCreatedPropWithActualData: { _id: 42, text: '' }
396+
})
397+
assert(keyedById[42], 'todo added to store')
398+
assert(keyedById[42].text === '', 'todo string is empty')
399+
assert(createdData, "Model's created event fired")
400+
assert(
401+
createdData.context === 'foo' && createdData.myCreatedPropWithActualData,
402+
"Model's created event got all event data"
403+
)
404+
405+
todosService.emit('updated', {
406+
context: 'bar',
407+
myUpdatedPropWithActualData: { _id: 42, text: 'updated' }
408+
})
409+
assert(keyedById[42].text === 'updated', 'todo was updated')
410+
assert(updatedData, "Model's updated event fired")
411+
assert(
412+
updatedData.context === 'bar' && updatedData.myUpdatedPropWithActualData,
413+
"Model's updated event got all event data"
414+
)
415+
416+
todosService.emit('patched', {
417+
context: 'baz',
418+
myPatchedPropWithActualData: { _id: 42, text: 'patched' }
419+
})
420+
assert(keyedById[42].text === 'patched', 'todo was patched')
421+
assert(patchedData, "Model's patched event fired")
422+
assert(
423+
patchedData.context === 'baz' && patchedData.myPatchedPropWithActualData,
424+
"Model's patched event got all event data"
425+
)
426+
427+
todosService.emit('removed', {
428+
context: 'spam',
429+
myRemovedPropWithActualData: { _id: 42 }
430+
})
431+
assert(Object.keys(keyedById).length === 0, 'todo removed from store')
432+
assert(removedData, "Model's removed event fired")
433+
assert(
434+
removedData.context === 'spam' && removedData.myRemovedPropWithActualData,
435+
"Model's removed event got all event data"
436+
)
437+
})
340438
})

0 commit comments

Comments
 (0)