+
+
대량 발송 이력
+
+ 필터 기반 대량 SMS 발송 잡 이력입니다. 잡을 클릭하면 실패 사유를 확인할 수
+ 있습니다. (조회 전용)
+
+
+
+ {/* MARK: - 필터 */}
+
+
+
+ {
+ setStartDate(e.target.value);
+ resetToFirstPage();
+ }}
+ className='border border-[#D1D5DB] rounded-md px-3 py-2 text-sm'
+ />
+
+
+
+ {
+ setEndDate(e.target.value);
+ resetToFirstPage();
+ }}
+ className='border border-[#D1D5DB] rounded-md px-3 py-2 text-sm'
+ />
+
+
+
+
+
+ {(startDate || endDate || status) && (
+
+ )}
+
+
+ {/* MARK: - 잡 목록 */}
+
+ {isLoading ? (
+
+ ) : error ? (
+
+ {getAdminErrorMessage(error, '이력을 불러오지 못했습니다.')}
+
+ ) : jobs.length === 0 ? (
+
발송 이력이 없습니다.
+ ) : (
+
+
+
+
+ | 발송 일시 |
+ 메시지 |
+ 유형 |
+ 대상 |
+ 성공 |
+ 실패 |
+ 상태 |
+
+
+
+ {jobs.map((job) => (
+ setSelectedJob(job)}
+ onKeyDown={(e) => {
+ if (e.key === 'Enter' || e.key === ' ') {
+ e.preventDefault();
+ setSelectedJob(job);
+ }
+ }}
+ tabIndex={0}
+ role='button'
+ aria-label={`${formatKstDateTime(job.createdAt)} 발송 잡 상세 보기`}
+ className='border-b border-[#F3F4F6] cursor-pointer hover:bg-[#F9FAFB] focus:outline-none focus-visible:bg-[#F3F0FC]'
+ >
+ |
+ {formatKstDateTime(job.createdAt)}
+ |
+
+ {job.messagePreview}
+ {summarizeFilter(job.filterSummary)}
+ |
+ {job.type} |
+ {job.totalCount} |
+ {job.sentCount} |
+ 0 ? 'text-red-600 font-medium' : 'text-[#374151]'}`}
+ >
+ {job.failedCount}
+ |
+
+
+ |
+
+ ))}
+
+
+
+ )}
+
+ {/* MARK: - 페이지네이션 */}
+ {meta && meta.total > 0 && (
+
+
총 {meta.total}건
+
+
+
+ {meta.page} / {Math.max(1, meta.totalPages)}
+
+
+
+
+ )}
+
+
+ {selectedJob &&
setSelectedJob(null)} />}
+
+ );
+}
+
+export default function SmsJobsScreen() {
+ return