멤버 목록
@@ -96,13 +105,18 @@ const HostEditPage = () => {
{selectedInfo && (
-
+
+ setEmail(e.target.value)}
+ className="h-12"
+ labelClassName="sm:text-base md:text-lg"
+ errorMessage={!emailValidation.success ? emailValidation.error.errors[0].message : ''}
+ />
+
+
{
onChange={e => setChannelDescription(e.target.value)}
className="h-24 mb-8"
/>
-
+
멤버 등록
- 이메일로 회원을 검색해 추가 할 수 있습니다. 삭제 하려면 추가된 이메일 아이콘의 x를 눌러주세요.{' '}
+ 추가할 회원의 이메일을 입력한 뒤, 엔터를 눌러 검색해 주세요.
+
+ 삭제 하려면 추가된 이메일 아이콘의 x를 눌러주세요.{' '}
diff --git a/src/shared/lib/formValidation.ts b/src/shared/lib/formValidation.ts
index 100b88f5..869d1df6 100644
--- a/src/shared/lib/formValidation.ts
+++ b/src/shared/lib/formValidation.ts
@@ -9,7 +9,7 @@ export const formSchema = z.object({
.regex(/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/, '올바른 이메일 형식이어야 합니다.'),
phone: z
.string()
- .regex(/^[0-9]{3}-[0-9]{3,4}-[0-9]{4}$/, '연락처는 휴대전화 번호 형식(예: 010-1234-5678)이어야 합니다.')
+ .regex(/^[0-9]{3}-[0-9]{3,4}-[0-9]{4}$/, '연락처는 휴대전화 번호 형식(예: 010-1234-5678)이어야 합니다.'),
});
export const organizerFormSchema = formSchema.pick({ email: true, phone: true });
export const eventTitleSchema = z.object({
@@ -21,6 +21,7 @@ export const hostCreationSchema = z.object({
channelDescription: z.string().min(5, '채널 설명은 최소 두 글자 이상이어야 합니다.'),
});
export const myPageSchema = formSchema.pick({ name: true, phone: true });
+export const hostInfoSchema = formSchema.pick({ email: true });
export type FormData = z.infer
;
export type OrganizerFormData = z.infer;
From d93f64650a21f20b42d62b106e384bcd72a4e415 Mon Sep 17 00:00:00 2001
From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com>
Date: Sun, 6 Jul 2025 00:29:16 +0900
Subject: [PATCH 4/7] =?UTF-8?q?fix:=20=ED=98=B8=EC=8A=A4=ED=8A=B8=20?=
=?UTF-8?q?=EB=A9=A4=EB=B2=84=20=ED=94=84=EB=A1=9C=ED=95=84=20=EC=9D=B4?=
=?UTF-8?q?=EB=A6=84=20=EC=97=90=EB=9F=AC=20=ED=95=B4=EA=B2=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/pages/menu/ui/myHost/HostEditPage.tsx | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/src/pages/menu/ui/myHost/HostEditPage.tsx b/src/pages/menu/ui/myHost/HostEditPage.tsx
index 9497d736..a7197994 100644
--- a/src/pages/menu/ui/myHost/HostEditPage.tsx
+++ b/src/pages/menu/ui/myHost/HostEditPage.tsx
@@ -10,6 +10,7 @@ import useHostChannelInfo from '../../../../entities/host/hook/useHostChannelInf
import { useHostInfoSave } from '../../../../features/host/hook/useHostInfoHook';
import { useInviteMembers } from '../../../../features/host/hook/useInviteHostHook';
import { hostInfoSchema } from '../../../../shared/lib/formValidation';
+import { formatProfilName } from '../../../../shared/lib/formatProfileName';
const HostEditPage = () => {
const { id } = useParams<{ id: string }>();
@@ -92,7 +93,7 @@ const HostEditPage = () => {
key={user.id}
id={user.id}
profile="userProfile"
- name={user.memberName.slice(1)}
+ name={formatProfilName(user.memberName)}
className="w-12 h-12 md:w-13 md:h-13 lg:w-14 lg:h-14 text-sm md:text-16 lg:text-base"
>
{user.memberName}
From 24b3b462e65ebcfbd5b496ec4370218a93bdb83c Mon Sep 17 00:00:00 2001
From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com>
Date: Sun, 6 Jul 2025 00:41:44 +0900
Subject: [PATCH 5/7] =?UTF-8?q?refact:=20=ED=98=B8=EC=8A=A4=ED=8A=B8=20?=
=?UTF-8?q?=EC=88=98=EC=A0=95=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=97=AD?=
=?UTF-8?q?=ED=95=A0=EB=B3=84=EB=A1=9C=20=EC=BB=B4=ED=8F=AC=EB=84=8C?=
=?UTF-8?q?=ED=8A=B8=20=EB=B6=84=EB=A6=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/entities/host/ui/HostEditForm.tsx | 61 ++++++++++++
src/entities/host/ui/HostInfo.tsx | 32 +++++++
src/entities/host/ui/MemberInvite.tsx | 30 ++++++
src/pages/menu/ui/myHost/HostEditPage.tsx | 109 ++--------------------
4 files changed, 132 insertions(+), 100 deletions(-)
create mode 100644 src/entities/host/ui/HostEditForm.tsx
create mode 100644 src/entities/host/ui/HostInfo.tsx
create mode 100644 src/entities/host/ui/MemberInvite.tsx
diff --git a/src/entities/host/ui/HostEditForm.tsx b/src/entities/host/ui/HostEditForm.tsx
new file mode 100644
index 00000000..700bbef3
--- /dev/null
+++ b/src/entities/host/ui/HostEditForm.tsx
@@ -0,0 +1,61 @@
+import { useEffect, useState } from 'react';
+import { useParams } from 'react-router-dom';
+import useHostChannelInfo from '../hook/useHostChannelInfoHook';
+import { useHostInfoSave } from '../../../features/host/hook/useHostInfoHook';
+import { hostInfoSchema } from '../../../shared/lib/formValidation';
+import DefaultTextField from '../../../../design-system/ui/textFields/DefaultTextField';
+import TertiaryButton from '../../../../design-system/ui/buttons/TertiaryButton';
+import MultilineTextField from '../../../../design-system/ui/textFields/MultilineTextField';
+
+const HostEditForm = () => {
+ const { id } = useParams<{ id: string }>();
+ const hostChannelId = Number(id);
+
+ const [email, setEmail] = useState('');
+ const [channelDescription, setChannelDescription] = useState('');
+
+ const { data: hostInfo } = useHostChannelInfo(hostChannelId);
+ const { handleSave } = useHostInfoSave(hostChannelId, hostInfo!, email, channelDescription);
+
+ const emailValidation = hostInfoSchema.safeParse({ email });
+
+ useEffect(() => {
+ if (hostInfo?.result.email) setEmail(hostInfo.result.email);
+ if (hostInfo?.result.channelDescription) setChannelDescription(hostInfo.result.channelDescription);
+ }, [hostInfo]);
+
+ return (
+
+
+ setEmail(e.target.value)}
+ className="h-12"
+ labelClassName="sm:text-base md:text-lg"
+ errorMessage={!emailValidation.success ? emailValidation.error.errors[0].message : ''}
+ />
+
+
+
+ setChannelDescription(e.target.value)}
+ className="h-24 mb-8"
+ />
+
+
+
+ );
+};
+
+export default HostEditForm;
diff --git a/src/entities/host/ui/HostInfo.tsx b/src/entities/host/ui/HostInfo.tsx
new file mode 100644
index 00000000..e49c290a
--- /dev/null
+++ b/src/entities/host/ui/HostInfo.tsx
@@ -0,0 +1,32 @@
+import ProfileCircle from '../../../../design-system/ui/Profile';
+import { formatProfilName } from '../../../shared/lib/formatProfileName';
+import { HostChannelInfoResponse } from '../model/hostChannelInfo';
+
+const HostInfo = ({ hostInfo }: { hostInfo?: HostChannelInfoResponse }) => {
+ return (
+
+
+
대표 이메일
+
{hostInfo?.result.email}
+
+
+
멤버 목록
+
+ {hostInfo?.result.hostChannelMembers.map(user => (
+
+ {user.memberName}
+
+ ))}
+
+
+
+ );
+};
+
+export default HostInfo;
diff --git a/src/entities/host/ui/MemberInvite.tsx b/src/entities/host/ui/MemberInvite.tsx
new file mode 100644
index 00000000..5f78c94a
--- /dev/null
+++ b/src/entities/host/ui/MemberInvite.tsx
@@ -0,0 +1,30 @@
+import { Dispatch, SetStateAction } from 'react';
+import TertiaryButton from '../../../../design-system/ui/buttons/TertiaryButton';
+import MemberEmailInput from '../../../features/menu/ui/MemberEmailInput';
+
+const MemberInvite = ({
+ emails,
+ setEmails,
+ handleInviteMembers,
+}: {
+ emails: string[];
+ setEmails: Dispatch>;
+ handleInviteMembers: () => void;
+}) => {
+ return (
+
+
+
멤버 등록
+
+ 추가할 회원의 이메일을 입력한 뒤, 엔터를 눌러 검색해 주세요.
+
+ 삭제하려면 추가된 이메일 아이콘의 x를 눌러주세요.
+
+
+
+
+
+ );
+};
+
+export default MemberInvite;
diff --git a/src/pages/menu/ui/myHost/HostEditPage.tsx b/src/pages/menu/ui/myHost/HostEditPage.tsx
index a7197994..592fe028 100644
--- a/src/pages/menu/ui/myHost/HostEditPage.tsx
+++ b/src/pages/menu/ui/myHost/HostEditPage.tsx
@@ -1,32 +1,22 @@
-import { useEffect, useState } from 'react';
+import { useState } from 'react';
import HostDetailLayout from '../../../../shared/ui/backgrounds/HostDetailLayout';
-import ProfileCircle from '../../../../../design-system/ui/Profile';
-import MultilineTextField from '../../../../../design-system/ui/textFields/MultilineTextField';
-import DefaultTextField from '../../../../../design-system/ui/textFields/DefaultTextField';
-import TertiaryButton from '../../../../../design-system/ui/buttons/TertiaryButton';
import { useParams } from 'react-router-dom';
-import MemberEmailInput from '../../../../features/menu/ui/MemberEmailInput';
import useHostChannelInfo from '../../../../entities/host/hook/useHostChannelInfoHook';
-import { useHostInfoSave } from '../../../../features/host/hook/useHostInfoHook';
import { useInviteMembers } from '../../../../features/host/hook/useInviteHostHook';
-import { hostInfoSchema } from '../../../../shared/lib/formValidation';
-import { formatProfilName } from '../../../../shared/lib/formatProfileName';
+import HostInfo from '../../../../entities/host/ui/HostInfo';
+import HostEditForm from '../../../../entities/host/ui/HostEditForm';
+import MemberInvite from '../../../../entities/host/ui/MemberInvite';
const HostEditPage = () => {
const { id } = useParams<{ id: string }>();
const [selectedHost, setSelectedHost] = useState(true);
const [selectedInfo, setSelectedInfo] = useState(false);
- const [email, setEmail] = useState('');
- const [channelDescription, setChannelDescription] = useState('');
const [emails, setEmails] = useState([]);
const hostChannelId = Number(id);
const { data: hostInfo } = useHostChannelInfo(hostChannelId);
const { inviteMembers } = useInviteMembers(hostChannelId);
- const { handleSave } = useHostInfoSave(hostChannelId, hostInfo!, email, channelDescription);
- const emailValidation = hostInfoSchema.safeParse({ email });
-
const handeHostInfoClick = () => {
setSelectedHost(true);
setSelectedInfo(false);
@@ -38,22 +28,9 @@ const HostEditPage = () => {
const handleInviteMembers = () => {
if (!hostInfo?.result.id) return;
-
inviteMembers(emails, () => setEmails([]));
};
- useEffect(() => {
- if (hostInfo?.result.email) {
- setEmail(hostInfo.result.email);
- }
- }, [hostInfo]);
-
- useEffect(() => {
- if (hostInfo?.result.channelDescription && channelDescription === '') {
- setChannelDescription(hostInfo.result.channelDescription);
- }
- }, [hostInfo, channelDescription]);
-
return (
@@ -79,81 +56,13 @@ const HostEditPage = () => {
- {selectedHost && (
-
-
-
-
멤버 목록
-
- {hostInfo?.result.hostChannelMembers.map(user => (
-
- {user.memberName}
-
- ))}
-
-
-
- )}
+ {selectedHost &&
}
{selectedInfo && (
-
-
- setEmail(e.target.value)}
- className="h-12"
- labelClassName="sm:text-base md:text-lg"
- errorMessage={!emailValidation.success ? emailValidation.error.errors[0].message : ''}
- />
-
-
-
- setChannelDescription(e.target.value)}
- className="h-24 mb-8"
- />
-
-
-
-
-
멤버 등록
-
- 추가할 회원의 이메일을 입력한 뒤, 엔터를 눌러 검색해 주세요.
-
- 삭제 하려면 추가된 이메일 아이콘의 x를 눌러주세요.{' '}
-
-
-
-
-
-
+ <>
+
+
+ >
)}
From e8fad7b51923ca24a1688fc9ff7c8a01ba11b659 Mon Sep 17 00:00:00 2001
From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com>
Date: Sun, 6 Jul 2025 22:03:19 +0900
Subject: [PATCH 6/7] =?UTF-8?q?feat:=20=ED=8B=B0=EC=BC=93=20=EA=B5=AC?=
=?UTF-8?q?=EB=A7=A4=20=EA=B0=80=EB=8A=A5=20=EA=B8=B0=EA=B0=84=20UI=20?=
=?UTF-8?q?=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
public/assets/event-manage/details/Clock.svg | 3 +++
src/features/ticket/model/ticketInformation.ts | 2 ++
src/widgets/event/ui/TicketInfo.tsx | 14 +++++++++++++-
3 files changed, 18 insertions(+), 1 deletion(-)
create mode 100644 public/assets/event-manage/details/Clock.svg
diff --git a/public/assets/event-manage/details/Clock.svg b/public/assets/event-manage/details/Clock.svg
new file mode 100644
index 00000000..fdb1b20d
--- /dev/null
+++ b/public/assets/event-manage/details/Clock.svg
@@ -0,0 +1,3 @@
+
diff --git a/src/features/ticket/model/ticketInformation.ts b/src/features/ticket/model/ticketInformation.ts
index 6fa2153e..4dded4b0 100644
--- a/src/features/ticket/model/ticketInformation.ts
+++ b/src/features/ticket/model/ticketInformation.ts
@@ -17,6 +17,8 @@ export interface ReadTicketResponse {
ticketDescription: string;
ticketPrice: number;
availableQuantity: number;
+ startDate: string;
+ endDate: string;
}
export interface TicketOptionChoice {
diff --git a/src/widgets/event/ui/TicketInfo.tsx b/src/widgets/event/ui/TicketInfo.tsx
index 7791207f..a12d86ae 100644
--- a/src/widgets/event/ui/TicketInfo.tsx
+++ b/src/widgets/event/ui/TicketInfo.tsx
@@ -6,6 +6,7 @@ import { useTickets } from '../../../features/ticket/hooks/useTicketHook';
import { useOrderTicket } from '../../../features/ticket/hooks/useOrderHook';
import { readTicketOptions } from '../../../features/ticket/api/ticketOption';
import useAuthStore from '../../../app/provider/authStore';
+import clock from '../../../../public/assets/event-manage/details/Clock.svg';
const TicketInfo = ({ eventId }: { eventId: number }) => {
const limitNum = 4;
@@ -84,7 +85,9 @@ const TicketInfo = ({ eventId }: { eventId: number }) => {
{data.result.map(ticket => (
-
{/* w-[230px] */}
+
+ {' '}
+ {/* w-[230px] */}
{ticket.ticketName} {/* w-[170px] */}
@@ -123,6 +126,15 @@ const TicketInfo = ({ eventId }: { eventId: number }) => {
/>
+
+
+

+
+ 구매 가능기간: {new Date(ticket.startDate).toLocaleDateString()} ~{' '}
+ {new Date(ticket.endDate).toLocaleDateString()}
+
+
+
))}
From b14b8734e8665e0180e8ea0ca18807fb7493d93f Mon Sep 17 00:00:00 2001
From: Yejiin21 <101397075+Yejiin21@users.noreply.github.com>
Date: Sun, 6 Jul 2025 22:05:26 +0900
Subject: [PATCH 7/7] =?UTF-8?q?fix:=20=EB=A7=88=EC=9D=B4=ED=8E=98=EC=9D=B4?=
=?UTF-8?q?=EC=A7=80=20=EC=A2=8B=EC=95=84=EC=9A=94=20=EC=B5=9C=EC=8B=A0?=
=?UTF-8?q?=EC=88=9C=EC=9C=BC=EB=A1=9C=20=EC=A0=95=EB=A0=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/entities/user/ui/BookmarkList.tsx | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/entities/user/ui/BookmarkList.tsx b/src/entities/user/ui/BookmarkList.tsx
index 83fc2d91..bdadab6a 100644
--- a/src/entities/user/ui/BookmarkList.tsx
+++ b/src/entities/user/ui/BookmarkList.tsx
@@ -8,8 +8,8 @@ const BookmarkList = () => {
const { data } = useBookmarks();
const navigate = useNavigate();
- const sortedData = data ? [...data].sort((a, b) => a.id - b.id) : [];
- const visibleEvents = sortedData.slice(0, 2);
+ if (!data) return null;
+ const visibleEvents = data.slice(0, 2);
return (