MCPcopy
hub / github.com/maxchehab/phelia

github.com/maxchehab/phelia @main sqlite

repository ↗ · DeepWiki ↗
162 symbols 259 edges 30 files 4 documented · 2%
README

⚡ Phelia

React for Slack Apps

Build interactive Slack apps without webhooks or JSON headache. If you know React, you know how to make a Slack app.

Quick start

  1. Create your message with React:

```tsx import randomImage from "../utils";

export function RandomImage({ useState }: PheliaMessageProps) { const [imageUrl, setImageUrl] = useState("imageUrl", randomImage());

 return (
   <Message text="Choose a dog">
     <ImageBlock
       title="an adorable :dog:"
       alt="a very adorable doggy dog"
       imageUrl={imageUrl}
       emoji
     />
     <Divider />
     <Actions>
       <Button
         style="primary"
         action="randomImage"
         onClick={() => setImageUrl(randomImage())}
       >
         New doggy
       </Button>
     </Actions>
   </Message>
 );

} ```

  1. Register your component

```ts const client = new Phelia(process.env.SLACK_TOKEN);

app.post( "/interactions", client.messageHandler(process.env.SLACK_SIGNING_SECRET, [RandomImage]) );

client.postMessage(RandomImage, "@max"); ```

  1. Interact with your message:

See: docs for more info or join our community Slack.

How this works

Phelia transforms React components into Slack messages by use of a custom React reconciler. Components (with their internal state and props) are serialized into a custom storage. When a user interacts with a posted message Phelia retrieves the component, re-hydrates it's state and props, and performs any actions which may result in a new state.

Components

Each component is a mapping of a specific object type for a slack block. There are 3 categories of components, each with special rules for how that component can be used with other components.

  1. Surface Components (Message, Home, Modal) - Root components that contains Block Components
  2. Block Components (Actions, Context, Divider, Image, Input, Section) - Direct descendants of a Surface Component. Contains Block Components
  3. Block Element Components (Text, CheckBoxes, TextField, etc) - Direct descendants of a Block Components.

Feature Support

To request a feature submit a new issue. | Component | | Example | | ---------------------------------------------------------------------------------------------------------------------- | --- | ---------------------------------------------------------------------------------------------------------------------------------- | | Actions | ✅ | Counter | | Button | ✅ | Counter | | Channel Select Menus | ✅ | Channel Select Menu | | Checkboxes | ✅ | Modal Example | | Confirmation dialog | ✅ | Random Image | | Context | ✅ | | Conversation Select Menus | ✅ | Conversation Select Menu | | Date Picker | ✅ | Birthday Picker | | Divider | ✅ | Random Image | | External Select Menus | ✅ | External Select Menu | | Home Tab | ✅ | Home App Example | | Image Block | ✅ | Random Image | | Image | ✅ | Random Image | | Input | ✅ | Modal Example | | Messages | ✅ | Server | | Modals | ✅ | Modal Example | | Multi channels select Menu | ✅ | Multi Channels Select Menu | | Multi conversations select Menu | ✅ | Multi Conversations Select Menu | | Multi external select Menu | ✅ | Multi External Select Menu | | Multi static select Menu | ✅ | Multi Static Select Menu | | Multi users select Menu | ✅ | Multi Users Select Menu | | Option group | ✅ | Static Select Menu | | Option | ✅ | | Overflow Menu | ✅ | Overflow Menu | | Plain-text input | ✅ | Modal Example | | Radio button group | ✅ | Radio Buttons | | Section | ✅ | Counter | | Static Select Menus | ✅ | Static Select Menu | | Text | ✅ | Counter | | Text | ✅ | Random Image | | User Select Menus | ✅ | User Select Menu |

Extension points exported contracts — how you extend this code

TextProps (Interface)
(no doc)
src/core/components.tsx
ComponentProps (Interface)
(no doc)
src/@types/jsx.d.ts
ButtonBase (Interface)
(no doc)
src/core/components.tsx
IntrinsicElements (Interface)
(no doc)
src/@types/jsx.d.ts
ButtonWithOnClick (Interface)
(no doc)
src/core/components.tsx
ActionsProps (Interface)
(no doc)
src/core/components.tsx
ImageProps (Interface)
(no doc)
src/core/components.tsx

Core symbols most depended-on inside this repo

render
called by 119
src/core/reconciler.ts
reconcile
called by 32
src/core/reconciler.ts
debug
called by 13
src/core/reconciler.ts
registerComponents
called by 3
src/core/phelia.ts
enrichUser
called by 3
src/core/phelia.ts
parseMessageKey
called by 3
src/core/utils.ts
loadMessagesFromArray
called by 3
src/core/utils.ts
getOnSearchOptions
called by 3
src/core/reconciler.ts

Shape

Function 64
Interface 48
Method 46
Class 4

Languages

TypeScript100%

Modules by API surface

src/core/components.tsx54 symbols
src/core/reconciler.ts34 symbols
src/core/phelia.ts20 symbols
src/core/interfaces.ts14 symbols
src/core/utils.ts4 symbols
src/tests/reconciler.spec.tsx2 symbols
src/example/example-messages/users-select-menu.tsx2 symbols
src/example/example-messages/static-select-menu.tsx2 symbols
src/example/example-messages/random-image.tsx2 symbols
src/example/example-messages/radio-buttons.tsx2 symbols
src/example/example-messages/multi-users-select-menu.tsx2 symbols
src/example/example-messages/multi-static-select-menu.tsx2 symbols

Dependencies from manifests, versioned

@slack/events-api2.3.2 · 1×
@slack/interactive-messages1.5.0 · 1×
@slack/web-api5.8.0 · 1×
@types/express4.17.4 · 1×
@types/jest25.2.1 · 1×
@types/node12.7.0 · 1×
@types/react16.9.32 · 1×
@types/react-dom16.9.6 · 1×
@types/react-reconciler0.18.0 · 1×
@typescript-eslint/eslint-plugin2.28.0 · 1×
@typescript-eslint/parser2.28.0 · 1×
dotenv8.2.0 · 1×

For agents

$ claude mcp add phelia \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact