From b746fbf7d2b59b4b0b91a7a5d896c5e8d8d37b5d Mon Sep 17 00:00:00 2001 From: emkartal1 Date: Mon, 25 Dec 2023 16:28:37 +0100 Subject: [PATCH] Update chat screen and add a StubMessageService :white_check_mark: --- README.md | 2 +- src/Api/src/controllers/._userController.ts | Bin 0 -> 4096 bytes src/Api/src/controllers/userController.ts | 2 +- src/Api/src/database/UserSchema.ts | 2 +- src/FLAD/components/FriendComponent.tsx | 34 +++- src/FLAD/components/PaginatorComponent.tsx | 2 +- src/FLAD/components/SimilarMusicComponent.tsx | 2 +- src/FLAD/models/Conversation.ts | 47 +++++ src/FLAD/models/Message.ts | 55 ++++++ src/FLAD/navigation/HomeNavigation.tsx | 11 +- src/FLAD/navigation/MessagingNavigation.tsx | 52 ++++- src/FLAD/package.json | 5 +- src/FLAD/redux/actions/appActions.ts | 17 ++ src/FLAD/redux/reducers/appReducer.tsx | 9 + src/FLAD/redux/thunk/appThunk.tsx | 1 + src/FLAD/redux/thunk/chatThunk.tsx | 42 ++++ src/FLAD/redux/types/chatTypes.tsx | 4 + src/FLAD/screens/ChatScreen.tsx | 186 ++++++++++++++++-- src/FLAD/screens/ConversationScreen.tsx | 81 ++++++-- src/FLAD/screens/FavoriteScreen.tsx | 2 +- src/FLAD/screens/SpotScreen.tsx | 6 +- .../messages/interfaces/IMessageService.ts | 8 + .../messages/stub/StubMessageService.ts | 57 ++++++ .../services/musics/spotify/SpotifyService.ts | 4 +- 24 files changed, 577 insertions(+), 54 deletions(-) create mode 100644 src/Api/src/controllers/._userController.ts create mode 100644 src/FLAD/models/Conversation.ts create mode 100644 src/FLAD/models/Message.ts create mode 100644 src/FLAD/redux/thunk/chatThunk.tsx create mode 100644 src/FLAD/redux/types/chatTypes.tsx create mode 100644 src/FLAD/services/messages/interfaces/IMessageService.ts create mode 100644 src/FLAD/services/messages/stub/StubMessageService.ts diff --git a/README.md b/README.md index c8e7d0e..b97f7b7 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,7 @@ Une fois sur la page, saisissez votre nom, votre adresse e-mail, et votre mot de Pour accéder aux détails d'une musique, maintenez votre doigt appuyé sur un Spot ou rendez-vous sur la page des favoris. Vous pourrez écouter la musique :arrow_forward:, obtenir des informations sur l'artiste et la chanson, découvrir des musiques similaires, et même l'ajouter à votre playlist Spotify ou la partager.
-`Dans la page **settings** ⚙️, vous avez accès à toutes vos informations ```Spotify```, que vous pouvez modifier à votre guise. Toutefois, ces modifications ne seront prises en compte que dans notre application. Vous pouvez également choisir le mode sombre (dark mode) dans les paramètres pour une expérience de navigation plus confortable. +Dans la page **settings** ⚙️, vous avez accès à toutes vos informations ```Spotify```, que vous pouvez modifier à votre guise. Toutefois, ces modifications ne seront prises en compte que dans notre application. Vous pouvez également choisir le mode sombre (dark mode) dans les paramètres pour une expérience de navigation plus confortable.
### Voici un petit récapitulatif diff --git a/src/Api/src/controllers/._userController.ts b/src/Api/src/controllers/._userController.ts new file mode 100644 index 0000000000000000000000000000000000000000..88aa1e667760fc6853f61c2229eecd9eef004f5b GIT binary patch literal 4096 zcmZQz6=P>$Vqox1Ojhs@R)|o50+1L3ClDJkFz{^v(m+1nBL)UWIUt(=a103v`v3o@ zC`1Rt0-$mMG%bukK2%&PIX_n~v7jI)RWB#8xTLf=H6Kf7%s{i3$kztVg G{~rJtx-9wt literal 0 HcmV?d00001 diff --git a/src/Api/src/controllers/userController.ts b/src/Api/src/controllers/userController.ts index 92956fe..7e3866c 100644 --- a/src/Api/src/controllers/userController.ts +++ b/src/Api/src/controllers/userController.ts @@ -1,4 +1,4 @@ -import { Router, Request, Response, NextFunction } from 'express'; +import { Router, Request, Response } from 'express'; import IController from './interfaces/IController'; import User from '../models/User'; import UserService from '../services/UserService'; diff --git a/src/Api/src/database/UserSchema.ts b/src/Api/src/database/UserSchema.ts index 51ae320..1d90764 100644 --- a/src/Api/src/database/UserSchema.ts +++ b/src/Api/src/database/UserSchema.ts @@ -38,7 +38,7 @@ const userSchema = new Schema({ userId: String, date: Date }], - default: [] + default: [] } }, { timestamps: true } diff --git a/src/FLAD/components/FriendComponent.tsx b/src/FLAD/components/FriendComponent.tsx index ec0d73c..5126844 100644 --- a/src/FLAD/components/FriendComponent.tsx +++ b/src/FLAD/components/FriendComponent.tsx @@ -4,11 +4,12 @@ import { useSelector } from 'react-redux'; import { colorsDark } from '../constants/colorsDark'; import { colorsLight } from '../constants/colorsLight'; import normalize from './Normalize'; +import Message from '../models/Message'; type FriendProps = { image: string; name: string; - lastMessage: string; + lastMessage: Message; } export default function Friend(props: FriendProps) { @@ -67,14 +68,41 @@ export default function Friend(props: FriendProps) { } }) + const getTimeDifferenceString = (date: Date): string => { + const now = new Date(); + const differenceInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000); + + const intervals = { + an: 31536000, + mois: 2592000, + sem: 604800, + jour: 86400, + heure: 3600, + min: 60, + }; + + for (const [intervalName, seconds] of Object.entries(intervals)) { + const intervalCount = Math.floor(differenceInSeconds / seconds); + if (intervalCount > 0) { + if (intervalName === 'mois' || intervalName === 'min') { + return `il y a ${intervalCount} ${intervalName}`; + } else { + return `il y a ${intervalCount} ${intervalName}${intervalCount !== 1 ? 's' : ''}`; + } + } + } + + return 'À l’instant'; + }; + return ( {props.name} - {props.lastMessage} - · 1sem + {props.lastMessage.content} + · {getTimeDifferenceString(props.lastMessage.date)} diff --git a/src/FLAD/components/PaginatorComponent.tsx b/src/FLAD/components/PaginatorComponent.tsx index 0f3c830..66bd7f0 100644 --- a/src/FLAD/components/PaginatorComponent.tsx +++ b/src/FLAD/components/PaginatorComponent.tsx @@ -8,7 +8,7 @@ export default function Paginator({ data, scrollX }) { return ( - {data.map((_ : any, i : any) => { + { data.map((_ : any, i : any) => { const inputRange = [(i - 1) * width, i * width, (i + 1) * width]; const dotWidth = scrollX.interpolate({ diff --git a/src/FLAD/components/SimilarMusicComponent.tsx b/src/FLAD/components/SimilarMusicComponent.tsx index a0da245..dd42465 100644 --- a/src/FLAD/components/SimilarMusicComponent.tsx +++ b/src/FLAD/components/SimilarMusicComponent.tsx @@ -3,7 +3,7 @@ import Music from '../models/Music'; import normalize from './Normalize'; export interface RenderCellProps { - music : Music; + music: Music; } export const SimilarMusic = (props: RenderCellProps) => { return ( diff --git a/src/FLAD/models/Conversation.ts b/src/FLAD/models/Conversation.ts new file mode 100644 index 0000000..a972af9 --- /dev/null +++ b/src/FLAD/models/Conversation.ts @@ -0,0 +1,47 @@ +import Message from "./Message"; + +export default class Conversation { + private _id: string; + private _name: string; + private _image: string; + private _lastMessage: Message; + + constructor(id: string, name: string, image: string, lastMessage: Message) { + this._id = id; + this._name = name; + this._image = image; + this._lastMessage = lastMessage; + } + + get id(): string { + return this._id; + } + + set id(value: string) { + this._id = value; + } + + get name(): string { + return this._name; + } + + set name(value: string) { + this._name = value; + } + + get image(): string { + return this._image; + } + + set image(value: string) { + this._image = value; + } + + get lastMessage(): Message { + return this._lastMessage; + } + + set lastMessage(value: Message) { + this._lastMessage = value; + } +} \ No newline at end of file diff --git a/src/FLAD/models/Message.ts b/src/FLAD/models/Message.ts new file mode 100644 index 0000000..4e8b6e5 --- /dev/null +++ b/src/FLAD/models/Message.ts @@ -0,0 +1,55 @@ +export default class Message { + private _id: string; + private _content: string; + private _sender: string; + private _date: Date; + private _audio: string; + + constructor(id: string, content: string, sender: string, date: Date, audio: string = '') { + this._id = id; + this._content = content; + this._sender = sender; + this._date = date; + this._audio = audio; + } + + get id(): string { + return this._id; + } + + set id(value: string) { + this._id = value; + } + + get content(): string { + return this._content; + } + + set content(value: string) { + this._content = value; + } + + get sender(): string { + return this._sender; + } + + set sender(value: string) { + this._sender = value; + } + + get date(): Date { + return this._date; + } + + set date(value: Date) { + this._date = value; + } + + get audio(): string { + return this._audio; + } + + set audio(value: string) { + this._audio = value; + } +} \ No newline at end of file diff --git a/src/FLAD/navigation/HomeNavigation.tsx b/src/FLAD/navigation/HomeNavigation.tsx index 8094b39..7765a1d 100644 --- a/src/FLAD/navigation/HomeNavigation.tsx +++ b/src/FLAD/navigation/HomeNavigation.tsx @@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react'; import { View, Alert, Platform } from 'react-native'; import { faUser, faEnvelope, faHeart, faMusic } from "@fortawesome/free-solid-svg-icons" import { createBottomTabNavigator } from '@react-navigation/bottom-tabs'; -import { NavigationContainer } from '@react-navigation/native'; +import { NavigationContainer, getFocusedRouteNameFromRoute } from '@react-navigation/native'; import FavoriteNavigation from './FavoriteNavigation'; import SettingNavigation from './SettingNavigation'; import { FontAwesomeIcon } from "@fortawesome/react-native-fontawesome"; @@ -156,10 +156,15 @@ export default function HomeNavigation() { tabBarIcon: ({ color }) => , }} /> ({ headerShown: false, + tabBarStyle: { + display: getFocusedRouteNameFromRoute(route) !== "Chat" ? "flex" : "none", + position: "absolute", + borderTopColor: isDark ? 'rgba(255, 255, 255, 0.25)' : 'rgba(50, 50, 50, 0.07)', + }, tabBarIcon: ({ color }) => , - }} /> + })} /> state.userReducer.dark); + const style = isDark ? colorsDark : colorsLight; const Stack = createStackNavigator(); + + const styles = StyleSheet.create({ + headerContainer: { + flexDirection: 'row', + alignItems: 'center' + }, + headerImage: { + width: 30, + height: 30, + borderRadius: 20, + marginRight: 8 + }, + headerText: { + color: style.Text, + fontSize: 16, + fontWeight: 'bold' + } + }); + return ( - + ({ + headerShown: true, + headerBackTitleVisible: false, + headerStyle: { + backgroundColor: style.Card + }, + headerTitle: () => ( + + + + {/* @ts-ignore */} + {route.params.username} + + + ), + headerTitleStyle: { + color: style.Text + }, + })} /> ) diff --git a/src/FLAD/package.json b/src/FLAD/package.json index e42515b..0460782 100644 --- a/src/FLAD/package.json +++ b/src/FLAD/package.json @@ -25,6 +25,7 @@ "expo-image-picker": "~14.0.2", "expo-linear-gradient": "~12.0.1", "expo-location": "~15.0.1", + "expo-random": "^13.0.0", "expo-secure-store": "~12.0.0", "expo-splash-screen": "~0.17.5", "react": "18.1.0", @@ -37,8 +38,9 @@ "react-native-safe-area-context": "4.4.1", "react-native-screens": "~3.18.0", "react-native-svg": "13.4.0", - "react-navigation-shared-element": "^3.1.3", + "react-native-vector-icons": "^10.0.3", "react-native-web": "~0.18.9", + "react-navigation-shared-element": "^3.1.3", "react-redux": "^8.0.5", "redux": "^4.2.1" }, @@ -46,6 +48,7 @@ "@babel/core": "^7.12.9", "@types/react": "~18.0.14", "@types/react-native": "~0.70.8", + "@types/react-native-vector-icons": "^6.4.18", "typescript": "^4.6.3" }, "private": true diff --git a/src/FLAD/redux/actions/appActions.ts b/src/FLAD/redux/actions/appActions.ts index a55b3ed..241d176 100644 --- a/src/FLAD/redux/actions/appActions.ts +++ b/src/FLAD/redux/actions/appActions.ts @@ -1,5 +1,8 @@ +import Conversation from "../../models/Conversation"; +import Message from "../../models/Message"; import Music from "../../models/Music"; import { Spot } from "../../models/Spot"; +import { chatTypes } from "../types/chatTypes"; import { favoritesTypes } from "../types/favoritesTypes"; import { spotifyTypes } from "../types/spotifyTypes"; @@ -28,4 +31,18 @@ export const resetNbAddedFavoriteMusic = () => { return { type: favoritesTypes.RESET_NB_ADDED_FAVORITE_MUSIC }; +} + +export const setConversations = (conversations: Conversation[]) => { + return { + type: chatTypes.FETCH_CONVERSATIONS, + payload: conversations, + }; +} + +export const setMessages = (messages: Message[]) => { + return { + type: chatTypes.FETCH_MESSAGES, + payload: messages, + }; } \ No newline at end of file diff --git a/src/FLAD/redux/reducers/appReducer.tsx b/src/FLAD/redux/reducers/appReducer.tsx index 1c0944f..7fbdfb2 100644 --- a/src/FLAD/redux/reducers/appReducer.tsx +++ b/src/FLAD/redux/reducers/appReducer.tsx @@ -1,4 +1,7 @@ +import Conversation from "../../models/Conversation"; +import Message from "../../models/Message"; import { Spot } from "../../models/Spot"; +import { chatTypes } from "../types/chatTypes"; import { favoritesTypes } from "../types/favoritesTypes"; import { spotifyTypes } from "../types/spotifyTypes"; import { spotTypes } from "../types/spotTypes"; @@ -10,6 +13,8 @@ const initialState = { userCurrentMusic: null, nbAddedFavoriteMusic: 0, oldSpot: [] as string[], + conversations: [] as Conversation[], + messages: [] as Message[] } const appReducer = (state = initialState, action: any) => { @@ -23,6 +28,10 @@ const appReducer = (state = initialState, action: any) => { }; case favoritesTypes.RESET_NB_ADDED_FAVORITE_MUSIC: return { ...state, nbAddedFavoriteMusic: 0 }; + case chatTypes.FETCH_CONVERSATIONS: + return { ...state, conversations: action.payload }; + case chatTypes.FETCH_MESSAGES: + return { ...state, messages: action.payload }; case spotTypes.FETCH_SPOT: const uniqueSpots = action.payload.filter((spot: Spot) => { const spotKey = `${spot.user}_${spot.music.id}`; diff --git a/src/FLAD/redux/thunk/appThunk.tsx b/src/FLAD/redux/thunk/appThunk.tsx index 76c3c95..2933b71 100644 --- a/src/FLAD/redux/thunk/appThunk.tsx +++ b/src/FLAD/redux/thunk/appThunk.tsx @@ -28,6 +28,7 @@ export const getUserCurrentMusic = () => { const music = await MusicServiceProvider.musicService.getMusicById(idTrack); dispatch(setUserCurrentMusic(music)) } catch (error: any) { + console.log(error); switch (error.response.status) { case 401: dispatch(logout); diff --git a/src/FLAD/redux/thunk/chatThunk.tsx b/src/FLAD/redux/thunk/chatThunk.tsx new file mode 100644 index 0000000..f3d847e --- /dev/null +++ b/src/FLAD/redux/thunk/chatThunk.tsx @@ -0,0 +1,42 @@ +import Message from "../../models/Message"; +import IMessageService from "../../services/messages/interfaces/IMessageService" +import StubMessageService from "../../services/messages/stub/StubMessageService"; +import { setConversations, setMessages } from "../actions/appActions"; + +const chatService: IMessageService = new StubMessageService(); + +export const getConversations = () => { + //@ts-ignore + return async dispatch => { + try { + const conversations = await chatService.getConversations(); + dispatch(setConversations(conversations)); + } catch (error: any) { + + } + } +} + +export const getMessages = (id: string) => { + //@ts-ignore + return async dispatch => { + try { + const messages = await chatService.getMessagesWithIdConversation(id); + dispatch(setMessages(messages)); + } catch (error: any) { + + } + } +} + +export const sendMessage = (id: string, message: Message) => { + //@ts-ignore + return async dispatch => { + try { + await chatService.sendMessage(id, message); + dispatch(getMessages(id)); + } catch (error: any) { + + } + } +} \ No newline at end of file diff --git a/src/FLAD/redux/types/chatTypes.tsx b/src/FLAD/redux/types/chatTypes.tsx new file mode 100644 index 0000000..9c832e5 --- /dev/null +++ b/src/FLAD/redux/types/chatTypes.tsx @@ -0,0 +1,4 @@ +export const chatTypes = { + FETCH_CONVERSATIONS: 'FETCH_CONVERSATIONS', + FETCH_MESSAGES: 'FETCH_MESSAGES', +} \ No newline at end of file diff --git a/src/FLAD/screens/ChatScreen.tsx b/src/FLAD/screens/ChatScreen.tsx index 07ecbb9..bc56b9c 100644 --- a/src/FLAD/screens/ChatScreen.tsx +++ b/src/FLAD/screens/ChatScreen.tsx @@ -1,22 +1,178 @@ -import { useNavigation } from "@react-navigation/native"; -import React, { useEffect } from "react"; -import { GiftedChat } from "react-native-gifted-chat"; +import React, { useCallback, useEffect, useState } from "react"; +import { Bubble, GiftedChat, IMessage, InputToolbar, Send } from "react-native-gifted-chat"; +import { faFileImage, faMicrophone } from "@fortawesome/free-solid-svg-icons" +import { colorsDark } from "../constants/colorsDark"; +import { colorsLight } from "../constants/colorsLight"; +import { useDispatch, useSelector } from 'react-redux'; +import { SafeAreaView, TouchableOpacity, View } from "react-native"; +import Icon from 'react-native-vector-icons/Ionicons'; +import FontAwesome from 'react-native-vector-icons/FontAwesome'; +import Message from "../models/Message"; +import { getMessages, sendMessage } from "../redux/thunk/chatThunk"; +import { FontAwesomeIcon } from "@fortawesome/react-native-fontawesome"; -export default function Chat() { +//@ts-ignore +export default function Chat({ route }) { + const item: string = route.params.conversation; + const [messages, setMessages] = useState(); + //@ts-ignore + const conversations: Message[] = useSelector(state => state.appReducer.messages); - const navigation = useNavigation(); + // @ts-ignore + const isDark = useSelector(state => state.userReducer.dark); + const style = isDark ? colorsDark : colorsLight; + + const dispatch = useDispatch(); useEffect(() => { - navigation.getParent()?.setOptions({ - tabBarStyle: { - display: "none" - } - }); - return () => navigation.getParent()?.setOptions({ - tabBarStyle: undefined + // @ts-ignore + dispatch(getMessages(item)); + }, []); + + useEffect(() => { + const mappedMessages = conversations.map((msg: Message) => ({ + _id: msg.id, + text: msg.content, + createdAt: msg.date, + user: { + _id: msg.sender, + name: msg.sender, + avatar: 'https://picsum.photos/536/354', + }, + audio: msg.audio + })); + + mappedMessages.reverse(); + + mappedMessages.push({ + _id: "0", + text: 'Vous avez matché !!!', + system: true, }); - }, [navigation]); + + setMessages(mappedMessages); + }, [conversations]); + + const onSend = useCallback((messages: any = []) => { + + const newMessage = new Message( + "-1", + messages[0].text, + "User1", + new Date() + ); + + // @ts-ignore + dispatch(sendMessage(item, newMessage)); + }, []) + + const renderBubble = (props: any) => { + return ( + + ); + }; + + const renderInputToolbar = (props: any) => { + return ( + + ); + }; + + function handleImageIconPress(): void { + console.log("Image"); + } + + function handleMicrophoneIconPress(): void { + console.log("Audio"); + } + + const renderActions = (props: any) => { + return ( + + + + + + + + + + ); + }; + + + const renderSend = (props: any) => { + return ( + + + + + + ); + }; + + const scrollToBottomComponent = () => { + return ( + + ) + } + return ( - - ) + + onSend(messages)} + user={{ + _id: "User1", + }} + listViewProps={{ + style: { + backgroundColor: style.body + }, + }} + // @ts-ignore + textInputStyle={{ + backgroundColor: style.Line, + borderRadius: 20, + paddingHorizontal: 15, + paddingTop: 10, + marginTop: 5, + color: style.Text + }} + renderActions={renderActions} + maxInputLength={255} + renderBubble={renderBubble} + renderInputToolbar={renderInputToolbar} + renderSend={renderSend} + scrollToBottom + scrollToBottomComponent={scrollToBottomComponent} + placeholder="Chat" + /> + + ); } \ No newline at end of file diff --git a/src/FLAD/screens/ConversationScreen.tsx b/src/FLAD/screens/ConversationScreen.tsx index 5990ae7..cd1da8d 100644 --- a/src/FLAD/screens/ConversationScreen.tsx +++ b/src/FLAD/screens/ConversationScreen.tsx @@ -1,25 +1,39 @@ import { useNavigation } from "@react-navigation/native"; -import { StyleSheet, Text, View, FlatList, TouchableOpacity } from "react-native"; -import { useSelector } from "react-redux"; +import { StyleSheet, Text, View, FlatList, TouchableOpacity, RefreshControl } from "react-native"; +import { useSelector, useDispatch } from "react-redux"; import { colorsDark } from '../constants/colorsDark'; import { colorsLight } from '../constants/colorsLight'; import Friend from "../components/FriendComponent"; import normalize from '../components/Normalize'; import { useSafeAreaInsets } from "react-native-safe-area-context"; +import { useCallback, useEffect, useState } from "react"; +import { getConversations } from "../redux/thunk/chatThunk"; export default function ConversationScreen() { + //@ts-ignore + const friends = useSelector(state => state.appReducer.conversations); // @ts-ignore const isDark = useSelector(state => state.userReducer.dark); + const [refreshing, setRefreshing] = useState(false); - const navigation = useNavigation(); + const dispatch = useDispatch(); + + useEffect(() => { + // @ts-ignore + dispatch(getConversations()); + }, []); + + const handleRefresh = () => { + setRefreshing(true); + //@ts-ignore + dispatch(getConversations()); + setTimeout(() => { + setRefreshing(false); + }, 700); + }; - const friends = [ - { id: 1, name: "Lucas", lastMessage: "J'en ai marre de provot", source: "https://i1.sndcdn.com/artworks-ncJnbnDbNOFd-0-t500x500.jpg" }, - { id: 2, name: "Louison", lastMessage: "Tu vien piscine ?", source: "https://i1.sndcdn.com/artworks-ncJnbnDbNOFd-0-t500x500.jpg" }, - { id: 3, name: "Dave", lastMessage: "Ok c noté !", source: "https://img.lemde.fr/2019/04/05/0/0/960/960/664/0/75/0/18299d3_tUvp2AZPH_jnsIL2ypVFGUro.jpg" }, - { id: 4, name: "Valentin", lastMessage: "Haha react native c incroyable !!!", source: "https://i1.sndcdn.com/artworks-ncJnbnDbNOFd-0-t500x500.jpg" }, - ]; + const navigation = useNavigation(); const style = isDark ? colorsDark : colorsLight; @@ -44,6 +58,18 @@ export default function ConversationScreen() { fontSize: normalize(20), color: '#787878', marginBottom: 5 + }, + body: { + alignItems: 'center', + justifyContent: 'center', + flex: 1, + marginHorizontal: "7%" + }, + text: { + color: style.Text, + fontSize: normalize(18), + opacity: 0.8, + textAlign: 'center' } }) @@ -53,18 +79,33 @@ export default function ConversationScreen() { Messages Retrouvez ici les discussions - item.id.toString()} - renderItem={({ item }) => ( - + + Pas de conversations pour le moment. 🥲{'\n'} + Va liker des musiques pour créer des conversations avec des gens dans le monde ! 🔥🎆 + + + ) : ( + b.lastMessage.date - a.lastMessage.date)} + keyExtractor={(item) => item.id.toString()} + renderItem={({ item }) => ( // @ts-ignore - onPress={() => navigation.navigate('Chat')}> - - - )} - /> + navigation.navigate('Chat', { username: item.name, image: item.image, conversation: item.id })}> + + + )} + refreshControl={ + + } + /> + )} ) } \ No newline at end of file diff --git a/src/FLAD/screens/FavoriteScreen.tsx b/src/FLAD/screens/FavoriteScreen.tsx index dd4ee64..dcc61a0 100644 --- a/src/FLAD/screens/FavoriteScreen.tsx +++ b/src/FLAD/screens/FavoriteScreen.tsx @@ -136,7 +136,7 @@ export default function FavoriteScreen() { Retrouvez ici vos musiques favorites state.appReducer.spot) - // @ts-ignore - const isDark = useSelector(state => state.userReducer.dark); - const style = isDark ? colorsDark : colorsLight; + // @ts-ignore + const isDark = useSelector(state => state.userReducer.dark); + const style = isDark ? colorsDark : colorsLight; const [cards, setCards] = useState(spotReducer); const [currentCard, setcurrentCard] = useState(cards[cards.length - 1]); diff --git a/src/FLAD/services/messages/interfaces/IMessageService.ts b/src/FLAD/services/messages/interfaces/IMessageService.ts new file mode 100644 index 0000000..4445711 --- /dev/null +++ b/src/FLAD/services/messages/interfaces/IMessageService.ts @@ -0,0 +1,8 @@ +import Conversation from "../../../models/Conversation"; +import Message from "../../../models/Message"; + +export default interface IMessageService { + getConversations(): Promise; + getMessagesWithIdConversation(id: string): Promise; + sendMessage(id: string, mes: Message): Promise; +} \ No newline at end of file diff --git a/src/FLAD/services/messages/stub/StubMessageService.ts b/src/FLAD/services/messages/stub/StubMessageService.ts new file mode 100644 index 0000000..17854c6 --- /dev/null +++ b/src/FLAD/services/messages/stub/StubMessageService.ts @@ -0,0 +1,57 @@ +import Conversation from "../../../models/Conversation"; +import Message from "../../../models/Message"; +import IMessageService from "../interfaces/IMessageService"; + +export default class StubMessageService implements IMessageService { + + getRandomDate(): Date { + const startDate = new Date(2022, 0, 1); // Jan 1, 2022 + const endDate = new Date(); // Current date + const randomDate = new Date(startDate.getTime() + Math.random() * (endDate.getTime() - startDate.getTime())); + return randomDate; + } + + private messages: { id: string, message: Message }[] = [ + { id: "1", message: new Message("1", "Hello", "User1", this.getRandomDate(), "https://p.scdn.co/mp3-preview/d2cdc7726fcdc244849620b427a0c37461bb3586?cid=eb2aab666a43490f82eef0bb064d363f") }, + { id: "2", message: new Message("2", "Hi there!", "User2", new Date()) }, + { id: "3", message: new Message("3", "Greetings", "User3", this.getRandomDate()) }, + { id: "1", message: new Message("4", "La chiennete", "User0", this.getRandomDate()) }, + { id: "2", message: new Message("5", "Grr paw", "User2", new Date()) }, + { id: "3", message: new Message("6", "Greetings", "User3", this.getRandomDate()) }, + ]; + + private conversations: Conversation[] = [ + new Conversation("1", "Imri", "https://i1.sndcdn.com/artworks-ncJnbnDbNOFd-0-t500x500.jpg", this.messages[0].message), + new Conversation("2", "Dave", "data:image/png;base64,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", this.messages[1].message), + new Conversation("3", "Benzema", "data:image/png;base64,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", this.messages[2].message), + ]; + + getConversations(): Promise { + return Promise.resolve(this.conversations); + } + + getMessagesWithIdConversation(id: string): Promise { + return Promise.resolve(this.messages.filter(msg => msg.id === id) + .map(msg => msg.message)); + + } + + sendMessage(id: string, mes: Message): Promise { + return new Promise((resolve, reject) => { + + const conversation = this.conversations.find(conv => conv.id === id); + + if (!conversation) { + reject(new Error(`Conversation with id ${id} not found.`)); + return; + } + + this.messages.push({ id, message: mes }); + + conversation.lastMessage = mes; + + resolve(); + }); + } + +} \ No newline at end of file diff --git a/src/FLAD/services/musics/spotify/SpotifyService.ts b/src/FLAD/services/musics/spotify/SpotifyService.ts index 1d59404..65ffbf6 100644 --- a/src/FLAD/services/musics/spotify/SpotifyService.ts +++ b/src/FLAD/services/musics/spotify/SpotifyService.ts @@ -53,9 +53,11 @@ export default class SpotifyService implements IMusicService { }, }); - if (response.data.item === undefined) { + if (response.data.item === undefined || response.data.item === null) { return null; } + + return response.data.item.id }