import * as React from 'react'; // @ts-ignore: no ts definition import messages from '../messages'; // @ts-ignore: no ts definition // eslint-disable-next-line import/named import { withAPIContext } from '../api-context'; // @ts-ignore: no ts definition import { getBadItemError } from '../../../utils/error'; // @ts-ignore: no ts definition // eslint-disable-next-line import/named import { ElementsXhrError, ErrorContextProps } from '../../../common/types/api'; // @ts-ignore: no ts definition // eslint-disable-next-line import/named import { Errors } from '../flowTypes'; // @ts-ignore: no ts definition // eslint-disable-next-line import/named import { User } from '../../../common/types/core'; export type WithCurrentUserProps = { currentUser?: User; currentUserError?: Errors; } & ErrorContextProps; export type ComponentWithCurrentUser = { errorCallback: (error: ElementsXhrError, code: string, contextInfo: Object) => void; fetchCurrentUser: (user?: User, shouldDestroy?: boolean) => void; fetchCurrentUserErrorCallback: (e: ElementsXhrError, code: string) => Errors; fetchCurrentUserSuccessCallback: (currentUser: User) => void; }; export type CurrentUserState = { currentUser?: User; currentUserError?: Errors; }; export type WithCurrentUserComponent
= React.ComponentClass
; export default function withCurrentUser
( WrappedComponent: React.ComponentType
, ): WithCurrentUserComponent
{ class ComponentWithCurrentUser extends React.Component
{
static displayName: string;
constructor(props: P & WithCurrentUserProps) {
super(props);
const { currentUser } = props;
this.state = { currentUser };
}
componentDidMount() {
const { currentUser } = this.state;
this.fetchCurrentUser(currentUser);
}
/**
* Network error callback
*
* @private
* @param {Error} error - Error object
* @param {Error} code - the code for the error
* @param {Object} contextInfo - the context info for the error
* @return {void}
*/
errorCallback = (error: ElementsXhrError, code: string, contextInfo: Object = {}): void => {
// eslint-disable-next-line no-console
console.error(error);
this.props.onError(error, code, contextInfo);
};
/**
* Fetches a Users info
*
* @private
* @param {User} [user] - Box User. If missing, gets user that the current token was generated for.
* @param {boolean} shouldDestroy
* @return {void}
*/
fetchCurrentUser = (user?: User, shouldDestroy = false): void => {
const { api, file } = this.props;
if (!file) {
throw getBadItemError();
}
if (typeof user === 'undefined') {
api.getUsersAPI(shouldDestroy).getUser(
file.id,
this.fetchCurrentUserSuccessCallback,
this.fetchCurrentUserErrorCallback,
);
} else {
this.setState({ currentUser: user, currentUserError: undefined });
}
};
/**
* User fetch success callback
*
* @private
* @param {Object} currentUser - User info object
* @return {void}
*/
fetchCurrentUserSuccessCallback = (currentUser: User): void => {
this.setState({ currentUser, currentUserError: undefined });
};
/**
* Handles a failed file user info fetch
*
* @private
* @param {ElementsXhrError} e - API error
* @return {void}
*/
fetchCurrentUserErrorCallback = (e: ElementsXhrError, code: string) => {
this.setState({
currentUser: undefined,
currentUserError: {
maskError: {
errorHeader: messages.currentUserErrorHeaderMessage,
errorSubHeader: messages.defaultErrorMaskSubHeaderMessage,
},
},
});
this.errorCallback(e, code, {
error: e,
});
};
render() {
const { currentUser, currentUserError } = this.state;
return