From 071f7e92791fbf994daf1fb319816f0f8faf2ea0 Mon Sep 17 00:00:00 2001 From: leon Date: Tue, 8 Sep 2026 15:36:03 +0200 Subject: [PATCH] feat: propose coins --- src/screens/Studio/ComposeSong.js | 16 +++++++++------- src/screens/Studio/ComposeSong.web.js | 16 +++++++++------- src/utils/insufficientCredits.js | 13 +++++++++++++ 3 files changed, 31 insertions(+), 14 deletions(-) create mode 100644 src/utils/insufficientCredits.js diff --git a/src/screens/Studio/ComposeSong.js b/src/screens/Studio/ComposeSong.js index 380a08a..34d0350 100644 --- a/src/screens/Studio/ComposeSong.js +++ b/src/screens/Studio/ComposeSong.js @@ -16,7 +16,7 @@ import { useUser } from '../../providers/UserDataProvider' import { gutters, Palette } from '../../styles' import { FONT_FAMILY } from '../../styles/Fonts' import { normalizeStructureType } from '../../utils/songStructure' -import { openCoinPackModal } from '../../utils/coinPackModal' +import { showInsufficientCreditsAlert } from '../../utils/insufficientCredits' import ChooseGenre from './ChooseGenre' import ChooseInstruments from './ChooseInstruments' import ChooseRhythm from './ChooseRhythm' @@ -179,9 +179,11 @@ const ComposeSong = () => { typeof error?.message === 'string' ? error.message.replace(/^functions\.https\.HttpsError:\s*/iu, '') : null - throw new Error( + const orderError = new Error( 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 if (availableCoins < MUSIC_GENERATION_COIN_COST) { setIsConfirmVisible(false) - AppAlert( - 'Crédits insuffisants', - "Tu n'as pas assez de pièces pour générer une musique. Recharge ton compte pour continuer." - ) - openCoinPackModal() + showInsufficientCreditsAlert(MUSIC_GENERATION_COIN_COST) return } @@ -206,6 +204,10 @@ const ComposeSong = () => { navigate(Routes.GeneratingSong, { config: musicConfig }) } catch (error) { setIsConfirmVisible(false) + if (error?.code === 'functions/failed-precondition') { + showInsufficientCreditsAlert(MUSIC_GENERATION_COIN_COST) + return + } const message = error?.message || 'Une erreur est survenue lors du lancement de la génération.' AppAlert('Impossible de lancer la génération', message) diff --git a/src/screens/Studio/ComposeSong.web.js b/src/screens/Studio/ComposeSong.web.js index 13bfe98..535023d 100644 --- a/src/screens/Studio/ComposeSong.web.js +++ b/src/screens/Studio/ComposeSong.web.js @@ -16,7 +16,7 @@ import { useUser } from '../../providers/UserDataProvider' import { gutters, Palette } from '../../styles' import { FONT_FAMILY } from '../../styles/Fonts' import { normalizeStructureType } from '../../utils/songStructure' -import { openCoinPackModal } from '../../utils/coinPackModal' +import { showInsufficientCreditsAlert } from '../../utils/insufficientCredits' import ChooseGenre from './ChooseGenre' import ChooseInstruments from './ChooseInstruments' import ChooseRhythm from './ChooseRhythm' @@ -238,9 +238,11 @@ const ComposeSong = () => { typeof error?.message === 'string' ? error.message.replace(/^functions\.https\.HttpsError:\s*/iu, '') : null - throw new Error( + const orderError = new Error( message || 'Une erreur est survenue lors de la création de la commande de crédits.' ) + orderError.code = error?.code + throw orderError } }, [currentUID, selectedProjectId]) @@ -251,11 +253,7 @@ const ComposeSong = () => { const availableCoins = Number.isFinite(coinBalance) ? coinBalance : 0 if (availableCoins < MUSIC_GENERATION_COIN_COST) { setIsConfirmVisible(false) - AppAlert( - 'Crédits insuffisants', - "Tu n'as pas assez de pièces pour générer une musique. Recharge ton compte pour continuer." - ) - openCoinPackModal() + showInsufficientCreditsAlert(MUSIC_GENERATION_COIN_COST) return } @@ -265,6 +263,10 @@ const ComposeSong = () => { navigate(Routes.GeneratingSong, { config: musicConfig }) } catch (error) { setIsConfirmVisible(false) + if (error?.code === 'functions/failed-precondition') { + showInsufficientCreditsAlert(MUSIC_GENERATION_COIN_COST) + return + } const message = error?.message || 'Une erreur est survenue lors du lancement de la génération.' AppAlert('Impossible de lancer la génération', message) diff --git a/src/utils/insufficientCredits.js b/src/utils/insufficientCredits.js new file mode 100644 index 0000000..148d59f --- /dev/null +++ b/src/utils/insufficientCredits.js @@ -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 }, + ] + ) +}