diff --git a/app/builders/messages/outgoing/normal_builder.rb b/app/builders/messages/outgoing/normal_builder.rb index 2e08d7804..8517f4504 100644 --- a/app/builders/messages/outgoing/normal_builder.rb +++ b/app/builders/messages/outgoing/normal_builder.rb @@ -3,7 +3,7 @@ class Messages::Outgoing::NormalBuilder def initialize(user, conversation, params) @content = params[:message] - @private = ['1', 'true', 1].include? params[:private] + @private = ['1', 'true', 1, true].include? params[:private] @conversation = conversation @user = user @fb_id = params[:fb_id] diff --git a/app/controllers/api/v1/facebook_indicators_controller.rb b/app/controllers/api/v1/facebook_indicators_controller.rb index 2f4d4b0bc..dccf508c9 100644 --- a/app/controllers/api/v1/facebook_indicators_controller.rb +++ b/app/controllers/api/v1/facebook_indicators_controller.rb @@ -3,22 +3,26 @@ class Api::V1::FacebookIndicatorsController < Api::BaseController around_action :handle_with_exception def mark_seen - Facebook::Messenger::Bot.deliver(payload('mark_seen'), access_token: @access_token) + fb_bot.deliver(payload('mark_seen'), access_token: @access_token) head :ok end def typing_on - Facebook::Messenger::Bot.deliver(payload('typing_on'), access_token: @access_token) + fb_bot.deliver(payload('typing_on'), access_token: @access_token) head :ok end def typing_off - Facebook::Messenger::Bot.deliver(payload('typing_off'), access_token: @access_token) + fb_bot.deliver(payload('typing_off'), access_token: @access_token) head :ok end private + def fb_bot + ::Facebook::Messenger::Bot + end + def handle_with_exception yield rescue Facebook::Messenger::Error => e @@ -27,14 +31,24 @@ class Api::V1::FacebookIndicatorsController < Api::BaseController def payload(action) { - recipient: { id: params[:sender_id] }, + recipient: { id: contact.source_id }, sender_action: action } end + def inbox + @inbox ||= current_account.inboxes.find(permitted_params[:inbox_id]) + end + def set_access_token - # have to cache this - inbox = current_account.inboxes.find(params[:inbox_id]) @access_token = inbox.channel.page_access_token end + + def contact + @contact ||= inbox.contact_inboxes.find_by!(contact_id: permitted_params[:contact_id]) + end + + def permitted_params + params.permit(:inbox_id, :contact_id) + end end diff --git a/app/javascript/dashboard/api/channel/fbChannel.js b/app/javascript/dashboard/api/channel/fbChannel.js new file mode 100644 index 000000000..215900130 --- /dev/null +++ b/app/javascript/dashboard/api/channel/fbChannel.js @@ -0,0 +1,24 @@ +/* global axios */ +import ApiClient from '../ApiClient'; + +class FBChannel extends ApiClient { + constructor() { + super('facebook_indicators'); + } + + markSeen({ inboxId, contactId }) { + return axios.post(`${this.url}/mark_seen`, { + inbox_id: inboxId, + contact_id: contactId, + }); + } + + toggleTyping({ status, inboxId, contactId }) { + return axios.post(`${this.url}/typing_${status}`, { + inbox_id: inboxId, + contact_id: contactId, + }); + } +} + +export default new FBChannel(); diff --git a/app/javascript/dashboard/api/endPoints.js b/app/javascript/dashboard/api/endPoints.js index c9e175aef..fd7499848 100644 --- a/app/javascript/dashboard/api/endPoints.js +++ b/app/javascript/dashboard/api/endPoints.js @@ -13,6 +13,7 @@ const endPoints = { logout: { url: 'auth/sign_out', }, + me: { url: 'api/v1/conversations.json', params: { type: 0, page: 1 }, @@ -23,28 +24,6 @@ const endPoints = { params: { inbox_id: null }, }, - conversations(id) { - return { url: `api/v1/conversations/${id}.json`, params: { before: null } }; - }, - - resolveConversation(id) { - return { url: `api/v1/conversations/${id}/toggle_status.json` }; - }, - - sendMessage(conversationId, message) { - return { - url: `api/v1/conversations/${conversationId}/messages.json`, - params: { message }, - }; - }, - - addPrivateNote(conversationId, message) { - return { - url: `api/v1/conversations/${conversationId}/messages.json?`, - params: { message, private: 'true' }, - }; - }, - fetchLabels: { url: 'api/v1/labels.json', }, @@ -86,60 +65,6 @@ const endPoints = { params: { omniauth_token: '' }, }, - assignAgent(conversationId, AgentId) { - return { - url: `/api/v1/conversations/${conversationId}/assignments?assignee_id=${AgentId}`, - }; - }, - - fbMarkSeen: { - url: 'api/v1/facebook_indicators/mark_seen', - }, - - fbTyping(status) { - return { - url: `api/v1/facebook_indicators/typing_${status}`, - }; - }, - - markMessageRead(id) { - return { - url: `api/v1/conversations/${id}/update_last_seen`, - params: { - agent_last_seen_at: null, - }, - }; - }, - - // Canned Response [GET, POST, PUT, DELETE] - cannedResponse: { - get() { - return { - url: 'api/v1/canned_responses', - }; - }, - getOne({ id }) { - return { - url: `api/v1/canned_responses/${id}`, - }; - }, - post() { - return { - url: 'api/v1/canned_responses', - }; - }, - put(id) { - return { - url: `api/v1/canned_responses/${id}`, - }; - }, - delete(id) { - return { - url: `api/v1/canned_responses/${id}`, - }; - }, - }, - reports: { account(metric, from, to) { return { diff --git a/app/javascript/dashboard/api/inbox/conversation.js b/app/javascript/dashboard/api/inbox/conversation.js index 92bfc987f..c43f41c70 100644 --- a/app/javascript/dashboard/api/inbox/conversation.js +++ b/app/javascript/dashboard/api/inbox/conversation.js @@ -1,104 +1,37 @@ -/* eslint no-console: 0 */ /* global axios */ -/* eslint no-undef: "error" */ -/* eslint no-unused-expressions: ["error", { "allowShortCircuit": true }] */ -import endPoints from '../endPoints'; +import ApiClient from '../ApiClient'; -export default { - fetchConversation(id) { - const urlData = endPoints('conversations')(id); - const fetchPromise = new Promise((resolve, reject) => { - axios - .get(urlData.url) - .then(response => { - resolve(response); - }) - .catch(error => { - reject(Error(error)); - }); - }); - return fetchPromise; - }, +class ConversationApi extends ApiClient { + constructor() { + super('conversations'); + } - toggleStatus(id) { - const urlData = endPoints('resolveConversation')(id); - const fetchPromise = new Promise((resolve, reject) => { - axios - .post(urlData.url) - .then(response => { - resolve(response); - }) - .catch(error => { - reject(Error(error)); - }); + get({ inboxId, convStatus, assigneeStatus }) { + return axios.get(this.url, { + params: { + inbox_id: inboxId, + conversation_status_id: convStatus, + assignee_type_id: assigneeStatus, + }, }); - return fetchPromise; - }, + } - assignAgent([id, agentId]) { - const urlData = endPoints('assignAgent')(id, agentId); - const fetchPromise = new Promise((resolve, reject) => { - axios - .post(urlData.url) - .then(response => { - resolve(response); - }) - .catch(error => { - reject(Error(error)); - }); - }); - return fetchPromise; - }, + toggleStatus(conversationId) { + return axios.post(`${this.url}/${conversationId}/toggle_status`, {}); + } - markSeen({ inboxId, senderId }) { - const urlData = endPoints('fbMarkSeen'); - const fetchPromise = new Promise((resolve, reject) => { - axios - .post(urlData.url, { - inbox_id: inboxId, - sender_id: senderId, - }) - .then(response => { - resolve(response); - }) - .catch(error => { - reject(Error(error)); - }); - }); - return fetchPromise; - }, - - fbTyping({ flag, inboxId, senderId }) { - const urlData = endPoints('fbTyping')(flag); - const fetchPromise = new Promise((resolve, reject) => { - axios - .post(urlData.url, { - inbox_id: inboxId, - sender_id: senderId, - }) - .then(response => { - resolve(response); - }) - .catch(error => { - reject(Error(error)); - }); - }); - return fetchPromise; - }, + assignAgent({ conversationId, agentId }) { + axios.post( + `${this.url}/${conversationId}/assignments?assignee_id=${agentId}`, + {} + ); + } markMessageRead({ id, lastSeen }) { - const urlData = endPoints('markMessageRead')(id); - urlData.params.agent_last_seen_at = lastSeen; - const fetchPromise = new Promise((resolve, reject) => { - axios - .post(urlData.url, urlData.params) - .then(response => { - resolve(response); - }) - .catch(error => { - reject(Error(error)); - }); + return axios.post(`${this.url}/${id}/update_last_seen`, { + agent_last_seen_at: lastSeen, }); - return fetchPromise; - }, -}; + } +} + +export default new ConversationApi(); diff --git a/app/javascript/dashboard/api/inbox/index.js b/app/javascript/dashboard/api/inbox/index.js deleted file mode 100644 index 228fa7f79..000000000 --- a/app/javascript/dashboard/api/inbox/index.js +++ /dev/null @@ -1,32 +0,0 @@ -/* eslint no-console: 0 */ -/* global axios */ -/* eslint no-undef: "error" */ -/* eslint no-unused-expressions: ["error", { "allowShortCircuit": true }] */ -import endPoints from '../endPoints'; - -export default { - fetchAllConversations(params, callback) { - const urlData = endPoints('getInbox'); - - if (params.inbox !== 0) { - urlData.params.inbox_id = params.inbox; - } else { - urlData.params.inbox_id = null; - } - urlData.params = { - ...urlData.params, - conversation_status_id: params.convStatus, - assignee_type_id: params.assigneeStatus, - }; - axios - .get(urlData.url, { - params: urlData.params, - }) - .then(response => { - callback(response); - }) - .catch(error => { - console.log(error); - }); - }, -}; diff --git a/app/javascript/dashboard/api/inbox/message.js b/app/javascript/dashboard/api/inbox/message.js index 1c6eebae6..367e3e00c 100644 --- a/app/javascript/dashboard/api/inbox/message.js +++ b/app/javascript/dashboard/api/inbox/message.js @@ -1,55 +1,24 @@ /* eslint no-console: 0 */ /* global axios */ -/* eslint no-undef: "error" */ -/* eslint no-unused-expressions: ["error", { "allowShortCircuit": true }] */ -import endPoints from '../endPoints'; +import ApiClient from '../ApiClient'; -export default { - sendMessage([conversationId, message]) { - const urlData = endPoints('sendMessage')(conversationId, message); - const fetchPromise = new Promise((resolve, reject) => { - axios - .post(urlData.url, urlData.params) - .then(response => { - resolve(response); - }) - .catch(error => { - reject(Error(error)); - }); - }); - return fetchPromise; - }, +class MessageApi extends ApiClient { + constructor() { + super('conversations'); + } - addPrivateNote([conversationId, message]) { - const urlData = endPoints('addPrivateNote')(conversationId, message); - const fetchPromise = new Promise((resolve, reject) => { - axios - .post(urlData.url, urlData.params) - .then(response => { - resolve(response); - }) - .catch(error => { - reject(Error(error)); - }); + create({ conversationId, message, private: isPrivate }) { + return axios.post(`${this.url}/${conversationId}/messages`, { + message, + private: isPrivate, }); - return fetchPromise; - }, + } - fetchPreviousMessages({ id, before }) { - const urlData = endPoints('conversations')(id); - urlData.params.before = before; - const fetchPromise = new Promise((resolve, reject) => { - axios - .get(urlData.url, { - params: urlData.params, - }) - .then(response => { - resolve(response); - }) - .catch(error => { - reject(Error(error)); - }); + getPreviousMessages({ conversationId, before }) { + return axios.get(`${this.url}/${conversationId}`, { + params: { before }, }); - return fetchPromise; - }, -}; + } +} + +export default new MessageApi(); diff --git a/app/javascript/dashboard/components/widgets/conversation/ConversationBox.vue b/app/javascript/dashboard/components/widgets/conversation/ConversationBox.vue index aa8847e6b..682c3b4f0 100644 --- a/app/javascript/dashboard/components/widgets/conversation/ConversationBox.vue +++ b/app/javascript/dashboard/components/widgets/conversation/ConversationBox.vue @@ -216,7 +216,7 @@ export default { this.isLoadingPrevious = true; this.$store .dispatch('fetchPreviousMessages', { - id: this.currentChat.id, + conversationId: this.currentChat.id, before: this.getMessages.messages[0].id, }) .then(() => { diff --git a/app/javascript/dashboard/components/widgets/conversation/ConversationHeader.vue b/app/javascript/dashboard/components/widgets/conversation/ConversationHeader.vue index cddaf02e7..cdeb5b6be 100644 --- a/app/javascript/dashboard/components/widgets/conversation/ConversationHeader.vue +++ b/app/javascript/dashboard/components/widgets/conversation/ConversationHeader.vue @@ -6,7 +6,9 @@ size="40px" :badge="chat.meta.sender.channel" /> -