ADD:
continuous-integration/drone/push Build is failing Details

Chat en fonction des conversations de l'utilisateur
Persistance
Thomas Chazot 2 years ago
parent 82adcd6756
commit d779403b62

@ -2,43 +2,19 @@ import MainTabNavigator from './src/navigation/AppNavigator'
import store from './src/redux/store' import store from './src/redux/store'
import { Provider } from 'react-redux' import { Provider } from 'react-redux'
import LoaderUserApi from './src/services/userServices/loaderUserApi' import LoaderUserApi from './src/services/userServices/loaderUserApi'
import ManagerUser from './src/services/userServices/ManagerUser' import ManagerUser from './src/services/userServices/managerUser'
import FakeSaverUser from './src/services/userServices/fakeSaverUser' import FakeSaverUser from './src/services/userServices/fakeSaverUser'
import React, { useCallback } from 'react'; import React, { useCallback } from 'react';
import { useUserStore } from './src/context/userContext'; import { useUserStore } from './src/context/userContext';
import ManagerConversation from './src/services/conversationService/managerConversation'
import { LoaderConversationApi } from './src/services/conversationService/loaderConversationApi'
import { FakeSaverConversation } from './src/services/conversationService/fakeSaverConversation'
export const MANAGER_USER = new ManagerUser(new LoaderUserApi, new FakeSaverUser); export const MANAGER_USER = new ManagerUser(new LoaderUserApi, new FakeSaverUser);
export const MANAGER_CONVERSATION = new ManagerConversation(new LoaderConversationApi, new FakeSaverConversation);
export default function App() { export default function App() {
const setUser = useUserStore((state) => state.setUser);
const resetUser = useUserStore((state) => state.resetUser);
const handleUserConnect = useCallback(async () => {
await MANAGER_USER.getLoaderUser().loadByID("14").then((res) => {
MANAGER_USER.setCurrentUser(res);
console.log(res);
});
setUser(MANAGER_USER.getCurrentUser());
}, []);
const handleUserLogout = useCallback(async () => {
// TODO: Call logout API
MANAGER_USER.setCurrentUser(null);
resetUser();
}, []);
const test = useCallback(async () => {
const tab = await MANAGER_USER.getLoaderUser().loadAllUser();
MANAGER_USER.setCurrentUser(tab[0]);
setUser(MANAGER_USER.getCurrentUser());
}, []);
return ( return (
<Provider store={store}> <Provider store={store}>

@ -7,8 +7,9 @@ import React from "react"
*/ */
import styles from './style/BotBar.style'; import styles from './style/BotBar.style';
import { useStoreStore } from "../context/storeContext"; import { useStoreStore } from "../context/storeContext";
import { MANAGER_USER } from "../../App"; import { MANAGER_CONVERSATION, MANAGER_USER } from "../../App";
import tabSkinApp from "../constSkin"; import tabSkinApp from "../constSkin";
import { useConversationStore } from "../context/conversationContext";
/* /*
Images that are required to create a bottom bar Images that are required to create a bottom bar
@ -40,7 +41,7 @@ FC<{nav: any, state?: String}> =
{ {
const setTabSkin = useStoreStore((state) => state.setTabSkin); const setTabSkin = useStoreStore((state) => state.setTabSkin);
const setTabConv = useConversationStore((state) => state.setTabConv);
const handleStoreChange = useCallback(async () => { const handleStoreChange = useCallback(async () => {
@ -58,6 +59,17 @@ FC<{nav: any, state?: String}> =
} }
}, []); }, []);
const handleConversationChange = useCallback(async () => {
let tmp=MANAGER_USER.getCurrentUser();
if (tmp!=undefined){
await MANAGER_CONVERSATION.getLoaderConversation().loadByUser(tmp).then((res) => {
MANAGER_CONVERSATION.setCurrentTabConv(res);
setTabConv(res);
});
}
}, []);
/* /*
By default, all the images are the white ones By default, all the images are the white ones
*/ */
@ -89,7 +101,7 @@ FC<{nav: any, state?: String}> =
*/ */
return ( return (
<View style={styles.footer}> <View style={styles.footer}>
<Pressable onPress={() => nav.navigate('ChatTab')}> <Pressable onPress={() => {handleConversationChange() ;nav.navigate('ChatTab')}}>
<Image <Image
style={styles.icon} style={styles.icon}
source={imgLeft} source={imgLeft}

@ -9,30 +9,34 @@ import { Conversation } from "../core/conversation"
*/ */
import styles from "./style/ConverstationComponent.style" import styles from "./style/ConverstationComponent.style"
import { SkinComponent } from "./Skin" import { SkinComponent } from "./Skin"
import { User } from "../core/User/user"
import { MANAGER_USER } from "../../App"
export const ConversationComponent : export const ConversationComponent :
/* Parameters : /* Parameters :
* skin : Skin to be displayed * skin : Skin to be displayed
* state : Indicates from wich screen the component has been called * state : Indicates from wich screen the component has been called
*/ */
FC<{conv: Conversation, state: String}> = FC<{conv: Conversation, state: String, navigation: any}> =
({conv, state}) => ({conv, state, navigation}) =>
{ {
/* The display of this component depends of the screen from where it has been called: /* The display of this component depends of the screen from where it has been called:
* From the TopBar (icon) : Small image in a circle * From the TopBar (icon) : Small image in a circle
* From the shop (shop) : Image + Name + Price, Pressable => Buy the skin * From the shop (shop) : Image + Name + Price, Pressable => Buy the skin
* From the profile (profile) : Name + Image, Pressable => Change the skin * From the profile (profile) : Name + Image, Pressable => Change the skin
*/ */
switch (state) { switch (state) {
case 'Preview': case 'Preview':
return( return(
<View style={{flexDirection: 'row', height: 70, borderBottomWidth: 2,borderBottomColor: '#2D2C33', paddingLeft: '5%',}}> <View style={{flexDirection: 'row', height: 70, borderBottomWidth: 2,borderBottomColor: '#2D2C33', paddingLeft: '5%',}}>
<View style={{alignSelf: 'center'}}> <View style={{alignSelf: 'center'}}>
<SkinComponent skin={conv.getTabUser()[1].getCurrentSkin()} state='icon'/> <SkinComponent skin={conv.getLastMessage().getMessageSender().getCurrentSkin()} state='icon' nav={navigation}/>
</View> </View>
<View style={{marginLeft: '5%', justifyContent: 'space-evenly'}}> <View style={{marginLeft: '5%', justifyContent: 'space-evenly'}}>
<Text style={styles.textNom}>{conv.getTabUser()[1].getUsername()}</Text> <Text style={styles.textNom}>{conv.getLastMessage().getMessageSender().getUsername()}</Text>
<Text style={styles.textMess}>{conv.getLastMessage()}</Text> <Text style={styles.textMess}>{conv.getLastMessage().getMessageContent()}</Text>
</View> </View>
</View> </View>
) )

@ -13,7 +13,7 @@ import { RootState } from "../redux/store"
import { MANAGER_USER } from "../../App" import { MANAGER_USER } from "../../App"
import { useUserStore } from "../context/userContext" import { useUserStore } from "../context/userContext"
import { ManagerCoinsUser } from "../core/User/userCoinsModifier" import { ManagerCoinsUser } from "../core/User/userCoinsModifier"
import ManagerUser from "../services/userServices/ManagerUser" import ManagerUser from "../services/userServices/managerUser"
import UserSkinModifier from "../core/User/userSkinModifier" import UserSkinModifier from "../core/User/userSkinModifier"
import { useStoreStore } from "../context/storeContext" import { useStoreStore } from "../context/storeContext"
import tabSkinApp from "../constSkin" import tabSkinApp from "../constSkin"
@ -68,7 +68,7 @@ FC<{nav : any, skin: Skin, state: String}> =
} }
}, []); }, []);
async function buySkin(skin:Skin) { async function buySkin(skin:Skin) {
const mSkin=new UserSkinModifier(); const mSkin=new UserSkinModifier();

@ -0,0 +1,20 @@
import React from "react";
import create from "zustand";
import { MANAGER_USER } from "../../App";
import { Conversation } from "../core/conversation";
// Define store types
interface ConversationState {
tabConv: Conversation[] | undefined;
setTabConv: (tabConv: Conversation[]) => void;
resetTabConv: () => void;
}
// Define store data and methods
export const useConversationStore = create<ConversationState>()((set, get) => ({
tabConv: undefined,
setTabConv: (tabConv) => set((state) => ({ tabConv: tabConv })),
resetTabConv: () => set((state) => ({tabConv: undefined})),
}));

@ -1,5 +1,5 @@
import { MANAGER_USER } from "../../../App"; import { MANAGER_USER } from "../../../App";
import ManagerUser from "../../services/userServices/ManagerUser"; import ManagerUser from "../../services/userServices/managerUser";
import { User } from "./user"; import { User } from "./user";
export class ManagerCoinsUser{ export class ManagerCoinsUser{

@ -1,7 +1,7 @@
import { User } from "./user"; import { User } from "./user";
import tabSkinApp from "../../constSkin"; import tabSkinApp from "../../constSkin";
import { Conversation } from "../conversation"; import { Conversation } from "../conversation";
import ManagerUser from "../../services/userServices/ManagerUser"; import ManagerUser from "../../services/userServices/managerUser";
import { MANAGER_USER } from "../../../App"; import { MANAGER_USER } from "../../../App";
export class UserCreator{ export class UserCreator{

@ -9,7 +9,7 @@ export default class UserModificationManager{
} }
async changeUsername(user:User, username:string){ async changeUsername(user:User, username:string){
user.setPassword(username); user.setUsername(username);
await MANAGER_USER.getsaverUser().updateUser(user); await MANAGER_USER.getsaverUser().updateUser(user);
} }

@ -56,7 +56,7 @@ export class Conversation{
/* Brief : function returning the last message of a conversation */ /* Brief : function returning the last message of a conversation */
getLastMessage(){ getLastMessage(){
this.sortMessageDesc(); this.sortMessageDesc();
return this.tabMessage[0].getMessageContent(); return this.tabMessage[0];
} }
/* Brief : function sorting the messages of a conversation to be in the discussion order */ /* Brief : function sorting the messages of a conversation to be in the discussion order */

@ -1,16 +1,18 @@
import { StatusBar } from 'expo-status-bar' import { StatusBar } from 'expo-status-bar'
import {View} from 'react-native' import {View} from 'react-native'
import React from 'react'; import React, { useCallback } from 'react';
import stylesScreen from './style/screens.style'; import stylesScreen from './style/screens.style';
import { TopBar } from '../components/TopBar'; import { TopBar } from '../components/TopBar';
import { BotBar } from '../components/BotBar'; import { BotBar } from '../components/BotBar';
import { FlatList } from 'react-native-gesture-handler'; import { FlatList } from 'react-native-gesture-handler';
import { ConversationComponent } from '../components/ConversationComponent'; import { ConversationComponent } from '../components/ConversationComponent';
import { Conversation } from '../core/conversation';
import { MANAGER_CONVERSATION, MANAGER_USER } from '../../App';
import { useConversationStore } from '../context/conversationContext';
function Chat(props: { navigation: any; }) { function Chat(props: { navigation: any; }) {
const { navigation } = props const { navigation } = props
return ( return (
<View style={stylesScreen.container}> <View style={stylesScreen.container}>
<TopBar <TopBar
@ -18,12 +20,10 @@ function Chat(props: { navigation: any; }) {
/> />
<View style={stylesScreen.bodyStart}> <View style={stylesScreen.bodyStart}>
{/*
<FlatList <FlatList
data={MANAGER_USER.getCurrentUser().getTabConv()} data={useConversationStore().tabConv}
renderItem={({item}) => <ConversationComponent conv={item} state='Preview'/>} renderItem={({item}) => <ConversationComponent conv={item} state='Preview' navigation={navigation}/>}
/> />
*/}
</View> </View>
<BotBar <BotBar
nav={navigation} nav={navigation}

@ -32,7 +32,7 @@ function SignIn(props: { navigation: any; }) {
const handleUserConnect = useCallback(async (pseudo: string, password: string) => { const handleUserConnect = useCallback(async (pseudo: string, password: string) => {
const us =await MANAGER_USER.getLoaderUser().loadByUsernamePassword(pseudo, password).then((res) => { await MANAGER_USER.getLoaderUser().loadByUsernamePassword(pseudo, password).then((res) => {
if (res!=null){ if (res!=null){
MANAGER_USER.setCurrentUser(res); MANAGER_USER.setCurrentUser(res);
setUser(MANAGER_USER.getCurrentUser()); setUser(MANAGER_USER.getCurrentUser());
@ -41,9 +41,9 @@ function SignIn(props: { navigation: any; }) {
else{ else{
console.log("wesh c'est null"); console.log("wesh c'est null");
} }
}); });
}, []); }, []);
return ( return (

@ -0,0 +1,14 @@
import { Conversation } from "../../core/conversation";
import ISaverConversation from "./ISaverConversation";
export class FakeSaverConversation implements ISaverConversation{
async saveConversation(c: Conversation): Promise<void> {
return;
}
async deleteConversation(c: Conversation): Promise<void> {
return;
}
async updateConversation(c: Conversation): Promise<void> {
return;
}
}

@ -0,0 +1,38 @@
import { Conversation } from "../../core/conversation";
import { Message } from "../../core/message";
import { Skin } from "../../core/skin";
import { User } from "../../core/User/user";
import ILoaderConversation from "./ILoaderConversation";
export class LoaderConversationApi implements ILoaderConversation{
private axios = require('axios').default;
loadAllConversation(): Promise<Conversation[]> {
throw new Error("Method not implemented.");
}
loadByID(id: string): Promise<Conversation | null> {
throw new Error("Method not implemented.");
}
async loadByUser(u: User): Promise<Conversation[]> {
let tabConv:Conversation[]=[];
await this.axios({
method: 'get',
url: 'https://jsonplaceholder.typicode.com/todos/1',
params: {
name: "getConversationByUser",
//Les params genre nom de la fonction en php
}
})
.then(function (response: any) {
tabConv=[new Conversation("C0001",
[new User("U0001", "Alban", "oui", "ouioui", "homme", new Date(2022,12,12), 555, 667, 12, new Skin("S0001", "Bob",require('bob_party/assets/BobsSkins/BobClassic.png'), 0), [new Skin("S0001", "Bob",require('bob_party/assets/BobsSkins/BobClassic.png'), 0)]),
new User("U0002", "Fefe63", "jesuishm", "ouioui", "homme", new Date(2022,12,12), 12222, 123324, 12, new Skin("S0001", "Bob",require('bob_party/assets/BobsSkins/BobClassic.png'), 0), [new Skin("S0001", "Bob",require('bob_party/assets/BobsSkins/BobClassic.png'), 0)]),],
[new Message("M0001", "bonjour", new User("U0001", "Alban", "oui", "ouioui", "homme", new Date(2022,12,12), 555, 667, 12, new Skin("S0001", "Bob",require('bob_party/assets/BobsSkins/BobClassic.png'), 0), [new Skin("S0001", "Bob",require('bob_party/assets/BobsSkins/BobClassic.png'), 0)]), new Date(2022,12,12)),
new Message("M0002", "test", new User("U0002", "Fefe63", "oui", "ouioui", "homme", new Date(2022,12,12), 555, 667, 12, new Skin("S0002", "Bob Blue",require('bob_party/assets/BobsSkins/BobBlue.png'), 100), [new Skin("S0002", "Bob Blue",require('bob_party/assets/BobsSkins/BobBlue.png'), 100)]), new Date(2022,12,13))], "leNom")];
});
return tabConv;
}
}

@ -0,0 +1,34 @@
import { Conversation } from "../../core/conversation";
import { User } from "../../core/User/user";
import ILoaderConversation from "./ILoaderConversation";
import ISaverConversation from "./ISaverConversation";
export default class ManagerConversation{
private currentTabConv:Conversation[]=[];
private loaderConversation: ILoaderConversation;
private saverConversation: ISaverConversation;
constructor(loaderConversation:ILoaderConversation, saverConversation:ISaverConversation){
this.loaderConversation=loaderConversation;
this.saverConversation=saverConversation;
}
getCurrentTabConv(){
return this.currentTabConv;
}
setCurrentTabConv(c:Conversation[]){
this.currentTabConv=c;
}
getLoaderConversation(){
return this.loaderConversation;
}
getsaverConversation(){
return this.saverConversation;
}
}
Loading…
Cancel
Save