Skip to content

Commit 3d79b93

Browse files
author
secus
committed
update ui landing page
1 parent da8f4db commit 3d79b93

23 files changed

Lines changed: 1621 additions & 581 deletions

.env.development

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ DOMAIN_SUFFIX=vinhomes.co.uk
2323

2424
# Logging
2525
RUST_LOG=container_engine=debug,tower_http=debug
26-
KUBECONFIG_PATH=./k8sConfigTest.yaml
26+
KUBECONFIG_PATH=./k8sConfig.yaml

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# Kubernetes config files
22
k8sConfig.yaml
3+
k8sConfigLocal.yaml
34
*.kubeconfig
45
# Rust
56
/target/

.sqlx/query-ed7ab61477ba129991cfbd2df35a01e5a599793080f2a4b1d07972c0846bbc39.json renamed to .sqlx/query-be6b40cc827174e6838a27a3440734c49339f77fa53bd8e7cc069334b04076c2.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

apps/container-engine-frontend/src/api/api.ts

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -34,27 +34,10 @@ api.interceptors.response.use(
3434
(error) => {
3535
// Handle network errors
3636
if (!error.response) {
37-
console.error('Network error:', error.message);
38-
return Promise.reject(new Error('Network error - please check your connection'));
39-
}
40-
41-
// Handle 401 Unauthorized
42-
if (error.response?.status === 401) {
43-
localStorage.removeItem('access_token');
44-
localStorage.removeItem('user');
45-
window.location.href = '/auth';
46-
}
47-
48-
// Handle 403 Forbidden
49-
if (error.response?.status === 403) {
50-
console.error('Access forbidden');
51-
}
52-
53-
// Handle 500 Internal Server Error
54-
if (error.response?.status === 500) {
55-
console.error('Server error occurred');
56-
}
57-
37+
const errorMessage = 'Network error - please check your connection';
38+
alert(errorMessage);
39+
return Promise.reject(new Error(errorMessage));
40+
}
5841
return Promise.reject(error);
5942
}
6043
);

apps/container-engine-frontend/src/components/DeploymentDetail/LogsPage.tsx

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export default function LogsPage() {
3737
};
3838

3939
// Load historical logs from API
40-
const loadHistoricalLogs = async () => {
40+
const loadHistoricalLogs = async (retryCount = 0) => {
4141
if (!deploymentId) return;
4242

4343
setIsLoadingHistory(true);
@@ -74,6 +74,22 @@ export default function LogsPage() {
7474
setError('Authentication failed. Please login again.');
7575
} else if (err?.response?.status === 404) {
7676
setError('Deployment not found or no logs available.');
77+
} else if (err?.response?.status === 400 && err?.response?.data?.message?.includes('ContainerCreating')) {
78+
if (retryCount < 10) {
79+
setError(`Container is starting up... (Retry ${retryCount + 1}/10)`);
80+
setTimeout(() => loadHistoricalLogs(retryCount + 1), 3000);
81+
return;
82+
} else {
83+
setError('Container is taking longer than expected to start. Please refresh manually.');
84+
}
85+
} else if (err?.response?.status === 400 && err?.response?.data?.message?.includes('waiting to start')) {
86+
if (retryCount < 10) {
87+
setError(`Container is being created... (Retry ${retryCount + 1}/10)`);
88+
setTimeout(() => loadHistoricalLogs(retryCount + 1), 3000);
89+
return;
90+
} else {
91+
setError('Container is taking longer than expected to start. Please refresh manually.');
92+
}
7793
} else {
7894
setError('Failed to load log history');
7995
}

apps/container-engine-frontend/src/components/Layout/DashboardLayout.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -176,19 +176,19 @@ const Header: React.FC<{ onMenuClick: () => void }> = ({ onMenuClick }) => {
176176
<div className="px-4 sm:px-6 py-4">
177177
<div className="flex justify-between items-center">
178178
{/* Left side */}
179-
<div className="flex items-center space-x-4">
179+
<div className="flex items-center space-x-2 sm:space-x-4">
180180
<button
181181
onClick={onMenuClick}
182182
className="lg:hidden p-2 rounded-lg hover:bg-slate-100 transition-colors"
183183
>
184184
<MenuIcon />
185185
</button>
186186

187-
<div>
188-
<h1 className="text-xl font-bold text-slate-800">
187+
<div className="min-w-0">
188+
<h1 className="text-base sm:text-lg lg:text-xl font-bold text-slate-800 truncate">
189189
Welcome back, {user?.username || 'User'}! 👋
190190
</h1>
191-
<p className="text-sm text-slate-500">
191+
<p className="text-xs sm:text-sm text-slate-500 hidden sm:block">
192192
{new Date().toLocaleDateString('vi-VN', {
193193
weekday: 'long',
194194
year: 'numeric',
@@ -200,13 +200,13 @@ const Header: React.FC<{ onMenuClick: () => void }> = ({ onMenuClick }) => {
200200
</div>
201201

202202
{/* Right side */}
203-
<div className="flex items-center space-x-4">
203+
<div className="flex items-center space-x-2 sm:space-x-4">
204204
{/* Search */}
205205
<div className="hidden md:block relative">
206206
<input
207207
type="text"
208208
placeholder="Search..."
209-
className="pl-10 pr-4 py-2 border border-slate-200 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all"
209+
className="pl-10 pr-4 py-2 border border-slate-200 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all text-sm"
210210
/>
211211
<svg className="w-4 h-4 absolute left-3 top-3 text-slate-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
212212
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
@@ -220,13 +220,13 @@ const Header: React.FC<{ onMenuClick: () => void }> = ({ onMenuClick }) => {
220220
className="relative p-2 rounded-lg hover:bg-slate-100 transition-colors"
221221
>
222222
<BellIcon />
223-
<span className="absolute -top-1 -right-1 w-5 h-5 bg-red-500 text-white text-xs rounded-full flex items-center justify-center">
223+
<span className="absolute -top-1 -right-1 w-4 h-4 sm:w-5 sm:h-5 bg-red-500 text-white text-xs rounded-full flex items-center justify-center">
224224
3
225225
</span>
226226
</button>
227227

228228
{showNotifications && (
229-
<div className="absolute right-0 mt-2 w-80 bg-white rounded-xl shadow-lg border border-slate-200 py-2 z-50">
229+
<div className="absolute right-0 mt-2 w-72 sm:w-80 bg-white rounded-xl shadow-lg border border-slate-200 py-2 z-50">
230230
<div className="px-4 py-2 border-b border-slate-100">
231231
<h3 className="font-semibold text-slate-800">Notifications</h3>
232232
</div>
@@ -246,7 +246,7 @@ const Header: React.FC<{ onMenuClick: () => void }> = ({ onMenuClick }) => {
246246
<div className="relative">
247247
<button
248248
onClick={() => setShowProfile(!showProfile)}
249-
className="flex items-center space-x-2 p-2 rounded-lg hover:bg-slate-100 transition-colors"
249+
className="flex items-center space-x-1 sm:space-x-2 p-2 rounded-lg hover:bg-slate-100 transition-colors"
250250
>
251251
<div className="w-8 h-8 bg-linear-to-r from-blue-500 to-purple-600 rounded-full flex items-center justify-center">
252252
<span className="text-white font-medium text-sm">
@@ -291,7 +291,7 @@ const DashboardLayout: React.FC<{ children: React.ReactNode }> = ({ children })
291291
<Header onMenuClick={() => setSidebarOpen(!sidebarOpen)} />
292292

293293
<main className="flex-1 overflow-auto">
294-
<div className="p-6">
294+
<div className="p-4 sm:p-6">
295295
{children}
296296
</div>
297297
</main>
Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,29 @@
1-
@import "tailwindcss";
1+
@import "tailwindcss";
2+
3+
/* Custom animations for magical effects */
4+
@keyframes blob {
5+
0% {
6+
transform: translate(0px, 0px) scale(1);
7+
}
8+
33% {
9+
transform: translate(30px, -50px) scale(1.1);
10+
}
11+
66% {
12+
transform: translate(-20px, 20px) scale(0.9);
13+
}
14+
100% {
15+
transform: translate(0px, 0px) scale(1);
16+
}
17+
}
18+
19+
.animate-blob {
20+
animation: blob 7s infinite;
21+
}
22+
23+
.animation-delay-2000 {
24+
animation-delay: 2s;
25+
}
26+
27+
.animation-delay-4000 {
28+
animation-delay: 4s;
29+
}

0 commit comments

Comments
 (0)