src/view/user-editor.lisp
(in-package :murja.view.user-editor)
(eval-when (:compile-toplevel :load-toplevel :execute)
(named-readtables:in-readtable :murja.ps))
(defroute change-profile-picture ("/api/profile-picture" :method :post
:decorators (@transaction
auth:@authenticated))
(&post file)
(destructuring-bind (tmp-file filename mime) file
(declare (ignore mime))
(let* ((bytes (lisp-fixup:slurp-bytes tmp-file))
(result (caar (insert-media filename bytes))))
(setf (user:user-img-location auth:*user*) (format nil "/api/pictures/~a" result))
(postmodern:update-dao auth:*user*)
result)))
(defun dnd-script ()
(ps
(defun set-hover (e)
(chain e (prevent-default))
(chain (@ e target class-list)
(add "draggingImages")))
(defun disable-hover (e)
(chain e (prevent-default))
(chain (@ e target class-list)
(remove "draggingImages")))
(defun-async send-file (e)
(let ((form-data (new (FormData))))
(dolist (item (chain e data-transfer items))
(chain form-data
(append "file" (chain item (get-as-file)))))
(let ((response (await (fetch (lisp (murja.genurl:route->url-ps 'change-profile-picture))
(create
method "POST"
body form-data)))))
(if (= (@ response status) 200)
(let* ((result (await (chain response (text))))
;;
(pic (chain document (query-selector "#usereditor-profilepic"))))
(setf (@ pic src) (+ "/api/pictures/" result)))
(alert (+ "Send failed, server responded " (@ response status) " - " (await (chain response (text)))))))))
(chain document
(add-event-listener "DOMContentLoaded"
(lambda (e)
(let ((container (chain document
(query-selector "#profile-image-container"))))
(chain container
(add-event-listener "dragenter" #'set-hover))
(chain container
(add-event-listener "dragover" #'set-hover))
(chain container
(add-event-listener "dragend" #'disable-hover))
(chain container
(add-event-listener "dragleave" #'disable-hover))
(chain container
(add-event-listener "drop" (lambda (e)
(chain e (prevent-default))
(send-file e)
(disable-hover e)
false)))))))))
(defroute save-usersettings ("/usersettings" :method :post
:decorators (@db
auth:@authenticated))
(&post username nickname password)
(destructuring-bind (username nickname password) (map 'list (lambda (a)
(unless (string= "" a)
a))
(list username nickname password))
(when username
(setf (user:user-username auth:*user*) username))
(when nickname
(setf (user:user-nickname auth:*user*) nickname))
(when password
(setf (user:user-password auth:*user*) (lisp-fixup:sha-512 password)))
(postmodern:update-dao auth:*user*)
(let ((referer (hunchentoot:header-in* "referer")))
(hunchentoot:redirect referer))))
(deftab blog/usersettings (:url "/usersettings"
:subtab t
:require-login t)
(let ((user auth:*user*))
(:script (:raw
(dnd-script)))
(:form :method :post :action (murja.genurl:route->url 'save-usersettings)
(:label :for "username" "Username")
(:input :type :text
:id "username"
:name "username"
:value (user:user-username user))
(:label :for "nickname" "Nickname")
(:input :type :text
:id "nickname"
:name "nickname"
:value (user:user-nickname user))
(:label :for "password" "Password")
(:input :type :password
:id "password"
:name "password")
(:section :id "profile-image-container"
(:h* (:label "Image"))
(:div "Drop an image file here to change your profile picture")
(:img.user_avatar :id "usereditor-profilepic" :src (user:user-img-location user)))
(:input :type :submit))))