Skip to content

Commit

Permalink
Add: RealTimeRequest initializing & Each Kids Componentization & Kids…
Browse files Browse the repository at this point in the history
… init styling & Function Check
  • Loading branch information
in63119 committed Apr 14, 2024
1 parent 4e48421 commit 258d4f8
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 49 deletions.
58 changes: 54 additions & 4 deletions Front-end/src/components/institution/RequestKid.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,61 @@ interface RequestKidProps {
index: number;
}

const RequestKid = (props: RequestKidProps) => {
console.log(props);
return <Container>test</Container>;
const RequestKid: React.FC<RequestKidProps> = ({ name, gender, birth, index }) => {
return (
<KidContainer>
<KidIndex>{index + 1}</KidIndex>
<KidInfo>
<KidName>{name}</KidName>
<KidDetails>
<KidBirth>{birth}</KidBirth>
<KidGender>{gender}</KidGender>
</KidDetails>
</KidInfo>
</KidContainer>
);
};

export default RequestKid;

const Container = styled.button``;
const KidContainer = styled.div`
display: flex;
align-items: center;
padding: 10px;
margin: 5px 0;
background-color: #f8f8f8;
border-radius: 8px;
`;

const KidIndex = styled.div`
display: flex;
justify-content: center;
align-items: center;
width: 30px;
height: 30px;
margin-right: 15px;
background-color: #e1e1e1;
border-radius: 50%;
font-weight: bold;
`;

const KidInfo = styled.div`
flex-grow: 1;
`;

const KidName = styled.div`
font-size: 1rem;
font-weight: bold;
margin-bottom: 5px;
`;

const KidDetails = styled.div`
font-size: 0.9rem;
color: #666;
`;

const KidBirth = styled.span`
margin-right: 10px;
`;

const KidGender = styled.span``;
22 changes: 13 additions & 9 deletions Front-end/src/db/firestore.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { initializeApp, FirebaseApp } from 'firebase/app';
import { getFirestore } from 'firebase/firestore';
import { initializeApp, getApps, getApp } from 'firebase/app';
import { getFirestore, Firestore } from 'firebase/firestore';

// Firebase
const firebaseConfig = {
Expand All @@ -12,12 +12,16 @@ const firebaseConfig = {
measurementId: process.env.REACT_APP_FIREBASE_MEASUREMENT_ID,
};

export const initialization = () => {
try {
const app: FirebaseApp = initializeApp(firebaseConfig);
const db = getFirestore(app);
return { app, db };
} catch (e) {
console.log('initialization : ', e);
let app;
let db;

export const initialization = (): Firestore => {
if (!getApps().length) {
app = initializeApp(firebaseConfig);
db = getFirestore(app);
} else {
app = getApp();
db = getFirestore(app);
}
return db;
};
2 changes: 1 addition & 1 deletion Front-end/src/db/query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export async function withFirestore<T>(operation: (db: Firestore) => Promise<T>)
if (!initializationResult) {
throw new Error('Database initialization failed');
}
const { db } = initializationResult;
const db = initializationResult;
return operation(db);
} catch (error) {
console.error(error);
Expand Down
91 changes: 56 additions & 35 deletions Front-end/src/pages/institution/RegistrationRequest.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ import React, { useState, useEffect } from 'react';
import { useNavigate } from 'react-router-dom';
import styled from 'styled-components';
import fonts from 'constants/fonts';
import { RegistrationItem } from 'utils/type';

// DB
import { firestore } from '../../utils/firestore';
import { onSnapshot, query, collection } from 'firebase/firestore';
import { initialization } from 'db/firestore';
import { query, collection, onSnapshot } from 'firebase/firestore';

// Component
import Header from 'components/Header';
Expand All @@ -15,48 +16,48 @@ import RequestKid from 'components/institution/RequestKid';
import { useRecoilValue } from 'recoil';
import { institutionState } from '../../recoil/institutionState';

interface RegistrationItem {
birth: string;
gender: string;
institution: string;
isRegistered?: boolean;
name: string;
interface StyledSelected {
selected: boolean;
}

const RegistrationRequest = ({ hasGoback = true }) => {
const institution = useRecoilValue(institutionState);
const [realTimeRequest, setRealTimeRequest] = useState<RegistrationItem[]>([]);
const q = query(collection(firestore, 'institution', `${institution.name}`, 'RegistrationRequest'));
const [selectedKids, setSelectedKids] = useState<Set<number>>(new Set());
const navigate = useNavigate();
const db = initialization();

const goBackHandler = () => {
navigate(-1);
};

const toggleSelection = (index: number) => {
setSelectedKids((prevSelected) => {
const newSelected = new Set(prevSelected);
if (newSelected.has(index)) {
newSelected.delete(index);
} else {
newSelected.add(index);
}
return newSelected;
});
};

useEffect(() => {
const unsubscribe = onSnapshot(
q,
(querySnapshot) => {
const requests: RegistrationItem[] = [];

querySnapshot.forEach((doc) => {
const data: RegistrationItem = doc.data() as RegistrationItem;
if (data) {
requests.push(data);
}
const fetchRealTimeRequests = () => {
const realTimeRequestsQuery = query(collection(db, 'institution', institution.name, 'RegistrationRequest'));
onSnapshot(realTimeRequestsQuery, (snapshot) => {
const realTimeRequestList = snapshot.docs.map((doc) => {
const { birth, gender, institution, name } = doc.data();
console.log(doc.data());
return { birth, gender, institution, name };
});

setRealTimeRequest(requests);
},
(err) => {
console.log('TODO: error 처리 일관화', err);
},
);

return () => {
unsubscribe();
setRealTimeRequest(realTimeRequestList);
});
};
}, [q]);

fetchRealTimeRequests();
}, [db, institution.name]);

return (
<Container>
Expand All @@ -67,12 +68,10 @@ const RegistrationRequest = ({ hasGoback = true }) => {
{realTimeRequest.length === 0
? null
: realTimeRequest?.map((kid: RegistrationItem, i: number) => (
<div key={i}>
<div>
{kid.name} {kid.gender} {kid.birth}
</div>
<KidContainer key={i} selected={selectedKids.has(i)} onClick={() => toggleSelection(i)}>
<RequestKid name={kid.name} gender={kid.gender} birth={kid.birth} index={i} />
</div>
<SelectionIndicator selected={selectedKids.has(i)} />
</KidContainer>
))}
</Container>
);
Expand Down Expand Up @@ -105,3 +104,25 @@ const HeaderContainer = styled.div`
align-items: center;
padding: 16px;
`;

const KidContainer = styled.div<StyledSelected>`
display: flex;
align-items: center;
background-color: ${({ selected }) => (selected ? '#E0F7FA' : 'transparent')};
transition: background-color 0.3s;
cursor: pointer;
&:hover {
background-color: #e0f7fa;
}
`;

const SelectionIndicator = styled.div<StyledSelected>`
width: 20px;
height: 20px;
border: 2px solid #009688;
border-radius: 50%;
margin-left: auto;
background-color: ${({ selected }) => (selected ? '#009688' : 'transparent')};
transition: background-color 0.3s;
`;
8 changes: 8 additions & 0 deletions Front-end/src/utils/type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,11 @@ type requestKidInfo = {
isRegistered: boolean;
name: string;
};

export interface RegistrationItem {
birth: string;
gender: string;
institution: string;
isRegistered?: boolean;
name: string;
}

0 comments on commit 258d4f8

Please sign in to comment.