page.tsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. 'use client';
  2. import { useState, useEffect, useCallback } from 'react';
  3. import { Header } from '@/components/layout';
  4. import { AppLayout } from '@/components/layout';
  5. import { EnhancedQueueList } from '@/components/features/queue';
  6. import { apiClient, type QueueStatus, type JobInfo } from '@/lib/api';
  7. import { Loader2 } from 'lucide-react';
  8. export default function QueuePage() {
  9. const [queueStatus, setQueueStatus] = useState<QueueStatus | null>(null);
  10. const [loading, setLoading] = useState(true);
  11. const [actionLoading, setActionLoading] = useState(false);
  12. const loadQueueStatus = useCallback(async () => {
  13. try {
  14. const status = await apiClient.getQueueStatus();
  15. setQueueStatus(status);
  16. } catch (error) {
  17. console.error('Failed to load queue status:', error);
  18. } finally {
  19. setLoading(false);
  20. }
  21. }, []);
  22. useEffect(() => {
  23. loadQueueStatus();
  24. const interval = setInterval(loadQueueStatus, 2000);
  25. return () => clearInterval(interval);
  26. }, [loadQueueStatus]);
  27. const cancelJob = useCallback(async (jobId: string) => {
  28. setActionLoading(true);
  29. try {
  30. await apiClient.cancelJob(jobId);
  31. await loadQueueStatus();
  32. } catch (error) {
  33. console.error('Failed to cancel job:', error);
  34. } finally {
  35. setActionLoading(false);
  36. }
  37. }, [loadQueueStatus]);
  38. const clearQueue = useCallback(async () => {
  39. setActionLoading(true);
  40. try {
  41. await apiClient.clearQueue();
  42. await loadQueueStatus();
  43. } catch (error) {
  44. console.error('Failed to clear queue:', error);
  45. } finally {
  46. setActionLoading(false);
  47. }
  48. }, [loadQueueStatus]);
  49. const copyParameters = useCallback((job: JobInfo) => {
  50. // This would typically copy to clipboard and show a toast
  51. console.log('Parameters copied for job:', job.id);
  52. }, []);
  53. if (loading) {
  54. return (
  55. <AppLayout>
  56. <Header title="Queue" description="Monitor and manage generation jobs" />
  57. <div className="container mx-auto p-6">
  58. <div className="flex items-center justify-center h-64">
  59. <Loader2 className="h-8 w-8 animate-spin" />
  60. </div>
  61. </div>
  62. </AppLayout>
  63. );
  64. }
  65. return (
  66. <AppLayout>
  67. <Header title="Queue" description="Monitor and manage generation jobs" />
  68. <div className="container mx-auto p-6">
  69. <EnhancedQueueList
  70. queueStatus={queueStatus}
  71. loading={loading}
  72. onRefresh={loadQueueStatus}
  73. onCancelJob={cancelJob}
  74. onClearQueue={clearQueue}
  75. actionLoading={actionLoading}
  76. onCopyParameters={copyParameters}
  77. />
  78. </div>
  79. </AppLayout>
  80. );
  81. }