Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
289dc32
refactor: :recycle: 유저/기업 홈 수정
ohofront Jun 24, 2025
af40729
feat: :sparkles: 썸네일 추가
ohofront Jun 24, 2025
c64b568
refactor: :recycle: 이미지 작아지는 버그 수정
ohofront Jun 24, 2025
ea97938
Update index.html
SEO-HAN Jul 30, 2025
dd1e96b
Merge pull request #466 from Team-inglo/feat/464-index-gtm-hotjar-추가
MrMirror21 Jul 31, 2025
ba75f7c
Merge branch 'dev' of https://github.com/Team-inglo/Giggle-Web into f…
MrMirror21 Jul 31, 2025
355468b
🎨 style: 홈 페이지 내 횡스크롤형 ui 화면 내 padding 적용 방식 수정 #413
MrMirror21 Jul 31, 2025
6f2d758
🐛 fix: merge 과정 중 오병합된 코드 롤백 #413
MrMirror21 Jul 31, 2025
3fe0c15
🐛 fix: 퀵메뉴 컨테이너의 기본 padding 제거 #413
MrMirror21 Jul 31, 2025
f984919
🎨 style: 홈 페이지 내 ui 레이아웃 변경 #413
MrMirror21 Jul 31, 2025
f3eac63
🎨 style: 커리어, 공고 카드 내 비자 표기 방식 변경 #413
MrMirror21 Jul 31, 2025
fa99e21
♻️ refactor: HomeBanner 내 컴포넌트 분리 #413
MrMirror21 Aug 1, 2025
c8dcd9d
♻️ refactor: 공고/커리어 카드 내 비자 표기 로직 훅 분리 #413
MrMirror21 Aug 1, 2025
77fdc9f
♻️ refactor: 공고 검색 페이지 내 검색 옵션 메모이제이션 적용 #413
MrMirror21 Aug 1, 2025
54a02d4
🐛 fix: 홈 피드용 인재 카드와 인재 검색용 인재 카드 분리 #413
MrMirror21 Aug 1, 2025
36680d4
♻️ refactor: 홈/인재 검색 인재 카드 통합 #413
MrMirror21 Aug 1, 2025
82e49ed
🎨 style: 홈 퀵메뉴 아이콘 변경 #413
MrMirror21 Aug 1, 2025
3211a61
🐛 fix: 요즘 뜨는 인재 더보기 선택 시 이동 페이지 수정 #413
MrMirror21 Aug 1, 2025
476a685
🔧 chore: 리뷰 피드백 반영 #413
MrMirror21 Aug 1, 2025
913a5dc
Merge pull request #421 from Team-inglo/feat/413
MrMirror21 Aug 1, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
40 changes: 28 additions & 12 deletions index.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,39 @@
name="viewport"
content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover"
/>
<!-- Google tag (gtag.js) -->
<script
async
src="https://www.googletagmanager.com/gtag/js?id=G-BEM3WCV14C"
></script>

<!-- Google Tag Manager -->
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
dataLayer.push(arguments);
}
gtag('js', new Date());

gtag('config', 'G-BEM3WCV14C');
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-N4P8H7QD');
</script>

<!-- Hotjar Tracking Code for Site 5296393 -->
<script>
(function(h,o,t,j,a,r){
h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
h._hjSettings={hjid:5296393,hjsv:6};
a=o.getElementsByTagName('head')[0];
r=o.createElement('script');r.async=1;
r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
a.appendChild(r);
})(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');
</script>

<title>Giggle</title>
</head>

<body>
<!-- Google Tag Manager (noscript) -->
<noscript>
<iframe src="https://www.googletagmanager.com/ns.html?id=GTM-N4P8H7QD"
height="0" width="0" style="display:none;visibility:hidden">
</iframe>
</noscript>

<div id="root"></div>
<div id="toast-root"></div>
<script type="module" src="/src/main.tsx"></script>
Expand Down
8 changes: 8 additions & 0 deletions src/assets/icons/Home/AppliedIcon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 0 additions & 6 deletions src/assets/icons/Home/ApplyIcon.svg

This file was deleted.

8 changes: 8 additions & 0 deletions src/assets/icons/Home/MatchesIcon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 0 additions & 6 deletions src/assets/icons/Home/RecommendPostIcon.svg

This file was deleted.

22 changes: 13 additions & 9 deletions src/assets/icons/Home/ResumeIcon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions src/assets/icons/Home/SavedIcon.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 0 additions & 6 deletions src/assets/icons/Home/SavedPostIcon.svg

This file was deleted.

126 changes: 126 additions & 0 deletions src/components/Common/EmployeeCard/EmployeeCard.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
import Tag from '@/components/Common/Tag';
import { EmployeeResumeListItemType } from '@/types/api/resumes';
import { useEmployeeCard } from '@/hooks/useEmployeeCard';
import EmployeeCardBookmark from '@/components/Common/EmployeeCard/EmployeeCardBookmark';

type EmployeeCardProps = {
cardData: EmployeeResumeListItemType;
variant: 'horizontal' | 'vertical';
};

const EmployeeCard = ({ cardData, variant }: EmployeeCardProps) => {
const { handleClickBookmark, goToResumeDetailPage } =
useEmployeeCard(cardData);

if (variant === 'horizontal') {
return (
<article className="w-full p-4" onClick={goToResumeDetailPage}>
<div className="pb-3 flex justify-between items-center gap-2">
<div className="w-16 h-16 rounded-full overflow-hidden">
<img
src={cardData.profile_img_url}
alt="profile image"
className="w-full h-full object-cover"
/>
</div>
<div className="flex-1">
<div className="w-full pb-[0.125rem] flex justify-between items-center">
<p className="text-text-strong heading-18-semibold">
{cardData?.name}{' '}
<span className="pl-1 text-text-alternative caption-12-regular">
{cardData?.nationality}
</span>
</p>
<EmployeeCardBookmark
isBookmarked={cardData?.is_bookmarked}
onBookmarkClick={handleClickBookmark}
variant="icon-only"
/>
</div>
<p className="text-text-alternative body-14-regular">
{cardData?.address}
</p>
</div>
</div>
<p className="text-text-normal body-14-medium">{cardData?.title}</p>
<div className="pt-2 flex items-center gap-1 flex-wrap">
<Tag
value={cardData?.industry}
padding="py-[0.188rem] px-[0.25rem]"
isRounded={true}
hasCheckIcon={false}
backgroundColor="bg-status-blue-300/10"
color="text-text-success"
fontStyle="caption-12-semibold"
/>
<Tag
value={cardData?.visa?.replace(/_/g, '-')}
padding="py-[0.188rem] px-[0.25rem]"
isRounded={true}
hasCheckIcon={false}
backgroundColor="bg-surface-secondary"
color="text-text-alternative"
fontStyle="caption-12-semibold"
/>
</div>
</article>
);
}

// Column 형 카드
return (
<article
className="w-[9.063rem] flex flex-col gap-2 rounded-lg"
onClick={goToResumeDetailPage}
>
<div className="w-[9.063rem] h-[6.75rem] rounded-lg overflow-hidden border border-border-alternative">
{cardData?.profile_img_url ? (
<img
src={cardData.profile_img_url}
alt="profile"
className="object-cover w-full h-full"
/>
) : (
<div className="flex items-center justify-center w-full h-full text-white bg-gradient-to-r from-purple-500 to-pink-500">
No Image
</div>
)}
</div>

<div className="flex flex-col">
<h3 className="button-16-semibold text-text-normal line-clamp-1 whitespace-normal pb-[0.125rem]">
{cardData?.name}
</h3>

<p className="caption-12-regular text-text-alternative line-clamp-2 whitespace-normal mb-2">
{cardData?.title || '친절한 서비스를 고객을 맞게 만들어보아요!'}
</p>

<div className="flex flex-wrap items-center justify-between gap-1">
<div className="flex flex-wrap items-center gap-1">
{cardData?.visa && (
<Tag
value={cardData.visa.replace(/_/g, '-')}
padding="py-[0.188rem] px-[0.25rem]"
isRounded={false}
hasCheckIcon={false}
backgroundColor="bg-surface-secondary"
color="text-text-alternative"
fontStyle="caption-12-regular"
/>
)}
</div>

<EmployeeCardBookmark
isBookmarked={cardData?.is_bookmarked}
bookmarkCount={cardData?.bookmark_count}
onBookmarkClick={handleClickBookmark}
variant="with-count"
/>
</div>
</div>
</article>
);
};

export default EmployeeCard;
43 changes: 43 additions & 0 deletions src/components/Common/EmployeeCard/EmployeeCardBookmark.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import BookmarkIcon from '@/assets/icons/BookmarkIcon.svg?react';
import BookmarkCheckedIcon from '@/assets/icons/BookmarkCheckedIcon.svg?react';
import { MouseEvent } from 'react';

type EmployeeCardBookmarkProps = {
isBookmarked: boolean;
bookmarkCount?: number;
onBookmarkClick: (e: MouseEvent) => void;
variant?: 'icon-only' | 'with-count';
className?: string;
};

const EmployeeCardBookmark = ({
isBookmarked,
bookmarkCount,
onBookmarkClick,
variant = 'icon-only',
className = '',
}: EmployeeCardBookmarkProps) => {
if (variant === 'with-count') {
return (
<div
className={`flex items-center gap-1 caption-12-regular text-text-alternative ${className}`}
>
<button
className="flex items-center justify-center w-4 h-4"
onClick={onBookmarkClick}
>
{isBookmarked ? <BookmarkCheckedIcon /> : <BookmarkIcon />}
</button>
{bookmarkCount ?? 0}
</div>
);
}

return (
<button className={className} onClick={onBookmarkClick}>
{isBookmarked ? <BookmarkCheckedIcon /> : <BookmarkIcon />}
</button>
);
};

export default EmployeeCardBookmark;
18 changes: 18 additions & 0 deletions src/components/Common/EmployeeCard/EmployeeCardEmptyState.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import EmptyJobIcon from '@/assets/icons/EmptyJobIcon.svg?react';
import { postTranslation } from '@/constants/translation';

const EmployeeCardEmptyState = () => {
return (
<div className="w-full px-4 pt-[20vh] flex flex-col justify-center items-center gap-1">
<EmptyJobIcon />
<h3 className="heading-20-semibold text-text-strong">
찾고 계신 인재가 없어요.
</h3>
<p className="body-14-regular text-text-alternative text-center">
{postTranslation.emptySearchResultContent.ko}
</p>
</div>
);
};

export default EmployeeCardEmptyState;
3 changes: 3 additions & 0 deletions src/components/Common/EmployeeCard/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export { default as EmployeeCard } from '@/components/Common/EmployeeCard/EmployeeCard';
export { default as EmployeeCardBookmark } from '@/components/Common/EmployeeCard/EmployeeCardBookmark';
export { default as EmployeeCardEmptyState } from '@/components/Common/EmployeeCard/EmployeeCardEmptyState';
Loading