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
2 changes: 1 addition & 1 deletion src/features/dashboard/hook/useEmailHook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export const useSendEmail = () => {
navigate(`/dashboard/${id}/mailBox`);
},
onError: () => {
alert('메일 전송에 실패했습니다. 다시 시도해 주세요.');
alert(`메일 전송에 실패했습니다. 다시 시도해 주세요.`);
},
});
};
Expand Down
2 changes: 1 addition & 1 deletion src/features/dashboard/model/store/EmailStore.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ interface EmailState {
title: string;
content: string;
recipients: string[];
reservationDate: string; // 2025-05-01T14:00:00.000Z
reservationDate: string; // 2025-05-01T14:00:00
targetType: 'ALL' | 'TICKET';
ticketId: number;
setReservationEmailId: (reservationEmailId: number) => void;
Expand Down
44 changes: 37 additions & 7 deletions src/features/event/ui/DatePicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import DatePicker from 'react-datepicker';
import { ko } from 'date-fns/locale';
import 'react-datepicker/dist/react-datepicker.css';
import { FunnelState } from '../model/FunnelContext';
import { formatISO } from '../../../shared/lib/date';
import { formatDateLocalString, extractTimeFromDateString } from '../../../shared/lib/date';

interface DatePickerProps {
className?: string;
Expand All @@ -27,14 +27,30 @@ const EventDatePicker = ({
isLabel = false,
}: DatePickerProps) => {
const [startDate, setStartDate] = useState<Date | null>(
eventState?.startDate ? new Date(eventState.startDate) : initialStartDate ? new Date(initialStartDate) : new Date()
eventState?.startDate
? new Date(eventState.startDate)
: initialStartDate
? new Date(initialStartDate)
: new Date()
);

const [endDate, setEndDate] = useState<Date | null>(
eventState?.endDate ? new Date(eventState.endDate) : initialEndDate ? new Date(initialEndDate) : new Date()
eventState?.endDate
? new Date(eventState.endDate)
: initialEndDate
? new Date(initialEndDate)
: new Date()
);

console.log('startDate', startDate);
console.log('endDate', endDate);

const [startTime, setStartTime] = useState<string>(
extractTimeFromDateString(eventState?.startDate || initialStartDate, '06:00')
);
const [endTime, setEndTime] = useState<string>(
extractTimeFromDateString(eventState?.endDate || initialEndDate, '23:00')
);
const [startTime, setStartTime] = useState<string>('06:00');
const [endTime, setEndTime] = useState<string>('23:00');

useEffect(() => {
const start = eventState?.startDate || initialStartDate;
Expand All @@ -57,6 +73,20 @@ const EventDatePicker = ({
}
}, [eventState, initialStartDate, initialEndDate]);

useEffect(() => {
if (eventState?.startDate || initialStartDate) {
const date = new Date(eventState?.startDate || initialStartDate!);
setStartDate(date);
setStartTime(extractTimeFromDateString(eventState?.startDate || initialStartDate, '06:00'));
}
if (eventState?.endDate || initialEndDate) {
const date = new Date(eventState?.endDate || initialEndDate!);
setEndDate(date);
setEndTime(extractTimeFromDateString(eventState?.endDate || initialEndDate, '23:00'));
}
}, [eventState?.startDate, eventState?.endDate, initialStartDate, initialEndDate]);


const generateTimeOptions = () => {
const options = [];
for (let i = 0; i < 24; i++) {
Expand All @@ -73,8 +103,8 @@ const EventDatePicker = ({

useEffect(() => {
if (startDate && endDate) {
const startISO = formatISO(startDate, startTime);
const endISO = formatISO(endDate, endTime);
const startISO = formatDateLocalString(startDate, startTime);
const endISO = formatDateLocalString(endDate, endTime);

if (setEventState) {
setEventState(prev => ({
Expand Down
2 changes: 1 addition & 1 deletion src/features/event/ui/FileUpload.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ const FileUpload = ({
return (
<div className="flex flex-col justify-start gap-1">
<h1 className="font-bold text-black text-lg">배너 사진 첨부</h1>
<h2 className="text-placeholderText text-xs md:text-sm">1MB 이하의 jpeg, png 파일만 등록할 수 있습니다.</h2>
<h2 className="text-placeholderText text-xs md:text-sm">4MB 이하의 jpeg, png 파일만 등록할 수 있습니다.</h2>
<div
className={`flex flex-col items-center justify-center h-44 border border-dashed ${
isDragging ? 'border-main bg-dropdown' : 'border-placeholderText bg-gray3'
Expand Down
17 changes: 11 additions & 6 deletions src/features/event/ui/TimePicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,18 @@ const TimePicker = ({ value, onChange }: TimePickerProps) => {
useEffect(() => {
if (selectedDate) {
const formattedDate = new Date(selectedDate);
formattedDate.setHours(parseInt(selectedHour, 10));
formattedDate.setMinutes(parseInt(selectedMinute, 10));
formattedDate.setSeconds(0);
formattedDate.setMilliseconds(0);
formattedDate.setHours(Number(selectedHour), Number(selectedMinute), 0, 0);

const isoString = formattedDate.toISOString(); // 2025-05-01T14:00:00.000Z
onChange(isoString);
const year = formattedDate.getFullYear();
const month = String(formattedDate.getMonth() + 1).padStart(2, '0');
const day = String(formattedDate.getDate()).padStart(2, '0');
const hour = String(formattedDate.getHours()).padStart(2, '0');
const minute = String(formattedDate.getMinutes()).padStart(2, '0');

const localString = `${year}-${month}-${day}T${hour}:${minute}:00`;

onChange(localString);
console.log(localString);
}
}, [selectedDate, selectedHour, selectedMinute]);

Expand Down
6 changes: 3 additions & 3 deletions src/features/ticket/ui/TicketDatePicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import DatePicker from 'react-datepicker';
import { ko } from 'date-fns/locale';
import 'react-datepicker/dist/react-datepicker.css';
import { TicketState } from '../model/TicketContext';
import { formatISO } from '../../../shared/lib/date';
import { formatDateLocalString } from '../../../shared/lib/date';

interface DatePickerProps {
className?: string;
Expand Down Expand Up @@ -44,8 +44,8 @@ const TicketDatePicker = ({
const timeOptions = generateTimeOptions();

useEffect(() => {
const newStartDate = startDate ? formatISO(startDate, startTime) : '';
const newEndDate = endDate ? formatISO(endDate, endTime) : '';
const newStartDate = startDate ? formatDateLocalString(startDate, startTime) : '';
const newEndDate = endDate ? formatDateLocalString(endDate, endTime) : '';

if (setTicketState) {
setTicketState(prev => ({
Expand Down
3 changes: 3 additions & 0 deletions src/pages/dashboard/ui/EventInfoPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,14 @@ import KakaoMap from '../../../shared/ui/KakaoMap';
import { UpdateEventRequest } from '../../../features/dashboard/model/event';
import { useEventDetail } from '../../../entities/event/hook/useEventHook';
import { formatPhoneNumber } from '../../../shared/utils/phoneFormatter';
import { useNavigate } from 'react-router-dom';

const EventInfoPage = () => {
const queryClient = useQueryClient();
const [selectedOption, setSelectedOption] = useState('');
const { data } = useEventDetail();
const { mutate } = useUpdateEventHook();
const navigate = useNavigate();

const handleSelect = (option: string) => {
setSelectedOption(option);
Expand Down Expand Up @@ -62,6 +64,7 @@ const EventInfoPage = () => {
onSuccess: () => {
alert('이벤트 정보가 저장되었습니다.');
queryClient.invalidateQueries({ queryKey: ['eventDetail', data.result.id] });
navigate(`/dashboard/${data?.result.id}`);
},
onError: error => {
console.error('Error details:', error);
Expand Down
8 changes: 7 additions & 1 deletion src/pages/event/ui/create-event/EventInfoPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,18 @@ const EventInfoPage = ({ onValidationChange }: EventInfoPageProps) => {
return (
<div className="w-full px-5 space-y-8">
<FileUpload
value={eventState?.bannerImageUrl ?? ''}
eventState={eventState}
setEventState={setEventState}
useDefaultImage={false}
onValidationChange={handleFileValidation}
/>
<TextEditor eventState={eventState} setEventState={setEventState} onValidationChange={handleTextValidation} />
<TextEditor
value={eventState?.description ?? ''}
eventState={eventState}
setEventState={setEventState}
onValidationChange={handleTextValidation}
/>
<LinkInput eventState={eventState} setEventState={setEventState} />
</div>
);
Expand Down
3 changes: 2 additions & 1 deletion src/pages/join/LogoutPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ const LogoutPage = () => {
'code' in error &&
(
(error as { code?: string }).code === 'TOKEN4001' ||
(error as { code?: string }).code === 'TOKEN4004')
(error as { code?: string }).code === 'TOKEN4004'
)
) {
// 토큰 만료로 인한 자동 로그아웃이므로 조용히 처리
console.log('토큰 만료로 인한 자동 로그아웃', error);
Expand Down
24 changes: 23 additions & 1 deletion src/shared/lib/date.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,29 @@ export const formatISO = (date: Date, time: string): string => {
const kstDate = new Date(newDate.getTime() + 9 * 60 * 60 * 1000); // UTC+9
return kstDate.toISOString();
};

export const extractTimeFromDateString = (dateString?: string, defaultTime = '06:00') => {
if (!dateString) return defaultTime;
const date = new Date(dateString);
const hours = date.getHours().toString().padStart(2, '0');
const minutes = date.getMinutes().toString().padStart(2, '0');
return `${hours}:${minutes}`;
}

export const formatDateLocalString = (date: Date, time: string): string => {
const [hours, minutes] = time.split(':').map(Number);
const newDate = new Date(date);
newDate.setHours(hours, minutes, 0, 0);

const year = newDate.getFullYear();
const month = String(newDate.getMonth() + 1).padStart(2, '0');
const day = String(newDate.getDate()).padStart(2, '0');
const hour = String(newDate.getHours()).padStart(2, '0');
const minute = String(newDate.getMinutes()).padStart(2, '0');

return `${year}-${month}-${day}T${hour}:${minute}:00`;
};

export const formatUtcToKst = (utcString: string): string => {
const utcDate = new Date(utcString);

Expand All @@ -35,4 +58,3 @@ export const formatUtcToKst = (utcString: string): string => {

return `${year}년 ${month}월 ${day}일 ${hours}:${minutes}`;
};

13 changes: 11 additions & 2 deletions src/shared/ui/EventCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,17 @@ const EventCard = ({
onDeleteSuccess?.(id);
setIsModalOpen(false);
},
onError: () => {
alert('이벤트 삭제에 실패했습니다.');
onError: (error: unknown) => {
if (
typeof error === 'object' &&
error !== null &&
'code' in error &&
(
error as { code? : string}).code === "EVENT4002"
) {
console.log('참여자로 인한 이벤트 삭제 실패');
alert('구매자가 있는 이벤트는 삭제가 불가합니다.');
}
setIsModalOpen(false);
},
});
Expand Down