diff --git a/App.js b/App.js index 80fad04..8eca2ee 100644 --- a/App.js +++ b/App.js @@ -27,6 +27,7 @@ import Providers from "./src/providers"; import AppLayout from "./src/layouts/AppLayout"; import { Inter_400Regular, + Inter_400Regular_Italic, Inter_500Medium, Inter_600SemiBold, Inter_700Bold, @@ -56,6 +57,7 @@ const App = () => { InterMedium: Inter_500Medium, InterSemiBold: Inter_600SemiBold, InterBold: Inter_700Bold, + InterRegularItalic: Inter_400Regular_Italic, }); useEffect(() => { diff --git a/package.json b/package.json index 4a5eb0e..425dd09 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,7 @@ "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", "react-native-web": "~0.19.6", "react-native-web-linear-gradient": "^1.1.2", "react-native-webview": "13.12.5", diff --git a/src/components/BorderGradient/BorderGradient.js b/src/components/BorderGradient/BorderGradient.js index 44197ec..a7c5d23 100644 --- a/src/components/BorderGradient/BorderGradient.js +++ b/src/components/BorderGradient/BorderGradient.js @@ -2,19 +2,31 @@ import { StyleSheet, View } from "react-native"; import { GradientBorderView } from "../GradientBorderView"; -const BorderGradient = ({ children, gradientProps, ...props }) => { +const BorderGradient = ({ + children, + contentContainerStyle, + gradientProps, + ...props +}) => { return ( - - {children} - ); - + {...props} + > + + {children} + + + ); }; export default BorderGradient; @@ -22,5 +34,5 @@ export default BorderGradient; const styles = StyleSheet.create({ innerContainer: { flex: 1, - } -}); \ No newline at end of file + }, +}); diff --git a/src/components/MusicLandHeader.js b/src/components/MusicLandHeader.js index 38ab935..aad6577 100644 --- a/src/components/MusicLandHeader.js +++ b/src/components/MusicLandHeader.js @@ -5,7 +5,12 @@ import { Palette, Style } from "../styles"; import ProgressBar from "./ProgressBar"; import { FONT_FAMILY } from "../styles/Fonts"; -const MusicLandHeader = ({ onPressBack, onPressSkip, showSkip = false }) => { +const MusicLandHeader = ({ + onPressBack, + onPressSkip, + showSkip = false, + progress = 1, +}) => { return ( @@ -21,7 +26,7 @@ const MusicLandHeader = ({ onPressBack, onPressSkip, showSkip = false }) => { /> - + {showSkip && ( diff --git a/src/data/data.js b/src/data/data.js new file mode 100644 index 0000000..05d03a0 --- /dev/null +++ b/src/data/data.js @@ -0,0 +1,9 @@ +export const GOALS = [ + "Envoyer un message universel", + "Souhaiter un joyeux anniversaire à un ami", + "Déclaration d'amour", + "Pour mon club sportif", + "Pour un mariage", + "Pour mon entreprise", + "Envoyer un message politique", +]; diff --git a/src/navigation/MainStack.js b/src/navigation/MainStack.js index af1b8f1..c9ddd0a 100644 --- a/src/navigation/MainStack.js +++ b/src/navigation/MainStack.js @@ -17,6 +17,7 @@ import TermsOfUse from "../screens/TermsOfUse"; import PrivacyPolicy from "../screens/PrivacyPolicy"; import Writing from "../screens/Writing/Writing"; import WritingLyrics from "../screens/Writing/WritingLyrics"; +import CreateLyricsWithAi from "../screens/Writing/CreateLyricsWithAi"; const screenOptions = { headerShown: false, @@ -68,6 +69,11 @@ const screens = [ name: Routes.WritingLyrics, component: WritingLyrics, }, + + { + name: Routes.CreateLyricsWithAi, + component: CreateLyricsWithAi, + }, ]; export default function Main() { diff --git a/src/navigation/Routes.js b/src/navigation/Routes.js index 7a0443e..f4fb077 100644 --- a/src/navigation/Routes.js +++ b/src/navigation/Routes.js @@ -25,4 +25,5 @@ export const Routes = { Writing: "Writing", WritingLyrics: "WritingLyrics", + CreateLyricsWithAi: "CreateLyricsWithAi", }; diff --git a/src/screens/Splash.js b/src/screens/Splash.js index 9951ecf..a4f802c 100644 --- a/src/screens/Splash.js +++ b/src/screens/Splash.js @@ -51,7 +51,7 @@ export default ({ navigation }) => { index: 0, routes: [ { - name: isDesktop || isWeb ? Routes.Login : Routes.Onboarding, + name: Routes.Onboarding, }, ], }); diff --git a/src/screens/Writing/CreateLyricsWithAi.js b/src/screens/Writing/CreateLyricsWithAi.js new file mode 100644 index 0000000..3e91709 --- /dev/null +++ b/src/screens/Writing/CreateLyricsWithAi.js @@ -0,0 +1,88 @@ +import { View, Text, ScrollView, Dimensions } from "react-native"; +import React, { useRef, useState } from "react"; +import Page from "../../layouts/Page"; +import MusicLandHeader from "../../components/MusicLandHeader"; +import CreateLyricsHeader from "./components/CreateLyricsHeader"; +import GradientButton from "../../components/GradientButton"; +import { gutters } from "../../styles"; +import { SwiperFlatList } from "react-native-swiper-flatlist"; +import Goals from "./Goals"; +import { goBack } from "../../navigation/NavigationService"; +import SpecificityContext from "./SpecificityContext"; +import EmotionConvey from "./EmotionConvey"; + +const { width } = Dimensions.get("window"); + +const CreateLyricsWithAi = () => { + const scrollRef = useRef(null); + const [selectedIndex, setSelectedIndex] = useState(0); + const [progress, setProgress] = useState(8); + + const onPressNext = () => { + setSelectedIndex(selectedIndex + 1); + setProgress(progress + 8); + scrollRef.current.scrollToIndex({ + index: selectedIndex + 1, + animated: true, + }); + }; + + const onPressBack = () => { + if (selectedIndex > 0) { + setSelectedIndex(selectedIndex - 1); + setProgress(progress - 8); + scrollRef.current.scrollToIndex({ + index: selectedIndex - 1, + animated: true, + }); + } else { + goBack(); + } + }; + + return ( + + + + + + + + + + + + + + + + + + + + ); +}; + +export default CreateLyricsWithAi; diff --git a/src/screens/Writing/EmotionConvey.js b/src/screens/Writing/EmotionConvey.js new file mode 100644 index 0000000..02a9ca4 --- /dev/null +++ b/src/screens/Writing/EmotionConvey.js @@ -0,0 +1,104 @@ +import { View, Text, StyleSheet, FlatList } from "react-native"; +import React, { useState } from "react"; +import CreateLyricsHeader from "./components/CreateLyricsHeader"; +import BorderGradient from "../../components/BorderGradient/BorderGradient"; +import { responsiveHeight } from "react-native-responsive-dimensions"; +import { BlurView } from "expo-blur"; +import { Palette } from "../../styles"; +import { FONT_FAMILY } from "../../styles/Fonts"; + +const EmotionConvey = () => { + const [itemLayout, setItemLayout] = useState([]); + + console.log("itemLayout: ", itemLayout); + + return ( + + + + + + ( + + + { + e.persist(); + setItemLayout((prev) => [...prev, e.nativeEvent.layout]); + }} + > + + + + La Joie + {" "} + : expose un bonheur profond, l'émerveillement, la + gratitude, satisfaction intense, énergie positive. + + + + + )} + /> + + + + + ); +}; + +export default EmotionConvey; + +const styles = StyleSheet.create({ + borderGradientStyle: { + borderWidth: 1, + borderRadius: 20, + height: responsiveHeight(55), + shadowColor: "#000", + shadowOffset: { + width: 0, + height: 2, + }, + shadowOpacity: 0.25, + shadowRadius: 3.84, + elevation: 100, + }, + blurContainer: { + flex: 1, + borderRadius: 20, + overflow: "hidden", + zIndex: 1, + }, +}); diff --git a/src/screens/Writing/Goals.js b/src/screens/Writing/Goals.js new file mode 100644 index 0000000..42085e8 --- /dev/null +++ b/src/screens/Writing/Goals.js @@ -0,0 +1,105 @@ +import { View, Text, FlatList, StyleSheet, Pressable } from "react-native"; +import React from "react"; +import CreateLyricsHeader from "./components/CreateLyricsHeader"; +import BorderGradient from "../../components/BorderGradient/BorderGradient"; +import { Palette, Style } from "../../styles"; +import { BlurView } from "expo-blur"; +import { GOALS } from "../../data/data"; +import { FONT_FAMILY } from "../../styles/Fonts"; +import CustomInput from "./components/CustomInput"; +import { responsiveHeight } from "react-native-responsive-dimensions"; + +const Goals = () => { + return ( + + + + + + + ( + + + {item} + + + )} + /> + + + + + + + ); +}; + +export default Goals; + +const styles = StyleSheet.create({ + borderGradientStyle: { + borderWidth: 1, + borderRadius: 20, + height: responsiveHeight(40), + shadowColor: "#000", + shadowOffset: { + width: 0, + height: 2, + }, + shadowOpacity: 0.25, + shadowRadius: 3.84, + elevation: 100, + }, + blurContainer: { + flex: 1, + borderRadius: 20, + overflow: "hidden", + zIndex: 1, + }, + contentContainer: { + flexGrow: 1, + padding: 8, + gap: 10, + backgroundColor: "#FFFFFF00", + paddingBottom: 100, + }, + itemContainer: { + height: 54, + backgroundColor: Palette.glass, + borderRadius: 14, + overflow: "hidden", + shadowColor: "#00000040", + shadowOffset: { + width: 0, + height: 2, + }, + shadowOpacity: 0.25, + shadowRadius: 3.84, + + elevation: 5, + }, + itemText: { + fontSize: 16, + color: Palette.white, + fontFamily: FONT_FAMILY.InterRegular, + }, +}); diff --git a/src/screens/Writing/SpecificityContext.js b/src/screens/Writing/SpecificityContext.js new file mode 100644 index 0000000..9c7a77c --- /dev/null +++ b/src/screens/Writing/SpecificityContext.js @@ -0,0 +1,19 @@ +import { View, Text } from "react-native"; +import React from "react"; +import CreateLyricsHeader from "./components/CreateLyricsHeader"; +import CustomInput from "./components/CustomInput"; +import { gutters } from "../../styles"; + +const SpecificityContext = () => { + return ( + + + + + ); +}; + +export default SpecificityContext; diff --git a/src/screens/Writing/WritingLyrics.js b/src/screens/Writing/WritingLyrics.js index 702521c..739f104 100644 --- a/src/screens/Writing/WritingLyrics.js +++ b/src/screens/Writing/WritingLyrics.js @@ -6,7 +6,8 @@ import GradientButton from "../../components/GradientButton"; import { gutters } from "../../styles"; import BorderGradientButton from "../../components/BorderGradientButton"; import MusicLandHeader from "../../components/MusicLandHeader"; -import { goBack } from "../../navigation/NavigationService"; +import { goBack, navigate } from "../../navigation/NavigationService"; +import { Routes } from "../../navigation"; const WritingLyrics = () => { return ( @@ -24,7 +25,10 @@ const WritingLyrics = () => { }} > - + navigate(Routes.CreateLyricsWithAi)} + /> diff --git a/src/screens/Writing/components/CreateLyricsHeader.js b/src/screens/Writing/components/CreateLyricsHeader.js new file mode 100644 index 0000000..a8dbd9d --- /dev/null +++ b/src/screens/Writing/components/CreateLyricsHeader.js @@ -0,0 +1,69 @@ +import { View, Text } from "react-native"; +import React, { useState } from "react"; +import { BlurView } from "expo-blur"; +import BorderGradient from "../../../components/BorderGradient/BorderGradient"; +import { Palette } from "../../../styles"; +import { FONT_FAMILY } from "../../../styles/Fonts"; + +const CreateLyricsHeader = ({ title = "", subTitle = "", height = 45 }) => { + const [onLayout, setOnLayout] = useState(null); + + return ( + <> + + { + setOnLayout(event.nativeEvent.layout); + }} + > + + + {title} + + {subTitle && ( + + {subTitle} + + )} + + + + ); +}; + +export default CreateLyricsHeader; diff --git a/src/screens/Writing/components/CustomInput.js b/src/screens/Writing/components/CustomInput.js new file mode 100644 index 0000000..65f21f4 --- /dev/null +++ b/src/screens/Writing/components/CustomInput.js @@ -0,0 +1,52 @@ +import { View, Text, TextInput } from "react-native"; +import React from "react"; +import { Palette } from "../../../styles"; +import { FONT_FAMILY } from "../../../styles/Fonts"; + +const CustomInput = ({ + label = "", + placeholder = "", + value, + setValue, + height = 65, +}) => { + return ( + + {label && ( + + {label} + + )} + + + + + ); +}; + +export default CustomInput; diff --git a/src/styles/Fonts.js b/src/styles/Fonts.js index 37506d5..104cedb 100644 --- a/src/styles/Fonts.js +++ b/src/styles/Fonts.js @@ -35,6 +35,7 @@ export const FONT_FAMILY = { InterMedium: "InterMedium", InterSemiBold: "InterSemiBold", InterBold: "InterBold", + InterRegularItalic: "InterRegularItalic", }; const Fonts = ({ diff --git a/src/styles/Palette.js b/src/styles/Palette.js index 85b80d0..107552a 100644 --- a/src/styles/Palette.js +++ b/src/styles/Palette.js @@ -32,6 +32,9 @@ const Palette = { ultraLightBlack: "rgba(0, 0, 0, 0.6)", tran: "transparent", + + glass: "#73737324", + grayMid: "#8C8C8C", }; export default Palette; diff --git a/yarn.lock b/yarn.lock index 20f6d05..8fa8359 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7453,6 +7453,11 @@ react-native-swipe-gestures@^1.0.5: resolved "https://registry.yarnpkg.com/react-native-swipe-gestures/-/react-native-swipe-gestures-1.0.5.tgz#a172cb0f3e7478ccd681fd36b8bfbcdd098bde7c" integrity sha512-Ns7Bn9H/Tyw278+5SQx9oAblDZ7JixyzeOczcBK8dipQk2pD7Djkcfnf1nB/8RErAmMLL9iXgW0QHqiII8AhKw== +react-native-swiper-flatlist@^3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/react-native-swiper-flatlist/-/react-native-swiper-flatlist-3.2.5.tgz#d69030e2986b8a322ff274ad2896ca809c1ebe0e" + integrity sha512-pP6Yioo//PgxBf1Ac/utPaAMaCTXF0QW/Q55hQofGtE7B5/hL0nb9u4cXEdgGJslx0oBCkir4AJAbbD5FpWnaA== + react-native-web-linear-gradient@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/react-native-web-linear-gradient/-/react-native-web-linear-gradient-1.1.2.tgz#33f85f7085a0bb5ffa5106faf02ed105b92a9ed7"