diff --git a/.eslintrc.js b/.eslintrc.js index a11ee9e..7c52fcb 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,12 +1,12 @@ module.exports = { - extends: ["expo", "prettier"], - plugins: ["prettier"], + extends: ['expo', 'prettier'], + plugins: ['prettier'], rules: { - "prettier/prettier": [ - "error", + 'prettier/prettier': [ + 'error', { singleQuote: false, }, ], }, -}; +} diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..35bc0da --- /dev/null +++ b/.prettierignore @@ -0,0 +1,8 @@ +node_modules +dist +build +vendor +coverage +.next +.out +public/build diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..2924079 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": false, + "singleQuote": true, + "printWidth": 100, + "trailingComma": "es5" +} diff --git a/App.js b/App.js index 47d7762..653bf5e 100644 --- a/App.js +++ b/App.js @@ -1,28 +1,22 @@ -import "@expo/metro-runtime"; -import { PortalProvider } from "@gorhom/portal"; -import { DefaultTheme, NavigationContainer } from "@react-navigation/native"; -import { useFonts } from "expo-font"; -import * as SplashScreen from "expo-splash-screen"; -import { StatusBar } from "expo-status-bar"; -import moment from "moment"; -import "moment/locale/fr"; -import { Platform, Text, TextInput } from "react-native"; -import { GestureHandlerRootView } from "react-native-gesture-handler"; -import React, { - setGlobal, - useCallback, - useEffect, - useGlobal, - useState, -} from "reactn"; +import '@expo/metro-runtime' +import { PortalProvider } from '@gorhom/portal' +import { DefaultTheme, NavigationContainer } from '@react-navigation/native' +import { useFonts } from 'expo-font' +import * as SplashScreen from 'expo-splash-screen' +import { StatusBar } from 'expo-status-bar' +import moment from 'moment' +import 'moment/locale/fr' +import { Platform, Text, TextInput } from 'react-native' +import { GestureHandlerRootView } from 'react-native-gesture-handler' +import React, { setGlobal, useCallback, useEffect, useGlobal, useState } from 'reactn' -import { MainStack, Routes } from "./src/navigation"; -import { Palette } from "./src/styles"; +import { MainStack, Routes } from './src/navigation' +import { Palette } from './src/styles' -import { navigationRef, reset } from "./src/navigation/NavigationService"; +import { navigationRef, reset } from './src/navigation/NavigationService' -import { MenuProvider } from "react-native-popup-menu"; -import initialGlobalState from "./src/config/initialGlobalState"; +import { MenuProvider } from 'react-native-popup-menu' +import initialGlobalState from './src/config/initialGlobalState' import { Inter_400Regular, @@ -30,143 +24,143 @@ import { Inter_500Medium, Inter_600SemiBold, Inter_700Bold, -} from "@expo-google-fonts/inter"; -import firebase from "./src/config/firebase"; -import Providers from "./src/providers"; +} from '@expo-google-fonts/inter' +import firebase from './src/config/firebase' +import Providers from './src/providers' -import { LogBox } from "react-native"; -import CommentsBottomSheet from "./src/components/bottomsheets/CommentsBottomSheet"; -import ShareQrModalContainer from "./src/components/modal/ShareQrModalContainer"; -import AppDownloadBanner from "./src/components/AppDownloadBanner"; -import MobileSplashVideo from "./src/components/MobileSplashVideo"; -import "./src/utils/Sheet"; +import { LogBox } from 'react-native' +import CommentsBottomSheet from './src/components/bottomsheets/CommentsBottomSheet' +import ShareQrModalContainer from './src/components/modal/ShareQrModalContainer' +import AppDownloadBanner from './src/components/AppDownloadBanner' +import MobileSplashVideo from './src/components/MobileSplashVideo' +import './src/utils/Sheet' -console.disableYellowBox = true; -console.reportErrorsAsExceptions = false; +console.disableYellowBox = true +console.reportErrorsAsExceptions = false -moment.locale("fr"); +moment.locale('fr') // Keep typography stable regardless of the user's system font scaling on mobile -if (Platform.OS !== "web") { +if (Platform.OS !== 'web') { if (Text.defaultProps == null) { - Text.defaultProps = {}; + Text.defaultProps = {} } if (TextInput.defaultProps == null) { - TextInput.defaultProps = {}; + TextInput.defaultProps = {} } - Text.defaultProps.allowFontScaling = false; - TextInput.defaultProps.allowFontScaling = false; + Text.defaultProps.allowFontScaling = false + TextInput.defaultProps.allowFontScaling = false } -setGlobal(initialGlobalState); +setGlobal(initialGlobalState) -SplashScreen.preventAutoHideAsync(); +SplashScreen.preventAutoHideAsync() const App = () => { - const [, setCurrentUID] = useGlobal("currentUID"); - const [, setCurrentUserRoles] = useGlobal("currentUserRoles"); + const [, setCurrentUID] = useGlobal('currentUID') + const [, setCurrentUserRoles] = useGlobal('currentUserRoles') - const [appIsReady, setAppIsReady] = useState(false); + const [appIsReady, setAppIsReady] = useState(false) - const [isInitializing, setInitializing] = useState(true); + const [isInitializing, setInitializing] = useState(true) - const routeNameRef = React.useRef(null); + const routeNameRef = React.useRef(null) const syncActiveRoute = useCallback(() => { - const currentRoute = navigationRef.current?.getCurrentRoute(); - const currentName = currentRoute?.name ?? null; + const currentRoute = navigationRef.current?.getCurrentRoute() + const currentName = currentRoute?.name ?? null if (routeNameRef.current !== currentName) { - routeNameRef.current = currentName; - setGlobal({ activeRouteName: currentName }); + routeNameRef.current = currentName + setGlobal({ activeRouteName: currentName }) } - }, [setGlobal]); + }, [setGlobal]) const handleNavigationReady = useCallback(() => { - syncActiveRoute(); - }, [syncActiveRoute]); + syncActiveRoute() + }, [syncActiveRoute]) const handleNavigationStateChange = useCallback(() => { - syncActiveRoute(); - }, [syncActiveRoute]); + syncActiveRoute() + }, [syncActiveRoute]) const [loaded] = useFonts({ - NewYorkSemibold: require("./src/assets/fonts/NewYork-Semibold.ttf"), - OpenSansRegular: require("./src/assets/fonts/OpenSans-Regular.ttf"), + NewYorkSemibold: require('./src/assets/fonts/NewYork-Semibold.ttf'), + OpenSansRegular: require('./src/assets/fonts/OpenSans-Regular.ttf'), InterRegular: Inter_400Regular, InterMedium: Inter_500Medium, InterSemiBold: Inter_600SemiBold, InterBold: Inter_700Bold, InterRegularItalic: Inter_400Regular_Italic, - HelveticaNeueRegular: require("./src/assets/fonts/HelveticaNeueRegular.ttf"), - HelveticaNeueMedium: require("./src/assets/fonts/HelveticaNeueMedium.ttf"), - HelveticaNeueBold: require("./src/assets/fonts/HelveticaNeueBold.ttf"), - OwnersRegular: require("./src/assets/fonts/OwnersRegular.ttf"), - OwnersMedium: require("./src/assets/fonts/OwnersMedium.ttf"), - OwnersBold: require("./src/assets/fonts/OwnersBold.ttf"), - }); + HelveticaNeueRegular: require('./src/assets/fonts/HelveticaNeueRegular.ttf'), + HelveticaNeueMedium: require('./src/assets/fonts/HelveticaNeueMedium.ttf'), + HelveticaNeueBold: require('./src/assets/fonts/HelveticaNeueBold.ttf'), + OwnersRegular: require('./src/assets/fonts/OwnersRegular.ttf'), + OwnersMedium: require('./src/assets/fonts/OwnersMedium.ttf'), + OwnersBold: require('./src/assets/fonts/OwnersBold.ttf'), + }) useEffect(() => { if (loaded) { - setAppIsReady(true); - LogBox.ignoreAllLogs(); + setAppIsReady(true) + LogBox.ignoreAllLogs() } - }, [loaded]); + }, [loaded]) const onLayoutRootView = useCallback(async () => { if (appIsReady) { - await SplashScreen.hideAsync(); + await SplashScreen.hideAsync() } - }, [appIsReady, loaded]); + }, [appIsReady, loaded]) useEffect(() => { - const subscriber = firebase.auth().onAuthStateChanged(onAuthStateChanged); - return subscriber; - }, []); + const subscriber = firebase.auth().onAuthStateChanged(onAuthStateChanged) + return subscriber + }, []) useEffect(() => { - if (Platform.OS === "web") { - const s = document.createElement("script"); - s.src = "https://minuit.app/embed/report-a-problem.js"; - s.async = true; - s.setAttribute("data-project-id", "playbackproduction"); - s.setAttribute("data-position", "right"); - s.setAttribute("data-offset", "16"); - s.setAttribute("data-primary-color", "#FB68A8"); - s.setAttribute("data-bg-primary-color", "#0E0E12"); - s.setAttribute("data-bg-secondary-color", "#1D1825"); - s.setAttribute("data-text-color", "#F3F0F5"); + if (Platform.OS === 'web') { + const s = document.createElement('script') + s.src = 'https://minuit.app/embed/report-a-problem.js' + s.async = true + s.setAttribute('data-project-id', 'playbackproduction') + s.setAttribute('data-position', 'right') + s.setAttribute('data-offset', '16') + s.setAttribute('data-primary-color', '#FB68A8') + s.setAttribute('data-bg-primary-color', '#0E0E12') + s.setAttribute('data-bg-secondary-color', '#1D1825') + s.setAttribute('data-text-color', '#F3F0F5') - document.body.appendChild(s); + document.body.appendChild(s) return () => { try { - s.remove(); - } catch (_) { } - }; + s.remove() + } catch (_) {} + } } - }, []); + }, []) const onAuthStateChanged = async (user) => { if (isInitializing) { - setInitializing(false); + setInitializing(false) } if (user?.uid) { - setCurrentUID(user.uid); + setCurrentUID(user.uid) - const idTokenResult = await user.getIdTokenResult(); - setCurrentUserRoles(idTokenResult?.claims?.roles || []); + const idTokenResult = await user.getIdTokenResult() + setCurrentUserRoles(idTokenResult?.claims?.roles || []) } else { - setCurrentUID(null); - setGlobal(initialGlobalState); + setCurrentUID(null) + setGlobal(initialGlobalState) reset({ index: 0, routes: [{ name: Routes.Splash }], - }); + }) } - }; + } if (!loaded || isInitializing) { - return null; + return null } return ( <> @@ -177,8 +171,7 @@ const App = () => { style={[ { flex: 1, - backgroundColor: - Platform.OS === "web" ? "transparent" : Palette.darkPurple, + backgroundColor: Platform.OS === 'web' ? 'transparent' : Palette.darkPurple, }, ]} > @@ -191,10 +184,7 @@ const App = () => { ...DefaultTheme, colors: { ...DefaultTheme.colors, - background: - Platform.OS === "web" - ? "transparent" - : Palette.darkPurple, + background: Platform.OS === 'web' ? 'transparent' : Palette.darkPurple, }, }} ref={navigationRef} @@ -202,12 +192,10 @@ const App = () => { onStateChange={handleNavigationStateChange} documentTitle={{ formatter: (options) => - options?.title - ? `${options?.title} - MusicLand` - : "MusicLand", + options?.title ? `${options?.title} - MusicLand` : 'MusicLand', }} linking={{ - prefixes: ["musicland://", "https://musicland-one.vercel.app"], + prefixes: ['musicland://', 'https://musicland-one.vercel.app'], config: { screens: { // Add any deep link configurations here if needed @@ -227,7 +215,7 @@ const App = () => { > - ); -}; + ) +} -export default App; +export default App diff --git a/babel.config.js b/babel.config.js index 305e0b7..b75bdec 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,10 +1,7 @@ module.exports = function (api) { - api.cache(true); + api.cache(true) return { - presets: ["babel-preset-expo"], - plugins: [ - "@babel/plugin-proposal-export-namespace-from", - "react-native-reanimated/plugin", - ], - }; -}; \ No newline at end of file + presets: ['babel-preset-expo'], + plugins: ['@babel/plugin-proposal-export-namespace-from', 'react-native-reanimated/plugin'], + } +} diff --git a/cleanProject.js b/cleanProject.js index ee02034..37a01a1 100644 --- a/cleanProject.js +++ b/cleanProject.js @@ -1,69 +1,69 @@ -const fs = require("fs"); -const path = require("path"); -const parser = require("@babel/parser"); -const traverse = require("@babel/traverse").default; +const fs = require('fs') +const path = require('path') +const parser = require('@babel/parser') +const traverse = require('@babel/traverse').default -const entryFile = path.resolve(__dirname, "index.js"); -const srcDir = path.resolve(__dirname, "src"); +const entryFile = path.resolve(__dirname, 'index.js') +const srcDir = path.resolve(__dirname, 'src') // Extensions de fichiers à analyser -const scriptExtensions = [".js", ".jsx", ".ts", ".tsx", ".web.js"]; -const imageExtensions = [".png", ".jpg", ".jpeg", ".gif", ".svg"]; +const scriptExtensions = ['.js', '.jsx', '.ts', '.tsx', '.web.js'] +const imageExtensions = ['.png', '.jpg', '.jpeg', '.gif', '.svg'] // Fonction pour obtenir tous les fichiers dans un dossier avec des extensions spécifiques function getAllFiles(dir, extensions, fileList = []) { - const files = fs.readdirSync(dir); + const files = fs.readdirSync(dir) files.forEach(function (file) { - const filePath = path.join(dir, file); - const stat = fs.statSync(filePath); + const filePath = path.join(dir, file) + const stat = fs.statSync(filePath) if (stat.isDirectory()) { - getAllFiles(filePath, extensions, fileList); + getAllFiles(filePath, extensions, fileList) } else if (extensions.includes(path.extname(file))) { - fileList.push(filePath); + fileList.push(filePath) } - }); - return fileList; + }) + return fileList } // Vérifie si un chemin est un fichier valide function isValidFile(filePath) { - return fs.existsSync(filePath) && fs.statSync(filePath).isFile(); + return fs.existsSync(filePath) && fs.statSync(filePath).isFile() } // Résout le chemin de l'import en un fichier valide function resolveImport(filePath, importPath) { - let importedFile = path.resolve(path.dirname(filePath), importPath); + let importedFile = path.resolve(path.dirname(filePath), importPath) // Liste des extensions à tester, y compris .web.js - const allExtensions = scriptExtensions; + const allExtensions = scriptExtensions // Si le chemin n'a pas d'extension, essayer avec différentes extensions if (!path.extname(importedFile)) { for (const ext of allExtensions) { if (isValidFile(importedFile + ext)) { - return importedFile + ext; + return importedFile + ext } } } // Si un fichier avec l'extension actuelle existe, le retourner if (isValidFile(importedFile)) { - return importedFile; + return importedFile } // Si le chemin est un répertoire, chercher un index avec les extensions if (fs.existsSync(importedFile) && fs.statSync(importedFile).isDirectory()) { - const indexFiles = allExtensions.map((ext) => "index" + ext); + const indexFiles = allExtensions.map((ext) => 'index' + ext) for (const indexFile of indexFiles) { - const indexFilePath = path.join(importedFile, indexFile); + const indexFilePath = path.join(importedFile, indexFile) if (isValidFile(indexFilePath)) { - return indexFilePath; + return indexFilePath } } } // Aucun fichier valide trouvé - return null; + return null } // Analyse des fichiers pour trouver les imports @@ -74,178 +74,136 @@ function getDependencies( usedFiles = new Set(), usedAssets = new Set() ) { - if (visitedFiles.has(filePath)) - return { usedDependencies, usedFiles, usedAssets }; - visitedFiles.add(filePath); - usedFiles.add(filePath); + if (visitedFiles.has(filePath)) return { usedDependencies, usedFiles, usedAssets } + visitedFiles.add(filePath) + usedFiles.add(filePath) - const content = fs.readFileSync(filePath, "utf-8"); - let ast; + const content = fs.readFileSync(filePath, 'utf-8') + let ast try { ast = parser.parse(content, { - sourceType: "module", - plugins: ["jsx", "typescript", "classProperties", "dynamicImport"], - }); + sourceType: 'module', + plugins: ['jsx', 'typescript', 'classProperties', 'dynamicImport'], + }) } catch (error) { - console.error(`Erreur lors de l'analyse du fichier ${filePath}:`, error); - return { usedDependencies, usedFiles, usedAssets }; + console.error(`Erreur lors de l'analyse du fichier ${filePath}:`, error) + return { usedDependencies, usedFiles, usedAssets } } traverse(ast, { ImportDeclaration({ node }) { - const importPath = node.source.value; - handleImport( - filePath, - importPath, - visitedFiles, - usedDependencies, - usedFiles, - usedAssets - ); + const importPath = node.source.value + handleImport(filePath, importPath, visitedFiles, usedDependencies, usedFiles, usedAssets) }, CallExpression({ node }) { if ( - node.callee.type === "Import" || - (node.callee.name === "require" && node.arguments.length) + node.callee.type === 'Import' || + (node.callee.name === 'require' && node.arguments.length) ) { - const importArg = node.arguments[0]; - if (importArg && importArg.type === "StringLiteral") { - const importPath = importArg.value; - handleImport( - filePath, - importPath, - visitedFiles, - usedDependencies, - usedFiles, - usedAssets - ); + const importArg = node.arguments[0] + if (importArg && importArg.type === 'StringLiteral') { + const importPath = importArg.value + handleImport(filePath, importPath, visitedFiles, usedDependencies, usedFiles, usedAssets) } } }, - }); + }) // Vérifier si un fichier .web.js correspondant existe - if (filePath.endsWith(".js")) { - const webFilePath = filePath.replace(/\.js$/, ".web.js"); + if (filePath.endsWith('.js')) { + const webFilePath = filePath.replace(/\.js$/, '.web.js') if (isValidFile(webFilePath)) { - getDependencies( - webFilePath, - visitedFiles, - usedDependencies, - usedFiles, - usedAssets - ); + getDependencies(webFilePath, visitedFiles, usedDependencies, usedFiles, usedAssets) } } - return { usedDependencies, usedFiles, usedAssets }; + return { usedDependencies, usedFiles, usedAssets } } // Fonction pour gérer les imports -function handleImport( - filePath, - importPath, - visitedFiles, - usedDependencies, - usedFiles, - usedAssets -) { - if (importPath.startsWith(".")) { +function handleImport(filePath, importPath, visitedFiles, usedDependencies, usedFiles, usedAssets) { + if (importPath.startsWith('.')) { // Chemin relatif - const resolvedPath = resolveImport(filePath, importPath); + const resolvedPath = resolveImport(filePath, importPath) if (resolvedPath) { - const ext = path.extname(resolvedPath); + const ext = path.extname(resolvedPath) if (scriptExtensions.includes(ext)) { - getDependencies( - resolvedPath, - visitedFiles, - usedDependencies, - usedFiles, - usedAssets - ); + getDependencies(resolvedPath, visitedFiles, usedDependencies, usedFiles, usedAssets) } else if (imageExtensions.includes(ext)) { - usedAssets.add(resolvedPath); + usedAssets.add(resolvedPath) } } } else { // Dépendance de node_modules - const dep = importPath.split("/")[0]; - usedDependencies.add(dep); + const dep = importPath.split('/')[0] + usedDependencies.add(dep) } } -(async () => { +;(async () => { // Étape 1: Obtenir tous les fichiers utilisés - const allScriptFiles = getAllFiles(srcDir, scriptExtensions); - const allAssetFiles = getAllFiles(srcDir, imageExtensions); + const allScriptFiles = getAllFiles(srcDir, scriptExtensions) + const allAssetFiles = getAllFiles(srcDir, imageExtensions) - const { usedDependencies, usedFiles, usedAssets } = - getDependencies(entryFile); + const { usedDependencies, usedFiles, usedAssets } = getDependencies(entryFile) // Étape 2: Supprimer les fichiers scripts inutilisés - const unusedScriptFiles = allScriptFiles.filter( - (file) => !usedFiles.has(file) - ); + const unusedScriptFiles = allScriptFiles.filter((file) => !usedFiles.has(file)) unusedScriptFiles.forEach((file) => { - fs.unlinkSync(file); - console.log(`Fichier script supprimé: ${file}`); - }); + fs.unlinkSync(file) + console.log(`Fichier script supprimé: ${file}`) + }) // Étape 3: Supprimer les images non utilisées - const unusedAssetFiles = allAssetFiles.filter( - (file) => !usedAssets.has(file) - ); + const unusedAssetFiles = allAssetFiles.filter((file) => !usedAssets.has(file)) unusedAssetFiles.forEach((file) => { - fs.unlinkSync(file); - console.log(`Fichier image supprimé: ${file}`); - }); + fs.unlinkSync(file) + console.log(`Fichier image supprimé: ${file}`) + }) // Étape 4: Optimiser les images utilisées sans perte de qualité async function optimizeImages(usedAssets) { // Import dynamique des modules ES - const imagemin = (await import("imagemin")).default; - const imageminOptipng = (await import("imagemin-optipng")).default; - const imageminJpegtran = (await import("imagemin-jpegtran")).default; - const imageminGifsicle = (await import("imagemin-gifsicle")).default; - const imageminSvgo = (await import("imagemin-svgo")).default; + const imagemin = (await import('imagemin')).default + const imageminOptipng = (await import('imagemin-optipng')).default + const imageminJpegtran = (await import('imagemin-jpegtran')).default + const imageminGifsicle = (await import('imagemin-gifsicle')).default + const imageminSvgo = (await import('imagemin-svgo')).default for (const file of usedAssets) { - const ext = path.extname(file).toLowerCase(); - const plugins = []; + const ext = path.extname(file).toLowerCase() + const plugins = [] - if (ext === ".png") { - plugins.push(imageminOptipng({ optimizationLevel: 3 })); - } else if (ext === ".jpg" || ext === ".jpeg") { - plugins.push(imageminJpegtran({ progressive: true })); - } else if (ext === ".gif") { - plugins.push(imageminGifsicle({ optimizationLevel: 3 })); - } else if (ext === ".svg") { - plugins.push(imageminSvgo()); + if (ext === '.png') { + plugins.push(imageminOptipng({ optimizationLevel: 3 })) + } else if (ext === '.jpg' || ext === '.jpeg') { + plugins.push(imageminJpegtran({ progressive: true })) + } else if (ext === '.gif') { + plugins.push(imageminGifsicle({ optimizationLevel: 3 })) + } else if (ext === '.svg') { + plugins.push(imageminSvgo()) } else { - continue; + continue } try { const optimized = await imagemin([file], { destination: path.dirname(file), plugins: plugins, - }); + }) if (optimized && optimized.length > 0) { - console.log(`Image optimisée: ${file}`); + console.log(`Image optimisée: ${file}`) } else { - console.log(`Image déjà optimisée ou non optimisable: ${file}`); + console.log(`Image déjà optimisée ou non optimisable: ${file}`) } } catch (error) { - console.error( - `Erreur lors de l'optimisation de l'image ${file}:`, - error - ); + console.error(`Erreur lors de l'optimisation de l'image ${file}:`, error) } } } - await optimizeImages(usedAssets); -})(); + await optimizeImages(usedAssets) +})() diff --git a/functions/config/keys.js b/functions/config/keys.js index dc5bd77..e54df06 100644 --- a/functions/config/keys.js +++ b/functions/config/keys.js @@ -1,10 +1,10 @@ -exports.GEMINI_API_KEY = "AIzaSyBoPQC5ZaMKP73TlKGpZQp1mAw8ArHiH9Y"; +exports.GEMINI_API_KEY = 'AIzaSyBoPQC5ZaMKP73TlKGpZQp1mAw8ArHiH9Y' -exports.SUNO_API_KEY = "c1636e04f606811511e19ec6e1545aa6"; // api key +exports.SUNO_API_KEY = 'c1636e04f606811511e19ec6e1545aa6' // api key -exports.RESEND_API_KEY = "re_NLcHmYiz_4LoFrzvPBbShNQBgNGTQmBbu"; +exports.RESEND_API_KEY = 're_NLcHmYiz_4LoFrzvPBbShNQBgNGTQmBbu' exports.STRIPE_SECRET_KEY = - "sk_test_51SPfcjCzf2o5bDRdUFGNrQYIE271EDfS2Ucn31f98Ublttcl1EBNRoOoJX1RfXXzHp7mKRGrIlCG24biiqUZ2YMh00s9WODluu"; -exports.STRIPE_WEBHOOK_SECRET = "whsec_pDrvXVjjMuZjtsnRaFVJrDmKO5QEtNkW"; -exports.STRIPE_RETURN_URL = ""; + 'sk_test_51SPfcjCzf2o5bDRdUFGNrQYIE271EDfS2Ucn31f98Ublttcl1EBNRoOoJX1RfXXzHp7mKRGrIlCG24biiqUZ2YMh00s9WODluu' +exports.STRIPE_WEBHOOK_SECRET = 'whsec_pDrvXVjjMuZjtsnRaFVJrDmKO5QEtNkW' +exports.STRIPE_RETURN_URL = '' diff --git a/functions/config/suno.js b/functions/config/suno.js index 5cb402c..a0b9e04 100644 --- a/functions/config/suno.js +++ b/functions/config/suno.js @@ -1,8 +1,7 @@ -exports.SUNO_API_BASE = "https://api.sunoapi.org"; -exports.SUNO_API_PATH = "/api/v1/generate"; -exports.SUNO_STATUS_PATH = "/api/v1/generate/record-info"; -exports.SUNO_TIMESTAMPED_LYRICS_PATH = - "/api/v1/generate/get-timestamped-lyrics"; -exports.SUNO_MODEL = "V5"; +exports.SUNO_API_BASE = 'https://api.sunoapi.org' +exports.SUNO_API_PATH = '/api/v1/generate' +exports.SUNO_STATUS_PATH = '/api/v1/generate/record-info' +exports.SUNO_TIMESTAMPED_LYRICS_PATH = '/api/v1/generate/get-timestamped-lyrics' +exports.SUNO_MODEL = 'V5' exports.SUNO_CALLBACK_URL = - "https://us-central1-musicland-d33f9.cloudfunctions.net/music-sunoCallback"; + 'https://us-central1-musicland-d33f9.cloudfunctions.net/music-sunoCallback' diff --git a/functions/config/types.js b/functions/config/types.js index 53eed69..17e6cc4 100644 --- a/functions/config/types.js +++ b/functions/config/types.js @@ -1,5 +1,5 @@ exports.BATCH_TYPE = { - ADD: "ADD", - UPDATE: "UPDATE", - DELETE: "DELETE", -}; + ADD: 'ADD', + UPDATE: 'UPDATE', + DELETE: 'DELETE', +} diff --git a/functions/helpers/email.js b/functions/helpers/email.js index 8617609..3934669 100644 --- a/functions/helpers/email.js +++ b/functions/helpers/email.js @@ -1,18 +1,17 @@ -const fs = require("fs"); -const path = require("path"); +const fs = require('fs') +const path = require('path') -const musicLandLogoBase64 = fs.readFileSync( - path.join(__dirname, "../assets/musicLandLogo.png"), - { encoding: "base64" }, -); -const musicLandLogoSrc = `data:image/png;base64,${musicLandLogoBase64}`; +const musicLandLogoBase64 = fs.readFileSync(path.join(__dirname, '../assets/musicLandLogo.png'), { + encoding: 'base64', +}) +const musicLandLogoSrc = `data:image/png;base64,${musicLandLogoBase64}` -function basicTemplate({ title = "", content = "", button = null }) { +function basicTemplate({ title = '', content = '', button = null }) { const btn = button?.url ? `
${ - button?.label || "Ouvrir" + button?.label || 'Ouvrir' }
` - : ""; + : '' return ` @@ -50,12 +49,12 @@ function basicTemplate({ title = "", content = "", button = null }) { - `; +