File size: 6,085 Bytes
16e3470
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2fe6cfb
16e3470
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2fe6cfb
16e3470
 
2fe6cfb
 
16e3470
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2fe6cfb
16e3470
 
2fe6cfb
 
16e3470
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import React from 'react';
import { UploadStatus } from './types';
import { FileUploader } from './components/FileUploader';
import { UploadList } from './components/UploadList';
import { Upload, Rocket, Database, ShieldCheck, Zap, LayoutGrid } from 'lucide-react';
import { useFileUpload } from './hooks/useFileUpload';

export default function App() {
  const { 
    files, 
    isUploading, 
    addFiles, 
    removeFile, 
    updateFilePath, 
    startUpload
  } = useFileUpload();

  const hasPendingFiles = files.some(f => f.status === UploadStatus.IDLE || f.status === UploadStatus.ERROR);

  return (
    <div className="min-h-screen bg-gray-50 flex flex-col font-sans">
      {/* Header */}
      <header className="bg-white border-b border-gray-200 sticky top-0 z-20 shadow-sm">
        <div className="max-w-5xl mx-auto px-6 py-4 flex items-center justify-between">
          <div className="flex items-center gap-3">
            <div className="bg-gradient-to-br from-yellow-400 to-orange-500 p-2.5 rounded-xl shadow-md">
                <Rocket className="w-6 h-6 text-white" />
            </div>
            <div>
                <h1 className="text-xl font-bold text-gray-900 leading-tight tracking-tight">Twan Uploader</h1>
                <p className="text-xs text-gray-500 font-medium flex items-center gap-1.5">
                  <span className="w-2 h-2 rounded-full bg-green-500 animate-pulse"></span>
                  Secure Connection Active
                </p>
            </div>
          </div>
          <div className="flex items-center gap-4">
              <nav className="hidden md:flex items-center gap-6 text-sm font-medium text-gray-600">
                 <a href="#features" className="hover:text-yellow-600 transition-colors">Features</a>
                 <a href="#about" className="hover:text-yellow-600 transition-colors">About</a>
              </nav>
          </div>
        </div>
      </header>

      {/* Main Content */}
      <main className="flex-grow w-full max-w-3xl mx-auto px-6 py-12 space-y-8">
        
        {/* Intro */}
        <section className="text-center mb-10">
          <h2 className="text-3xl font-extrabold text-gray-900 mb-4">
            Upload Databases to Twan Data Center
          </h2>
          <p className="text-gray-600 text-lg leading-relaxed">
            The fastest, most secure way to manage your machine learning Databases. 
            Bulk upload files directly to the <strong>Twan</strong>.
          </p>
        </section>

        {/* Upload Area */}
        <div className="bg-white p-1 rounded-2xl shadow-sm border border-gray-200">
            <div className="p-8">
                <h3 className="text-lg font-semibold text-gray-800 flex items-center gap-2 mb-6">
                    <Upload className="w-5 h-5 text-blue-500" />
                    Select Dataset Files
                </h3>
                <FileUploader 
                    onFilesAdded={addFiles} 
                    disabled={isUploading} 
                />
            </div>
        </div>

        {/* File Queue */}
        <div id="queue">
            <UploadList 
                files={files} 
                onRemove={removeFile} 
                onPathChange={updateFilePath}
            />
        </div>
        
          {/* Upload Action */}
        {files.length > 0 && (
            <div className="flex justify-end pt-2">
                <button
                    onClick={startUpload}
                    disabled={!hasPendingFiles || isUploading}
                    className={`
                        flex items-center gap-2 px-10 py-4 rounded-xl font-bold shadow-lg transform transition-all text-lg
                        ${!hasPendingFiles || isUploading 
                            ? 'bg-gray-100 text-gray-400 cursor-not-allowed border border-gray-200' 
                            : 'bg-gradient-to-r from-yellow-400 to-orange-500 text-white hover:shadow-orange-200 hover:shadow-xl hover:-translate-y-0.5 active:translate-y-0'}
                    `}
                >
                    {isUploading ? (
                        <>
                            <Rocket className="w-6 h-6 animate-pulse" />
                            Uploading...
                        </>
                    ) : (
                        <>
                            <Upload className="w-6 h-6" />
                            Start Secure Upload
                        </>
                    )}
                </button>
            </div>
        )}
      </main>

      {/* SEO Footer */}
      <footer className="bg-white border-t border-gray-200 mt-12 py-12">
        <div className="max-w-5xl mx-auto px-6 grid md:grid-cols-2 gap-12">
          <article id="about" className="space-y-4">
            <h3 className="text-lg font-bold text-gray-900 flex items-center gap-2">
              <Database className="w-5 h-5 text-yellow-500" />
              About Twan Uploader
            </h3>
            <p className="text-gray-600 text-sm leading-relaxed">
              Twan Uploader is a premier <strong>Twan Data Center Management Tool</strong>. 
              We streamline pushing large Databases to the cloud with enterprise-grade reliability.
            </p>
          </article>
          <article id="features" className="space-y-4">
            <h3 className="text-lg font-bold text-gray-900 flex items-center gap-2">
              <Zap className="w-5 h-5 text-yellow-500" />
              Features
            </h3>
            <ul className="space-y-3 text-sm text-gray-600">
                <li className="flex gap-2 items-center"><ShieldCheck className="w-4 h-4 text-green-500"/> Secure Proxy Upload Technology</li>
                <li className="flex gap-2 items-center"><LayoutGrid className="w-4 h-4 text-blue-500"/> Bulk File Processing</li>
                <li className="flex gap-2 items-center"><Rocket className="w-4 h-4 text-orange-500"/> Optimized for High Performance</li>
            </ul>
          </article>
        </div>
      </footer>
    </div>
  );
}