Skip to content

Commit d5ee737

Browse files
committed
update the livewire
1 parent a855fc0 commit d5ee737

24 files changed

+5790
-3330
lines changed
Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,58 @@
1+
import store from '@/Store'
2+
13
export default class {
2-
constructor(component, updateQueue) {
4+
constructor(component, actionQueue) {
35
this.component = component
4-
this.updateQueue = updateQueue
5-
}
6-
7-
payload() {
8-
return {
9-
fingerprint: this.component.fingerprint,
10-
serverMemo: this.component.serverMemo,
11-
// This ensures only the type & payload properties only get sent over.
12-
updates: this.updateQueue.map(update => ({
13-
type: update.type,
14-
payload: update.payload,
15-
})),
16-
}
6+
this.actionQueue = actionQueue
177
}
188

19-
storeResponse(payload) {
20-
return (this.response = payload)
9+
get refs() {
10+
return this.actionQueue
11+
.map(action => {
12+
return action.ref
13+
})
14+
.filter(ref => ref)
2115
}
2216

23-
resolve() {
24-
let returns = this.response.effects.returns || []
17+
payload() {
18+
let payload = {
19+
id: this.component.id,
20+
data: this.component.data,
21+
name: this.component.name,
22+
checksum: this.component.checksum,
23+
locale: this.component.locale,
24+
children: this.component.children,
25+
actionQueue: this.actionQueue.map(action => {
26+
// This ensures only the type & payload properties only get sent over.
27+
return {
28+
type: action.type,
29+
payload: action.payload,
30+
}
31+
}),
32+
}
2533

26-
this.updateQueue.forEach(update => {
27-
if (update.type !== 'callMethod') return
34+
if (Object.keys(this.component.errorBag).length > 0) {
35+
payload.errorBag = this.component.errorBag
36+
}
2837

29-
update.resolve(
30-
returns[update.method] !== undefined
31-
? returns[update.method]
32-
: null
33-
)
34-
})
38+
return payload
3539
}
3640

37-
reject() {
38-
this.updateQueue.forEach(update => {
39-
update.reject()
40-
})
41+
storeResponse(payload) {
42+
return this.response = {
43+
id: payload.id,
44+
dom: payload.dom,
45+
checksum: payload.checksum,
46+
locale: payload.locale,
47+
children: payload.children,
48+
dirtyInputs: payload.dirtyInputs,
49+
eventQueue: payload.eventQueue,
50+
dispatchQueue: payload.dispatchQueue,
51+
events: payload.events,
52+
data: payload.data,
53+
redirectTo: payload.redirectTo,
54+
errorBag: payload.errorBag || {},
55+
updatesQueryString: payload.updatesQueryString,
56+
}
4157
}
4258
}

livewire/static/livewire/src/PrefetchMessage.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,21 @@ export default class extends Message {
66
}
77

88
get prefetchId() {
9-
return this.updateQueue[0].toId()
9+
return this.actionQueue[0].toId()
10+
}
11+
12+
payload() {
13+
return {
14+
fromPrefetch: this.prefetchId,
15+
...super.payload()
16+
}
17+
}
18+
19+
storeResponse(payload) {
20+
super.storeResponse(payload)
21+
22+
this.response.fromPrefetch = payload.fromPrefetch
23+
24+
return this.response
1025
}
1126
}

livewire/static/livewire/src/Store.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ const store = {
1010
livewireIsInBackground: false,
1111
livewireIsOffline: false,
1212
sessionHasExpired: false,
13-
requestIsOut: false,
1413
hooks: HookManager,
1514
directives: DirectiveManager,
1615
onErrorCallback: () => {},
@@ -69,7 +68,7 @@ const store = {
6968
emitSelf(componentId, event, ...params) {
7069
let component = this.findComponent(componentId)
7170

72-
if (component.listeners.includes(event)) {
71+
if (component.events.includes(event)) {
7372
component.addAction(new EventAction(event, params))
7473
}
7574
},
@@ -78,7 +77,7 @@ const store = {
7877
let components = this.getComponentsByName(componentName)
7978

8079
components.forEach(component => {
81-
if (component.listeners.includes(event)) {
80+
if (component.events.includes(event)) {
8281
component.addAction(new EventAction(event, params))
8382
}
8483
})
@@ -97,15 +96,15 @@ const store = {
9796

9897
return this.components().filter(component => {
9998
return (
100-
component.listeners.includes(event) &&
99+
component.events.includes(event) &&
101100
parentIds.includes(component.id)
102101
)
103102
})
104103
},
105104

106105
componentsListeningForEvent(event) {
107106
return this.components().filter(component => {
108-
return component.listeners.includes(event)
107+
return component.events.includes(event)
109108
})
110109
},
111110

livewire/static/livewire/src/action/deferred-model.js

Lines changed: 0 additions & 14 deletions
This file was deleted.

livewire/static/livewire/src/action/index.js

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
export default class {
33
constructor(el) {
44
this.el = el
5-
this.resolveCallback = () => {}
6-
this.rejectCallback = () => {}
75
}
86

97
get ref() {
@@ -13,20 +11,4 @@ export default class {
1311
toId() {
1412
return btoa(encodeURIComponent(this.el.el.outerHTML))
1513
}
16-
17-
onResolve(callback) {
18-
this.resolveCallback = callback
19-
}
20-
21-
onReject(callback) {
22-
this.rejectCallback = callback
23-
}
24-
25-
resolve(thing) {
26-
this.resolveCallback(thing)
27-
}
28-
29-
reject(thing) {
30-
this.rejectCallback(thing)
31-
}
3214
}

livewire/static/livewire/src/action/method.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ export default class extends Action {
55
super(el)
66

77
this.type = 'callMethod'
8-
this.method = method
98
this.payload = {
109
method,
1110
params,

livewire/static/livewire/src/action/model.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ export default class extends Action {
55
super(el)
66

77
this.type = 'syncInput'
8-
this.name = name
98
this.payload = {
109
name,
1110
value,
Lines changed: 65 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,103 @@
1+
import DOMElement from '@/dom/dom_element'
12
import store from '@/Store'
23

34
export default function () {
45
store.registerHook('componentInitialized', component => {
5-
component.dirtyEls = []
6+
component.targetedDirtyElsByProperty = {}
7+
component.genericDirtyEls = []
8+
9+
registerListener(component)
610
})
711

812
store.registerHook('elementInitialized', (el, component) => {
913
if (el.directives.missing('dirty')) return
1014

11-
component.dirtyEls.push(el)
15+
const propertyNames = el.directives.has('target')
16+
&& el.directives.get('target').value.split(',').map(s => s.trim())
17+
18+
addDirtyEls(
19+
component,
20+
el,
21+
propertyNames,
22+
)
1223
})
1324

14-
store.registerHook(
15-
'interceptWireModelAttachListener',
16-
(el, directive, component) => {
17-
let property = directive.value
18-
19-
el.el.addEventListener('input', () => {
20-
component.dirtyEls.forEach(dirtyEl => {
21-
if (
22-
(dirtyEl.directives.has('model') &&
23-
dirtyEl.directives.get('model').value ===
24-
property) ||
25-
(dirtyEl.directives.has('target') &&
26-
dirtyEl.directives
27-
.get('target')
28-
.value.split(',')
29-
.map(s => s.trim())
30-
.includes(property))
31-
) {
32-
let isDirty =
33-
el.valueFromInput(component) !=
34-
component.get(property)
35-
36-
setDirtyState(dirtyEl, isDirty)
37-
}
38-
})
25+
store.registerHook('elementRemoved', (el, component) => {
26+
// Look through the targeted elements to remove.
27+
Object.keys(component.targetedDirtyElsByProperty).forEach(key => {
28+
component.targetedDirtyElsByProperty[key] = component.targetedDirtyElsByProperty[key].filter(element => {
29+
return ! element.isSameNode(el)
3930
})
40-
}
41-
)
42-
43-
store.registerHook('responseReceived', component => {
44-
component.dirtyEls.forEach(element => {
45-
if (element.__livewire_dirty_cleanup) {
46-
element.__livewire_dirty_cleanup()
47-
delete element.__livewire_dirty_cleanup
48-
}
4931
})
50-
})
5132

52-
store.registerHook('elementRemoved', (el, component) => {
53-
component.dirtyEls.forEach((element, index) => {
33+
// Look through the global/generic elements for the element to remove.
34+
component.genericDirtyEls.forEach((element, index) => {
5435
if (element.isSameNode(el)) {
55-
component.dirtyEls.splice(index, 1)
36+
component.genericDirtyEls.splice(index, 1)
5637
}
5738
})
5839
})
5940
}
6041

42+
function addDirtyEls(component, el, targetProperties) {
43+
if (targetProperties) {
44+
targetProperties.forEach(targetProperty => {
45+
if (component.targetedDirtyElsByProperty[targetProperty]) {
46+
component.targetedDirtyElsByProperty[targetProperty].push(el)
47+
} else {
48+
component.targetedDirtyElsByProperty[targetProperty] = [el]
49+
}
50+
})
51+
} else {
52+
component.genericDirtyEls.push(el)
53+
}
54+
}
55+
56+
function registerListener(component) {
57+
component.el.addEventListener('input', (e) => {
58+
const el = new DOMElement(e.target)
59+
60+
let allEls = []
61+
62+
if (el.directives.has('model') && component.targetedDirtyElsByProperty[el.directives.get('model').value]) {
63+
allEls.push(...component.targetedDirtyElsByProperty[el.directives.get('model').value])
64+
}
65+
66+
if (el.directives.has('dirty')) {
67+
allEls.push(...component.genericDirtyEls.filter(dirtyEl => dirtyEl.directives.get('model').value === el.directives.get('model').value))
68+
}
69+
70+
if (allEls.length < 1) return
71+
72+
if (el.directives.missing('model')) {
73+
console.warn('`wire:model` must be present on any element that uses `wire:dirty` or is a `wire:dirty` target.')
74+
}
75+
76+
const isDirty = el.valueFromInput(component) != component.data[el.directives.get('model').value]
77+
78+
allEls.forEach(el => {
79+
setDirtyState(el, isDirty)
80+
});
81+
})
82+
}
83+
6184
function setDirtyState(el, isDirty) {
6285
const directive = el.directives.get('dirty')
6386

6487
if (directive.modifiers.includes('class')) {
6588
const classes = directive.value.split(' ')
6689
if (directive.modifiers.includes('remove') !== isDirty) {
6790
el.classList.add(...classes)
68-
el.__livewire_dirty_cleanup = () => el.classList.remove(...classes)
6991
} else {
7092
el.classList.remove(...classes)
71-
el.__livewire_dirty_cleanup = () => el.classList.add(...classes)
7293
}
7394
} else if (directive.modifiers.includes('attr')) {
7495
if (directive.modifiers.includes('remove') !== isDirty) {
7596
el.setAttribute(directive.value, true)
76-
el.__livewire_dirty_cleanup = () =>
77-
el.removeAttribute(directive.value)
7897
} else {
79-
el.removeAttribute(directive.value)
80-
el.__livewire_dirty_cleanup = () =>
81-
el.setAttribute(directive.value, true)
98+
el.removeAttrsibute(directive.value)
8299
}
83-
} else if (!el.directives.get('model')) {
100+
} else if (! el.directives.get('model')) {
84101
el.el.style.display = isDirty ? 'inline-block' : 'none'
85-
el.__livewire_dirty_cleanup = () =>
86-
(el.el.style.display = isDirty ? 'none' : 'inline-block')
87102
}
88103
}

0 commit comments

Comments
 (0)