feat: propose coins

This commit is contained in:
leon
2026-09-08 15:36:03 +02:00
parent 6594d2adf7
commit 071f7e9279
3 changed files with 31 additions and 14 deletions
+9 -7
View File
@@ -16,7 +16,7 @@ import { useUser } from '../../providers/UserDataProvider'
import { gutters, Palette } from '../../styles' import { gutters, Palette } from '../../styles'
import { FONT_FAMILY } from '../../styles/Fonts' import { FONT_FAMILY } from '../../styles/Fonts'
import { normalizeStructureType } from '../../utils/songStructure' import { normalizeStructureType } from '../../utils/songStructure'
import { openCoinPackModal } from '../../utils/coinPackModal' import { showInsufficientCreditsAlert } from '../../utils/insufficientCredits'
import ChooseGenre from './ChooseGenre' import ChooseGenre from './ChooseGenre'
import ChooseInstruments from './ChooseInstruments' import ChooseInstruments from './ChooseInstruments'
import ChooseRhythm from './ChooseRhythm' import ChooseRhythm from './ChooseRhythm'
@@ -179,9 +179,11 @@ const ComposeSong = () => {
typeof error?.message === 'string' typeof error?.message === 'string'
? error.message.replace(/^functions\.https\.HttpsError:\s*/iu, '') ? error.message.replace(/^functions\.https\.HttpsError:\s*/iu, '')
: null : null
throw new Error( const orderError = new Error(
message || 'Une erreur est survenue lors de la création de la commande de crédits.' message || 'Une erreur est survenue lors de la création de la commande de crédits.'
) )
orderError.code = error?.code
throw orderError
} }
} }
@@ -192,11 +194,7 @@ const ComposeSong = () => {
const availableCoins = Number.isFinite(coinBalance) ? coinBalance : 0 const availableCoins = Number.isFinite(coinBalance) ? coinBalance : 0
if (availableCoins < MUSIC_GENERATION_COIN_COST) { if (availableCoins < MUSIC_GENERATION_COIN_COST) {
setIsConfirmVisible(false) setIsConfirmVisible(false)
AppAlert( showInsufficientCreditsAlert(MUSIC_GENERATION_COIN_COST)
'Crédits insuffisants',
"Tu n'as pas assez de pièces pour générer une musique. Recharge ton compte pour continuer."
)
openCoinPackModal()
return return
} }
@@ -206,6 +204,10 @@ const ComposeSong = () => {
navigate(Routes.GeneratingSong, { config: musicConfig }) navigate(Routes.GeneratingSong, { config: musicConfig })
} catch (error) { } catch (error) {
setIsConfirmVisible(false) setIsConfirmVisible(false)
if (error?.code === 'functions/failed-precondition') {
showInsufficientCreditsAlert(MUSIC_GENERATION_COIN_COST)
return
}
const message = const message =
error?.message || 'Une erreur est survenue lors du lancement de la génération.' error?.message || 'Une erreur est survenue lors du lancement de la génération.'
AppAlert('Impossible de lancer la génération', message) AppAlert('Impossible de lancer la génération', message)
+9 -7
View File
@@ -16,7 +16,7 @@ import { useUser } from '../../providers/UserDataProvider'
import { gutters, Palette } from '../../styles' import { gutters, Palette } from '../../styles'
import { FONT_FAMILY } from '../../styles/Fonts' import { FONT_FAMILY } from '../../styles/Fonts'
import { normalizeStructureType } from '../../utils/songStructure' import { normalizeStructureType } from '../../utils/songStructure'
import { openCoinPackModal } from '../../utils/coinPackModal' import { showInsufficientCreditsAlert } from '../../utils/insufficientCredits'
import ChooseGenre from './ChooseGenre' import ChooseGenre from './ChooseGenre'
import ChooseInstruments from './ChooseInstruments' import ChooseInstruments from './ChooseInstruments'
import ChooseRhythm from './ChooseRhythm' import ChooseRhythm from './ChooseRhythm'
@@ -238,9 +238,11 @@ const ComposeSong = () => {
typeof error?.message === 'string' typeof error?.message === 'string'
? error.message.replace(/^functions\.https\.HttpsError:\s*/iu, '') ? error.message.replace(/^functions\.https\.HttpsError:\s*/iu, '')
: null : null
throw new Error( const orderError = new Error(
message || 'Une erreur est survenue lors de la création de la commande de crédits.' message || 'Une erreur est survenue lors de la création de la commande de crédits.'
) )
orderError.code = error?.code
throw orderError
} }
}, [currentUID, selectedProjectId]) }, [currentUID, selectedProjectId])
@@ -251,11 +253,7 @@ const ComposeSong = () => {
const availableCoins = Number.isFinite(coinBalance) ? coinBalance : 0 const availableCoins = Number.isFinite(coinBalance) ? coinBalance : 0
if (availableCoins < MUSIC_GENERATION_COIN_COST) { if (availableCoins < MUSIC_GENERATION_COIN_COST) {
setIsConfirmVisible(false) setIsConfirmVisible(false)
AppAlert( showInsufficientCreditsAlert(MUSIC_GENERATION_COIN_COST)
'Crédits insuffisants',
"Tu n'as pas assez de pièces pour générer une musique. Recharge ton compte pour continuer."
)
openCoinPackModal()
return return
} }
@@ -265,6 +263,10 @@ const ComposeSong = () => {
navigate(Routes.GeneratingSong, { config: musicConfig }) navigate(Routes.GeneratingSong, { config: musicConfig })
} catch (error) { } catch (error) {
setIsConfirmVisible(false) setIsConfirmVisible(false)
if (error?.code === 'functions/failed-precondition') {
showInsufficientCreditsAlert(MUSIC_GENERATION_COIN_COST)
return
}
const message = const message =
error?.message || 'Une erreur est survenue lors du lancement de la génération.' error?.message || 'Une erreur est survenue lors du lancement de la génération.'
AppAlert('Impossible de lancer la génération', message) AppAlert('Impossible de lancer la génération', message)
+13
View File
@@ -0,0 +1,13 @@
import AppAlert from '../components/Alert'
import { openCoinPackModal } from './coinPackModal'
export const showInsufficientCreditsAlert = (requiredCredits) => {
AppAlert(
'Crédits insuffisants',
`Cette création nécessite ${requiredCredits} crédits. Achète des crédits pour continuer.`,
[
{ text: 'Plus tard', style: 'cancel' },
{ text: 'Acheter des crédits', onPress: openCoinPackModal },
]
)
}