jsx-slack
Version:
Build JSON object for Slack Block Kit surfaces from JSX
2 lines (1 loc) • 2.27 kB
JavaScript
import{JSXSlackError as c}from"../../error.mjs";import{JSXSlack as _}from"../../jsx.mjs";import{createComponent as d}from"../../jsx-internals.mjs";import{Escape as w}from"../../mrkdwn/jsx.mjs";import{mrkdwn as y}from"../composition/Mrkdwn.mjs";import{Button as x}from"../elements/Button.mjs";import{Select as S}from"../elements/Select.mjs";import{assignMetaFrom as v,alias as b,resolveTagName as $}from"../utils.mjs";import{generateInputValidator as j}from"./utils.mjs";const h=Symbol("jsx-slack-field"),p={button:()=>{},channels_select:t=>{if(t.response_url_enabled)throw new c("<ChannelsSelect responseUrlEnabled> is available only in the usage of input components.",t)},checkboxes:()=>{},conversations_select:t=>{if(t.response_url_enabled)throw new c("<ConversationsSelect responseUrlEnabled> is available only in the usage of input components.",t)},datepicker:()=>{},external_select:()=>{},image:({type:t,image_url:a,alt_text:m})=>({type:t,image_url:a,alt_text:m}),multi_channels_select:()=>{},multi_conversations_select:()=>{},multi_external_select:()=>{},multi_static_select:()=>{},multi_users_select:()=>{},overflow:()=>{},radio_buttons:()=>{},static_select:()=>{},timepicker:()=>{},users_select:()=>{},workflow_button:()=>{},input:j("Section")},E=Object.keys(p),C=d("Field",({children:t})=>Object.defineProperty(y(t),h,{value:!0})),F=d("Section",({blockId:t,children:a,id:m,...g})=>{let l,s,o;const k=_.Children.toArray(a).reduce((r,e)=>{if(_.isValidElement(e)){const{type:i}=e.$$jsxslack,u=e.$$jsxslack.props||{};if(i==="img")return s=v(e,{type:"image",image_url:u.src,alt_text:u.alt}),r;if(i==="button")return s=b(e,x),r;if(i==="select")return s=b(e,S),r;if(typeof i!="string"&&typeof e=="object"){const n=e;if(n[h])o=[...o||[],n];else if(n.type==="mrkdwn"&&n.text)l=n;else if(p[n.type])s=p[n.type](n)||n;else{if(i===w)return[...r,e];{const f=$(e);throw new c(`<Section> has detected the unexpected component as an accessory${f?`: ${f}`:"."}`,e)}}return r}}return[...r,e]},[]);if(!l){const r=y(k);r.text&&(l=r)}if(o&&o.length>10)throw new c(`<Section> can contain up to 10 fields, but there are ${o.length} fields.`,g.__source);return{type:"section",block_id:t||m,text:l,accessory:s,fields:o}});export{C as Field,F as Section,E as availableSectionAccessoryTypes};