diff --git a/App.js b/App.js index 05a9b7c..ff2c10d 100644 --- a/App.js +++ b/App.js @@ -61,6 +61,9 @@ const App = () => { 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(() => { diff --git a/package.json b/package.json index e04a687..26fc6e6 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "react-native-linear-gradient": "^2.8.3", "react-native-minuit": "^1.3.52", "react-native-reanimated": "~3.16.1", - "react-native-reanimated-carousel": "^4.0.0-alpha.8", + "react-native-reanimated-carousel": "^4.0.3", "react-native-responsive-dimensions": "^3.1.1", "react-native-safe-area-context": "4.12.0", "react-native-store-review": "^0.3.0", diff --git a/src/assets/UI/libraryBG.png b/src/assets/UI/libraryBG.png new file mode 100644 index 0000000..c6bfe46 Binary files /dev/null and b/src/assets/UI/libraryBG.png differ diff --git a/src/assets/UI/search.png b/src/assets/UI/search.png index 0489733..725f9e5 100644 Binary files a/src/assets/UI/search.png and b/src/assets/UI/search.png differ diff --git a/src/assets/UI/tabs/add.png b/src/assets/UI/tabs/add.png new file mode 100644 index 0000000..7ee16fd Binary files /dev/null and b/src/assets/UI/tabs/add.png differ diff --git a/src/assets/UI/tabs/albums.png b/src/assets/UI/tabs/albums.png new file mode 100644 index 0000000..604178c Binary files /dev/null and b/src/assets/UI/tabs/albums.png differ diff --git a/src/assets/UI/tabs/mic.png b/src/assets/UI/tabs/mic.png new file mode 100644 index 0000000..da65396 Binary files /dev/null and b/src/assets/UI/tabs/mic.png differ diff --git a/src/assets/UI/tabs/person.png b/src/assets/UI/tabs/person.png new file mode 100644 index 0000000..a008ec9 Binary files /dev/null and b/src/assets/UI/tabs/person.png differ diff --git a/src/assets/UI/tabs/ribbon.png b/src/assets/UI/tabs/ribbon.png new file mode 100644 index 0000000..7a6e266 Binary files /dev/null and b/src/assets/UI/tabs/ribbon.png differ diff --git a/src/assets/fonts/OwnersBold.ttf b/src/assets/fonts/OwnersBold.ttf new file mode 100644 index 0000000..e7e39eb Binary files /dev/null and b/src/assets/fonts/OwnersBold.ttf differ diff --git a/src/assets/fonts/OwnersMedium.ttf b/src/assets/fonts/OwnersMedium.ttf new file mode 100644 index 0000000..89eee92 Binary files /dev/null and b/src/assets/fonts/OwnersMedium.ttf differ diff --git a/src/assets/fonts/OwnersRegular.ttf b/src/assets/fonts/OwnersRegular.ttf new file mode 100644 index 0000000..b9b6623 Binary files /dev/null and b/src/assets/fonts/OwnersRegular.ttf differ diff --git a/src/assets/icons/heart.png b/src/assets/icons/heart.png new file mode 100644 index 0000000..0c59bc4 Binary files /dev/null and b/src/assets/icons/heart.png differ diff --git a/src/assets/icons/heartOutline.png b/src/assets/icons/heartOutline.png new file mode 100644 index 0000000..a749911 Binary files /dev/null and b/src/assets/icons/heartOutline.png differ diff --git a/src/assets/icons/more.png b/src/assets/icons/more.png new file mode 100644 index 0000000..7d21747 Binary files /dev/null and b/src/assets/icons/more.png differ diff --git a/src/assets/icons/musicLandLogo.png b/src/assets/icons/musicLandLogo.png index 57bc401..576a846 100644 Binary files a/src/assets/icons/musicLandLogo.png and b/src/assets/icons/musicLandLogo.png differ diff --git a/src/assets/index.js b/src/assets/index.js index 292d3b4..91d1b3b 100644 --- a/src/assets/index.js +++ b/src/assets/index.js @@ -4,6 +4,11 @@ import chat from "./UI/tabs/chat.png"; import design from "./UI/tabs/design.png"; import quotes from "./UI/tabs/quotes.png"; import settings from "./UI/tabs/settings.png"; +import addTab from "./UI/tabs/add.png"; +import albums from "./UI/tabs/albums.png"; +import ribbon from "./UI/tabs/ribbon.png"; +import mic from "./UI/tabs/mic.png"; +import person from "./UI/tabs/person.png"; export const tabs = { home, @@ -12,6 +17,11 @@ export const tabs = { quotes, chat, design, + addTab, + albums, + ribbon, + mic, + person, }; import bell from "./UI/bell.png"; @@ -66,6 +76,9 @@ import disk from "./icons/disk.png"; import stars from "./icons/stars.png"; import musicLandLogo from "./icons/musicLandLogo.png"; import close from "./icons/close.png"; +import heart from "./icons/heart.png"; +import heartOutline from "./icons/heartOutline.png"; +import more from "./icons/more.png"; export const icons = { bell, @@ -119,6 +132,9 @@ export const icons = { stars, musicLandLogo, close, + heart, + heartOutline, + more, }; import triangle from "./art/triangle.png"; @@ -169,6 +185,7 @@ import productionBG from "./UI/productionBG.png"; import productionBG2 from "./UI/productionBG2.png"; import playbackBG from "./UI/playbackBG.png"; import playbackBG2 from "./UI/playbackBG2.png"; +import libraryBG from "./UI/libraryBG.png"; export const background = { writingBG, @@ -178,6 +195,7 @@ export const background = { productionBG2, playbackBG, playbackBG2, + libraryBG, }; import nathalie from "./UI/nathalie.png"; diff --git a/src/components/ItemContainer/ItemContainer.js b/src/components/ItemContainer/ItemContainer.js index 3ac4544..e68151b 100644 --- a/src/components/ItemContainer/ItemContainer.js +++ b/src/components/ItemContainer/ItemContainer.js @@ -4,17 +4,24 @@ import BorderGradient from "../BorderGradient/BorderGradient"; import { BlurView } from "expo-blur"; import { responsiveHeight } from "react-native-responsive-dimensions"; -const ItemContainer = ({ height = responsiveHeight(40), children }) => { +const ItemContainer = ({ + height = responsiveHeight(40), + children, + gradientProps, + style, +}) => { return ( diff --git a/src/components/ItemContainer/ItemContainer.web.js b/src/components/ItemContainer/ItemContainer.web.js index fd5bf44..86b46cf 100644 --- a/src/components/ItemContainer/ItemContainer.web.js +++ b/src/components/ItemContainer/ItemContainer.web.js @@ -5,7 +5,12 @@ import { responsiveHeight } from "react-native-responsive-dimensions"; import { BlurView } from "expo-blur"; import { Style } from "../../styles"; -const ItemContainer = ({ height = responsiveHeight(40), children }) => { +const ItemContainer = ({ + height = responsiveHeight(40), + children, + gradientProps, + style, +}) => { const [containerLayout, setContainerLayout] = useState(null); return ( @@ -20,10 +25,12 @@ const ItemContainer = ({ height = responsiveHeight(40), children }) => { start: { x: 0.3, y: 0 }, end: { x: 1, y: 1 }, locations: [0, 1], + ...gradientProps, }} style={{ ...styles.borderGradientStyle, height: containerLayout?.height, + ...style, }} /> { return ( - + { + return ( + + + + + + + ); +}; + +export default SearchBar; diff --git a/src/data/data.js b/src/data/data.js index ff08dec..c25e94f 100644 --- a/src/data/data.js +++ b/src/data/data.js @@ -493,3 +493,12 @@ export const INSTRUMENTS = [ ]; export const RHYTHM = ["Très rapide", "Rapide", "Normal", "Lent", "Très lent"]; + +export const CHOOSE_DECOR = [ + "Plage", + "Café", + "Montagne", + "Rue", + "Jardin", + "Neige", +]; diff --git a/src/navigation/BottomTab.js b/src/navigation/BottomTab.js index 9d018ab..2dfc1be 100644 --- a/src/navigation/BottomTab.js +++ b/src/navigation/BottomTab.js @@ -17,6 +17,7 @@ import TabBar from "./TabBar"; import HomeStack from "./HomeStack"; import ChatStack from "./ChatStack"; import SettingsStack from "./SettingsStack"; +import Library from "../screens/Library/Library.js"; const bottomTabStyles = StyleSheet.create({ icon: { @@ -33,13 +34,13 @@ export const BottomTabScreen = () => { { return ( }> renderIcon(tabs.home, focused), + tabBarIcon: ({ focused }) => renderIcon(tabs.addTab, focused), }} /> renderIcon(tabs.chat, focused), + tabBarIcon: ({ focused }) => renderIcon(tabs.ribbon, focused), }} /> renderIcon(tabs.settings, focused), + tabBarIcon: ({ focused }) => renderIcon(tabs.mic, focused), + }} + /> + renderIcon(tabs.albums, focused), + }} + /> + renderIcon(tabs.person, focused), }} /> diff --git a/src/navigation/MainStack.js b/src/navigation/MainStack.js index 7f0184a..98dd45c 100644 --- a/src/navigation/MainStack.js +++ b/src/navigation/MainStack.js @@ -42,6 +42,9 @@ import PlaybackOnboarding from "../screens/Playback/PlaybackOnboarding"; import Playback from "../screens/Playback/Playback"; import RecordPlayback from "../screens/Playback/RecordPlayback"; import RecordedPlayback from "../screens/Playback/RecordedPlayback"; +import ChooseDecor from "../screens/Playback/ChooseDecor"; +import CreatingDecor from "../screens/Playback/CreatingDecor"; +import VideoFinalize from "../screens/Playback/VideoFinalize"; const screenOptions = { headerShown: false, @@ -193,6 +196,18 @@ const screens = [ name: Routes.RecordedPlayback, component: RecordedPlayback, }, + { + name: Routes.ChooseDecor, + component: ChooseDecor, + }, + { + name: Routes.CreatingDecor, + component: CreatingDecor, + }, + { + name: Routes.VideoFinalize, + component: VideoFinalize, + }, ]; export default function Main() { diff --git a/src/navigation/Routes.js b/src/navigation/Routes.js index d36f951..e5b248c 100644 --- a/src/navigation/Routes.js +++ b/src/navigation/Routes.js @@ -53,4 +53,13 @@ export const Routes = { Playback: "Playback", RecordPlayback: "RecordPlayback", RecordedPlayback: "RecordedPlayback", + ChooseDecor: "ChooseDecor", + CreatingDecor: "CreatingDecor", + VideoFinalize: "VideoFinalize", + + Create: "Create", + HitParade: "HitParade", + Playbacks: "Playbacks", + Library: "Library", + Profile: "Profile", }; diff --git a/src/navigation/TabBar.js b/src/navigation/TabBar.js index fab435e..e7c2fa5 100644 --- a/src/navigation/TabBar.js +++ b/src/navigation/TabBar.js @@ -1,9 +1,14 @@ import React from "react"; -import { View, TouchableOpacity } from "react-native"; +import { View, TouchableOpacity, Text } from "react-native"; import * as Haptics from "expo-haptics"; import { gutters, Palette, Style } from "../styles"; import useLayoutType from "../hooks/useLayoutType"; +import BorderGradient from "../components/BorderGradient/BorderGradient"; +import { colors } from "react-native-swiper-flatlist/src/themes"; +import { BlurView } from "expo-blur"; +import ItemContainer from "../components/ItemContainer/ItemContainer"; +import { FONT_FAMILY } from "../styles/Fonts"; const TabBar = ({ state = {}, descriptors = {}, navigation = {} }) => { const { isDesktop, windowWidth, mediumDesktopBreakpoint, isWeb } = @@ -14,70 +19,98 @@ const TabBar = ({ state = {}, descriptors = {}, navigation = {} }) => { style={{ position: "absolute", bottom: gutters * 2, - borderRadius: 500, - flexDirection: "row", - height: 60, - width: "60%", + width: "90%", alignSelf: "center", - maxWidth: isDesktop ? 200 : 220, - borderColor: Palette.ultraLightWhite, - borderWidth: 3, - paddingHorizontal: 1.2 * gutters, - backgroundColor: Palette.darkPurple, - ...Style.containerSpaceBetween, - ...Style.defaultShadows, + zIndex: 1, + justifyContent: "center", }} > - {state?.routes?.map((route, index) => { - const { options } = descriptors[route.key]; - const isFocused = state?.index === index; + + + {state?.routes?.map((route, index) => { + const { options } = descriptors[route.key]; + const isFocused = state?.index === index; - const _onPressTabBar = () => { - if (!isWeb) { - Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); - } + const label = + options.tabBarLabel !== undefined + ? options.tabBarLabel + : options.title !== undefined + ? options.title + : route.name; - const event = navigation.emit({ - type: "tabPress", - target: route.key, - canPreventDefault: true, - }); + const _onPressTabBar = () => { + if (!isWeb) { + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + } - if (!isFocused && !event.defaultPrevented) { - // The `merge: true` option makes sure that the params inside the tab screen are preserved - navigation.navigate({ name: route.name, merge: true }); - } - }; + const event = navigation.emit({ + type: "tabPress", + target: route.key, + canPreventDefault: true, + }); - const onLongPress = () => { - navigation.emit({ - type: "tabLongPress", - target: route.key, - }); - }; + if (!isFocused && !event.defaultPrevented) { + // The `merge: true` option makes sure that the params inside the tab screen are preserved + navigation.navigate({ name: route.name, merge: true }); + } + }; - return ( - !options?.hide && ( - - {options?.tabBarIcon({ focused: isFocused })} - - ) - ); - })} + const onLongPress = () => { + navigation.emit({ + type: "tabLongPress", + target: route.key, + }); + }; + + return ( + !options?.hide && ( + + {options?.tabBarIcon({ focused: isFocused })} + + {label} + + + ) + ); + })} + + ); }; diff --git a/src/screens/Library/Library.js b/src/screens/Library/Library.js new file mode 100644 index 0000000..6b8a1f5 --- /dev/null +++ b/src/screens/Library/Library.js @@ -0,0 +1,44 @@ +import { View, Image, ScrollView } from "react-native"; +import React from "react"; +import Page from "../../layouts/Page"; +import { background, icons } from "../../assets"; +import SearchBar from "../../components/SearchBar"; +import MyMusic from "./components/MyMusic"; +import BackTracks from "./components/BackTracks"; +import MyClips from "./components/MyClips"; +import LikedMusic from "./components/LikedMusic"; +import LikedPlayback from "./components/LikedPlayback"; +import LikedClips from "./components/LikedClips"; +import { responsiveHeight } from "react-native-responsive-dimensions"; +import MyPlaylist from "./components/MyPlaylist"; + +const Library = () => { + return ( + + + + + + + + + + + + + + + + + + ); +}; + +export default Library; diff --git a/src/screens/Library/components/BackTracks.js b/src/screens/Library/components/BackTracks.js new file mode 100644 index 0000000..1e9ffc5 --- /dev/null +++ b/src/screens/Library/components/BackTracks.js @@ -0,0 +1,24 @@ +import { View, Text, Image } from "react-native"; +import React from "react"; +import { img } from "../../../assets"; +import { Style } from "../../../styles"; +import CardContainer from "./CardContainer"; + +const BackTracks = () => { + return ( + + + {Array.from({ length: 3 }).map((_, index) => ( + + + + ))} + + + ); +}; + +export default BackTracks; diff --git a/src/screens/Library/components/CardContainer.js b/src/screens/Library/components/CardContainer.js new file mode 100644 index 0000000..3a3151a --- /dev/null +++ b/src/screens/Library/components/CardContainer.js @@ -0,0 +1,33 @@ +import { View, Text, StyleSheet, Pressable } from "react-native"; +import React from "react"; +import { Palette, Style } from "../../../styles"; +import { FONT_FAMILY } from "../../../styles/Fonts"; + +const CardContainer = ({ children, label = "" }) => { + return ( + + + {label} + + Voir tout + + + {children} + + ); +}; + +export default CardContainer; + +const styles = StyleSheet.create({ + label: { + fontSize: 22, + color: Palette.white, + fontFamily: FONT_FAMILY.InterSemiBold, + }, + seeAll: { + fontSize: 12, + color: Palette.gray, + fontFamily: FONT_FAMILY.InterRegular, + }, +}); diff --git a/src/screens/Library/components/LikedClips.js b/src/screens/Library/components/LikedClips.js new file mode 100644 index 0000000..556cca6 --- /dev/null +++ b/src/screens/Library/components/LikedClips.js @@ -0,0 +1,24 @@ +import { View, Text, Image } from "react-native"; +import React from "react"; +import CardContainer from "./CardContainer"; +import { Style } from "../../../styles"; +import { img } from "../../../assets"; + +const LikedClips = () => { + return ( + + + {Array.from({ length: 3 }).map((_, index) => ( + + + + ))} + + + ); +}; + +export default LikedClips; diff --git a/src/screens/Library/components/LikedMusic.js b/src/screens/Library/components/LikedMusic.js new file mode 100644 index 0000000..bc39d2f --- /dev/null +++ b/src/screens/Library/components/LikedMusic.js @@ -0,0 +1,29 @@ +import { View, Text, Image, FlatList } from "react-native"; +import React from "react"; +import CardContainer from "./CardContainer"; +import { Style } from "../../../styles"; +import { img } from "../../../assets"; + +const LikedMusic = () => { + return ( + + ( + + + + )} + /> + + ); +}; + +export default LikedMusic; diff --git a/src/screens/Library/components/LikedPlayback.js b/src/screens/Library/components/LikedPlayback.js new file mode 100644 index 0000000..3059d27 --- /dev/null +++ b/src/screens/Library/components/LikedPlayback.js @@ -0,0 +1,24 @@ +import { View, Text, Image } from "react-native"; +import React from "react"; +import CardContainer from "./CardContainer"; +import { Style } from "../../../styles"; +import { img } from "../../../assets"; + +const LikedPlayback = () => { + return ( + + + {Array.from({ length: 3 }).map((_, index) => ( + + + + ))} + + + ); +}; + +export default LikedPlayback; diff --git a/src/screens/Library/components/MusicCard.js b/src/screens/Library/components/MusicCard.js new file mode 100644 index 0000000..d6d6f3b --- /dev/null +++ b/src/screens/Library/components/MusicCard.js @@ -0,0 +1,78 @@ +import { View, Text, Image, Pressable, StyleSheet } from "react-native"; +import React, { useState } from "react"; +import { Palette, Style } from "../../../styles"; +import { icons, img } from "../../../assets"; +import { size } from "../../../styles/Style"; +import { BlurView } from "expo-blur"; +import { FONT_FAMILY } from "../../../styles/Fonts"; + +const MusicCard = () => { + const [selected, setSelected] = useState(false); + + return ( + + + + + + Alors on danse + Stromae + + + setSelected(!selected)}> + + + + + + + + + + ); +}; + +export default MusicCard; + +const styles = StyleSheet.create({ + blurContainer: { + borderRadius: 12, + overflow: "hidden", + flex: 1, + height: "100%", + }, + title: { + fontSize: 16, + color: Palette.white, + fontFamily: FONT_FAMILY.OwnersRegular, + }, + subTitle: { + fontSize: 12, + color: Palette.white, + fontFamily: FONT_FAMILY.InterRegular, + }, +}); diff --git a/src/screens/Library/components/MyClips.js b/src/screens/Library/components/MyClips.js new file mode 100644 index 0000000..88aa25b --- /dev/null +++ b/src/screens/Library/components/MyClips.js @@ -0,0 +1,24 @@ +import { View, Text, Image } from "react-native"; +import React from "react"; +import CardContainer from "./CardContainer"; +import { Style } from "../../../styles"; +import { img } from "../../../assets"; + +const MyClips = () => { + return ( + + + {Array.from({ length: 3 }).map((_, index) => ( + + + + ))} + + + ); +}; + +export default MyClips; diff --git a/src/screens/Library/components/MyMusic.js b/src/screens/Library/components/MyMusic.js new file mode 100644 index 0000000..aec6d26 --- /dev/null +++ b/src/screens/Library/components/MyMusic.js @@ -0,0 +1,18 @@ +import { View } from "react-native"; +import React from "react"; +import CardContainer from "./CardContainer"; +import MusicCard from "./MusicCard"; + +const MyMusic = () => { + return ( + + + {Array.from({ length: 3 }).map((_, index) => ( + + ))} + + + ); +}; + +export default MyMusic; diff --git a/src/screens/Library/components/MyPlaylist.js b/src/screens/Library/components/MyPlaylist.js new file mode 100644 index 0000000..0f56038 --- /dev/null +++ b/src/screens/Library/components/MyPlaylist.js @@ -0,0 +1,51 @@ +import { View, Text, Pressable, Image } from "react-native"; +import React from "react"; +import CardContainer from "./CardContainer"; +import { BlurView } from "expo-blur"; +import { icons } from "../../../assets"; +import Style, { size } from "../../../styles/Style"; +import { Palette } from "../../../styles"; +import { FONT_FAMILY } from "../../../styles/Fonts"; + +const MyPlaylist = () => { + return ( + + + {["Musiques de lover", "Musiques triste"].map((item, index) => ( + + + + {item} + + + + + + + ))} + + + ); +}; + +export default MyPlaylist; diff --git a/src/screens/Login.js b/src/screens/Login.js index c87597d..d0343a4 100644 --- a/src/screens/Login.js +++ b/src/screens/Login.js @@ -29,6 +29,7 @@ import { import useLayoutType from "../hooks/useLayoutType.js"; import { capitalize } from "../helpers/index.js"; +import { navigate } from "../navigation/NavigationService.js"; export default ({ navigation }) => { console.log("LOGINSCREEN"); @@ -292,7 +293,7 @@ export default ({ navigation }) => {