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))))