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
4 changes: 2 additions & 2 deletions src/features/dashboard/ui/MultiplePieCharts.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ const MultiplePieCharts = ({ responses }: MultiplePieChartsProps) => {
return (
<div key={`${option.optionId}-${index}`} className="flex flex-col items-center">
<h3 className="mb-2 font-semibold text-lg">{option.optionName}</h3>
<ResponsiveContainer width="100%" height={300}>
<ResponsiveContainer width="100%" height={350}>
<PieChart>
<Pie data={data} dataKey="value" nameKey="name" cx="50%" cy="50%" outerRadius={80} label stroke="none">
<Pie data={data} dataKey="value" nameKey="name" cx="50%" cy="50%" outerRadius={90} label stroke="none">
{data.map((_, i) => (
<Cell key={`cell-${i}`} fill={COLORS[i % COLORS.length]} />
))}
Expand Down
80 changes: 49 additions & 31 deletions src/features/event/ui/EventFunnel.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,33 +7,52 @@ import EventTypePage from '../../../pages/event/ui/create-event/EventTypePage';
import EventTagPage from '../../../pages/event/ui/create-event/EventTagPage';
import EventOrganizerInfoPage from '../../../pages/event/ui/create-event/EventOrganizerInfoPage';
import EventRegisterLayout from '../../../shared/ui/backgrounds/EventRegisterLayout';
import { useNavigate } from 'react-router-dom';
import { useLocation, useNavigate } from 'react-router-dom';
import { EventFunnelInterface, StepNames } from '../../../shared/types/funnelType';
import { useFunnelState } from '../model/FunnelContext';
import { useEventCreation } from '../hooks/useEventHook';
import { useHostCreation } from '../../host/hook/useHostHook';
import { HostCreationRequest } from '../../host/model/host';
import { useState } from 'react';

const EventFunnel = ({ onNext, onPrev, Funnel, Step, currentStep }: EventFunnelInterface) => {
const EventFunnel = ({ onNext, Funnel, Step, currentStep }: EventFunnelInterface) => {
const navigate = useNavigate();
const { eventState, hostState, setHostState } = useFunnelState();
const { mutate: createEvent } = useEventCreation();
const { mutate: createHost } = useHostCreation();
const location = useLocation();
const [backPath] = useState(location.state?.backPath ?? '/');

const stepOrder = [
StepNames.HostSelection,
StepNames.HostCreation,
StepNames.EventTitle,
StepNames.EventPeriod,
StepNames.EventOrganizerInfo,
StepNames.EventInfo,
StepNames.EventType,
StepNames.EventTag,
] as const;
const stepNameToIndex = (name: StepNames) => stepOrder.indexOf(name);

const goTo = (stepName: StepNames) => {
const index = stepNameToIndex(stepName);
onNext(String(index));
};

const handleNext = (nextStep: string) => {
if (currentStep === 7) {
createEvent(eventState, {
onSuccess: () => {
navigate('/menu/myHost');
},
onError: error => {
console.error('API 호출 실패:', error);
},
});
} else {
onNext(nextStep);
}
onNext(nextStep);
};
const handleCreateEvent = () => {
createEvent(eventState, {
onSuccess: () => {
navigate('/menu/myHost');
},
onError: error => {
console.error('API 호출 실패:', error);
},
});
}
const initialHostState: HostCreationRequest = {
profileImageUrl: '',
hostChannelName: '',
Expand All @@ -45,7 +64,7 @@ const EventFunnel = ({ onNext, onPrev, Funnel, Step, currentStep }: EventFunnelI
createHost(hostState, {
onSuccess: () => {
setHostState(initialHostState);
handleNext(String(currentStep - 1));
goTo(StepNames.HostSelection);
},
onError: error => {
const message = error?.message || '호스트 생성에 실패했습니다. 다시 시도해주세요.';
Expand All @@ -59,8 +78,8 @@ const EventFunnel = ({ onNext, onPrev, Funnel, Step, currentStep }: EventFunnelI
<Step name={StepNames.HostSelection}>
<EventRegisterLayout
title="이벤트를 호스팅할 채널을 선택해주세요"
onNext={() => handleNext(String(currentStep + 2))}
onPrev={() => navigate('/')}
onNext={() => goTo(StepNames.EventTitle)}
onPrev={() => navigate(backPath)}
requireValidation={true}
>
<HostSelectionPage onNext={handleNext} currentStep={currentStep} />
Expand All @@ -70,7 +89,7 @@ const EventFunnel = ({ onNext, onPrev, Funnel, Step, currentStep }: EventFunnelI
<EventRegisterLayout
title="채널을 새로 생성합니다"
onNext={() => handleHostCreation()}
onPrev={() => onPrev(String(currentStep - 1))}
onPrev={() => goTo(StepNames.HostSelection)}
requireValidation={true}
>
<HostCreationPage />
Expand All @@ -79,9 +98,8 @@ const EventFunnel = ({ onNext, onPrev, Funnel, Step, currentStep }: EventFunnelI
<Step name={StepNames.EventTitle}>
<EventRegisterLayout
title="이벤트 제목을 입력해주세요"
onNext={() => handleNext(String(currentStep + 1))}
onPrev={() => onPrev(String(currentStep - 1))}
goHome={true}
onNext={() => goTo(StepNames.EventPeriod)}
onPrev={() => goTo(StepNames.HostSelection)}
requireValidation={true}
>
<EventTitlePage />
Expand All @@ -90,17 +108,17 @@ const EventFunnel = ({ onNext, onPrev, Funnel, Step, currentStep }: EventFunnelI
<Step name={StepNames.EventPeriod}>
<EventRegisterLayout
title="이벤트 기간을 입력해주세요"
onNext={() => handleNext(String(currentStep + 1))}
onPrev={() => onPrev(String(currentStep - 1))}
onNext={() => goTo(StepNames.EventOrganizerInfo)}
onPrev={() => goTo(StepNames.EventTitle)}
>
<EventPeriodPage />
</EventRegisterLayout>
</Step>
<Step name={StepNames.EventOrganizerInfo}>
<EventRegisterLayout
title="이벤트 주최자 정보를 입력해주세요"
onNext={() => handleNext(String(currentStep + 1))}
onPrev={() => onPrev(String(currentStep - 1))}
onNext={() => goTo(StepNames.EventInfo)}
onPrev={() => goTo(StepNames.EventPeriod)}
requireValidation={true}
>
<EventOrganizerInfoPage />
Expand All @@ -109,8 +127,8 @@ const EventFunnel = ({ onNext, onPrev, Funnel, Step, currentStep }: EventFunnelI
<Step name={StepNames.EventInfo}>
<EventRegisterLayout
title="이벤트 정보를 입력해주세요"
onNext={() => handleNext(String(currentStep + 1))}
onPrev={() => onPrev(String(currentStep - 1))}
onNext={() => goTo(StepNames.EventType)}
onPrev={() => goTo(StepNames.EventOrganizerInfo)}
requireValidation={true}
>
<EventInfoPage />
Expand All @@ -119,16 +137,16 @@ const EventFunnel = ({ onNext, onPrev, Funnel, Step, currentStep }: EventFunnelI
<Step name={StepNames.EventType}>
<EventRegisterLayout
title="이벤트 진행방식을 선택해주세요"
onNext={() => handleNext(String(currentStep + 1))}
onPrev={() => onPrev(String(currentStep - 1))}
onNext={() => goTo(StepNames.EventTag)}
onPrev={() => goTo(StepNames.EventInfo)}
>
<EventTypePage />
</EventRegisterLayout>
</Step>
<Step name={StepNames.EventTag}>
<EventRegisterLayout
onNext={() => handleNext(String(currentStep + 1))}
onPrev={() => onPrev(String(currentStep - 1))}
onNext={() => handleCreateEvent()}
onPrev={() => goTo(StepNames.EventType)}
>
<EventTagPage />
</EventRegisterLayout>
Expand Down
10 changes: 7 additions & 3 deletions src/pages/menu/ui/MenuPage.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
import { flexColumn } from '../../../../design-system/styles/flex';
import HorizontalCardButton from '../../../../design-system/ui/buttons/HorizontalCardButton';
import { useNavigate } from 'react-router-dom';
import { NavigateOptions, To, useNavigate } from 'react-router-dom';
import Header from '../../../../design-system/ui/Header';
import { getButtonData } from '../../../shared/types/menuType';
import BottomBar from '../../../widgets/main/ui/BottomBar';

const handleIconClick = (navigate: (path: string) => void, path: string, url?: string) => {
const handleIconClick = (navigate: (to: To, options?: NavigateOptions) => void, path: string, url?: string, backPath?: string) => {
if (url) {
window.open(url, '_blank');
} else if (path && backPath) {
navigate(path, {
state: { backPath: '/menu' },
});
} else if (path) {
navigate(path);
}
Expand All @@ -27,7 +31,7 @@ const MenuPage = () => {
iconPath={<img src={button.iconPath} alt={button.label} className="w-6 h-6 md:w-7 md:h-7" />}
hoverIconPath={<img src={button.hoverIconPath} alt={button.label} className="w-6 h-6 md:w-7 md:h-7" />}
label={button.label}
onClick={() => handleIconClick(navigate, button.path, button.url)}
onClick={() => handleIconClick(navigate, button.path, button.url, button.backPath)}
/>
{button.label !== '내 호스트' && index !== buttonData.length - 1 && (
<hr className="mt-5 border-[0.5px] border-gray4" />
Expand Down
3 changes: 2 additions & 1 deletion src/shared/types/menuType.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ export interface buttonData {
label: string; // 버튼 텍스트
path: string; // 경로
url?: string; // 외부 url
backPath?: string
}

export const getButtonData = (): buttonData[] => {
Expand All @@ -30,7 +31,7 @@ export const getButtonData = (): buttonData[] => {
const baseButtons: buttonData[] = [
{ iconPath: Ticket, hoverIconPath: SelectedTicket, label: '구입한 티켓', path: '/menu/myTicket' },
{ iconPath: Host, hoverIconPath: SelectedHost, label: '내 호스트', path: '/menu/myHost' },
{ iconPath: Event, hoverIconPath: SelectedEvent, label: '이벤트 주최하기', path: '/event-creation' },
{ iconPath: Event, hoverIconPath: SelectedEvent, label: '이벤트 주최하기', path: '/event-creation', backPath:'/menu' },
{ iconPath: Setting, hoverIconPath: SelectedSetting, label: '마이페이지', path: '/menu/myPage' },
{ iconPath: Manual, hoverIconPath: SelectedManual, label: '사용법', path: '/menu/myTicket', url: USER_MANUAL_URL },
];
Expand Down
2 changes: 1 addition & 1 deletion src/widgets/dashboard/ui/response/ResponseModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ const ResponesModal = ({ onClose }: ResponesModalProps) => {
onClose();
}}
/>
<h1 className="font-bold text-lg">응답을 확인할 티켓을 선택하세요</h1>
<h1 className="font-bold text-lg sm:text-sm">응답을 확인할 티켓을 선택하세요</h1>
</div>
{isLoading ? (
<div>로딩 중...</div>
Expand Down
4 changes: 2 additions & 2 deletions src/widgets/dashboard/ui/ticket/SelectTicketInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ const SelectTicketInfo = ({ tickets, onClick }: SelectTicketInfoProps) => {
<div className="flex items-center justify-between w-full h-14 bg-white border-[0.5px] border-[#D9D9D9] rounded-[5px]">
<div className="flex items-center gap-3 ml-4">
<img src={ticket} alt="티켓 아이콘" />
<p className="font-bold text-base">{tickets.ticketName}</p>
<p className="text-14">{tickets.ticketPrice}원</p>
<p className="font-bold text-base sm:text-xs">{tickets.ticketName}</p>
<p className="text-14 sm:text-sm">{tickets.ticketPrice}원</p>
</div>
<div className="flex items-center justify-center bg-main w-20 h-14 rounded-r-[5px]">
<TextButton label=">" onClick={onClick} className="text-white text-xl font-bold" />
Expand Down