23/12/08 til 공용화
2023. 12. 11. 08:19ㆍ카테고리 없음
두번이상 쓰이는 일반 함수 커스텀훅 컴포넌트 한개를 한파일에 담아보았다.
import {collection, addDoc, setDoc, getDocs, deleteDoc, doc} from 'firebase/firestore';
import {auth, db} from '../../shared/firebase';
import {setList} from '../../redux/modules/fixList';
import {useDispatch, useSelector} from 'react-redux';
import {useEffect} from 'react';
import Button from './Button';
import {toast} from 'react-toastify';
export const useReadFirestore = async () => { //파이어스토어의 데이터를 읽어와서
const dispatch = useDispatch(); //리덕스의 스테이트를 변경까지 하는 로직을
const dataReading = async () => { //한번에 담아서 커스텀훅을 만들어보았다.
const querySnapshot = await getDocs(collection(db, 'fixs'));
let dataArr = [];
querySnapshot.forEach(doc => {
const data = doc.data(); //여기까지가 파이어스토어의 데이터 받아오기
// console.log(data, ' 이게 독 아이디');
dataArr.push({...data, id: doc.id});
// console.log(data.createdAt, '이게그거');
dataArr = dataArr.sort((a, b) => b.createdAt - a.createdAt); //시간순으로 데이터를 나열하고
});
dispatch(setList(dataArr)); //디스패치로 스테이트 변경까지 시킨다.
};
useEffect(() => {
// console.log('리랜더링 되니?'); //안에 유즈 이펙트까지 두어서 새로고침시 작동하도록 세팅
dataReading();
}, []);
};
export const Update = async (photoURL, displayName, filteredList, dispatch, dataReading) => {
try {
const updatePromises = filteredList.map(async item => {
await setDoc(doc(db, 'fixs', `${item.id}`), {
...item,
displayName, //여기는 프로필과 닉네임을 변경하는 함수를 만들었다.
photoURL, //filterdList를 인자로 쓰이는 곳에서 내려받고
}); //다른 아이템은 유지한체 displayName, photoURL,
}); //만 변경로직
await Promise.all(updatePromises);
dataReading(); //여기서 위에서 만든 데이타 리딩을 한번해준다.
dispatch(
setList( //데이터리스트의 디스패치는 유즈이펙트안에 있으므로
filteredList.map(item => ({ //여기서 디스패치 한번더 써서 스테이트를 변경해 줌으로써
...item, //리랜더링 시킨다.
displayName,
photoURL,
})),
),
);
toast.success('수정성공!', {
position: 'top-center',
autoClose: 3000,
hideProgressBar: false,
closeOnClick: true,
pauseOnHover: true,
draggable: false,
progress: undefined,
theme: 'colored',
});
} catch (error) {
console.error('업데이트 중 오류 발생:', error);
}
};
export default function EditBtn() { //컴포넌트화 시킨 함수
const list = useSelector(state => state.fixList);
const {isLogin, displayName, uid, photoURL, email} = useSelector(state => state.auth);
const filteredList = list.filter(item => {
return item.uid == auth.currentUser.uid;
}); //훅은 컴포넌트 하위에서만 설정할수 있다는게
const dispatch = useDispatch(); //너무 어렵다.
const dataReading = async () => {
const querySnapshot = await getDocs(collection(db, 'fixs'));
let dataArr = [];
querySnapshot.forEach(doc => {
const data = doc.data();
// console.log(data, ' 이게 독 아이디');
dataArr.push({...data, id: doc.id});
// console.log(data.createdAt, '이게그거');
dataArr = dataArr.sort((a, b) => b.createdAt - a.createdAt);
});
dispatch(setList(dataArr));
};
return <Button onClick={() => Update(photoURL, displayName, filteredList, dispatch, dataReading)}>수정적용</Button>;
} //버튼 처럼 사용하기 위해 리턴값을 버튼으로 만듦
위에 만든 커스텀훅을 사용하기 위해서는 원하는 파일에서
import {useReadFirestore} from '../components/UI/CustomHook';
useReadFirestore();
해당 컴포넌트를 임포트하고 사용하면 끝