File size: 2,252 Bytes
3199d61 064bfd6 3199d61 064bfd6 3199d61 064bfd6 3199d61 064bfd6 3199d61 064bfd6 3199d61 064bfd6 3199d61 064bfd6 3199d61 064bfd6 3199d61 064bfd6 3199d61 064bfd6 3199d61 064bfd6 3199d61 064bfd6 3199d61 064bfd6 3199d61 d8a167e 3199d61 96f34e3 3199d61 064bfd6 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | import * as React from 'react'
import { useState } from 'react'
import { Text } from '../../ink.js'
import { logEvent } from '../../services/analytics/index.js'
import {
checkCachedPassesEligibility,
formatCreditAmount,
getCachedReferrerReward,
getCachedRemainingPasses,
} from '../../services/api/referral.js'
import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js'
function resetIfPassesRefreshed(): void {
const remaining = getCachedRemainingPasses()
if (remaining == null || remaining <= 0) return
const config = getGlobalConfig()
const lastSeen = config.passesLastSeenRemaining ?? 0
if (remaining > lastSeen) {
saveGlobalConfig(prev => ({
...prev,
passesUpsellSeenCount: 0,
hasVisitedPasses: false,
passesLastSeenRemaining: remaining,
}))
}
}
function shouldShowGuestPassesUpsell(): boolean {
const { eligible, hasCache } = checkCachedPassesEligibility()
// Only show if eligible and cache exists (don't block on fetch)
if (!eligible || !hasCache) return false
// Reset upsell counters if passes were refreshed (covers both campaign change and pass refresh)
resetIfPassesRefreshed()
const config = getGlobalConfig()
if ((config.passesUpsellSeenCount ?? 0) >= 3) return false
if (config.hasVisitedPasses) return false
return true
}
export function useShowGuestPassesUpsell(): boolean {
const [show] = useState(() => shouldShowGuestPassesUpsell())
return show
}
export function incrementGuestPassesSeenCount(): void {
let newCount = 0
saveGlobalConfig(prev => {
newCount = (prev.passesUpsellSeenCount ?? 0) + 1
return {
...prev,
passesUpsellSeenCount: newCount,
}
})
logEvent('tengu_guest_passes_upsell_shown', {
seen_count: newCount,
})
}
// Condensed layout for mini welcome screen
export function GuestPassesUpsell(): React.ReactNode {
const reward = getCachedReferrerReward()
return (
<Text dimColor>
<Text color="clawd_body">[✻]</Text> <Text color="clawd_body">[✻]</Text>{' '}
<Text color="clawd_body">[✻]</Text> ·{' '}
{reward
? `Share Codev and earn ${formatCreditAmount(reward)} of extra usage · /passes`
: '3 guest passes at /passes'}
</Text>
)
}
|