feat: Add message support for input_select type in LINE (#11628)
# Pull Request Template ## Description Added input_select message type support for LINE ## Type of change Please delete options that are not relevant. - [ ] Bug fix (non-breaking change which fixes an issue) - [X] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality not to work as expected) - [ ] This change requires a documentation update ## How Has This Been Tested? add testcase. and test manually by myself ## Checklist: - [X] My code follows the style guidelines of this project - [X] I have performed a self-review of my code - [ ] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [ ] I have added tests that prove my fix is effective or that my feature works - [ ] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
This commit is contained in:
@@ -4,9 +4,11 @@ import BaseBubble from './Base.vue';
|
|||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import { CONTENT_TYPES } from '../constants.js';
|
import { CONTENT_TYPES } from '../constants.js';
|
||||||
import { useMessageContext } from '../provider.js';
|
import { useMessageContext } from '../provider.js';
|
||||||
|
import { useInbox } from 'dashboard/composables/useInbox';
|
||||||
|
|
||||||
const { content, contentAttributes, contentType } = useMessageContext();
|
const { content, contentAttributes, contentType } = useMessageContext();
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
const { isAWebWidgetInbox } = useInbox();
|
||||||
|
|
||||||
const formValues = computed(() => {
|
const formValues = computed(() => {
|
||||||
if (contentType.value === CONTENT_TYPES.FORM) {
|
if (contentType.value === CONTENT_TYPES.FORM) {
|
||||||
@@ -56,7 +58,7 @@ const formValues = computed(() => {
|
|||||||
<dd>{{ item.title }}</dd>
|
<dd>{{ item.title }}</dd>
|
||||||
</template>
|
</template>
|
||||||
</dl>
|
</dl>
|
||||||
<div v-else class="my-2 font-medium">
|
<div v-else-if="isAWebWidgetInbox" class="my-2 font-medium">
|
||||||
{{ t('CONVERSATION.NO_RESPONSE') }}
|
{{ t('CONVERSATION.NO_RESPONSE') }}
|
||||||
</div>
|
</div>
|
||||||
</BaseBubble>
|
</BaseBubble>
|
||||||
|
|||||||
@@ -22,6 +22,14 @@ class Line::SendOnLineService < Base::SendOnChannelService
|
|||||||
end
|
end
|
||||||
|
|
||||||
def build_payload
|
def build_payload
|
||||||
|
if message.content_type == 'input_select' && message.content_attributes['items'].any?
|
||||||
|
build_input_select_payload
|
||||||
|
else
|
||||||
|
build_text_payload
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def build_text_payload
|
||||||
if message.content && message.attachments.any?
|
if message.content && message.attachments.any?
|
||||||
[text_message, *attachments]
|
[text_message, *attachments]
|
||||||
elsif message.content.nil? && message.attachments.any?
|
elsif message.content.nil? && message.attachments.any?
|
||||||
@@ -52,6 +60,43 @@ class Line::SendOnLineService < Base::SendOnChannelService
|
|||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# https://developers.line.biz/en/reference/messaging-api/#flex-message
|
||||||
|
def build_input_select_payload
|
||||||
|
{
|
||||||
|
type: 'flex',
|
||||||
|
altText: message.content,
|
||||||
|
contents: {
|
||||||
|
type: 'bubble',
|
||||||
|
body: {
|
||||||
|
type: 'box',
|
||||||
|
layout: 'vertical',
|
||||||
|
contents: [
|
||||||
|
{
|
||||||
|
type: 'text',
|
||||||
|
text: message.content
|
||||||
|
},
|
||||||
|
*input_select_to_button
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def input_select_to_button
|
||||||
|
message.content_attributes['items'].map do |item|
|
||||||
|
{
|
||||||
|
type: 'button',
|
||||||
|
style: 'link',
|
||||||
|
height: 'sm',
|
||||||
|
action: {
|
||||||
|
type: 'message',
|
||||||
|
label: item['title'],
|
||||||
|
text: item['value']
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
# https://developers.line.biz/en/reference/messaging-api/#error-responses
|
# https://developers.line.biz/en/reference/messaging-api/#error-responses
|
||||||
def external_error(error)
|
def external_error(error)
|
||||||
# Message containing information about the error. See https://developers.line.biz/en/reference/messaging-api/#error-messages
|
# Message containing information about the error. See https://developers.line.biz/en/reference/messaging-api/#error-messages
|
||||||
|
|||||||
@@ -93,6 +93,69 @@ describe Line::SendOnLineService do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'with message input_select' do
|
||||||
|
let(:success_response) do
|
||||||
|
{
|
||||||
|
'message' => 'ok'
|
||||||
|
}.to_json
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:expect_message) do
|
||||||
|
{
|
||||||
|
type: 'flex',
|
||||||
|
altText: 'test',
|
||||||
|
contents: {
|
||||||
|
type: 'bubble',
|
||||||
|
body: {
|
||||||
|
type: 'box',
|
||||||
|
layout: 'vertical',
|
||||||
|
contents: [
|
||||||
|
{
|
||||||
|
type: 'text',
|
||||||
|
text: 'test'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'button',
|
||||||
|
style: 'link',
|
||||||
|
height: 'sm',
|
||||||
|
action: {
|
||||||
|
type: 'message',
|
||||||
|
label: 'text 1',
|
||||||
|
text: 'value 1'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: 'button',
|
||||||
|
style: 'link',
|
||||||
|
height: 'sm',
|
||||||
|
action: {
|
||||||
|
type: 'message',
|
||||||
|
label: 'text 2',
|
||||||
|
text: 'value 2'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sends the message with input_select' do
|
||||||
|
message = create(
|
||||||
|
:message, message_type: :outgoing, content: 'test', content_type: 'input_select',
|
||||||
|
content_attributes: { 'items' => [{ 'title' => 'text 1', 'value' => 'value 1' }, { 'title' => 'text 2', 'value' => 'value 2' }] },
|
||||||
|
conversation: create(:conversation, inbox: line_channel.inbox)
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(line_client).to receive(:push_message).with(
|
||||||
|
message.conversation.contact_inbox.source_id,
|
||||||
|
expect_message
|
||||||
|
).and_return(OpenStruct.new(code: '200', body: success_response))
|
||||||
|
|
||||||
|
described_class.new(message: message).perform
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
context 'with message attachments' do
|
context 'with message attachments' do
|
||||||
it 'sends the message with text and attachments' do
|
it 'sends the message with text and attachments' do
|
||||||
attachment = message.attachments.new(account_id: message.account_id, file_type: :image)
|
attachment = message.attachments.new(account_id: message.account_id, file_type: :image)
|
||||||
|
|||||||
Reference in New Issue
Block a user