TIL

2024.04.22 TIL #์ฑ„ํŒ…๋ฐฉ_๋‚˜๊ฐ€๊ธฐ #๋‚˜๋Š”_๋‚˜๊ฐ€๋Š”๋ฐ_๋„ˆ๋Š”? #type_์ง€์ •

inz1234 2024. 5. 11. 18:39

๐Ÿ“Œ Task TODOLIST

- [x] ์ฑ„ํŒ…๋ฐฉ ๋‚˜๊ฐ€๊ธฐ ๋ฒ„ํŠผ

- [x] ์ฑ„ํŒ…๋ฐฉ ๋‚˜๊ฐˆ ์‹œ ์ฒ˜๋ฆฌ("chattng_room" ํ…Œ์ด๋ธ” ๋ณ€๊ฒฝ, "room" ํ…Œ์ด๋ธ” ๋ณ€๊ฒฝ, "participants" ํ…Œ์ด๋ธ” ๋ณ€๊ฒฝ, "remember_last_msg" ํ…Œ์ด๋ธ” ๋ณ€๊ฒฝ, storage์—์„œ ํ•ด๋‹น ์œ ์ €์˜ ์ด๋ฏธ์ง€๋“ค ์‚ญ์ œ)

- [x] ๋‚จ์•„์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ


โœจ ๊ฐœ๋ฐœ ๋‚ด์šฉ

1. ์ฑ„ํŒ…๋ฐฉ ๋‚˜๊ฐˆ ์‹œ ์ฒ˜๋ฆฌ

- "chattng_room" ํ…Œ์ด๋ธ” ๋ณ€๊ฒฝ

- "room" ํ…Œ์ด๋ธ” ๋ณ€๊ฒฝ

- "participants" ํ…Œ์ด๋ธ” ๋ณ€๊ฒฝ

- "remember_last_msg" ํ…Œ์ด๋ธ” ๋ณ€๊ฒฝ

- storage์—์„œ ํ•ด๋‹น ์œ ์ €์˜ ์ด๋ฏธ์ง€๋“ค ์‚ญ์ œ

 

Why(์ด์œ ) ?

ํ•œ ๋ช…์ด ์ฑ„ํŒ…๋ฐฉ์„ ๋‚˜๊ฐ€๋ฉด ํ•ด์•ผํ•  ์ฒ˜๋ฆฌ๋“ค์ด ์ •๋ง ๋งŽ๋‹ค. ๋‚˜์—ดํ•ด๋ณด์ž๋ฉด

- "chatting_room" table์—์„œ ํ•ด๋‹น ์ฑ„ํŒ…๋ฃธ์˜ isActive ์ƒํƒœ๋ฅผ false๋กœ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•˜๊ณ 

- "room" table์—์„œ ํ•ด๋‹น ๋ฐฉ์˜ ๋ฆฌ๋” ๋ณ€๊ฒฝ + room_status๋ฅผ "๋ชจ์ง‘์ค‘"์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๊ณ 

- "participants" table์—์„œ ๋‚˜๊ฐ€๊ธฐ๋ฅผ ๋ˆ„๋ฅธ ์œ ์ €์˜ isDeleted ์†์„ฑ์„ true๋กœ ๋ณ€๊ฒฝํ•˜๊ณ 

- ๊ทธ ๋’ค์—(๋น„๋™๊ธฐ ๋กœ์ง์˜ ๋™๊ธฐ์ฒ˜๋ฆฌ) ๋‚จ์•„์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋ˆ„๊ตฌ์ธ์ง€ ํ™•์ธํ•˜๊ณ  

- "remeber_last_msg" table์—์„œ ๋‚˜๊ฐ€๊ธฐ๋ฅผ ๋ˆ„๋ฅธ ์œ ์ €๊ฐ€ ์ฝ์€ ํ•ด๋‹น ์ฑ„ํŒ…๋ฐฉ์— ๋งˆ์ง€๋ง‰ ๋ฉ”์„ธ์ง€๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•˜๊ณ 

- storage์— ํ•ด๋‹น ์œ ์ €๊ฐ€ ์ฑ„ํŒ…๋ฐฉ์— ์˜ฌ๋ ธ๋˜ ์ด๋ฏธ์ง€๋“ค์„ ์‚ญ์ œํ•ด์•ผํ•œ๋‹ค.(๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”)

 

How(๊ณผ์ •) ?

๊ฐ ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

// ์ฑ„ํŒ…๋ฐฉ isActive ์ƒํƒœ๋ฅผ false๋กœ ๋ณ€๊ฒฝ
  const updateIsActiveFalse = async () => {
    const { error: updateActiveErr } = await clientSupabase
      .from('chatting_room')
      .update({ isActive: false })
      .eq('chatting_room_id', chatRoomId);
    if (updateActiveErr) {
      alert('์ฑ„ํŒ…๋ฐฉ ๋น„ํ™œ์„ฑํ™”์— ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค.');
      console.error(updateActiveErr.message);
    }
  };

  // room ํ…Œ์ด๋ธ”์—์„œ ๋ฆฌ๋” ๋ณ€๊ฒฝ + room_status: "๋ชจ์ง‘์ค‘" + participants ํ…Œ์ด๋ธ”์—์„œ ํ•ด๋‹น ๋ฃธ์— ๋Œ€ํ•œ ์œ ์ €์ •๋ณด isDeleted: true๋กœ
  const getRidOfMe = async () => {
    if (user?.user_id === leader_id) {
      const { error: updateLeaderErr } = await clientSupabase
        .from('room')
        .update({
          leader_id: participants?.find((person) => person.user_id !== user?.user_id)?.user_id,
          room_status: '๋ชจ์ง‘์ค‘'
        })
        .eq('room_id', room_id);
      if (updateLeaderErr) console.error('fail to update leader of room', updateLeaderErr.message);
    }
    const { error: deleteErr } = await clientSupabase
      .from('participants')
      .update({ isDeleted: true })
      .eq('room_id', room_id)
      .eq('user_id', user?.user_id!);
    if (deleteErr) {
      console.error(deleteErr.message);
      alert('์ฑ„ํŒ…๋ฐฉ ๋‚˜๊ฐ€๊ธฐ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.');
    }
  };

  // ๋‚จ์•„์žˆ๋Š” ์‚ฌ๋žŒ์ธ์ง€ ๋‚˜๊ฐ„์‚ฌ๋žŒ์ธ์ง€ isRest ์ƒํƒœ๋ณ€๊ฒฝ์œผ๋กœ ํ™”๋ฉด ๋ Œ๋”๋ง ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜
  const handleIsRest = async () => {
    const { data: restOf, error: getPartErr } = await clientSupabase
      .from('participants')
      .select('user_id')
      .eq('room_id', room_id)
      .eq('isDeleted', false);
    if (getPartErr) {
      console.error(getPartErr.message);
      alert('์ฐธ๊ฐ€์ž๋“ค ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.');
    } else {
      const restArr = restOf.map((r) => r.user_id);
      setisRest(restArr.includes(user?.user_id!) as boolean);
    }
  };

  // ๋งˆ์ง€๋ง‰ ๋ฉ”์„ธ์ง€ ์‚ญ์ œ
  const deleteLastMsg = async () => {
    const { error } = await clientSupabase.from('remember_last_msg').delete().eq('chatting_room_id', chatRoomId);
    if (error) console.error('remember_last_msg table์— ํ•ด๋‹น ์ฑ„ํŒ…๋ฐฉ ๊ด€๋ จ ์ •๋ณด ์‚ญ์ œ ์‹คํŒจ');
  };

  // ํ•ด๋‹น ์œ ์ €๊ฐ€ ๋‚จ๊ธด ์ฑ„ํŒ…์ฐฝ์˜ ์ด๋ฏธ์ง€๋“ค ์ง€์šฐ๊ธฐ
  const deleteTheUserImgs = async () => {
    const { error: imgStorageErr, data: usersAllImgList } = await clientSupabase.storage
      .from('chatImg')
      .list(`${chatRoomId}/${user?.user_id}`);
    if (imgStorageErr) {
      console.error('storage remove fail', imgStorageErr.message);
    } else {
      const filesToRemove = usersAllImgList.map((x) => `${chatRoomId}/${user?.user_id}/${x.name}`);

      if (filesToRemove && filesToRemove.length) {
        const { error: deleteFilesErr } = await clientSupabase.storage.from('chatImg').remove(filesToRemove);
        deleteFilesErr && console.error('fail to delete list of the folder', deleteFilesErr.message);
        const { error: deleteFolderErr } = await clientSupabase.storage
          .from('chatImg')
          .remove([`${chatRoomId}/${user?.user_id}`]);
        deleteFolderErr && console.error("fail to delete the user's folder of storage", deleteFolderErr.message);
      }
    }
  };

  const getOutOfChatRoom = async () => {
    const message = `ํ•œ๋ช…์ด๋ผ๋„ ๋‚˜๊ฐ€๋ฉด ์ฑ„ํŒ…๋ฐฉ์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค. 
    ํ•œ ๋ฒˆ ๋‚˜๊ฐ€๋ฉด ๋‹ค์‹œ ์ž…์žฅํ•˜์‹ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. 
    ๊ทธ๋ž˜๋„ ๋‚˜๊ฐ€์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?`;

    openModal({
      type: 'confirm',
      name: '',
      text: message,
      onFunc: async () => {
        closeModal();
        await updateIsActiveFalse();
        await getRidOfMe();
        await handleIsRest();
        deleteLastMsg();
        deleteTheUserImgs();
        queryClient.removeQueries({ queryKey: [MSGS_QUERY_KEY, chatRoomId], exact: true });
      },
      onCancelFunc: () => {
        closeModal();
      }
    });
  };

 

๋กœ์ง ์ค‘์—๋Š” ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•  ๋กœ์ง๋“ค์ด ์žˆ์–ด์„œ ํ•„์š”ํ•œ ๋กœ์ง์€ await๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ์—ˆ๋‹ค.


2. ๋‚˜๊ฐ„ ์‚ฌ๋žŒ๊ณผ, ๋‚จ์•„์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์„ ๊ตฌ๋ถ„ํ•ด์„œ ๋ผ์šฐํŠธ ๋ณ€๊ฒฝ

 

Why(์ด์œ ) ?

๋‚˜๊ฐ„ ์‚ฌ๋žŒ๊ณผ ๋‚จ์•„์žˆ๋Š” ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๊ณ ๋ฏผํ–ˆ๋‹ค.

์ฑ„ํŒ… ์ค‘ ์–ด๋–ค ์‚ฌ๋žŒ์ด ๋‚˜๊ฐ€๋”๋ผ๋„ ๋‚˜๊ฐ„ ์‚ฌ๋žŒ๋งŒ ๋นผ๊ณ  ์ฑ„ํŒ…๋ฐฉ์€ ๊ณ„์† ์ด์–ด๋‚˜๊ฐˆ๊นŒ?

ํ–ˆ์ง€๋งŒ, ๊ทธ๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด ๋งŒ์•ฝ ์ƒˆ๋กœ์šด ์‚ฌ๋žŒ์ด ๋“ค์–ด์˜ค๊ฒŒ ๋˜๋ฉด ๊ทธ ์‚ฌ๋žŒ์€ ์ด์ „ ์ฑ„ํŒ…๋“ค์„ ๋‹ค ๋ณผ ์ˆ˜ ์žˆ์„ํ…๋ฐ ๋ญ”๊ฐ€ ๋‚˜๊ฐ„ ์‚ฌ๋žŒ์— ๋Œ€ํ•œ ๊ฐœ์ธ์ •๋ณด๋ฅผ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ด์•ผํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋Œ€์ฒด๋œ ๋Š๋‚Œ์ด๋ผ ๊ธฐ๋ถ„์ด ๋‚˜์  ์ˆ˜๋„ ์žˆ๊ณ , ๋ฌด์—‡๋ณด๋‹ค ์‚ฌ๋žŒ์ด ๋‚˜๊ฐ€๋”๋ผ๋„ ์ฑ„ํŒ…๋ฐฉ์ด ๊ณ„์† ์œ ์ง€๋˜๋Š” ๊ฒƒ์ด user๋“ค์—๊ฒŒ ์•…์šฉ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์—

=> ํ•œ ๋ช…์ด๋ผ๋„ ๋‚˜๊ฐ€๋ฉด ํ•ด๋‹น ์ฑ„ํŒ…๋ฐฉ์„ ์ข…๋ฃŒํ•ด๋ฒ„๋ฆฌ์ž! ์ƒˆ๋กœ ๋ˆ„๊ตฐ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์ƒˆ๋กœ์šด ์ฑ„ํŒ…๋ฐฉ์„ ์‹œ์ž‘ํ•˜์ž.

๋ผ๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ,

๋‚˜๊ฐ„ ์‚ฌ๋žŒ์€ ๊ทธ๋ƒฅ ๋กœ๋น„๋กœ ๊ฐ€๋ฉด ๋˜๋Š”๋ฐ, ๋‚จ์•„์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์€ ๊ฐ‘์ž๊ธฐ ๋ˆ„๊ฐ€ ๋‚˜๊ฐ”๋‹ค๊ณ  ๊ฐ™์ด ๋กœ๋น„๋กœ ํŠ•๊ฒจ์ง€๋Š” ๊ฒŒ UX ์ƒ ๋„ˆ๋ฌด ํ™ฉ๋‹น๋‹นํ•  ๊ฒƒ ๊ฐ™์•˜๋‹ค.

 

How(๊ณผ์ •) ?

์ฑ„ํŒ…๋ฐฉ์„ ๋ˆ„๋ฅธ ์‚ฌ๋žŒ์ธ์ง€, ๋‚จ์•„์žˆ๋Š” ์‚ฌ๋žŒ์ธ์ง€ ๊ตฌ๋ถ„ํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค.

ํ•˜์—ฌ, A๋ผ๋Š” room_id์˜ ๋ฐฉ์—์„œ ๋‚˜๊ฐ€๊ธฐ๋ฅผ ๋ˆ„๋ฅธ ์‚ฌ๋žŒ์€ "participants" table์—์„œ isDeleted๋ฅผ true๋กœ ๋ฐ”๊พธ๋Š” ์š”์ฒญ์„ ๋จผ์ € ๋ณด๋‚ด๊ณ (์„ ํ–‰), ๋‚จ์•„์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋ˆ„๊ตฌ์ธ์ง€๋ฅผ ์•Œ์•„๋ณด๋Š” ์š”์ฒญ์„ ํ›„์— ๋ณด๋ƒ„์œผ๋กœ์จ(ํ›„ํ–‰) ๋‚˜๊ฐ€๊ธฐ๋ฅผ ๋ˆ„๋ฅธ ์‚ฌ๋žŒ๊ณผ ๋‚˜๋จธ์ง€ ์‚ฌ๋žŒ๋“ค์„ ๊ตฌ๋ถ„ํ–ˆ๋‹ค.

 

๋˜ํ•œ,  ๊ทธ ๋‘ ๊ทธ๋ฃน์—๊ฒŒ ๋‹ค๋ฅธ ๋ผ์šฐํŠธ ๋ณ€๊ฒฝ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ isRest ์ƒํƒœ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

๋‚จ์•„์žˆ๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋ˆ„๊ตฌ์ธ์ง€๋ฅผ ์•Œ์•„๋ณด๋Š” ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์— ์ด๋ฆ„์ด ์žˆ๋‹ค๋ฉด isRest๋ฅผ true๋กœ, 

์ด๋ฆ„์ด ์—†๋‹ค๋ฉด ๋‚˜๊ฐ€๊ธฐ๋ฅผ ๋ˆ„๋ฅธ ์‚ฌ๋žŒ์ด๋ฏ€๋กœ isRest๋ฅผ false๋กœ set ํ–ˆ๊ณ , ์ด ์ƒํƒœ๋ฅผ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ zustand store์— ์ €์žฅํ–ˆ๋‹ค. 

๊ทธ๋Ÿฐ ๋‹ค์Œ chatPage์˜ ๊ฐ€์žฅ ์ƒ๋‹จ์—์„œ ํ•ด๋‹น ์ฑ„ํŒ…๋ฐฉ์˜ is_Active ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์„ supabase-realtime์œผ๋กœ ์‹ค์‹œ๊ฐ„ ๊ตฌ๋…ํ•œ ๋’ค, is_Active๊ฐ€ false๋ผ๋ฉด, ๋‚ด๊ฐ€ ๋‚จ์•„์žˆ๋Š” ์œ ์ €์ธ์ง€ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋Š” isRest ์ƒํƒœ์— ๋”ฐ๋ผ ๋ผ์šฐํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋„๋ก ํ–ˆ๋‹ค.

 

what(๊ฒฐ๊ณผ) 

์œ„์˜ ์ฝ”๋“œ์™€ ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ์ธ๋ฐ, ๋ฐ”๋กœ ์ด๊ฒƒ์„ ์œ„ํ•œ ์ฝ”๋“œ๋“ค์ด์—ˆ๊ณ 

// room ํ…Œ์ด๋ธ”์—์„œ ๋ฆฌ๋” ๋ณ€๊ฒฝ + room_status: "๋ชจ์ง‘์ค‘" + participants ํ…Œ์ด๋ธ”์—์„œ ํ•ด๋‹น ๋ฃธ์— ๋Œ€ํ•œ ์œ ์ €์ •๋ณด isDeleted: true๋กœ
  const getRidOfMe = async () => {
    if (user?.user_id === leader_id) {
      const { error: updateLeaderErr } = await clientSupabase
        .from('room')
        .update({
          leader_id: participants?.find((person) => person.user_id !== user?.user_id)?.user_id,
          room_status: '๋ชจ์ง‘์ค‘'
        })
        .eq('room_id', room_id);
      if (updateLeaderErr) console.error('fail to update leader of room', updateLeaderErr.message);
    }
    const { error: deleteErr } = await clientSupabase
      .from('participants')
      .update({ isDeleted: true })
      .eq('room_id', room_id)
      .eq('user_id', user?.user_id!);
    if (deleteErr) {
      console.error(deleteErr.message);
      alert('์ฑ„ํŒ…๋ฐฉ ๋‚˜๊ฐ€๊ธฐ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.');
    }
  };

  // ๋‚จ์•„์žˆ๋Š” ์‚ฌ๋žŒ์ธ์ง€ ๋‚˜๊ฐ„์‚ฌ๋žŒ์ธ์ง€ isRest ์ƒํƒœ๋ณ€๊ฒฝ์œผ๋กœ ํ™”๋ฉด ๋ Œ๋”๋ง ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜
  const handleIsRest = async () => {
    const { data: restOf, error: getPartErr } = await clientSupabase
      .from('participants')
      .select('user_id')
      .eq('room_id', room_id)
      .eq('isDeleted', false);
    if (getPartErr) {
      console.error(getPartErr.message);
      alert('์ฐธ๊ฐ€์ž๋“ค ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.');
    } else {
      const restArr = restOf.map((r) => r.user_id);
      setisRest(restArr.includes(user?.user_id!) as boolean);
    }
  };

 

// chatPage์˜ ๊ฐ€์žฅ ์ƒ๋‹จ ์ปดํฌ๋„ŒํŠธ InitChat.tsx

'use client';

const InitChat = ({ user, chatRoomId }: { user: User | null; chatRoomId: string }) => {
  const { chatState, isRest, setChatState, setisRest, setChatRoomId, setHasMore } = chatStore((state) => state);
  const {
    room: { room_id, leader_id }
  } = useRoomDataQuery(chatRoomId);
  const router = useRouter();
  const queryClient = useQueryClient();
  const allMsgs = useMsgsQuery(chatRoomId);

  useEffect(() => {
    // ์ฑ„ํŒ…๋ฐฉ isActive ์ƒํƒœ ๊ตฌ๋…
    const channel = clientSupabase
      .channel(`${chatRoomId}_chatting_room_table`)
      .on(
        'postgres_changes',
        { event: 'UPDATE', schema: 'public', table: 'chatting_room', filter: `chatting_room_id=eq.${chatRoomId}` },
        (payload) => {
          setChatState((payload.new as chatRoomType).isActive);
          if (user?.id !== leader_id) {
            queryClient.invalidateQueries({
              queryKey: [CHATDATA_QUERY_KEY]
            });
          }
        }
      )
      .subscribe();
    return () => {
      clientSupabase.removeChannel(channel);
    };
  }, []);

  useEffect(() => {
    // **์ฑ„ํŒ…๋ฐฉ์— ์žˆ์„์ง€ ๋ง์ง€
    if (!chatState) {
      // ํ•œ ๋ช…์ด ์ฑ„ํŒ…๋ฐฉ์„ ๋‚˜๊ฐ€์„œ ์ฑ„ํŒ…๋ฐฉ isActive๊ฐ€ false๊ฐ€ ๋˜๋ฉด,
      if (isRest) {
        // ๋‚ด๊ฐ€ ๋‚˜๊ฐ€๊ธฐ๋ฅผ ๋ˆ„๋ฅธ ์‚ฌ๋žŒ์ด ์•„๋‹ˆ๋ผ๋ฉด(๋‚จ์€ ์‚ฌ๋žŒ์ด๋ฉด) ๋‹ค์‹œ ์ˆ˜๋ฝ์ฐฝ์œผ๋กœ
        router.push(`/meetingRoom/${room_id}`);
      } else {
        // ๋‚ด๊ฐ€ ๋‚˜๊ฐ€๊ธฐ๋ฅผ ๋ˆ„๋ฅธ ์‚ฌ๋žŒ์ด๋ผ๋ฉด ์•„์˜ˆ ๋กœ๋น„๋กœ
        router.push('/meetingRoom');
      }
      setChatState(true);
      setisRest(true);
    } else {
      // **์ฑ„ํŒ…๋ฐฉ์— ์žˆ๋Š”๋‹ค๋ฉด
      setChatRoomId(chatRoomId);
      if (allMsgs) {
        queryClient.setQueryData([MSGS_QUERY_KEY, chatRoomId], [...allMsgs].reverse());
        setHasMore(allMsgs.length >= ITEM_INTERVAL + 1);
      }
    }
  }, [chatState, isRest]);

  return null;
};

export default InitChat;

 

๐Ÿ“ธ ์Šคํฌ๋ฆฐ์ƒท

- ์ฑ„ํŒ…๋ฐฉ์„ ๋‚˜๊ฐ„ ์‚ฌ๋žŒ: ๋กœ๋น„๋กœ 

 

 

- ์•„๋ฌด๊ฒƒ๋„ ๋ˆ„๋ฅด์ง€ ์•Š๊ณ  ์ƒ๋Œ€๋ฐฉ์ด ๋‚˜๊ฐ„ ๊ฒฝ์šฐ: ์ˆ˜๋ฝ์ฐฝ์œผ๋กœ ์ด๋™(์กฐ๊ธˆ ๋ณด๊ณ ๊ณ„์‹œ๋ฉด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค)

๐Ÿšจ  TroubleShotting

payload์˜ ํƒ€์ž… ์ง€์ •์— ์• ๋ฅผ ๋จน์—ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ฐ›์„ payload๋Š” ์ฑ„ํŒ…๋ฃธ์ด์—ˆ์–ด์„œ ๊ด„ํ˜ธ ํ›„ ํƒ€์ž…์ง€์ •์„ ํ•ด์ฃผ๋‹ˆ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.

  useEffect(() => {
    // ์ฑ„ํŒ…๋ฐฉ isActive ์ƒํƒœ ๊ตฌ๋…
    const channel = clientSupabase
      .channel(`${chatRoomId}_chatting_room_table`)
      .on(
        'postgres_changes',
        { event: 'UPDATE', schema: 'public', table: 'chatting_room', filter: `chatting_room_id=eq.${chatRoomId}` },
        (payload) => {
          setChatState((payload.new as chatRoomType).isActive); ---> type ์ง€์ •
          ...

๐Ÿ“š ๋ ˆํผ๋Ÿฐ์Šค

My head....?