mirror of
https://github.com/Paillat-dev/pycord-reactive-views.git
synced 2026-01-02 17:14:56 +00:00
👷 Work in progress
This commit is contained in:
53
src/pycord_reactive_views/components.py
Normal file
53
src/pycord_reactive_views/components.py
Normal file
@@ -0,0 +1,53 @@
|
||||
from typing import Any
|
||||
|
||||
import discord
|
||||
|
||||
from .utils import MaybeReactiveValue, ReactiveValue, is_reactive
|
||||
|
||||
|
||||
class Reactive:
|
||||
"""A class that can be used with reactive values."""
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.reactives: dict[str, ReactiveValue[Any]] = {}
|
||||
self.super_kwargs: dict[str, Any] = {}
|
||||
|
||||
def add_reactive(self, key: str, value: MaybeReactiveValue[Any]) -> None:
|
||||
"""Add a reactive value to the view."""
|
||||
if is_reactive(value):
|
||||
self.reactives[key] = value
|
||||
if value.default:
|
||||
setattr(self, key, value.default)
|
||||
else:
|
||||
setattr(self, key, value)
|
||||
|
||||
async def refresh(self) -> None:
|
||||
"""Refresh the reactive values."""
|
||||
for key, value in self.reactives.items():
|
||||
setattr(self, key, await value())
|
||||
|
||||
|
||||
class ReactiveButton(discord.ui.Button, Reactive): # pyright: ignore[reportUnsafeMultipleInheritance,reportMissingTypeArgument]
|
||||
"""A button that can be used with reactive values."""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
style: MaybeReactiveValue[discord.ButtonStyle] = discord.ButtonStyle.secondary,
|
||||
label: MaybeReactiveValue[str | None] = None,
|
||||
disabled: MaybeReactiveValue[bool] = False,
|
||||
custom_id: str | None = None,
|
||||
url: MaybeReactiveValue[str | None] = None,
|
||||
emoji: MaybeReactiveValue[str | discord.Emoji | discord.PartialEmoji | None] = None,
|
||||
sku_id: int | None = None,
|
||||
row: MaybeReactiveValue[int | None] = None,
|
||||
):
|
||||
discord.ui.Button.__init__(self)
|
||||
Reactive.__init__(self)
|
||||
self.add_reactive("style", style)
|
||||
self.add_reactive("label", label)
|
||||
self.add_reactive("disabled", disabled)
|
||||
self.add_reactive("url", url)
|
||||
self.add_reactive("emoji", emoji)
|
||||
self.add_reactive("row", row)
|
||||
Reference in New Issue
Block a user