Part3-Team15 / taskify

[์ค‘๊ธ‰ ํ”„๋กœ์ ํŠธ 15ํŒ€] taskify: ์Šค๋งˆํŠธํ•œ ์ผ์ • ๊ด€๋ฆฌ
https://taskify-15.vercel.app/
1 stars 3 forks source link

๐Ÿ›  fix(#137): ๋“œ๋กญ๋‹ค์šด ํด๋ฆญํšจ๊ณผ ๋ฒ”์œ„ ์ˆ˜์ • #139

Closed un0211 closed 2 months ago

un0211 commented 2 months ago

์—ฐ๊ด€๋œ ์ด์Šˆ

์ž‘์—… ๋‚ด์šฉ

์Šคํฌ๋ฆฐ์ƒท

https://github.com/Part3-Team15/taskify/assets/24778465/63d6913f-d075-4ae3-9e63-cd88e4b402db

un0211 commented 2 months ago

๊ทธ๊ฒƒ๋„ ๋ฐ”๋กœ ์ˆ˜์ •ํ•ด์„œ ๋จธ์ง€ํ• ๊ฒŒ์š”~~

un0211 commented 2 months ago

์ œ๊ฐ€ ์™ธ๋ถ€ ํด๋ฆญ์‹œ์—๋„ ๋“œ๋กญ๋‹ค์šด ๋‹ซํžˆ๊ฒŒ ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ด๋ดค๋Š”๋ฐ, ์ž˜ ์•ˆ ๋˜๋„ค์š”..ใ…  9d6567e ์ปค๋ฐ‹ ๋ณด์‹œ๊ณ  ํ˜น์‹œ ์ด์œ ๋ฅผ ์•Œ ๊ฒƒ ๊ฐ™์€ ๋ถ„ ์žˆ์œผ๋ฉด ๋„์›€์š”์ฒญ ๋“œ๋ฆฝ๋‹ˆ๋‹ค!!

๋Œ€์–‘๋‹˜์ด auth redirection ํ•˜์…จ๋˜ ๊ฒƒ์—์„œ ์•„์ด๋””์–ด๋ฅผ ์–ป์–ด ๊ด€๋ฆฌํ•ด์ค„ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด๋ดค์Šต๋‹ˆ๋‹ค! isOpen์˜ ๊ฐ’๋งŒ ๋ณต์‚ฌ๋˜์–ด์„œ ๋ณ€ํ™”๊ฐ€ ์•ˆ๋˜๋Š” ๊ฑด ์•„๋‹๊นŒ ํ•˜๊ณ  getIsOpen = () => isOpen๋„ ํ•ด๋ณด๊ณ , ๊ฐ์ฒด๋กœ๋„ ๋ฐ”๊ฟ”๋ดค๋Š”๋ฐ ์ž˜ ์•ˆ๋˜๋„ค์š” ใ…  (ํฌ์ธํ„ฐ ๋„˜๊ฒจ์ฃผ๊ณ  ์‹ถ์€ ์‹ฌ์ •..) UserMenuDropdown ๋‚ด์—์„œ๋Š” ์ž˜ ๋™์ž‘ํ•˜๋Š”๋ฐ ๋ฐ–์—์„œ setIsOpen(false)๋กœ ํ•ด๋„ ๋‹ซํžˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.. (useRef๋Š” ์‹œ๋„ํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ, onClick ์ž์ฒด๊ฐ€ ์•ˆ๋จนํžˆ๋Š” ๊ฑด ์•„๋‹ˆ๊ณ (์ฝ˜์†” ๋กœ๊ทธ ์ฐ์œผ๋ฉด ์ฐํž˜), setIsOpen์ด ์ž˜ ์•ˆ๋˜๋Š” ๊ฒƒ ๊ฐ™์•„์„œ์ž…๋‹ˆ๋‹ค!)

๋‹ค๋ฅธ ๊ดœ์ฐฎ์€ ๋ฐฉ๋ฒ• ์žˆ์œผ์‹œ๋ฉด 9d6567e ๋‚ ๋ ค๋ฒ„๋ฆฌ๊ณ  force push ํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค!! Context๋‚˜ redux ์“ฐ๋Š” ๊ฒŒ ๋‚˜์œผ๋ ค๋‚˜์š”...

wjsdncl commented 2 months ago

๋ฉ˜ํ† ๋‹˜์ด ๋ง์”€ํ•ด์ฃผ์‹  ๊ฒƒ ์ฒ˜๋Ÿผ ref ์‚ฌ์šฉํ•ด์„œ ์ˆ˜์ •ํ•˜๋‹ˆ๊นŒ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค ๐Ÿซก๐Ÿ‘ Screenshot 2024-07-02 at 14 22 51

import Link from 'next/link';

import UserProfile from './UserProfile';

import useUserDropdown from '@/hooks/useUserDropdown';

export default function UserMenuDropdown() {
  const { status, handleDropdownClick, handleMenuClick, handleLogoutClick, dropdownRef } = useUserDropdown();

  return (
    <div className='flex items-center' ref={dropdownRef}>
      <button type='button' onClick={handleDropdownClick}>
        <UserProfile />
      </button>
      {status.isOpen && (
        <ul className='dd-container absolute right-2 top-14 w-28 bg-white text-sm md:top-16 md:w-[150px] md:text-base'>
          <li className='dd-menu md:h-10' onClick={handleMenuClick}>
            <Link href='/mydashboard' className='align-center size-full'>
              ๋‚ด ๋Œ€์‹œ๋ณด๋“œ
            </Link>
          </li>
          <li className='dd-menu md:h-10' onClick={handleMenuClick}>
            <Link href='/mypage' className='align-center size-full'>
              ๊ณ„์ •๊ด€๋ฆฌ
            </Link>
          </li>
          <li className='dd-menu md:h-10'>
            <button type='button' className='align-center size-full' onClick={handleLogoutClick}>
              ๋กœ๊ทธ์•„์›ƒ
            </button>
          </li>
        </ul>
      )}
    </div>
  );
}
import { useRouter } from 'next/router';
import { MouseEventHandler, useState, useEffect, useRef } from 'react';
import { useDispatch } from 'react-redux';

import { clearUser } from '@/store/reducers/userSlice';

const useUserDropdown = () => {
  const router = useRouter();
  const dispatch = useDispatch();
  const [status, setStatus] = useState({ isOpen: false });
  const dropdownRef = useRef<HTMLDivElement | null>(null);

  const handleOutsideClick = (event: MouseEvent) => {
    if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {
      setStatus({ isOpen: false });
    }
  };

  useEffect(() => {
    if (status.isOpen) {
      document.addEventListener('mousedown', handleOutsideClick);
    } else {
      document.removeEventListener('mousedown', handleOutsideClick);
    }

    return () => {
      document.removeEventListener('mousedown', handleOutsideClick);
    };
  }, [status.isOpen]);

  const handleDropdownClick: MouseEventHandler<HTMLButtonElement> = (e) => {
    e.stopPropagation();
    setStatus((prev) => ({ isOpen: !prev.isOpen }));
  };

  const handleMenuClick: MouseEventHandler<HTMLLIElement> = (e) => {
    e.stopPropagation();
    setStatus({ isOpen: false });
  };

  const handleLogoutClick: MouseEventHandler<HTMLButtonElement> = (e) => {
    e.stopPropagation();
    dispatch(clearUser());
    setStatus({ isOpen: false });
    router.push('/');
  };

  return {
    status,
    handleDropdownClick,
    handleMenuClick,
    handleLogoutClick,
    dropdownRef,
  };
};

export default useUserDropdown;
wjsdncl commented 2 months ago

ref ์—†์ด ๊ทธ๋ƒฅ useEffect๋กœ ์ „์—ญ์— ์ด๋ฒคํŠธ ๋„ฃ์–ด์ฃผ๋ฉด ํ•ด๊ฒฐ์ด ๋˜๋„ค์š”

import { useRouter } from 'next/router';
import { MouseEventHandler, useEffect, useState } from 'react';
import { useDispatch } from 'react-redux';

import { clearUser } from '@/store/reducers/userSlice';

const useUserDropdown = () => {
  const router = useRouter();
  const dispatch = useDispatch();
  const [status, setStatus] = useState({ isOpen: false });

  const handleOutsideClick = () => {
    console.log(status.isOpen);
    setStatus({ isOpen: false });
  };

  useEffect(() => {
    if (status.isOpen) {
      document.addEventListener('mousedown', handleOutsideClick);
    } else {
      document.removeEventListener('mousedown', handleOutsideClick);
    }

    return () => {
      document.removeEventListener('mousedown', handleOutsideClick);
    };
  }, [status.isOpen]);

  const handleDropdownClick: MouseEventHandler<HTMLButtonElement> = (e) => {
    e.stopPropagation();
    setStatus((prev) => ({ isOpen: !prev.isOpen }));
  };

  const handleMenuClick: MouseEventHandler<HTMLLIElement> = (e) => {
    e.stopPropagation();
    setStatus({ isOpen: false });
  };

  const handleLogoutClick: MouseEventHandler<HTMLButtonElement> = (e) => {
    e.stopPropagation();
    dispatch(clearUser());
    setStatus({ isOpen: false });
    router.push('/');
  };

  return { status, handleOutsideClick, handleDropdownClick, handleMenuClick, handleLogoutClick };
};

export default useUserDropdown;
un0211 commented 2 months ago

์˜ค...!! ์ด๋Ÿฐ ๊ฑธ ์ด์ œ์•ผ ๋ดค๋„ค์š”!! ํ™•์ธํ•ด๋ณด๊ณ  ๋ฐ˜์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

un0211 commented 2 months ago

addEventListener ํ•˜๋‹ˆ๊นŒ ๋“œ๋กญ๋‹ค์šด์ด ๋™์ž‘์„ ์•ˆํ•˜๋„ค์š”ใ…  ๋ชจ๋‘ ๋“œ๋กญ๋‹ค์šด์„ ๋„๊ธฐ๋งŒ ํ•ด์š”ใ…  ์ฒซ๋ฒˆ์งธ์ฒ˜๋Ÿผ useRef ์จ์•ผ ํ•˜๋ ค๋‚˜ ๋ด์š”

un0211 commented 2 months ago

๋ฏผ์žฌ๋‹˜ ์•Œ๋ ค์ฃผ์‹  ์ฝ”๋“œ๋กœ dropdown ์ „์—ญ์—์„œ ๋‹ซํžˆ๋„๋ก ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค!! ์ œ๊ฐ€ ์‹ค์ˆ˜๋กœ .env๋ฅผ ์˜ฌ๋ ค๋ฒ„๋ ค์„œ ์—†๋Š” ๋ฒ„์ „์œผ๋กœ force push ํ•ด๋ฒ„๋ ธ์–ด์š”...ใ…‹ใ…‹ใ…‹

un0211 commented 2 months ago

์ž‘์€ ํฌ๊ธฐ์—์„œ absolute ๋•Œ๋ฌธ์— ์œ„์น˜ ์ด์ƒํ•˜๊ฒŒ ๋œ ๊ฑฐ ๊ณ ์นœ๋‹ค๋Š” ๊ฒŒ ๋‹ค๋ฅธ ์–˜๊ธฐํ•˜๋‹ค๊ฐ€ ๊นœ๋นกํ–ˆ๋„ค์š”......! ์ด๋ฏธ ๋‹ซ์•„๋ฒ„๋ ธ์œผ๋‹ˆ ๋””์ž์ธ ์ˆ˜์ •์‚ฌํ•ญ์— ์ถ”๊ฐ€ํ• ๊ฒŒ์š”