SectionBlockPayloadDelegator.ts 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { Inject, OnInit, Service } from '@tsed/di';
  2. import {
  3. GrowiUriInjector, GrowiUriWithOriginalData, TypedBlock,
  4. } from '~/interfaces/growi-uri-injector';
  5. import { ButtonActionPayloadDelegator } from './block-elements/ButtonActionPayloadDelegator';
  6. import { CheckboxesActionPayloadDelegator } from './block-elements/CheckboxesActionPayloadDelegator';
  7. // see: https://api.slack.com/reference/block-kit/blocks#section
  8. type SectionWithAccessoryElement = TypedBlock & {
  9. accessory: TypedBlock & any,
  10. }
  11. // see: https://api.slack.com/reference/interaction-payloads/block-actions
  12. type BlockActionsPayload = TypedBlock & {
  13. actions: TypedBlock[],
  14. }
  15. @Service()
  16. export class SectionBlockPayloadDelegator implements GrowiUriInjector<any, SectionWithAccessoryElement[], any, BlockActionsPayload>, OnInit {
  17. @Inject()
  18. buttonActionPayloadDelegator: ButtonActionPayloadDelegator;
  19. @Inject()
  20. checkboxesActionPayloadDelegator: CheckboxesActionPayloadDelegator;
  21. private childDelegators: GrowiUriInjector<TypedBlock[], any, TypedBlock, any>[] = [];
  22. $onInit(): void | Promise<any> {
  23. this.childDelegators.push(
  24. this.buttonActionPayloadDelegator,
  25. this.checkboxesActionPayloadDelegator,
  26. );
  27. }
  28. // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
  29. shouldHandleToInject(data: any): data is SectionWithAccessoryElement[] {
  30. const sectionBlocks = data.filter(blockElement => blockElement.type === 'section' && blockElement.accessory != null);
  31. return sectionBlocks.length > 0;
  32. }
  33. inject(data: SectionWithAccessoryElement[], growiUri: string): void {
  34. const sectionBlocks = data.filter(blockElement => blockElement.type === 'section' && blockElement.accessory != null);
  35. // collect elements
  36. // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
  37. const accessories = sectionBlocks.flatMap(sectionBlock => sectionBlock.accessory);
  38. this.childDelegators.forEach((delegator) => {
  39. if (delegator.shouldHandleToInject(accessories)) {
  40. delegator.inject(accessories, growiUri);
  41. }
  42. });
  43. }
  44. // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
  45. shouldHandleToExtract(data: any): data is BlockActionsPayload {
  46. return false;
  47. }
  48. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  49. extract(data: BlockActionsPayload): GrowiUriWithOriginalData {
  50. throw new Error('No need to implement. Use ActionsBlockPayloadDelegator');
  51. }
  52. }