diff --git a/src/lib/actions/timer.ts b/src/lib/actions/timer.ts index 1e5f9411e..1f6bff7e1 100644 --- a/src/lib/actions/timer.ts +++ b/src/lib/actions/timer.ts @@ -22,7 +22,13 @@ export const timer: Action = (node, props) => { function step() { const diffInSeconds = Math.floor((new Date().getTime() - startDate.getTime()) / 1000); - node.textContent = calculateTime(diffInSeconds); + const minutes = Math.floor(diffInSeconds / 60); + if (minutes > 0) { + const seconds = diffInSeconds % 60; + node.textContent = `${minutes}m ${seconds}s`; + } else { + node.textContent = calculateTime(diffInSeconds); + } frame = window.requestAnimationFrame(step); } diff --git a/src/lib/helpers/timeConversion.ts b/src/lib/helpers/timeConversion.ts index 0ae6387ed..330a38c2f 100644 --- a/src/lib/helpers/timeConversion.ts +++ b/src/lib/helpers/timeConversion.ts @@ -94,3 +94,23 @@ export function secsToUnit(time: number, unit: Unit) { return time; } } + +/** + * Formats time in seconds to a detailed string showing days, hours, minutes, and seconds + * @param time Time in seconds + * @returns Formatted string like "3d 4h 30m 23s" + */ +export function formatTimeDetailed(time: number): string { + const seconds = Math.floor(time % 60); + const minutes = Math.floor((time / 60) % 60); + const hours = Math.floor((time / (60 * 60)) % 24); + const days = Math.floor(time / (60 * 60 * 24)); + + const parts: string[] = []; + if (days > 0) parts.push(`${days}d`); + if (hours > 0) parts.push(`${hours}h`); + if (minutes > 0) parts.push(`${minutes}m`); + if (seconds > 0 || parts.length === 0) parts.push(`${seconds}s`); + + return parts.join(' '); +} diff --git a/src/routes/(console)/project-[project]/sites/(components)/logs.svelte b/src/routes/(console)/project-[project]/sites/(components)/logs.svelte index ac688d2a6..075f6a4e5 100644 --- a/src/routes/(console)/project-[project]/sites/(components)/logs.svelte +++ b/src/routes/(console)/project-[project]/sites/(components)/logs.svelte @@ -5,7 +5,8 @@ import { timer } from '$lib/actions/timer'; import { Dependencies } from '$lib/constants'; import { Button } from '$lib/elements/forms'; - import { calculateTime } from '$lib/helpers/timeConversion'; + import { capitalize } from '$lib/helpers/string'; + import { calculateTime, formatTimeDetailed } from '$lib/helpers/timeConversion'; import { addNotification } from '$lib/stores/notifications'; import { sdk } from '$lib/stores/sdk'; import type { Models } from '@appwrite.io/console'; @@ -55,35 +56,56 @@ }); } } + + function badgeType(status: string) { + switch (status) { + case 'failed': + return 'error'; + case 'ready': + return 'success'; + case 'building': + return undefined; + case 'processing': + return 'warning'; + default: + return undefined; + } + } - + - - Deployment logs + + + Deployment logs + + type={badgeType(status)} /> + + + {#if ['processing', 'building'].includes(status)} + + +

+ + + + {:else} + + {formatTimeDetailed(deployment.buildTime)} + + {/if} -

- - {#if ['processing', 'building'].includes(status)} - - - {:else} - {calculateTime(deployment.buildTime)} - {/if} - -
-
- - - - - {#if ['processing', 'building'].includes(status)} - - {/if} + {#key buildLogs} + + {/key} + {#if ['processing', 'building'].includes(status)} + + + + {/if}
diff --git a/src/routes/(console)/project-[project]/sites/create-site/aside.svelte b/src/routes/(console)/project-[project]/sites/create-site/aside.svelte index 573054e0e..e05f5d371 100644 --- a/src/routes/(console)/project-[project]/sites/create-site/aside.svelte +++ b/src/routes/(console)/project-[project]/sites/create-site/aside.svelte @@ -1,6 +1,6 @@