Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

slack-block-builder

Package Overview
Dependencies
Maintainers
2
Versions
46
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

slack-block-builder - npm Package Compare versions

Comparing version 2.2.0-beta.1 to 2.2.0-beta.2

dist/components/accordion-ui-component.d.ts

65

dist/components/index.d.ts

@@ -1,11 +0,64 @@

import { PaginatorUIComponent, PaginatorUIComponentParams } from './paginator';
import { AccordionUIComponent, AccordionUIComponentParams } from './accordion';
import { PaginatorUIComponent, PaginatorPageCountTextFn, PaginatorActionIdFn, PaginatorBuilderFn } from './paginator-ui-component';
import { AccordionUIComponent, AccordionTitleTextFn, AccordionActionIdFn, AccordionBuilderFn } from './accordion-ui-component';
import { PaginatorStateManagerParams, AccordionStateManagerParams } from '../lib';
export type { PaginatorUIComponent };
export type { AccordionUIComponent };
export declare type PaginatorParams<T> = PaginatorStateManagerParams & Omit<PaginatorUIComponentParams<T>, 'paginator'>;
export type { PaginatorUIComponent, AccordionUIComponent };
interface PaginatorBaseParams<T> {
items: T[];
nextButtonText?: string;
previousButtonText?: string;
pageCountText?: PaginatorPageCountTextFn;
actionId: PaginatorActionIdFn;
blocksForEach: PaginatorBuilderFn<T>;
}
export declare type PaginatorParams<T> = PaginatorBaseParams<T> & PaginatorStateManagerParams;
/**
* @param {Object} [params] Parameters passed to the constructor.
* @param {string} [params.items] An array of items to be displayed in the paginated content.
* @param {int} [params.page] The number of the page to display.
* @param {int} [params.perPage] The number of items to display on a page.
* @param {int} [params.totalItems] The total number of items in the data set across all pages.
* @param {PaginatorActionIdFn} [params.actionId] A function that receives pagination data and returns a string to set as the action IDs of the navigation buttons.
* @param {PaginatorBuilderFn} [params.blocksForEach] A function that receives an object with a single item and returns the blocks to create for that item.
* @param {string} [params.nextButtonText] The text to display on the button that moves forward in the pagination.
* @param {string} [params.previousButtonText] The text to display on the button that moves backward in the pagination.
* @param {PaginatorPageCountTextFn} [params.pageCountText] A function to create a custom page count in the UI.
*
* {@link https://www.blockbuilder.dev/#/components/paginator|View in Block Builder Documentation}
*/
export declare function Paginator<T>(params: PaginatorParams<T>): PaginatorUIComponent<T>;
export declare type EasyPaginatorParams<T> = Omit<PaginatorParams<T>, 'totalItems'>;
/**
* @param {Object} [params] Parameters passed to the constructor.
* @param {string} [params.items] An array of items to be displayed in the paginated content.
* @param {int} [params.page] The number of the page to display.
* @param {int} [params.perPage] The number of items to display on a page.
* @param {PaginatorActionIdFn} [params.actionId] A function that receives pagination data and returns a string to set as the action IDs of the navigation buttons.
* @param {PaginatorBuilderFn} [params.blocksForEach] A function that receives an object with a single item and returns the blocks to create for that item.
* @param {string} [params.nextButtonText] The text to display on the button that moves forward in the pagination.
* @param {string} [params.previousButtonText] The text to display on the button that moves backward in the pagination.
* @param {PaginatorPageCountTextFn} [params.pageCountText] A function to create a custom page count in the UI.
*
* {@link https://www.blockbuilder.dev/#/components/easy-paginator|View in Block Builder Documentation}
*/
export declare function EasyPaginator<T>(params: EasyPaginatorParams<T>): PaginatorUIComponent<T>;
export declare type AccordionParams<T> = Omit<AccordionUIComponentParams<T>, 'stateManager'> & AccordionStateManagerParams;
interface AccordionBaseParams<T> {
items: T[];
expandButtonText?: string;
collapseButtonText?: string;
titleText: AccordionTitleTextFn<T>;
actionId: AccordionActionIdFn;
blocksForExpanded: AccordionBuilderFn<T>;
}
export declare type AccordionParams<T> = AccordionBaseParams<T> & AccordionStateManagerParams;
/**
* @param {Object} [params] Parameters passed to the constructor.
* @param {string} [params.items] An array of items to be displayed in the expandable/collapsable content.
* @param {AccordionTitleTextFn} [params.titleText] A function that receives an object with a single item and returns a string to be displayed next to the expand/collapse button.
* @param {AccordionActionIdFn} [params.actionId] A function that receives the accordion state data and returns a string to set as the action IDs of the expand/collapse buttons.
* @param {AccordionBuilderFn} [params.blocksForExpanded] A function that receives an object with a single item and returns the blocks to create for that item.
* @param {string} [params.expandButtonText] The text to display on the button that expands an item in the UI.
* @param {string} [params.collapseButtonText] The text to display on the button that collapses an item in the UI.
*
* {@link https://www.blockbuilder.dev/#/components/accordion|View in Block Builder Documentation}
*/
export declare function Accordion<T>(params: AccordionParams<T>): AccordionUIComponent<T>;

@@ -12,0 +65,0 @@ declare const components: {

70

dist/components/index.js
"use strict";
/* eslint-disable max-len */
Object.defineProperty(exports, "__esModule", { value: true });
exports.Components = exports.Accordion = exports.EasyPaginator = exports.Paginator = void 0;
const paginator_1 = require("./paginator");
const accordion_1 = require("./accordion");
const paginator_ui_component_1 = require("./paginator-ui-component");
const accordion_ui_component_1 = require("./accordion-ui-component");
const lib_1 = require("../lib");
/**
* @param {Object} [params] Parameters passed to the constructor.
* @param {string} [params.items] An array of items to be displayed in the paginated content.
* @param {int} [params.page] The number of the page to display.
* @param {int} [params.perPage] The number of items to display on a page.
* @param {int} [params.totalItems] The total number of items in the data set across all pages.
* @param {PaginatorActionIdFn} [params.actionId] A function that receives pagination data and returns a string to set as the action IDs of the navigation buttons.
* @param {PaginatorBuilderFn} [params.blocksForEach] A function that receives an object with a single item and returns the blocks to create for that item.
* @param {string} [params.nextButtonText] The text to display on the button that moves forward in the pagination.
* @param {string} [params.previousButtonText] The text to display on the button that moves backward in the pagination.
* @param {PaginatorPageCountTextFn} [params.pageCountText] A function to create a custom page count in the UI.
*
* {@link https://www.blockbuilder.dev/#/components/paginator|View in Block Builder Documentation}
*/
function Paginator(params) {
const { page, perPage, totalItems } = params;
const paginationCalculator = new lib_1.PaginatorStateManager({ page, perPage, totalItems });
return new paginator_1.PaginatorUIComponent({
paginator: paginationCalculator,
const stateManager = new lib_1.PaginatorStateManager({ page, perPage, totalItems });
return new paginator_ui_component_1.PaginatorUIComponent({
items: params.items,
paginator: stateManager,
nextButtonText: params.nextButtonText || null,
previousButtonText: params.previousButtonText || null,
pageCountText: params.pageCountText || null,
actionId: params.actionId,
pageCountTextFunction: params.pageCountText || null,
actionIdFunction: params.actionId,
builderFunction: params.blocksForEach,
});
}
exports.Paginator = Paginator;
/**
* @param {Object} [params] Parameters passed to the constructor.
* @param {string} [params.items] An array of items to be displayed in the paginated content.
* @param {int} [params.page] The number of the page to display.
* @param {int} [params.perPage] The number of items to display on a page.
* @param {PaginatorActionIdFn} [params.actionId] A function that receives pagination data and returns a string to set as the action IDs of the navigation buttons.
* @param {PaginatorBuilderFn} [params.blocksForEach] A function that receives an object with a single item and returns the blocks to create for that item.
* @param {string} [params.nextButtonText] The text to display on the button that moves forward in the pagination.
* @param {string} [params.previousButtonText] The text to display on the button that moves backward in the pagination.
* @param {PaginatorPageCountTextFn} [params.pageCountText] A function to create a custom page count in the UI.
*
* {@link https://www.blockbuilder.dev/#/components/easy-paginator|View in Block Builder Documentation}
*/
function EasyPaginator(params) {

@@ -25,3 +54,3 @@ const { page, perPage, items } = params;

const extractedItems = paginationCalculator.extractItems(items);
return new paginator_1.PaginatorUIComponent({
return new paginator_ui_component_1.PaginatorUIComponent({
paginator: paginationCalculator,

@@ -31,17 +60,30 @@ items: extractedItems,

previousButtonText: params.previousButtonText || null,
pageCountText: params.pageCountText || null,
actionId: params.actionId,
pageCountTextFunction: params.pageCountText || null,
actionIdFunction: params.actionId,
builderFunction: params.blocksForEach,
});
}
exports.EasyPaginator = EasyPaginator;
/**
* @param {Object} [params] Parameters passed to the constructor.
* @param {string} [params.items] An array of items to be displayed in the expandable/collapsable content.
* @param {AccordionTitleTextFn} [params.titleText] A function that receives an object with a single item and returns a string to be displayed next to the expand/collapse button.
* @param {AccordionActionIdFn} [params.actionId] A function that receives the accordion state data and returns a string to set as the action IDs of the expand/collapse buttons.
* @param {AccordionBuilderFn} [params.blocksForExpanded] A function that receives an object with a single item and returns the blocks to create for that item.
* @param {string} [params.expandButtonText] The text to display on the button that expands an item in the UI.
* @param {string} [params.collapseButtonText] The text to display on the button that collapses an item in the UI.
*
* {@link https://www.blockbuilder.dev/#/components/accordion|View in Block Builder Documentation}
*/
function Accordion(params) {
const { items, expandedItems, collapseOnExpand } = params;
const stateManager = new lib_1.AccordionStateManager({ expandedItems, collapseOnExpand });
return new accordion_1.AccordionUIComponent({
return new accordion_ui_component_1.AccordionUIComponent({
items,
stateManager,
paginator: stateManager,
expandButtonText: params.expandButtonText || null,
collapseButtonText: params.collapseButtonText || null,
titleText: params.titleText,
actionId: params.actionId,
titleTextFunction: params.titleText,
actionIdFunction: params.actionId,
builderFunction: params.blocksForExpanded,
});

@@ -48,0 +90,0 @@ }

@@ -25,4 +25,3 @@ export interface PaginatorStateManagerParams {

getPreviousPageState(): PaginatorState;
checkStateIsMoveForward(state: PaginatorState): boolean;
extractItems<T>(items: T[]): T[];
}

@@ -58,5 +58,2 @@ "use strict";

}
checkStateIsMoveForward(state) {
return this.offset < state.offset;
}
extractItems(items) {

@@ -63,0 +60,0 @@ const beginning = this.offset;

{
"name": "slack-block-builder",
"version": "2.2.0-beta.1",
"version": "2.2.0-beta.2",
"description": "Maintainable code for interactive Slack messages, modals, home tabs, and workflow steps. A must-have for the Slack Block Kit framework.",

@@ -54,3 +54,3 @@ "author": {

"docs:generate": "node docs-generator-dist/index.js",
"docs:local": "docsify serve docs-generator --port 3000",
"docs:local": "docsify serve docs --port 3000",
"tests:lint": "eslint 'tests/**/*.ts' --fix",

@@ -57,0 +57,0 @@ "tests:coverage": "codecov",

@@ -24,3 +24,3 @@ <p align="center">

![An example of using Block Builder](docs/resources/images/hero-image.png)
![An example of using Block Builder](docs/resources/images/block-builder-hero-image.png)

@@ -33,4 +33,2 @@ ***

> :tada: **Block Builder Version 2.0 is here! Learn about the new features and how to install it [here](docs/announcements/version-2.md).**
**Block Builder** helps you keep your Slack app code for UI maintainable, testable, and reusable. It has a declarative, chainable syntax inspired by [SwiftUI](https://developer.apple.com/documentation/swiftui) and is built for better UI architecture.

@@ -41,2 +39,3 @@

* Declarative [SwiftUI](https://developer.apple.com/xcode/swiftui/) inspired syntax.
* Commonly-used UI components, such as a `Paginator` and `Accordion`.
* The ability to build more complex flows using loops and conditionals.

@@ -51,11 +50,6 @@ * A `printPreviewURL()` method that outputs a link to preview your UI on Slack's [Block Kit Builder website](https://app.slack.com/block-kit-builder) for easier prototyping.

### :rocket: &nbsp; Coming Soon
* `Paginator` component.
* `Accordion` component.
### :gift: &nbsp; Benefits
* Write three times less code.
* Build more sophistocated, elegant flows.
* Build more sophisticated, elegant flows.
* Design better UI architecture for your Slack apps.

@@ -65,8 +59,7 @@ * Focus more on code in your IDE than on studying the [Slack API docs](https://api.slack.com/).

### :phone: &nbsp; Let's Talk?
### :busts_in_silhouette: &nbsp; Join The Community
Feedback – love it! Aside from GitHub Issues, there are Slack channels available in popular bot communities to discuss **Block Builder** – we'll see you there! :raised_hands:
Feedback – love it! Aside from GitHub Issues, there's a Slack channel available in the Slack Community workspace to discuss **Block Builder** – we'll see you there! :raised_hands:
* **Slack Community** – [\#block-builder](https://slackcommunity.com)
* **Bot Developer Hangout** – [\#block-builder](https://community.botkit.ai)

@@ -120,3 +113,3 @@ ### :floppy_disk: &nbsp; Installation

### Group Explanations
### Object Breakdown

@@ -177,4 +170,4 @@ `Surfaces` – Contains functions for creating modals, messages, home tabs, and workflow steps.

const myMessage = ({ channel, dangerLevel }) => {
return Message()
export default ({ channel, dangerLevel }) =>
Message()
.channel(channel)

@@ -200,3 +193,2 @@ .text('Alas, my friend.')

.buildToJSON();
};
```

@@ -209,4 +201,4 @@

const myShorterMessage = ({ channel, dangerLevel }) => {
return Message({ channel, text: 'Alas, my friend.' })
export default ({ channel, dangerLevel }) =>
Message({ channel, text: 'Alas, my friend.' })
.blocks(

@@ -224,3 +216,2 @@ Blocks.Section({ text: 'One does not simply walk into Slack and click a button.' }),

.buildToJSON();
};
```

@@ -243,4 +234,4 @@

const myShorterModal = ({ menuOptions, selected }) => {
return Modal({ title: 'PizzaMate', submit: 'Get Fed' })
export default ({ menuOptions, selected }) =>
Modal({ title: 'PizzaMate', submit: 'Get Fed' })
.blocks(

@@ -265,3 +256,2 @@ Blocks.Section({ text: 'Hey there, colleague!' }),

.buildToJSON();
};
```

@@ -275,2 +265,86 @@

### Paginator Component
**Block Builder** provides a `Paginator` component that assists in producing paginated UI. It allows you to dictate the UI to build for each items passed in and provides to the `actionId` all of the data (`page`, `perPage`, `totalPages`, `offset`, `totalItems` ) you need to produce the right page when a user clicks the Next or Previous buttons.
It supports optional customizations, such as:
`nextButtonText` – Used to pass in custom text for the Next button, but has a default.
`previousButtonText` – Used to pass in custom text for the Next button, but has a default.
`pageCountText` – Used to pass in custom text for the page count, accepts a function and passes the function an object with `page` and `totalPages` properties.
```javascript
import { Modal, Blocks, Elements, Paginator } from 'slack-block-builder';
export default ({ tasks, totalTasks, page, perPage }) => Modal({ title: 'Open Tasks' })
.blocks(
Blocks.Section({ text: 'Hi! :wave: And welcome to the FAQ section! Take a look around and if you don\'t find what you need, feel free to open an issue on GitHub.' }),
Blocks.Section({ text: `You currently have *${totalTasks} open task(s)*:` }),
Paginator({
perPage,
items: tasks,
totalItems: totalTasks,
page: page || 1,
actionId: ({ page, offset }) => JSON.stringify({ action: 'render-tasks', page, offset }),
blocksForEach: ({ item }) => [
Blocks.Divider(),
Blocks.Section({ text: `*${item.title}*` })
.accessory(
Elements.Button({ text: 'View Details' })
.actionId('view-details')
.value(item.id.toString())),
Blocks.Section({ text: `*Due Date:* ${getDate(item.dueDate)}` }),
],
}).getBlocks())
.close('Done')
.buildToJSON();
```
The code above renders the modal below. And be sure to check out the full documentation on the **Block Builder** doc site for more information.
![An example of using Block Builder for Modals](docs/resources/images/paginator-modal-example.png)
[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder/#%7B%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Open%20Tasks%22%7D,%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hello!%20:wave::skin-tone-4:%20%20Below%20you%20can%20find%20all%20of%20your%20open%20tasks.%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22You%20currently%20have%20*58%20open%20task(s)*:%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Set%20Up%20Webhook%20Monitoring*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22View%20Details%22%7D,%22action_id%22:%22view-details%22,%22value%22:%225%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Due%20Date:*%20%3C!date%5E1633392000%5E%7Bdate%7D%7C2021-10-05%3E%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Refactor%20Payment%20Service*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22View%20Details%22%7D,%22action_id%22:%22view-details%22,%22value%22:%223%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Due%20Date:*%20%3C!date%5E1635292800%5E%7Bdate%7D%7C2021-10-27%3E%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Finalize%20JumboCode%20Documentation*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22View%20Details%22%7D,%22action_id%22:%22view-details%22,%22value%22:%224%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Due%20Date:*%20%3C!date%5E1635465600%5E%7Bdate%7D%7C2021-10-29%3E%22%7D,%22type%22:%22section%22%7D,%7B%22elements%22:%5B%7B%22type%22:%22mrkdwn%22,%22text%22:%22Page%208%20of%2020%22%7D%5D,%22type%22:%22context%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22elements%22:%5B%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Previous%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-tasks%5C%22,%5C%22page%5C%22:7,%5C%22offset%5C%22:18%7D%22,%22type%22:%22button%22%7D,%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Next%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-tasks%5C%22,%5C%22page%5C%22:9,%5C%22offset%5C%22:24%7D%22,%22type%22:%22button%22%7D%5D,%22type%22:%22actions%22%7D%5D,%22close%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Done%22%7D,%22type%22:%22modal%22%7D)
### Accordion Component
Using the `Accordion` component, you can easily create a customizable accordion for your Slack app. It not only assists in building a suitable UI, but also calculates the next state and gives you access to it in the `actionId` of the buttons in the accordion, so that you can pass that back to your app's backend and use it to render the next state.
It supports optional customizations, such as:
`collapseOnExpand` – Dictates whether or not multiple items can be expanded at once. When set to true, only one item will be expanded at any given time.
`expandButtonText` – Used to pass in custom text for the button that expands an item, but has a default.
`collapseButtonText` – Used to pass in custom text for the button that collapses an expanded item, but has a default.
```javascript
import { Modal, Blocks, Accordion } from 'slack-block-builder';
export default ({ faqs, expandedItems }) => Modal({ title: 'FAQ' })
.blocks(
Blocks.Section({ text: 'Hi! :wave: And welcome to the FAQ section! Take a look around and if you don\'t find what you need, feel free to open an issue on GitHub.'}),
Blocks.Divider(),
Accordion({
items: faqs,
expandedItems: expandedItems || [], // In this case, the value is [1]
collapseOnExpand: true,
titleText: ({ item }) => `*${item.question}*`,
actionId: ({ expandedItems }) => JSON.stringify({ action: 'render-faqs', expandedItems }),
blocksForExpanded: ({ item }) => [
Blocks.Section({ text: `${item.answer}` }),
],
}).getBlocks())
.close('Done')
.buildToJSON();
```
The code above renders the modal below. And be sure to check out the full documentation on the **Block Builder** doc site for more information.
![An example of using Block Builder for Modals](docs/resources/images/accordion-modal-example.png)
[**View Example on Slack Block Kit Builder Website**](https://app.slack.com/block-kit-builder#%7B%22title%22:%7B%22type%22:%22plain_text%22,%22text%22:%22FAQ%22%7D,%22blocks%22:%5B%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22Hi!%20:wave::skin-tone-4:%20And%20welcome%20to%20the%20FAQ%20section!%20Take%20a%20look%20around%20and%20if%20you%20don't%20find%20what%20you%20need,%20feel%20free%20to%20open%20an%20issue%20on%20GitHub.%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Why%20should%20I%20adopt%20Block%20Builder?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B0%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*How%20do%20I%20use%20the%20%60Accordion%60%20component?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Close%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22It's%20actually%20_really_%20easy!%20All%20you%20have%20to%20do%20is%20pass%20in%20the%20items%20you%20want%20to%20show%20up%20in%20the%20UI,%20a%20function%20that%20captures%20the%20expanded%20items%20in%20the%20%60actionId%60,%20and%20a%20function%20that%20builds%20out%20the%20right%20UI%20when%20an%20item%20is%20expanded.%5Cn%5CnThat's%20it,%20so%20go%20give%20it%20a%20try!%20%20:raised_hands::skin-tone-4:%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*What%20other%20features%20are%20in%20the%20pipeline?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B2%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*Do%20you%20work%20for%20Slack?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B3%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D,%7B%22type%22:%22divider%22%7D,%7B%22text%22:%7B%22type%22:%22mrkdwn%22,%22text%22:%22*What%20can%20I%20do%20to%20help?*%22%7D,%22accessory%22:%7B%22text%22:%7B%22type%22:%22plain_text%22,%22text%22:%22More%22%7D,%22action_id%22:%22%7B%5C%22action%5C%22:%5C%22render-faqs%5C%22,%5C%22expandedItems%5C%22:%5B4%5D%7D%22,%22type%22:%22button%22%7D,%22type%22:%22section%22%7D%5D,%22close%22:%7B%22type%22:%22plain_text%22,%22text%22:%22Done%22%7D,%22type%22:%22modal%22%7D)
### Utility Functions

@@ -328,3 +402,3 @@

const myMdMessage = ({ channel, user }) => {
export default ({ channel, user }) => {
const slashCommands = ['/schedule', '/cancel', '/remind', '/help'];

@@ -331,0 +405,0 @@

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc