Files
AI-Bill/apps/frontend/src/composables/useNotifications.ts

44 lines
1.3 KiB
TypeScript
Raw Normal View History

2025-11-01 09:24:26 +08:00
import { useQuery } from '@tanstack/vue-query';
import { apiClient } from '../lib/api/client';
export interface NotificationStatus {
secretConfigured: boolean;
secretHint: string | null;
webhookSecret: string | null;
packageWhitelist: string[];
ingestedCount: number;
lastNotificationAt: string | null;
ingestEndpoint: string;
}
2025-11-12 09:34:43 +08:00
// Derive a sensible default ingest endpoint from current API base URL
const apiBaseUrl = (apiClient.defaults.baseURL as string | undefined) ?? 'http://localhost:4000/api';
const defaultIngestEndpoint = (apiBaseUrl.endsWith('/') ? apiBaseUrl.slice(0, -1) : apiBaseUrl) + '/transactions/notification';
2025-11-01 09:24:26 +08:00
const initialStatus: NotificationStatus = {
secretConfigured: false,
secretHint: null,
webhookSecret: null,
packageWhitelist: [],
ingestedCount: 0,
lastNotificationAt: null,
2025-11-12 09:34:43 +08:00
ingestEndpoint: defaultIngestEndpoint
2025-11-01 09:24:26 +08:00
};
export function useNotificationStatusQuery() {
return useQuery<NotificationStatus>({
queryKey: ['notification-status'],
queryFn: async () => {
try {
const { data } = await apiClient.get('/notifications/status');
return data as NotificationStatus;
} catch (error) {
console.warn('[notifications] using fallback status', error);
return initialStatus;
}
},
initialData: initialStatus,
staleTime: 30_000
});
}