From 7adcada324dc6960cf4a120b1397c1bd60521d9b Mon Sep 17 00:00:00 2001
From: Andrew Dolgov <noreply@fakecake.org>
Date: Wed, 17 Feb 2021 08:52:39 +0300
Subject: [PATCH] share plugin: cleanup, fix icon not highlighting properly

---
 plugins/share/init.php       | 37 ++++++++++-------------
 plugins/share/share.css      |  2 +-
 plugins/share/share.js       | 58 +++++++++++++++++++-----------------
 plugins/share/share_prefs.js |  8 ++---
 4 files changed, 52 insertions(+), 53 deletions(-)

diff --git a/plugins/share/init.php b/plugins/share/init.php
index 846e1f39c..a569393fe 100644
--- a/plugins/share/init.php
+++ b/plugins/share/init.php
@@ -17,18 +17,17 @@ class Share extends Plugin {
 	}
 
 	function get_js() {
-		return file_get_contents(dirname(__FILE__) . "/share.js");
+		return file_get_contents(__DIR__ . "/share.js");
 	}
 
 	function get_css() {
-		return file_get_contents(dirname(__FILE__) . "/share.css");
+		return file_get_contents(__DIR__ . "/share.css");
 	}
 
 	function get_prefs_js() {
-		return file_get_contents(dirname(__FILE__) . "/share_prefs.js");
+		return file_get_contents(__DIR__ . "/share_prefs.js");
 	}
 
-
 	function unshare() {
 		$id = $_REQUEST['id'];
 
@@ -36,7 +35,7 @@ class Share extends Plugin {
 			AND owner_uid = ?");
 		$sth->execute([$id, $_SESSION['uid']]);
 
-		print "OK";
+		print __("Article unshared");
 	}
 
 	function hook_prefs_tab_section($id) {
@@ -52,16 +51,14 @@ class Share extends Plugin {
 		}
 	}
 
-	// Silent
 	function clearArticleKeys() {
 		$sth = $this->pdo->prepare("UPDATE ttrss_user_entries SET uuid = '' WHERE
 			owner_uid = ?");
 		$sth->execute([$_SESSION['uid']]);
 
-		return;
+		print __("Shared URLs cleared.");
 	}
 
-
 	function newkey() {
 		$id = $_REQUEST['id'];
 		$uuid = uniqid_short();
@@ -70,26 +67,25 @@ class Share extends Plugin {
 			AND owner_uid = ?");
 		$sth->execute([$uuid, $id, $_SESSION['uid']]);
 
-		print json_encode(array("link" => $uuid));
+		print json_encode(["link" => $uuid]);
 	}
 
 	function hook_article_button($line) {
-		$img_class = $line['uuid'] ? "shared" : "";
+		$icon_class = !empty($line['uuid']) ? "is-shared" : "";
 
-		return "<i id='SHARE-IMG-".$line['int_id']."' class='material-icons icon-share $img_class'
+		return "<i class='material-icons icon-share share-icon-".$line['int_id']." $icon_class'
 			style='cursor : pointer' onclick=\"Plugins.Share.shareArticle(".$line['int_id'].")\"
 			title='".__('Share by URL')."'>link</i>";
 	}
 
-	function shareArticle() {
-		$param = $_REQUEST['param'];
+	function shareDialog() {
+		$id = (int)clean($_REQUEST['id'] ?? 0);
 
 		$sth = $this->pdo->prepare("SELECT uuid FROM ttrss_user_entries WHERE int_id = ?
 			AND owner_uid = ?");
-		$sth->execute([$param, $_SESSION['uid']]);
+		$sth->execute([$id, $_SESSION['uid']]);
 
 		if ($row = $sth->fetch()) {
-
 			$uuid = $row['uuid'];
 
 			if (!$uuid) {
@@ -97,27 +93,26 @@ class Share extends Plugin {
 
 				$sth = $this->pdo->prepare("UPDATE ttrss_user_entries SET uuid = ? WHERE int_id = ?
 					AND owner_uid = ?");
-				$sth->execute([$uuid, $param, $_SESSION['uid']]);
+				$sth->execute([$uuid, $id, $_SESSION['uid']]);
 			}
 
-			$url_path = htmlspecialchars(get_self_url_prefix() . "/public.php?op=share&key=$uuid");
+			$url_path = get_self_url_prefix() . "/public.php?op=share&key=$uuid";
 
 			?>
 
 			<header><?= __("You can share this article by the following unique URL:") ?></header>
 
-
 			<section>
 				<div class='panel text-center'>
-					<a id='gen_article_url' href="<?= $url_path ?>"
-						target='_blank' rel='noopener noreferrer'><?= $url_path ?></a>
+					<a class='target-url' href="<?= htmlspecialchars($url_path) ?>"
+						target='_blank' rel='noopener noreferrer'><?= htmlspecialchars($url_path) ?></a>
 				</div>
 			</section>
 
 			<?php
 
 		} else {
-			print "Article not found.";
+			print format_error(__("Article not found."));
 		}
 
 		?>
diff --git a/plugins/share/share.css b/plugins/share/share.css
index 00bad68dd..ac9247a54 100644
--- a/plugins/share/share.css
+++ b/plugins/share/share.css
@@ -1,3 +1,3 @@
-i.icon-share.shared {
+i.material-icons.icon-share.is-shared {
     color : #0a0;
 }
\ No newline at end of file
diff --git a/plugins/share/share.js b/plugins/share/share.js
index 3fc42d654..09fb145c9 100644
--- a/plugins/share/share.js
+++ b/plugins/share/share.js
@@ -1,9 +1,7 @@
-/* global Plugins, xhrJson, Notify, fox, xhrPost, __ */
+/* global dojo, Effect, Plugins, xhrJson, Notify, fox, xhrPost, __ */
 
 Plugins.Share = {
 	shareArticle: function(id) {
-		const query = "backend.php?op=pluginhandler&plugin=share&method=shareArticle&param=" + encodeURIComponent(id);
-
 		const dialog = new fox.SingleUseDialog({
 			id: "shareArticleDlg",
 			title: __("Share article by URL"),
@@ -17,20 +15,23 @@ Plugins.Share = {
 					xhrJson("backend.php", query, (reply) => {
 						if (reply) {
 							const new_link = reply.link;
-							const e = $('gen_article_url');
+							const target = dialog.domNode.querySelector(".target-url");
 
-							if (new_link) {
+							if (new_link && target) {
 
-								e.innerHTML = e.innerHTML.replace(/\&amp;key=.*$/,
+								target.innerHTML = target.innerHTML.replace(/&amp;key=.*$/,
 									"&amp;key=" + new_link);
 
-								e.href = e.href.replace(/\&key=.*$/,
+								target.href = target.href.replace(/&key=.*$/,
 									"&key=" + new_link);
 
-								new Effect.Highlight(e);
+								// eslint-disable-next-line no-new
+								new Effect.Highlight(target);
+
+								const icon = document.querySelector(".share-icon-" + id);
 
-								const img = $("SHARE-IMG-" + id);
-								img.addClassName("shared");
+								if (icon)
+									icon.addClassName("is-shared");
 
 								Notify.close();
 
@@ -44,32 +45,35 @@ Plugins.Share = {
 			},
 			unshare: function () {
 				if (confirm(__("Remove sharing for this article?"))) {
+					xhrPost("backend.php", {op: "pluginhandler", plugin: "share", method: "unshare", id: id}, (transport) => {
+						Notify.info(transport.responseText);
 
-					const query = {op: "pluginhandler", plugin: "share", method: "unshare", id: id};
-
-					xhrPost("backend.php", query, () => {
-						try {
-							const img = $("SHARE-IMG-" + id);
+						const icon = document.querySelector(".share-icon-" + id);
 
-							if (img) {
-								img.removeClassName("shared");
-								img.up("div[id*=RROW]").removeClassName("shared");
-							}
+						if (icon)
+							icon.removeClassName("is-shared");
 
-							dialog.hide();
-						} catch (e) {
-							console.error(e);
-						}
+						dialog.hide();
 					});
 				}
 
 			},
-			href: query
+			content: __("Loading, please wait...")
 		});
 
-		dialog.show();
+		const tmph = dojo.connect(dialog, 'onShow', function () {
+			dojo.disconnect(tmph);
 
-		const img = $("SHARE-IMG-" + id);
-		img.addClassName("shared");
+			xhrPost("backend.php", {op: "pluginhandler", plugin: "share", method: "shareDialog", id: id}, (transport) => {
+				dialog.attr('content', transport.responseText)
+
+				const icon = document.querySelector(".share-icon-" + id);
+
+				if (icon)
+					icon.addClassName("is-shared");
+			});
+		});
+
+		dialog.show();
 	}
 }
diff --git a/plugins/share/share_prefs.js b/plugins/share/share_prefs.js
index 071a6667c..29c9aeaf8 100644
--- a/plugins/share/share_prefs.js
+++ b/plugins/share/share_prefs.js
@@ -1,12 +1,12 @@
+/* global Plugins, Notify, xhrPost */
+
 Plugins.Share = {
 	clearKeys: function() {
 		if (confirm(__("This will invalidate all previously shared article URLs. Continue?"))) {
 			Notify.progress("Clearing URLs...");
 
-			const query = {op: "pluginhandler", plugin: "share", method: "clearArticleKeys"};
-
-			xhrPost("backend.php", query, () => {
-				Notify.info("Shared URLs cleared.");
+			xhrPost("backend.php", {op: "pluginhandler", plugin: "share", method: "clearArticleKeys"}, (transport) => {
+				Notify.info(transport.responseText);
 			});
 		}
 
-- 
GitLab