download allowed if purchase

This commit is contained in:
2026-02-25 12:06:08 +01:00
parent 6d50d18d56
commit 73651a8716
4 changed files with 31 additions and 4 deletions
+22
View File
@@ -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
}
+5
View File
@@ -450,6 +450,10 @@ export default ({ children }) => {
return hasPremiumLevel
}, [currentUserDoc])
const hasPurchased = useMemo(() => {
return currentUserDoc?.hasPurchased === true
}, [currentUserDoc])
return (
<UserDataContext.Provider
value={{
@@ -489,6 +493,7 @@ export default ({ children }) => {
videos,
hasActiveSubscription,
hasPurchased,
}}
>
{children}
+2 -2
View File
@@ -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€'
+2 -2
View File
@@ -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€'