diff --git a/03_source/mobile/src/data/user/user.actions.ts b/03_source/mobile/src/data/user/user.actions.ts index 0aecc72..aaeb1ba 100644 --- a/03_source/mobile/src/data/user/user.actions.ts +++ b/03_source/mobile/src/data/user/user.actions.ts @@ -15,13 +15,18 @@ import { endpoints } from '../../pages/MyLogin/endpoints'; export const loadUserData = () => async (dispatch: React.Dispatch) => { dispatch(setLoading(true)); + const data = await getUserData(); dispatch(setData(data)); + dispatch(setLoading(false)); }; export const setLoading = (isLoading: boolean) => - ({ type: 'set-user-loading', isLoading } as const); + ({ + type: 'set-user-loading', + isLoading, + } as const); export const setData = (data: Partial) => ({ @@ -30,6 +35,7 @@ export const setData = (data: Partial) => } as const); export const logoutUser = () => async (dispatch: React.Dispatch) => { + // await setIsLoggedInData(false); dispatch(setUsername()); }; @@ -44,6 +50,8 @@ export const setIsLoggedIn = (loggedIn: boolean) => async (dispatch: React.Dispa export const setUsername = (username?: string) => async (dispatch: React.Dispatch) => { await setUsernameData(username); + console.log('setUsername triggered'); + return { type: 'set-username', username, @@ -52,6 +60,7 @@ export const setUsername = (username?: string) => async (dispatch: React.Dispatc export const setAccessToken = (token?: string) => async (dispatch: React.Dispatch) => { await setAccessTokenData(token); + return { type: 'set-access-token', token, @@ -99,6 +108,7 @@ export const checkUserSession = () => async (dispatch: React.Dispatch) => { export const setHasSeenTutorial = (hasSeenTutorial: boolean) => async (dispatch: React.Dispatch) => { + debugger; await setHasSeenTutorialData(hasSeenTutorial); return { type: 'set-has-seen-tutorial', @@ -120,5 +130,4 @@ export type UserActions = | ActionType | ActionType | ActionType - // | ActionType | ActionType; diff --git a/03_source/mobile/src/data/user/user.reducer.ts b/03_source/mobile/src/data/user/user.reducer.ts index b378c42..f6e6acb 100644 --- a/03_source/mobile/src/data/user/user.reducer.ts +++ b/03_source/mobile/src/data/user/user.reducer.ts @@ -15,11 +15,9 @@ export function userReducer(state: UserState, action: UserActions): UserState { return { ...state, darkMode: action.darkMode }; case 'set-is-loggedin': return { ...state, isLoggedin: action.loggedIn }; + case 'set-access-token': + return { ...state, token: action.token }; case 'check-user-session': return { ...state, isSessionValid: action.sessionValid }; - // case 'set-active-session': - // return { ...state, session: action.session }; - // case 'set-access-token': - // return { ...state, token: action.token }; } } diff --git a/03_source/mobile/src/data/user/user.state.ts b/03_source/mobile/src/data/user/user.state.ts index aa2460c..56e5666 100644 --- a/03_source/mobile/src/data/user/user.state.ts +++ b/03_source/mobile/src/data/user/user.state.ts @@ -1,9 +1,9 @@ export interface UserState { - isLoggedin: boolean; - username?: string; - darkMode: boolean; - hasSeenTutorial: boolean; loading: boolean; + username?: string; + hasSeenTutorial: boolean; + darkMode: boolean; + isLoggedin: boolean; isSessionValid: boolean; session?: any; token?: string; diff --git a/03_source/mobile/src/pages/MyLogin/index.tsx b/03_source/mobile/src/pages/MyLogin/index.tsx index 591e107..eed20c4 100644 --- a/03_source/mobile/src/pages/MyLogin/index.tsx +++ b/03_source/mobile/src/pages/MyLogin/index.tsx @@ -74,6 +74,7 @@ const Login: React.FC = (props) => { setUsername: setUsernameAction, checkUserSession, isSessionValid, + isLoggedin, } = props; const history = useHistory(); @@ -103,9 +104,11 @@ const Login: React.FC = (props) => { // ---------- + // email: + // password: const defaultValues: SignInSchemaType = { - email: '', - password: '', + email: 'demo@minimals.c', + password: '@2Minimal', }; const methods = useForm({ @@ -137,10 +140,11 @@ const Login: React.FC = (props) => { }, [isSessionValid]); const onSubmit = handleSubmit(async (data) => { - console.log({ data }); + // console.log({ data }); + try { let token = await signInWithPassword({ email: values.email, password: values.password }); - console.log({ token }); + // console.log({ token }); if (token) setAccessToken(token); await checkUserSession(); diff --git a/03_source/mobile/src/pages/MyProfile/NotLoggedIn/SignUp.png b/03_source/mobile/src/pages/MyProfile/NotLoggedIn/SignUp.png new file mode 100644 index 0000000..c24fd58 Binary files /dev/null and b/03_source/mobile/src/pages/MyProfile/NotLoggedIn/SignUp.png differ diff --git a/03_source/mobile/src/pages/MyProfile/NotLoggedIn/index.tsx b/03_source/mobile/src/pages/MyProfile/NotLoggedIn/index.tsx index 5b0d5aa..7a78ffa 100644 --- a/03_source/mobile/src/pages/MyProfile/NotLoggedIn/index.tsx +++ b/03_source/mobile/src/pages/MyProfile/NotLoggedIn/index.tsx @@ -56,6 +56,7 @@ import AboutPopover from '../../../components/AboutPopover'; import paths from '../../../paths'; import { getProfileById } from '../../../api/getProfileById'; import { defaultMember, Member } from '../../MemberProfile/type'; +import SignUpPng from './SignUp.png'; interface OwnProps {} @@ -144,29 +145,53 @@ const MyProfile: React.FC = ({ speakers, speakerSessions }) =>
-
- not login yet,
- please login or sign up -
+ +
- - Login - +
+ not login yet,
+ please login or sign up +
+
+ + Login + +
diff --git a/03_source/mobile/src/pages/MyProfile/SignUp.png b/03_source/mobile/src/pages/MyProfile/SignUp.png new file mode 100644 index 0000000..c24fd58 Binary files /dev/null and b/03_source/mobile/src/pages/MyProfile/SignUp.png differ diff --git a/03_source/mobile/src/pages/MyProfile/index.tsx b/03_source/mobile/src/pages/MyProfile/index.tsx index 7cb27fb..2b56562 100644 --- a/03_source/mobile/src/pages/MyProfile/index.tsx +++ b/03_source/mobile/src/pages/MyProfile/index.tsx @@ -44,7 +44,14 @@ import '../SpeakerList.scss'; import { getEvents } from '../../api/getEvents'; import { format } from 'date-fns'; import { Event } from './types'; -import { alertOutline, chevronDownCircleOutline, createOutline, heart, menuOutline, settingsOutline } from 'ionicons/icons'; +import { + alertOutline, + chevronDownCircleOutline, + createOutline, + heart, + menuOutline, + settingsOutline, +} from 'ionicons/icons'; import AboutPopover from '../../components/AboutPopover'; import paths from '../../paths'; import { getProfileById } from '../../api/getProfileById'; @@ -54,6 +61,8 @@ import NotLoggedIn from './NotLoggedIn'; interface OwnProps {} interface StateProps { + isLoggedin: boolean; + // speakers: Speaker[]; speakerSessions: { [key: string]: Session[] }; } @@ -62,7 +71,9 @@ interface DispatchProps {} interface SpeakerListProps extends OwnProps, StateProps, DispatchProps {} -const MyProfile: React.FC = ({ speakers, speakerSessions }) => { +const MyProfilePage: React.FC = ({ speakers, speakerSessions, isLoggedin }) => { + if (!isLoggedin) return ; + const [profile, setProfile] = useState(defaultMember); const [showPopover, setShowPopover] = useState(false); @@ -94,7 +105,6 @@ const MyProfile: React.FC = ({ speakers, speakerSessions }) => }, []); if (!profile) return <>loading; - if (profile.id == -1) return ; return ( @@ -112,7 +122,12 @@ const MyProfile: React.FC = ({ speakers, speakerSessions }) => - + @@ -133,7 +148,10 @@ const MyProfile: React.FC = ({ speakers, speakerSessions }) => >
- Silhouette of a person's head + Silhouette of a person's head
= ({ speakers, speakerSessions }) =>
- +
@@ -179,7 +202,12 @@ const MyProfile: React.FC = ({ speakers, speakerSessions }) =>
Membership
7 of the exclusive privileges
- + Unlock
@@ -237,7 +265,12 @@ const MyProfile: React.FC = ({ speakers, speakerSessions }) => {/* REQ0079/event-filter */} - +
({ mapStateToProps: (state) => ({ speakers: selectors.getSpeakers(state), speakerSessions: selectors.getSpeakerSessions(state), + isLoggedin: state.user.isLoggedin, }), - component: React.memo(MyProfile), + component: React.memo(MyProfilePage), }); diff --git a/03_source/mobile/src/pages/Settings/index.tsx b/03_source/mobile/src/pages/Settings/index.tsx index a102644..934df4d 100644 --- a/03_source/mobile/src/pages/Settings/index.tsx +++ b/03_source/mobile/src/pages/Settings/index.tsx @@ -63,6 +63,7 @@ import { import AboutPopover from '../../components/AboutPopover'; import { OverlayEventDetail } from '@ionic/react/dist/types/components/react-component-lib/interfaces'; import paths from '../../paths'; +import { logoutUser, setAccessToken, setIsLoggedIn } from '../../data/user/user.actions'; interface OwnProps {} @@ -71,11 +72,21 @@ interface StateProps { speakerSessions: { [key: string]: Session[] }; } -interface DispatchProps {} +interface DispatchProps { + logoutUser: typeof logoutUser; + setAccessToken: typeof setAccessToken; + setIsLoggedIn: typeof setIsLoggedIn; +} interface SpeakerListProps extends OwnProps, StateProps, DispatchProps {} -const EventList: React.FC = ({ speakers, speakerSessions }) => { +const EventList: React.FC = ({ + speakers, + speakerSessions, + logoutUser, + setAccessToken, + setIsLoggedIn, +}) => { const [events, setEvents] = useState([]); const [showPopover, setShowPopover] = useState(false); const [popoverEvent, setPopoverEvent] = useState(); @@ -116,6 +127,11 @@ const EventList: React.FC = ({ speakers, speakerSessions }) => } function handleLogoutClick() { + setAccessToken(); + setIsLoggedIn(false); + + router.push('/tabs', 'forward', 'replace'); + setShowLogoutConfirmModal(false); } function handleLogoutCancel() { @@ -190,7 +206,11 @@ const EventList: React.FC = ({ speakers, speakerSessions }) => {/* REQ0058/logout */} - + ({ speakers: selectors.getSpeakers(state), speakerSessions: selectors.getSpeakerSessions(state), }), + mapDispatchToProps: { + logoutUser, + setAccessToken, + setIsLoggedIn, + }, component: React.memo(EventList), });