3v324v23's picture
init: growth-activities for hf spaces
243dc36
Raw
History Blame Contribute Delete
1.37 kB
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)
}