Create custom Deact hooks for reusable UI logic. Use when extracting shared state/callback patterns.
File location: src/hooks/useYourHook.js
Naming convention: Always prefix with use (e.g., usePagination, useInfoToggle)
const {
useState,
useCallbackBinding,
createElement,
} = require("../deact/deact");
/**
* @param {object} param0
* @param {number=} param0.initialValue
* @param {DeactElement} ref
* @returns {{ value: number, setValue: Function, buttonElement: CreateElementResult }}
*/
const useMyHook = ({ initialValue = 0 }, ref) => {
// State and logic here
return {
// Return values, setters, and pre-built elements
};
};
module.exports = useMyHook;
ref is always the last parameter (not a hook call)await for data fetchingcreateElement results - pre-built UI componentsconst {
useState,
useCallback,
useCallbackBinding,
createElement,
} = require("../deact/deact");
const { ButtonStyle } = require("discord.js");
const Button = require("../deact/elements/Button");
const useInfoToggle = ({ initial = false, deferToggle = false }, ref) => {
const [isToggled, setIsToggled] = useState(initial, ref);
const toggle = useCallback(
() => {
setIsToggled((prev) => !prev);
},
[],
ref,
);
const toggleBindingKey = useCallbackBinding(toggle, ref, {
defer: deferToggle,
});
const toggleButton = createElement(Button, {
label: "ⓘ",
callbackBindingKey: toggleBindingKey,
style: isToggled ? ButtonStyle.Primary : ButtonStyle.Secondary,
});
return {
isToggled,
toggle,
toggleButton,
};
};
module.exports = useInfoToggle;
ref is always the last parameteruseawaited when calleduse-deact-hook - How to use hooks in elements (useState, useMemo, useCallbackBinding, etc.)deact-component-callback - Handling component interactions in callbacksreferences/pattern-pagination-hook.md - Pagination with scroll buttonsreferences/pattern-async-data-hook.md - Async hook with data fetchingreferences/pattern-callback-options.md - Passing through callback options