Skip to content

Commit fd94510

Browse files
authored
Merge pull request #6320 from marmelab/Add-userMenuProps
[TypeScript] Add UserMenuProps
2 parents 70c5cf7 + 41dfe8d commit fd94510

File tree

3 files changed

+30
-13
lines changed

3 files changed

+30
-13
lines changed

packages/ra-ui-materialui/src/layout/AppBar.tsx

+7-5
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,13 @@ const AppBar = (props: AppBarProps): JSX.Element => {
156156
children
157157
)}
158158
<LoadingIndicator />
159-
{typeof userMenu === 'boolean'
160-
? userMenu === true
161-
? cloneElement(<DefaultUserMenu />, { logout })
162-
: null
163-
: cloneElement(userMenu, { logout })}
159+
{typeof userMenu === 'boolean' ? (
160+
userMenu === true ? (
161+
<DefaultUserMenu logout={logout} />
162+
) : null
163+
) : (
164+
cloneElement(userMenu, { logout })
165+
)}
164166
</Toolbar>
165167
</MuiAppBar>
166168
</Container>

packages/ra-ui-materialui/src/layout/UserMenu.tsx

+21-7
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ import {
1313
import { makeStyles } from '@material-ui/core/styles';
1414
import AccountCircle from '@material-ui/icons/AccountCircle';
1515

16+
import { ClassesOverride } from '../types';
17+
18+
const defaultIcon = <AccountCircle />;
19+
1620
const useStyles = makeStyles(
1721
theme => ({
1822
user: {},
@@ -37,13 +41,19 @@ const TransformOrigin: PopoverOrigin = {
3741
horizontal: 'right',
3842
};
3943

40-
const UserMenu = props => {
44+
const UserMenu = (props: UserMenuProps) => {
4145
const [anchorEl, setAnchorEl] = useState(null);
4246
const translate = useTranslate();
4347
const { loaded, identity } = useGetIdentity();
4448
const classes = useStyles(props);
4549

46-
const { children, label, icon, logout } = props;
50+
const {
51+
children,
52+
label = 'ra.auth.user_menu',
53+
icon = defaultIcon,
54+
logout,
55+
} = props;
56+
4757
if (!logout && !children) return null;
4858
const open = Boolean(anchorEl);
4959

@@ -112,14 +122,18 @@ const UserMenu = props => {
112122

113123
UserMenu.propTypes = {
114124
children: PropTypes.node,
115-
label: PropTypes.string.isRequired,
125+
classes: PropTypes.object,
126+
label: PropTypes.string,
116127
logout: PropTypes.element,
117128
icon: PropTypes.node,
118129
};
119130

120-
UserMenu.defaultProps = {
121-
label: 'ra.auth.user_menu',
122-
icon: <AccountCircle />,
123-
};
131+
export interface UserMenuProps {
132+
children?: React.ReactNode;
133+
classes?: ClassesOverride<typeof useStyles>;
134+
label?: string;
135+
logout?: React.ReactNode;
136+
icon?: React.ReactNode;
137+
}
124138

125139
export default UserMenu;

packages/ra-ui-materialui/src/layout/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import Sidebar, { SidebarProps } from './Sidebar';
2020
import Title, { TitleProps, TitlePropType } from './Title';
2121
import TitleForRecord from './TitleForRecord';
2222
import TopToolbar from './TopToolbar';
23-
import UserMenu from './UserMenu';
23+
import UserMenu, { UserMenuProps } from './UserMenu';
2424

2525
export {
2626
AppBar,
@@ -63,4 +63,5 @@ export type {
6363
ResponsiveProps,
6464
SidebarProps,
6565
TitleProps,
66+
UserMenuProps,
6667
};

0 commit comments

Comments
 (0)