feat(payment): add chat support discounts and gratitude
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
import type { CommercialOfferSummary } from "@/data/schemas/payment";
|
||||
|
||||
export type ChatSupportCtaKind =
|
||||
| "support"
|
||||
| "firstRecharge"
|
||||
| "commercialOffer";
|
||||
|
||||
export interface ChatSupportCtaView {
|
||||
kind: ChatSupportCtaKind;
|
||||
label: string;
|
||||
commercialOfferId: string | null;
|
||||
planId: string | null;
|
||||
expiresAt: string | null;
|
||||
}
|
||||
|
||||
export function deriveChatSupportCta(input: {
|
||||
isFirstRecharge: boolean;
|
||||
commercialOffer: CommercialOfferSummary | null;
|
||||
nowMs: number;
|
||||
}): ChatSupportCtaView {
|
||||
if (input.isFirstRecharge) {
|
||||
return {
|
||||
kind: "firstRecharge",
|
||||
label: "Support me · 50% OFF · First recharge",
|
||||
commercialOfferId: null,
|
||||
planId: null,
|
||||
expiresAt: null,
|
||||
};
|
||||
}
|
||||
|
||||
const offer = input.commercialOffer;
|
||||
const expiresAtMs = offer ? Date.parse(offer.expiresAt) : Number.NaN;
|
||||
if (offer?.enabled && Number.isFinite(expiresAtMs) && expiresAtMs > input.nowMs) {
|
||||
return {
|
||||
kind: "commercialOffer",
|
||||
label: `Support me · ${offer.discountPercent}% OFF · ${formatOfferCountdown(expiresAtMs, input.nowMs)}`,
|
||||
commercialOfferId: offer.commercialOfferId,
|
||||
planId: offer.planId,
|
||||
expiresAt: offer.expiresAt,
|
||||
};
|
||||
}
|
||||
|
||||
return {
|
||||
kind: "support",
|
||||
label: "Support me",
|
||||
commercialOfferId: null,
|
||||
planId: null,
|
||||
expiresAt: null,
|
||||
};
|
||||
}
|
||||
|
||||
export function formatOfferCountdown(expiresAtMs: number, nowMs: number): string {
|
||||
const totalSeconds = Math.max(
|
||||
0,
|
||||
Math.ceil((expiresAtMs - nowMs) / 1000) - 1,
|
||||
);
|
||||
const hours = Math.floor(totalSeconds / 3600);
|
||||
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
||||
const seconds = totalSeconds % 60;
|
||||
return [hours, minutes, seconds]
|
||||
.map((value) => String(value).padStart(2, "0"))
|
||||
.join(":");
|
||||
}
|
||||
Reference in New Issue
Block a user