init commit,

This commit is contained in:
louiscklaw
2025-05-28 09:55:51 +08:00
commit efe70ceb69
8042 changed files with 951668 additions and 0 deletions

View File

@@ -0,0 +1,147 @@
// REQ0044/near_by_page
import React, { useEffect, useRef, useState } from 'react';
import {
IonHeader,
IonToolbar,
IonTitle,
IonContent,
IonPage,
IonButtons,
IonMenuButton,
IonGrid,
IonRow,
IonCol,
useIonRouter,
IonButton,
IonIcon,
IonPopover,
IonAvatar,
IonImg,
IonItem,
IonLabel,
IonList,
IonModal,
IonSearchbar,
useIonModal,
IonInput,
RefresherEventDetail,
IonRefresher,
IonRefresherContent,
} from '@ionic/react';
import SpeakerItem from '../../components/SpeakerItem';
import { Speaker } from '../../models/Speaker';
import { Session } from '../../models/Schedule';
import { connect } from '../../data/connect';
import * as selectors from '../../data/selectors';
import '../SpeakerList.scss';
import { getEvents } from '../../api/getEvents';
import { format } from 'date-fns';
import { Event } from './types';
import { chevronDownCircleOutline, heart, menuOutline } from 'ionicons/icons';
import AboutPopover from '../../components/AboutPopover';
import { SampleMember } from '../MemberProfile/SampleMember';
import { getMembers } from '../../api/getMembers';
import { Member } from '../MemberProfile/type';
import Loading from '../../components/Loading';
interface OwnProps {}
interface StateProps {
nearbyMembers: Member[];
}
interface DispatchProps {}
interface SpeakerListProps extends OwnProps, StateProps, DispatchProps {}
function MemberCell({ member }: { member: Member }) {
const router = useIonRouter();
return (
<>
<div style={{ display: 'flex', margin: '1rem', gap: '1rem' }}>
<IonAvatar>
<img alt="Silhouette of a person's head" src="https://images.unsplash.com/photo-1589419621083-1ead66c96fa7" />
</IonAvatar>
<div style={{ display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>
<div style={{ display: 'flex', gap: '0.5rem' }}>
<div>{member.name}</div>
<div>{member.age}</div>
<div>{member.rank}</div>
<div>{member.verified}</div>
</div>
<div style={{ display: 'flex' }}>
<div>{member.hobbies[0]}, </div>
<div>{member.hobbies[1]}, </div>
<div>{member.hobbies[2]}</div>
</div>
<div>
{SampleMember.distance}, {SampleMember.location_area}
</div>
</div>
</div>
</>
);
}
const MembersNearByList: React.FC<SpeakerListProps> = ({ nearbyMembers }) => {
const router = useIonRouter();
function handleMemberCellClick(id: string) {
router.push(`/profile/${id}`);
}
function handleRefresh(event: CustomEvent<RefresherEventDetail>) {
setTimeout(() => {
// Any calls to load data go here
event.detail.complete();
}, 2000);
}
if (!nearbyMembers || nearbyMembers.length == 0) return <Loading />;
return (
<IonPage id="speaker-list">
<IonHeader translucent={true} className="ion-no-border">
<IonToolbar>
<IonButtons slot="end">
{/* <IonMenuButton /> */}
<IonButton shape="round" id="open-modal" expand="block">
<IonIcon slot="icon-only" icon={menuOutline}></IonIcon>
</IonButton>
</IonButtons>
<IonTitle>My Nearby</IonTitle>
</IonToolbar>
</IonHeader>
<IonContent fullscreen={true}>
<IonRefresher slot="fixed" onIonRefresh={handleRefresh}>
<IonRefresherContent pullingIcon={chevronDownCircleOutline} pullingText="Pull to refresh" refreshingSpinner="circles" refreshingText="Refreshing..."></IonRefresherContent>
</IonRefresher>
<IonHeader collapse="condense">
<IonToolbar>
<IonTitle size="large">My Nearby</IonTitle>
</IonToolbar>
</IonHeader>
<IonList>
{nearbyMembers.map((member, idx) => (
<IonItem key={idx} button onClick={() => handleMemberCellClick(member.id.toString())}>
<MemberCell member={member}></MemberCell>
</IonItem>
))}
</IonList>
</IonContent>
</IonPage>
);
};
export default connect<OwnProps, StateProps, DispatchProps>({
mapStateToProps: (state) => ({
nearbyMembers: selectors.getNearbyMembers(state),
}),
component: React.memo(MembersNearByList),
});