11<template >
22 <InfiniteLoader :onLoadMore =" fetchMore" :enabled =" !loadingMore && messages.length > 10" />
3- <div v-if =" !opened" class =" m-4 text-center" >
4- <span class =" loading loading-ring loading-md text-primary" ></span >
5- </div >
6- <slot :messages =" messages" ></slot >
3+ <ul role =" status" class =" flex animate-pulse flex-col gap-4 p-4" v-if =" loading || noLogs" >
4+ <div class =" flex flex-row gap-2" v-for =" size in ['w-3/5', 'w-2/3', 'w-9/12', 'w-1/2']" >
5+ <div class =" h-3 w-40 shrink-0 rounded-full bg-base-content/50 opacity-50" ></div >
6+ <div class =" h-3 rounded-full bg-base-content/50 opacity-50" :class =" size" ></div >
7+ </div >
8+ <span class =" sr-only" >Loading...</span >
9+ </ul >
10+ <slot :messages =" messages" v-else ></slot >
11+ <IndeterminateBar :color />
712</template >
813
914<script lang="ts" setup generic =" T " >
@@ -14,10 +19,16 @@ const { entity, streamSource } = $defineProps<{
1419 entity: T ;
1520}>();
1621
17- const { messages, loadOlderLogs, isLoadingMore, opened } = streamSource ($$ (entity ));
22+ const { messages, loadOlderLogs, isLoadingMore, opened, loading, error } = streamSource ($$ (entity ));
1823const { loadingMore } = useLoggingContext ();
24+ const color = computed (() => {
25+ if (error .value ) return " error" ;
26+ if (loading .value ) return " secondary" ;
27+ if (opened .value ) return " primary" ;
28+ return " error" ;
29+ });
1930
20- const enabled = ref ( true );
31+ const noLogs = computed (() => messages . value . length === 0 );
2132
2233defineExpose ({
2334 clear : () => (messages .value = []),
@@ -26,10 +37,8 @@ defineExpose({
2637const fetchMore = async () => {
2738 if (! isLoadingMore .value ) {
2839 loadingMore .value = true ;
29- enabled .value = false ;
3040 await loadOlderLogs ();
3141 loadingMore .value = false ;
32- enabled .value = true ;
3342 }
3443};
3544 </script >
0 commit comments