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 0000000..88aa1e6
Binary files /dev/null and b/src/Api/src/controllers/._userController.ts differ
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
}