30 lines
834 B
TypeScript
30 lines
834 B
TypeScript
import React, { ReactNode, isValidElement, Children } from "react";
|
|
import { ButtonIcon } from "./ButtonIcon";
|
|
import { ButtonLoading } from "./ButtonLoading";
|
|
|
|
export function useButtonSlot(children: ReactNode) {
|
|
const iconNodes: React.ReactElement[] = [];
|
|
const loadingNodes: React.ReactElement[] = [];
|
|
|
|
const collectNodes = (nodes: ReactNode) => {
|
|
Children.forEach(nodes, (child) => {
|
|
if (!isValidElement(child)) return;
|
|
|
|
if (child.type === ButtonIcon) {
|
|
iconNodes.push(child);
|
|
} else if (child.type === ButtonLoading) {
|
|
loadingNodes.push(child);
|
|
} else if ((child as any).props.children) {
|
|
collectNodes((child as any).props.children);
|
|
}
|
|
});
|
|
};
|
|
|
|
collectNodes(children);
|
|
|
|
return {
|
|
iconNode: iconNodes.at(-1),
|
|
loadingNode: loadingNodes.at(-1),
|
|
};
|
|
}
|