fix: support overview scene URLs with embedded passwords

This commit is contained in:
2026-09-23 11:01:31 +09:00
parent 8e82e10234
commit b674f92a41
2 changed files with 10 additions and 20 deletions
+1 -2
View File
@@ -9,7 +9,7 @@ export type CurriculumWeek = {
duration: string; duration: string;
github: string; github: string;
detail: { detail: {
camera?: { url: string; password: string }; camera?: { url: string };
overview: string; overview: string;
learningSteps?: Array<{ learningSteps?: Array<{
title: string; title: string;
@@ -147,7 +147,6 @@ export async function updateInstructorCurriculum(
duration?: string; duration?: string;
overview?: string; overview?: string;
cameraViewUrl?: string; cameraViewUrl?: string;
cameraPassword?: string;
deliverable?: string; deliverable?: string;
isTeamProject?: boolean; isTeamProject?: boolean;
topics?: string[]; topics?: string[];
+9 -18
View File
@@ -117,7 +117,6 @@ export function CurriculumPage({ session, selectedCourseId }: { session: AuthSes
const [draftDuration, setDraftDuration] = useState(''); const [draftDuration, setDraftDuration] = useState('');
const [draftOverview, setDraftOverview] = useState(''); const [draftOverview, setDraftOverview] = useState('');
const [draftCameraUrl, setDraftCameraUrl] = useState(''); const [draftCameraUrl, setDraftCameraUrl] = useState('');
const [draftCameraPassword, setDraftCameraPassword] = useState('');
const [draftDeliverable, setDraftDeliverable] = useState(''); const [draftDeliverable, setDraftDeliverable] = useState('');
const [draftIsTeamProject, setDraftIsTeamProject] = useState(false); const [draftIsTeamProject, setDraftIsTeamProject] = useState(false);
const [draftTopics, setDraftTopics] = useState<string[]>([]); const [draftTopics, setDraftTopics] = useState<string[]>([]);
@@ -277,7 +276,6 @@ export function CurriculumPage({ session, selectedCourseId }: { session: AuthSes
setDraftDuration(selectedWeek.duration); setDraftDuration(selectedWeek.duration);
setDraftOverview(selectedWeek.detail.overview); setDraftOverview(selectedWeek.detail.overview);
setDraftCameraUrl(selectedWeek.detail.camera?.url ?? ''); setDraftCameraUrl(selectedWeek.detail.camera?.url ?? '');
setDraftCameraPassword(selectedWeek.detail.camera?.password ?? '');
setDraftDeliverable(selectedWeek.detail.deliverable); setDraftDeliverable(selectedWeek.detail.deliverable);
setDraftIsTeamProject(Boolean(selectedWeek.isTeamProject)); setDraftIsTeamProject(Boolean(selectedWeek.isTeamProject));
setDraftTopics(selectedWeek.topics.length ? selectedWeek.topics : ['']); setDraftTopics(selectedWeek.topics.length ? selectedWeek.topics : ['']);
@@ -355,7 +353,6 @@ export function CurriculumPage({ session, selectedCourseId }: { session: AuthSes
duration: draftDuration, duration: draftDuration,
overview: draftOverview, overview: draftOverview,
cameraViewUrl: draftCameraUrl, cameraViewUrl: draftCameraUrl,
cameraPassword: draftCameraPassword,
deliverable: draftDeliverable, deliverable: draftDeliverable,
isTeamProject: draftIsTeamProject, isTeamProject: draftIsTeamProject,
topics: draftTopics.map((topic) => topic.trim()).filter(Boolean), topics: draftTopics.map((topic) => topic.trim()).filter(Boolean),
@@ -405,7 +402,6 @@ export function CurriculumPage({ session, selectedCourseId }: { session: AuthSes
duration: draftDuration, duration: draftDuration,
overview: draftOverview, overview: draftOverview,
cameraViewUrl: draftCameraUrl, cameraViewUrl: draftCameraUrl,
cameraPassword: draftCameraPassword,
deliverable: draftDeliverable, deliverable: draftDeliverable,
isTeamProject: draftIsTeamProject, isTeamProject: draftIsTeamProject,
topics, topics,
@@ -448,7 +444,6 @@ export function CurriculumPage({ session, selectedCourseId }: { session: AuthSes
duration: draftDuration, duration: draftDuration,
overview: draftOverview, overview: draftOverview,
cameraViewUrl: draftCameraUrl, cameraViewUrl: draftCameraUrl,
cameraPassword: draftCameraPassword,
deliverable: draftDeliverable, deliverable: draftDeliverable,
isTeamProject: draftIsTeamProject, isTeamProject: draftIsTeamProject,
topics: draftTopics.map((topic) => topic.trim()).filter(Boolean), topics: draftTopics.map((topic) => topic.trim()).filter(Boolean),
@@ -1215,19 +1210,6 @@ export function CurriculumPage({ session, selectedCourseId }: { session: AuthSes
</select> </select>
</label> </label>
</div> </div>
<div className="grid min-w-0 gap-3">
<label className="block min-w-0">
<span className="text-[12px] font-black text-[#475569]">오버뷰 시청 URL</span>
<input type="url" value={draftCameraUrl} onChange={(event) => setDraftCameraUrl(event.target.value)}
placeholder="시청 링크"
className="mt-1.5 h-10 w-full min-w-0 rounded-md border border-[#d1d9e6] bg-white px-3 text-[13px] outline-none focus:border-[#2563eb]" />
</label>
<label className="block min-w-0">
<span className="text-[12px] font-black text-[#475569]">오버뷰 방 비밀번호</span>
<input type="password" autoComplete="new-password" value={draftCameraPassword} onChange={(event) => setDraftCameraPassword(event.target.value)}
className="mt-1.5 h-10 w-full min-w-0 rounded-md border border-[#d1d9e6] bg-white px-3 text-[13px] outline-none focus:border-[#2563eb]" />
</label>
</div>
<label className="block h-[100px]"> <label className="block h-[100px]">
<span className="text-[12px] font-black text-[#475569]">주차 개요</span> <span className="text-[12px] font-black text-[#475569]">주차 개요</span>
<textarea <textarea
@@ -1499,6 +1481,15 @@ export function CurriculumPage({ session, selectedCourseId }: { session: AuthSes
</div> </div>
</div> </div>
</section> </section>
<section className="grid min-w-0 gap-3">
<h3 className="text-[15px] font-black text-[#111827]">오버뷰</h3>
<label className="block min-w-0">
<span className="text-[12px] font-black text-[#475569]">오버뷰 시청 URL</span>
<input type="url" value={draftCameraUrl} onChange={(event) => setDraftCameraUrl(event.target.value)}
placeholder="시청 링크"
className="mt-1.5 h-10 w-full min-w-0 rounded-md border border-[#d1d9e6] bg-white px-3 text-[13px] outline-none focus:border-[#2563eb]" />
</label>
</section>
</div> </div>
)} )}
</div> </div>