어제 있었던 invalid input에 대해 알아봤지만
데이터를 직렬화 하여 insert 하지 않아도
다른 DB에는 잘 insert 되는 것을 확인하였고
결론은 테이블 셋팅 단계에서 문제가 있던 거 같다.
메세지 테이블과, 채팅방 테이블 설정을 다시 하는 것으로
문제를 해결했다!
const makeChatRoom = async (e: MouseEvent<HTMLButtonElement>) => {
// 클릭하는 버튼에 있는 상대방 유저 id
const id = e.currentTarget.id;
try {
// 현재 로그인 된 유저가 있고, 로그인 유저의 identities가 undefined가 아닐 때
if (curUser && curUser.identities !== undefined) {
// chat_room 테이블의 participants 필드에 row를 insert한다
// row에 들어가는 속성은 테스트를 위해 간소하게
// 로그인 된 유저의 id와 관련 정보, 상대방 유저의 id와 관련 정보를 담았다..
const { data, error } = await supabase.from("chat_room").insert([
{
participants: [
{ user_id: id, user_name: "test1" },
{
user_id: curUser.id,
user2_name: "test2",
},
],
},
]);
}
} catch (err) {
console.log("failed", err);
}
};
// 현재 로그인 된 유저의 채팅방을 가져오는 함수
const getRoomsforUser = async () => {
// 일단 모든 채팅방을 가져온 후
try {
const { data: chat_room, error } = await supabase
.from("chat_room")
.select("*");
if (error) {
console.error("채팅방 가져오기 실패", error);
return;
}
// chat_room과 현재 로그인 유저 정보가 있다면
if (chat_room && curUser) {
// 가져온 채팅방 목록의 participants를 순회하며
const filtered = chat_room.filter((room: any) => {
// 현재 로그인 된 유저가 속한 채팅방만 filter한다.
return room.participants.some(
(participant: any) => participant.user_id === curUser.id
);
});
setRooms(filtered);
}
} catch (error) {
console.error("소속 된 채팅방이 없습니다", error);
}
};
const sendMessage = async (e: FormEvent) => {
e.preventDefault();
if (curUser) {
const { data, error } = await supabase.from("chat_messages").insert([
{
sender_id: curUser?.id,
// 채팅방을 클릭 시, 클릭 된 채팅방 id를 저장하는 state가 clicked이다.
chat_room_id: clicked,
content: chatInput,
},
]);
}
};
useEffect(() => {
// mount 시 유저 정보를 가져오는 함수
const getUserData = async () => {
const { data, error } = await supabase.auth.getUser();
if (data) {
setCurUser(data.user);
} else {
console.log("user data is empty");
}
}
};
getUserData();
}, []);
// 로그인 된 유저 정보가 변하고, 그 정보가 있을 경우 채팅방 fetch
useEffect(() => {
if (curUser) {
getRoomsforUser();
}
}, [curUser]);