Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* @froggy1014 @azure-553 @ProdMoon @frontman-git @saseungmin @danmin20 @tara-JSW @joel-jo-querypie @jiji-hoon96 @KimHunJin @hy57in @synuns @sudosubin
9 changes: 9 additions & 0 deletions .github/auto_assign.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
addReviewers: true
addAssignees: true

reviewers:
- azure-553
- ProdMoon
- froggy1014
- frontman-git

4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ dist-ssr
*.sln
*.sw?

.env
.env*

# Zero Install: https://yarnpkg.com/features/zero-installs
.yarn/*
Expand All @@ -37,3 +37,5 @@ dist-ssr

# google spreadsheet data
src/db/*.json
.vercel

1 change: 1 addition & 0 deletions next.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ const nextConfig = {
},
output: 'standalone',
images: {
unoptimized: true,
remotePatterns: [
{
protocol: 'https',
Expand Down
8 changes: 3 additions & 5 deletions src/app/people/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,14 +31,12 @@ function Page({ searchParams }: { searchParams?: SearchParams }) {
.sort((a, b) => sortDescending(a[0], b[0]))
.map(([generation]) => generation);

const selectedPeopleGeneration = searchParams?.generation || '2';
const selectedPeopleGeneration = searchParams?.generation || '3';
const currentPeople = people[selectedPeopleGeneration];

const sortedCurrentPeople = [...currentPeople].sort((a, b) => {
if (a.isOrganizer || b.isOrganizer) {
return 1;
}

if (a.isOrganizer && !b.isOrganizer) return -1;
if (!a.isOrganizer && b.isOrganizer) return 1;
return a.name.localeCompare(b.name);
});

Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
'use client';

import dynamic from 'next/dynamic';

import { sendGAEvent } from '@next/third-parties/google';

import Button from '@/components/molecules/Button';
import RecruitmentSummary from '@/components/organisms/home/RecruitmentSummary';
import useCopy from '@/hook/useCopyToClipboard';
import { displayApplication, getCurrentStatus } from '@/libs/utils/recruit';

import styles from './index.module.scss';

const RecruitmentSummary = dynamic(
() => import('@/components/organisms/home/RecruitmentSummary'),
{ ssr: false },
);

function RecruitmentStatusSection() {
const now = Date.now();
const currentStatus = getCurrentStatus(now);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
.timerWrapper {
display: flex;
flex-direction: column;
align-items: center;
gap: 1rem;

.timerDescription {
font-size: 1.4rem;
font-weight: 500;
color: #fff;
}
}
38 changes: 26 additions & 12 deletions src/components/organisms/home/RecruitmentSummary/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,48 @@ import SummaryCard from '@/components/organisms/home/SummaryCards';
import useTimer from '@/hook/useTimer';
import { displayApplication } from '@/libs/utils/recruit';

import styles from './index.module.scss';

type Props = {
currentStatus: 'before' | 'ongoing' | 'after';
};

function RecruitmentSummary({ currentStatus }: Props) {
const isRecruiting = currentStatus !== 'after';
const currentApplicationDetail = displayApplication[currentStatus];

const { dates, hours, minutes, seconds } = useTimer(
currentApplicationDetail?.dueDate,
isRecruiting ? 1000 : null,
1000,
);

return (
<>
{currentStatus === 'after' ? (
<SummaryCard />
) : (
const elements = {
before: () => (
<div className={styles.timerWrapper}>
<div className={styles.timerDescription}>모집 시작까지</div>
<Timer
dates={dates}
hours={hours}
minutes={minutes}
seconds={seconds}
isRecruiting={isRecruiting}
isRecruiting={true}
/>
)}
</>
);
</div>
),
ongoing: () => (
<div className={styles.timerWrapper}>
<div className={styles.timerDescription}>모집 마감까지</div>
<Timer
dates={dates}
hours={hours}
minutes={minutes}
seconds={seconds}
isRecruiting={true}
/>
</div>
),
after: () => <SummaryCard />,
};

return elements[currentStatus]();
}

export default RecruitmentSummary;
4 changes: 2 additions & 2 deletions src/components/organisms/home/SummaryCards/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import styles from './index.module.scss';

const summaryData = [
{ title: '누적 지원자 수', value: '400+' },
{ title: '총 참여자 수', value: '60+' },
{ title: '누적 미션 수', value: '30+' },
{ title: '총 참여자 수', value: '101' },
{ title: '누적 미션 수', value: '51' },
];

function SummaryCards() {
Expand Down
2 changes: 1 addition & 1 deletion src/components/pages/Home/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ function Home() {
Sharing Insights <br /> with People Everyday
</h1>
<h2 className={styles.subTitle}>
개발자들이 함께 교류하며 성장하는 IT 커뮤니티
다양한 활동으로 함께 성장하는 현직 개발자들의 커뮤니티
</h2>
</div>
<RecruitmentStatusSection />
Expand Down
2 changes: 1 addition & 1 deletion src/db/model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export interface Activity {
video: ActivityVideo[];
}

export type PeopleGeneration = '1' | '2' | 'contribute';
export type PeopleGeneration = '1' | '2' | '3' | 'contribute';

export type People = Record<PeopleGeneration, PeopleItem[]>;

Expand Down
55 changes: 30 additions & 25 deletions src/libs/constants/recruit.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
export const CURRENT_GENERATION = 3;
export const APPLICATION_START_DATE = new Date('2024-09-08 00:00:00');
export const APPLICATION_DUE_DATE = new Date('2024-09-22 23:59:59');
export const CURRENT_GENERATION = 4;
export const APPLICATION_START_DATE = new Date('2025-03-11 00:00:00');
export const APPLICATION_DUE_DATE = new Date('2025-03-23 23:59:59');

export const JOIN_FORM_URL = 'https://forms.gle/D1ZsAb48whk1HB8J7';
export const JOIN_ALARM_FORM_URL = 'https://forms.gle/K2DiBkmJbhSM7MAx9';
export const JOIN_NEXT_ALARM_FORM_URL = 'https://forms.gle/vgvMiG2pkoJvWfbZA';
export const JOIN_FORM_URL = 'https://forms.gle/SPM3xXTVrnvupcLDA';
export const JOIN_ALARM_FORM_URL = 'https://forms.gle/q9wdvKhEyZmTZGS97';
export const JOIN_NEXT_ALARM_FORM_URL = 'https://forms.gle/VS7Ap4xfSyf2qYqQ6';

export const Applicants = [
{
Expand All @@ -22,77 +22,82 @@ export const Applicants = [

export const InActivity = [
{
recurring_date: '1회차 (10.12)',
recurring_date: '1회차 (04.26)',
text: 'OT',
badge: '',
},
{
recurring_date: '2회차 (10.26)',
recurring_date: '2회차 (05.10)',
text: 'MT',
badge: '1차 미션 시작',
},
{
recurring_date: '3회차 (11.09)',
recurring_date: '3회차 (05.24)',
text: '사이프챗',
badge: '',
},
{
recurring_date: '4회차 (11.23)',
text: '사이데이션',
recurring_date: '4회차 (06.07)',
text: '홈커밍데이',
badge: '',
},
{
recurring_date: '5회차 (12.07)',
recurring_date: '5회차 (06.21)',
text: '1차 미션 발표',
badge: '',
},
{
recurring_date: '6회차 (12.21)',
text: '사담콘',
recurring_date: '6회차 (07.05)',
text: '스파크 세션',
badge: '2차 미션 시작',
},
{
recurring_date: '7회차 (01.04)',
text: '내친소',
recurring_date: '7회차 (07.19)',
text: '사이데이션',
badge: '',
},
{
recurring_date: '8회차 (01.18)',
text: '사이프톤',
recurring_date: '8회차 (08.02)',
text: '사담콘',
badge: '',
},
{
recurring_date: '9회차 (02.01)',
recurring_date: '9회차 (08.16)',
text: '2차 미션 발표',
badge: '',
},
{
recurring_date: '10회차 (08.30)',
text: '사이프-로그',
badge: '정규 활동 종료',
},
];

export const CardList = [
{
title: '서류 접수',
processDate: '09.08(일) ~ 09.22(일)',
subTitle: '23:59:59 마감',
processDate: '03.11(화) ~ 03.23(일)',
subTitle: '23일 자정에 접수 마감',
},
{
title: '서류 합격자 발표',
processDate: '09.27(금)',
processDate: '03.28(금)',
subTitle: '오후 1시 예정',
},
{
title: '오프라인 인터뷰',
processDate: '10.03(목) ~ 10.06(일)',
processDate: '04.12(토) ~ 04.13(일)',
subTitle: '서류합격자 개별연락',
},

{
title: '최종 합격자 발표',
processDate: '10.08(화)',
processDate: '04.18(금)',
subTitle: '오후 1시 예정',
},
{
title: '정규 활동 시작',
processDate: '10.12(토)',
processDate: '04.26(토)',
subTitle: 'OT 진행',
},
];