Merge branch 'Persistance' of https://codefirst.iut.uca.fr/git/BOB_PARTEAM/BOB_PARTY into Persistance
continuous-integration/drone/push Build is failing Details

Persistance
Mathilde JEAN 2 years ago
commit 8c7f5e364b

@ -5,7 +5,6 @@ import LoaderUserApi from './src/services/userServices/loaderUserApi'
import ManagerUser from './src/services/userServices/managerUser'
import FakeSaverUser from './src/services/userServices/fakeSaverUser'
import React, { useCallback } from 'react';
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'
@ -14,6 +13,9 @@ import LoaderMatchApi from './src/services/matchServices/loaderMatchApi'
import SaverMatchApi from './src/services/matchServices/saverMatchApi'
import LoaderGameApi from './src/services/gameService/loaderGameApi'
import ManagerGame from './src/services/gameService/managerGame'
import { useFonts } from 'expo-font';
import * as SplashScreen from 'expo-splash-screen';
import { View } from 'react-native'
export const MANAGER_USER = new ManagerUser(new LoaderUserApi, new FakeSaverUser);
@ -22,13 +24,22 @@ export const MANAGER_MATCH = new ManagerMatch(new LoaderMatchApi, new SaverMatch
export const MANAGER_GAME = new ManagerGame(new LoaderGameApi);
export default function App() {
export default function App() {
const [fontsLoaded] = useFonts({
'Helvetica': require('./assets/fonts/Helvetica.ttf'),
});
if (!fontsLoaded) {
return null;
}
return (
<Provider store={store}>
<MainTabNavigator/>
<Provider store={store} >
<MainTabNavigator />
</Provider>
);
}
}

@ -1,64 +1,9 @@
module.exports = function(api) {
module.exports = function (api) {
api.cache(true);
return {
presets: [
[
'@babel/preset-env',
{
targets: {
browsers: [
'last 2 Chrome versions',
'last 2 Edge versions',
'last 2 Firefox versions',
'last 2 Safari versions',
'IE 11',
['babel-preset-expo'],
['@babel/preset-env', { targets: { node: 'current' } }]
],
},
loose: true,
modules: false,
useBuiltIns: 'usage',
corejs: {
version: 3,
proposals: true,
},
},
],
'@babel/preset-react',
'@babel/preset-flow',
],
plugins: [
'@babel/plugin-transform-spread',
'@babel/plugin-syntax-dynamic-import',
[
'@babel/plugin-proposal-class-properties',
{
loose: false,
},
],
],
ignore: ['node_modules'],
overrides: [
{
test: ['./src/**/*.ts', './src/**/*.tsx'],
presets: [
'@babel/preset-typescript',
[
'@babel/preset-env',
{
targets: {
node: 'current',
},
},
],
'@babel/preset-react',
],
},
],
env: {
test: {
plugins: ['babel-plugin-rewire-ts'],
presets: ['@babel/preset-typescript', '@babel/preset-env', '@babel/preset-react'],
},
},
};
};

@ -1,7 +1,5 @@
import React from 'react'
import App from './App'
import store from './src/redux/store'
import { Provider } from 'react-redux'
// export for others scripts to use
@ -9,10 +7,5 @@ import { Provider } from 'react-redux'
export default function Index(){
return(
<App/>
/*
<Provider store={store}>
<App />
</Provider>
*/
)
}

File diff suppressed because it is too large Load Diff

@ -10,6 +10,7 @@
"test": "jest"
},
"dependencies": {
"@babel/runtime": "^7.20.6",
"@react-native-community/datetimepicker": "6.2.0",
"@react-native-picker/picker": "2.4.2",
"@react-navigation/bottom-tabs": "^6.4.0",
@ -23,7 +24,7 @@
"babel-preset-env": "^1.7.0",
"babel-preset-typescript": "^7.0.0-alpha.19",
"babel-test": "^0.2.4",
"expo": "^46.0.15",
"expo": "^46.0.17",
"expo-status-bar": "~1.4.0",
"jest": "^29.3.1",
"jquery": "^3.6.1",
@ -43,9 +44,12 @@
"zustand": "^4.1.4"
},
"devDependencies": {
"@babel/core": "^7.20.5",
"@babel/preset-env": "^7.20.2",
"@babel/preset-typescript": "^7.18.6",
"@babel/core": "^7.12.9",
"@babel/plugin-proposal-class-properties": "^7.0.0",
"@babel/plugin-transform-runtime": "^7.0.0",
"@babel/preset-env": "^7.0.0",
"@babel/register": "^7.0.0",
"@babel/runtime": "^7.5.5",
"@jest/globals": "^29.3.1",
"@types/jest": "^29.2.3",
"@types/jquery": "^3.5.14",
@ -53,7 +57,7 @@
"@types/node": "^18.8.4",
"@types/react": "~18.0.14",
"@types/react-native": "~0.69.1",
"babel-jest": "^29.3.1",
"babel-preset-react-native": "^4.0.0",
"ts-jest": "^29.0.3",
"typescript": "^4.9.3"
},

@ -21,7 +21,7 @@ let points=0;
function CookieClicker(props: { navigation: any}){
const { navigation } = props
const GAMING_TIME=45;
const GAMING_TIME=120;
const setUser = useUserStore((state) => state.setUser);
@ -86,9 +86,8 @@ function CookieClicker(props: { navigation: any}){
}
function endGame(){
let tmp: User | null;
tmp=MANAGER_USER.getCurrentUser();
if (tmp!=null){
const tmp=MANAGER_USER.getCurrentUser();
if (tmp!==null){
if (MANAGER_MATCH.getCurrentMatch()?.getTabUsers().includes(tmp)){
MANAGER_MATCH.getCurrentMatch()?.updatePostMatch(tmp, points);
setUser(tmp);

@ -1,5 +1,5 @@
import { FC, ReactNode, useCallback } from "react"
import { Pressable, Image, View} from "react-native"
import { Pressable, Image, View } from "react-native"
import React from "react"
/*
@ -30,38 +30,37 @@ const smessage = require('../../assets/Icons/Selected/SChat.png');
const sstore = require('../../assets/Icons/Selected/SStore.png');
export const BotBar :
/* Parameters :
export const BotBar:
/* Parameters :
* nav : tool needed to allow the navigation between the screens
* state : optional parameter that indicates from which screen the component has been called
(the string must be the name of the screen)
*/
FC<{nav: any, state?: String}> =
({nav, state}) =>
{
*/
FC<{ nav: any, state?: String }> =
({ nav, state }) => {
const setTabSkin = useStoreStore((state) => state.setTabSkin);
const setTabConv = useConversationStore((state) => state.setTabConv);
const handleStoreChange = useCallback(async () => {
let tabSkinStore=[...tabSkinApp];
let tmp=MANAGER_USER.getCurrentUser()?.getTabSkin();
if (tmp!=undefined){
tmp.forEach(skin => {
for (let i=0; i<tabSkinStore.length; i++){
if(skin.isEqual(tabSkinStore[i])){
tabSkinStore.splice(i,1);
let tabSkinStore = [...tabSkinApp];
// const tmp=MANAGER_USER.getCurrentUser()?.getTabSkin();
// if (tmp!==undefined){
MANAGER_USER.getCurrentUser()?.getTabSkin()?.forEach(skin => {
for (let i = 0; i < tabSkinStore.length; i++) {
if (skin.isEqual(tabSkinStore[i])) {
tabSkinStore.splice(i, 1);
}
}
});
setTabSkin(tabSkinStore);
}
// }
}, []);
const handleConversationChange = useCallback(async () => {
let tmp=MANAGER_USER.getCurrentUser();
if (tmp!=undefined){
const tmp = MANAGER_USER.getCurrentUser();
if (tmp !== null) {
await MANAGER_CONVERSATION.getLoaderConversation().loadByUser(tmp).then((res) => {
MANAGER_CONVERSATION.setCurrentTabConv(res);
setTabConv(res);
@ -73,7 +72,7 @@ FC<{nav: any, state?: String}> =
/*
By default, all the images are the white ones
*/
var imgLeft=message, imgMid=gamepad, imgRight=store
var imgLeft = message, imgMid = gamepad, imgRight = store
/*
For each screen corresponding to a screen of the bottom bar,
@ -101,19 +100,19 @@ FC<{nav: any, state?: String}> =
*/
return (
<View style={styles.footer}>
<Pressable onPress={() => {handleConversationChange() ;nav.navigate('ChatTab')}}>
<Pressable onPress={() => { handleConversationChange(); nav.navigate('ChatTab') }}>
<Image
style={styles.icon}
source={imgLeft}
/>
</Pressable>
<Pressable onPress={()=> {nav.navigate('HomeTab', {screen: 'Home'})}}>
<Pressable onPress={() => { nav.navigate('HomeTab', { screen: 'Home' }) }}>
<Image
style={styles.icon}
source={imgMid}
/>
</Pressable>
<Pressable onPress={() => {handleStoreChange(); nav.navigate('StoreTab')}}>
<Pressable onPress={() => { handleStoreChange(); nav.navigate('StoreTab') }}>
<Image
style={styles.icon}
source={imgRight}
@ -121,4 +120,4 @@ FC<{nav: any, state?: String}> =
</Pressable>
</View>
)
}
}

@ -30,8 +30,8 @@ FC<{game: Game, nav: any}> =
const createNewMatchSolo = useCallback(async (game : Game, nav: any) => {
const m=new MatchCreator();
let tmp=MANAGER_USER.getCurrentUser();
if (tmp!=null){
const tmp=MANAGER_USER.getCurrentUser();
if (tmp!==null){
let match=await m.createMatch(tmp, game);
MANAGER_MATCH.setCurrentMatch(match);
setMatch(match);

@ -8,12 +8,9 @@ import { Skin } from "../core/skin"
*/
import styles from "./style/Skin.style"
import { useDispatch, useSelector } from "react-redux"
import { loginUser } from "../redux/features/currentUserSlice"
import { RootState } from "../redux/store"
import { MANAGER_USER } from "../../App"
import { useUserStore } from "../context/userContext"
import { ManagerCoinsUser } from "../core/User/userCoinsModifier"
import ManagerUser from "../services/userServices/managerUser"
import UserSkinModifier from "../core/User/userSkinModifier"
import { useStoreStore } from "../context/storeContext"
import tabSkinApp from "../constSkin"
@ -21,31 +18,30 @@ import tabSkinApp from "../constSkin"
export const SkinComponent :
export const SkinComponent:
/* Parameters :
/* Parameters :
* skin : Skin to be displayed
* state : Indicates from wich screen the component has been called
*/
FC<{nav : any, skin: Skin, state: String}> =
({nav, skin, state}) =>
{
*/
FC<{ nav: any, skin: Skin, state: String }> =
({ nav, skin, state }) => {
const navigation = nav;
const dispatch=useDispatch();
const dispatch = useDispatch();
const setUser = useUserStore((state) => state.setUser);
const setTabSkin = useStoreStore((state) => state.setTabSkin);
async function changerSkin(skin:Skin) {
const m=new UserSkinModifier();
async function changerSkin(skin: Skin) {
const m = new UserSkinModifier();
const tmp = MANAGER_USER.getCurrentUser();
if (tmp!=null){
if (tmp !== null) {
await m.changeCurrentSkin(tmp, skin);
setUser(tmp);
MANAGER_USER.setCurrentUser(tmp);
@ -54,37 +50,37 @@ FC<{nav : any, skin: Skin, state: String}> =
const handleStoreChange = useCallback(async () => {
let tabSkinStore=[...tabSkinApp];
let tmp=MANAGER_USER.getCurrentUser()?.getTabSkin();
if (tmp!=undefined){
tmp.forEach(skin => {
for (let i=0; i<tabSkinStore.length; i++){
if(skin.isEqual(tabSkinStore[i])){
tabSkinStore.splice(i,1);
let tabSkinStore = [...tabSkinApp];
// const tmp=MANAGER_USER.getCurrentUser()?.getTabSkin();
// if (tmp!=undefined){
MANAGER_USER.getCurrentUser()?.getTabSkin()?.forEach(skin => {
for (let i = 0; i < tabSkinStore.length; i++) {
if (skin.isEqual(tabSkinStore[i])) {
tabSkinStore.splice(i, 1);
}
}
});
setTabSkin(tabSkinStore);
}
//}
}, []);
async function buySkin(skin:Skin) {
const mSkin=new UserSkinModifier();
const mCoins= new ManagerCoinsUser();
async function buySkin(skin: Skin) {
const mSkin = new UserSkinModifier();
const mCoins = new ManagerCoinsUser();
const tmp = MANAGER_USER.getCurrentUser();
if (tmp!=null){
if (tmp !== null) {
await mCoins.removeCoins(tmp,skin.getSkinCost()).then(async (res) => {
if(res==true){
await mCoins.removeCoins(tmp, skin.getSkinCost()).then(async (res) => {
if (res == true) {
await mSkin.addSkin(tmp, skin);
setUser(tmp);
MANAGER_USER.setCurrentUser(tmp);
Alert.alert("Achat du skin");
handleStoreChange();
}
else{
else {
Alert.alert("Pas assez d'argent pour acheter le skin");
}
});
@ -103,47 +99,47 @@ FC<{nav : any, skin: Skin, state: String}> =
case 'icon':
return (
<View>
<Image source={{uri: skin.getSkinSource()}} style={styles.icon}/>
<Image source={{ uri: skin.getSkinSource() }} style={styles.icon} />
</View>
)
case 'shop':
return(
return (
<Pressable onPress={() => buySkin(skin)} style={styles.imageWrapper}>
<Text style={styles.nomSkin}>{skin.getSkinName()}</Text>
<Image
style={styles.imageSkin}
source={{uri: skin.getSkinSource()}}
source={{ uri: skin.getSkinSource() }}
/>
<Text style={styles.nomSkin}>100</Text>
</Pressable>
)
case 'liste':
return(
<Pressable onPress={() => {changerSkin(skin); navigation.goBack()}} style={styles.imageWrapper}>
return (
<Pressable onPress={() => { changerSkin(skin); navigation.goBack() }} style={styles.imageWrapper}>
<Text style={styles.nomSkin}>{skin.getSkinName()}</Text>
<Image
style={styles.imageSkin}
source={{uri: skin.getSkinSource()}}
source={{ uri: skin.getSkinSource() }}
/>
</Pressable>
)
case 'profile':
return(
return (
<Pressable onPress={() => Alert.alert("cool")} style={styles.imageWrapperProfil}>
<Text style={styles.nomSkin}>{skin.getSkinName()}</Text>
<Image
style={styles.imageSkin}
source={{uri: skin.getSkinSource()}}
source={{ uri: skin.getSkinSource() }}
/>
</Pressable>
)
default:
return(
return (
<Image
style={styles.imageSkin}
source={{uri: skin.getSkinSource()}}
source={{ uri: skin.getSkinSource() }}
/>
)
}
}
}

@ -12,6 +12,12 @@ interface GameState {
tabGame: Game[] | undefined;
setTabGame: (tabGame: Game[]) => void;
resetTabGame: () => void;
tabGameSolo: Game[] | undefined;
setTabGameSolo: (tabGame: Game[]) => void;
resetTabGameSolo: () => void;
tabGameMulti: Game[] | undefined;
setTabGameMulti: (tabGame: Game[]) => void;
resetTabGameMulti: () => void;
}
// Define store data and methods
@ -19,5 +25,11 @@ export const useGameStore = create<GameState>()((set, get) => ({
tabGame: undefined,
setTabGame: (tabGame) => set((state) => ({ tabGame: tabGame })),
resetTabGame: () => set((state) => ({ tabGame: undefined })),
tabGameSolo: undefined,
setTabGameSolo: (tabGame) => set((state) => ({ tabGameSolo: tabGame })),
resetTabGameSolo: () => set((state) => ({ tabGameSolo: undefined })),
tabGameMulti: undefined,
setTabGameMulti: (tabGame) => set((state) => ({ tabGameMulti: tabGame })),
resetTabGameMulti: () => set((state) => ({ tabGameMulti: undefined })),
}));

@ -31,7 +31,6 @@ export const currentUserSlice = createSlice({
updatePseudo: (state, action: PayloadAction<string>) =>{
const newUser: User = new User(currentUser.getId(), currentUser.getUsername(), currentUser.getPassword(), currentUser.getNationality(), currentUser.getSexe(), currentUser.getDateOfBirth());
console.log(currentUser);
newUser.setUsername(action.payload);
return {
...state,

@ -20,7 +20,6 @@ let tabConv:Conversation[]=[];
function GameChoice(props: { navigation: any}) {
const { navigation} = props
console.log(MANAGER_GAME.getTabGame());
return (
<View style={stylesScreen.container}>
<TopBar
@ -37,7 +36,7 @@ function GameChoice(props: { navigation: any}) {
</View>
<BotBar
nav={navigation}
state='Store'
state='Home'
/>
</View>
);

@ -1,5 +1,5 @@
import { StatusBar } from 'expo-status-bar'
import { View} from 'react-native'
import { View } from 'react-native'
import React, { useCallback } from 'react';
import stylesScreen from './style/screens.style'
import { TopBar } from '../components/TopBar';
@ -8,45 +8,106 @@ import { Conversation } from '../core/conversation';
import { ButtonGameTypeChoice } from '../components/ButtonGameTypeChoice';
import { MANAGER_GAME } from '../../App';
import { useGameStore } from '../context/gameContext';
import { GameSolo } from '../core/gameSolo';
import { Game } from '../core/game';
import game from '../testGameSolo';
let tabConv:Conversation[]=[];
let tabConv: Conversation[] = [];
function Home(props: { navigation: any; }) {
const { navigation } = props
const setTabGame = useGameStore((state) => state.setTabGame);
const setTabGameSolo = useGameStore((state) => state.setTabGameSolo);
const setTabGameMulti = useGameStore((state) => state.setTabGameMulti);
const handleGame = useCallback(async () => {
let tmp=MANAGER_GAME.getTabGame();
/*
const handleGame = useCallback(async (typeJeu: string) => {
switch(typeJeu){
case 'solo':
let tabSolo:Game[]=[]
let tmp=MANAGER_GAME.getTabGameSolo();
if (tmp==null){
let tabAll=MANAGER_GAME.getTabGame();
if (tabAll==null){
await MANAGER_GAME.getLoaderGame().loadAllGame().then((res) => {
MANAGER_GAME.setTabGame(res);
setTabGame(res);
});
}
tabAll?.forEach(game =>{
if (game.getNbPlayerMax()==1){
tabSolo.push(game);
}
})
MANAGER_GAME.setTabGameSolo(tabSolo);
setTabGameSolo(tabSolo);
navigation.navigate('GameChoiceTab')
}
else{
navigation.navigate('GameChoiceTab')
}
case 'multi':
let tabMulti:Game[]=[]
let tkt=MANAGER_GAME.getTabGameSolo();
if (tkt==null){
let tabAll=MANAGER_GAME.getTabGame();
if (tabAll==null){
await MANAGER_GAME.getLoaderGame().loadAllGame().then((res) => {
MANAGER_GAME.setTabGame(res);
setTabGame(res);
});
}
tabAll?.forEach(game =>{
if (game.getNbPlayerMax()==1){
tabSolo.push(game);
}
})
MANAGER_GAME.setTabGameMulti(tabMulti);
setTabGameMulti(tabMulti);
navigation.navigate('GameChoiceTab')
}
else{
navigation.navigate('GameChoiceTab')
}
}
}, []);
*/
const handleGame = useCallback(async (typeJeu: string) => {
const tmp = MANAGER_GAME.getTabGame();
if (tmp === null) {
await MANAGER_GAME.getLoaderGame().loadAllGame().then((res) => {
MANAGER_GAME.setTabGame(res);
setTabGame(res);
navigation.navigate('GameChoiceTab')
});
}
else {
navigation.navigate('GameChoiceTab')
}
}, []);
return (
<View style={stylesScreen.container}>
<TopBar
nav={navigation}
state= 'Home'
state='Home'
/>
<View style={stylesScreen.bodyCenter}>
<ButtonGameTypeChoice
title='Jouer Seul'
onPress={() => {handleGame()}}
onPress={() => { handleGame("solo") }}
/>
<ButtonGameTypeChoice
title='Défier mes amis'
onPress={() => handleGame()}
onPress={() => handleGame("multi")}
/>
</View>
<BotBar

@ -30,8 +30,8 @@ function Settings(props: { navigation: any; }) {
async function changeUsername(username:string){
const m = new UserModificationManager();
let tmp=MANAGER_USER.getCurrentUser();
if (tmp!=null){
const tmp=MANAGER_USER.getCurrentUser();
if (tmp!==null){
await m.changeUsername(tmp, username);
setUser(tmp);
MANAGER_USER.setCurrentUser(tmp);
@ -40,8 +40,8 @@ function Settings(props: { navigation: any; }) {
async function changePassword(password:string){
const m = new UserModificationManager();
let tmp=MANAGER_USER.getCurrentUser();
if (tmp!=null){
const tmp=MANAGER_USER.getCurrentUser();
if (tmp!==null){
await m.changePassword(tmp, password);
setUser(tmp);
MANAGER_USER.setCurrentUser(tmp);

@ -38,9 +38,7 @@ function SignIn(props: { navigation: any; }) {
setUser(MANAGER_USER.getCurrentUser());
navigation.navigate('HomeTab');
}
else{
console.log("wesh c'est null");
}
});
}, []);

@ -26,7 +26,6 @@ function SignUp(props: { navigation: any; }) {
function onDateSelected(event : DateTimePickerEvent, value : Date | undefined) {
console.log(value);
if (value != undefined) {
setDate(value);
}

@ -24,9 +24,7 @@ export default class LoaderGameApi implements ILoaderGame{
map.set(300,150);
map.set(450,1000);
const cookieClicker= new GameSolo(1, "Cookie Clicker", "https://codefirst.iut.uca.fr/git/BOB_PARTEAM/BOB_PARTY/raw/branch/typescript/bob_party/assets/ImagesJeux/Pong.png", "/Games/CookieClicker/cookieClicker.tsx", 1, 1, map);
const test= new GameSolo(1, "Test", "https://codefirst.iut.uca.fr/git/BOB_PARTEAM/BOB_PARTY/raw/branch/typescript/bob_party/assets/ImagesJeux/Pendu.jpg", "/Games/CookieClicker/cookieClicker.tsx", 1, 1, map);
tab=[cookieClicker, test];
console.log(tab);
tab=[cookieClicker];
});
return tab;

@ -5,6 +5,10 @@ export default class ManagerGame{
private tabGame: Game[] | null=null;
private tabGameSolo: Game[] | null=null;
private tabGameMulti: Game[] | null=null;
private loaderGame: ILoaderGame;
constructor(loader:ILoaderGame){
@ -19,6 +23,22 @@ export default class ManagerGame{
this.tabGame=g;
}
getTabGameSolo(){
return this.tabGame;
}
setTabGameSolo(g:Game[] | null){
this.tabGameSolo=g;
}
getTabGameMulti(){
return this.tabGameMulti;
}
setTabGameMulti(g:Game[] | null){
this.tabGameMulti=g;
}
getLoaderGame(){
return this.loaderGame;
}

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save