Each composable now owns its types and exports them. Other composables import types from the owning composable. Deleted centralized crm-types.ts. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
69 lines
2.2 KiB
TypeScript
69 lines
2.2 KiB
TypeScript
import { ref, computed, watch, type ComputedRef } from "vue";
|
|
import { useQuery } from "@vue/apollo-composable";
|
|
import { GetClientTimelineQueryDocument } from "~~/graphql/generated";
|
|
|
|
import type { CommItem } from "~/composables/useContacts";
|
|
import type { CalendarEvent } from "~/composables/useCalendar";
|
|
import type { FeedCard } from "~/composables/useFeed";
|
|
import type { WorkspaceDocument } from "~/composables/useDocuments";
|
|
|
|
export type ClientTimelineItem = {
|
|
id: string;
|
|
contactId: string;
|
|
contentType: "message" | "calendar_event" | "document" | "recommendation" | string;
|
|
contentId: string;
|
|
datetime: string;
|
|
message?: CommItem | null;
|
|
calendarEvent?: CalendarEvent | null;
|
|
recommendation?: FeedCard | null;
|
|
document?: WorkspaceDocument | null;
|
|
};
|
|
|
|
export function useTimeline(opts: { apolloAuthReady: ComputedRef<boolean> }) {
|
|
const timelineContactId = ref("");
|
|
const timelineLimit = ref(500);
|
|
|
|
const { result: timelineResult, refetch: refetchTimeline } = useQuery(
|
|
GetClientTimelineQueryDocument,
|
|
() => ({ contactId: timelineContactId.value, limit: timelineLimit.value }),
|
|
{ enabled: computed(() => !!timelineContactId.value && opts.apolloAuthReady.value) },
|
|
);
|
|
|
|
const clientTimelineItems = ref<ClientTimelineItem[]>([]);
|
|
|
|
watch(() => timelineResult.value?.getClientTimeline, (v) => {
|
|
if (v) clientTimelineItems.value = v as ClientTimelineItem[];
|
|
}, { immediate: true });
|
|
|
|
async function loadClientTimeline(contactId: string, limit = 500) {
|
|
const normalizedContactId = String(contactId ?? "").trim();
|
|
if (!normalizedContactId) {
|
|
clientTimelineItems.value = [];
|
|
timelineContactId.value = "";
|
|
return;
|
|
}
|
|
|
|
timelineContactId.value = normalizedContactId;
|
|
timelineLimit.value = limit;
|
|
await refetchTimeline();
|
|
}
|
|
|
|
async function refreshSelectedClientTimeline(selectedCommThreadId: string) {
|
|
const contactId = String(selectedCommThreadId ?? "").trim();
|
|
if (!contactId) {
|
|
clientTimelineItems.value = [];
|
|
return;
|
|
}
|
|
await loadClientTimeline(contactId);
|
|
}
|
|
|
|
return {
|
|
clientTimelineItems,
|
|
timelineContactId,
|
|
timelineLimit,
|
|
loadClientTimeline,
|
|
refreshSelectedClientTimeline,
|
|
refetchTimeline,
|
|
};
|
|
}
|