feat: support affonso affiliate

This commit is contained in:
javayhu 2025-05-30 14:05:45 +08:00
parent 1a4917c874
commit 8dd3e12824
8 changed files with 74 additions and 3 deletions

View File

@ -129,3 +129,9 @@ NEXT_PUBLIC_DATAFAST_ANALYTICS_DOMAIN=""
# -----------------------------------------------------------------------------
NEXT_PUBLIC_DISCORD_WIDGET_SERVER_ID=""
NEXT_PUBLIC_DISCORD_WIDGET_CHANNEL_ID=""
# -----------------------------------------------------------------------------
# Affiliate (Affonso)
# https://mksaas.com/docs/affiliate
# -----------------------------------------------------------------------------
NEXT_PUBLIC_AFFILIATE_AFFONSO_ID=""

View File

@ -12,7 +12,6 @@ import StatsSection from '@/components/blocks/stats/stats';
import TestimonialsSection from '@/components/blocks/testimonials/testimonials';
import { NewsletterCard } from '@/components/newsletter/newsletter-card';
import DiscordWidget from '@/components/shared/discord-widget';
import { websiteConfig } from '@/config/website';
import { constructMetadata } from '@/lib/metadata';
import { getUrlWithLocale } from '@/lib/urls/urls';
import type { Metadata } from 'next';

View File

@ -0,0 +1,33 @@
'use client';
import { websiteConfig } from '@/config/website';
import Script from 'next/script';
/**
* Affonso Affiliate
*
* https://affonso.com
*/
export function AffonsoAffiliate() {
if (process.env.NODE_ENV !== 'production') {
return null;
}
if (!websiteConfig.features.enableAffonsoAffiliate) {
return null;
}
const affiliateId = process.env.NEXT_PUBLIC_AFFILIATE_AFFONSO_ID as string;
if (!affiliateId) {
return null;
}
return (
<Script
src="https://affonso.io/js/pixel.min.js"
strategy="afterInteractive"
data-affonso={affiliateId}
data-cookie_duration="30"
/>
);
}

View File

@ -13,6 +13,7 @@ import {
FormMessage,
} from '@/components/ui/form';
import { Input } from '@/components/ui/input';
import { websiteConfig } from '@/config/website';
import { authClient } from '@/lib/auth-client';
import { getUrlWithLocaleInCallbackUrl } from '@/lib/urls/urls';
import { DEFAULT_LOGIN_REDIRECT, Routes } from '@/routes';
@ -97,6 +98,13 @@ export const RegisterForm = ({
// sign up success, user information stored in ctx.data
// console.log("register, success:", ctx.data);
setSuccess(t('checkEmail'));
// add affonso affiliate
// https://affonso.io/app/affiliate-program/connect
if (websiteConfig.features.enableAffonsoAffiliate) {
console.log('register, affonso affiliate:', values.email);
window.Affonso.signup(values.email);
}
},
onError: (ctx) => {
// sign up fail, display the error message

View File

@ -13,7 +13,6 @@ import {
useSidebar,
} from '@/components/ui/sidebar';
import { getSidebarLinks } from '@/config/sidebar-config';
import { websiteConfig } from '@/config/website';
import { LocaleLink } from '@/i18n/navigation';
import { authClient } from '@/lib/auth-client';
import { Routes } from '@/routes';

View File

@ -2,6 +2,7 @@
import { createCheckoutAction } from '@/actions/create-checkout-session';
import { Button } from '@/components/ui/button';
import { websiteConfig } from '@/config/website';
import { Loader2Icon } from 'lucide-react';
import { useTranslations } from 'next-intl';
import { useState } from 'react';
@ -50,12 +51,35 @@ export function CheckoutButton({
try {
setIsLoading(true);
const mergedMetadata = metadata ? { ...metadata } : {};
// add affonso_referral to metadata if enabled affonso affiliate
if (websiteConfig.features.enableAffonsoAffiliate) {
const affonsoReferral =
typeof document !== 'undefined'
? (() => {
const match = document.cookie.match(
/(?:^|; )affonso_referral=([^;]*)/
);
return match ? decodeURIComponent(match[1]) : null;
})()
: null;
if (affonsoReferral) {
console.log(
'create checkout button, affonsoReferral:',
affonsoReferral
);
mergedMetadata.affonso_referral = affonsoReferral;
}
}
// Create checkout session using server action
const result = await createCheckoutAction({
userId,
planId,
priceId,
metadata,
metadata:
Object.keys(mergedMetadata).length > 0 ? mergedMetadata : undefined,
});
// Redirect to checkout page

View File

@ -35,6 +35,7 @@ export const websiteConfig: WebsiteConfig = {
features: {
enableDiscordWidget: true,
enableUpgradeCard: true,
enableAffonsoAffiliate: false,
},
routes: {
defaultLoginRedirect: '/dashboard',

View File

@ -67,6 +67,7 @@ export interface SocialConfig {
export interface FeaturesConfig {
enableDiscordWidget?: boolean; // Whether to enable the discord widget
enableUpgradeCard?: boolean; // Whether to enable the upgrade card in the sidebar
enableAffonsoAffiliate?: boolean; // Whether to enable affonso affiliate
}
/**