From 00caa7ddc4e5c3bd9185d30b71d6adf727d6aad0 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Mon, 29 Dec 2025 02:11:40 +0700 Subject: [PATCH] feat: moving to dub partners --- apps/frontend/src/app/(app)/layout.tsx | 6 ++-- apps/frontend/src/app/(extension)/layout.tsx | 2 +- .../billing/first.billing.component.tsx | 14 +++++--- .../billing/main.billing.component.tsx | 7 ++-- .../src/components/layout/dubAnalytics.tsx | 25 ++++++++++++++ .../src/components/layout/tolt.script.tsx | 17 ---------- .../src/dtos/billing/billing.subscribe.dto.ts | 2 +- .../src/services/stripe.service.ts | 34 +++++++++++-------- .../src/helpers/variable.context.tsx | 4 +-- package.json | 1 + pnpm-lock.yaml | 15 ++++++++ 11 files changed, 80 insertions(+), 47 deletions(-) create mode 100644 apps/frontend/src/components/layout/dubAnalytics.tsx delete mode 100644 apps/frontend/src/components/layout/tolt.script.tsx diff --git a/apps/frontend/src/app/(app)/layout.tsx b/apps/frontend/src/app/(app)/layout.tsx index cb980aeb..4a60fc05 100644 --- a/apps/frontend/src/app/(app)/layout.tsx +++ b/apps/frontend/src/app/(app)/layout.tsx @@ -13,7 +13,7 @@ import { VariableContextComponent } from '@gitroom/react/helpers/variable.contex import { Fragment } from 'react'; import { PHProvider } from '@gitroom/react/helpers/posthog'; import UtmSaver from '@gitroom/helpers/utils/utm.saver'; -import { ToltScript } from '@gitroom/frontend/components/layout/tolt.script'; +import { DubAnalytics } from '@gitroom/frontend/components/layout/dubAnalytics'; import { FacebookComponent } from '@gitroom/frontend/components/layout/facebook.component'; import { headers } from 'next/headers'; import { headerName } from '@gitroom/react/translation/i18n.config'; @@ -61,7 +61,7 @@ export default async function AppLayout({ children }: { children: ReactNode }) { oauthLogoUrl={process.env.NEXT_PUBLIC_POSTIZ_OAUTH_LOGO_URL!} oauthDisplayName={process.env.NEXT_PUBLIC_POSTIZ_OAUTH_DISPLAY_NAME!} uploadDirectory={process.env.NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY!} - tolt={process.env.NEXT_PUBLIC_TOLT!} + dub={!!process.env.STRIPE_PUBLISHABLE_KEY} facebookPixel={process.env.NEXT_PUBLIC_FACEBOOK_PIXEL!} telegramBotName={process.env.TELEGRAM_BOT_NAME!} neynarClientId={process.env.NEYNAR_CLIENT_ID!} @@ -82,7 +82,7 @@ export default async function AppLayout({ children }: { children: ReactNode }) { {/**/} - + import('@gitroom/frontend/components/layout/mode.component'), @@ -45,12 +45,12 @@ const EmbeddedBilling = dynamic( export const FirstBillingComponent = () => { const { stripeClient } = useVariables(); const user = useUser(); + const dub = useDubClickId(); const [stripe, setStripe] = useState>(null); const [tier, setTier] = useState('STANDARD'); const [period, setPeriod] = useState('MONTHLY'); const fetch = useFetch(); const t = useT(); - const tolt = useTolt(); useEffect(() => { setStripe(loadStripe(stripeClient)); @@ -63,7 +63,7 @@ export const FirstBillingComponent = () => { body: JSON.stringify({ billing: tier, period: period, - tolt: tolt(), + ...(dub ? { dub } : {}), }), }) ).json(); @@ -156,7 +156,9 @@ export const FirstBillingComponent = () => {
-
+
+ +
{!isLoading && data && stripe ? ( <> @@ -168,7 +170,9 @@ export const FirstBillingComponent = () => {
-
+
+ +
{t('billing_choose_plan', 'Choose a Plan')} diff --git a/apps/frontend/src/components/billing/main.billing.component.tsx b/apps/frontend/src/components/billing/main.billing.component.tsx index a52b6e63..aae4f120 100644 --- a/apps/frontend/src/components/billing/main.billing.component.tsx +++ b/apps/frontend/src/components/billing/main.billing.component.tsx @@ -18,17 +18,16 @@ import { useUser } from '@gitroom/frontend/components/layout/user.context'; import { useRouter, useSearchParams } from 'next/navigation'; import { useVariables } from '@gitroom/react/helpers/variable.context'; import { useModals } from '@gitroom/frontend/components/layout/new-modal'; -import { TopTitle } from '@gitroom/frontend/components/launches/helpers/top.title.component'; import { Textarea } from '@gitroom/react/form/textarea'; import { useFireEvents } from '@gitroom/helpers/utils/use.fire.events'; import { useUtmUrl } from '@gitroom/helpers/utils/utm.saver'; -import { useTolt } from '@gitroom/frontend/components/layout/tolt.script'; import { useTrack } from '@gitroom/react/helpers/use.track'; import { TrackEnum } from '@gitroom/nestjs-libraries/user/track.enum'; import { PurchaseCrypto } from '@gitroom/frontend/components/billing/purchase.crypto'; import { useT } from '@gitroom/react/translation/get.transation.service.client'; import { FinishTrial } from '@gitroom/frontend/components/billing/finish.trial'; import { newDayjs } from '@gitroom/frontend/components/layout/set.timezone'; +import { useDubClickId } from '@gitroom/frontend/components/layout/dubAnalytics'; export const Prorate: FC<{ period: 'MONTHLY' | 'YEARLY'; @@ -218,10 +217,10 @@ export const MainBillingComponent: FC<{ const fetch = useFetch(); const toast = useToaster(); const user = useUser(); + const dub = useDubClickId(); const modal = useModals(); const router = useRouter(); const utm = useUtmUrl(); - const tolt = useTolt(); const track = useTrack(); const t = useT(); const queryParams = useSearchParams(); @@ -387,7 +386,7 @@ export const MainBillingComponent: FC<{ period: monthlyOrYearly === 'on' ? 'YEARLY' : 'MONTHLY', utm, billing, - tolt: tolt(), + ...(dub ? { dub } : {}), }), }) ).json(); diff --git a/apps/frontend/src/components/layout/dubAnalytics.tsx b/apps/frontend/src/components/layout/dubAnalytics.tsx new file mode 100644 index 00000000..fdd6a2d1 --- /dev/null +++ b/apps/frontend/src/components/layout/dubAnalytics.tsx @@ -0,0 +1,25 @@ +'use client'; + +import { useVariables } from '@gitroom/react/helpers/variable.context'; +import { Analytics as DubAnalyticsIn } from '@dub/analytics/react'; +import { getCookie } from 'react-use-cookie'; + +export const DubAnalytics = () => { + const { dub } = useVariables(); + if (!dub) return null; + return ( + + ); +}; + +export const useDubClickId = () => { + const { dub } = useVariables(); + if (!dub) return undefined; + + const dubCookie = getCookie('dub_partner_data', '{}'); + return JSON.parse(dubCookie)?.clickId || undefined; +}; diff --git a/apps/frontend/src/components/layout/tolt.script.tsx b/apps/frontend/src/components/layout/tolt.script.tsx deleted file mode 100644 index 4f647927..00000000 --- a/apps/frontend/src/components/layout/tolt.script.tsx +++ /dev/null @@ -1,17 +0,0 @@ -'use client'; - -import { useVariables } from '@gitroom/react/helpers/variable.context'; -import Script from 'next/script'; -export const useTolt = () => { - return () => { - // @ts-ignore - return window?.tolt_referral || ''; - }; -}; -export const ToltScript = () => { - const { tolt } = useVariables(); - if (!tolt) return null; - return ( -