diff --git a/frontend/src/assets/images/pen.svg b/frontend/src/assets/images/pen.svg
new file mode 100644
index 000000000..fed0ca14e
--- /dev/null
+++ b/frontend/src/assets/images/pen.svg
@@ -0,0 +1,5 @@
+
diff --git a/frontend/src/assets/images/rotate.svg b/frontend/src/assets/images/rotate.svg
new file mode 100644
index 000000000..b3243e113
--- /dev/null
+++ b/frontend/src/assets/images/rotate.svg
@@ -0,0 +1,3 @@
+
diff --git a/frontend/src/components/Schedules/DateControlButtons/DateControlButtons.styles.ts b/frontend/src/components/Schedules/DateControlButtons/DateControlButtons.styles.ts
new file mode 100644
index 000000000..a9f236488
--- /dev/null
+++ b/frontend/src/components/Schedules/DateControlButtons/DateControlButtons.styles.ts
@@ -0,0 +1,39 @@
+import { css } from '@emotion/react';
+
+import theme from '@styles/theme';
+
+export const s_datesControlButtonContainer = css`
+ position: absolute;
+ top: 0;
+
+ display: flex;
+ justify-content: space-between;
+
+ width: 100%;
+
+ -webkit-box-pack: justify;
+`;
+
+export const s_datesControlButton = css`
+ cursor: pointer;
+
+ width: 2.8rem;
+ height: 2.8rem;
+
+ font-weight: bold;
+ color: ${theme.colors.primary};
+
+ background-color: ${theme.colors.white};
+ border: 0.1rem solid ${theme.colors.primary};
+ border-radius: 50%;
+ box-shadow: 0 0.4rem 0.4rem rgb(0 0 0 / 10%);
+
+ :disabled {
+ cursor: not-allowed;
+ opacity: 0.4;
+ }
+
+ &:last-of-type {
+ margin-right: 1rem;
+ }
+`;
diff --git a/frontend/src/components/Schedules/DateControlButtons/index.tsx b/frontend/src/components/Schedules/DateControlButtons/index.tsx
new file mode 100644
index 000000000..a92040fe2
--- /dev/null
+++ b/frontend/src/components/Schedules/DateControlButtons/index.tsx
@@ -0,0 +1,26 @@
+import { s_datesControlButton, s_datesControlButtonContainer } from './DateControlButtons.styles';
+
+interface DateControlButtons {
+ decreaseDatePage: () => void;
+ increaseDatePage: () => void;
+ isFirstPage: boolean;
+ isLastPage: boolean;
+}
+
+export default function DateControlButtons({
+ decreaseDatePage,
+ increaseDatePage,
+ isFirstPage,
+ isLastPage,
+}: DateControlButtons) {
+ return (
+
+
+
+
+ );
+}
diff --git a/frontend/src/components/Schedules/ScheduleOverview/ScheduleOverview.styles.ts b/frontend/src/components/Schedules/ScheduleOverview/ScheduleOverview.styles.ts
new file mode 100644
index 000000000..74cecfa7e
--- /dev/null
+++ b/frontend/src/components/Schedules/ScheduleOverview/ScheduleOverview.styles.ts
@@ -0,0 +1,14 @@
+import { css } from '@emotion/react';
+
+export const s_scheduleOverviewContainer = css`
+ display: flex;
+ flex-direction: column;
+ row-gap: 1.2rem;
+ margin-bottom: 1.2rem;
+`;
+
+export const s_infoTextContainer = css`
+ display: flex;
+ gap: 0.4rem;
+ align-items: center;
+`;
diff --git a/frontend/src/components/Schedules/ScheduleOverview/index.tsx b/frontend/src/components/Schedules/ScheduleOverview/index.tsx
new file mode 100644
index 000000000..bb684d763
--- /dev/null
+++ b/frontend/src/components/Schedules/ScheduleOverview/index.tsx
@@ -0,0 +1,43 @@
+import Text from '@components/_common/Text';
+
+import Information from '@assets/images/information.svg';
+
+import { s_percentage, s_percentageContainer, s_pinkProgressiveBar } from '../Schedules.styles';
+import { s_infoTextContainer, s_scheduleOverviewContainer } from './ScheduleOverview.styles';
+
+interface ScheduleOverviewProps {
+ selectedAttendee: string;
+}
+
+export default function ScheduleOverview({ selectedAttendee }: ScheduleOverviewProps) {
+ return (
+
+ {selectedAttendee === '' ? (
+
+
+ 약속 참여자들의 일정을 확인하고 있어요
+
+ ) : (
+
+
+ 님의 일정을 확인하고 있어요
+
+ )}
+
+
+
+ {selectedAttendee === ''
+ ? '시간을 클릭하여 참여할 수 있는 참여자들을 확인해 보세요'
+ : '나의 약속 참여 시간과 비교해 보세요'}
+
+
+
+
+ );
+}
diff --git a/frontend/src/components/Schedules/SchedulePicker/index.tsx b/frontend/src/components/Schedules/SchedulePicker/index.tsx
index 990230217..f9a7a5e08 100644
--- a/frontend/src/components/Schedules/SchedulePicker/index.tsx
+++ b/frontend/src/components/Schedules/SchedulePicker/index.tsx
@@ -1,4 +1,3 @@
-import { css } from '@emotion/react';
import { useContext, useState } from 'react';
import { useParams } from 'react-router-dom';
import type { MeetingDateTime } from 'types/meeting';
@@ -8,23 +7,29 @@ import { TimePickerUpdateStateContext } from '@contexts/TimePickerUpdateStatePro
import ScheduleTimeList from '@components/Schedules/ScheduleTableFrame/ScheduleTimeList';
import { Button } from '@components/_common/Buttons/Button';
+import TabButton from '@components/_common/Buttons/TabButton';
+import Text from '@components/_common/Text';
import usePagedTimePick from '@hooks/usePagedTimePick/usePagedTimePick';
import { usePostScheduleMutation } from '@stores/servers/schedule/mutations';
+import Rotate from '@assets/images/rotate.svg';
+
+import DateControlButtons from '../DateControlButtons';
import ScheduleDateDayList from '../ScheduleTableFrame/ScheduleDateDayList';
import {
s_baseTimeCell,
- s_buttonContainer,
+ s_bottomFixedButtonContainer,
s_cellColorBySelected,
- s_datesControlButton,
- s_datesControlButtonContainer,
+ s_circleButton,
+ s_fullButtonContainer,
s_relativeContainer,
s_scheduleTable,
s_scheduleTableBody,
s_scheduleTableContainer,
s_scheduleTableRow,
+ s_selectModeButtonsContainer,
} from '../Schedules.styles';
import { convertToSchedule, generateSingleScheduleTable } from '../Schedules.util';
@@ -68,7 +73,7 @@ export default function SchedulePicker({
isLastPage,
} = usePagedTimePick(availableDates, schedules);
- const { mutate: postScheduleMutate } = usePostScheduleMutation(() =>
+ const { mutate: postScheduleMutate, isPending } = usePostScheduleMutation(() =>
handleToggleIsTimePickerUpdate(),
);
@@ -93,73 +98,74 @@ export default function SchedulePicker({
};
return (
-
-
-
-
/
-
-
시간으로 선택하기
-
- {isMultiPage && (
-
-