44 lines
1.7 KiB
TypeScript
44 lines
1.7 KiB
TypeScript
import type { UserFeedbackEntry } from "@/types/ops";
|
|
|
|
export const FEEDBACK_STATUS_POLL_MS = 30 * 60 * 1000;
|
|
export const FEEDBACK_STATUS_CACHE_TTL_MS = 10 * 60 * 1000;
|
|
|
|
export function feedbackStatusLabel(status: string | undefined, isEn: boolean) {
|
|
const key = String(status || "open").toLowerCase();
|
|
if (key === "triaged") return isEn ? "Confirmed" : "已确认";
|
|
if (key === "investigating") return isEn ? "In progress" : "处理中";
|
|
if (key === "resolved") return isEn ? "Resolved" : "已解决";
|
|
if (key === "closed") return isEn ? "Closed" : "已关闭";
|
|
return isEn ? "Received" : "已收到";
|
|
}
|
|
|
|
export function feedbackStatusTone(status: string | undefined) {
|
|
const key = String(status || "open").toLowerCase();
|
|
if (key === "triaged") return "border-amber-200 bg-amber-50 text-amber-700";
|
|
if (key === "investigating") return "border-blue-200 bg-blue-50 text-blue-700";
|
|
if (key === "resolved") return "border-emerald-200 bg-emerald-50 text-emerald-700";
|
|
if (key === "closed") return "border-slate-200 bg-slate-50 text-slate-500";
|
|
return "border-red-200 bg-red-50 text-red-700";
|
|
}
|
|
|
|
export function buildFeedbackNotificationKey(
|
|
entry: Pick<UserFeedbackEntry, "id" | "status" | "updated_at" | "created_at">,
|
|
) {
|
|
return [
|
|
Number(entry.id || 0),
|
|
String(entry.status || "open").toLowerCase(),
|
|
String(entry.updated_at || entry.created_at || ""),
|
|
].join(":");
|
|
}
|
|
|
|
export function countUnseenFeedbackUpdates(
|
|
entries: Array<
|
|
Pick<UserFeedbackEntry, "id" | "status" | "updated_at" | "created_at">
|
|
>,
|
|
seenKeys: Set<string>,
|
|
) {
|
|
return entries.reduce((count, entry) => {
|
|
return count + (seenKeys.has(buildFeedbackNotificationKey(entry)) ? 0 : 1);
|
|
}, 0);
|
|
}
|