Skip to content

Commit

Permalink
Merge pull request #252 from MeeTeamNumdle/release-1.0
Browse files Browse the repository at this point in the history
deploy: #248. 모달 관련 커스텀훅 적용 및 이미지 webp 적용
  • Loading branch information
prgmr99 authored Oct 1, 2024
2 parents df4d2c4 + 4e3f817 commit eb79852
Show file tree
Hide file tree
Showing 19 changed files with 121 additions and 144 deletions.
Binary file removed src/assets/NaverIcon.png
Binary file not shown.
Binary file added src/assets/NaverIcon.webp
Binary file not shown.
Binary file removed src/assets/NotFoundIcon.png
Binary file not shown.
Binary file added src/assets/NotFoundIcon.webp
Binary file not shown.
6 changes: 3 additions & 3 deletions src/assets/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,15 @@ import FloatingBackground from './FloatingBackground.svg';
import Alert from './Alert.svg';
import MeeteamLogoLarge from './MeeteamLogoLarge.svg';
import Congratulation from './Congratulation.png';
import NaverIcon from './NaverIcon.png';
import NaverIcon from './NaverIcon.webp';
import Clip from './Clip.svg';
import Valid from './Valid.svg';
import Invalid from './Invalid.svg';
import LogoFooter from './LogoFooter.svg';
import Email from './Email.svg';
import GrayDelete from './GrayDelete.svg';
import NotFoundIcon from './NotFoundIcon.png';
import meeteam_banner_icon from './meeteam_banner_icon.png';
import NotFoundIcon from './NotFoundIcon.webp';
import meeteam_banner_icon from './meeteam_banner_icon.webp';

export {
Exit,
Expand Down
Binary file removed src/assets/meeteam_banner_icon.png
Binary file not shown.
Binary file added src/assets/meeteam_banner_icon.webp
Binary file not shown.
33 changes: 10 additions & 23 deletions src/components/dropdown/Dropdown.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import React, { useState, useRef, useEffect } from 'react';
import S from './Dropdown.styled';
import { useDebounce, useLogin } from '../../hooks';
import { useDebounce, useLogin, useOutsideClick } from '../../hooks';
import { useQuery } from '@tanstack/react-query';
import { getCourseKeyword, getProfessorKeyword } from '../../service';
import { useRecoilState, useSetRecoilState } from 'recoil';
Expand Down Expand Up @@ -195,26 +195,13 @@ const Dropdown = ({ data, initialData, scope, category, applicant, roleObj }: Dr
event.stopPropagation();
};

useEffect(() => {
const outsideClick = (event: MouseEvent) => {
const { target } = event;
if (showDropdown && dropdownRef.current && !dropdownRef.current.contains(target as Node)) {
setShowDropdown(false);
}

if (dropdown.course && insideRef.current && !insideRef.current.contains(target as Node)) {
setDropdown(prev => ({ ...prev, course: false }));
}

if (dropdown.professor && insideRef.current && !insideRef.current.contains(target as Node)) {
setDropdown(prev => ({ ...prev, professor: false }));
}
};
document.addEventListener('mousedown', outsideClick);
return () => {
document.removeEventListener('mousedown', outsideClick);
};
}, [dropdownRef.current, showDropdown, dropdown.course, dropdown.professor]);
useOutsideClick(dropdownRef, showDropdown, setShowDropdown);
useOutsideClick(insideRef, dropdown.course, () =>
setDropdown(prev => ({ ...prev, course: false }))
);
useOutsideClick(insideRef, dropdown.professor, () =>
setDropdown(prev => ({ ...prev, professor: false }))
);

useEffect(() => {
if (scope && filterState.scope !== null) {
Expand All @@ -225,7 +212,7 @@ const Dropdown = ({ data, initialData, scope, category, applicant, roleObj }: Dr
setCurrentValue('범위');
setIsScopeSelected(false);
}
}, [filterState.scope]);
}, [filterState.scope, scope]);

useEffect(() => {
if (category && filterState.category !== null) {
Expand All @@ -236,7 +223,7 @@ const Dropdown = ({ data, initialData, scope, category, applicant, roleObj }: Dr
setCurrentValue('유형');
setIsCategorySelected(false);
}
}, [filterState.category]);
}, [filterState.category, category]);

return (
<S.Dropdown
Expand Down
29 changes: 10 additions & 19 deletions src/components/header/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,13 @@ import { DropdownArrow, Logo, LogoName } from '../../assets';
import { ProfileImage, WaitModal } from '..';
import { useRecoilState, useSetRecoilState } from 'recoil';
import { recruitFilterState, userState, waitModalState, loginState } from '../../atom';
import { useSignOut, useLogin, useReadProfileImage } from '../../hooks';
import { fixModalBackground } from '../../utils';
import {
useSignOut,
useLogin,
useReadProfileImage,
useOutsideClick,
useFixModalBackground,
} from '../../hooks';

const Header = () => {
const navigate = useNavigate();
Expand Down Expand Up @@ -60,6 +65,9 @@ const Header = () => {
setOpenDrop(false);
};

useOutsideClick(dropdownRef, openDrop, setOpenDrop);
useFixModalBackground(isWait);

useEffect(() => {
if (location.pathname === `/recruitment/postings/${id}` || location.pathname === '/') {
setIsHere({ recruit: true, galary: false, inform: false });
Expand All @@ -68,23 +76,6 @@ const Header = () => {
}
}, [location.pathname, id]);

useEffect(() => {
const outsideClick = (event: MouseEvent) => {
const { target } = event;
if (openDrop && dropdownRef.current && !dropdownRef.current.contains(target as Node)) {
setOpenDrop(false);
}
};
document.addEventListener('mousedown', outsideClick);
return () => {
document.removeEventListener('mousedown', outsideClick);
};
}, [openDrop]);

useEffect(() => {
fixModalBackground(isWait);
}, [isWait]);

return (
<S.Header $isLogin={isLogin}>
<div className='header'>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ const InputRoleForm = styled.article<InputRoleForm>`
box-shadow: 0px 2px 2px 0px rgba(0, 0, 0, 0.25);
}
.dropdown-loading {
width: 100%;
height: 5rem;
}
.option {
cursor: pointer;
}
Expand Down
60 changes: 31 additions & 29 deletions src/components/inputDropdown/inputRole/InputRoleForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { useQuery } from '@tanstack/react-query';
import { useRecoilState } from 'recoil';
import { isNotNumber } from '../../../utils';
import { recruitInputState } from '../../../atom';
import { useDebounce, useValid } from '../../../hooks';
import { useDebounce, useOutsideClick, useValid } from '../../../hooks';
import { GrayDelete, SearchIcon, XBtn } from '../../../assets';
import { RoleForPost, Keyword } from '../../../types';
import { getRoleKeyword, getSkillKeyword } from '../../../service';
Expand Down Expand Up @@ -49,7 +49,7 @@ const InputRoleForm = (props: InputRoleObj) => {
const dropdownRef = useRef<HTMLDivElement | null>(null);
const { isValid } = useValid(info);

const { data: dataRole, isLoading: isLoadingRole } = useQuery({
const { data: dataRole, isLoading: isLoadingRoleQuery } = useQuery({
queryKey: ['searchRole', keywordRole],
queryFn: () => getRoleKeyword(keywordRole as string),
staleTime: Infinity,
Expand Down Expand Up @@ -329,34 +329,26 @@ const InputRoleForm = (props: InputRoleObj) => {
}
};

useOutsideClick(dropdownRef, dropdown.role, () => {
setDropdown(prev => ({
...prev,
role: false,
}));
});

useOutsideClick(dropdownRef, dropdown.skill, () => {
setDropdown(prev => ({
...prev,
skill: false,
}));
});

useEffect(() => {
if (containerRef.current) {
applyEllipsis(containerRef.current);
}
}, [dropdown.skill, roleData.skills]);

useEffect(() => {
const outsideClick = (event: MouseEvent) => {
const { target } = event;
if (dropdown.role && dropdownRef.current && !dropdownRef.current.contains(target as Node)) {
setDropdown(prev => ({
...prev,
role: false,
}));
}
if (dropdown.skill && dropdownRef.current && !dropdownRef.current.contains(target as Node)) {
setDropdown(prev => ({
...prev,
skill: false,
}));
}
};
document.addEventListener('mousedown', outsideClick);
return () => {
document.removeEventListener('mousedown', outsideClick);
};
}, [dropdownRef.current, dropdown.role, dropdown.skill]);

useEffect(() => {
if (isValid.isRoleSubmitted) {
if (roleData.roleName === '') {
Expand Down Expand Up @@ -399,12 +391,22 @@ const InputRoleForm = (props: InputRoleObj) => {
/>
{dropdown.role && (
<section className='dropdown'>
{!isLoadingRole &&
dataRole?.map((keyword: any) => (
<span key={keyword.id} onClick={onClickRole} id={keyword.id} className='option'>
{isLoadingRoleQuery ? (
<article className='dropdown-loading'>
<span>검색중...</span>
</article>
) : (
dataRole?.map((keyword: Keyword) => (
<span
key={keyword.id}
onClick={onClickRole}
id={keyword.id.toString()}
className='option'
>
{keyword.name}
</span>
))}
))
)}
</section>
)}
{isValid.isRoleSubmitted && !isValidBeforeSubmit.role.valid && (
Expand Down Expand Up @@ -479,7 +481,7 @@ const InputRoleForm = (props: InputRoleObj) => {
<section className='dropdown-skill'>
<section className='list-skill'>
{!isLoadingSkill &&
dataSkill?.map((elem, _) => (
dataSkill?.map(elem => (
<span
key={elem.id}
className='skill-element body1-medium option'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { useState, useEffect, useRef, useCallback } from 'react';
import React, { useState, useRef, useCallback } from 'react';
import S from '../BasicInformation.styled';
import { useQuery } from '@tanstack/react-query';
import { useDebounce } from '../../../../../hooks';
import { useDebounce, useOutsideClick } from '../../../../../hooks';
import { getCourseKeyword, getProfessorKeyword } from '../../../../../service';
import { useRecoilState } from 'recoil';
import { recruitInputState } from '../../../../../atom';
Expand Down Expand Up @@ -86,25 +86,12 @@ const ContainerCourse = ({ course, professor }: ContainerCourseProps) => {
}
};

useEffect(() => {
const outsideClick = (event: MouseEvent) => {
const { target } = event;
if (dropdown.course && dropdownRef.current && !dropdownRef.current.contains(target as Node)) {
setDropdown(prev => ({ ...prev, course: false }));
}
if (
dropdown.professor &&
dropdownRef.current &&
!dropdownRef.current.contains(target as Node)
) {
setDropdown(prev => ({ ...prev, professor: false }));
}
};
document.addEventListener('mousedown', outsideClick);
return () => {
document.removeEventListener('mousedown', outsideClick);
};
}, [dropdown.course, dropdown.professor]);
useOutsideClick(dropdownRef, dropdown.course, () =>
setDropdown(prev => ({ ...prev, course: false }))
);
useOutsideClick(dropdownRef, dropdown.professor, () =>
setDropdown(prev => ({ ...prev, professor: false }))
);

return (
<S.ContainerCourse $isChecked={isChecked} ref={dropdownRef}>
Expand Down
25 changes: 7 additions & 18 deletions src/components/tag/MeeteamTag.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React, { useEffect, useRef, useState } from 'react';
import S from './MeeteamTag.styled';
import { useRecoilState } from 'recoil';
import { recruitInputState } from '../../atom';
import { useDebounce } from '../../hooks';
import { useDebounce, useOutsideClick } from '../../hooks';
import { useQuery } from '@tanstack/react-query';
import { getTagKeyword } from '../../service';
import { Search, XBtn } from '../../assets';
Expand Down Expand Up @@ -78,23 +78,12 @@ const MeeteamTag = ({ tags }: RecruitTagListProps) => {
}
};

useEffect(() => {
const outsideClick = (event: MouseEvent) => {
const { target } = event;
if (
isDropdownVisible &&
dropdownRef.current &&
!dropdownRef.current.contains(target as Node)
) {
setIsDropdownVisible(false);
setTagItem('');
}
};
document.addEventListener('mousedown', outsideClick);
return () => {
document.removeEventListener('mousedown', outsideClick);
};
}, [isDropdownVisible]);
const handleClickOutside = () => {
setIsDropdownVisible(false);
setTagItem('');
};

useOutsideClick(dropdownRef, isDropdownVisible, handleClickOutside);

useEffect(() => {
if (tags) {
Expand Down
6 changes: 6 additions & 0 deletions src/hooks/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ import { useBookmark } from './useBookMark';
import useLogin from './useLogin';
import { useComment, useCommentDelete, useCommentEdit } from './useComment';
import useScrollToTop from './useScrollToTop';
import { useOutsideClick } from './useOutsideClick';
import { useFocusToTop } from './useFocusOnTop';
import { useFixModalBackground } from './useFixModalBackground';

export {
useCheckExist,
Expand Down Expand Up @@ -61,4 +64,7 @@ export {
useScrollToTop,
useSignOut,
useReadProfileImage,
useOutsideClick,
useFocusToTop,
useFixModalBackground,
};
8 changes: 8 additions & 0 deletions src/hooks/useFixModalBackground.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { useEffect } from 'react';
import { fixModalBackground } from '../utils';

export const useFixModalBackground = (isOpen: boolean) => {
useEffect(() => {
fixModalBackground(isOpen);
}, [isOpen]);
};
7 changes: 7 additions & 0 deletions src/hooks/useFocusOnTop.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { useEffect } from 'react';

export const useFocusToTop = <T>(trigger: T) => {
useEffect(() => {
window.scrollTo(0, 0);
}, [trigger]);
};
20 changes: 20 additions & 0 deletions src/hooks/useOutsideClick.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { useEffect } from 'react';

export const useOutsideClick = (
ref: React.RefObject<HTMLElement>,
isOpen: boolean,
setIsOpen: React.Dispatch<React.SetStateAction<boolean>>
) => {
useEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
if (isOpen && ref.current && !ref.current.contains(event.target as Node)) {
setIsOpen(false);
}
};

document.addEventListener('mousedown', handleClickOutside);
return () => {
document.removeEventListener('mousedown', handleClickOutside);
};
}, [isOpen, ref, setIsOpen]);
};
2 changes: 0 additions & 2 deletions src/hooks/useScrollToTop.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import React from 'react';

const useScrollToTop = () => {
const scrollToTop = () => {
window.scrollTo({
Expand Down
Loading

0 comments on commit eb79852

Please sign in to comment.