import React, { useState } from "react"; import useAuthStore from "../../../store/authStore"; import { showToast } from "../../toast/toastUtils"; import { useTranslation } from "react-i18next"; import { log } from "../../../utils/logger"; import { createReferralLinkApi } from "../api/referralApi"; function GenerateReferralForm({ onReferralGenerated }) { const [expiresInDays, setExpiresInDays] = useState(3); // can become number | 'unlimited' const [maxUses, setMaxUses] = useState(10); // can become number | 'unlimited' const [loading, setLoading] = useState(false); const { accessToken } = useAuthStore(); const { t, i18n } = useTranslation('referral'); // get i18n for existence check const UNLIMITED_SENTINEL = 0; // backend sentinel for unlimited uses // Helper: only call t if key exists to avoid missingKey log noise for newly added keys const tr = (key, fallback) => (i18n?.exists(`referral:${key}`) ? t(key) : fallback); const handleGenerateReferral = async () => { setLoading(true); log("[GenerateReferralForm] Generating referral link...", { expiresInDays, maxUses }); try { // For unlimited send maxUses: 0 (sentinel) instead of omitting (backend expects a value) const body = maxUses === 'unlimited' || expiresInDays === 'unlimited' ? { expiresInDays: expiresInDays === 'unlimited' ? 0 : expiresInDays, // 0 sentinel = no expiration maxUses: maxUses === 'unlimited' ? UNLIMITED_SENTINEL : maxUses, } : { expiresInDays, maxUses }; log("[GenerateReferralForm] Payload to /api/referral/create:", body); const data = await createReferralLinkApi(body); log("[GenerateReferralForm] Referral link response:", data); if (data && data.link) { showToast({ type: "success", message: t('toast.generateSuccess') }); } else { showToast({ type: "error", message: t('toast.generateNoLink') }); } await onReferralGenerated(); } catch (error) { log("[GenerateReferralForm] Error generating referral link:", error); // createReferralLinkApi will have shown server message toast for known cases, // show a generic error only if no user-friendly message was already shown if (!error?.handled) { showToast({ type: "error", message: t('toast.generateError') }); } } setLoading(false); }; return (

{t('form.generateHeading')}

{t('form.generateSubtitle')}

{/* Link Expiration */}
{/* Maximum Uses */}
{/* Generate Button */}
{/* No error or generated link display here */}
); } export default GenerateReferralForm;