@kiwicom/smart-faq
Version:
Smart FAQ
111 lines (99 loc) • 2.74 kB
JavaScript
// @flow
import * as React from 'react';
import type { User, onLogin, onLogout } from '../../types';
export type UserContextType = {|
user: User,
brand: string,
onLogin: onLogin,
onLogout: onLogout,
...TokenTypes,
|};
type TokenTypes = {|
simpleToken: ?string,
loginToken: ?string,
kwAuthToken: ?string,
|};
export const UserContext = React.createContext(
({
user: null,
brand: 'kiwicom',
loginToken: null,
simpleToken: null,
kwAuthToken: null,
onLogin: () => {},
onLogout: () => Promise.resolve(null),
}: UserContextType),
);
export const withLogin = <Props>(
Component: React.ComponentType<{ onLogin: onLogin } & Props>,
) =>
function withLoginHOC(props: Props) {
return (
<UserContext.Consumer>
{({ onLogin }: UserContextType) => (
<Component {...props} onLogin={onLogin} />
)}
</UserContext.Consumer>
);
};
export const withUser = <Props>(
Component: React.ComponentType<{ user: User } & Props>,
) =>
function withUserHOC(props: Props) {
return (
<UserContext.Consumer>
{({ user }: UserContextType) => <Component {...props} user={user} />}
</UserContext.Consumer>
);
};
export const withSimpleToken = <Props>(
Component: React.ComponentType<{ simpleToken: ?string } & Props>,
) =>
function withSimpleTokenHOC(props: Props) {
return (
<UserContext.Consumer>
{({ simpleToken }: UserContextType) => (
<Component {...props} simpleToken={simpleToken} />
)}
</UserContext.Consumer>
);
};
export const withLoginToken = <Props>(
Component: React.ComponentType<{ loginToken: ?string } & Props>,
) =>
function withLoginTokenHOC(props: Props) {
return (
<UserContext.Consumer>
{ctx => <Component {...props} loginToken={ctx && ctx.loginToken} />}
</UserContext.Consumer>
);
};
export const withKwAuthToken = <Props>(
Component: React.ComponentType<{ kwAuthToken: ?string } & Props>,
) =>
function withKwAuthTokenHOC(props: Props) {
return (
<UserContext.Consumer>
{({ kwAuthToken }: UserContextType) => (
<Component {...props} kwAuthToken={kwAuthToken} />
)}
</UserContext.Consumer>
);
};
export const withToken = <Props>(
Component: React.ComponentType<{ ...TokenTypes } & Props>,
) =>
function withTokenHOC(props: Props) {
return (
<UserContext.Consumer>
{({ simpleToken, loginToken, kwAuthToken }: UserContextType) => (
<Component
{...props}
simpleToken={simpleToken}
loginToken={loginToken}
kwAuthToken={kwAuthToken}
/>
)}
</UserContext.Consumer>
);
};