diff libervia/web/pages/photos/album/_browser/__init__.py @ 1532:106945841fbc

_browser (album): moved code to upload file to a separate `file_uploader` module: this way, uploading logic can be re-used elsewhere.
author Goffi <goffi@goffi.org>
date Thu, 22 Jun 2023 16:36:01 +0200
parents d7c78722e4f8
children
line wrap: on
line diff
--- a/libervia/web/pages/photos/album/_browser/__init__.py	Thu Jun 22 16:35:34 2023 +0200
+++ b/libervia/web/pages/photos/album/_browser/__init__.py	Thu Jun 22 16:36:01 2023 +0200
@@ -1,14 +1,14 @@
-from browser import document, window, bind, html, DOMNode, aio
+import alt_media_player
+from bridge import AsyncBridge, Bridge
+from browser import DOMNode, aio, bind, document, html, window
+import dialog
+from file_uploader import FileUploader
+from invitation import InvitationManager
 from javascript import JSON
-from bridge import Bridge, AsyncBridge
-from template import Template
-import dialog
+import loading
 from slideshow import SlideShow
-from invitation import InvitationManager
-import alt_media_player
-# we use tmp_aio because `blob` is not handled in Brython's aio
+from template import Template
 import tmp_aio
-import loading
 
 
 cache_path = window.cache_path
@@ -28,83 +28,7 @@
 
 # file upload
 
-def on_progress(ev, photo_elt):
-    if ev.lengthComputable:
-        percent = int(ev.loaded/ev.total*100)
-        update_progress(photo_elt, percent)
-
-
-def on_load(file_, photo_elt):
-    update_progress(photo_elt, 100)
-    photo_elt.classList.add("progress_finished")
-    photo_elt.classList.remove("progress_started")
-    photo_elt.select_one('.action_delete').bind("click", on_delete)
-    print(f"file {file_.name} uploaded correctly")
-
-
-def on_error(failure, file_, photo_elt):
-    dialog.notification.show(
-        f"can't upload {file_.name}: {failure}",
-        level="error"
-    )
-
-
-def update_progress(photo_elt, new_value):
-    progress_elt = photo_elt.select_one("progress")
-    progress_elt.value = new_value
-    progress_elt.text = f"{new_value}%"
-
-
-def on_slot_cb(file_, upload_slot, photo_elt):
-    put_url, get_url, headers = upload_slot
-    xhr = window.XMLHttpRequest.new()
-    xhr.open("PUT", put_url, True)
-    xhr.upload.bind('progress', lambda ev: on_progress(ev, photo_elt))
-    xhr.upload.bind('load', lambda ev: on_load(file_, photo_elt))
-    xhr.upload.bind('error', lambda ev: on_error(xhr.response, file_, photo_elt))
-    xhr.setRequestHeader('Xmpp-File-Path', window.encodeURIComponent(files_path))
-    xhr.setRequestHeader('Xmpp-File-No-Http', "true")
-    xhr.send(file_)
-
-
-def on_slot_eb(file_, failure, photo_elt):
-    dialog.notification.show(
-        f"Can't get upload slot: {failure['message']}",
-        level="error"
-    )
-    photo_elt.remove()
-
-
-def upload_files(files):
-    print(f"uploading {len(files)} files")
-    album_items = document['album_items']
-    for file_ in files:
-        url = window.URL.createObjectURL(file_)
-        photo_elt = photo_tpl.get_elt({
-            "file": {
-                "name": file_.name,
-                # we don't want to open the file on click, it's not yet the
-                # uploaded URL
-                "url": url,
-                # we have no thumb yet, so we use the whole image
-                # TODO: reduce image for preview
-                "thumb_url": url,
-            },
-            "uploading": True,
-        })
-        photo_elt.classList.add("progress_started")
-        album_items <= photo_elt
-
-        bridge.file_http_upload_get_slot(
-            file_.name,
-            file_.size,
-            file_.type or '',
-            files_service,
-            callback=lambda upload_slot, file_=file_, photo_elt=photo_elt:
-                on_slot_cb(file_, upload_slot, photo_elt),
-            errback=lambda failure, file_=file_, photo_elt=photo_elt:
-                on_slot_eb(file_, failure, photo_elt),
-        )
+file_uploader = FileUploader(files_service, "photo/item.html", files_path)
 
 
 @bind("#file_drop", "drop")
@@ -112,7 +36,7 @@
     evt.stopPropagation()
     evt.preventDefault()
     files = evt.dataTransfer.files
-    upload_files(files)
+    file_uploader.upload_files(files, document["album_items"])
 
 
 @bind("#file_drop", "dragover")
@@ -125,7 +49,7 @@
 @bind("#file_input", "change")
 def on_file_input_change(evt):
     files = evt.currentTarget.files
-    upload_files(files)
+    file_uploader.upload_files(files, document["album_items"])
 
 # delete
 
@@ -173,6 +97,8 @@
         cancel_cb=lambda evt, notif_elt: delete_cancel(evt, notif_elt, item_elt, item),
     )
 
+file_uploader.on_delete_cb = on_delete
+
 # cover
 
 async def cover_ok(evt, notif_elt, item_elt, item):