Skip to content

Counter

Lets build an example counter! This will teach you how to use React state and callbacks.

Assuming you have a slash command, /counter, lets create a handler and make it render our custom React component, Counter:

tsx
client.on(Events.InteractionCreate, (interaction) => {
    if(!interaction.isChatInputCommand()) return;
    if(!interaction.commandName !== "counter") return;

    djsx.create(interaction, <Counter />);
});

Now, lets define Counter as a React function component:

tsx
const Counter = () => {
    return (
        <message v2>
            <text>
                Hi!
            </text>
        </message>
    )
};

But we need to have a button, right? Lets add a button!

tsx
const Counter = () => {
    return (
        <message v2>
            <text>
                Hi!
            </text>
            
            <row>
                <button>
                    Increment
                </button>
            </row>
        </message>
    )
};

However, when we click the button, nothing happens.

We can add an event handler to our button like so:

tsx
const Counter = () => {
    const clickHandler = () => {
        console.log("Button clicked!");
    };

    return (
        <message v2>
            <text>
                Hi!
            </text>
            
            <row>
                <button onClick={clickHandler}>
                    Increment
                </button>
            </row>
        </message>
    )
};

Now when you click Increment, it should log the message to the console.

Now, finally, we can add an useState react hook to track the counter state:

tsx
import { useState } from "react";

const Counter = () => {
    const [count, setCount] = useState(1);

    const clickHandler = () => {
        console.log("Button clicked!");
    };

    return (
        <message v2>
            <text>
                Count: {count}
            </text>
            
            <row>
                <button onClick={clickHandler}>
                    Increment
                </button>
            </row>
        </message>
    )
};

And then, inside our click handler, we can use setCount to actually increment the state:

tsx
const clickHandler = () => {
    setCount(c => c + 1);
};

Now we have an interactive counter!