Skip to content

Commit 2e8c462

Browse files
author
Andres Vargas
committed
livewire working
1 parent 6b6df91 commit 2e8c462

File tree

7 files changed

+131
-41
lines changed

7 files changed

+131
-41
lines changed

app/settings.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -125,5 +125,5 @@
125125

126126
STATIC_URL = '/static/'
127127

128-
128+
CSRF_HEADER_NAME="HTTP_X_CSRF_TOKEN"
129129

app/urls.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
from django.contrib import admin
2-
from django.urls import path
2+
from django.urls import path, include
33
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
44
from core.views import index
55

66
urlpatterns = [
77
path('admin/', admin.site.urls),
8+
path('', include("livewire.urls")),
89
path('', index),
910
] + staticfiles_urlpatterns()

core/views.py

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
11
from django.shortcuts import render
2-
2+
from livewire.views import LivewireComponent
33

44
def index(request):
55
context = {}
66
return render(request, "base.html", context)
7+
8+
9+
10+
class CounterLivewire(LivewireComponent):
11+
component_name = "counter"
12+
context = {
13+
'count': 0
14+
}
15+
def decrement(self, *args):
16+
self.context["count"] -=1
17+
18+
def increment(self, *args):
19+
self.context["count"]+=1
20+
+1-5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1 @@
1-
2-
<div wire:id="{{livewire.id}}" wire:initial-data='{{livewire.initial_data}}'>
3-
4-
{{ component|safe }}
5-
</div>
1+
{{ component|safe }}
+6-33
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,14 @@
11
from django import template
2-
from django.template.loader import render_to_string
3-
import random
4-
import string
5-
import json
6-
2+
from livewire.views import LivewireComponent
73
register = template.Library()
84

9-
105
@register.inclusion_tag("livewire_scripts.html", takes_context=True)
116
def livewire_scripts(context):
127
return context
138

14-
@register.inclusion_tag("livewire/component.html")
9+
@register.simple_tag
1510
def livewire(component,**kwargs):
16-
context = kwargs.copy()
17-
context["count"] = 0
18-
19-
component_render = render_to_string(f'{component}.livewire.html',context=context)
20-
id = ''.join(random.choice(string.ascii_lowercase) for i in range(20))
21-
initial_data = {
22-
'id': id,
23-
'name': component,
24-
'redirectTo':"",
25-
"events": [],
26-
"eventQueue": [],
27-
"dispatchQueue": [],
28-
"data": {
29-
"count": 0
30-
},
31-
"children": [],
32-
"checksum": "9e4c194bb6aabf5f152fe4358385b77c396d711ba4886ac5d41513f1eb6527d3"
33-
}
34-
context = {
35-
'livewire': {
36-
'id': id,
37-
'initial_data': json.dumps(initial_data)
38-
},
39-
'component': component_render
40-
}
41-
return context
11+
# TODO: register Components by livewire.register(ComponentLivewire)
12+
from core.views import CounterLivewire
13+
livewire_component = CounterLivewire()
14+
return livewire_component.render_initial()

livewire/urls.py

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
2+
from django.urls import path
3+
from .views import livewire_message
4+
5+
urlpatterns = [
6+
path('livewire/message/<component_name>', livewire_message),
7+
]
8+

livewire/views.py

+98
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,101 @@
11
from django.shortcuts import render
2+
from django.template.loader import render_to_string
3+
from django.utils.encoding import smart_str
4+
from django.utils.safestring import mark_safe
5+
from django.http import JsonResponse
6+
import random
7+
import string
8+
import json
9+
import importlib
10+
import htmlement
11+
import xml.etree.ElementTree as ET
212

13+
def livewire_message(request, component_name):
14+
from core.views import CounterLivewire
15+
inst = CounterLivewire()
16+
if request.method == "POST":
17+
body = json.loads(request.body)
18+
inst.parser_payload(body)
19+
return JsonResponse(inst.render(), safe=False)
20+
21+
def get_id():
22+
return ''.join(random.choice(string.ascii_lowercase) for i in range(20))
23+
24+
class LivewireComponent():
25+
id = None
26+
context = {}
27+
28+
def get_component_name(self):
29+
return self.component_name.lower()
30+
31+
def get_context(self, **kwargs):
32+
self.context.update(kwargs)
33+
return self.context
34+
35+
def get_dom(self):
36+
context = self.get_context()
37+
return self._render_component(context)
38+
39+
def get_response(self):
40+
dom = self.get_dom()
41+
return {
42+
'id': self.id,
43+
'name': self.get_component_name(),
44+
'dom': dom,
45+
'fromPrefetch':'',
46+
'redirectTo': '',
47+
'children': [],
48+
'dirtyInputs': [],
49+
'data': self.get_context(),
50+
'eventQueue': [],
51+
'dispatchQueue': [],
52+
'events': [],
53+
'checksum': "c24"
54+
}
55+
56+
def parser_payload(self, payload):
57+
self.id = payload.get("id")
58+
self.context.update(payload.get("data"))
59+
action_queue = payload.get("actionQueue", [])
60+
for action in action_queue:
61+
action_type = action.get("type")
62+
payload = action.get("payload")
63+
if action_type == "callMethod":
64+
method = payload.get("method")
65+
params = payload.get("params",[])
66+
local_method = getattr(self, method)
67+
local_method(*params)
68+
69+
def render(self):
70+
response = self.get_response()
71+
return response
72+
73+
def _render_component(self, context, initial_data={} ):
74+
component_name = self.get_component_name()
75+
component_render = render_to_string(f'{component_name}.livewire.html',
76+
context=self.get_context())
77+
root = htmlement.fromstring(component_render).find("div")
78+
root.set('wire:id', self.id)
79+
if initial_data:
80+
root.set("wire:initial-data",json.dumps(initial_data))
81+
res = ET.tostring(root)
82+
return mark_safe(smart_str(res))
83+
84+
85+
def render_initial(self):
86+
self.id = get_id()
87+
component = self.get_component_name()
88+
context = self.get_context()
89+
initial_data = {
90+
'id': self.id,
91+
'name': component,
92+
'redirectTo':"",
93+
"events": [],
94+
"eventQueue": [],
95+
"dispatchQueue": [],
96+
"data": context,
97+
"children": [],
98+
"checksum": "9e4c194bb6aabf5f1" # TODO: checksum
99+
}
100+
return self._render_component(context, initial_data=initial_data)
3101

0 commit comments

Comments
 (0)