Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
4b08f84
chore: mockServiceWorker.js๋ฅผ ๋ฌด์‹œํ•˜๊ธฐ์œ„ํ•œ .eslintignore ์ถ”๊ฐ€
seongwon030 Apr 5, 2026
ea8e751
docs: CLAUDE.md์—์„œ API ํ—ฌํผ ํ•จ์ˆ˜ ์„ค๋ช… ์—…๋ฐ์ดํŠธ
seongwon030 Apr 5, 2026
fcbdf0b
style: CalendarSyncTab stylesํŒŒ์ผ theme์ƒ์ˆ˜์ ์šฉ
seongwon030 Apr 5, 2026
8ee2431
style: media์ƒ์ˆ˜๋กœ media Query๋ณ€๊ฒฝ
seongwon030 Apr 5, 2026
f91e505
fix: Notion ์บ˜๋ฆฐ๋” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹ ์—…๋ฐ์ดํŠธ
seongwon030 Apr 5, 2026
eb6e4d7
feat: Google Calendar ํ†ตํ•ฉ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
seongwon030 Apr 5, 2026
5785f6e
fix: Notion ์บ˜๋ฆฐ๋” ๋ฐ์ดํ„ฐ ๋กœ๋“œ ์š”์ฒญ ๊ด€๋ฆฌ ๊ฐœ์„ 
seongwon030 Apr 5, 2026
58fff52
fix: ๊ฐœ์„ ๋œ Notion ์บ˜๋ฆฐ๋” ์ด๋ฒคํŠธ ์ดˆ๊ธฐํ™” ๋กœ์ง
seongwon030 Apr 5, 2026
021db50
fix: Notion OAuth ์ธ์ฆ ์ •๋ณด ์ฒ˜๋ฆฌ ๊ฐœ์„ 
seongwon030 Apr 5, 2026
bc5a817
fix: CalendarSyncTab ์ดˆ๊ธฐํ™” ๋กœ์ง ๊ฐœ์„ 
seongwon030 Apr 5, 2026
2594106
fix: ๊ฐœ์„ ๋œ activeTab ๋กœ์ง ๋ฐ useEffect ์ถ”๊ฐ€
seongwon030 Apr 5, 2026
4d0b10a
fix: ๊ฐœ์„ ๋œ ClubScheduleCalendar ์ดˆ๊ธฐํ™” ๋กœ์ง
seongwon030 Apr 5, 2026
5ff8968
fix: URL ์ธ์ฝ”๋”ฉ์„ ํ†ตํ•œ ํด๋Ÿฝ ์ƒ์„ธ ํŽ˜์ด์ง€ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฐœ์„ 
seongwon030 Apr 5, 2026
db56fed
fix: ๊ฐœ์„ ๋œ promotionNotification ๋กœ์ง
seongwon030 Apr 5, 2026
dac2e7b
fix: ๊ฐœ์„ ๋œ createState ํ•จ์ˆ˜ ๊ตฌํ˜„
seongwon030 Apr 5, 2026
6e95dda
fix: ๊ฐœ์„ ๋œ buildMonthCalendarDays ํ•จ์ˆ˜ ๋กœ์ง
seongwon030 Apr 5, 2026
6f89739
fix: ๊ฐœ์„ ๋œ formatKSTDateTime ํ•จ์ˆ˜์˜ ๋‚ ์งœ ์ฒ˜๋ฆฌ ๋กœ์ง
seongwon030 Apr 5, 2026
5e545ce
fix: ๊ฐœ์„ ๋œ sortPromotions ํ•จ์ˆ˜์˜ ์ •๋ ฌ ๋กœ์ง
seongwon030 Apr 5, 2026
ca2a297
fix: ํด๋Ÿฝ ์ƒ์„ธ ํŽ˜์ด์ง€์˜ ์บ˜๋ฆฐ๋” ์—ฐ๊ฒฐ ๋กœ์ง ๊ฐœ์„ 
seongwon030 Apr 5, 2026
0d967a5
fix: ๊ฐœ์„ ๋œ useGoogleCalendarData ํ›…์˜ ๋กœ์ง
seongwon030 Apr 5, 2026
a7a0368
fix: ClubScheduleCalendar์— key prop ์ถ”๊ฐ€
seongwon030 Apr 5, 2026
db02c97
fix: lint error
seongwon030 Apr 5, 2026
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 frontend/.eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
frontend/public/mockServiceWorker.js
1 change: 0 additions & 1 deletion frontend/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,6 @@ npm run generate:sitemap # sitemap.xml ์ƒ์„ฑ
API๋Š” `src/apis/utils/apiHelpers.ts`์˜ ํ—ฌํผ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๊ด€๋œ ํŒจํ„ด์„ ๋”ฐ๋ฆ„:

- `handleResponse<T>()` - ์‘๋‹ต ํŒŒ์‹ฑ, `{ data: {...} }` ํ˜•์‹ ์ž๋™ ์–ธ๋ž˜ํ•‘
- `withErrorHandling()` - API ํ˜ธ์ถœ์„ ์—๋Ÿฌ ๋กœ๊น…์œผ๋กœ ๋ž˜ํ•‘
- `secureFetch()` - ์ธ์ฆ๋œ ์š”์ฒญ, 403 ์‹œ ํ† ํฐ ์ž๋™ ๊ฐฑ์‹ 

์ฟผ๋ฆฌ ํ‚ค๋Š” `src/constants/queryKeys.ts`์— ์ค‘์•™ ๊ด€๋ฆฌ.
Expand Down
2 changes: 1 addition & 1 deletion frontend/public/mockServiceWorker.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
/* eslint-disable */
/* tslint:disable */

/**
Expand Down
6 changes: 6 additions & 0 deletions frontend/src/constants/queryKeys.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
export const queryKeys = {
googleCalendar: {
all: ['googleCalendar'] as const,
calendars: () => ['googleCalendar', 'calendars'] as const,
events: (calendarId: string, timeMin: string, timeMax: string) =>
['googleCalendar', 'events', calendarId, timeMin, timeMax] as const,
},
applicants: {
all: ['clubApplicants'] as const,
detail: (applicationFormId: string) =>
Expand Down
70 changes: 70 additions & 0 deletions frontend/src/hooks/Queries/useGoogleCalendar.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import {
disconnectGoogleCalendar,
fetchGoogleCalendarEvents,
fetchGoogleCalendars,
selectGoogleCalendar,
} from '@/apis/calendarOAuth';
import { queryKeys } from '@/constants/queryKeys';
import { ApiError } from '@/errors';
import type { GoogleCalendarListResponse } from '@/types/google';

export const useGetGoogleCalendars = () => {
return useQuery<GoogleCalendarListResponse | null>({
queryKey: queryKeys.googleCalendar.calendars(),
queryFn: async () => {
try {
return await fetchGoogleCalendars();
} catch (error) {
if (error instanceof ApiError && error.errorCode === '960-4') {
return null;
}
throw error;
}
},
staleTime: 5 * 60 * 1000,
});
};

export const useGetGoogleCalendarEvents = (
calendarId: string,
timeMin: string,
timeMax: string,
) => {
return useQuery({
queryKey: queryKeys.googleCalendar.events(calendarId, timeMin, timeMax),
queryFn: () => fetchGoogleCalendarEvents(calendarId, timeMin, timeMax),
staleTime: 5 * 60 * 1000,
enabled: !!calendarId,
});
};

export const useSelectGoogleCalendar = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: ({
calendarId,
calendarName,
}: {
calendarId: string;
calendarName: string;
}) => selectGoogleCalendar(calendarId, calendarName),
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: queryKeys.googleCalendar.calendars(),
});
},
});
};

export const useDisconnectGoogleCalendar = () => {
const queryClient = useQueryClient();
return useMutation({
mutationFn: disconnectGoogleCalendar,
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: queryKeys.googleCalendar.all,
});
},
});
};
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import styled from 'styled-components';
import { media } from '@/styles/mediaQuery';
import { colors } from '@/styles/theme/colors';

export const Container = styled.div`
display: flex;
Expand All @@ -9,21 +11,21 @@ export const Container = styled.div`
export const Description = styled.p`
font-size: 0.94rem;
line-height: 1.5;
color: #4b5563;
color: ${colors.gray[600]};
`;

export const ConfigGrid = styled.div`
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 14px;

@media (max-width: 1024px) {
${media.laptop} {
grid-template-columns: 1fr;
}
`;

export const Block = styled.div`
border: 1px solid #e5e7eb;
border: 1px solid ${colors.gray[300]};
border-radius: 12px;
padding: 14px;
`;
Expand Down
Loading
Loading