Skip to content

Commit b51bbe1

Browse files
committed
Merge branch 'dev' of https://github.com/imaginer-dev/DateLeaf into 164---ui-ν”„λ‘œν•„-μˆ˜μ •-κ΅¬ν˜„
2 parents a3e1c82 + 1caa21e commit b51bbe1

File tree

11 files changed

+124
-18
lines changed

11 files changed

+124
-18
lines changed

β€ŽREADME.mdβ€Ž

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,36 @@
11
# DateLeaf
2+
23
> **DateLeaf**λŠ” λ‹€μˆ˜μ˜ μ‚¬λžŒλ“€κ³Όμ˜ **λͺ¨μž„ μ‹œκ°„**을 보닀 **νŽΈλ¦¬ν•˜κ²Œ κ³„νš**ν•˜κΈ° μœ„ν•œ **μŠ€μΌ€μ€„λŸ¬** μž…λ‹ˆλ‹€.
3-
<br><br>
4-
λͺ¨μž„을 μž‘μœΌλ©΄μ„œ λͺ¨λ“  μΈμ›μ˜ 일정을 일일이 λ§žμΆ”κΈ° μ–΄λ €μšΈ λ•Œ,<br>
5-
맀번 번거둜운 νˆ¬ν‘œμ™€ 생각지 λͺ»ν•œ μ΄μ€‘μ•½μ†μœΌλ‘œ λ‚œκ°ν•  λ•Œ,<br>
6-
ν•œ λ²ˆμ— λ„ˆλ¬΄ λ§Žμ€ μŠ€μΌ€μ₯΄μ΄ λ°œμƒν•˜μ—¬ λ‚˜μ‘°μ°¨λ„ λͺ¨λ“  일정을 κΈ°μ–΅ν•˜κΈ° νž˜λ“€ λ•Œ,<br>
7-
μ„œλ‘œμ˜ 일정을 μž…λ ₯만 ν•˜λ©΄ λͺ¨λ‘κ°€ κ°€λŠ₯ν•œ λ‚ μ§œμ™€ μ‹œκ°„μ„ μžλ™μœΌλ‘œ κ³„μ‚°ν•˜μ—¬<br>
8-
보닀 νŽΈλ¦¬ν•˜κ²Œ λͺ¨μž„ κ³„νšμ„ μ„ΈμšΈμˆ˜ μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.
4+
> <br><br>
5+
> λͺ¨μž„을 μž‘μœΌλ©΄μ„œ λͺ¨λ“  μΈμ›μ˜ 일정을 일일이 λ§žμΆ”κΈ° μ–΄λ €μšΈ λ•Œ,<br>
6+
> 맀번 번거둜운 νˆ¬ν‘œμ™€ 생각지 λͺ»ν•œ μ΄μ€‘μ•½μ†μœΌλ‘œ λ‚œκ°ν•  λ•Œ,<br>
7+
> ν•œ λ²ˆμ— λ„ˆλ¬΄ λ§Žμ€ μŠ€μΌ€μ₯΄μ΄ λ°œμƒν•˜μ—¬ λ‚˜μ‘°μ°¨λ„ λͺ¨λ“  일정을 κΈ°μ–΅ν•˜κΈ° νž˜λ“€ λ•Œ,<br>
8+
> μ„œλ‘œμ˜ 일정을 μž…λ ₯만 ν•˜λ©΄ λͺ¨λ‘κ°€ κ°€λŠ₯ν•œ λ‚ μ§œμ™€ μ‹œκ°„μ„ μžλ™μœΌλ‘œ κ³„μ‚°ν•˜μ—¬<br>
9+
> 보닀 νŽΈλ¦¬ν•˜κ²Œ λͺ¨μž„ κ³„νšμ„ μ„ΈμšΈμˆ˜ μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.
910
1011
![intro](https://github.com/imaginer-dev/DateLeaf/assets/81802112/57386410-3cda-438d-9368-9216991f607f)
1112

12-
1313
## WHAT FOR?
14+
1415
ν˜„λŒ€μ‚¬νšŒμ— 뢈고 μžˆλŠ” μžκΈ°κ³„λ°œ 열풍은, μΌμ‹œμ μΈ μœ ν–‰μ„ λ„˜μ–΄ ν•˜λ‚˜μ˜ μ‚¬νšŒ ν˜„μƒμœΌλ‘œ μžλ¦¬λ§€κΉ€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.<br>
1516
μ΄λŸ¬ν•œ μžκΈ°κ³„λ°œμ˜ μ‹œλŒ€μ— μ‚¬λžŒλ“€μ€ 규λͺ¨λ„ μ’…λ₯˜λ„ λ‹€μ–‘ν•œ λͺ¨μž„ ν™œλ™μ„ ν•˜κ²Œλ˜λŠ”λ°<br>
1617
κ·Έλ•Œλ§ˆλ‹€ μˆ˜λ§Žμ€ μΌμ •λ“€μ˜ μ‘°μœ¨μ—μ„œ μ˜€λŠ” ν”Όλ‘œκ°€ 즐기고자 μ‹œμž‘ν•œ 일이 되렀 νž˜λ“€μ–΄μ§€λŠ” μ΄μœ κ°€ λ˜κΈ°λ„ ν•©λ‹ˆλ‹€.<br>
1718
μš°λ¦¬λŠ” κ·ΈλŸ¬ν•œ μ‚¬λžŒλ“€μ˜ λΆˆνŽΈν•¨μ„ μΈμ§€ν•˜μ˜€κ³ , 이 뢀뢄을 μžλ™ν™”λ‘œ λ§Œλ“€μ–΄μ„œ 보닀 νŽΈλ¦¬ν•˜κ²Œ λͺ¨μž„ κ³„νšμ„ μ„ΈμšΈμˆ˜ μžˆλ„λ‘ ν–ˆμŠ΅λ‹ˆλ‹€.
1819

1920
## YOU CAN DO.
21+
2022
![image](https://github.com/imaginer-dev/DateLeaf/assets/81802112/6663f95b-a2b0-4faa-830b-8e1ba1e7bf39)
2123

2224
![image](https://github.com/imaginer-dev/DateLeaf/assets/81802112/04b0f787-c0d4-4088-8978-0f9adf97604b)
2325

2426
## WHAT WE DO
2527

26-
2728
## WE USED
29+
2830
![image](https://github.com/imaginer-dev/DateLeaf/assets/81802112/3cd4ee87-e28a-49d1-81ba-cef8bd8c46b7)
2931

3032
## OUR CHALLENGE
3133

3234
## WHO WE ARE
35+
3336
μ΄μ˜ˆμ„œ

β€Žsrc/apis/authApis.tsβ€Ž

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,12 @@ export const searchUser = async (nickname: string) => {
7070

7171
return profiles;
7272
};
73+
74+
export const signOut = async () => {
75+
const { error } = await supabase.auth.signOut();
76+
if (error) {
77+
throw error;
78+
}
79+
80+
return true;
81+
};
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { getAllGroupMembers } from '@/apis/groupScheduleApis.ts';
2+
import supabase from '@/supabase';
3+
4+
export const getAllMemberSchedule = async (groupId: string) => {
5+
const memberList = await getAllGroupMembers(groupId);
6+
7+
const memberIdList = memberList.map((member) => member.id);
8+
9+
const { data: memberScheduleList } = await supabase
10+
.from('personal_schedules')
11+
.select('*')
12+
.in('user_id', memberIdList);
13+
14+
return memberScheduleList;
15+
};

β€Žsrc/apis/groupScheduleApis.tsβ€Ž

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import supabase from '@/supabase';
22
import { Member } from '@/types/Member';
3+
34
interface addGroupShedule {
45
title: string;
56
description: string;
@@ -73,6 +74,20 @@ interface UpdateGroupScheduleMember {
7374
groupId: string;
7475
}
7576

77+
export const getOneGroup = async (groupId: string) => {
78+
const { data, error } = await supabase.from('groups').select('*').eq('id', +groupId);
79+
80+
if (error) {
81+
throw error;
82+
}
83+
84+
if (!data) {
85+
throw new Error('데이터λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€.');
86+
}
87+
88+
return data[0];
89+
};
90+
7691
export const getOneGroupSchedule = async (scheduleId: string) => {
7792
const { data, error } = await supabase.from('group_schedules').select('*').eq('id', +scheduleId);
7893

β€Žsrc/components/common/SideBar/HamburgerButton.tsxβ€Ž

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import SideBarGroupList from './SideBarGroupList';
33
import SideBarProfile from './SideBarProfile';
44
import { useNavigate } from 'react-router-dom';
55
import { useEffect } from 'react';
6+
import SideBarSignOutButton from '@/components/common/SideBar/SideBarSignOutButton.tsx';
67

78
const HamburgerButton = () => {
89
const { data: user, isLoading, isError } = useGetProfile();
@@ -33,9 +34,12 @@ const HamburgerButton = () => {
3334
</label>
3435
<div className="drawer-side lg:w-80">
3536
<label htmlFor="my-drawer-3" aria-label="close sidebar" className="drawer-overlay"></label>
36-
<ul className="menu min-h-full w-80 bg-base-200 p-4">
37-
<SideBarProfile imageUrl={user?.image_url ?? null} userName={user?.user_name ?? ''} />
38-
<SideBarGroupList userId={user?.id ?? ''} />
37+
<ul className="menu min-h-full w-80 flex-col justify-between bg-base-200 p-4">
38+
<div>
39+
<SideBarProfile imageUrl={user?.image_url ?? null} userName={user?.user_name ?? ''} />
40+
<SideBarGroupList userId={user?.id ?? ''} />
41+
</div>
42+
<SideBarSignOutButton />
3943
</ul>
4044
</div>
4145
</div>
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { useSignOut } from '@/react-queries/useSignOut.ts';
2+
import { useNavigate } from 'react-router-dom';
3+
4+
export default function SideBarSignOutButton() {
5+
const { mutate } = useSignOut();
6+
const navigate = useNavigate();
7+
8+
const onClick = () => {
9+
mutate(undefined, {
10+
onSuccess: () => {
11+
navigate('/login');
12+
},
13+
});
14+
};
15+
16+
return (
17+
<button onClick={onClick} className={'btn btn-error font-bold'}>
18+
Sign Out
19+
</button>
20+
);
21+
}

β€Žsrc/pages/GroupSchedulePage.tsxβ€Ž

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,27 +3,39 @@ import HamburgerButton from '@/components/common/SideBar/HamburgerButton';
33
import Calendar from '@/components/common/Calendar';
44
import CreateEventDialog from '@/components/MyCalendar/CreateEventButton';
55
import { useParams } from 'react-router-dom';
6-
import { useGetOneGroupSchedule } from '@/react-queries/useGetOneGroupSchedule';
76
import { Loading } from '.';
87
import { DB_Events } from '@/utils';
8+
import { useGetOneGroup } from '@/react-queries/useGetOneGroup.ts';
9+
import { useGetAllMemberSchedule } from '@/react-queries/useGetAllMemberSchedule.ts';
910

1011
const GroupSchedulePage = () => {
1112
// TODO: μΊ˜λ¦°λ” μˆ˜μ •ν•΄μ„œ 이벀트 리슀트λ₯Ό μ™ΈλΆ€μ—μ„œ 받을 수 μžˆλ„λ‘ 해야함.
1213
// TODO: κ·Έλ£Ή μŠ€μΌ€μ€„μ„ λ°›μ•„μ˜€λŠ”κ²Œ μ•„λ‹Œ κ·Έλ£Ή 정보λ₯Ό 받아와 이름을 ν‘œν˜„ν•΄μ€˜μ•Ό ν•œλ‹€.
1314
const params = useParams<{ groupId: string }>();
1415
const groupId = params.groupId!;
1516

16-
const { data, isLoading, isError } = useGetOneGroupSchedule(groupId);
17+
const { data, isLoading, isError } = useGetOneGroup(groupId);
18+
const {
19+
data: memberScheduleList,
20+
isLoading: memberScheduleListLoading,
21+
isError: memberScheduleListError,
22+
} = useGetAllMemberSchedule(groupId);
1723

18-
if (isError) {
24+
if (isError || memberScheduleListError) {
1925
return <div>μ—λŸ¬κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.</div>;
2026
}
2127

2228
console.log(data);
2329

2430
const db_events: DB_Events[] = [];
25-
if (data) {
26-
db_events.push({ ...data, start_date: data.start_date, end_date: data.end_date, title: data.title, id: data.id });
31+
if (memberScheduleList) {
32+
const eventList: DB_Events[] = memberScheduleList.map((item) => ({
33+
start_date: item.start_date,
34+
end_date: item.end_date,
35+
title: item.title,
36+
id: item.id,
37+
}));
38+
db_events.push(...eventList);
2739
}
2840

2941
const onDelete = (id: number) => {
@@ -33,8 +45,8 @@ const GroupSchedulePage = () => {
3345

3446
return (
3547
<div className="lg:ml-80">
36-
{isLoading && <Loading size="lg" display="spinner" color="primary" />}
37-
<AppBar backButton={false} IconButton={<HamburgerButton />} calendarName={data?.title ?? ''} />
48+
{(isLoading || memberScheduleListLoading) && <Loading size="lg" display="spinner" color="primary" />}
49+
<AppBar backButton={false} IconButton={<HamburgerButton />} calendarName={data?.name ?? ''} />
3850
<main className="z-1 relative flex-grow">
3951
<div className="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
4052
<div className="rounded bg-white p-6 px-4 sm:px-0">

β€Žsrc/react-queries/queryKeys.tsβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export const queries = createQueryKeyStore({
1515
},
1616
group: {
1717
getOne: (groupId: string) => [groupId],
18+
getAllMemberSchedule: (groupId: string) => [groupId],
1819
getAll: null,
1920
update: null,
2021
updateMember: null,
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { useQuery } from '@tanstack/react-query';
2+
import { queries } from '@/react-queries/queryKeys.ts';
3+
import { getAllMemberSchedule } from '@/apis/getAllMemberSchedule.ts';
4+
5+
export const useGetAllMemberSchedule = (groupId: string) =>
6+
useQuery({
7+
queryKey: queries.group.getAllMemberSchedule(groupId).queryKey,
8+
queryFn: () => getAllMemberSchedule(groupId),
9+
});
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { useQuery } from '@tanstack/react-query';
2+
import { queries } from '@/react-queries/queryKeys.ts';
3+
import { getOneGroup } from '@/apis/groupScheduleApis.ts';
4+
5+
export const useGetOneGroup = (groupId: string) =>
6+
useQuery({
7+
queryKey: queries.group.getOne(groupId).queryKey,
8+
queryFn: () => getOneGroup(groupId),
9+
});

0 commit comments

Comments
Β (0)