debian-mirror-gitlab/lib/slack/block_kit/app_home_opened.rb
2023-07-09 08:55:56 +05:30

173 lines
4.7 KiB
Ruby

# frozen_string_literal: true
# Builds the BlockKit UI JSON payload to respond to the Slack `app_home_opened` event.
#
# See:
# - https://api.slack.com/block-kit/building
# - https://api.slack.com/events/app_home_opened
module Slack
module BlockKit
class AppHomeOpened
include ActionView::Helpers::AssetUrlHelper
include Gitlab::Routing.url_helpers
def initialize(slack_user_id, slack_workspace_id, slack_gitlab_user_connection, slack_installation)
@slack_user_id = slack_user_id
@slack_workspace_id = slack_workspace_id
@slack_gitlab_user_connection = slack_gitlab_user_connection
@slack_installation = slack_installation
end
def build
{
type: "home",
blocks: [
header,
section_introduction,
section_notifications_heading,
section_notifications,
section_slash_commands_heading,
section_slash_commands,
section_slash_commands_connect,
section_connect_gitlab_account
]
}
end
private
attr_reader :slack_user_id, :slack_workspace_id, :slack_gitlab_user_connection, :slack_installation
def header
{
type: "header",
text: {
type: "plain_text",
text: format(
s_("Slack|%{emoji}Welcome to GitLab for Slack!"),
emoji: '✨ '
),
emoji: true
}
}
end
def section_introduction
section(
format(
s_("Slack|GitLab for Slack now supports channel-based notifications. " \
"Let your team know when new issues are created or new CI/CD jobs are run." \
"%{startMarkup}Learn more%{endMarkup}."),
startMarkup: " <#{help_page_url('integration/slash_commands')}|",
endMarkup: ">"
)
)
end
def section_notifications_heading
section(
format(
s_("Slack|%{asterisk}Channel notifications%{asterisk}"),
asterisk: '*'
)
)
end
def section_notifications
section(
format(
s_("Slack|To start using notifications, " \
"%{startMarkup}enable the GitLab for Slack app integration%{endMarkup} in your project settings."),
startMarkup: "<#{help_page_url('user/project/integrations/gitlab_slack_application',
anchor: 'configuration')}|",
endMarkup: ">"
)
)
end
def section_slash_commands_heading
section(
format(
s_("Slack|%{asterisk}Slash commands%{asterisk}"),
asterisk: '*'
)
)
end
def section_slash_commands
section(
format(
s_("Slack|Control GitLab from Slack with " \
"%{startMarkup}slash commands%{endMarkup}. For a list of available commands, enter %{command}."),
startMarkup: "<#{help_page_url('user/project/integrations/gitlab_slack_application', anchor: 'usage')}|",
endMarkup: ">",
command: "`/gitlab help`"
)
)
end
def section_slash_commands_connect
section(
s_("Slack|To start using slash commands, connect your GitLab account.")
)
end
def section_connect_gitlab_account
if slack_gitlab_user_connection.present?
section_gitlab_account_connected
else
actions_gitlab_account_not_connected
end
end
def section_gitlab_account_connected
user = slack_gitlab_user_connection.user
section(
format(
s_("Slack|%{emoji}Connected to GitLab account %{account}."),
emoji: '✅ ',
account: "<#{Gitlab::UrlBuilder.build(user)}|#{user.to_reference}>"
)
)
end
def actions_gitlab_account_not_connected
account_connection_url = ChatNames::AuthorizeUserService.new(
{
team_id: slack_workspace_id,
user_id: slack_user_id,
team_domain: slack_workspace_id,
user_name: 'Slack'
}
).execute
{
type: "actions",
elements: [
{
type: "button",
text: {
type: "plain_text",
text: s_("Slack|Connect your GitLab account"),
emoji: true
},
style: "primary",
url: account_connection_url
}
]
}
end
def section(text)
{
type: "section",
text: {
type: "mrkdwn",
text: text
}
}
end
end
end
end