feat: implement party user authentication system with signin/signup routes, JWT token validation, and frontend integration including mobile route configuration and API service updates

This commit is contained in:
louiscklaw
2025-06-18 01:14:05 +08:00
parent 4cf93f431e
commit c93b31b2f6
30 changed files with 1008 additions and 67 deletions

View File

@@ -57,6 +57,7 @@ import PATHS from '../../PATHS';
import { getProfileById } from '../../api/getProfileById';
import { defaultMember, Member } from '../MemberProfile/type';
import NotLoggedIn from './NotLoggedIn';
import { UserState } from '../../data/user/user.state';
interface OwnProps {}
@@ -65,13 +66,20 @@ interface StateProps {
//
speakers: Speaker[];
speakerSessions: { [key: string]: Session[] };
//
partyUserState: UserState;
}
interface DispatchProps {}
interface SpeakerListProps extends OwnProps, StateProps, DispatchProps {}
interface PageProps extends OwnProps, StateProps, DispatchProps {}
const MyProfilePage: React.FC<SpeakerListProps> = ({ speakers, speakerSessions, isLoggedin }) => {
const MyProfilePage: React.FC<PageProps> = ({
speakers,
speakerSessions,
isLoggedin,
partyUserState,
}) => {
if (!isLoggedin) return <NotLoggedIn />;
const [profile, setProfile] = useState<Member>(defaultMember);
@@ -97,13 +105,6 @@ const MyProfilePage: React.FC<SpeakerListProps> = ({ speakers, speakerSessions,
}, 2000);
}
useEffect(() => {
getProfileById('2').then(({ data }) => {
console.log({ data });
setProfile(data);
});
}, []);
if (!profile) return <>loading</>;
return (
@@ -150,21 +151,24 @@ const MyProfilePage: React.FC<SpeakerListProps> = ({ speakers, speakerSessions,
<IonAvatar>
<img
alt="Silhouette of a person's head"
src="https://plus.unsplash.com/premium_photo-1683121126477-17ef068309bc"
src={partyUserState.avatarUrl ? partyUserState.avatarUrl : ''}
/>
</IonAvatar>
<div style={{ flexGrow: 1 }}>
<div
style={{
//
display: 'flex',
gap: '1rem',
alignItems: 'center',
}}
>
<div style={{ fontSize: '1.2rem', fontWeight: 'bold' }}>{profile.name}</div>
<div style={{ fontSize: '0.8rem' }}>{profile.rank}</div>
<div style={{ fontSize: '0.8rem' }}>{profile.verified}</div>
<div style={{ fontSize: '1.2rem', fontWeight: 'bold' }}>
{partyUserState.name}
</div>
<div style={{ fontSize: '0.8rem' }}>{partyUserState.rank}</div>
<div style={{ fontSize: '0.8rem' }}>
{partyUserState.isVerified ? 'verified' : 'no'}
</div>
</div>
</div>
<div>
@@ -337,6 +341,8 @@ export default connect<OwnProps, StateProps, DispatchProps>({
speakers: selectors.getSpeakers(state),
speakerSessions: selectors.getSpeakerSessions(state),
isLoggedin: state.user.isLoggedin,
//
partyUserState: selectors.getPartyUserState(state),
}),
component: React.memo(MyProfilePage),
});