add action row component

This commit is contained in:
MapleLeaf
2021-12-27 02:37:15 -06:00
parent 5717d12e1f
commit c56abcaa34
4 changed files with 68 additions and 1 deletions

View File

@@ -0,0 +1,26 @@
import type { ReactNode } from "react"
import React from "react"
import { ReacordElement } from "../../internal/element.js"
import type { MessageOptions } from "../../internal/message"
import { Node } from "../../internal/node.js"
export type ActionRowProps = {
children?: ReactNode
}
export function ActionRow(props: ActionRowProps) {
return (
<ReacordElement props={props} createNode={() => new ActionRowNode(props)}>
{props.children}
</ReacordElement>
)
}
class ActionRowNode extends Node<{}> {
override modifyMessageOptions(options: MessageOptions): void {
options.actionRows.push([])
for (const child of this.children) {
child.modifyMessageOptions(options)
}
}
}

View File

@@ -9,7 +9,7 @@ export type MessageOptions = {
actionRows: ActionRow[] actionRows: ActionRow[]
} }
type ActionRow = Array< export type ActionRow = Array<
MessageButtonOptions | MessageLinkOptions | MessageSelectOptions MessageButtonOptions | MessageLinkOptions | MessageSelectOptions
> >

View File

@@ -1,5 +1,6 @@
export * from "./core/adapters/adapter" export * from "./core/adapters/adapter"
export * from "./core/adapters/discord-js-adapter" export * from "./core/adapters/discord-js-adapter"
export * from "./core/components/action-row"
export * from "./core/components/button" export * from "./core/components/button"
export * from "./core/components/embed" export * from "./core/components/embed"
export * from "./core/components/embed-author" export * from "./core/components/embed-author"

40
test/action-row.test.tsx Normal file
View File

@@ -0,0 +1,40 @@
import React from "react"
import { ActionRow, Button, Select } from "../library/main"
import { setupReacordTesting } from "./setup-testing"
const { assertRender } = setupReacordTesting()
test("action row", async () => {
await assertRender(
<>
<Button label="outside button" onClick={() => {}} />
<ActionRow>
<Button label="button inside action row" onClick={() => {}} />
</ActionRow>
<Select />
<Button label="last row 1" onClick={() => {}} />
<Button label="last row 2" onClick={() => {}} />
</>,
[
{
content: "",
embeds: [],
actionRows: [
[{ type: "button", style: "secondary", label: "outside button" }],
[
{
type: "button",
style: "secondary",
label: "button inside action row",
},
],
[{ type: "select", options: [], values: [] }],
[
{ type: "button", style: "secondary", label: "last row 1" },
{ type: "button", style: "secondary", label: "last row 2" },
],
],
},
],
)
})