-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
Copy pathActionMenu.tsx
79 lines (73 loc) · 3.26 KB
/
ActionMenu.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
/*
* Copyright 2024 Adobe. All rights reserved.
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may obtain a copy
* of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
* OF ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
import {ActionButton, ActionButtonProps} from './ActionButton';
import {AriaLabelingProps, DOMProps, FocusableRef, FocusableRefValue} from '@react-types/shared';
import {ContextValue} from 'react-aria-components';
import {createContext, forwardRef} from 'react';
import {filterDOMProps} from '@react-aria/utils';
import {forwardRefType} from './types';
// @ts-ignore
import intlMessages from '../intl/*.json';
import {Menu, MenuProps, MenuTrigger, MenuTriggerProps} from './Menu';
import MoreIcon from '../s2wf-icons/S2_Icon_More_20_N.svg';
import {StyleProps} from './style-utils' with { type: 'macro' };
import {useLocalizedStringFormatter} from '@react-aria/i18n';
import {useSpectrumContextProps} from './useSpectrumContextProps';
export interface ActionMenuProps<T> extends
Pick<MenuTriggerProps, 'isOpen' | 'defaultOpen' | 'onOpenChange' | 'align' | 'direction' | 'shouldFlip'>,
Pick<MenuProps<T>, 'children' | 'items' | 'disabledKeys' | 'onAction'>,
Pick<ActionButtonProps, 'isDisabled' | 'isQuiet' | 'autoFocus' | 'size'>,
StyleProps, DOMProps, AriaLabelingProps {
menuSize?: 'S' | 'M' | 'L' | 'XL'
}
export const ActionMenuContext = createContext<ContextValue<ActionMenuProps<any>, FocusableRefValue<HTMLButtonElement>>>(null);
function ActionMenu<T extends object>(props: ActionMenuProps<T>, ref: FocusableRef<HTMLButtonElement>) {
let stringFormatter = useLocalizedStringFormatter(intlMessages, '@react-spectrum/s2');
[props, ref] = useSpectrumContextProps(props, ref, ActionMenuContext);
let buttonProps = filterDOMProps(props, {labelable: true});
if (buttonProps['aria-label'] === undefined) {
buttonProps['aria-label'] = stringFormatter.format('menu.moreActions');
}
return (
<MenuTrigger
isOpen={props.isOpen}
defaultOpen={props.defaultOpen}
onOpenChange={props.onOpenChange}
align={props.align}
direction={props.direction}
shouldFlip={props.shouldFlip}>
<ActionButton
ref={ref}
size={props.size}
isDisabled={props.isDisabled}
autoFocus={props.autoFocus}
isQuiet={props.isQuiet}
styles={props.styles}
{...buttonProps}>
<MoreIcon />
</ActionButton>
<Menu
items={props.items}
disabledKeys={props.disabledKeys}
onAction={props.onAction}
size={props.menuSize}>
{/* @ts-ignore TODO: fix type, right now this component is the same as Menu */}
{props.children}
</Menu>
</MenuTrigger>
);
}
/**
* ActionMenu combines an ActionButton with a Menu for simple "more actions" use cases.
*/
let _ActionMenu = /*#__PURE__*/(forwardRef as forwardRefType)(ActionMenu);
export {_ActionMenu as ActionMenu};