diff --git a/functions/src/subscription/webhooks.js b/functions/src/subscription/webhooks.js index 588a39d..53f2b71 100644 --- a/functions/src/subscription/webhooks.js +++ b/functions/src/subscription/webhooks.js @@ -21,6 +21,20 @@ const { } = require('./shared') const { PREMIUM_SUBSCRIPTION_STATUSES } = require('./constants') +const isPaidCheckoutSession = (session) => { + if (!session || typeof session !== 'object') { + return false + } + + if (typeof session.payment_status !== 'string') { + return false + } + + const normalizedStatus = session.payment_status.trim().toLowerCase() + + return normalizedStatus === 'paid' || normalizedStatus === 'no_payment_required' +} + const handleCheckoutSessionCompleted = async (session, event, { stripe } = {}) => { if (!session || typeof session !== 'object') { return @@ -62,6 +76,10 @@ const handleCheckoutSessionCompleted = async (session, event, { stripe } = {}) = lastStripeWebhookEvent: lastEvent, } + if (isPaidCheckoutSession(session)) { + userUpdate.hasPurchased = true + } + if (session.customer) { userUpdate.stripeCustomerId = session.customer } @@ -462,6 +480,10 @@ const handleCustomerSubscriptionEvent = async (subscription, event, { stripe } = subscriptionNextGrantAt, } + if (isPremium) { + userUpdate.hasPurchased = true + } + if (!isPremium) { userUpdate.subscriptionNextGrantAt = null } diff --git a/src/providers/UserDataProvider.js b/src/providers/UserDataProvider.js index e247bea..3c2c6cf 100644 --- a/src/providers/UserDataProvider.js +++ b/src/providers/UserDataProvider.js @@ -450,6 +450,10 @@ export default ({ children }) => { return hasPremiumLevel }, [currentUserDoc]) + const hasPurchased = useMemo(() => { + return currentUserDoc?.hasPurchased === true + }, [currentUserDoc]) + return ( { videos, hasActiveSubscription, + hasPurchased, }} > {children} diff --git a/src/screens/Production/PlaybackDownload.js b/src/screens/Production/PlaybackDownload.js index fdc0913..5bc03dd 100644 --- a/src/screens/Production/PlaybackDownload.js +++ b/src/screens/Production/PlaybackDownload.js @@ -137,7 +137,7 @@ const uploadSourceRecording = async ({ uri, uid, projectId }) => { const PlaybackDownload = ({ route }) => { const { currentUID, selectedProject } = useUserData() - const { hasActiveSubscription, videos } = useUser() || {} + const { hasActiveSubscription, hasPurchased, videos } = useUser() || {} const { createPlaybackDownloadCheckout } = useStripe() const { action: routeAction, uri, project: routeProject } = route.params || {} const action = routeAction || 'playback' @@ -168,7 +168,7 @@ const PlaybackDownload = ({ route }) => { const playbackDownloadStatus = projectForDownload?.playbackDownloadPurchase?.status || null const hasPaidPlaybackDownload = playbackDownloadStatus === 'paid' - const canDownloadPlayback = hasActiveSubscription || hasPaidPlaybackDownload + const canDownloadPlayback = hasActiveSubscription || hasPaidPlaybackDownload || hasPurchased const downloadLabel = canDownloadPlayback ? 'Télécharger le playback' : 'Acheter le playback pour 1,99€' diff --git a/src/screens/cover/SongDownload.js b/src/screens/cover/SongDownload.js index 5c5793b..98a99d5 100644 --- a/src/screens/cover/SongDownload.js +++ b/src/screens/cover/SongDownload.js @@ -43,7 +43,7 @@ const SongDownload = ({ route }) => { skipAdventureGate = false, promptPurchaseConfirm = false, } = route?.params || {} - const { selectedProject, updateProjectData, hasActiveSubscription } = useUser() + const { selectedProject, updateProjectData, hasActiveSubscription, hasPurchased } = useUser() const { createSongDownloadCheckout } = useStripe() const { setTooltip } = useMinuit() const { setLoading } = useGlobalLoading() @@ -104,7 +104,7 @@ const SongDownload = ({ route }) => { const projectId = projectForStage?.id || null const downloadPurchaseStatus = projectForStage?.downloadPurchase?.status || null const hasPaidDownload = downloadPurchaseStatus === 'paid' - const canDownloadDirectly = hasActiveSubscription || hasPaidDownload + const canDownloadDirectly = hasActiveSubscription || hasPaidDownload || hasPurchased const downloadLabel = canDownloadDirectly ? 'Télécharger mon morceau' : 'Acheter ce morceau pour 1,99€'