diff --git a/App.js b/App.js index 2f499d0..3aaba99 100644 --- a/App.js +++ b/App.js @@ -140,7 +140,7 @@ const App = () => { return () => { try { s.remove(); - } catch (_) {} + } catch (_) { } }; } }, []); @@ -205,6 +205,14 @@ const App = () => { ? `${options?.title} - MusicLand` : "MusicLand", }} + linking={{ + prefixes: ["musicland://", "https://musicland-one.vercel.app"], + config: { + screens: { + // Add any deep link configurations here if needed + }, + }, + }} > diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index ff5db11..c9e4af2 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -31,6 +31,8 @@ + + diff --git a/app.json b/app.json index 5598ee5..80ae7ac 100644 --- a/app.json +++ b/app.json @@ -3,8 +3,14 @@ "owner": "minuitagency", "slug": "musicland", "name": "MusicLand", - "scheme": "musicland", - "deeplinks": ["musicland://"], + "scheme": [ + "musicland", + "com.googleusercontent.apps.305598753437-qck73beo37mi04qlautgafbpdl3ccaoh", + "com.googleusercontent.apps.305598753437-t2uitr9gd7aaed59ahdvklkcsg0vngmk" + ], + "deeplinks": [ + "musicland://" + ], "version": "0.0.2", "icon": "./assets/icon.png", "backgroundColor": "#0F0C14", @@ -26,7 +32,9 @@ "usesAppleSignIn": true, "requireFullScreen": true, "userInterfaceStyle": "dark", - "associatedDomains": ["applinks:musicland-one.vercel.app"], + "associatedDomains": [ + "applinks:musicland-one.vercel.app" + ], "bundleIdentifier": "com.omedis.musicland.ai", "infoPlist": { "NSMicrophoneUsageDescription": "MusicLand uses the microphone to record your voice and audio so you can create and collaborate on music projects.", @@ -38,14 +46,19 @@ "UIInterfaceOrientationLandscapeLeft", "UIInterfaceOrientationLandscapeRight" ], - "LSApplicationQueriesSchemes": ["itms-apps", "minuit"] + "LSApplicationQueriesSchemes": [ + "itms-apps", + "minuit" + ] }, "config": { "usesNonExemptEncryption": false }, "entitlements": { "aps-environment": "development", - "com.apple.developer.applesignin": ["Default"] + "com.apple.developer.applesignin": [ + "Default" + ] }, "appleTeamId": "W2QZ9CTMYJ" }, @@ -114,4 +127,4 @@ } } } -} +} \ No newline at end of file diff --git a/bun.lock b/bun.lock index 3a2fef2..299ce29 100644 --- a/bun.lock +++ b/bun.lock @@ -51,6 +51,7 @@ "expo-speech": "~13.0.1", "expo-splash-screen": "~0.29.24", "expo-status-bar": "~2.0.1", + "expo-store-review": "~8.0.1", "expo-system-ui": "~4.0.9", "expo-video": "~2.0.6", "expo-web-browser": "~14.0.2", @@ -78,7 +79,6 @@ "react-native-safe-area-context": "4.12.0", "react-native-screens": "~4.4.0", "react-native-sortables": "~1.8.0", - "react-native-store-review": "~0.3.0", "react-native-super-grid": "~5.0.0", "react-native-svg": "15.8.0", "react-native-swiper-flatlist": "~3.2.5", @@ -1397,6 +1397,8 @@ "expo-status-bar": ["expo-status-bar@2.0.1", "", { "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-AkIPX7jWHRPp83UBZ1iXtVvyr0g+DgBVvIXTtlmPtmUsm8Vq9Bb5IGj86PW8osuFlgoTVAg7HI/+Ok7yEYwiRg=="], + "expo-store-review": ["expo-store-review@8.0.1", "", { "peerDependencies": { "expo": "*", "react-native": "*" } }, "sha512-eJoZbsAsOXpyl1CEXauiMqs3z++8Qf1OMDUBEGmRj9hew+w9JbS3wvFOZpc0UXbm/NYn5YwiLfK7epQjLLKz4A=="], + "expo-system-ui": ["expo-system-ui@4.0.9", "", { "dependencies": { "@react-native/normalize-colors": "0.76.8", "debug": "^4.3.2" }, "peerDependencies": { "expo": "*", "react-native": "*", "react-native-web": "*" }, "optionalPeers": ["react-native-web"] }, "sha512-hqBc0EWeK/BTB8i4H84vqNjje8GgxhapYrcWdg5qriaRA/u+bNNxhmpZXdAjFuhonOP4SmAbF+gjoJJWsTrhUg=="], "expo-updates-interface": ["expo-updates-interface@1.0.0", "", { "peerDependencies": { "expo": "*" } }, "sha512-93oWtvULJOj+Pp+N/lpTcFfuREX1wNeHtp7Lwn8EbzYYmdn37MvZU3TPW2tYYCZuhzmKEXnUblYcruYoDu7IrQ=="], @@ -2273,8 +2275,6 @@ "react-native-sortables": ["react-native-sortables@1.8.0", "", { "optionalDependencies": { "react-native-haptic-feedback": ">=2.0.0" }, "peerDependencies": { "react": "*", "react-native": "*", "react-native-gesture-handler": ">=2.0.0", "react-native-reanimated": ">=3.0.0" } }, "sha512-uoNY0uiHikq3eKJoF85CATMPpo9jS7t37XUlunxSGjjbGi4L05os8eJBGNZSR+3NQgK2FtYGGkQtFbeSJIwmDg=="], - "react-native-store-review": ["react-native-store-review@0.3.0", "", {}, "sha512-PipH/p3O10DDCUWHiW0sVZ0020HPx6gRFFZOyuAYRRVwdssO7or/+H2pHTlwUt2lasVzLenTf2aZ9sMrpryuKA=="], - "react-native-super-grid": ["react-native-super-grid@5.0.1", "", { "dependencies": { "prop-types": "^15.6.0" }, "peerDependencies": { "react": ">=16.8.0", "react-native": ">=0.59.0" } }, "sha512-BNkLgQT79zv906TAVWGl+7B+5g6eL0GDTtO6te/g/WYOkxM8OXXJN8/Q1aIUBOpDo1L0Wv0BDR6EGHuhndmcRw=="], "react-native-svg": ["react-native-svg@15.8.0", "", { "dependencies": { "css-select": "^5.1.0", "css-tree": "^1.1.3", "warn-once": "0.1.1" }, "peerDependencies": { "react": "*", "react-native": "*" } }, "sha512-KHJzKpgOjwj1qeZzsBjxNdoIgv2zNCO9fVcoq2TEhTRsVV5DGTZ9JzUZwybd7q4giT/H3RdtqC3u44dWdO0Ffw=="], diff --git a/package.json b/package.json index 7c3b081..a91e82c 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "react-native-safe-area-context": "4.12.0", "react-native-screens": "~4.4.0", "react-native-sortables": "~1.8.0", - "react-native-store-review": "~0.3.0", + "expo-store-review": "~8.0.1", "react-native-super-grid": "~5.0.0", "react-native-svg": "15.8.0", "react-native-swiper-flatlist": "~3.2.5", @@ -132,4 +132,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/assets/icons/video.png b/src/assets/icons/video.png index db893c5..68fb707 100644 Binary files a/src/assets/icons/video.png and b/src/assets/icons/video.png differ diff --git a/src/helpers/index.js b/src/helpers/index.js index cf1197f..8d04c3b 100644 --- a/src/helpers/index.js +++ b/src/helpers/index.js @@ -4,6 +4,7 @@ import numbro from "numbro"; import { Linking } from "react-native"; import { isTauri, isWeb } from "../hooks/useLayoutType"; import Palette from "../styles/Palette.js"; +import * as StoreReview from "expo-store-review"; export const capitalize = (string) => { return string.charAt(0).toUpperCase() + string.slice(1); @@ -140,18 +141,12 @@ export const validateDate = (date = null) => { }; export const onStoreReview = async () => { - let StoreReview; - if (!isWeb) { - import("react-native-store-review").then((module) => { - StoreReview = module; - + if (await StoreReview.hasAction()) { StoreReview.requestReview(); - }); + } } else { console.log("Store review not available on web"); - - return; } }; diff --git a/src/navigation/MainStack.js b/src/navigation/MainStack.js index d15183e..9e8e9e3 100644 --- a/src/navigation/MainStack.js +++ b/src/navigation/MainStack.js @@ -17,6 +17,7 @@ import ResetPassword from "../screens/ResetPassword"; import ChooseDecor from "../screens/Playback/ChooseDecor"; import CreatingDecor from "../screens/Playback/CreatingDecor"; import Playback from "../screens/Playback/Playback"; +import PlaybackGuide from "../screens/Playback/PlaybackGuide"; import PlaybackOnboarding from "../screens/Playback/PlaybackOnboarding"; import RecordPlayback from "../screens/Playback/RecordPlayback"; import RecordedPlayback from "../screens/Playback/RecordedPlayback"; @@ -80,10 +81,10 @@ const screenOptions = { headerBackTitleVisible: false, ...(isWeb ? { - // Avoid web-specific pointerEvents issues by disabling animations/gestures - animationEnabled: false, - gestureEnabled: false, - } + // Avoid web-specific pointerEvents issues by disabling animations/gestures + animationEnabled: false, + gestureEnabled: false, + } : {}), }; @@ -228,6 +229,10 @@ const baseScreens = [ name: Routes.Playback, component: Playback, }, + { + name: Routes.PlaybackGuide, + component: PlaybackGuide, + }, { name: Routes.RecordPlayback, component: RecordPlayback, diff --git a/src/navigation/Routes.js b/src/navigation/Routes.js index d0ba0f1..2f54c2f 100644 --- a/src/navigation/Routes.js +++ b/src/navigation/Routes.js @@ -56,6 +56,7 @@ export const Routes = { PlaybackOnboarding: "PlaybackOnboarding", Playback: "Playback", + PlaybackGuide: "PlaybackGuide", RecordPlayback: "RecordPlayback", RecordedPlayback: "RecordedPlayback", ChooseDecor: "ChooseDecor", diff --git a/src/screens/Playback/Playback.js b/src/screens/Playback/Playback.js index 1cd0939..914b4a4 100644 --- a/src/screens/Playback/Playback.js +++ b/src/screens/Playback/Playback.js @@ -51,7 +51,7 @@ const Playback = ({ route, navigation }) => { /> setShowIntro(videos.theo)} + onPress={() => navigate(Routes.PlaybackGuide)} /> {/* */} diff --git a/src/screens/Playback/PlaybackGuide.js b/src/screens/Playback/PlaybackGuide.js new file mode 100644 index 0000000..5e90d25 --- /dev/null +++ b/src/screens/Playback/PlaybackGuide.js @@ -0,0 +1,340 @@ +import React from "react"; +import { ScrollView, StyleSheet, Text, View, Platform } from "react-native"; +import { BlurView } from "expo-blur"; +import { background } from "../../assets"; +import MusicLandHeader from "../../components/MusicLandHeader"; +import Page from "../../layouts/Page"; +import { Routes } from "../../navigation"; +import { gutters, Palette } from "../../styles"; +import { FONT_FAMILY } from "../../styles/Fonts"; + +const PlaybackGuide = ({ navigation }) => { + return ( + + navigation.goBack()} /> + + + + Le Guide Ultime du Playback de TA Chanson : L'Expérience Créative Totale + + Introduction : Tu Es l'Artiste ET le Performeur ! + + Imagine ça : tu as créé Ta chanson, TES paroles, TA mélodie, TON univers. + Et maintenant, tu vas lui donner vie en playback. C'est une expérience UNIQUE au monde ! + Tu n'imites personne - tu deviens la version scénique de toi-même. C'est comme avoir un + jumeau qui chante pendant que toi, tu performes. Double dose de créativité, double dose de + fun ! + + + Chapitre 1 : Le Lip-Sync de Ta Propre Création - L'Avantage Ultime + + Le Pouvoir d'Être le Créateur + + Tu as un super-pouvoir que personne d'autre n'a : tu connais CHAQUE intention derrière + chaque mot, chaque respiration, chaque silence. Tu n'as pas à deviner ce que l'artiste + voulait dire - c'est TOI l'artiste ! Cette connexion intime avec ta chanson va transparaître + dans chaque mouvement de tes lèvres. + + + La Règle des 15 Écoutes - Version Créateur + + Oui, même pour TA chanson, les 15 écoutes sont cruciales ! Mais avec une twist magique : + + + Écoutes 1-5 : Redécouvre Ta Création Écoute ta chanson comme si c'était la première + fois. Tu vas être surpris de détails que tu avais oubliés ! + + + Écoutes 6-10 : L'Analyse du Créateur + {"\n"}• Où as-tu placé les émotions fortes ? + {"\n"}• Quels mots méritent d'être sur-articulés ? + {"\n"}• Où sont tes respirations naturelles dans l'enregistrement ? + + + Écoutes 11-15 : La Transformation Maintenant, détache-toi du "toi qui a enregistré" pour + devenir le "toi qui performe". C'est là que la magie opère ! + + + Les Secrets du Créateur-Performeur + + Le Phénomène de Dédoublement C'est normal de se sentir bizarre au début - tu entends + ta voix mais tu ne chantes pas ! Embrasse cette sensation unique. C'est comme être ton + propre fan numéro un. + + + La Liberté de Réinterpréter Tu as le droit de changer l'émotion ! Si tu as enregistré la + chanson en étant mélancolique mais qu'aujourd'hui tu la sens joyeuse - VAS-Y ! C'est TA + chanson, tu peux la réinventer à chaque performance. + + + L'Anticipation Parfaite Tu connais chaque micro-pause, chaque inflexion. Utilise cet + avantage ! Anticipe les moments forts avec ton expression faciale une fraction de seconde + avant qu'ils arrivent. + + + Le Truc du "Nouveau Moi" Crée un personnage scénique de toi-même. Peut-être que le + "toi studio" est introverti, mais le "toi playback" est extraverti. Cette dualité est fascinante et + totalement unique à ton expérience ! + + + Chapitre 2 : Capturer l'Essence de Ta Création + + Ton Smartphone, Ton Studio Visuel + + Quand tu filmes le playback de TA chanson, tu complètes l'œuvre. La musique était l'audio, + maintenant tu ajoutes le visuel ! + + + Les Angles Qui Racontent Ton Histoire + + L'Angle "Confession" (Très Proche) Pour les parties intimes de ta chanson. Le spectateur + doit sentir que tu lui confies un secret. + + + L'Angle "Concert" (Plan Large) Montre l'artiste complet en toi ! Parfait pour les refrains + énergiques où tu veux bouger. + + + L'Angle "Clip Musical" (Variété) Change d'angle selon les parties de ta chanson. Verse 1 + proche, refrain large, pont en profil... Raconte visuellement l'histoire de ta musique. + + + L'Accessoire Signature : L'Instrument de Ta Création + + C'est encore plus puissant quand c'est TA chanson ! + + + Si tu as composé avec un instrument : + {"\n"}• Mime-le même si tu ne l'as pas sous la main + {"\n"}• Montre les accords que TU as choisis + {"\n"}• Tes mains connaissent les mouvements par cœur + + + Si c'est une création digitale : + {"\n"}• Un casque audio autour du cou = le créateur + {"\n"}• Un smartphone en main = le compositeur moderne + {"\n"}• Les mains qui "mixent" dans l'air = le producteur + + + L'accessoire émotionnel : + {"\n"}• Un carnet (tes paroles originales !) + {"\n"}• Un objet qui t'a inspiré la chanson + {"\n"}• Un élément qui représente le thème de ta chanson + + + Chapitre 3 : La Scène de Ta Première + + Chaque Lieu Devient TON Lieu + + Quand tu performes ta propre chanson, chaque endroit prend une signification spéciale. Ce + n'est pas juste un décor, c'est le lieu de naissance visuelle de ta création ! + + + Les Scènes Qui Amplifient Ta Création + + L'Endroit Où Tu l'as Écrite - Le Retour aux Sources Si tu as écrit ta chanson dans ta + chambre, filme-là ! C'est puissant de montrer l'artiste là où la magie a commencé. + L'authenticité sera palpable. + + + Le Studio Maison - Là Où Tu l'as Enregistrée Montre ton setup, même basique ! Un + micro, un ordinateur, des câbles... C'est TON univers créatif. Les gens adorent voir les + coulisses. + + + Le Lieu Qui t'a Inspiré - La Boucle Créative Tu as écrit sur la plage ? Sur l'amour au café + ? Sur la solitude au parc ? Retourne-y ! La cohérence entre ton inspiration et ta performance + est magique. + + + La Scène Imaginaire - Ce Que Tu Visualisais Quand tu as créé cette chanson, où + t'imaginais-tu la performer ? Un grand stade ? Un petit club intime ? Recrée cette ambiance + avec ce que tu as ! + + + Suggestions Créatives Uniques : + + • La Voiture : Si c'est là que tu as eu l'idée de la mélodie + {"\n"}• La Douche : Avec le téléphone protégé, si c'est là que tu chantes toujours + {"\n"}• Le Toit/Balcon : Pour une sensation de "crier au monde" ta création + {"\n"}• Devant le Miroir : Le dialogue entre toi créateur et toi performeur + {"\n"}• Dans le Noir avec une Seule Lumière : Pour l'aspect dramatique et intime + + + Chapitre 4 : Le Mindset du Créateur-Performeur + + L'Expérience Unique au Monde + + Ce que tu fais est EXTRAORDINAIRE. Tu es à la fois Mozart et le pianiste, Beyoncé et la + performeuse, le compositeur ET l'interprète. Cette dualité créative est rare et précieuse ! + + + Les Mantras du Créateur en Playback + + "C'est MON Bébé Musical" Cette chanson est née de toi. Chaque note, chaque mot est ton + enfant créatif. Quand tu la performes en playback, tu lui donnes une nouvelle dimension. + Sois fier ! + + + "Je Me Réinvente à Chaque Prise" L'avantage de faire le playback de TA chanson ? Tu + peux explorer 1000 façons de l'interpréter ! Mélancolique le matin, énergique le soir. C'est ta + playground créative. + + + "Mes Deux Moi Collaborent" Le toi qui a chanté et le toi qui performe sont une équipe. + C'est une collaboration unique avec toi-même à travers le temps ! + + + "C'est Mon Histoire, Mes Règles" Personne ne peut te dire "ce n'est pas comme ça que + l'artiste le fait" - parce que l'artiste, c'est TOI ! + + + La Célébration de Ta Création + + Le Rituel du Créateur : + {"\n"}1. Écoute ta chanson une fois les yeux fermés - Reconnecte avec ton intention originale + {"\n"}2. Dis à voix haute : "J'ai créé quelque chose qui n'existait pas avant" + {"\n"}3. Danse 30 secondes sur TA création - Célèbre-toi ! + {"\n"}4. Filme avec fierté - Ce moment est historique dans ton parcours + + + Le Partage de Ton Univers + + Quand tu partages le playback de ta propre chanson, tu offres une expérience complète : + {"\n"}• Les gens découvrent ta musique + {"\n"}• Ils voient ta personnalité + {"\n"}• Ils connectent avec l'artiste complet que tu es + {"\n"}• Ils witness la naissance visuelle de ton art + + + Résumé : Ton Parcours Créatif Unique + + 🎵 Chapitre 1 - Ton Lip-Sync Signature + + • Tu connais chaque intention : Avantage ultime du créateur + {"\n"}• 15 écoutes pour redécouvrir : Même ta création mérite cette attention + {"\n"}• Le dédoublement créatif : Embrasse d'être ton propre interprète + {"\n"}• Liberté totale : Réinterprète selon ton humeur du jour + + + 🎬 Chapitre 2 - Ton Setup Créatif + + • Les angles qui racontent : Confession, concert, clip + {"\n"}• L'instrument de création : Montre ton processus créatif + {"\n"}• Accessoires significatifs : Objets liés à ton inspiration + {"\n"}• L'authenticité avant tout : Ton setup, tes règles + + + 🎭 Chapitre 3 - Tes Lieux de Création + + • Retour aux sources : Là où tu as créé + {"\n"}• Le lieu d'inspiration : Boucle ta vision créative + {"\n"}• La scène rêvée : Matérialise ta vision + {"\n"}• Chaque lieu = ton histoire : Personnalise à fond + + + 🌟 Chapitre 4 - Ton Mindset Unique + + • Double créativité : Compositeur ET performeur + {"\n"}• Fierté créative : Tu as créé quelque chose de rien + {"\n"}• Réinvention constante : Explore toutes les facettes + {"\n"}• Histoire complète : Tu offres l'expérience totale + + + Ton Défi Ultime : La Première Mondiale ! + + Tu es sur le point de faire quelque chose qu'AUCUN autre artiste ne peut faire : créer la + performance visuelle parfaite de TA chanson. C'est ta première mondiale, ton moment + unique ! + + + Dans les 24 prochaines heures, donne vie visuellement à ta création. Choisis ta chanson + préférée (parmi les tiennes !), trouve ton spot créatif, et MONTRE au monde non seulement + ta musique, mais TOI en train de la vivre. + + + Rappelle-toi : Tu n'es pas en train d'imiter. Tu n'es pas en train de copier. Tu es en train de + COMPLÉTER ton œuvre. La chanson était le tableau, le playback est le cadre qui le + sublime. + + + C'est ton moment. Ta chanson. Ta performance. Ton histoire. + + + Le monde attend de découvrir l'artiste complet que tu es ! 🎤🎵✨ + + + #MonPlaybackMaChanson #CréateurPerformeur #DoubleArtiste + + + P.S. : Garde chaque prise, même les "ratées". Dans 10 ans, tu regarderas ces vidéos et tu + verras le début de ton parcours d'artiste. C'est de l'or pur ! + + + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + marginHorizontal: Platform.OS === "web" ? gutters : 0, + marginBottom: gutters, + borderRadius: 20, + overflow: "hidden", + }, + blurContainer: { + flex: 1, + backgroundColor: Palette.glass, + }, + scrollContent: { + padding: gutters, + paddingBottom: gutters * 3, + }, + title: { + fontFamily: FONT_FAMILY.InterBold, + fontSize: 24, + color: Palette.white, + textAlign: "center", + marginBottom: 20, + }, + sectionTitle: { + fontFamily: FONT_FAMILY.InterBold, + fontSize: 20, + color: Palette.primary, + marginBottom: 10, + marginTop: 10, + }, + chapterTitle: { + fontFamily: FONT_FAMILY.InterBold, + fontSize: 22, + color: Palette.primary, + marginBottom: 15, + marginTop: 25, + textAlign: "center", + }, + subTitle: { + fontFamily: FONT_FAMILY.InterSemiBold, + fontSize: 18, + color: Palette.white, + marginBottom: 8, + marginTop: 15, + }, + text: { + fontFamily: FONT_FAMILY.InterRegular, + fontSize: 16, + color: Palette.white, + marginBottom: 10, + lineHeight: 24, + }, + bold: { + fontFamily: FONT_FAMILY.InterBold, + }, +}); + +export default PlaybackGuide; diff --git a/src/screens/Register.js b/src/screens/Register.js index cb45b06..9f93996 100644 --- a/src/screens/Register.js +++ b/src/screens/Register.js @@ -164,17 +164,6 @@ const Register = () => { keyboardShouldPersistTaps="handled" > {renderFormContent()} - - - Tu as déjà un compte ?{" "} - navigate(Routes.Login)} - > - Se connecter - - - )}