Add detail page favourited state
diff --git a/erpnext/public/js/hub/components/detail_view.js b/erpnext/public/js/hub/components/detail_view.js
index 1f0d542..9ef48d4 100644
--- a/erpnext/public/js/hub/components/detail_view.js
+++ b/erpnext/public/js/hub/components/detail_view.js
@@ -1,3 +1,5 @@
+import { get_rating_html } from './reviews';
+
 function get_detail_view_html(item, allow_edit) {
 	const title = item.item_name || item.name;
 	const seller = item.company;
@@ -23,6 +25,13 @@
 		stats = `${views_message}${dot_spacer}${rating_html} (${rating_count})`;
 	}
 
+	let favourite_button = !item.favourited
+		? `<button class="btn btn-default text-muted favourite-button" data-action="add_to_favourites">
+			${__('Save')} <i class="octicon octicon-heart text-extra-muted"></i>
+		</button>`
+		: `<button class="btn btn-default text-muted favourite-button disabled" data-action="add_to_favourites">
+			${__('Saved')}
+		</button>`;
 
 	let menu_items = '';
 
@@ -59,9 +68,7 @@
 					</div>
 
 					<div class="page-actions detail-page-actions">
-						<button class="btn btn-default text-muted favourite-button" data-action="add_to_favourites">
-							${__('Add to Favourites')} <i class="octicon octicon-heart text-extra-muted"></i>
-						</button>
+						${favourite_button}
 						<button class="btn btn-primary" data-action="contact_seller">
 							${__('Contact Seller')}
 						</button>
diff --git a/erpnext/public/js/hub/components/item_card.js b/erpnext/public/js/hub/components/item_card.js
index 733df62..262ed21 100644
--- a/erpnext/public/js/hub/components/item_card.js
+++ b/erpnext/public/js/hub/components/item_card.js
@@ -82,19 +82,7 @@
 	return item_html;
 }
 
-
-function get_rating_html(rating) {
-	let rating_html = ``;
-	for (var i = 0; i < 5; i++) {
-		let star_class = 'fa-star';
-		if (i >= rating) star_class = 'fa-star-o';
-		rating_html += `<i class='fa fa-fw ${star_class} star-icon' data-index=${i}></i>`;
-	}
-	return rating_html;
-}
-
 export {
 	get_item_card_html,
-    get_local_item_card_html,
-    get_rating_html
+    get_local_item_card_html
 }
diff --git a/erpnext/public/js/hub/components/reviews.js b/erpnext/public/js/hub/components/reviews.js
index 616f2fb..e34d680 100644
--- a/erpnext/public/js/hub/components/reviews.js
+++ b/erpnext/public/js/hub/components/reviews.js
@@ -1,5 +1,3 @@
-import { get_rating_html } from './item_card';
-
 function get_review_html(review) {
 	let username = review.username || review.user || __("Anonymous");
 
@@ -66,6 +64,17 @@
 	</div>`;
 }
 
+function get_rating_html(rating) {
+	let rating_html = ``;
+	for (var i = 0; i < 5; i++) {
+		let star_class = 'fa-star';
+		if (i >= rating) star_class = 'fa-star-o';
+		rating_html += `<i class='fa fa-fw ${star_class} star-icon' data-index=${i}></i>`;
+	}
+	return rating_html;
+}
+
 export {
-	get_review_html
+	get_review_html,
+    get_rating_html
 }
diff --git a/erpnext/public/js/hub/hub_call.js b/erpnext/public/js/hub/hub_call.js
index 6786cf6..6bc1701 100644
--- a/erpnext/public/js/hub/hub_call.js
+++ b/erpnext/public/js/hub/hub_call.js
@@ -35,9 +35,9 @@
 				}
 
 				erpnext.hub.cache[key] = r.message;
-				resolve(r.message)
+				resolve(r.message);
 			}
-			reject(r)
+			reject(r);
 		})
 		.fail(reject)
 	});
diff --git a/erpnext/public/js/hub/pages/item.js b/erpnext/public/js/hub/pages/item.js
index 207c94c..ee43391 100644
--- a/erpnext/public/js/hub/pages/item.js
+++ b/erpnext/public/js/hub/pages/item.js
@@ -70,10 +70,18 @@
 
 
 	add_to_favourites(favourite_button) {
-		$(favourite_button).html('Added to Favourites').addClass('disabled');
-		return hub.call('remove_item_from_seller_favourites', {
+		$(favourite_button).addClass('disabled');
+
+		hub.call('add_item_to_seller_favourites', {
 			hub_item_code: this.hub_item_code,
 			hub_seller: hub.settings.company_email
+		})
+		.then(() => {
+			$(favourite_button).html('Saved');
+			frappe.show_alert(__('Saved to <b><a href="#marketplace/favourites">Favourites</a></b>'));
+		})
+		.catch(e => {
+			console.log(e);
 		});
 	}
 
@@ -143,7 +151,9 @@
 
 		$timeline.empty();
 
-		this.reviews.sort((a, b) => {
+		const reviews = this.reviews || [];
+
+		reviews.sort((a, b) => {
 			if (a.modified > b.modified) {
 				return -1;
 			}
@@ -155,7 +165,7 @@
 			return 0;
 		});
 
-		this.reviews.forEach(review => {
+		reviews.forEach(review => {
 			$(get_review_html(review)).appendTo($timeline);
 		});
 	}