Skip to content

Commit

Permalink
TriggerのrenderItemをHTMLPropsで解決させる
Browse files Browse the repository at this point in the history
  • Loading branch information
k35o committed Sep 21, 2024
1 parent 283cecb commit 149b5f0
Show file tree
Hide file tree
Showing 7 changed files with 63 additions and 74 deletions.
6 changes: 2 additions & 4 deletions src/components/dropdown-menu/dropdown-menu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,7 @@ const Trigger: FC<{
size={size}
variant="contained"
endIcon={<ChevronDown className="size-8" />}
{...props.restProps}
{...getTriggerProps(props.actionProps)}
{...getTriggerProps(props)}
>
{text}
</Button>
Expand All @@ -149,8 +148,7 @@ const IconTrigger: FC<{
'inline-flex rounded-full bg-bgTransparent hover:bg-bgHover focus-visible:ring-2 focus-visible:ring-borderFocus active:bg-bgActive',
'p-2',
)}
{...props.restProps}
{...getTriggerProps(props.actionProps)}
{...getTriggerProps(props)}
>
<span className="sr-only">{label}</span>
{icon}
Expand Down
5 changes: 4 additions & 1 deletion src/components/dropdown-menu/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ type MenuContext = {
userProps?: HTMLProps<HTMLElement>,
) => Record<string, unknown>;
getItemProps: (
userProps?: Omit<HTMLProps<HTMLElement>, 'selected' | 'active'>,
userProps?: Omit<
HTMLProps<HTMLButtonElement>,
'selected' | 'active'
>,
) => Record<string, unknown>;
};

Expand Down
3 changes: 1 addition & 2 deletions src/components/list-box/list-box.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -152,8 +152,7 @@ const Trigger: FC<{
variant="contained"
fullWidth
endIcon={<ChevronDown className="size-8" />}
{...props.restProps}
{...getTriggerProps(props.actionProps)}
{...getTriggerProps(props)}
>
{label}
</Button>
Expand Down
104 changes: 48 additions & 56 deletions src/components/popover/hooks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import {
import {
createContext,
CSSProperties,
HTMLProps,
KeyboardEvent,
MutableRefObject,
useContext,
Expand Down Expand Up @@ -142,75 +143,66 @@ export const usePopoverContent = () => {
);
};

export const usePopoverTrigger = () => {
export const usePopoverTrigger = (): Omit<
HTMLProps<HTMLButtonElement>,
'selected' | 'active'
> => {
const popover = usePopoverContext();
return useMemo(() => {
switch (popover.type) {
case 'tooltip':
return {
actionProps: {
onMouseEnter: popover.onOpen,
onMouseLeave: popover.onClose,
onFocus: popover.onOpen,
onBlur: popover.onClose,
},
restProps: {
'aria-describedby': `${popover.rootId}_content`,
ref: popover.setTriggerRef,
},
onMouseEnter: popover.onOpen,
onMouseLeave: popover.onClose,
onFocus: popover.onOpen,
onBlur: popover.onClose,
'aria-describedby': `${popover.rootId}_content`,
ref: popover.setTriggerRef,
};
case 'menu':
return {
actionProps: {
onClick: popover.toggleOpen,
onKeyDown: (e: KeyboardEvent) => {
if (e.key === 'Enter') {
e.preventDefault();
popover.toggleOpen();
}
if (e.key === 'ArrowUp') {
e.preventDefault();
popover.onOpen();
}
if (e.key === 'ArrowDown') {
e.preventDefault();
popover.onOpen();
}
},
},
restProps: {
'aria-haspopup': 'menu',
'aria-expanded': popover.isOpen,
'aria-controls': `${popover.rootId}_list`,
ref: popover.setTriggerRef,
onClick: popover.toggleOpen,
onKeyDown: (e: KeyboardEvent) => {
if (e.key === 'Enter') {
e.preventDefault();
popover.toggleOpen();
}
if (e.key === 'ArrowUp') {
e.preventDefault();
popover.onOpen();
}
if (e.key === 'ArrowDown') {
e.preventDefault();
popover.onOpen();
}
},
'aria-haspopup': 'menu',
'aria-expanded': popover.isOpen,
'aria-controls': `${popover.rootId}_list`,
ref: popover.setTriggerRef,
};
case 'listbox':
return {
actionProps: {
onClick: popover.toggleOpen,
onKeyDown: (e: KeyboardEvent) => {
if (e.key === 'Enter') {
e.preventDefault();
popover.toggleOpen();
}
if (e.key === 'ArrowUp') {
e.preventDefault();
popover.onOpen();
}
if (e.key === 'ArrowDown') {
e.preventDefault();
popover.onOpen();
}
},
},
restProps: {
role: 'combobox',
'aria-haspopup': 'listbox',
'aria-expanded': popover.isOpen,
'aria-controls': `${popover.rootId}_list`,
ref: popover.setTriggerRef,
onClick: popover.toggleOpen,
onKeyDown: (e: KeyboardEvent) => {
if (e.key === 'Enter') {
e.preventDefault();
popover.toggleOpen();
}
if (e.key === 'ArrowUp') {
e.preventDefault();
popover.onOpen();
}
if (e.key === 'ArrowDown') {
e.preventDefault();
popover.onOpen();
}
},
role: 'combobox',
'aria-haspopup': 'listbox',
'aria-expanded': popover.isOpen,
'aria-controls': `${popover.rootId}_list`,
ref: popover.setTriggerRef,
};
}
}, [popover]);
Expand Down
4 changes: 3 additions & 1 deletion src/components/popover/popover.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,9 @@ export const Default: Story = {
<Popover.Root>
<Popover.Trigger
renderItem={(props) => (
<Button {...props.allProps}>Popover</Button>
<Button {...props} type="button" size="md">
Popover
</Button>
)}
/>
<Popover.Content
Expand Down
13 changes: 4 additions & 9 deletions src/components/popover/popover.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -167,18 +167,13 @@ const Content: FC<{
};

const Trigger: FC<{
renderItem: (props: {
actionProps: Omit<HTMLProps<HTMLElement>, 'selected' | 'active'>;
restProps: Record<string, unknown>;
allProps: Record<string, unknown>;
}) => ReactElement;
renderItem: (
props: Omit<HTMLProps<HTMLButtonElement>, 'selected' | 'active'>,
) => ReactElement;
}> = ({ renderItem }) => {
const props = usePopoverTrigger();

return renderItem({
...props,
allProps: { ...props.actionProps, ...props.restProps },
});
return renderItem(props);
};

export const Popover = {
Expand Down
2 changes: 1 addition & 1 deletion src/components/tooltip/tooltip.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const Trigger: FC<{
}> = ({ renderItem }) => {
return (
<Popover.Trigger
renderItem={(props) => renderItem({ ...props.allProps })}
renderItem={(props) => renderItem({ ...props })}
/>
);
};
Expand Down

0 comments on commit 149b5f0

Please sign in to comment.