src/view/user-editor.lisp

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