Spaces:
Sleeping
Sleeping
| import type { Campaign, Lead } from "@/lib/domain" | |
| import { formatShort } from "@/lib/time" | |
| function escapeCell(v: string) { | |
| if (v.includes('"') || v.includes(",") || v.includes("\n")) { | |
| return `"${v.replace(/"/g, '""')}"` | |
| } | |
| return v | |
| } | |
| export function leadsToCsv(args: { campaign: Campaign; leads: Lead[] }) { | |
| const fieldOrder = args.campaign.formSchema.map((f) => f.id) | |
| const header = [ | |
| "createdAt", | |
| "state", | |
| "utm_source", | |
| "utm_medium", | |
| "utm_campaign", | |
| "couponCode", | |
| "redeemedAt", | |
| ...fieldOrder.map((id) => `field_${id}`), | |
| ] | |
| const rows = args.leads.map((l) => [ | |
| formatShort(l.createdAt), | |
| l.state, | |
| l.source.utm_source ?? "", | |
| l.source.utm_medium ?? "", | |
| l.source.utm_campaign ?? "", | |
| l.couponCode ?? "", | |
| l.redeemedAt ? formatShort(l.redeemedAt) : "", | |
| ...fieldOrder.map((id) => l.fields[id] ?? ""), | |
| ]) | |
| const lines = [header, ...rows].map((r) => r.map((c) => escapeCell(`${c ?? ""}`)).join(",")) | |
| return lines.join("\n") | |
| } | |
| export function downloadTextFile(args: { filename: string; text: string; mime: string }) { | |
| const blob = new Blob([args.text], { type: args.mime }) | |
| const url = URL.createObjectURL(blob) | |
| const a = document.createElement("a") | |
| a.href = url | |
| a.download = args.filename | |
| document.body.appendChild(a) | |
| a.click() | |
| a.remove() | |
| URL.revokeObjectURL(url) | |
| } | |