diff --git a/src/widgets/instructor/write/ui/AttachFileSection.tsx b/src/widgets/instructor/write/ui/AttachFileSection.tsx
index 3595c8e..c358734 100644
--- a/src/widgets/instructor/write/ui/AttachFileSection.tsx
+++ b/src/widgets/instructor/write/ui/AttachFileSection.tsx
@@ -2,7 +2,11 @@
import { useState } from "react";
-import { useWriteFormStore } from "@/features/instructor/write";
+import {
+ COMMISSION_FILE_TARGET,
+ uploadCommissionFile,
+ useWriteFormStore,
+} from "@/features/instructor/write";
import { useUploadedFiles } from "@/shared/lib/hooks/useUploadedFiles";
import { isAllowedFileType, MAX_FILE_SIZE_BYTES } from "@/shared/lib/utils/file";
import FileDragAndDrop from "@/shared/ui/FileDragAndDrop";
@@ -15,12 +19,14 @@ const MAX_FILE_COUNT = 5;
const AttachFileSection = () => {
const { materialFiles, setMaterialFiles, materialDescription, setMaterialDescription } =
useWriteFormStore();
+ const [isInvalidFileModalOpen, setIsInvalidFileModalOpen] = useState(false);
+ const [isFileCountExceededModalOpen, setIsFileCountExceededModalOpen] = useState(false);
const { uploadedFiles, handleFilesAdded, handleRemove } = useUploadedFiles(
materialFiles,
setMaterialFiles,
+ file => uploadCommissionFile(file, COMMISSION_FILE_TARGET.MATERIAL),
+ () => setIsInvalidFileModalOpen(true),
);
- const [isInvalidFileModalOpen, setIsInvalidFileModalOpen] = useState(false);
- const [isFileCountExceededModalOpen, setIsFileCountExceededModalOpen] = useState(false);
const handleValidatedFilesAdded = (files: File[]) => {
const validFiles = files.filter(
diff --git a/src/widgets/instructor/write/ui/DeadlineChooseSection.tsx b/src/widgets/instructor/write/ui/DeadlineChooseSection.tsx
index a77a2c2..c8c501e 100644
--- a/src/widgets/instructor/write/ui/DeadlineChooseSection.tsx
+++ b/src/widgets/instructor/write/ui/DeadlineChooseSection.tsx
@@ -4,8 +4,9 @@ import { useEffect, useRef, useState } from "react";
import {
formatDate,
+ getFirstAvailableDate,
getMinFinalDate,
- getYesterday,
+ getMinFirstDate,
useWriteFormStore,
} from "@/features/instructor/write";
import DateDropdownBox from "@/shared/ui/dropdown/DateDropdownBox";
@@ -15,7 +16,8 @@ const DeadlineChooseSection = () => {
const { firstDate, setFirstDate, finalDate, setFinalDate } = useWriteFormStore();
const [openMenu, setOpenMenu] = useState<"first" | "final" | null>(null);
- const yesterday = getYesterday();
+ const minFirstDate = getMinFirstDate();
+ const firstAvailableDate = getFirstAvailableDate();
const containerRef = useRef
(null);
@@ -61,9 +63,9 @@ const DeadlineChooseSection = () => {
)}
diff --git a/src/widgets/instructor/write/ui/DesignConceptSection.tsx b/src/widgets/instructor/write/ui/DesignConceptSection.tsx
index 4e00c68..28448ce 100644
--- a/src/widgets/instructor/write/ui/DesignConceptSection.tsx
+++ b/src/widgets/instructor/write/ui/DesignConceptSection.tsx
@@ -86,7 +86,7 @@ const DesignConceptSection = () => {
>
setAdditionalConcept(e.target.value)}
/>
diff --git a/src/widgets/instructor/write/ui/NecessaryPageChooseSection.tsx b/src/widgets/instructor/write/ui/NecessaryPageChooseSection.tsx
index 50108ef..ebf735d 100644
--- a/src/widgets/instructor/write/ui/NecessaryPageChooseSection.tsx
+++ b/src/widgets/instructor/write/ui/NecessaryPageChooseSection.tsx
@@ -65,7 +65,9 @@ const NecessaryPageChooseSection = () => {
))}
) : (
- 상단에서 필수페이지를 우선 선택해주세요
+
+ 상단에서 외주 맡길 페이지를 우선 선택해주세요
+
)}
);
diff --git a/src/widgets/instructor/write/ui/ReferenceSection.tsx b/src/widgets/instructor/write/ui/ReferenceSection.tsx
index 1d565e8..3c35d48 100644
--- a/src/widgets/instructor/write/ui/ReferenceSection.tsx
+++ b/src/widgets/instructor/write/ui/ReferenceSection.tsx
@@ -2,7 +2,11 @@
import { useState } from "react";
-import { useWriteFormStore } from "@/features/instructor/write";
+import {
+ COMMISSION_FILE_TARGET,
+ uploadCommissionFile,
+ useWriteFormStore,
+} from "@/features/instructor/write";
import { useUploadedFiles } from "@/shared/lib/hooks/useUploadedFiles";
import { isAllowedFileType, MAX_FILE_SIZE_BYTES } from "@/shared/lib/utils/file";
import FileDragAndDrop from "@/shared/ui/FileDragAndDrop";
@@ -15,12 +19,14 @@ const MAX_FILE_COUNT = 3;
const ReferenceSection = () => {
const { referenceFiles, setReferenceFiles, referenceDescription, setReferenceDescription } =
useWriteFormStore();
+ const [isInvalidFileModalOpen, setIsInvalidFileModalOpen] = useState(false);
+ const [isFileCountExceededModalOpen, setIsFileCountExceededModalOpen] = useState(false);
const { uploadedFiles, handleFilesAdded, handleRemove } = useUploadedFiles(
referenceFiles,
setReferenceFiles,
+ file => uploadCommissionFile(file, COMMISSION_FILE_TARGET.REFERENCE),
+ () => setIsInvalidFileModalOpen(true),
);
- const [isInvalidFileModalOpen, setIsInvalidFileModalOpen] = useState(false);
- const [isFileCountExceededModalOpen, setIsFileCountExceededModalOpen] = useState(false);
const handleValidatedFilesAdded = (files: File[]) => {
const validFiles = files.filter(
diff --git a/src/widgets/instructor/write/ui/Step1Content.tsx b/src/widgets/instructor/write/ui/Step1Content.tsx
index fcfa311..0911873 100644
--- a/src/widgets/instructor/write/ui/Step1Content.tsx
+++ b/src/widgets/instructor/write/ui/Step1Content.tsx
@@ -8,15 +8,20 @@ import DesignConceptSection from "@/widgets/instructor/write/ui/DesignConceptSec
import SizeSection from "@/widgets/instructor/write/ui/SizeSection";
const Step1Content = () => {
- const { selectedCategory, selectedSize, selectedKeywords, colorMode, colors, setCurrentStep } =
- useWriteFormStore();
+ const {
+ selectedCategory,
+ selectedSize,
+ selectedKeywords,
+ additionalConcept,
+ colorMode,
+ colors,
+ setCurrentStep,
+ } = useWriteFormStore();
const isColorReady = colorMode === "designer" || colors.every(c => c !== null);
+ const isConceptReady = selectedKeywords.length >= 1 || additionalConcept.trim().length > 0;
const isAllSelected =
- selectedCategory !== null &&
- selectedSize !== null &&
- selectedKeywords.length >= 1 &&
- isColorReady;
+ selectedCategory !== null && selectedSize !== null && isConceptReady && isColorReady;
return (
diff --git a/src/widgets/instructor/write/ui/Step2Content.tsx b/src/widgets/instructor/write/ui/Step2Content.tsx
index 9996eb4..7a44291 100644
--- a/src/widgets/instructor/write/ui/Step2Content.tsx
+++ b/src/widgets/instructor/write/ui/Step2Content.tsx
@@ -8,13 +8,23 @@ import NecessaryPageChooseSection from "@/widgets/instructor/write/ui/NecessaryP
import ReferenceSection from "@/widgets/instructor/write/ui/ReferenceSection";
const Step2Content = () => {
- const { basicInfo, selectedPages, setCurrentStep } = useWriteFormStore();
+ const {
+ basicInfo,
+ selectedPages,
+ materialFiles,
+ materialDescription,
+ referenceFiles,
+ referenceDescription,
+ setCurrentStep,
+ } = useWriteFormStore();
const isAllFilled =
basicInfo.교재명.trim() !== "" &&
basicInfo.강사명.trim() !== "" &&
basicInfo.과목명.trim() !== "" &&
- selectedPages.length >= 1;
+ selectedPages.length >= 1 &&
+ (materialFiles.length === 0 || materialDescription.trim() !== "") &&
+ (referenceFiles.length === 0 || referenceDescription.trim() !== "");
return (