Parcourir la source

Use Web Share API for sharing entry

Jean Khawand il y a 2 ans
Parent
commit
061f12fbb0
3 fichiers modifiés avec 48 ajouts et 5 suppressions
  1. 2 0
      template/templates/views/entry.html
  2. 45 5
      ui/static/js/app.js
  3. 1 0
      ui/static/js/bootstrap.js

+ 2 - 0
template/templates/views/entry.html

@@ -49,6 +49,7 @@
                     <li>
                     <li>
                         <a href="{{ route "sharedEntry" "shareCode" .entry.ShareCode }}"
                         <a href="{{ route "sharedEntry" "shareCode" .entry.ShareCode }}"
                             title="{{ t "entry.shared_entry.title" }}"
                             title="{{ t "entry.shared_entry.title" }}"
+                            data-share-status="shared"
                             target="_blank">{{ icon "share" }}<span class="icon-label">{{ t "entry.shared_entry.label" }}</span></a>
                             target="_blank">{{ icon "share" }}<span class="icon-label">{{ t "entry.shared_entry.label" }}</span></a>
                     </li>
                     </li>
                     <li>
                     <li>
@@ -64,6 +65,7 @@
                     <li>
                     <li>
                         <a href="{{ route "shareEntry" "entryID" .entry.ID }}"
                         <a href="{{ route "shareEntry" "entryID" .entry.ID }}"
                             title="{{ t "entry.share.title" }}"
                             title="{{ t "entry.share.title" }}"
+                            data-share-status="share"
                             target="_blank">{{ icon "share" }}<span class="icon-label">{{ t "entry.share.label" }}</span></a>
                             target="_blank">{{ icon "share" }}<span class="icon-label">{{ t "entry.share.label" }}</span></a>
                     </li>
                     </li>
                 {{ end }}
                 {{ end }}

+ 45 - 5
ui/static/js/app.js

@@ -221,9 +221,9 @@ function updateEntriesStatus(entryIDs, status, callback) {
     request.withBody({entry_ids: entryIDs, status: status});
     request.withBody({entry_ids: entryIDs, status: status});
     request.withCallback((resp) => {
     request.withCallback((resp) => {
         resp.json().then(count => {
         resp.json().then(count => {
-        if (callback) {
-            callback(resp);
-        }
+            if (callback) {
+                callback(resp);
+            }
 
 
             if (status === "read") {
             if (status === "read") {
                 decrementUnreadCounter(count);
                 decrementUnreadCounter(count);
@@ -336,7 +336,7 @@ function handleFetchOriginalContent() {
         response.json().then((data) => {
         response.json().then((data) => {
             if (data.hasOwnProperty("content") && data.hasOwnProperty("reading_time")) {
             if (data.hasOwnProperty("content") && data.hasOwnProperty("reading_time")) {
                 document.querySelector(".entry-content").innerHTML = data.content;
                 document.querySelector(".entry-content").innerHTML = data.content;
-				document.querySelector(".entry-reading-time").innerHTML = data.reading_time;
+                document.querySelector(".entry-reading-time").innerHTML = data.reading_time;
             }
             }
         });
         });
     });
     });
@@ -557,7 +557,7 @@ function handleConfirmationMessage(linkElement, callback) {
     }
     }
 
 
     linkElement.style.display = "none";
     linkElement.style.display = "none";
-    
+
     let containerElement = linkElement.parentNode;
     let containerElement = linkElement.parentNode;
     let questionElement = document.createElement("span");
     let questionElement = document.createElement("span");
 
 
@@ -638,3 +638,43 @@ function handlePlayerProgressionSave(playerElement) {
         request.execute();
         request.execute();
     }
     }
 }
 }
+
+/**
+ * handle new share entires and already shared entries
+ */
+function handleShare() {
+    let link = document.querySelector('a[data-share-status]');
+    let title = document.querySelector("body > main > section > header > h1 > a");
+    if (link.dataset.shareStatus === "shared") {
+        checkShareAPI(title, link.href);
+    }
+    if (link.dataset.shareStatus === "share") {
+        let request = new RequestBuilder(link.href);
+        request.withCallback((r) => {
+            checkShareAPI(title, r.url);
+        });
+        request.withHttpMethod("GET");
+        request.execute();
+    }
+}
+
+/**
+* wrapper for Web Share API
+*/
+function checkShareAPI(title, url) {
+    if (!navigator.canShare) {
+        console.error("Your browser doesn't support the Web Share API.");
+        window.location = url;
+        return;
+    }
+    try {
+        navigator.share({
+            title: title,
+            url: url
+        });
+        window.location.reload();
+    } catch (err) {
+        console.error(err);
+        window.location.reload();
+    }
+}

+ 1 - 0
ui/static/js/bootstrap.js

@@ -52,6 +52,7 @@ document.addEventListener("DOMContentLoaded", function () {
     onClick("a[data-toggle-bookmark]", (event) => handleBookmark(event.target));
     onClick("a[data-toggle-bookmark]", (event) => handleBookmark(event.target));
     onClick("a[data-fetch-content-entry]", () => handleFetchOriginalContent());
     onClick("a[data-fetch-content-entry]", () => handleFetchOriginalContent());
     onClick("a[data-action=search]", (event) => setFocusToSearchInput(event));
     onClick("a[data-action=search]", (event) => setFocusToSearchInput(event));
+    onClick("a[data-share-status]", () => handleShare());
     onClick("a[data-action=markPageAsRead]", (event) => handleConfirmationMessage(event.target, () => markPageAsRead()));
     onClick("a[data-action=markPageAsRead]", (event) => handleConfirmationMessage(event.target, () => markPageAsRead()));
     onClick("a[data-toggle-status]", (event) => handleEntryStatus("next", event.target));
     onClick("a[data-toggle-status]", (event) => handleEntryStatus("next", event.target));