mirror of
https://github.com/Stremio/stremio-web.git
synced 2026-04-21 03:22:11 +00:00
useUser implemented with useModelState
This commit is contained in:
parent
15348b9ad6
commit
468f597673
3 changed files with 27 additions and 40 deletions
|
|
@ -2,7 +2,6 @@ const React = require('react');
|
||||||
const PropTypes = require('prop-types');
|
const PropTypes = require('prop-types');
|
||||||
const classnames = require('classnames');
|
const classnames = require('classnames');
|
||||||
const Icon = require('stremio-icons/dom');
|
const Icon = require('stremio-icons/dom');
|
||||||
const { useServices } = require('stremio/services');
|
|
||||||
const Button = require('stremio/common/Button');
|
const Button = require('stremio/common/Button');
|
||||||
const Popup = require('stremio/common/Popup');
|
const Popup = require('stremio/common/Popup');
|
||||||
const useBinaryState = require('stremio/common/useBinaryState');
|
const useBinaryState = require('stremio/common/useBinaryState');
|
||||||
|
|
@ -11,10 +10,9 @@ const useUser = require('stremio/common/useUser');
|
||||||
const styles = require('./styles');
|
const styles = require('./styles');
|
||||||
|
|
||||||
const NavMenu = ({ className }) => {
|
const NavMenu = ({ className }) => {
|
||||||
const { core } = useServices();
|
|
||||||
const [menuOpen, openMenu, closeMenu, toggleMenu] = useBinaryState(false);
|
const [menuOpen, openMenu, closeMenu, toggleMenu] = useBinaryState(false);
|
||||||
const [fullscreen, requestFullscreen, exitFullscreen] = useFullscreen();
|
const [fullscreen, requestFullscreen, exitFullscreen] = useFullscreen();
|
||||||
const user = useUser();
|
const [user, logout] = useUser();
|
||||||
const popupLabelOnClick = React.useCallback((event) => {
|
const popupLabelOnClick = React.useCallback((event) => {
|
||||||
if (!event.nativeEvent.togglePopupPrevented) {
|
if (!event.nativeEvent.togglePopupPrevented) {
|
||||||
toggleMenu();
|
toggleMenu();
|
||||||
|
|
@ -24,12 +22,7 @@ const NavMenu = ({ className }) => {
|
||||||
event.nativeEvent.togglePopupPrevented = true;
|
event.nativeEvent.togglePopupPrevented = true;
|
||||||
}, []);
|
}, []);
|
||||||
const logoutButtonOnClick = React.useCallback(() => {
|
const logoutButtonOnClick = React.useCallback(() => {
|
||||||
core.dispatch({
|
logout();
|
||||||
action: 'UserOp',
|
|
||||||
args: {
|
|
||||||
userOp: 'Logout'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}, []);
|
}, []);
|
||||||
return (
|
return (
|
||||||
<Popup
|
<Popup
|
||||||
|
|
@ -48,17 +41,17 @@ const NavMenu = ({ className }) => {
|
||||||
<div
|
<div
|
||||||
className={styles['avatar-container']}
|
className={styles['avatar-container']}
|
||||||
style={{
|
style={{
|
||||||
backgroundImage: !user ?
|
backgroundImage: user === null ?
|
||||||
`url('/images/anonymous.png')`
|
`url('/images/anonymous.png')`
|
||||||
:
|
:
|
||||||
`url('${user.avatar}'), url('/images/default_avatar.png')`
|
`url('${user.avatar}'), url('/images/default_avatar.png')`
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
<div className={styles['email-container']}>
|
<div className={styles['email-container']}>
|
||||||
<div className={styles['email-label']}>{!user ? 'Anonymous user' : user.email}</div>
|
<div className={styles['email-label']}>{user === null ? 'Anonymous user' : user.email}</div>
|
||||||
</div>
|
</div>
|
||||||
<Button className={styles['logout-button-container']} title={!user ? 'Log in / Sign up' : 'Log out'} href={'#/intro'} onClick={logoutButtonOnClick}>
|
<Button className={styles['logout-button-container']} title={user === null ? 'Log in / Sign up' : 'Log out'} href={'#/intro'} onClick={logoutButtonOnClick}>
|
||||||
<div className={styles['logout-label']}>{!user ? 'Log in / Sign up' : 'Log out'}</div>
|
<div className={styles['logout-label']}>{user === null ? 'Log in / Sign up' : 'Log out'}</div>
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles['nav-menu-section']}>
|
<div className={styles['nav-menu-section']}>
|
||||||
|
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
||||||
const React = require('react');
|
|
||||||
|
|
||||||
const useUser = () => {
|
|
||||||
const [user] = React.useState({
|
|
||||||
email: '',
|
|
||||||
avatar: '',
|
|
||||||
anonymous: true,
|
|
||||||
logout: () => { }
|
|
||||||
});
|
|
||||||
return user;
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = useUser;
|
|
||||||
|
|
@ -1,23 +1,30 @@
|
||||||
const React = require('react');
|
const React = require('react');
|
||||||
const { useServices } = require('stremio/services');
|
const { useServices } = require('stremio/services');
|
||||||
|
const useModelState = require('stremio/common/useModelState');
|
||||||
|
|
||||||
|
const initUserState = () => null;
|
||||||
|
|
||||||
|
const mapUserState = (ctx) => {
|
||||||
|
return ctx.content.auth ? ctx.content.auth.user : null;
|
||||||
|
};
|
||||||
|
|
||||||
const useUser = () => {
|
const useUser = () => {
|
||||||
const { core } = useServices();
|
const { core } = useServices();
|
||||||
const [user, setUser] = React.useState(() => {
|
const logout = React.useCallback(() => {
|
||||||
const state = core.getState();
|
core.dispatch({
|
||||||
return state.ctx.content.auth ? state.ctx.content.auth.user : null;
|
action: 'UserOp',
|
||||||
});
|
args: {
|
||||||
React.useEffect(() => {
|
userOp: 'Logout'
|
||||||
const onNewState = () => {
|
}
|
||||||
const state = core.getState();
|
});
|
||||||
setUser(state.ctx.content.auth ? state.ctx.content.auth.user : null);
|
|
||||||
};
|
|
||||||
core.on('NewModel', onNewState);
|
|
||||||
return () => {
|
|
||||||
core.off('NewModel', onNewState);
|
|
||||||
};
|
|
||||||
}, []);
|
}, []);
|
||||||
return user;
|
const user = useModelState({
|
||||||
|
model: 'ctx',
|
||||||
|
action: null,
|
||||||
|
map: mapUserState,
|
||||||
|
init: initUserState
|
||||||
|
});
|
||||||
|
return [user, logout];
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = useUser;
|
module.exports = useUser;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue