diff --git a/src/app/instructor/choose/[commissionId]/page.tsx b/src/app/instructor/choose/[commissionId]/page.tsx new file mode 100644 index 0000000..03818c0 --- /dev/null +++ b/src/app/instructor/choose/[commissionId]/page.tsx @@ -0,0 +1,46 @@ +"use client"; + +import { notFound, useRouter } from "next/navigation"; +import { use, useState } from "react"; + +import { commissionDraftsData } from "@/features/instructor/choose"; +import Button from "@/shared/ui/Button"; +import { DraftCheckSection } from "@/widgets/instructor/choose"; + +interface PageProps { + params: Promise<{ commissionId: string }>; +} + +const Page = ({ params }: PageProps) => { + const router = useRouter(); + const { commissionId } = use(params); + const [selectedIndex, setSelectedIndex] = useState(null); + + const commission = commissionDraftsData.find(c => c.commissionId === Number(commissionId)); + + if (!commission) return notFound(); + + return ( +
+
+

+ {commission.title} +

+ +
+ +
+ ); +}; + +export default Page; diff --git a/src/app/instructor/layout.tsx b/src/app/instructor/layout.tsx index 18d287f..92236c3 100644 --- a/src/app/instructor/layout.tsx +++ b/src/app/instructor/layout.tsx @@ -11,7 +11,11 @@ const InstructorLayout = ({ children }: { children: ReactNode }) => {
}> - +
{children}
diff --git a/src/app/instructor/revision/[commissionId]/page.tsx b/src/app/instructor/revision/[commissionId]/page.tsx index 1a39457..2aefc09 100644 --- a/src/app/instructor/revision/[commissionId]/page.tsx +++ b/src/app/instructor/revision/[commissionId]/page.tsx @@ -85,7 +85,11 @@ const Page = () => { > 최종 시안으로 선택하기 -
diff --git a/src/features/instructor/choose/index.ts b/src/features/instructor/choose/index.ts new file mode 100644 index 0000000..b648798 --- /dev/null +++ b/src/features/instructor/choose/index.ts @@ -0,0 +1,3 @@ +export type { CommissionWithDrafts, Draft, DraftDetail } from "./model/choose"; +export { commissionDraftsData, draftDetailsData } from "./model/choose"; +export { default as DraftCard } from "./ui/DraftCard"; diff --git a/src/features/instructor/choose/model/choose.ts b/src/features/instructor/choose/model/choose.ts new file mode 100644 index 0000000..47d8177 --- /dev/null +++ b/src/features/instructor/choose/model/choose.ts @@ -0,0 +1,144 @@ +// [강사] 제출된 1차 시안 목록 조회 +export type Draft = { + draftId: number; + thumbnailUrl: string; +}; + +export type CommissionWithDrafts = { + commissionId: number; + title: string; + drafts: Draft[]; +}; + +export const commissionDraftsData: CommissionWithDrafts[] = [ + { + commissionId: 11, + title: "해커스톡 왕초보 영어 - 기초 문법편", + drafts: [ + { draftId: 41, thumbnailUrl: "/images/thumbnail_mock.jpg" }, + { draftId: 42, thumbnailUrl: "/images/thumbnail_mock.jpg" }, + { draftId: 43, thumbnailUrl: "/images/thumbnail_mock.jpg" }, + { draftId: 44, thumbnailUrl: "/images/thumbnail_mock.jpg" }, + ], + }, + { + commissionId: 15, + title: "고등 국어 문학 - 현대시 집중", + drafts: [ + { draftId: 51, thumbnailUrl: "/images/thumbnail_mock.jpg" }, + { draftId: 52, thumbnailUrl: "/images/thumbnail_mock.jpg" }, + { draftId: 53, thumbnailUrl: "/images/thumbnail_mock.jpg" }, + { draftId: 54, thumbnailUrl: "/images/thumbnail_mock.jpg" }, + { draftId: 55, thumbnailUrl: "/images/thumbnail_mock.jpg" }, + ], + }, +]; + +// [강사] 제출된 1차 시안 상세 조회 +export type DraftDetail = { + commissionId: number; + draftId: number; + fileUrls: string[]; +}; + +export const draftDetailsData: Record = { + 41: { + commissionId: 11, + draftId: 41, + fileUrls: [ + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + ], + }, + 42: { + commissionId: 11, + draftId: 42, + fileUrls: [ + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + ], + }, + 43: { + commissionId: 11, + draftId: 43, + fileUrls: [ + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + ], + }, + 44: { + commissionId: 11, + draftId: 44, + fileUrls: [ + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + ], + }, + 51: { + commissionId: 15, + draftId: 51, + fileUrls: [ + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + ], + }, + 52: { + commissionId: 15, + draftId: 52, + fileUrls: [ + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + ], + }, + 53: { + commissionId: 15, + draftId: 53, + fileUrls: [ + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + ], + }, + 54: { + commissionId: 15, + draftId: 54, + fileUrls: [ + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + ], + }, + 55: { + commissionId: 15, + draftId: 55, + fileUrls: [ + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + "/images/thumbnail_mock.jpg", + ], + }, +}; diff --git a/src/features/instructor/choose/ui/DraftCard.tsx b/src/features/instructor/choose/ui/DraftCard.tsx new file mode 100644 index 0000000..faced74 --- /dev/null +++ b/src/features/instructor/choose/ui/DraftCard.tsx @@ -0,0 +1,56 @@ +"use client"; + +import { useState } from "react"; + +import { draftDetailsData } from "@/features/instructor/choose"; +import Button from "@/shared/ui/Button"; +import DraftModal from "@/shared/ui/modal/DraftModal"; +import Thumbnail from "@/shared/ui/Thumbnail"; + +interface DraftCardProps { + index: number; + draftId: number; + thumbnailUrl: string; + isSelected: boolean; + onSelect: (index: number) => void; +} + +const DraftCard = ({ index, draftId, thumbnailUrl, isSelected, onSelect }: DraftCardProps) => { + const [isModalOpen, setIsModalOpen] = useState(false); + + const detail = draftDetailsData[draftId]; + + return ( + <> +
+
+ 시안 {index + 1} + +
+ setIsModalOpen(true)} + /> +
+ {detail && ( + setIsModalOpen(false)} + title={`시안 ${index + 1}`} + fileUrls={detail.fileUrls} + /> + )} + + ); +}; + +export default DraftCard; diff --git a/src/features/instructor/home/index.ts b/src/features/instructor/home/index.ts index 2b58348..6eaf5dc 100644 --- a/src/features/instructor/home/index.ts +++ b/src/features/instructor/home/index.ts @@ -1,16 +1,12 @@ -export { getDDay } from "@/features/instructor/home/lib/getDDay"; -export type { - DraftSubmissionItem, - MatchingItem, - ModifyingItem, -} from "@/features/instructor/home/model/home"; +export { getDDay } from "./lib/getDDay"; +export type { DraftSubmissionItem, MatchingItem, ModifyingItem } from "./model/home"; export { CATEGORY_DISPLAY_MAP, draftSubmissionStatusData, matchingStatusData, modifyingStatusData, -} from "@/features/instructor/home/model/home"; -export { default as CommissionsHeader } from "@/features/instructor/home/ui/CommissionsHeader"; -export { default as DraftSubmissionStatusRow } from "@/features/instructor/home/ui/DraftSubmissionStatusRow"; -export { default as MatchingCommissionsRow } from "@/features/instructor/home/ui/MatchingCommissionsRow"; -export { default as ModifyingCommissionsRow } from "@/features/instructor/home/ui/ModifyingCommissionsRow"; +} from "./model/home"; +export { default as CommissionsHeader } from "./ui/CommissionsHeader"; +export { default as DraftSubmissionStatusRow } from "./ui/DraftSubmissionStatusRow"; +export { default as MatchingCommissionsRow } from "./ui/MatchingCommissionsRow"; +export { default as ModifyingCommissionsRow } from "./ui/ModifyingCommissionsRow"; diff --git a/src/features/instructor/home/model/home.ts b/src/features/instructor/home/model/home.ts index f2e5116..247c951 100644 --- a/src/features/instructor/home/model/home.ts +++ b/src/features/instructor/home/model/home.ts @@ -19,7 +19,7 @@ export const draftSubmissionStatusData: DraftSubmissionItem[] = [ commissionId: 11, title: "해커스톡 왕초보 영어 - 기초 문법편", category: "FLYER_TEXTBOOK_COVER_INNER", - draftSubmission: { submitted: 1, total: 4 }, + draftSubmission: { submitted: 4, total: 4 }, firstDraftDeadline: "2026-06-10", }, { @@ -47,7 +47,7 @@ export const draftSubmissionStatusData: DraftSubmissionItem[] = [ commissionId: 15, title: "고등 국어 문학 - 현대시 집중", category: "FLYER_TEXTBOOK_COVER_INNER", - draftSubmission: { submitted: 4, total: 5 }, + draftSubmission: { submitted: 5, total: 5 }, firstDraftDeadline: "2026-06-28", }, ]; diff --git a/src/features/instructor/home/ui/DraftSubmissionStatusRow.tsx b/src/features/instructor/home/ui/DraftSubmissionStatusRow.tsx index aea3332..8290162 100644 --- a/src/features/instructor/home/ui/DraftSubmissionStatusRow.tsx +++ b/src/features/instructor/home/ui/DraftSubmissionStatusRow.tsx @@ -1,12 +1,16 @@ +import { useRouter } from "next/navigation"; + import { getDDay } from "@/features/instructor/home/lib/getDDay"; import { CATEGORY_DISPLAY_MAP, DraftSubmissionItem } from "@/features/instructor/home/model/home"; import { ArrowRightIcon, MatchingOffIcon, MatchingOnIcon } from "@/shared/assets/icons"; +import Button from "@/shared/ui/Button"; import Tag from "@/shared/ui/Tag"; const DraftSubmissionStatusRow = ({ item }: { item: DraftSubmissionItem }) => { - const { title, category, draftSubmission, firstDraftDeadline } = item; + const { commissionId, title, category, draftSubmission, firstDraftDeadline } = item; const { submitted, total } = draftSubmission; const categoryLabel = CATEGORY_DISPLAY_MAP[category] ?? category; + const router = useRouter(); return (
@@ -19,18 +23,33 @@ const DraftSubmissionStatusRow = ({ item }: { item: DraftSubmissionItem }) => {
-
-
- {Array.from({ length: submitted }).map((_, i) => ( - - ))} - {Array.from({ length: total - submitted }).map((_, i) => ( - - ))} +
+
+
+ {Array.from({ length: submitted }).map((_, i) => ( + + ))} + {Array.from({ length: total - submitted }).map((_, i) => ( + + ))} +
+

+ ({submitted}/{total}) +

-

- ({submitted}/{total}) -

+ {submitted === total ? ( + + ) : ( + + )}
diff --git a/src/features/instructor/my/index.ts b/src/features/instructor/my/index.ts index e3672fc..78d95ce 100644 --- a/src/features/instructor/my/index.ts +++ b/src/features/instructor/my/index.ts @@ -1,8 +1,4 @@ -export type { CommissionHistoryItem } from "@/features/instructor/my/model/my"; -export { - CATEGORY_BADGE_MAP, - commissionHistoryData, - PLAN_DISPLAY_MAP, -} from "@/features/instructor/my/model/my"; -export { default as CommissionsHeader } from "@/features/instructor/my/ui/CommissionsHeader"; -export { default as CommissionsHistoryRow } from "@/features/instructor/my/ui/CommissionsHistoryRow"; +export type { CommissionHistoryItem } from "./model/my"; +export { CATEGORY_BADGE_MAP, commissionHistoryData, PLAN_DISPLAY_MAP } from "./model/my"; +export { default as CommissionsHeader } from "./ui/CommissionsHeader"; +export { default as CommissionsHistoryRow } from "./ui/CommissionsHistoryRow"; diff --git a/src/features/instructor/write/index.ts b/src/features/instructor/write/index.ts index 902734f..8bc8831 100644 --- a/src/features/instructor/write/index.ts +++ b/src/features/instructor/write/index.ts @@ -1,13 +1,13 @@ -export * from "@/features/instructor/write/config/write"; -export type { RgbaColor } from "@/features/instructor/write/lib/color"; -export { formatDate, getMinFinalDate, getYesterday } from "@/features/instructor/write/lib/date"; -export type { BasicInfo } from "@/features/instructor/write/model/writeFormStore"; -export { useWriteFormStore } from "@/features/instructor/write/model/writeFormStore"; -export { default as ColorChooseCard } from "@/features/instructor/write/ui/ColorChooseCard"; -export { default as ColorPicker } from "@/features/instructor/write/ui/ColorPicker"; -export { default as ConceptKeywordCard } from "@/features/instructor/write/ui/ConceptKeywordCard"; -export { default as PaperSizeCard } from "@/features/instructor/write/ui/PaperSizeCard"; -export { default as PaymentModal } from "@/features/instructor/write/ui/PaymentModal/PaymentModal"; -export { default as PlanChooseCard } from "@/features/instructor/write/ui/PlanChooseCard"; -export { default as SizeRecommendedCard } from "@/features/instructor/write/ui/SizeRecommendedCard"; -export { default as StepHeader } from "@/features/instructor/write/ui/StepHeader"; +export * from "./config/write"; +export type { RgbaColor } from "./lib/color"; +export { formatDate, getMinFinalDate, getYesterday } from "./lib/date"; +export type { BasicInfo } from "./model/writeFormStore"; +export { useWriteFormStore } from "./model/writeFormStore"; +export { default as ColorChooseCard } from "./ui/ColorChooseCard"; +export { default as ColorPicker } from "./ui/ColorPicker"; +export { default as ConceptKeywordCard } from "./ui/ConceptKeywordCard"; +export { default as PaperSizeCard } from "./ui/PaperSizeCard"; +export { default as PaymentModal } from "./ui/PaymentModal/PaymentModal"; +export { default as PlanChooseCard } from "./ui/PlanChooseCard"; +export { default as SizeRecommendedCard } from "./ui/SizeRecommendedCard"; +export { default as StepHeader } from "./ui/StepHeader"; diff --git a/src/features/signup/index.ts b/src/features/signup/index.ts index 023b545..760d709 100644 --- a/src/features/signup/index.ts +++ b/src/features/signup/index.ts @@ -1,4 +1,4 @@ -export * from "@/features/signup/config/signup"; -export { useSignupStep2Form } from "@/features/signup/model/useSignupStep2Form"; -export { default as BankDropdown } from "@/features/signup/ui/BankDropdown"; -export { default as UserTypeBtn } from "@/features/signup/ui/UserTypeBtn"; +export * from "./config/signup"; +export { useSignupStep2Form } from "./model/useSignupStep2Form"; +export { default as BankDropdown } from "./ui/BankDropdown"; +export { default as UserTypeBtn } from "./ui/UserTypeBtn"; diff --git a/src/shared/ui/Button.tsx b/src/shared/ui/Button.tsx index b5a08b7..71b8bb8 100644 --- a/src/shared/ui/Button.tsx +++ b/src/shared/ui/Button.tsx @@ -15,7 +15,8 @@ type ButtonVariant = | "large_disabled" | "certification_primary" | "certification_disabled" - | "xsmall_primary"; + | "xsmall_primary" + | "choose"; interface ButtonProps extends ButtonHTMLAttributes { variant: ButtonVariant; @@ -47,6 +48,8 @@ const variantStyles: Record = { "rounded-8 px-6 py-4 text-gray-60 text-heading3-m bg-gray-30 cursor-not-allowed", xsmall_primary: "rounded-8 text-gray-70 px-3 py-2 bg-gray-40 text-caption2-m hover:bg-purple-40 hover:text-white gap-1 [&>svg]:size-4.5", + choose: + "rounded-8 px-3 py-1 bg-gray-20 text-gray-60 text-body1-sb hover:bg-gray-40 aria-pressed:bg-purple-20 aria-pressed:border-purple-30 aria-pressed:text-main-main border border-transparent", }; const Button = ({ variant, children, className, ...props }: ButtonProps) => { diff --git a/src/shared/ui/SidebarMenu.tsx b/src/shared/ui/SidebarMenu.tsx index 2405179..2a0e29f 100644 --- a/src/shared/ui/SidebarMenu.tsx +++ b/src/shared/ui/SidebarMenu.tsx @@ -9,16 +9,15 @@ import { SIDEBAR_ICON_MAP } from "@/shared/config/sidebarMenu"; interface SidebarMenuProps { label: string; href?: string; - matchPrefix?: string; + matchPrefix?: string | string[]; } const SidebarMenu = ({ label, href, matchPrefix }: SidebarMenuProps) => { const pathname = usePathname(); const [isHovered, setIsHovered] = useState(false); - const isSelected = href - ? pathname === href || (!!matchPrefix && pathname.startsWith(matchPrefix)) - : false; + const prefixes = matchPrefix ? (Array.isArray(matchPrefix) ? matchPrefix : [matchPrefix]) : []; + const isSelected = href ? pathname === href || prefixes.some(p => pathname.startsWith(p)) : false; const isActive = isSelected || isHovered; const icons = SIDEBAR_ICON_MAP[label]; diff --git a/src/shared/ui/Thumbnail.tsx b/src/shared/ui/Thumbnail.tsx index 5ea9d41..c1a6315 100644 --- a/src/shared/ui/Thumbnail.tsx +++ b/src/shared/ui/Thumbnail.tsx @@ -28,7 +28,7 @@ const Thumbnail = ({ + + ); +}; + +export default DraftCheckSection; diff --git a/src/widgets/instructor/home/index.ts b/src/widgets/instructor/home/index.ts index eb215b9..8289b34 100644 --- a/src/widgets/instructor/home/index.ts +++ b/src/widgets/instructor/home/index.ts @@ -1,3 +1,3 @@ -export { default as DraftSubmissionStatusSection } from "@/widgets/instructor/home/ui/DraftSubmissionStatusSection"; -export { default as MatchingCommissionsSection } from "@/widgets/instructor/home/ui/MatchingCommissionsSection"; -export { default as ModifyingCommissionsSection } from "@/widgets/instructor/home/ui/ModifyingCommissionsSection"; +export { default as DraftSubmissionStatusSection } from "./ui/DraftSubmissionStatusSection"; +export { default as MatchingCommissionsSection } from "./ui/MatchingCommissionsSection"; +export { default as ModifyingCommissionsSection } from "./ui/ModifyingCommissionsSection"; diff --git a/src/widgets/instructor/home/ui/DraftSubmissionStatusSection.tsx b/src/widgets/instructor/home/ui/DraftSubmissionStatusSection.tsx index 7417226..4d13e45 100644 --- a/src/widgets/instructor/home/ui/DraftSubmissionStatusSection.tsx +++ b/src/widgets/instructor/home/ui/DraftSubmissionStatusSection.tsx @@ -24,7 +24,7 @@ const DraftSubmissionStatusSection = () => { 시안 제출 현황
- +

디데이

카테고리

외주명

diff --git a/src/widgets/instructor/my/index.ts b/src/widgets/instructor/my/index.ts index a67b28e..0e19366 100644 --- a/src/widgets/instructor/my/index.ts +++ b/src/widgets/instructor/my/index.ts @@ -1,2 +1,2 @@ -export { default as CommissionsHistorySection } from "@/widgets/instructor/my/ui/CommissionsHistorySection"; -export { default as MyInfoSection } from "@/widgets/instructor/my/ui/MyInfoSection"; +export { default as CommissionsHistorySection } from "./ui/CommissionsHistorySection"; +export { default as MyInfoSection } from "./ui/MyInfoSection"; diff --git a/src/widgets/instructor/revision/index.ts b/src/widgets/instructor/revision/index.ts index ecb315a..9489ede 100644 --- a/src/widgets/instructor/revision/index.ts +++ b/src/widgets/instructor/revision/index.ts @@ -1,2 +1,2 @@ -export { default as RevisionCategorySection } from "@/widgets/instructor/revision/ui/RevisionCategorySection"; -export { default as RevisionCommentSection } from "@/widgets/instructor/revision/ui/RevisionCommentSection"; +export { default as RevisionCategorySection } from "./ui/RevisionCategorySection"; +export { default as RevisionCommentSection } from "./ui/RevisionCommentSection"; diff --git a/src/widgets/instructor/write/index.ts b/src/widgets/instructor/write/index.ts index 5391f33..c9adb02 100644 --- a/src/widgets/instructor/write/index.ts +++ b/src/widgets/instructor/write/index.ts @@ -1,3 +1,3 @@ -export { default as Step1Content } from "@/widgets/instructor/write/ui/Step1Content"; -export { default as Step2Content } from "@/widgets/instructor/write/ui/Step2Content"; -export { default as Step3Content } from "@/widgets/instructor/write/ui/Step3Content"; +export { default as Step1Content } from "./ui/Step1Content"; +export { default as Step2Content } from "./ui/Step2Content"; +export { default as Step3Content } from "./ui/Step3Content";