diff --git a/R-Dash/App.tsx b/R-Dash/App.tsx index c5531cd..9d75d5e 100644 --- a/R-Dash/App.tsx +++ b/R-Dash/App.tsx @@ -15,14 +15,18 @@ import Register from './screens/Register'; import Session_browser from './screens/Session_browser'; import Team_Browser from './screens/Team_Browser'; import Team_Selection from './screens/Team_Selection'; +import { Provider } from 'react-redux'; +import store from './redux/Store'; export default function App() { return ( - - - - - + + + + + + + ); } diff --git a/R-Dash/core/Lap.ts b/R-Dash/core/Lap.ts index fc45595..430466f 100644 --- a/R-Dash/core/Lap.ts +++ b/R-Dash/core/Lap.ts @@ -14,8 +14,8 @@ export class Lap { getNumber(){ return this.number; } - setNumber(){ - return this.number; + setNumber(number :number){ + this.number = number; } getPoints() { diff --git a/R-Dash/core/Session.ts b/R-Dash/core/Session.ts index 80e1c40..3adabdb 100644 --- a/R-Dash/core/Session.ts +++ b/R-Dash/core/Session.ts @@ -1,4 +1,5 @@ import { Lap } from "./Lap"; +import { SessionType } from "./SessionType"; export class Session { private name: string; diff --git a/R-Dash/core/Team.ts b/R-Dash/core/Team.ts index fe9811a..bafbecf 100644 --- a/R-Dash/core/Team.ts +++ b/R-Dash/core/Team.ts @@ -7,14 +7,13 @@ export class Team { private users: User[]; private logo: HTMLImageElement; - constructor(name: string, owner: User,users: User[] = [], logo: HTMLImageElement = require('../assets/images/people.jpg')) { + constructor(name: string, owner: User ,users: User[] = [], logo: HTMLImageElement = require('../assets/images/people.jpg')) { this.name = name; this.owner = owner; this.users = users; this.logo = logo; } - getName() { return this.name; } diff --git a/R-Dash/redux/Constants.ts b/R-Dash/redux/Constants.ts index e69de29..c64d810 100644 --- a/R-Dash/redux/Constants.ts +++ b/R-Dash/redux/Constants.ts @@ -0,0 +1,5 @@ +export const FETCH_USERS = 'FETCH_USERS'; +export const FETCH_TEAMS = 'FETCH_TEAMS'; +export const FETCH_SESSIONS = 'FETCH_SESSIONS'; +export const ADD_TEAM = 'ADD_TEAM'; +export const ADD_FILE = 'ADD_FILE'; \ No newline at end of file diff --git a/R-Dash/redux/actions/sessions.ts b/R-Dash/redux/actions/sessions.ts new file mode 100644 index 0000000..f883fd5 --- /dev/null +++ b/R-Dash/redux/actions/sessions.ts @@ -0,0 +1,51 @@ +import { Geocalisation } from "../../core/Geocalisation"; +import { Lap } from "../../core/Lap"; +import { Point } from "../../core/Point"; +import { Session } from "../../core/Session"; +import { User } from "../../core/User"; +import { FETCH_SESSIONS } from "../Constants"; + +export const setSessionsList = (sessionsList: Session[]) => { + return { + type: FETCH_SESSIONS, + payload: sessionsList, + }; +} + +export const addXlsFile = async (file: File) => { + try { + const formData = new FormData(); + formData.append('file', file); + const response = await fetch('https://codefirst.iut.uca.fr/containers/enzojolys-r-dash_container/upload', { + method: 'POST', + body: formData + }); + const data = await response.json(); + return data; + } catch (error) { + console.log('Error---------', error); + } +}; + +export const getSessionsList = (user: User) => { + return async dispatch => { + try { + const sessionsPromise = await fetch('https://codefirst.iut.uca.fr/containers/enzojolys-r-dash_container/Sessions/'+user.getUsername); + const sessionsListJson = await sessionsPromise.json(); + const sessionsList: Session[] = sessionsListJson.map(elt => { + const laps: Lap[] = elt.laps.map(lap => { + const points: Point[] = lap.points.map(point => { + const geo = new Geocalisation(point.geo.latitude, point.geo.longitude); + return new Point(geo, point.timer, point.distance, point.nGear, point.pBrakeF, point.aSteer, point.rPedal, point.gLong, point.gLat, point.vCar); + }); + return new Lap(lap.number, points, lap.time); + }); + return new Session(elt.name, laps, elt.type); + }); + dispatch(setSessionsList(sessionsList)); + } catch (error) { + console.log('Error---------', error); + //dispatch(fetchDataRejected(error)) + } + } +} \ No newline at end of file diff --git a/R-Dash/redux/actions/teams.ts b/R-Dash/redux/actions/teams.ts index f08baa3..5f6c042 100644 --- a/R-Dash/redux/actions/teams.ts +++ b/R-Dash/redux/actions/teams.ts @@ -1,23 +1,45 @@ import { Team } from "../../core/Team"; -import { Fetch_Teams } from "../Constants"; +import { FETCH_TEAMS, ADD_TEAM } from "../Constants"; -export const setCitiesList = (citiesList: Team[]) => { +export const setTeamsList = (teamsList: Team[]) => { return { - type: Fetch_Teams, - payload: citiesList, + type: FETCH_TEAMS, + payload: teamsList, }; } -export const getCitiesList = () => { +export const addNewTeam = (newTeam: Team) => { return async dispatch => { try { - const citiesPromise = await fetch('https://iut-weather-api.azurewebsites.net/'); - const citiesListJson = await citiesPromise.json(); - const citiesList: Team[] = citiesListJson.map(elt => new Localisation(elt["name"], elt["latitude"], elt["longitude"])); - dispatch(setCitiesList(citiesList)); + const response = await fetch('https://codefirst.iut.uca.fr/containers/enzojolys-r-dash_container/Ecuries', { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify(newTeam) + }); + const team = await response.json(); + dispatch({ + type: ADD_TEAM, + payload: team + }); } catch (error) { console.log('Error---------', error); //dispatch(fetchDataRejected(error)) } } -} \ No newline at end of file +} + +export const getTeamsList = () => { + return async dispatch => { + try { + const teamsPromise = await fetch('https://codefirst.iut.uca.fr/containers/enzojolys-r-dash_container/Ecuries'); + const teamsListJson = await teamsPromise.json(); + const teamsList: Team[] = teamsListJson.map(elt => new Team(elt["name"], elt["owner"], elt["users"], elt["logo"])); + dispatch(setTeamsList(teamsList)); + } catch (error) { + console.log('Error---------', error); + //dispatch(fetchDataRejected(error)) + } + } +} \ No newline at end of file diff --git a/R-Dash/redux/actions/users.ts b/R-Dash/redux/actions/users.ts new file mode 100644 index 0000000..32f89b7 --- /dev/null +++ b/R-Dash/redux/actions/users.ts @@ -0,0 +1,36 @@ +import { Member } from "../../core/Member"; +import { Owner } from "../../core/Owner"; +import { Team } from "../../core/Team"; +import { User } from "../../core/User"; +import { WaitingMember } from "../../core/WaitingMember"; +import { FETCH_USERS } from "../Constants"; +import { DtoUserEcurie } from "../dto/dtoUserEcurie"; + +export const setUsersList = (usersList: User[]) => { + return { + type: FETCH_USERS, + payload: usersList, + }; +} + +export const getUsersList = (team: Team) => { + return async dispatch => { + try { + const usersPromise = await fetch('https://codefirst.iut.uca.fr/containers/enzojolys-r-dash_container/Pilotes/'+team); + const usersListJson = await usersPromise.json(); + const dto: DtoUserEcurie = usersListJson.map(elt => new DtoUserEcurie(elt["owner"], elt["members"], elt["waitingMember"])); + const usersList: User[] = [] + usersList.push(dto.getOwner()) + dto.getMembers().forEach(element => { + usersList.push(element); + }); + dto.getWaitingMember().forEach(element => { + usersList.push(element) + }); + dispatch(setUsersList(usersList)); + } catch (error) { + console.log('Error---------', error); + //dispatch(fetchDataRejected(error)) + } + } +} \ No newline at end of file diff --git a/R-Dash/redux/dto/dtoUserEcurie.ts b/R-Dash/redux/dto/dtoUserEcurie.ts new file mode 100644 index 0000000..7b51e62 --- /dev/null +++ b/R-Dash/redux/dto/dtoUserEcurie.ts @@ -0,0 +1,37 @@ +import { Member } from "../../core/Member"; +import { Owner } from "../../core/Owner"; +import { WaitingMember } from "../../core/WaitingMember"; + +export class DtoUserEcurie { + private owner: Owner; + private members: Member[]; + private waitingMember: WaitingMember[]; + + constructor(owner: Owner, members: Member[], waitingMember: WaitingMember[]) { + this.owner = owner; + this.members = members; + this.waitingMember = waitingMember; + } + + getOwner() { + return this.owner; + } + setOwner(owner: Owner) { + this.owner = owner; + } + + getMembers() { + return this.members; + } + setMembers(members: Member[]) { + this.members = members; + } + + getWaitingMember() { + return this.waitingMember; + } + setWaitingMember(waitingMember: WaitingMember[]) { + this.waitingMember = waitingMember; + } + +} \ No newline at end of file diff --git a/R-Dash/redux/reducers/appReducer.ts b/R-Dash/redux/reducers/appReducer.ts index 74da99e..0962117 100644 --- a/R-Dash/redux/reducers/appReducer.ts +++ b/R-Dash/redux/reducers/appReducer.ts @@ -1,32 +1,25 @@ +import { addXlsFile } from "../actions/sessions"; +import { addNewTeam } from "../actions/teams"; +import { FETCH_SESSIONS, FETCH_TEAMS, FETCH_USERS, ADD_TEAM, ADD_FILE } from "../Constants"; + const initialState = { - Teams: [], - Owners: [], - Members: [], - WaitingMembers: [], - Laps: [], - Points: [], - Sessions: [], - Tracks: [], + teams: [], + users: [], + sessions: [], }; const appReducer = (state = initialState, action: { type: any; payload: any; }) => { switch (action.type) { - case 'Fetch_Teams': - return { ...state, cities: [...state.Teams, action.payload] }; - case 'Fetch_Owners': - return { ...state, cities: [...state.Owners, action.payload] }; - case 'Fetch_Members': - return { ...state, cities: [...state.Members, action.payload] }; - case 'Fetch_WaitingMembers': - return { ...state, cities: [...state.WaitingMembers, action.payload] }; - case 'Fetch_laps': - return { ...state, cities: [...state.Laps, action.payload] }; - case 'Fetch_Points': - return { ...state, cities: [...state.Points, action.payload] }; - case 'Fetch_Sessions': - return { ...state, cities: [...state.Sessions, action.payload] }; - case 'Fetch_Tracks': - return { ...state, cities: [...state.Tracks, action.payload] }; + case ADD_TEAM: + return { ...state, teams: [...state.teams, addNewTeam] }; + case ADD_FILE: + return { ...state, sessions: [...state.sessions, addXlsFile] }; + case FETCH_TEAMS: + return { ...state, teams: action.payload }; + case FETCH_USERS: + return { ...state, users: action.payload }; + case FETCH_SESSIONS: + return { ...state, sessions: action.payload }; default: return state; } diff --git a/R-Dash/screens/CreateTeam.tsx b/R-Dash/screens/CreateTeam.tsx index 2a836b8..292cc8b 100644 --- a/R-Dash/screens/CreateTeam.tsx +++ b/R-Dash/screens/CreateTeam.tsx @@ -1,8 +1,10 @@ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { Button, Pressable } from 'react-native'; import { StyleSheet, Text, View, Image, TextInput } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import * as DocumentPicker from 'expo-document-picker'; +import { useDispatch, useSelector } from 'react-redux'; +import { addNewTeam } from '../redux/actions/teams'; export default function CreateTeam(props: { navigation: any }) { const { navigation } = props; @@ -20,6 +22,17 @@ export default function CreateTeam(props: { navigation: any }) { } }; + const nList = useSelector(state => state.appReducer.teams); + + const dispatch = useDispatch(); + + useEffect(() => { + const addTeams = async () => { + await dispatch(addNewTeam()); + }; + addTeams(); + }, [dispatch]); + return ( diff --git a/R-Dash/screens/Team_Browser.tsx b/R-Dash/screens/Team_Browser.tsx index cd4c88d..8d5756b 100644 --- a/R-Dash/screens/Team_Browser.tsx +++ b/R-Dash/screens/Team_Browser.tsx @@ -1,11 +1,12 @@ import { FlatList, StyleSheet, Text, View } from 'react-native'; import { SafeAreaView } from 'react-native-safe-area-context'; import { SearchBar } from '@rneui/base'; -import React, { useState } from 'react'; +import React, { useState, useEffect } from 'react'; import { TEAMS } from '../stub/stub'; import TeamListItem from '../components/TeamCmp'; import { Team } from '../core/Team'; - +import { useDispatch, useSelector } from 'react-redux'; +import { getTeamsList } from "../redux/actions/teams"; export default function Team_Browser(props: { navigation: any }) { @@ -19,7 +20,18 @@ export default function Team_Browser(props: { navigation: any }) { const filteredData = search !== '' ? TEAMS.filter((item) => item.getName().toLowerCase().includes(search.toLowerCase()) - ) : TEAMS; + ) : TEAMS; + + const nList = useSelector(state => state.appReducer.teams); + + const dispatch = useDispatch(); + + useEffect(() => { + const loadTeams = async () => { + await dispatch(getTeamsList()); + }; + loadTeams(); + }, [dispatch]); return ( @@ -33,7 +45,7 @@ export default function Team_Browser(props: { navigation: any }) { onChangeText={setSearch} /> } />