|
<script lang="ts"> |
|
import CodeExecutionModal from './CodeExecutionModal.svelte'; |
|
import Spinner from '$lib/components/common/Spinner.svelte'; |
|
import Check from '$lib/components/icons/Check.svelte'; |
|
import XMark from '$lib/components/icons/XMark.svelte'; |
|
import EllipsisHorizontal from '$lib/components/icons/EllipsisHorizontal.svelte'; |
|
|
|
export let codeExecutions = []; |
|
|
|
let selectedCodeExecution = null; |
|
let showCodeExecutionModal = false; |
|
|
|
$: if (codeExecutions) { |
|
updateSelectedCodeExecution(); |
|
} |
|
|
|
const updateSelectedCodeExecution = () => { |
|
if (selectedCodeExecution) { |
|
selectedCodeExecution = codeExecutions.find( |
|
(execution) => execution.id === selectedCodeExecution.id |
|
); |
|
} |
|
}; |
|
</script> |
|
|
|
<CodeExecutionModal bind:show={showCodeExecutionModal} codeExecution={selectedCodeExecution} /> |
|
|
|
{#if codeExecutions.length > 0} |
|
<div class="mt-1 mb-2 w-full flex gap-1 items-center flex-wrap"> |
|
{#each codeExecutions as execution (execution.id)} |
|
<div class="flex gap-1 text-xs font-semibold"> |
|
<button |
|
class="flex dark:text-gray-300 py-1 px-1 bg-gray-50 hover:bg-gray-100 dark:bg-gray-850 dark:hover:bg-gray-800 transition rounded-xl max-w-96" |
|
on:click={() => { |
|
selectedCodeExecution = execution; |
|
showCodeExecutionModal = true; |
|
}} |
|
> |
|
<div |
|
class="bg-white dark:bg-gray-700 rounded-full size-4 flex items-center justify-center" |
|
> |
|
{#if execution?.result} |
|
{#if execution.result?.error} |
|
<XMark /> |
|
{:else if execution.result?.output} |
|
<Check strokeWidth="3" className="size-3" /> |
|
{:else} |
|
<EllipsisHorizontal /> |
|
{/if} |
|
{:else} |
|
<Spinner className="size-4" /> |
|
{/if} |
|
</div> |
|
<div |
|
class="flex-1 mx-2 line-clamp-1 code-execution-name {execution?.result ? '' : 'pulse'}" |
|
> |
|
{execution.name} |
|
</div> |
|
</button> |
|
</div> |
|
{/each} |
|
</div> |
|
{/if} |
|
|
|
<style> |
|
@keyframes pulse { |
|
0%, |
|
100% { |
|
opacity: 1; |
|
} |
|
50% { |
|
opacity: 0.6; |
|
} |
|
} |
|
|
|
.pulse { |
|
opacity: 1; |
|
animation: pulse 1.5s ease; |
|
} |
|
</style> |
|
|