diff --git a/frontend/app/components/workspace/CrmWorkspaceApp.vue b/frontend/app/components/workspace/CrmWorkspaceApp.vue
index 13b037b..2835334 100644
--- a/frontend/app/components/workspace/CrmWorkspaceApp.vue
+++ b/frontend/app/components/workspace/CrmWorkspaceApp.vue
@@ -259,6 +259,7 @@ const {
// ---------------------------------------------------------------------------
const {
clientTimelineItems,
+ timelineLoading,
timelineContactId,
timelineLimit,
loadClientTimeline,
@@ -1624,6 +1625,12 @@ onBeforeUnmount(() => {
+
}) {
);
const clientTimelineItems = ref([]);
+ const timelineLoading = ref(false);
watch(() => timelineResult.value?.getClientTimeline, (v) => {
- if (v) clientTimelineItems.value = v as ClientTimelineItem[];
+ if (v) {
+ clientTimelineItems.value = v as ClientTimelineItem[];
+ timelineLoading.value = false;
+ }
}, { immediate: true });
async function loadClientTimeline(contactId: string, limit = 500) {
@@ -40,18 +44,28 @@ export function useTimeline(opts: { apolloAuthReady: ComputedRef }) {
if (!normalizedContactId) {
clientTimelineItems.value = [];
timelineContactId.value = "";
+ timelineLoading.value = false;
return;
}
+ // Clear old data immediately and show loader
+ clientTimelineItems.value = [];
+ timelineLoading.value = true;
+
timelineContactId.value = normalizedContactId;
timelineLimit.value = limit;
- await refetchTimeline();
+ try {
+ await refetchTimeline();
+ } finally {
+ timelineLoading.value = false;
+ }
}
async function refreshSelectedClientTimeline(selectedCommThreadId: string) {
const contactId = String(selectedCommThreadId ?? "").trim();
if (!contactId) {
clientTimelineItems.value = [];
+ timelineLoading.value = false;
return;
}
await loadClientTimeline(contactId);
@@ -59,6 +73,7 @@ export function useTimeline(opts: { apolloAuthReady: ComputedRef }) {
return {
clientTimelineItems,
+ timelineLoading,
timelineContactId,
timelineLimit,
loadClientTimeline,