barsa a6bc9666e1 Enhance Dashboard and Notification Features
- Introduced MeStatus module to aggregate customer status, integrating dashboard summary, payment methods, internet eligibility, and residence card verification.
- Updated dashboard hooks to utilize MeStatus for improved data fetching and error handling.
- Enhanced notification handling across various modules, including cancellation notifications for internet and SIM services, ensuring timely user alerts.
- Refactored related schemas and services to support new dashboard tasks and notification types, improving overall user engagement and experience.
2025-12-23 17:53:08 +09:00

104 lines
2.4 KiB
TypeScript

/**
* Dashboard Domain Utilities
* Business logic for dashboard activities and task generation
*/
import type { Activity, ActivityFilter, ActivityFilterConfig, ActivityType } from "./contract.js";
/**
* Activity filter configurations
* Defines which activity types belong to each filter category
*/
export const ACTIVITY_FILTERS: ActivityFilterConfig[] = [
{ key: "all", label: "All" },
{
key: "billing",
label: "Billing",
types: ["invoice_created", "invoice_paid"],
},
{
key: "orders",
label: "Orders",
types: ["service_activated"],
},
{
key: "support",
label: "Support",
types: ["case_created", "case_closed"],
},
];
/**
* Filter activities by type category
*/
export function filterActivities(activities: Activity[], filter: ActivityFilter): Activity[] {
if (filter === "all") {
return activities;
}
const filterConfig = ACTIVITY_FILTERS.find(f => f.key === filter);
if (!filterConfig?.types) {
return activities;
}
return activities.filter(activity => filterConfig.types!.includes(activity.type));
}
/**
* Activity types that support navigation to detail views
*/
const CLICKABLE_ACTIVITY_TYPES: ActivityType[] = ["invoice_created", "invoice_paid"];
/**
* Check if an activity is clickable (has a navigable detail view)
*/
export function isActivityClickable(activity: Activity): boolean {
return CLICKABLE_ACTIVITY_TYPES.includes(activity.type) && !!activity.relatedId;
}
/**
* Quick action task definition for dashboard
*/
export interface QuickActionTask {
label: string;
href: string;
}
/**
* Dashboard summary input for task generation
*/
export interface DashboardTaskSummary {
nextInvoice?: { id: number } | null;
stats?: { unpaidInvoices?: number; openCases?: number };
}
/**
* Generate dashboard quick action suggestions based on summary data
*/
export function generateQuickActions(summary: DashboardTaskSummary): QuickActionTask[] {
const tasks: QuickActionTask[] = [];
if (summary.nextInvoice) {
tasks.push({
label: "Pay upcoming invoice",
href: "#attention",
});
}
if (summary.stats?.unpaidInvoices && summary.stats.unpaidInvoices > 0) {
tasks.push({
label: "Review unpaid invoices",
href: "/billing/invoices",
});
}
if (summary.stats?.openCases && summary.stats.openCases > 0) {
tasks.push({
label: "Check support cases",
href: "/support/cases",
});
}
return tasks;
}