- 일정 등록 및 조회 컴포넌트 설계 및 구현 중
This commit is contained in:
@@ -1,7 +1,8 @@
|
|||||||
import { cn } from "@/lib/utils";
|
import { cn } from "@/lib/utils";
|
||||||
import { Calendar } from "@/components/ui/calendar";
|
import { Calendar } from "@/components/ui/calendar";
|
||||||
import { useLayoutEffect, useRef, useState } from "react";
|
import { useEffect, useLayoutEffect, useRef, useState } from "react";
|
||||||
import { dateMatchModifiers, getDefaultClassNames } from "react-day-picker";
|
import { getDefaultClassNames } from "react-day-picker";
|
||||||
|
import { ScheduleSheet } from "../popover/SchedulePopover";
|
||||||
|
|
||||||
interface CustomCalendarProps {
|
interface CustomCalendarProps {
|
||||||
data?: any;
|
data?: any;
|
||||||
@@ -9,6 +10,8 @@ interface CustomCalendarProps {
|
|||||||
|
|
||||||
export const CustomCalendar = ({ data }: CustomCalendarProps) => {
|
export const CustomCalendar = ({ data }: CustomCalendarProps) => {
|
||||||
const [weekCount, setWeekCount] = useState(5);
|
const [weekCount, setWeekCount] = useState(5);
|
||||||
|
const [selectedDate, setSelectedDate] = useState<Date | undefined>(undefined);
|
||||||
|
const [sheetOpen, setSheetOpen] = useState(false);
|
||||||
const defaultClassNames = getDefaultClassNames();
|
const defaultClassNames = getDefaultClassNames();
|
||||||
const containerRef = useRef<HTMLDivElement>(null);
|
const containerRef = useRef<HTMLDivElement>(null);
|
||||||
const updateWeekCount = () => {
|
const updateWeekCount = () => {
|
||||||
@@ -24,26 +27,29 @@ export const CustomCalendar = ({ data }: CustomCalendarProps) => {
|
|||||||
updateWeekCount();
|
updateWeekCount();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
setSheetOpen(!!selectedDate);
|
||||||
|
}, [selectedDate]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
className="w-full h-full"
|
className="w-full h-full"
|
||||||
ref={containerRef}
|
ref={containerRef}
|
||||||
>
|
>
|
||||||
|
<ScheduleSheet
|
||||||
|
open={sheetOpen} setOpen={setSheetOpen} date={selectedDate}
|
||||||
|
/>
|
||||||
<Calendar
|
<Calendar
|
||||||
mode="single"
|
mode="single"
|
||||||
className="h-full w-full border rounded-lg"
|
className="h-full w-full border rounded-lg"
|
||||||
|
selected={selectedDate}
|
||||||
|
onSelect={setSelectedDate}
|
||||||
onMonthChange={() => {
|
onMonthChange={() => {
|
||||||
// month 바뀐 직후 DOM 변화가 생기므로 다음 프레임에서 계산
|
// month 바뀐 직후 DOM 변화가 생기므로 다음 프레임에서 계산
|
||||||
requestAnimationFrame(() => {
|
requestAnimationFrame(() => {
|
||||||
updateWeekCount();
|
updateWeekCount();
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
labels={{
|
|
||||||
labelDayButton: (date, modifiers) => {
|
|
||||||
console.log(modifiers);
|
|
||||||
return `${date.getDate()}`
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
classNames={{
|
classNames={{
|
||||||
months: cn(
|
months: cn(
|
||||||
defaultClassNames.months,
|
defaultClassNames.months,
|
||||||
@@ -79,21 +85,24 @@ export const CustomCalendar = ({ data }: CustomCalendarProps) => {
|
|||||||
),
|
),
|
||||||
day_button: cn(
|
day_button: cn(
|
||||||
defaultClassNames.day_button,
|
defaultClassNames.day_button,
|
||||||
"h-full w-full flex p-2 justify-start items-start"
|
"h-full w-full flex p-2 justify-start items-start",
|
||||||
|
"hover:bg-transparent",
|
||||||
|
"data-[selected-single=true]:bg-transparent data-[selected-single=true]:text-black"
|
||||||
),
|
),
|
||||||
selected: cn(
|
selected: cn(
|
||||||
defaultClassNames.selected,
|
defaultClassNames.selected,
|
||||||
"h-full"
|
"h-full border-0 fill-transparent"
|
||||||
),
|
),
|
||||||
today: cn(
|
today: cn(
|
||||||
defaultClassNames.today,
|
defaultClassNames.today,
|
||||||
"h-full"
|
"h-full"
|
||||||
)
|
),
|
||||||
|
|
||||||
}}
|
}}
|
||||||
styles={{
|
styles={{
|
||||||
day: {
|
day: {
|
||||||
height: `calc(100%/${weekCount})`
|
height: `calc(100%/${weekCount})`
|
||||||
}
|
},
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
22
src/ui/component/popover/SchedulePopover.tsx
Normal file
22
src/ui/component/popover/SchedulePopover.tsx
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import { Sheet, SheetContent, SheetHeader } from '@/components/ui/sheet';
|
||||||
|
import { useEffect, useState } from 'react';
|
||||||
|
|
||||||
|
interface ScheduleSheetProps {
|
||||||
|
date: Date | undefined;
|
||||||
|
open: boolean;
|
||||||
|
setOpen: (open: boolean) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ScheduleSheet = ({ date, open, setOpen }: ScheduleSheetProps) => {
|
||||||
|
return (
|
||||||
|
<Sheet open={open} onOpenChange={setOpen}>
|
||||||
|
<SheetContent
|
||||||
|
className="md:w-[500px] sm:w-[400px] lg:w-[600px]"
|
||||||
|
side="right"
|
||||||
|
|
||||||
|
>
|
||||||
|
<SheetHeader></SheetHeader>
|
||||||
|
</SheetContent>
|
||||||
|
</Sheet>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -21,7 +21,7 @@ import { useIsMobile } from '@/hooks/use-mobile';
|
|||||||
|
|
||||||
export default function LoginPage() {
|
export default function LoginPage() {
|
||||||
const [isLoading, setIsLoading] = useState<boolean>(false);
|
const [isLoading, setIsLoading] = useState<boolean>(false);
|
||||||
const [autoLogin, setAutoLogin] = useState<boolean>(false);
|
const [autoLogin, setAutoLogin] = useState<boolean>(localStorage.getItem('autoLogin') === 'true');
|
||||||
const { login } = useAuthStore();
|
const { login } = useAuthStore();
|
||||||
const isMobile = useIsMobile();
|
const isMobile = useIsMobile();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
@@ -36,7 +36,7 @@ export default function LoginPage() {
|
|||||||
const { id, password } = { id: loginForm.watch('id'), password: loginForm.watch('password') };
|
const { id, password } = { id: loginForm.watch('id'), password: loginForm.watch('password') };
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
localStorage.setItem('autoLogin', `${autoLogin}`)
|
localStorage.setItem('autoLogin', `${autoLogin}`);
|
||||||
}, [autoLogin]);
|
}, [autoLogin]);
|
||||||
|
|
||||||
const moveToSignUpPage = useCallback(() => {
|
const moveToSignUpPage = useCallback(() => {
|
||||||
@@ -74,6 +74,9 @@ export default function LoginPage() {
|
|||||||
refreshToken: res.data.refreshToken!
|
refreshToken: res.data.refreshToken!
|
||||||
};
|
};
|
||||||
login({...data});
|
login({...data});
|
||||||
|
if (autoLogin) {
|
||||||
|
localStorage.setItem('auth-storage', JSON.stringify({ state: data }));
|
||||||
|
}
|
||||||
moveToHomePage();
|
moveToHomePage();
|
||||||
return "로그인 성공";
|
return "로그인 성공";
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Reference in New Issue
Block a user