note.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import loggerFactory from '~/utils/logger';
  2. const {
  3. markdownSectionBlock, inputSectionBlock, inputBlock,
  4. } = require('@growi/slack');
  5. const logger = loggerFactory('growi:service:SlackCommandHandler:note');
  6. module.exports = (crowi) => {
  7. const CreatePageService = require('./create-page-service');
  8. const createPageService = new CreatePageService(crowi);
  9. const BaseSlackCommandHandler = require('./slack-command-handler');
  10. const handler = new BaseSlackCommandHandler();
  11. const conversationsSelectElement = {
  12. action_id: 'conversation',
  13. type: 'conversations_select',
  14. response_url_enabled: true,
  15. default_to_current_conversation: true,
  16. };
  17. handler.handleCommand = async(growiCommand, client, body, respondUtil) => {
  18. await client.views.open({
  19. trigger_id: body.trigger_id,
  20. view: {
  21. type: 'modal',
  22. callback_id: 'note:createPage',
  23. title: {
  24. type: 'plain_text',
  25. text: 'Take a note',
  26. },
  27. submit: {
  28. type: 'plain_text',
  29. text: 'Submit',
  30. },
  31. close: {
  32. type: 'plain_text',
  33. text: 'Cancel',
  34. },
  35. blocks: [
  36. markdownSectionBlock('Take a note on GROWI'),
  37. inputBlock(conversationsSelectElement, 'conversation', 'Channel name to display in the page to be created'),
  38. inputSectionBlock('path', 'Page path', 'path_input', false, '/path'),
  39. inputSectionBlock('contents', 'Contents', 'contents_input', true, 'Input with Markdown...'),
  40. ],
  41. private_metadata: JSON.stringify({ channelId: body.channel_id, channelName: body.channel_name }),
  42. },
  43. });
  44. };
  45. handler.handleInteractions = async function(client, interactionPayload, interactionPayloadAccessor, handlerMethodName, respondUtil) {
  46. await this[handlerMethodName](client, interactionPayload, interactionPayloadAccessor, respondUtil);
  47. };
  48. handler.createPage = async function(client, interactionPayload, interactionPayloadAccessor, respondUtil) {
  49. const path = interactionPayloadAccessor.getStateValues()?.path.path_input.value;
  50. const privateMetadata = interactionPayloadAccessor.getViewPrivateMetaData();
  51. if (privateMetadata == null) {
  52. await respondUtil.respond({
  53. text: 'Error occurred',
  54. blocks: [
  55. markdownSectionBlock('Failed to create a page.'),
  56. ],
  57. });
  58. return;
  59. }
  60. const contentsBody = interactionPayloadAccessor.getStateValues()?.contents.contents_input.value;
  61. await createPageService.createPageInGrowi(interactionPayloadAccessor, path, contentsBody, respondUtil);
  62. };
  63. return handler;
  64. };