diff of 72803d02775cf00f0adbe5e8bce7fb7185c1e473

72803d02775cf00f0adbe5e8bce7fb7185c1e473
diff --git a/resources/js/newui.js b/resources/js/newui.js
new file mode 100644
index 0000000..998d1c6
--- /dev/null
+++ b/resources/js/newui.js
@@ -0,0 +1,30 @@
+let socket = null;
+
+window.addEventListener('DOMContentLoaded', _ => {
+    // TODO tää pitäisi varmaan jotenkin konffata 
+    socket = new WebSocket("ws://localhost:3011/newui");
+    
+    // Connection opened
+    socket.addEventListener("open", (event) => {
+    });
+    socket.addEventListener("error", (event) => {
+	console.log('Error: ', event);
+    });
+
+    socket.addEventListener("close", e => {
+    });
+
+    // Listen for messages
+    socket.addEventListener("message", (event) => {
+	let msg = JSON.parse(event.data);
+
+	let id = msg.id;
+	let html = msg["new-html"];
+
+	document.querySelector(`#${id}`).outerHTML = html;
+    });
+});
+
+function send(event) {
+    socket.send(`CALL ${event}`);
+}
diff --git a/src/murja-newui/newui.lisp b/src/murja-newui/newui.lisp
index 1da028f..c03ae52 100644
--- a/src/murja-newui/newui.lisp
+++ b/src/murja-newui/newui.lisp
@@ -1,5 +1,6 @@
 (defpackage murja.newui
   (:use :cl)
+  (:local-nicknames (:json :com.inuoe.jzon))
   (:import-from :cl-hash-util :hash))
 
 (in-package :murja.newui)
@@ -24,11 +25,21 @@
 (defmethod hunchensocket:client-disconnected ((session ui-session) user)
   (format t "DisConnected!~%"))
 
+;; (defun broadcast (room message &rest args)
+;;   (loop for peer in (hunchensocket:clients room)
+;;         do (hunchensocket:send-text-message peer (apply #'format nil message args))
+
+(defparameter *current-ws* nil)
 (defmethod hunchensocket:text-message-received ((session ui-session) user message)
   (format t "~a said ~a~%" (uid user) message)
   (loop for peer in (hunchensocket:clients session)
 	when (equalp (uid user) (uid peer))
-          do (hunchensocket:send-text-message peer "hehe :D")))
+          do (let ((*current-ws* peer))
+	       (call-event message))))
+
+(defparameter *server* (make-instance 'hunchensocket:websocket-acceptor :port 3011))
+;;(hunchentoot:stop *server*)
+;;(hunchentoot:start *server*)
 
 
 ;; html generator thing 
@@ -51,7 +62,7 @@
 
 (defclass event ()
   ((generated-js-id :accessor generated-js-id :initform (format nil "fn~a" (random 98765)))
-   (closure :initarg :closure :initform (error "Gimme closure"))))
+   (closure :initarg :closure :initform (error "Gimme closure") :accessor closure)))
 
 (defmethod set-state ((s state) key value)
   (with-slots (state-map root-component root-component-generator) s
@@ -73,7 +84,10 @@
 	    tag attrs (mapcar (lambda (kid) (render kid)) children) tag)))
 
 (defmethod rerender ((c component))
-  (format t "Rerending a component ~a~%" (render c)))
+  (with-slots (attrs) c
+    (let ((id (getf attrs :id)))
+      (hunchensocket:send-text-message *current-ws* (json:stringify (hash ("id" id)
+									  ("new-html" (render c))))))))
 
 (defmethod render ((e event))
   "pääseeköhän tähän väliin?")
@@ -87,6 +101,8 @@
 		  :attributes (list ,@attrs)
 		  :children (list ,@children)))
 
+(defvar *js-identifiers-in-scope* (hash))
+
 (defun e (fn)
   (let ((ev (make-instance 'event :closure fn)))
     (setf (gethash (generated-js-id ev) *js-identifiers-in-scope*) ev)
@@ -100,7 +116,7 @@
     (format out *component-format-string* tag attrs children)))
 
 (defmethod print-object ((e event) out)
-  (format out "~a();" (generated-js-id e)))
+  (format out "send('~a');" (generated-js-id e)))
 ;; (with-slots (generated-js-id closure) e
 ;;   (format out "#<generated-js-id: ~a, closure: ~a>" generated-js-id (function-lambda-expression closure))))
 
@@ -110,7 +126,6 @@
   ~a)" (alexandria:hash-table-plist (state-map s)) (root-component s)))
     
 (defvar *current-state* nil)
-(defvar *js-identifiers-in-scope* (hash))
 
 (defmacro with-state (bindings &rest body)
   (let ((rewritten-symbols (map 'list #'first bindings)))
@@ -124,10 +139,20 @@
 								      (setf (gethash k m) v)
 								      m))
 								  bindings
-								  :initial-value (hash)))))
+								  :initial-value (hash))))
+	     (root-component-id (format nil "id~d" (random 123456))))
 	 (setf (root-component current-state)
 	       ,@(rewrite body))
-	 (setf (root-component-generator current-state) (lambda () ,@(rewrite body)))
+	 (with-slots (attrs) (root-component current-state)
+	   (push root-component-id attrs)
+	   (push :id attrs))
+	 (setf (root-component-generator current-state) (lambda ()
+							  (let ((comp ,@(rewrite body)))
+							    (with-slots (attrs) comp 
+							      (push root-component-id attrs)
+							      (push :id attrs)
+							      comp))))
+								     
 	 current-state))))
 
 
@@ -185,3 +210,37 @@
 
 ;; (with-slots (closure) (gethash "fn58386" *js-identifiers-in-scope*)
 ;;   (funcall closure)) 
+
+
+(easy-routes:defroute demo ("/demo" :method :get) ()
+  (render
+   (c :html (:lang "en")
+      (c :head ()
+	 (c :style () "body { background-color: #880088; }")
+	 (c :script (:src "/resources/newui.js"))
+	 (c :link (:rel :stylesheet :src "/resources/murja.css")))
+
+      (with-state ((linnunrata-vakio 42))
+	(c :body ()
+	   (c :header () "Willkommen!")
+	   (c :div (:class "sidebar-flex")
+	      (c :div () (format nil "~d bugia korjaamatta" linnunrata-vakio))
+	      (c :button (:onclick (e (lambda ()
+					(format t "lollero ~a~%" linnunrata-vakio)
+					(decf linnunrata-vakio))))
+		 "Vähennä bugeja tjsp.")))))))
+
+(setf hunchentoot:*catch-errors-p* nil)
+
+
+;; fixes the hunchensocket's header->keyword bug 
+(setf (fdefinition 'chunga::as-keyword-if-found) (fdefinition 'chunga::as-keyword))
+
+
+
+(defun call-event (event)
+  (let* ((id (second (str:split #\Space event)))
+	 (fn (gethash id *js-identifiers-in-scope*)))
+    (with-slots (closure) fn 
+      (format t "Calling ~a~%" fn)
+      (funcall closure))))