fix: finish page

This commit is contained in:
Arman
2025-02-12 17:15:29 +01:00
parent 9ca33d9ba7
commit 4e040b4f1a
6 changed files with 86 additions and 32 deletions
+7 -1
View File
@@ -22,7 +22,13 @@ export const timer: Action<HTMLElement, Props> = (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);
}
+20
View File
@@ -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(' ');
}
@@ -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;
}
}
</script>
<Layout.Stack>
<Layout.Stack gap="xl">
<Layout.Stack direction="row" justifyContent="space-between">
<Layout.Stack direction="row" alignItems="center">
<Typography.Text variant="m-500">Deployment logs</Typography.Text>
<Layout.Stack direction="row" alignItems="center" gap="s" inline>
<Typography.Text variant="m-500" color="--color-fgcolor-neutral-primary">
Deployment logs
</Typography.Text>
<Badge
content={status}
content={capitalize(status)}
size="xs"
variant="secondary"
type={status === 'failed' ? 'error' : undefined} />
type={badgeType(status)} />
</Layout.Stack>
<Layout.Stack direction="row" alignItems="center" inline>
{#if ['processing', 'building'].includes(status)}
<Typography.Code color="--color-fgcolor-neutral-secondary">
<Layout.Stack direction="row" alignItems="center" inline>
<p use:timer={{ start: deployment.$createdAt }} />
<Spinner />
</Layout.Stack>
</Typography.Code>
{:else}
<Typography.Code color="--color-fgcolor-neutral-secondary">
{formatTimeDetailed(deployment.buildTime)}
</Typography.Code>
{/if}
</Layout.Stack>
<div>
<Layout.Stack direction="row" alignItems="center">
{#if ['processing', 'building'].includes(status)}
<span use:timer={{ start: deployment.$createdAt }} />
<Spinner />
{:else}
{calculateTime(deployment.buildTime)}
{/if}
</Layout.Stack>
</div>
</Layout.Stack>
<Logs logs={buildLogs} />
<Layout.Stack alignItems="flex-end">
{#if ['processing', 'building'].includes(status)}
<Button size="xs" text on:click={cancelDeployment}>Cancel deployment</Button>
{/if}
</Layout.Stack>
{#key buildLogs}
<Logs logs={buildLogs} />
{/key}
{#if ['processing', 'building'].includes(status)}
<Layout.Stack alignItems="flex-end">
<Button size="s" text on:click={cancelDeployment}>Cancel deployment</Button>
</Layout.Stack>
{/if}
</Layout.Stack>
@@ -1,6 +1,6 @@
<script lang="ts">
import { Card, SvgIcon, Trim } from '$lib/components';
import { Icon, Layout, Tooltip, Typography } from '@appwrite.io/pink-svelte';
import { Icon, Layout, Typography } from '@appwrite.io/pink-svelte';
import { IconGithub, IconGitBranch } from '@appwrite.io/pink-icons-svelte';
import { consoleVariables } from '$routes/(console)/store';
import type { Models } from '@appwrite.io/console';
@@ -11,7 +11,7 @@
export let data;
$: console.log(data.site);
$: console.log(data);
</script>
<Wizard
@@ -40,16 +40,18 @@
<!-- TODO: fix use repository name instead of id-->
<Aside
framework={data.frameworks.frameworks.find((f) => f.name === data.site.framework)}
repositoryName={data.site.providerRepositoryId}
repositoryName={data.repository.name}
branch={data.site.providerBranch}
rootDir={data.site.providerRootDirectory}
domain={data.deployment.domain} />
</svelte:fragment>
<svelte:fragment slot="footer">
<Layout.Stack direction="row" alignItems="center" justifyContent="flex-end">
<Typography.Text variant="m-400" color="--color-fgColor-neutral-tertiary">
Deployment will continue in the background
</Typography.Text>
{#if ['processing', 'building', 'failed'].includes(data.deployment.status)}
<Typography.Text variant="m-400" color="--color-fgColor-neutral-tertiary">
Deployment will continue in the background
</Typography.Text>
{/if}
<Button
size="s"
fullWidthMobile
@@ -14,6 +14,10 @@ export const load: PageLoad = async ({ url }) => {
return {
site,
deployment
deployment,
repository: await sdk.forProject.vcs.getRepository(
site.installationId,
site.providerRepositoryId
)
};
};