From 86023eea0088002d374af2143d904ae9035f4013 Mon Sep 17 00:00:00 2001 From: imddoy Date: Fri, 12 Jul 2024 20:13:19 +0900 Subject: [PATCH 01/16] =?UTF-8?q?feat:=20role=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EC=A0=9C=EC=9E=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/register/Register.styled.ts | 23 +++++--- src/pages/register/RegisterMaker.tsx | 13 +++++ src/pages/register/components/Role.tsx | 81 ++++++++++++++++++++++++++ src/routes/Router.tsx | 4 ++ 4 files changed, 112 insertions(+), 9 deletions(-) create mode 100644 src/pages/register/RegisterMaker.tsx create mode 100644 src/pages/register/components/Role.tsx diff --git a/src/pages/register/Register.styled.ts b/src/pages/register/Register.styled.ts index 5902a382..22b91a49 100644 --- a/src/pages/register/Register.styled.ts +++ b/src/pages/register/Register.styled.ts @@ -96,6 +96,11 @@ export const NonCheck = styled.div` border-radius: 2px; `; +export const TextInputWrpper = styled.section` + ${Generators.flexGenerator("column", "start", "space-between")} + gap: 0.8rem; +`; + export const FileInputWrapper = styled.div` position: relative; @@ -107,25 +112,25 @@ export const HiddenFileInput = styled.input` display: none; `; -export const CustomFileInput = styled.label` +export const CustomFileInput = styled.label<{ width: number; height: number }>` ${Generators.flexGenerator()} - width: 10.8rem; - height: 15.4rem; + width: ${({ width }) => (width ? width : 10.8)}rem; + height: ${({ height }) => (height ? height : 15.4)}rem; background: ${({ theme }) => theme.colors.gray_800}; cursor: pointer; border-radius: 6px; `; -export const PreviewImageWrapper = styled.article` +export const PreviewImageWrapper = styled.article<{ width: number; height: number }>` position: relative; - width: 10.8rem; - height: 15.4rem; + width: ${({ width }) => (width ? width : 10.8)}rem; + height: ${({ height }) => (height ? height : 15.4)}rem; `; -export const PreviewImage = styled.img` - width: 10.8rem; - height: 15.4rem; +export const PreviewImage = styled.img<{ width: number; height: number }>` + width: ${({ width }) => (width ? width : 10.8)}rem; + height: ${({ height }) => (height ? height : 15.4)}rem; object-fit: cover; border-radius: 10px; diff --git a/src/pages/register/RegisterMaker.tsx b/src/pages/register/RegisterMaker.tsx new file mode 100644 index 00000000..18c4b65c --- /dev/null +++ b/src/pages/register/RegisterMaker.tsx @@ -0,0 +1,13 @@ +import RoleComponent from "./components/Role"; + +const RegisterMaker = () => { + return ( + <> + {/* 페이지 구현 PR에서 로직 구현 에정 */} + + + + ); +}; + +export default RegisterMaker; diff --git a/src/pages/register/components/Role.tsx b/src/pages/register/components/Role.tsx new file mode 100644 index 00000000..ae4785dc --- /dev/null +++ b/src/pages/register/components/Role.tsx @@ -0,0 +1,81 @@ +import { ChangeEvent, useState } from "react"; +import * as S from "../Register.styled"; +import Spacing from "@components/commons/spacing/Spacing"; +import { IconCamera } from "@assets/svgs"; +import TextField from "@components/commons/input/textField/TextField"; + +interface RoleProps { + title: string; + onImageUpload: (imageUrl: string) => void; +} + +const Role = ({ title, onImageUpload }: RoleProps) => { + const [postImg, setPostImg] = useState(null); + const [previewImg, setPreviewImg] = useState(null); + const [name, setName] = useState(""); + const [role, setRole] = useState(""); + + function uploadFile(e: ChangeEvent) { + const file = e.target.files?.[0]; + if (file) { + setPostImg(file); + + const fileReader = new FileReader(); + fileReader.onload = function (event) { + const imageUrl = event.target?.result as string; + setPreviewImg(imageUrl); + onImageUpload(imageUrl); + }; + + fileReader.readAsDataURL(file); + } + } + + const removeImage = () => { + setPostImg(null); + setPreviewImg(null); + }; + + return ( + + {title} + + + {previewImg ? ( + + + + + ) : ( + <> + + + + + + )} + + + + setName(e.target.value)} + narrow={true} + placeholder="이름" + /> + setRole(e.target.value)} + narrow={true} + placeholder="역할" + /> + + + ); +}; + +export default Role; diff --git a/src/routes/Router.tsx b/src/routes/Router.tsx index e4dc3e96..7e4b27a9 100644 --- a/src/routes/Router.tsx +++ b/src/routes/Router.tsx @@ -8,7 +8,9 @@ import Manage from "@pages/manage/Manage"; import ModalTest from "@pages/ModalTest"; import MyRegisterdShow from "@pages/MyRegisterdShow/MyRegisterdShow"; import NonMbLookup from "@pages/nonMbLookup/NonMbLookup"; +import Role from "@pages/register/components/Role"; import Register from "@pages/register/Register"; +import RegisterMaker from "@pages/register/RegisterMaker"; import TestPage from "@pages/test/TestPage"; import ViewBottomSheetTest from "@pages/ViewBottomSheetTest"; import { createBrowserRouter } from "react-router-dom"; @@ -53,6 +55,8 @@ const router = createBrowserRouter([ // element: , // }, { path: "/testpage", element: }, + + { path: "/role", element: }, { path: "/myregisteredshow", element: }, // ... ]); From 690a28cac66adc8389b8c2e270ccc836d4c559e4 Mon Sep 17 00:00:00 2001 From: imddoy Date: Fri, 12 Jul 2024 21:31:27 +0900 Subject: [PATCH 02/16] =?UTF-8?q?feat:=20add=EB=B2=84=ED=8A=BC=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20=EC=A4=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/svgs/icon_role_add.svg | 6 +++ src/assets/svgs/IconRoleAdd.tsx | 12 ++++++ src/assets/svgs/index.tsx | 1 + src/pages/register/Register.styled.ts | 11 +++++ src/pages/register/RegisterMaker.tsx | 6 +-- src/pages/register/components/RoleLayout.tsx | 40 +++++++++++++++++++ .../components/{Role.tsx => RoleWrapper.tsx} | 21 ++++------ src/routes/Router.tsx | 2 +- 8 files changed, 81 insertions(+), 18 deletions(-) create mode 100644 public/svgs/icon_role_add.svg create mode 100644 src/assets/svgs/IconRoleAdd.tsx create mode 100644 src/pages/register/components/RoleLayout.tsx rename src/pages/register/components/{Role.tsx => RoleWrapper.tsx} (86%) diff --git a/public/svgs/icon_role_add.svg b/public/svgs/icon_role_add.svg new file mode 100644 index 00000000..ca40a3c6 --- /dev/null +++ b/public/svgs/icon_role_add.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/svgs/IconRoleAdd.tsx b/src/assets/svgs/IconRoleAdd.tsx new file mode 100644 index 00000000..0916fd16 --- /dev/null +++ b/src/assets/svgs/IconRoleAdd.tsx @@ -0,0 +1,12 @@ +import * as React from "react"; +import type { SVGProps } from "react"; +const SvgIconRoleAdd = (props: SVGProps) => ( + + + + +); +export default SvgIconRoleAdd; diff --git a/src/assets/svgs/index.tsx b/src/assets/svgs/index.tsx index 56e6ec11..1bdf5994 100644 --- a/src/assets/svgs/index.tsx +++ b/src/assets/svgs/index.tsx @@ -24,6 +24,7 @@ export { default as IconMinus } from "./IconMinus"; export { default as IconNonghyup } from "./IconNonghyup"; export { default as IconPhotoDelete } from "./IconPhotoDelete"; export { default as IconPlus } from "./IconPlus"; +export { default as IconRoleAdd } from "./IconRoleAdd"; export { default as IconSaemauel } from "./IconSaemauel"; export { default as IconSc } from "./IconSc"; export { default as IconShinhan } from "./IconShinhan"; diff --git a/src/pages/register/Register.styled.ts b/src/pages/register/Register.styled.ts index 22b91a49..c162bf17 100644 --- a/src/pages/register/Register.styled.ts +++ b/src/pages/register/Register.styled.ts @@ -179,3 +179,14 @@ export const TimePickerWrapper = styled.section` ${Generators.flexGenerator("column", "center", "center")} gap: 1.6rem; `; + +export const RoleAddBtn = styled.section` + ${Generators.flexGenerator()} + + width: 13.6rem; + height: 26.6rem; + + background: ${({ theme }) => theme.colors.gray_900}; + border: 1px dashed ${({ theme }) => theme.colors.gray_700}; + border-radius: 6px; +`; diff --git a/src/pages/register/RegisterMaker.tsx b/src/pages/register/RegisterMaker.tsx index 18c4b65c..ea282eba 100644 --- a/src/pages/register/RegisterMaker.tsx +++ b/src/pages/register/RegisterMaker.tsx @@ -1,11 +1,11 @@ -import RoleComponent from "./components/Role"; +import RoleLayout from "./components/RoleLayout"; const RegisterMaker = () => { return ( <> {/* 페이지 구현 PR에서 로직 구현 에정 */} - - + + ); }; diff --git a/src/pages/register/components/RoleLayout.tsx b/src/pages/register/components/RoleLayout.tsx new file mode 100644 index 00000000..f0b8a1ef --- /dev/null +++ b/src/pages/register/components/RoleLayout.tsx @@ -0,0 +1,40 @@ +import { useState } from "react"; +import * as S from "../Register.styled"; +import Spacing from "@components/commons/spacing/Spacing"; +import { IconRoleAdd } from "@assets/svgs"; +import TextField from "@components/commons/input/textField/TextField"; +import RoleWrapper from "./RoleWrapper"; + +interface RoleLayoutProps { + title: string; + onImageUpload: (imageUrl: string) => void; +} + +const RoleLayout = ({ title, onImageUpload }: RoleLayoutProps) => { + const [makerList, setMakerList] = useState([]); + + const handelAddRole = () => { + setMakerList((prev) => [ + ...prev, + { + makerList: "", + makerRole: "", + makerPhoto: "", + }, + ]); + }; + return ( + + {title} + + + + + {makerList.map((role, index) => ( + + ))} + + ); +}; + +export default RoleLayout; diff --git a/src/pages/register/components/Role.tsx b/src/pages/register/components/RoleWrapper.tsx similarity index 86% rename from src/pages/register/components/Role.tsx rename to src/pages/register/components/RoleWrapper.tsx index ae4785dc..a2588db0 100644 --- a/src/pages/register/components/Role.tsx +++ b/src/pages/register/components/RoleWrapper.tsx @@ -1,15 +1,10 @@ -import { ChangeEvent, useState } from "react"; -import * as S from "../Register.styled"; import Spacing from "@components/commons/spacing/Spacing"; -import { IconCamera } from "@assets/svgs"; +import * as S from "../Register.styled"; import TextField from "@components/commons/input/textField/TextField"; +import { IconCamera } from "@assets/svgs"; +import { ChangeEvent, useState } from "react"; -interface RoleProps { - title: string; - onImageUpload: (imageUrl: string) => void; -} - -const Role = ({ title, onImageUpload }: RoleProps) => { +const RoleWrapper = () => { const [postImg, setPostImg] = useState(null); const [previewImg, setPreviewImg] = useState(null); const [name, setName] = useState(""); @@ -37,9 +32,7 @@ const Role = ({ title, onImageUpload }: RoleProps) => { }; return ( - - {title} - + <> {previewImg ? ( @@ -74,8 +67,8 @@ const Role = ({ title, onImageUpload }: RoleProps) => { placeholder="역할" /> - + ); }; -export default Role; +export default RoleWrapper; diff --git a/src/routes/Router.tsx b/src/routes/Router.tsx index 7e4b27a9..e075d5b8 100644 --- a/src/routes/Router.tsx +++ b/src/routes/Router.tsx @@ -8,7 +8,7 @@ import Manage from "@pages/manage/Manage"; import ModalTest from "@pages/ModalTest"; import MyRegisterdShow from "@pages/MyRegisterdShow/MyRegisterdShow"; import NonMbLookup from "@pages/nonMbLookup/NonMbLookup"; -import Role from "@pages/register/components/Role"; +import Role from "@pages/register/components/RoleLayout"; import Register from "@pages/register/Register"; import RegisterMaker from "@pages/register/RegisterMaker"; import TestPage from "@pages/test/TestPage"; From 5f6d8a8acb2f2df6ae65299eea1a1692cfc7cbd2 Mon Sep 17 00:00:00 2001 From: imddoy Date: Sat, 13 Jul 2024 00:08:08 +0900 Subject: [PATCH 03/16] =?UTF-8?q?design:=20narrow=20input=20height=20?= =?UTF-8?q?=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../input/textField/TextField.styled.ts | 4 +-- .../commons/input/textField/TextField.tsx | 1 + src/pages/register/Register.styled.ts | 18 +++++++++++- src/pages/register/components/RoleLayout.tsx | 29 ++++++++++++++----- src/pages/register/components/RoleWrapper.tsx | 17 ++++------- src/styles/global.ts | 2 +- 6 files changed, 49 insertions(+), 22 deletions(-) diff --git a/src/components/commons/input/textField/TextField.styled.ts b/src/components/commons/input/textField/TextField.styled.ts index c0867bf6..a27a401a 100644 --- a/src/components/commons/input/textField/TextField.styled.ts +++ b/src/components/commons/input/textField/TextField.styled.ts @@ -11,9 +11,9 @@ export const TextFieldWrapper = styled.article` ${Generators.flexGenerator("row", "center", "center")} `; -export const TextFieldInput = styled.input` +export const TextFieldInput = styled.input<{ narrow?: false | true }>` width: 100%; - height: 4.8rem; + height: ${({ narrow }) => (narrow ? "4.2rem" : "4.8rem")}; padding: 0 1.6rem; color: ${({ theme }) => theme.colors.gray_0}; diff --git a/src/components/commons/input/textField/TextField.tsx b/src/components/commons/input/textField/TextField.tsx index 1e51ef41..bce6e352 100644 --- a/src/components/commons/input/textField/TextField.tsx +++ b/src/components/commons/input/textField/TextField.tsx @@ -80,6 +80,7 @@ const TextField = ({ onChange={handleOnInput} maxLength={maxLength} placeholder={placeholder} + // narrow={narrow} {...rest} /> {!narrow && !unit && value && } diff --git a/src/pages/register/Register.styled.ts b/src/pages/register/Register.styled.ts index c162bf17..191cd101 100644 --- a/src/pages/register/Register.styled.ts +++ b/src/pages/register/Register.styled.ts @@ -180,9 +180,20 @@ export const TimePickerWrapper = styled.section` gap: 1.6rem; `; +export const RoleListWrapper = styled.section` + display: flex; + gap: 1.6rem; + width: 37.5rem; + overflow-x: scroll; + + &::-webkit-scrollbar { + display: none; + } +`; + export const RoleAddBtn = styled.section` ${Generators.flexGenerator()} - + flex-shrink: 0; width: 13.6rem; height: 26.6rem; @@ -190,3 +201,8 @@ export const RoleAddBtn = styled.section` border: 1px dashed ${({ theme }) => theme.colors.gray_700}; border-radius: 6px; `; + +export const RoleWrapper = styled.div` + ${Generators.flexGenerator("column", "center", "center")} + height: 26.6rem; +`; diff --git a/src/pages/register/components/RoleLayout.tsx b/src/pages/register/components/RoleLayout.tsx index f0b8a1ef..af47605a 100644 --- a/src/pages/register/components/RoleLayout.tsx +++ b/src/pages/register/components/RoleLayout.tsx @@ -17,22 +17,37 @@ const RoleLayout = ({ title, onImageUpload }: RoleLayoutProps) => { setMakerList((prev) => [ ...prev, { - makerList: "", + id: Date.now(), + makerName: "", makerRole: "", makerPhoto: "", }, ]); }; + + const handleremoveRole = (id: number) => { + setMakerList((prev) => prev.filter((role) => role.id !== id)); + }; + + console.log(makerList); + return ( {title} - - - - {makerList.map((role, index) => ( - - ))} + + {makerList.map((role) => ( + + ))} + + + + ); }; diff --git a/src/pages/register/components/RoleWrapper.tsx b/src/pages/register/components/RoleWrapper.tsx index a2588db0..dff78abf 100644 --- a/src/pages/register/components/RoleWrapper.tsx +++ b/src/pages/register/components/RoleWrapper.tsx @@ -4,7 +4,7 @@ import TextField from "@components/commons/input/textField/TextField"; import { IconCamera } from "@assets/svgs"; import { ChangeEvent, useState } from "react"; -const RoleWrapper = () => { +const RoleWrapper = ({ id, removeRole, onImageUpload }) => { const [postImg, setPostImg] = useState(null); const [previewImg, setPreviewImg] = useState(null); const [name, setName] = useState(""); @@ -26,23 +26,18 @@ const RoleWrapper = () => { } } - const removeImage = () => { - setPostImg(null); - setPreviewImg(null); - }; - return ( - <> + {previewImg ? ( - + removeRole(id)} /> ) : ( <> - - + + @@ -67,7 +62,7 @@ const RoleWrapper = () => { placeholder="역할" /> - + ); }; diff --git a/src/styles/global.ts b/src/styles/global.ts index 30e76f15..d6559536 100644 --- a/src/styles/global.ts +++ b/src/styles/global.ts @@ -12,7 +12,7 @@ const global = createGlobalStyle` html { font-size: 62.5%; - background-color: ${({ theme }) => theme.colors.black}; + background-color: ${({ theme }) => theme.colors.gray_900}; user-select: none; -webkit-touch-callout: none; From 137993df362939dfaaafdd27b8cc6fc21964e64b Mon Sep 17 00:00:00 2001 From: imddoy Date: Sat, 13 Jul 2024 01:25:18 +0900 Subject: [PATCH 04/16] =?UTF-8?q?feat:=20=EB=B0=B0=EC=97=B4=EC=97=90=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84,=20=EC=97=AD=ED=95=A0,=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../commons/input/textField/TextField.tsx | 2 +- src/pages/register/Register.styled.ts | 6 ++-- src/pages/register/RegisterMaker.tsx | 7 +++-- .../register/components/PosterThumbnail.tsx | 4 +-- src/pages/register/components/RoleLayout.tsx | 12 +++++--- src/pages/register/components/RoleWrapper.tsx | 30 +++++++++++-------- 6 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/components/commons/input/textField/TextField.tsx b/src/components/commons/input/textField/TextField.tsx index bce6e352..e5190856 100644 --- a/src/components/commons/input/textField/TextField.tsx +++ b/src/components/commons/input/textField/TextField.tsx @@ -80,7 +80,7 @@ const TextField = ({ onChange={handleOnInput} maxLength={maxLength} placeholder={placeholder} - // narrow={narrow} + narrow={narrow} {...rest} /> {!narrow && !unit && value && } diff --git a/src/pages/register/Register.styled.ts b/src/pages/register/Register.styled.ts index 191cd101..69983a13 100644 --- a/src/pages/register/Register.styled.ts +++ b/src/pages/register/Register.styled.ts @@ -112,7 +112,7 @@ export const HiddenFileInput = styled.input` display: none; `; -export const CustomFileInput = styled.label<{ width: number; height: number }>` +export const CustomFileInput = styled.label<{ width?: number; height?: number }>` ${Generators.flexGenerator()} width: ${({ width }) => (width ? width : 10.8)}rem; height: ${({ height }) => (height ? height : 15.4)}rem; @@ -122,13 +122,13 @@ export const CustomFileInput = styled.label<{ width: number; height: number }>` border-radius: 6px; `; -export const PreviewImageWrapper = styled.article<{ width: number; height: number }>` +export const PreviewImageWrapper = styled.article<{ width?: number; height?: number }>` position: relative; width: ${({ width }) => (width ? width : 10.8)}rem; height: ${({ height }) => (height ? height : 15.4)}rem; `; -export const PreviewImage = styled.img<{ width: number; height: number }>` +export const PreviewImage = styled.img<{ width?: number; height?: number }>` width: ${({ width }) => (width ? width : 10.8)}rem; height: ${({ height }) => (height ? height : 15.4)}rem; object-fit: cover; diff --git a/src/pages/register/RegisterMaker.tsx b/src/pages/register/RegisterMaker.tsx index ea282eba..00accad1 100644 --- a/src/pages/register/RegisterMaker.tsx +++ b/src/pages/register/RegisterMaker.tsx @@ -1,12 +1,13 @@ import RoleLayout from "./components/RoleLayout"; +import * as S from "./Register.styled"; const RegisterMaker = () => { return ( - <> - {/* 페이지 구현 PR에서 로직 구현 에정 */} + + - + ); }; diff --git a/src/pages/register/components/PosterThumbnail.tsx b/src/pages/register/components/PosterThumbnail.tsx index 8cf464c9..a64c6ae3c 100644 --- a/src/pages/register/components/PosterThumbnail.tsx +++ b/src/pages/register/components/PosterThumbnail.tsx @@ -11,7 +11,7 @@ const PosterThumbnail = ({ onImageUpload }: PosterThumbnailProps) => { const [postImg, setPostImg] = useState(null); const [previewImg, setPreviewImg] = useState(null); - function uploadFile(e: ChangeEvent) { + const uploadFile = (e: ChangeEvent) => { const file = e.target.files?.[0]; if (file) { setPostImg(file); @@ -25,7 +25,7 @@ const PosterThumbnail = ({ onImageUpload }: PosterThumbnailProps) => { fileReader.readAsDataURL(file); } - } + }; const removeImage = () => { setPostImg(null); diff --git a/src/pages/register/components/RoleLayout.tsx b/src/pages/register/components/RoleLayout.tsx index af47605a..75995da9 100644 --- a/src/pages/register/components/RoleLayout.tsx +++ b/src/pages/register/components/RoleLayout.tsx @@ -2,15 +2,13 @@ import { useState } from "react"; import * as S from "../Register.styled"; import Spacing from "@components/commons/spacing/Spacing"; import { IconRoleAdd } from "@assets/svgs"; -import TextField from "@components/commons/input/textField/TextField"; import RoleWrapper from "./RoleWrapper"; interface RoleLayoutProps { title: string; - onImageUpload: (imageUrl: string) => void; } -const RoleLayout = ({ title, onImageUpload }: RoleLayoutProps) => { +const RoleLayout = ({ title }: RoleLayoutProps) => { const [makerList, setMakerList] = useState([]); const handelAddRole = () => { @@ -29,6 +27,12 @@ const RoleLayout = ({ title, onImageUpload }: RoleLayoutProps) => { setMakerList((prev) => prev.filter((role) => role.id !== id)); }; + const handleUpdateRole = (id: number, name: string, value: string) => { + setMakerList((prev) => + prev.map((role) => (role.id === id ? { ...role, [name]: value } : role)) + ); + }; + console.log(makerList); return ( @@ -41,7 +45,7 @@ const RoleLayout = ({ title, onImageUpload }: RoleLayoutProps) => { key={role.id} id={role.id} removeRole={handleremoveRole} - onImageUpload={onImageUpload} + onUpdateRole={handleUpdateRole} /> ))} diff --git a/src/pages/register/components/RoleWrapper.tsx b/src/pages/register/components/RoleWrapper.tsx index dff78abf..7775a708 100644 --- a/src/pages/register/components/RoleWrapper.tsx +++ b/src/pages/register/components/RoleWrapper.tsx @@ -4,13 +4,17 @@ import TextField from "@components/commons/input/textField/TextField"; import { IconCamera } from "@assets/svgs"; import { ChangeEvent, useState } from "react"; -const RoleWrapper = ({ id, removeRole, onImageUpload }) => { +interface RoleWrapperProps { + id: number; + removeRole: (id: number) => void; + onUpdateRole: (id: number, name: string, value: string) => void; +} + +const RoleWrapper = ({ id, removeRole, onUpdateRole }: RoleWrapperProps) => { const [postImg, setPostImg] = useState(null); const [previewImg, setPreviewImg] = useState(null); - const [name, setName] = useState(""); - const [role, setRole] = useState(""); - function uploadFile(e: ChangeEvent) { + const uploadFile = (e: ChangeEvent) => { const file = e.target.files?.[0]; if (file) { setPostImg(file); @@ -19,13 +23,17 @@ const RoleWrapper = ({ id, removeRole, onImageUpload }) => { fileReader.onload = function (event) { const imageUrl = event.target?.result as string; setPreviewImg(imageUrl); - onImageUpload(imageUrl); + onUpdateRole(id, "makerPhoto", imageUrl); }; fileReader.readAsDataURL(file); } - } + }; + const handleInputChange = (e: ChangeEvent) => { + const { name, value } = e.target; + onUpdateRole(id, name, value); + }; return ( @@ -47,17 +55,15 @@ const RoleWrapper = ({ id, removeRole, onImageUpload }) => { setName(e.target.value)} + name="makerName" + onChange={handleInputChange} narrow={true} placeholder="이름" /> setRole(e.target.value)} + name="makerRole" + onChange={handleInputChange} narrow={true} placeholder="역할" /> From 4c073524329ca4f8bbdaacf10668cb9b7c5eecd4 Mon Sep 17 00:00:00 2001 From: imddoy Date: Sat, 13 Jul 2024 02:15:15 +0900 Subject: [PATCH 05/16] =?UTF-8?q?design:=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20?= =?UTF-8?q?=EC=A7=A4=EB=A6=BC=20=ED=98=84=EC=83=81=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/register/Register.styled.ts | 4 +++- src/styles/global.ts | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/pages/register/Register.styled.ts b/src/pages/register/Register.styled.ts index 69983a13..cd928495 100644 --- a/src/pages/register/Register.styled.ts +++ b/src/pages/register/Register.styled.ts @@ -183,7 +183,9 @@ export const TimePickerWrapper = styled.section` export const RoleListWrapper = styled.section` display: flex; gap: 1.6rem; - width: 37.5rem; + width: calc(100% + 4.8rem); + margin-left: -2.4rem; + padding: 0 2.4rem; overflow-x: scroll; &::-webkit-scrollbar { diff --git a/src/styles/global.ts b/src/styles/global.ts index d6559536..30e76f15 100644 --- a/src/styles/global.ts +++ b/src/styles/global.ts @@ -12,7 +12,7 @@ const global = createGlobalStyle` html { font-size: 62.5%; - background-color: ${({ theme }) => theme.colors.gray_900}; + background-color: ${({ theme }) => theme.colors.black}; user-select: none; -webkit-touch-callout: none; From 541ee69a66552a15df33d1821af50b76f9fa793e Mon Sep 17 00:00:00 2001 From: imddoy Date: Sat, 13 Jul 2024 02:23:03 +0900 Subject: [PATCH 06/16] =?UTF-8?q?design:=20=ED=91=B8=ED=84=B0=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/register/Register.styled.ts | 8 ++++++++ src/pages/register/RegisterMaker.tsx | 18 +++++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/pages/register/Register.styled.ts b/src/pages/register/Register.styled.ts index cd928495..c7a95e96 100644 --- a/src/pages/register/Register.styled.ts +++ b/src/pages/register/Register.styled.ts @@ -208,3 +208,11 @@ export const RoleWrapper = styled.div` ${Generators.flexGenerator("column", "center", "center")} height: 26.6rem; `; + +export const FooterInfo = styled.div` + margin-bottom: 2.4rem; + + color: ${({ theme }) => theme.colors.gray_200}; + ${({ theme }) => theme.fonts["body2-normal-semi"]}; + text-align: center; +`; diff --git a/src/pages/register/RegisterMaker.tsx b/src/pages/register/RegisterMaker.tsx index 00accad1..d757ed06 100644 --- a/src/pages/register/RegisterMaker.tsx +++ b/src/pages/register/RegisterMaker.tsx @@ -1,13 +1,21 @@ +import Button from "@components/commons/button/Button"; import RoleLayout from "./components/RoleLayout"; import * as S from "./Register.styled"; const RegisterMaker = () => { return ( - - - - - + <> + + + + + + + + 공연진 상세정보는 선택사항 입니다. + + + ); }; From 6b9da2bc8443be3515c17ca7e5d0c2172af9b905 Mon Sep 17 00:00:00 2001 From: imddoy Date: Sat, 13 Jul 2024 18:27:31 +0900 Subject: [PATCH 07/16] =?UTF-8?q?feat:=20=ED=8E=98=EC=9D=B4=EC=A7=80=20ste?= =?UTF-8?q?p=20=EB=82=98=EB=88=A0=EC=84=9C=20gigInfo=EC=97=90=20=EA=B3=B5?= =?UTF-8?q?=EC=97=B0=EC=A7=84=20=EC=A0=95=EB=B3=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/register/Register.styled.ts | 2 - src/pages/register/Register.tsx | 397 ++++++++++--------- src/pages/register/RegisterMaker.tsx | 47 ++- src/pages/register/RegisterPage.tsx | 59 +++ src/pages/register/components/RoleLayout.tsx | 34 +- src/routes/Router.tsx | 2 +- 6 files changed, 343 insertions(+), 198 deletions(-) create mode 100644 src/pages/register/RegisterPage.tsx diff --git a/src/pages/register/Register.styled.ts b/src/pages/register/Register.styled.ts index c7a95e96..61c9aa22 100644 --- a/src/pages/register/Register.styled.ts +++ b/src/pages/register/Register.styled.ts @@ -16,8 +16,6 @@ export const Divider = styled.div` `; export const FooterContainer = styled.div` - position: sticky; - bottom: 0; padding: 2.4rem; background-color: ${({ theme }) => theme.colors.gray_900}; diff --git a/src/pages/register/Register.tsx b/src/pages/register/Register.tsx index 5e361d76..4eb4fe47 100644 --- a/src/pages/register/Register.tsx +++ b/src/pages/register/Register.tsx @@ -16,7 +16,6 @@ import PosterThumbnail from "./components/PosterThumbnail"; import Spacing from "@components/commons/spacing/Spacing"; import { GENRE_LIST } from "./constants/genreList"; import { Dayjs } from "dayjs"; - import { handleImageUpload, handleGenreSelect, @@ -33,8 +32,10 @@ import { import { GigInfo } from "./typings/gigInfo"; import Button from "@components/commons/button/Button"; import { IconChecked } from "@assets/svgs"; +import RegisterMaker from "./RegisterMaker"; const Register = () => { + const [registerStep, setRegisterStep] = useState(2); const [gigInfo, setGigInfo] = useState({ performanceTitle: "", // 공연명 genre: "", // 공연 장르 @@ -90,7 +91,7 @@ const Register = () => { } = gigInfo; const [round, setRound] = useState(1); // 회차 - const [selectedDate, setSelectedDate] = useState(null); // 선택한 날짜 + // const [selectedDate, setSelectedDate] = useState(null); // 선택한 날짜 const [bankOpen, setBankOpen] = useState(false); const [bankInfo, setBankInfo] = useState(""); const [isChecked, setIsChecked] = useState(false); @@ -111,208 +112,230 @@ const Register = () => { } }, [isFree]); + const handleRegisterStep = () => { + setRegisterStep((prev) => prev + 1); + }; + const updateGigInfo = (newInfo: Partial) => { + setGigInfo((prev) => ({ + ...prev, + ...newInfo, + })); + }; + console.log(registerStep); console.log(gigInfo); - return ( - <> - - handleImageUpload(url, setGigInfo)} /> - + if (registerStep === 1) { + { + return ( + <> + + handleImageUpload(url, setGigInfo)} /> + - handleGenreSelect(selectedGenre, setGigInfo)} - marginBottom={2.4} - /> - + handleGenreSelect(selectedGenre, setGigInfo)} + marginBottom={2.4} + /> + - - handleChange(e, setGigInfo)} - placeholder="등록될 공연의 이름을 입력해주세요." - maxLength={30} - cap={true} - /> - - + + handleChange(e, setGigInfo)} + placeholder="등록될 공연의 이름을 입력해주세요." + maxLength={30} + cap={true} + /> + + - - handleChange(e, setGigInfo)} - placeholder="주최하는 공연진(단체)의 이름을 입력해주세요." - maxLength={10} - cap={true} - /> - - + + handleChange(e, setGigInfo)} + placeholder="주최하는 공연진(단체)의 이름을 입력해주세요." + maxLength={10} + cap={true} + /> + + - -