- {/* 오류 메시지 */}
- {bot.status === 'error' && bot.error_message && (
-
+ {/* 버튼 */}
+
);
});
+/**
+ * 미니 카드형 봇 (YouTube용) - 컴팩트한 카드
+ */
+export const BotMiniCard = memo(function BotMiniCard({
+ bot,
+ index,
+ isInitialLoad,
+ syncing,
+ statusInfo,
+ onSync,
+ onToggle,
+ onAnimationComplete,
+ formatTime,
+ formatInterval,
+}) {
+ return (
+
+ {/* 메인 영역 */}
+
+
+
{bot.name}
+
+
+ {statusInfo.text}
+
+
+
+ {/* 간단 통계 */}
+
+ 총 {bot.schedules_added || 0}
+ •
+ 최근 0 ? 'text-green-600' : 'text-gray-400'}>+{bot.last_added_count || 0}
+ •
+ {formatInterval(bot.check_interval)}
+
+
+ {/* 마지막 업데이트 */}
+
+ {bot.last_check_at ? formatTime(bot.last_check_at) : '대기 중'}
+
+
+
+ {/* 오류 메시지 */}
+ {bot.status === 'error' && bot.error_message && (
+
+ {bot.error_message}
+
+ )}
+
+ {/* 호버시 나타나는 액션 버튼 */}
+
+
+
+
+
+ );
+});
+
+/**
+ * 테이블 행 봇 (X용)
+ */
+export const BotTableRow = memo(function BotTableRow({
+ bot,
+ index,
+ isInitialLoad,
+ syncing,
+ statusInfo,
+ onSync,
+ onToggle,
+ onAnimationComplete,
+ formatTime,
+ formatInterval,
+}) {
+ return (
+
+
+
+
+ {bot.name}
+
+ |
+
+
+ {statusInfo.text}
+
+ |
+ {bot.schedules_added || 0} |
+
+ 0 ? 'text-green-600 font-medium' : 'text-gray-400'}>
+ +{bot.last_added_count || 0}
+
+ |
+ {formatInterval(bot.check_interval)} |
+
+ {bot.last_check_at ? formatTime(bot.last_check_at) : '-'}
+ |
+
+
+
+
+
+ |
+
+ );
+});
+
+/**
+ * 테이블 래퍼 (X용)
+ */
+export const BotTable = ({ children }) => (
+
+
+
+
+ | 이름 |
+ 상태 |
+ 총 추가 |
+ 최근 |
+ 간격 |
+ 마지막 업데이트 |
+ 액션 |
+
+
+ {children}
+
+
+);
+
+// 기본 카드 (호환성 유지)
+const BotCard = BotMiniCard;
+
export default BotCard;
diff --git a/frontend/src/components/pc/admin/bot/index.js b/frontend/src/components/pc/admin/bot/index.js
index e95a011..64c22aa 100644
--- a/frontend/src/components/pc/admin/bot/index.js
+++ b/frontend/src/components/pc/admin/bot/index.js
@@ -1 +1 @@
-export { default as BotCard, XIcon, MeilisearchIcon } from './BotCard';
+export { default as BotCard, XIcon, MeilisearchIcon, BotListItem, BotMiniCard, BotTableRow, BotTable } from './BotCard';
diff --git a/frontend/src/pages/pc/admin/schedules/ScheduleBots.jsx b/frontend/src/pages/pc/admin/schedules/ScheduleBots.jsx
index fb9cdd0..49956f3 100644
--- a/frontend/src/pages/pc/admin/schedules/ScheduleBots.jsx
+++ b/frontend/src/pages/pc/admin/schedules/ScheduleBots.jsx
@@ -4,7 +4,7 @@ import { useQuery, useQueryClient } from '@tanstack/react-query';
import { motion, AnimatePresence } from 'framer-motion';
import { Home, ChevronRight, Bot, CheckCircle, XCircle, RefreshCw, Plus, Database, Youtube } from 'lucide-react';
import { Toast, Tooltip, AnimatedNumber } from '@/components/common';
-import { AdminLayout, BotCard, XIcon } from '@/components/pc/admin';
+import { AdminLayout, BotCard, XIcon, BotListItem, BotMiniCard, BotTableRow, BotTable } from '@/components/pc/admin';
import { useAdminAuth } from '@/hooks/pc/admin';
import { useToast } from '@/hooks/common';
import * as botsApi from '@/api/admin/bots';
@@ -379,7 +379,7 @@ function ScheduleBots() {