fix: Messages

- update messages according to new doctype
- sync logo in seller registration
- hub.is_seller_registered() and hub.is_user_registered() api
- Add Users dialog
diff --git a/erpnext/hub_node/api.py b/erpnext/hub_node/api.py
index 2a928d4..df3e7ef 100644
--- a/erpnext/hub_node/api.py
+++ b/erpnext/hub_node/api.py
@@ -19,6 +19,7 @@
 @frappe.whitelist()
 def register_marketplace(company, company_description):
 	validate_registerer()
+
 	settings = frappe.get_single('Marketplace Settings')
 	message = settings.register_seller(company, company_description)
 
@@ -151,6 +152,14 @@
 	except Exception as e:
 		frappe.log_error(message=e, title='Hub Sync Error')
 
+@frappe.whitelist()
+def get_unregistered_users():
+	settings = frappe.get_single('Marketplace Settings')
+	registered_users = [user.user for user in settings.users] + ['Administrator', 'Guest']
+	all_users = [user.name for user in frappe.db.get_all('User', filters={'enabled': 1})]
+	unregistered_users = [user for user in all_users if user not in registered_users]
+	return unregistered_users
+
 
 def item_sync_preprocess(intended_item_publish_count):
 	response = call_hub_method('pre_items_publish', {
diff --git a/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py b/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py
index ebe8b70..5ea3011 100644
--- a/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py
+++ b/erpnext/hub_node/doctype/marketplace_settings/marketplace_settings.py
@@ -15,18 +15,16 @@
 
 	def register_seller(self, company, company_description):
 
-		country, currency, description = frappe.db.get_value('Company', company,
-			['country', 'default_currency', 'company_description'])
+		country, currency, company_logo = frappe.db.get_value('Company', company,
+			['country', 'default_currency', 'company_logo'])
 
 		company_details = {
 			'company': company,
 			'country': country,
-			# 'city': '',
 			'currency': currency,
 			'company_description': company_description,
-			# 'company_logo': company_logo,
-
-			'site_name': frappe.utils.get_url(),
+			'company_logo': company_logo,
+			'site_name': frappe.utils.get_url()
 		}
 
 		hub_connection = self.get_connection()
diff --git a/erpnext/public/js/hub/Sidebar.vue b/erpnext/public/js/hub/Sidebar.vue
index 6e0b26c..164e78d 100644
--- a/erpnext/public/js/hub/Sidebar.vue
+++ b/erpnext/public/js/hub/Sidebar.vue
@@ -19,7 +19,7 @@
 export default {
 	data() {
 		return {
-			hub_registered: hub.settings.registered,
+			hub_registered: hub.is_user_registered(),
 			items: [
 				{
 					label: __('Browse'),
diff --git a/erpnext/public/js/hub/components/ReviewArea.vue b/erpnext/public/js/hub/components/ReviewArea.vue
index 070d0a6..159fdd1 100644
--- a/erpnext/public/js/hub/components/ReviewArea.vue
+++ b/erpnext/public/js/hub/components/ReviewArea.vue
@@ -56,8 +56,6 @@
 		},
 
 		on_submit_review(values) {
-			values.user = hub.settings.company_email;
-
 			this.review_area.reset();
 
 			hub.call('add_item_review', {
diff --git a/erpnext/public/js/hub/components/profile_dialog.js b/erpnext/public/js/hub/components/profile_dialog.js
index ea827ff..636bf14 100644
--- a/erpnext/public/js/hub/components/profile_dialog.js
+++ b/erpnext/public/js/hub/components/profile_dialog.js
@@ -24,16 +24,10 @@
 				}
 			}
 		},
-		// {
-		// 	fieldname: 'company_logo',
-		// 	label: __('Logo'),
-		// 	fieldtype: 'Attach Image',
-		// 	read_only: true
-		// },
 		{
+			label: __('About your company'),
 			fieldname: 'company_description',
-			label: __('About Your Company'),
-			fieldtype: 'Long Text'
+			fieldtype: 'Text'
 		}
 	];
 
@@ -48,7 +42,7 @@
 			// TODO: Say "we notice that the company description and logo isn't set. Please set them in master."
 			// Only then allow to register
 
-			const mandatory_fields = ['company'];
+			const mandatory_fields = ['company', 'company_description'];
 			mandatory_fields.forEach(field => {
 				const value = form_values[field];
 				if (!value) {
@@ -65,7 +59,7 @@
 	// Post create
 	const default_company = frappe.defaults.get_default('company');
 	dialog.set_value('company', default_company);
-	dialog.set_value('company_email', frappe.session.user);
+	dialog.set_value('email', frappe.session.user);
 
 	return dialog;
 }
diff --git a/erpnext/public/js/hub/marketplace.js b/erpnext/public/js/hub/marketplace.js
index 9df6303..bacca47 100644
--- a/erpnext/public/js/hub/marketplace.js
+++ b/erpnext/public/js/hub/marketplace.js
@@ -22,17 +22,20 @@
 
 		frappe.model.with_doc('Marketplace Settings').then(doc => {
 			hub.settings = doc;
-			const is_registered = hub.settings.registered;
-			const is_registered_seller = hub.settings.company_email === frappe.session.user;
+
 			this.setup_header();
 			this.make_sidebar();
 			this.make_body();
 			this.setup_events();
 			this.refresh();
-			if (!is_registered && !is_registered_seller && frappe.user_roles.includes('System Manager')) {
-				this.page.set_primary_action('Become a Seller', this.show_register_dialog.bind(this))
-			} else {
-				this.page.set_secondary_action('Add Users', this.show_add_user_dialog.bind(this));
+
+			if (is_subset(['System Manager', 'Item Manager'], frappe.user_roles)) {
+				// show buttons only to System Manager
+				if (!hub.is_seller_registered()) {
+					this.page.set_primary_action('Become a Seller', this.show_register_dialog.bind(this))
+				} else {
+					this.page.set_secondary_action('Add Users', this.show_add_user_dialog.bind(this));
+				}
 			}
 		});
 	}
@@ -118,45 +121,73 @@
 	}
 
 	show_add_user_dialog() {
-		const user_list = Object.keys(frappe.boot.user_info)
-			.filter(user => !['Administrator', 'Guest', frappe.session.user].includes(user));
-		const d = new frappe.ui.Dialog({
-			title: __('Add Users to Marketplace'),
-			fields: [
-				{
-					label: __('Users'),
-					fieldname: 'users',
-					fieldtype: 'MultiSelect',
-					reqd: 1,
-					get_data() {
-						return user_list;
-					}
-				}
-			],
-			primary_action({ users }) {
-				const selected_users = users.split(',').map(d => d.trim()).filter(Boolean);
+		this.get_unregistered_users()
+			.then(r => {
+				const user_list = r.message;
 
-				if (!selected_users.every(user => user_list.includes(user))) {
-					d.set_df_property('users', 'description', __('Some emails are invalid'));
-					return;
-				} else {
-					d.set_df_property('users', 'description', '');
-				}
+				const d = new frappe.ui.Dialog({
+					title: __('Add Users to Marketplace'),
+					fields: [
+						{
+							label: __('Users'),
+							fieldname: 'users',
+							fieldtype: 'MultiSelect',
+							reqd: 1,
+							get_data() {
+								return user_list;
+							}
+						}
+					],
+					primary_action({ users }) {
+						const selected_users = users.split(',').map(d => d.trim()).filter(Boolean);
 
-				frappe.call('erpnext.hub_node.api.register_users', {
-					user_list: selected_users
-				})
-				.then(r => {
-					d.hide();
+						if (!selected_users.every(user => user_list.includes(user))) {
+							d.set_df_property('users', 'description', __('Some emails are invalid'));
+							return;
+						} else {
+							d.set_df_property('users', 'description', '');
+						}
 
-					if (r.message && r.message.length) {
-						frappe.show_alert('Added {0} users', [r.message.length]);
+						frappe.call('erpnext.hub_node.api.register_users', {
+							user_list: selected_users
+						})
+						.then(r => {
+							d.hide();
+
+							if (r.message && r.message.length) {
+								frappe.show_alert(__('Added {0} users', [r.message.length]));
+							}
+						});
 					}
 				});
-			}
-		});
 
-		d.show();
+				d.show();
+			});
 	}
 
+	get_unregistered_users() {
+		return frappe.call('erpnext.hub_node.api.get_unregistered_users')
+	}
+
+}
+
+Object.assign(hub, {
+	is_seller_registered() {
+		return hub.settings.registered;
+	},
+
+	is_user_registered() {
+		return this.is_seller_registered() && hub.settings.users
+			.filter(hub_user => hub_user.user === frappe.session.user)
+			.length === 1;
+	},
+});
+
+/**
+ * Returns true if list_a is subset of list_b
+ * @param {Array} list_a
+ * @param {Array} list_b
+ */
+function is_subset(list_a, list_b) {
+	return list_a.every(item => list_b.includes(item));
 }
diff --git a/erpnext/public/js/hub/pages/Buying.vue b/erpnext/public/js/hub/pages/Buying.vue
index ddb4b11..ebf593a 100644
--- a/erpnext/public/js/hub/pages/Buying.vue
+++ b/erpnext/public/js/hub/pages/Buying.vue
@@ -13,8 +13,8 @@
 					v-route="'marketplace/buying/' + item.name"
 				>
 					<div slot="subtitle">
-						<span>{{item.recent_message.sender}}: </span>
-						<span>{{item.recent_message.content | striphtml}}</span>
+						<span>{{ get_sender(item.recent_message) }}: </span>
+						<span>{{ item.recent_message.message | striphtml }}</span>
 					</div>
 				</item-list-card>
 			</div>
@@ -47,6 +47,9 @@
 	methods: {
 		get_items_for_messages() {
 			return hub.call('get_buying_items_for_messages', {}, 'action:send_message');
+		},
+		get_sender(message) {
+			return message.sender === frappe.session.user ? __('You') : (message.sender_name || message.sender);
 		}
 	}
 }
diff --git a/erpnext/public/js/hub/pages/Item.vue b/erpnext/public/js/hub/pages/Item.vue
index 5d07bcd..272be58 100644
--- a/erpnext/public/js/hub/pages/Item.vue
+++ b/erpnext/public/js/hub/pages/Item.vue
@@ -81,7 +81,7 @@
 		is_own_item() {
 			let is_own_item = false;
 			if(this.item) {
-				if(this.item.hub_seller === hub.setting.company_email) {
+				if(this.item.hub_seller === hub.settings.hub_seller_name) {
 					is_own_item = true;
 				}
 			}
@@ -224,13 +224,11 @@
 					if (!message) return;
 
 					hub.call('send_message', {
-						from_seller: hub.settings.company_email,
-						to_seller: this.item.hub_seller,
 						hub_item: this.item.name,
 						message
 					})
 						.then(() => {
-							d.hide();
+							this.contact_seller_dialog.hide();
 							frappe.set_route('marketplace', 'buying', this.item.name);
 							erpnext.hub.trigger('action:send_message')
 						});
diff --git a/erpnext/public/js/hub/pages/Messages.vue b/erpnext/public/js/hub/pages/Messages.vue
index 1930bcb..73506e9 100644
--- a/erpnext/public/js/hub/pages/Messages.vue
+++ b/erpnext/public/js/hub/pages/Messages.vue
@@ -16,7 +16,7 @@
 						<div class="level margin-bottom" v-for="message in messages" :key="message.name">
 							<div class="level-left ellipsis" style="width: 80%;">
 								<div v-html="frappe.avatar(message.sender)" />
-								<div style="white-space: normal;" v-html="message.content" />
+								<div style="white-space: normal;" v-html="message.message" />
 							</div>
 							<div class="level-right text-muted" v-html="frappe.datetime.comment_when(message.creation, true)" />
 						</div>
@@ -64,13 +64,12 @@
 	methods: {
 		send_message(message) {
 			this.messages.push({
-				sender: hub.settings.company_email,
-				content: message,
+				sender: frappe.session.user,
+				message: message,
 				creation: Date.now(),
 				name: frappe.utils.get_random(6)
 			});
 			hub.call('send_message', {
-				from_seller: hub.settings.company_email,
 				to_seller: this.get_against_seller(),
 				hub_item: this.item_details.name,
 				message
diff --git a/erpnext/public/js/hub/pages/PublishedItems.vue b/erpnext/public/js/hub/pages/PublishedItems.vue
index 52df285..6559f79 100644
--- a/erpnext/public/js/hub/pages/PublishedItems.vue
+++ b/erpnext/public/js/hub/pages/PublishedItems.vue
@@ -5,10 +5,10 @@
 	>
 		<section-header>
 			<div>
-				<h5>{{ page_title }}</h5>
+				<h5>{{ __('Published Items') }}</h5>
 				<p v-if="items.length"
 					class="text-muted margin-bottom">
-					{{ published_items_message }}
+					{{ __('You can publish upto 200 items.') }}
 				</p>
 			</div>
 
@@ -16,7 +16,7 @@
 				class="btn btn-default btn-xs publish-items"
 				v-route="'marketplace/publish'"
 			>
-				<span>{{ publish_button_text }}</span>
+				<span>{{ __('Publish More Items') }}</span>
 			</button>
 
 		</section-header>
@@ -26,7 +26,7 @@
 			:items="items"
 			:item_id_fieldname="item_id_fieldname"
 			:on_click="go_to_item_details_page"
-			:empty_state_message="empty_state_message"
+			:empty_state_message="__('You haven\'t published any items yet.')"
 			:empty_state_action="publish_page_action"
 		>
 		</item-cards-container>
@@ -44,16 +44,9 @@
 			publish_page_action: {
 				label: __('Publish Your First Items'),
 				on_click: () => {
-					frappe.set_route(`marketplace/home`);
+					frappe.set_route(`marketplace/publish`);
 				}
-			},
-
-			// Constants
-			page_title: __('Published Items'),
-			publish_button_text: __('Publish More Items'),
-			published_items_message: __('You can publish upto 200 items.'),
-			// TODO: Add empty state action
-			empty_state_message: __('You haven\'t published any items yet.')
+			}
 		};
 	},
 	created() {
diff --git a/erpnext/public/js/hub/vue-plugins.js b/erpnext/public/js/hub/vue-plugins.js
index e18af0c..439c1f2 100644
--- a/erpnext/public/js/hub/vue-plugins.js
+++ b/erpnext/public/js/hub/vue-plugins.js
@@ -62,5 +62,5 @@
 });
 
 Vue.filter('striphtml', function (text) {
-	return strip_html(text);
+	return strip_html(text || '');
 });
\ No newline at end of file