UNPKG

1.41 kBJavaScriptView Raw
1import React, {Component} from 'react';
2import PropTypes from 'prop-types';
3
4import LoaderInline from '../loader-inline/loader-inline';
5
6import UserCardTooltip from './tooltip';
7import styles from './user-card.css';
8
9export default class SmartUserCardTooltip extends Component {
10 static propTypes = {
11 children: PropTypes.node,
12 userDataSource: PropTypes.func
13 };
14
15 state = {
16 user: null,
17 loading: false
18 };
19
20 loadUser = async () => {
21 if (this.state.user) {
22 return;
23 }
24
25 try {
26 this.setState({loading: true});
27 const user = await this.props.userDataSource();
28 this.setState({user});
29 } catch (e) {
30 // Skip it
31 } finally {
32 this.setState({loading: false});
33 }
34 };
35
36 renderNoUser = () => (
37 this.state.loading
38 ? (
39 <div className={styles.userCardSpaced}>
40 <LoaderInline/>
41 </div>
42 )
43 : null
44 );
45
46 render() {
47 const {user} = this.state;
48 // eslint-disable-next-line no-unused-vars
49 const {children, userDataSource, ...restProps} = this.props;
50
51 const dropdownProps = {
52 onMouseEnter: this.loadUser,
53 ...UserCardTooltip.defaultProps.dropdownProps
54 };
55
56 return (
57 <UserCardTooltip
58 user={user}
59 renderNoUser={this.renderNoUser}
60 dropdownProps={dropdownProps}
61 {...restProps}
62 >
63 {children}
64 </UserCardTooltip>
65 );
66 }
67}