예약 업로드 충돌 시 실제 예약 시간 반환
parent
cb68b2da97
commit
429c8d4708
|
|
@ -157,6 +157,7 @@ const SocialPostingModal: React.FC<SocialPostingModalProps> = ({
|
||||||
const [uploadVideoTitle, setUploadVideoTitle] = useState<string>('');
|
const [uploadVideoTitle, setUploadVideoTitle] = useState<string>('');
|
||||||
const [uploadChannelName, setUploadChannelName] = useState<string>('');
|
const [uploadChannelName, setUploadChannelName] = useState<string>('');
|
||||||
const [uploadIsScheduled, setUploadIsScheduled] = useState(false);
|
const [uploadIsScheduled, setUploadIsScheduled] = useState(false);
|
||||||
|
const [uploadScheduledAt, setUploadScheduledAt] = useState<string | null>(null);
|
||||||
|
|
||||||
// 드롭다운 외부 클릭 시 닫기
|
// 드롭다운 외부 클릭 시 닫기
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
|
@ -373,12 +374,13 @@ const SocialPostingModal: React.FC<SocialPostingModalProps> = ({
|
||||||
// 예약 업로드: 폴링 없이 바로 완료 처리
|
// 예약 업로드: 폴링 없이 바로 완료 처리
|
||||||
setUploadStatus('completed');
|
setUploadStatus('completed');
|
||||||
setUploadProgress(100);
|
setUploadProgress(100);
|
||||||
|
setUploadScheduledAt(uploadResponse.scheduled_at ?? null);
|
||||||
onClose();
|
onClose();
|
||||||
resetForm();
|
resetForm();
|
||||||
} else {
|
} else {
|
||||||
// 즉시 업로드: 완료될 때까지 폴링
|
// 즉시 업로드: 완료될 때까지 폴링
|
||||||
const result = await waitForUploadComplete(
|
const result = await waitForUploadComplete(
|
||||||
uploadResponse.upload_id,
|
uploadResponse.upload_id.toString(),
|
||||||
(status, progress) => {
|
(status, progress) => {
|
||||||
setUploadStatus(status as UploadStatus);
|
setUploadStatus(status as UploadStatus);
|
||||||
setUploadProgress(progress || 0);
|
setUploadProgress(progress || 0);
|
||||||
|
|
@ -432,6 +434,7 @@ const SocialPostingModal: React.FC<SocialPostingModalProps> = ({
|
||||||
setUploadVideoTitle('');
|
setUploadVideoTitle('');
|
||||||
setUploadChannelName('');
|
setUploadChannelName('');
|
||||||
setUploadIsScheduled(false);
|
setUploadIsScheduled(false);
|
||||||
|
setUploadScheduledAt(null);
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleClose = () => {
|
const handleClose = () => {
|
||||||
|
|
@ -461,6 +464,7 @@ const SocialPostingModal: React.FC<SocialPostingModalProps> = ({
|
||||||
youtubeUrl={uploadYoutubeUrl}
|
youtubeUrl={uploadYoutubeUrl}
|
||||||
errorMessage={uploadErrorMessage}
|
errorMessage={uploadErrorMessage}
|
||||||
isScheduled={uploadIsScheduled}
|
isScheduled={uploadIsScheduled}
|
||||||
|
scheduledAt={uploadScheduledAt}
|
||||||
onGoToCalendar={onGoToCalendar}
|
onGoToCalendar={onGoToCalendar}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ interface UploadProgressModalProps {
|
||||||
youtubeUrl?: string;
|
youtubeUrl?: string;
|
||||||
errorMessage?: string;
|
errorMessage?: string;
|
||||||
isScheduled?: boolean;
|
isScheduled?: boolean;
|
||||||
|
scheduledAt?: string | null;
|
||||||
onGoToCalendar?: () => void;
|
onGoToCalendar?: () => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -27,6 +28,7 @@ const UploadProgressModal: React.FC<UploadProgressModalProps> = ({
|
||||||
youtubeUrl,
|
youtubeUrl,
|
||||||
errorMessage,
|
errorMessage,
|
||||||
isScheduled = false,
|
isScheduled = false,
|
||||||
|
scheduledAt,
|
||||||
onGoToCalendar,
|
onGoToCalendar,
|
||||||
}) => {
|
}) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
@ -148,6 +150,28 @@ const UploadProgressModal: React.FC<UploadProgressModalProps> = ({
|
||||||
{t('upload.viewOnYoutube')}
|
{t('upload.viewOnYoutube')}
|
||||||
</a>
|
</a>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
{/* Scheduled conflict notice */}
|
||||||
|
{status === 'completed' && isScheduled && scheduledAt && (
|
||||||
|
<div className="upload-progress-schedule-notice">
|
||||||
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
|
||||||
|
<circle cx="12" cy="12" r="10" />
|
||||||
|
<line x1="12" y1="8" x2="12" y2="12" />
|
||||||
|
<line x1="12" y1="16" x2="12.01" y2="16" />
|
||||||
|
</svg>
|
||||||
|
<span>
|
||||||
|
{t('upload.scheduleConflict', {
|
||||||
|
time: new Date(scheduledAt).toLocaleString('ko-KR', {
|
||||||
|
year: 'numeric',
|
||||||
|
month: 'long',
|
||||||
|
day: 'numeric',
|
||||||
|
hour: '2-digit',
|
||||||
|
minute: '2-digit',
|
||||||
|
}),
|
||||||
|
})}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Footer */}
|
{/* Footer */}
|
||||||
|
|
|
||||||
|
|
@ -154,8 +154,8 @@
|
||||||
"confirm": "OK",
|
"confirm": "OK",
|
||||||
"close": "Close",
|
"close": "Close",
|
||||||
"doNotClose": "Upload is in progress. Do not close this window.",
|
"doNotClose": "Upload is in progress. Do not close this window.",
|
||||||
"goToCalendar": "View in Calendar"
|
"goToCalendar": "View in Calendar",
|
||||||
},
|
"scheduleConflict": "Schedule adjusted to {{time}} due to a conflict." },
|
||||||
"landing": {
|
"landing": {
|
||||||
"hero": {
|
"hero": {
|
||||||
"searchTypeBusinessName": "Business Name",
|
"searchTypeBusinessName": "Business Name",
|
||||||
|
|
|
||||||
|
|
@ -154,8 +154,8 @@
|
||||||
"confirm": "확인",
|
"confirm": "확인",
|
||||||
"close": "닫기",
|
"close": "닫기",
|
||||||
"doNotClose": "업로드가 진행 중입니다. 창을 닫지 마세요.",
|
"doNotClose": "업로드가 진행 중입니다. 창을 닫지 마세요.",
|
||||||
"goToCalendar": "캘린더에서 확인"
|
"goToCalendar": "캘린더에서 확인",
|
||||||
},
|
"scheduleConflict": "예약 시간이 충돌하여 {{time}}으로 조정되었습니다." },
|
||||||
"landing": {
|
"landing": {
|
||||||
"hero": {
|
"hero": {
|
||||||
"searchTypeBusinessName": "업체명",
|
"searchTypeBusinessName": "업체명",
|
||||||
|
|
|
||||||
|
|
@ -412,9 +412,11 @@ export interface SocialUploadRequest {
|
||||||
// 소셜 업로드 응답
|
// 소셜 업로드 응답
|
||||||
export interface SocialUploadResponse {
|
export interface SocialUploadResponse {
|
||||||
success: boolean;
|
success: boolean;
|
||||||
upload_id: string;
|
upload_id: number;
|
||||||
status: 'pending' | 'uploading' | 'completed' | 'failed';
|
platform: string;
|
||||||
|
status: string;
|
||||||
message: string;
|
message: string;
|
||||||
|
scheduled_at?: string | null; // 예약 업로드 충돌 시 실제 예약 시간 반환
|
||||||
}
|
}
|
||||||
|
|
||||||
// 소셜 업로드 상태 조회 응답
|
// 소셜 업로드 상태 조회 응답
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue