feat: remove publish to youtube

This commit is contained in:
2026-09-02 16:08:48 +02:00
parent 4e14a38d4e
commit f4549b694f
18 changed files with 15 additions and 804 deletions
-10
View File
@@ -72,16 +72,6 @@ const STAGE_CARD_CONTENT = [
textAlign: 'left',
lockSide: 'right',
},
{
key: 'publisher',
step: 'ÉTAPE 4',
description:
'Je suis Mr Benhaï, Producteur de MusicLand, et je vais te faire une proposition qui pourrait tintéresser. On se retrouve à la sortie du studio !',
image: cardsImg.production,
imagePosition: 'right',
textAlign: 'right',
lockSide: 'left',
},
]
const ACTIVE_SUBSCRIPTION_STATUSES = new Set(['trialing', 'active', 'past_due', 'unpaid'])
+1 -9
View File
@@ -2,7 +2,7 @@ import FontAwesome from '@expo/vector-icons/FontAwesome'
import { BlurView } from 'expo-blur'
import React, { useCallback, useMemo } from 'react'
import { Image, Platform, Pressable, Text, View } from 'react-native'
import { ai, background, cardsImg } from '../assets'
import { ai, background } from '../assets'
import Page from '../layouts/Page'
import { navigate } from '../navigation/NavigationService'
import { useUserData } from '../providers/UserDataProvider'
@@ -36,14 +36,6 @@ const CREATE_DATA = [
desc: "Theo t'accompagne pour créer ton playback.",
type: 'Director',
},
{
stageKey: 'publisher',
img: cardsImg.production,
bg: background.productionBG2,
label: 'Publication',
desc: 'Publions ta vidéo sur YouTube !',
type: 'Producteur',
},
]
const NewMusicOptions = () => {
+5 -1
View File
@@ -407,7 +407,11 @@ const PlaybackDownload = ({ route }) => {
{ merge: true }
)
navigate(Routes.PublishYoutube, { projectId: projectForDownload.id })
setTooltip({
type: 'success',
text: 'Playback publié sur MusicLand !',
})
navigate(Routes.Home)
} catch (err) {
setTooltip({
type: 'error',
+2 -2
View File
@@ -42,7 +42,7 @@ const StreamSong = () => {
if (!hasAcceptedPublication) {
setTooltip({
type: 'error',
text: 'Confirme la diffusion sur Musicland et YouTube avant de publier',
text: 'Confirme la diffusion sur MusicLand avant de publier',
})
return
}
@@ -112,7 +112,7 @@ const StreamSong = () => {
<AppCheckbox
selected={hasAcceptedPublication}
onPress={() => setHasAcceptedPublication((prevState) => !prevState)}
label="J'accepte la diffusion de mon contenu sur Musicland et YouTube."
label="J'accepte la diffusion de mon contenu sur MusicLand."
/>
<Text
style={{
-327
View File
@@ -1,327 +0,0 @@
import { useRoute } from '@react-navigation/native'
import React, { useCallback, useMemo, useState } from 'react'
import { Linking, StyleSheet, Text, View } from 'react-native'
import useMinuit from 'react-native-minuit/src/hooks/useMinuit.js'
import { background } from '../../assets'
import AppCheckbox from '../../components/AppCheckbox'
import BackgroundVideo from '../../components/BackgroundVideo'
import BorderGradientButton from '../../components/BorderGradientButton'
import GradientButton from '../../components/GradientButton'
import MusicLandHeader from '../../components/MusicLandHeader'
import alert from '../../components/Alert'
import firebase, { projectsRef, serverTimestamp } from '../../config/firebase'
import Page from '../../layouts/Page'
import { goBack, navigate } from '../../navigation/NavigationService'
import { Routes } from '../../navigation'
import { useUser } from '../../providers/UserDataProvider'
import { Palette, gutters } from '../../styles'
import { FONT_FAMILY } from '../../styles/Fonts'
import { isWeb } from '../../hooks/useLayoutType'
const PublishYoutube = () => {
const route = useRoute()
const routeProjectId = route?.params?.projectId ?? null
const { userProjects = [], selectedProject, videos } = useUser()
const { setTooltip } = useMinuit()
const project = useMemo(() => {
if (routeProjectId) {
return userProjects.find((item) => item?.id === routeProjectId) || selectedProject || null
}
if (selectedProject?.id) {
return selectedProject
}
return userProjects.length ? userProjects[0] : null
}, [routeProjectId, selectedProject, userProjects])
const projectId = project?.id || routeProjectId || null
const introVideo = isWeb ? videos?.benhaiWeb : videos?.benhai
const [saving, setSaving] = useState(false)
const [hasAcceptedPublication, setHasAcceptedPublication] = useState(true)
const youtubeUrl = project?.youtubeUrl ?? null
const youtubeStatus = project?.youtubeStatus ?? null
const youtubeError = project?.youtubeError ?? null
const playbackReady = !!project?.playbackUrl
const hasYoutubePublication = !!youtubeUrl
const isPublishing = useMemo(
() => ['PUBLISHING', 'UPLOADING', 'PROCESSING', 'QUEUED'].includes(youtubeStatus),
[youtubeStatus]
)
const publishDisabled =
saving || isPublishing || !playbackReady || !projectId || !hasAcceptedPublication
const publishButtonLabel = isPublishing
? 'Publication en cours...'
: hasYoutubePublication
? 'Mettre à jour sur YouTube'
: 'Publier sur YouTube'
const statusMessage = useMemo(() => {
if (!playbackReady) {
return 'Termine la création de ton playback avec Theo pour débloquer la publication YouTube.'
}
if (isPublishing) {
return 'La publication de ta vidéo est en cours... Patiente un instant.'
}
if (youtubeError || youtubeStatus === 'FAILED') {
return 'La dernière tentative de publication a échoué. Tu peux réessayer ci-dessous.'
}
if (hasYoutubePublication) {
return 'Ta vidéo est publiée sur la chaîne YouTube MusicLand. Tu peux la partager dès maintenant.'
}
return 'Partage ton playback sur la chaîne YouTube MusicLand.'
}, [hasYoutubePublication, isPublishing, playbackReady, youtubeError, youtubeStatus])
const handleOpenYoutube = useCallback(async () => {
if (!youtubeUrl) {
return
}
try {
await Linking.openURL(youtubeUrl)
} catch (_error) {
setTooltip?.({
type: 'error',
text: "Impossible d'ouvrir le lien YouTube",
})
}
}, [setTooltip, youtubeUrl])
const handleMarkPublished = useCallback(async () => {
if (!projectId) {
setTooltip?.({
type: 'error',
text: 'Sélectionnez un projet avant de publier',
})
return
}
if (!playbackReady) {
setTooltip?.({
type: 'error',
text: "Aucun playback n'est disponible pour la publication",
})
return
}
setSaving(true)
try {
// publication sur youtube en standby
// const publishCallable = firebase.functions().httpsCallable('youtube-publishPlaybackToYoutube')
// await publishCallable({ projectId })
setTooltip?.({
type: 'success',
text: 'Publication lancée sur YouTube',
})
} catch (error) {
setTooltip?.({
type: 'error',
text: error?.message || 'Impossible de lancer la publication',
})
} finally {
setSaving(false)
}
}, [playbackReady, projectId, setTooltip])
const handleConfirmPublish = useCallback(() => {
if (!hasAcceptedPublication) {
setTooltip?.({
type: 'error',
text: 'Confirme la diffusion sur YouTube avant de publier',
})
return
}
if (publishDisabled) {
return
}
const confirmTitle = hasYoutubePublication
? 'Confirmer la mise à jour'
: 'Confirmer la publication'
const confirmDescription = hasYoutubePublication
? 'La vidéo existe déjà sur YouTube. Confirme que tu souhaites remplacer la version publiée.'
: 'Confirme que tu souhaites publier ce playback sur YouTube. Il sera visible publiquement.'
alert(confirmTitle, confirmDescription, [
{ text: 'Annuler', style: 'cancel' },
{
text: hasYoutubePublication ? 'Mettre à jour' : 'Je confirme',
onPress: handleMarkPublished,
},
])
}, [
handleMarkPublished,
hasAcceptedPublication,
hasYoutubePublication,
publishDisabled,
setTooltip,
])
const handleResetPublication = useCallback(async () => {
if (!projectId) {
setTooltip?.({
type: 'error',
text: 'Sélectionnez un projet avant de réinitialiser',
})
return
}
setSaving(true)
try {
await projectsRef.doc(projectId).set(
{
youtubePublished: false,
youtubeUrl: null,
youtubeVideoId: null,
youtubePublishedAt: null,
youtubeStatus: 'IDLE',
youtubeError: null,
updatedAt: serverTimestamp(),
},
{ merge: true }
)
setTooltip?.({
type: 'success',
text: 'Publication YouTube réinitialisée',
})
} catch (error) {
setTooltip?.({
type: 'error',
text: error?.message || 'Réinitialisation impossible',
})
} finally {
setSaving(false)
}
}, [projectId, setTooltip])
const handleGoHome = useCallback(() => {
navigate(Routes.BottomTab, {
screen: Routes.HomeStack,
params: {
screen: Routes.Home,
},
})
}, [])
return (
<Page
backgroundImg={background.playbackBG2}
backgroundContent={
<BackgroundVideo
source={introVideo}
soundButtonStyle={isWeb ? styles.rightSideControl : undefined}
/>
}
containerStyle={isWeb ? styles.videoPage : undefined}
headerType="NONE"
>
<MusicLandHeader progress={100} onPressBack={goBack} />
<View
style={{
flex: 1,
paddingHorizontal: gutters,
paddingBottom: gutters * 2,
justifyContent: 'space-between',
}}
>
<View style={{ alignItems: 'center', gap: 18 }}>
<Text
style={{
fontSize: 22,
fontFamily: FONT_FAMILY.InterSemiBold,
color: Palette.white,
textAlign: 'center',
}}
>
{hasYoutubePublication ? 'Ta vidéo est déjà sur YouTube' : 'Publier sur YouTube'}
</Text>
<Text
style={{
fontSize: 14,
fontFamily: FONT_FAMILY.InterRegular,
color: Palette.white,
opacity: 0.9,
textAlign: 'center',
lineHeight: 20,
}}
>
{statusMessage}
</Text>
{youtubeError && (
<Text
style={{
fontSize: 13,
fontFamily: FONT_FAMILY.InterRegular,
color: Palette.red,
textAlign: 'center',
}}
>
{youtubeError}
</Text>
)}
{hasYoutubePublication && youtubeUrl && (
<Text
style={{
fontSize: 13,
fontFamily: FONT_FAMILY.InterMedium,
color: Palette.white,
textAlign: 'center',
opacity: 0.8,
}}
numberOfLines={2}
>
{youtubeUrl}
</Text>
)}
</View>
<View style={{ gap: 14 }}>
<View style={styles.consentContainer}>
<AppCheckbox
selected={hasAcceptedPublication}
onPress={() => setHasAcceptedPublication((prevState) => !prevState)}
label="J'accepte la diffusion de mon contenu sur YouTube."
/>
<Text style={styles.consentDescription}>
Cette confirmation est requise avant toute publication sur YouTube.
</Text>
</View>
<GradientButton
title={publishButtonLabel}
onPress={handleConfirmPublish}
disabled={publishDisabled}
/>
{hasYoutubePublication && youtubeUrl && (
<BorderGradientButton
title="Voir la vidéo sur YouTube"
onPress={handleOpenYoutube}
disabled={saving || isPublishing}
/>
)}
{hasYoutubePublication && (
<BorderGradientButton
title="Réinitialiser la publication"
onPress={handleResetPublication}
disabled={saving || isPublishing}
/>
)}
<BorderGradientButton title="Retour à l'accueil" onPress={handleGoHome} />
</View>
</View>
</Page>
)
}
const styles = StyleSheet.create({
videoPage: {
alignSelf: 'center',
},
rightSideControl: {
right: 24,
left: 'auto',
},
consentContainer: {
gap: 6,
},
consentDescription: {
fontSize: 13,
fontFamily: FONT_FAMILY.InterRegular,
color: Palette.white,
opacity: 0.8,
},
})
export default PublishYoutube
@@ -437,7 +437,7 @@ const ShareAndCreditsModal = ({
<AppCheckbox
selected={hasAcceptedPublication}
onPress={() => setHasAcceptedPublication((prev) => !prev)}
label="J'accepte de diffuser mon contenu sur la plateforme de streaming de musicland et sur youtube"
label="J'accepte de diffuser mon contenu sur la plateforme de streaming de MusicLand"
/>
</View>
<GradientButton