add link component
This commit is contained in:
40
library/link.tsx
Normal file
40
library/link.tsx
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
import React from "react"
|
||||||
|
import { last } from "../helpers/last.js"
|
||||||
|
import { ReacordElement } from "./element.js"
|
||||||
|
import type { MessageOptions } from "./message"
|
||||||
|
import { Node } from "./node.js"
|
||||||
|
|
||||||
|
export type LinkProps = {
|
||||||
|
label?: string
|
||||||
|
children?: string
|
||||||
|
emoji?: string
|
||||||
|
disabled?: boolean
|
||||||
|
url: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export function Link(props: LinkProps) {
|
||||||
|
return <ReacordElement props={props} createNode={() => new LinkNode(props)} />
|
||||||
|
}
|
||||||
|
|
||||||
|
class LinkNode extends Node<LinkProps> {
|
||||||
|
override modifyMessageOptions(options: MessageOptions): void {
|
||||||
|
let actionRow = last(options.actionRows)
|
||||||
|
|
||||||
|
if (
|
||||||
|
actionRow == undefined ||
|
||||||
|
actionRow.length >= 5 ||
|
||||||
|
actionRow[0]?.type === "select"
|
||||||
|
) {
|
||||||
|
actionRow = []
|
||||||
|
options.actionRows.push(actionRow)
|
||||||
|
}
|
||||||
|
|
||||||
|
actionRow.push({
|
||||||
|
type: "link",
|
||||||
|
disabled: this.props.disabled,
|
||||||
|
emoji: this.props.emoji,
|
||||||
|
label: this.props.label || this.props.children,
|
||||||
|
url: this.props.url,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,5 +10,6 @@ export * from "./embed/embed-image"
|
|||||||
export * from "./embed/embed-thumbnail"
|
export * from "./embed/embed-thumbnail"
|
||||||
export * from "./embed/embed-title"
|
export * from "./embed/embed-title"
|
||||||
export * from "./interaction"
|
export * from "./interaction"
|
||||||
|
export * from "./link"
|
||||||
export * from "./message"
|
export * from "./message"
|
||||||
export * from "./reacord"
|
export * from "./reacord"
|
||||||
|
|||||||
@@ -3,7 +3,9 @@ import type { EmbedOptions } from "./embed/embed-options"
|
|||||||
export type MessageOptions = {
|
export type MessageOptions = {
|
||||||
content: string
|
content: string
|
||||||
embeds: EmbedOptions[]
|
embeds: EmbedOptions[]
|
||||||
actionRows: Array<Array<MessageButtonOptions | MessageSelectOptions>>
|
actionRows: Array<
|
||||||
|
Array<MessageButtonOptions | MessageLinkOptions | MessageSelectOptions>
|
||||||
|
>
|
||||||
}
|
}
|
||||||
|
|
||||||
export type MessageButtonOptions = {
|
export type MessageButtonOptions = {
|
||||||
@@ -15,6 +17,14 @@ export type MessageButtonOptions = {
|
|||||||
emoji?: string
|
emoji?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type MessageLinkOptions = {
|
||||||
|
type: "link"
|
||||||
|
url: string
|
||||||
|
label?: string
|
||||||
|
emoji?: string
|
||||||
|
disabled?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
export type MessageSelectOptions = {
|
export type MessageSelectOptions = {
|
||||||
type: "select"
|
type: "select"
|
||||||
customId: string
|
customId: string
|
||||||
|
|||||||
2
notes.md
2
notes.md
@@ -16,7 +16,7 @@
|
|||||||
- [x] test
|
- [x] test
|
||||||
- message components
|
- message components
|
||||||
- [x] buttons
|
- [x] buttons
|
||||||
- [ ] links
|
- [x] links
|
||||||
- [ ] select
|
- [ ] select
|
||||||
- [ ] action row
|
- [ ] action row
|
||||||
- [x] button onClick
|
- [x] button onClick
|
||||||
|
|||||||
49
test/link.test.tsx
Normal file
49
test/link.test.tsx
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
import React from "react"
|
||||||
|
import {
|
||||||
|
Link,
|
||||||
|
Reacord,
|
||||||
|
TestAdapter,
|
||||||
|
TestCommandInteraction,
|
||||||
|
} from "../library/main"
|
||||||
|
import { assertMessages } from "./assert-messages"
|
||||||
|
|
||||||
|
const adapter = new TestAdapter()
|
||||||
|
const reacord = new Reacord({ adapter })
|
||||||
|
const reply = reacord.createCommandReply(new TestCommandInteraction(adapter))
|
||||||
|
|
||||||
|
test("link", async () => {
|
||||||
|
reply.render(
|
||||||
|
<>
|
||||||
|
<Link url="https://example.com/">link text</Link>
|
||||||
|
<Link label="link text" url="https://example.com/" />
|
||||||
|
<Link label="link text" url="https://example.com/" disabled />
|
||||||
|
</>,
|
||||||
|
)
|
||||||
|
|
||||||
|
await assertMessages(adapter, [
|
||||||
|
{
|
||||||
|
content: "",
|
||||||
|
embeds: [],
|
||||||
|
actionRows: [
|
||||||
|
[
|
||||||
|
{
|
||||||
|
type: "link",
|
||||||
|
url: "https://example.com/",
|
||||||
|
label: "link text",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "link",
|
||||||
|
url: "https://example.com/",
|
||||||
|
label: "link text",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "link",
|
||||||
|
url: "https://example.com/",
|
||||||
|
label: "link text",
|
||||||
|
disabled: true,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
],
|
||||||
|
},
|
||||||
|
])
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user