Compare commits

..

No commits in common. 'master' and 'Backend/Page/Point_Viewer' have entirely different histories.

@ -15,18 +15,14 @@ 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 (
<Provider store={store}>
<SafeAreaView style={styles.container}>
<NavigationContainer independent={true}>
<LoginStack />
</NavigationContainer>
</SafeAreaView>
</Provider>
<SafeAreaView style={styles.container}>
<NavigationContainer independent={true}>
<LoginStack />
</NavigationContainer>
</SafeAreaView>
);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 527 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 419 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 587 B

@ -11,13 +11,20 @@ type SessionListItemProps = {
export default function SessionListItem(props: SessionListItemProps) {
const timeInSeconds = props.session.getLaps()[props.session.getLaps().length - 1].getTime();
const timeInMs = timeInSeconds * 1000;
const date = new Date(timeInMs);
const minutes = date.getMinutes().toString().padStart(2, "0");
const seconds = date.getSeconds().toString().padStart(2, "0");
const milliseconds = date.getMilliseconds().toString().padStart(2, "0");
const formattedTime = `${minutes}:${seconds}:${milliseconds}`;
return (
<TouchableOpacity style={styles.container}
onPress={()=> props.onPress(props.session)}>
<Text style={styles.text_style}> {props.session.getName()}</Text>
<View style={styles.container_low}>
<Text style={styles.text_under}> {props.session.getType().toString() }</Text>
<Text style={styles.text_under}> { timeInSeconds }</Text>
<Text style={styles.text_under}> { formattedTime }</Text>
</View>
</TouchableOpacity>

@ -3,9 +3,9 @@ import { Point } from "./Point";
export class Lap {
private number : number;
private points: Point[];
private time: string;
private time: number;
constructor(number: number,points: Point[], time: string) {
constructor(number: number,points: Point[], time: number) {
this.number = number;
this.points = points;
this.time = time;
@ -14,8 +14,8 @@ export class Lap {
getNumber(){
return this.number;
}
setNumber(number :number){
this.number = number;
setNumber(){
return this.number;
}
getPoints() {
@ -31,17 +31,17 @@ export class Lap {
}
getFormattedTime(){
// const timeInSeconds = this.time;
// const timeInMs = timeInSeconds * 1000;
// const date = new Date(timeInMs);
// const minutes = date.getMinutes().toString().padStart(2, "0");
// const seconds = date.getSeconds().toString().padStart(2, "0");
// const milliseconds = date.getMilliseconds().toString().padStart(2, "0");
// const formattedTime = `${minutes}:${seconds}:${milliseconds}`;
// return formattedTime;
const timeInSeconds = this.time;
const timeInMs = timeInSeconds * 1000;
const date = new Date(timeInMs);
const minutes = date.getMinutes().toString().padStart(2, "0");
const seconds = date.getSeconds().toString().padStart(2, "0");
const milliseconds = date.getMilliseconds().toString().padStart(2, "0");
const formattedTime = `${minutes}:${seconds}:${milliseconds}`;
return formattedTime;
}
setTime(time: string) {
setTime(time: number) {
this.time = time;
}
getAverageSpeed(){

@ -1,5 +1,4 @@
import { Lap } from "./Lap";
import { SessionType } from "./SessionType";
export class Session {
private name: string;

@ -7,13 +7,14 @@ 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;
}

15864
R-Dash/package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -16,22 +16,18 @@
"@reduxjs/toolkit": "^1.9.3",
"@rneui/base": "^4.0.0-rc.7",
"expo": "~48.0.6",
"expo-document-picker": "~11.2.2",
"expo-document-picker": "~11.2.1",
"expo-status-bar": "~1.4.4",
"jsonwebtoken": "^9.0.0",
"react": "18.2.0",
"react-native": "0.71.4",
"react-native-document-picker": "^8.2.0",
"react-native-fs": "^2.20.0",
"react-native": "0.71.3",
"react-native-document-picker": "^8.1.4",
"react-native-gesture-handler": "^2.9.0",
"react-native-maps": "1.3.2",
"react-native-safe-area-context": "^4.5.0",
"react-redux": "^8.0.5",
"redux": "^4.2.1",
"typescript": "^4.9.4",
"react-native-web": "~0.18.10",
"react-dom": "18.2.0",
"@expo/webpack-config": "^18.0.1"
"typescript": "^4.9.4"
},
"devDependencies": {
"@babel/core": "^7.20.0",

@ -1,7 +0,0 @@
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';
//export const server_link = "https://codefirst.iut.uca.fr/containers/enzojolys-r-dash_container";
export const server_link = "https://r-dash.azurewebsites.net";

@ -1,4 +1,4 @@
import { configureStore, getDefaultMiddleware } from '@reduxjs/toolkit'
import { configureStore } from '@reduxjs/toolkit'
import appReducer from './reducers/appReducer';
// Reference here all your application reducers
@ -6,13 +6,9 @@ const reducer = {
appReducer: appReducer,
}
const middleware = getDefaultMiddleware({
serializableCheck: false, // Disable serializableCheck
immutableCheck: false
});
const store = configureStore({
// @ts-ignore
const store = configureStore({
reducer,
middleware,
});
});
export default store;

@ -1,74 +0,0 @@
import { Alert } from "react-native";
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, server_link } 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://r-dash.azurewebsites.net/File?' + "pseudoPilote=test_PILOTE" + "&Email=test@gmail.com" + "&password=test123" + "&nameSession=test_SESSION" + "&nameCircuit=test_CIRCUIT" + "&typeSession=Unknown", {
// method: 'POST',
// body: formData
// });
// const data = await response.json();
// return data;
// } catch (error) {
// console.log('Error---------', error);
// }
// };
export const addXlsFile = (file: File, pseudoPilote: string, email: string, password: string, nameSession: string, nameCircuit: string, typeSession: string) => {
return async dispatch => {
try {
const formData = new FormData();
formData.append('file', file);
const response = await fetch(
server_link+`/File?pseudoPilote=${pseudoPilote}&Email=${email}&password=${password}&nameSession=${nameSession}&nameCircuit=${nameCircuit}&typeSession=${typeSession}`,
{
method: 'POST',
body: formData
}
);
const data = await response.json();
return data;
} catch (error) {
console.log('Error - POST FILE', error);
Alert.alert('Error', 'An error occured while adding a session. (server might be down)');
}
}
};
export const getSessionsList = () => {
return async dispatch => {
try {
const sessionsPromise = await fetch(server_link+'/FullSession');
const sessionsListJson = await sessionsPromise.json();
const sessionsList: Session[] = sessionsListJson.map(elt => {
const laps: Lap[] = elt["tours"].map(lap => {
const points: Point[] = lap["points"].map(point => {
const geo = new Geocalisation(point["longitude"], point["latitude"]);
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["numero"], points, lap["temps"]);
});
return new Session(elt["name"], laps, elt["type"]);
});
dispatch(setSessionsList(sessionsList));
} catch (error) {
console.log('Error -- GET SESSIONS', error);
Alert.alert('Error', 'An error occured while getting sessions. (server might be down)');
//dispatch(fetchDataRejected(error))
}
}
}

@ -1,45 +1,23 @@
import { Team } from "../../core/Team";
import { FETCH_TEAMS, ADD_TEAM, server_link } from "../Constants";
import { Fetch_Teams } from "../Constants";
export const setTeamsList = (teamsList: Team[]) => {
export const setCitiesList = (citiesList: Team[]) => {
return {
type: FETCH_TEAMS,
payload: teamsList,
type: Fetch_Teams,
payload: citiesList,
};
}
export const addNewTeam = (newTeam: Team) => {
export const getCitiesList = () => {
return async dispatch => {
try {
const response = await fetch(server_link + '/Ecuries?' + "Email=test@gmail.com" + "&password=test123" + "&pseudoPilote=test_PILOTE", {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(newTeam)
});
const team = await response.json();
dispatch({
type: ADD_TEAM,
payload: team
});
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));
} catch (error) {
console.log('Error---------', error);
//dispatch(fetchDataRejected(error))
}
}
}
export const getTeamsList = () => {
return async dispatch => {
try {
const teamsPromise = await fetch(server_link+'/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))
}
}
}
}

@ -1,36 +0,0 @@
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(server_link+'/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))
}
}
}

@ -1,37 +0,0 @@
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;
}
}

@ -1,25 +1,32 @@
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: [],
users: [],
sessions: [],
Teams: [],
Owners: [],
Members: [],
WaitingMembers: [],
Laps: [],
Points: [],
Sessions: [],
Tracks: [],
};
const appReducer = (state = initialState, action: { type: any; payload: any; }) => {
switch (action.type) {
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 };
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] };
default:
return state;
}

@ -1,5 +1,5 @@
import React from 'react';
import { Pressable } from 'react-native';
import { Button, Pressable } from 'react-native';
import { StyleSheet, Text, View, Image, TextInput } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';

@ -1,10 +1,8 @@
import React, { useEffect, useState } from 'react';
import { Pressable } from 'react-native';
import React, { 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;
@ -22,13 +20,6 @@ export default function CreateTeam(props: { navigation: any }) {
}
};
const dispatch = useDispatch();
const onPressAddTeam = async () => {
dispatch();
navigation.goBack();
};
return (
<SafeAreaView style={styles.container}>
<View style={styles.maincard}>
@ -63,7 +54,7 @@ export default function CreateTeam(props: { navigation: any }) {
source={require('../assets/images/return.png')}
/>
</Pressable>
<Pressable style={styles.button} onPress={onPressAddTeam}>
<Pressable style={styles.button} onPress={() => navigation.goBack()}>
<Image
style={styles.return}
source={require('../assets/images/checked.png')}

@ -1,7 +1,7 @@
import { BackgroundImage } from '@rneui/base';
import { StyleSheet, Text, View, TouchableOpacity } from 'react-native';
import { StyleSheet, Text, View, TouchableOpacity, ScrollView } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import MapView, { Polyline } from 'react-native-maps';
import MapView, { Point, Polyline } from 'react-native-maps';
import React from 'react';
import { Lap as LapModel} from '../core/Lap';
import TopBar from '../components/TopBar';
@ -10,6 +10,7 @@ export default function Lap(props: { navigation: any, route : any}) {
const { session } = props.route.params;
const { navigation } = props;
// const laps: LapModel[] = session.getLaps();
const laps: LapModel[] = session.getLaps().sort((lap1 : LapModel, lap2 : LapModel) => lap1.getNumber() - lap2.getNumber());
@ -51,7 +52,7 @@ export default function Lap(props: { navigation: any, route : any}) {
</View>
</TouchableOpacity>
<Text style={styles.text_title}>Lap {currentLap?.getNumber()} </Text>
<Text style={styles.text_title}>Lap {currentLap?.getNumber()} / { laps.length}</Text>
<TouchableOpacity style={[styles.LapBrowserButton, currentLapIndex === laps.length - 1 ? styles.disabled : null]} onPress={goToNextLap}>
<View>
@ -82,7 +83,7 @@ export default function Lap(props: { navigation: any, route : any}) {
>
<Polyline
coordinates={points}
strokeColor="red" // set the color of the line
strokeColor="#000" // set the color of the line
strokeWidth={3} // set the width of the line
/>
{/* <Marker
@ -101,17 +102,17 @@ export default function Lap(props: { navigation: any, route : any}) {
<View style={styles.infoContainer}>
<Text style={styles.infoItem}>Lap Time:</Text>
<Text style={styles.infoValue}>{currentLap.getTime()}</Text>
<Text style={styles.infoValue}>{currentLap.getFormattedTime()}</Text>
</View>
<View style={styles.infoContainer}>
<Text style={styles.infoItem}>Average Speed:</Text>
<Text style={styles.infoValue}>{currentLap.getAverageSpeed().toFixed()} km/h</Text>
<Text style={styles.infoValue}>{currentLap.getAverageSpeed()} km/h</Text>
</View>
<View style={styles.infoContainer}>
<Text style={styles.infoItem}>Max Speed:</Text>
<Text style={styles.infoValue}>{currentLap.getMaxSpeed().toFixed()} km/h</Text>
<Text style={styles.infoValue}>{currentLap.getMaxSpeed()} km/h</Text>
</View>
</View>
</BackgroundImage>
@ -123,6 +124,10 @@ export default function Lap(props: { navigation: any, route : any}) {
);
}
// TROUBLE SHOOTING BORDER :
//borderColor:'red',
//borderWidth:3,
const styles = StyleSheet.create({
disabled: {
opacity: 0.5,

@ -1,6 +1,6 @@
import { useState } from 'react';
import React from 'react';
import { Pressable } from 'react-native';
import { Button, Pressable } from 'react-native';
import { StyleSheet, Text, View, Image, TextInput } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
// import { AsyncStorage } from 'react-native';

@ -1,5 +1,5 @@
import React, { useState } from 'react';
import { Pressable } from 'react-native';
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';

@ -1,144 +1,26 @@
import { StatusBar } from 'expo-status-bar';
import React, { useState } from 'react';
import { Pressable, StyleSheet, Text, View, Image, TouchableOpacity, TextInput } from 'react-native';
import { Button, Pressable, StyleSheet, Text, View, Image, TouchableOpacity, TextInput } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import TopBar from '../components/TopBar';
import { addXlsFile } from '../redux/actions/sessions';
import { useDispatch } from 'react-redux';
import * as DocumentPicker from 'expo-document-picker';
import { uploadFiles, DocumentDirectoryPath } from 'react-native-fs';
import TopBar from '../components/TopBar';
export default function NewTrack(props: { navigation: any }) {
const { navigation } = props;
const dispatch = useDispatch();
const [pickedDocument, setPickedDocument] = useState<DocumentPicker.DocumentResult | null>(null);
const [trackName, setTrackName] = useState('');
const [sessionName, setSessionName] = useState('');
const handlePickDocument = async () => {
try {
const result = await DocumentPicker.getDocumentAsync({});
const result = await DocumentPicker.getDocumentAsync({ type: 'excel/xls' });
if (result.type === 'success') {
setPickedDocument(result);
}
else if(result.type === 'cancel'){
console.log("AAA");
setPickedDocument(null);
}
} catch (err) {
console.log(err);
}
};
// var files = [
// {
// name: "file",
// filename: "file.jpg",
// filepath: pickedDocument.uri,
// filetype: "image/jpeg",
// },
// ];
// const handleConfirm = async () => {
// if (!pickedDocument || !trackName || !sessionName) {
// return;
// }
// const formData = new FormData();
// formData.append('file', {
// uri: pickedDocument.uri,
// type: pickedDocument.type,
// name: pickedDocument.name,
// });
// try {
// await dispatch(addXlsFile(formData, 'test_PILOTE', 'test@gmail.com', 'test123', sessionName, trackName, 'Training'));
// navigation.goBack();
// } catch (error) {
// console.log('Error - POST FILE', error);
// }
// };
// const handleConfirm = async () => {
// if (!pickedDocument || !trackName || !sessionName) {
// return;
// }
// try {
// const file = new File([await pickedDocument.uri], pickedDocument.name, { type: pickedDocument.type });
// const url = 'https://r-dash.azurewebsites.net/File?pseudoPilote=test_PILOTE&nameSession=weekend&nameCircuit=test_CIRCUIT&typeSession=Training';
// const options = {
// method: 'POST',
// body: file,
// headers: {
// 'Content-Type': 'application/octet-stream',
// },
// };
// await fetch(url, options);
// navigation.goBack();
// } catch (error) {
// console.log('Error - POST FILE', error);
// }
// };
// const handleConfirm = async () => {
// if (!pickedDocument || !trackName || !sessionName) {
// return;
// }
// try {
// const file = new File([await pickedDocument.uri], pickedDocument.name, { type: pickedDocument.type });
// const url = 'https://r-dash.azurewebsites.net/File?pseudoPilote=test_PILOTE&nameSession=weekend&nameCircuit=test_CIRCUIT&typeSession=Training';
// const options = {
// method: 'POST',
// body: file,
// headers: {
// 'Content-Type': 'application/octet-stream',
// },
// };
// const response = await fetch(url, options);
// const responseData = await response.text(); // or response.text() or response.blob() depending on the expected response type
// navigation.goBack();
// console.log(responseData);
// } catch (error) {
// console.log('Error - POST FILE', error);
// }
// };
const handleConfirm = async () => {
if (!pickedDocument || !trackName || !sessionName) {
return;
}
try {
//const file = new File([await pickedDocument.uri], pickedDocument.name, { type: pickedDocument.type });
const url = 'https://r-dash.azurewebsites.net/File?pseudoPilote=test_PILOTE&nameSession=test%20import&nameCircuit=test_CIRCUIT&typeSession=Training';
const formData = new FormData();
console.log(pickedDocument.type);
console.log(pickedDocument.uri);
formData.append('file',
{
name: pickedDocument.name,
type: "application/vnd.ms-excel",
uri : pickedDocument.uri,
});
const response = await fetch(url, {
method: 'POST',
body: formData,
headers: {
'accept':'*/*',
'Content-Type': 'multipart/form-data',
},
});
const data = await response.json();
console.log('API response:', data);
if (!response.ok) {
throw new Error( JSON.stringify(response) + 'Failed to upload file');
}
navigation.goBack();
} catch (error) {
console.log('Error - POST FILE', error);
}
};
return (
<SafeAreaView>
<View style={styles.container}>
@ -152,8 +34,7 @@ export default function NewTrack(props: { navigation: any }) {
<Text style={{ paddingTop: 20 }}>Track name: </Text>
<TextInput
style={styles.textInput}
onChangeText={setTrackName}
value={trackName}
secureTextEntry={true}
placeholder="Track name"
/>
</View>
@ -162,8 +43,7 @@ export default function NewTrack(props: { navigation: any }) {
<Text style={{ paddingTop: 20 }}>Session name: </Text>
<TextInput
style={styles.textInput}
onChangeText={setSessionName}
value={sessionName}
secureTextEntry={true}
placeholder="Session name"
/>
</View>
@ -188,7 +68,7 @@ export default function NewTrack(props: { navigation: any }) {
source={require('../assets/images/return.png')}
/>
</Pressable>
<Pressable style={styles.button} onPress={handleConfirm}>
<Pressable style={styles.button} onPress={() => navigation.goBack()}>
<Image
style={styles.return}
source={require('../assets/images/checked.png')}

@ -1,8 +1,9 @@
import { BackgroundImage } from '@rneui/base';
import { StyleSheet, Text, View, TouchableOpacity, ScrollView } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import MapView, { MapCallout, Marker } from 'react-native-maps';
import MapView, { Marker, Polyline } from 'react-native-maps';
import React from 'react';
import { Lap as LapModel} from '../core/Lap';
import TopBar from '../components/TopBar';
import { Point } from '../core/Point';
@ -20,7 +21,6 @@ export default function Lap(props: { navigation: any, route : any}) {
const goToPreviousPoint = () => {
if (currentPointIndex > 0) {
setCurrentPointIndex(currentPointIndex - 1);
}
};
@ -30,24 +30,11 @@ export default function Lap(props: { navigation: any, route : any}) {
}
};
const markers: { id: number; name: string; coordinate: { latitude: number; longitude: number }, image: HTMLImageElement }[] = points.map((pt, index) => {
var img;
const brake = pt.getPBreakF();
if(brake <= 0)
{
img = require("../assets/images/noBrake.png");
}else if(brake > 0 && brake <= 30){
img = require("../assets/images/startBrake.png");
}else if(brake > 0 && brake <= 100){
img = require("../assets/images/midBrake.png");
}else{
img = require("../assets/images/fullBrake.png");
}
const markers: { id: number; name: string; coordinate: { latitude: number; longitude: number } }[] = points.map((pt, index) => {
return {
id: index,
name: pt.getDistance() + 'm',
coordinate: { latitude: pt.getGeo().getGpsLat(), longitude: pt.getGeo().getGpsLong() },
image: img,
};
});
@ -77,7 +64,7 @@ export default function Lap(props: { navigation: any, route : any}) {
</View>
</TouchableOpacity>
<Text style={styles.text_title}>Point {currentPointIndex + 1 } </Text>
<Text style={styles.text_title}>Point {currentPointIndex + 1 } / { points.length } </Text>
<TouchableOpacity style={[styles.LapBrowserButton, currentPointIndex === points.length - 1 ? styles.disabled : null]} onPress={goToNextPoint}>
<View>
@ -98,8 +85,8 @@ export default function Lap(props: { navigation: any, route : any}) {
longitudeDelta: 0.015,
}}
>
{markers.map(({ id, name, coordinate,image }) => (
<Marker key={id} title={name} coordinate={coordinate} onPress={() => handleMarker(id)} icon={image} style={{ width: 1, height: 1 }} />
{markers.map(({ id, name, coordinate }) => (
<Marker key={id} title={name} coordinate={coordinate} onPress={() => handleMarker(id)} />
))}
@ -130,7 +117,7 @@ export default function Lap(props: { navigation: any, route : any}) {
<View style={styles.infoContainer}>
<Text style={styles.infoItem}>nGear:</Text>
<Text style={styles.infoValue}>{currentPoint.getNGear()} gear</Text>
<Text style={styles.infoValue}>{currentPoint.getVCar()} gear</Text>
</View>
<View style={styles.infoContainer}>
@ -151,7 +138,7 @@ export default function Lap(props: { navigation: any, route : any}) {
</View>
<View style={styles.infoContainer}>
<Text style={styles.infoItem}>gLat:</Text>
<Text style={styles.infoValue}>{currentPoint.getGLat()} g</Text>
<Text style={styles.infoValue}>{currentPoint.getGLong()} g</Text>
</View>
</View>
</BackgroundImage>
@ -164,6 +151,9 @@ export default function Lap(props: { navigation: any, route : any}) {
);
}
// TROUBLE SHOOTING BORDER :
//borderColor:'red',
//borderWidth:3,
const styles = StyleSheet.create({
scrollView: {

@ -1,7 +1,9 @@
import { useState } from 'react';
import React from 'react';
import { Pressable } from 'react-native';
import { Button, Pressable, Touchable } from 'react-native';
import { StyleSheet, Text, View, Image, TextInput } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import Navigation from '../navigation/Navigation';
export default function Register(props: { navigation: any }) {
const { navigation } = props;

@ -1,49 +1,33 @@
import { BackgroundImage, SearchBar } from "@rneui/base";
import React, { useEffect, useState } from "react";
import React, { useState } from "react";
import {
FlatList,
StyleSheet,
Text,
View,
TouchableOpacity,
ActivityIndicator,
} from "react-native";
import { useDispatch, useSelector } from "react-redux";
import SessionListItem from "../components/SessionCmp";
import TopBar from "../components/TopBar";
import { Session } from "../core/Session";
import { getSessionsList } from "../redux/actions/sessions";
import { SESSIONS } from "../stub/stub";
export default function Session_browser(props: { navigation: any }) {
const { navigation } = props;
const [search, setSearch] = useState("");
const [loading, setLoading] = useState(false);
const handlePress = (item: Session) => {
setSearch("");
navigation.navigate("Lap", { "session" : item });
};
const sessions = useSelector(state => state.appReducer.sessions);
const dispatch = useDispatch();
useEffect(() => {
setLoading(true);
const loadTeams = async () => {
await dispatch(getSessionsList());
setLoading(false);
};
loadTeams();
}, [dispatch]);
const filteredData =
const filteredData =
search !== ""
? sessions.filter((item) =>
? SESSIONS.filter((item) =>
item.getName().toLowerCase().includes(search.toLowerCase())
)
: sessions;
: SESSIONS;
return (
<View style={styles.container}>
<View style={styles.container}>
@ -65,17 +49,13 @@ export default function Session_browser(props: { navigation: any }) {
value={search}
onChangeText={setSearch}
/>
{loading ? (
<ActivityIndicator size="large" color="#BF181F" />
) : (
<FlatList
data={filteredData}
renderItem={({ item }) => (
<SessionListItem session={item} onPress={handlePress} />
)}
keyExtractor={(Item) => Item.getName()}
/>
)}
<FlatList
data={filteredData}
renderItem={({ item }) => (
<SessionListItem session={item} onPress={handlePress} />
)}
keyExtractor={(Item) => Item.getName()}
/>
<TouchableOpacity
style={styles.addContainerButton}

@ -1,12 +1,11 @@
import { FlatList, StyleSheet, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { SearchBar } from '@rneui/base';
import React, { useState, useEffect } from 'react';
import React, { useState } 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 }) {
@ -20,18 +19,7 @@ export default function Team_Browser(props: { navigation: any }) {
const filteredData = search !== '' ? TEAMS.filter((item) =>
item.getName().toLowerCase().includes(search.toLowerCase())
) : TEAMS;
const nList = useSelector(state => state.appReducer.teams);
const dispatch = useDispatch();
useEffect(() => {
const loadTeams = async () => {
await dispatch(getTeamsList());
};
loadTeams();
}, [dispatch]);
) : TEAMS;
return (
@ -45,7 +33,7 @@ export default function Team_Browser(props: { navigation: any }) {
onChangeText={setSearch}
/>
<FlatList
data={nList}
data={filteredData}
renderItem={({ item }) => <TeamListItem team={item} onPress={handlePress}/>} />
</View>

@ -1,5 +1,5 @@
import React from 'react';
import { Pressable } from 'react-native';
import { Button, Pressable } from 'react-native';
import { StyleSheet, Text, View, Image } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';

@ -1,5 +1,6 @@
import React from 'react';
import { Pressable, StyleSheet, Text, View } from 'react-native';
import { Button, Pressable, StyleSheet, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import TopBar from '../components/TopBar';
export default function Team_Selection(props: { navigation: any }) {

Loading…
Cancel
Save