Import
mohamed 2 years ago
commit 63c28bdddc

685
.gitignore vendored

@ -0,0 +1,685 @@
# Created by https://www.toptal.com/developers/gitignore/api/visualstudio,visualstudiocode,reactnative,yarn
# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudio,visualstudiocode,reactnative,yarn
### ReactNative ###
# React Native Stack Base
.expo
__generated__
### ReactNative.Xcode Stack ###
## User settings
xcuserdata/
## Xcode 8 and earlier
*.xcscmblueprint
*.xccheckout
### ReactNative.Gradle Stack ###
.gradle
**/build/
!src/**/build/
# Ignore Gradle GUI config
gradle-app.setting
# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
!gradle-wrapper.jar
# Avoid ignore Gradle wrappper properties
!gradle-wrapper.properties
# Cache of project
.gradletasknamecache
# Eclipse Gradle plugin generated files
# Eclipse Core
.project
# JDT-specific (Eclipse Java Development Tools)
.classpath
### ReactNative.macOS Stack ###
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
### ReactNative.Linux Stack ###
*~
# temporary files which can be created if a process still has a handle open of a deleted file
.fuse_hidden*
# KDE directory preferences
.directory
# Linux trash folder which might appear on any partition or disk
.Trash-*
# .nfs files are created when an open file is removed but is still being accessed
.nfs*
### ReactNative.Node Stack ###
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
*.tsbuildinfo
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
### ReactNative.Buck Stack ###
buck-out/
.buckconfig.local
.buckd/
.buckversion
.fakebuckversion
### ReactNative.Android Stack ###
# Gradle files
.gradle/
build/
# Local configuration file (sdk path, etc)
local.properties
# Log/OS Files
# Android Studio generated files and folders
captures/
.externalNativeBuild/
.cxx/
*.apk
output.json
# IntelliJ
*.iml
.idea/
misc.xml
deploymentTargetDropDown.xml
render.experimental.xml
# Keystore files
*.jks
*.keystore
# Google Services (e.g. APIs or Firebase)
google-services.json
# Android Profiling
*.hprof
### VisualStudioCode ###
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
!.vscode/*.code-snippets
# Local History for Visual Studio Code
.history/
# Built Visual Studio Code Extensions
*.vsix
### VisualStudioCode Patch ###
# Ignore all local history of files
.history
.ionide
### yarn ###
# https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored
.yarn/*
!.yarn/releases
!.yarn/patches
!.yarn/plugins
!.yarn/sdks
!.yarn/versions
# if you are NOT using Zero-installs, then:
# comment the following lines
!.yarn/cache
# and uncomment the following lines
# .pnp.*
### VisualStudio ###
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
*.code-workspace
# Local History for Visual Studio Code
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml
### VisualStudio Patch ###
# Additional files built by Visual Studio
# End of https://www.toptal.com/developers/gitignore/api/visualstudio,visualstudiocode,reactnative,yarn

17
R-Dash/.gitignore vendored

@ -0,0 +1,17 @@
node_modules/
.expo/
dist/
npm-debug.*
*.jks
*.p8
*.p12
*.key
*.mobileprovision
*.orig.*
web-build/
# macOS
.DS_Store
# Temporary files created by Metro to check the health of the file watcher
.metro-health-check*

@ -0,0 +1,34 @@
import { NavigationContainer } from '@react-navigation/native';
import { StatusBar } from 'expo-status-bar';
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import LoginStack from './navigation/LoginStack';
import Navigation from './navigation/Navigation';
import ChangePassword from './screens/ChangePassword';
import CreateTeam from './screens/CreateTeam';
import InfoTeam from './screens/InfoTeam';
import Login from './screens/Login';
import ManageAccount from './screens/ManageAccount';
import NewTrack from './screens/NewTrack';
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';
export default function App() {
return (
<SafeAreaView style={styles.container}>
<NavigationContainer independent={true}>
<LoginStack />
</NavigationContainer>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#fff',
},
});

@ -0,0 +1,30 @@
{
"expo": {
"name": "R-Dash",
"slug": "R-Dash",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"userInterfaceStyle": "light",
"splash": {
"image": "./assets/splash.png",
"resizeMode": "contain",
"backgroundColor": "#ffffff"
},
"assetBundlePatterns": [
"**/*"
],
"ios": {
"supportsTablet": true
},
"android": {
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#ffffff"
}
},
"web": {
"favicon": "./assets/favicon.png"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

@ -0,0 +1,6 @@
module.exports = function(api) {
api.cache(true);
return {
presets: ['babel-preset-expo'],
};
};

@ -0,0 +1,74 @@
import React from "react";
import { FlatList, StyleSheet, Text, View, Image, TouchableOpacity, TouchableHighlight } from 'react-native';
export default function TopBar(props: { navigation: any }) {
const { navigation } = props;
return (
<View style={styles.topbar}>
<View>
<TouchableOpacity style={styles.accountContainerButton} onPress={() => navigation.navigate("Settings")}>
<View style={styles.ImageContainer}>
<Image source={require('../images/pfp.png')} style={styles.accountImage} />
</View>
<Text style={styles.accountName}>Mr X</Text>
</TouchableOpacity>
</View>
</View>
)
}
const styles = StyleSheet.create({
topbar: {
backgroundColor: '#BF181D',
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 20,
height: '10%',
},
accountContainerButton: {
flexDirection: 'row',
alignItems: 'center',
},
ImageContainer: {
backgroundColor: '#fff',
borderRadius: 50,
width: 40,
height: 40,
overflow: 'hidden',
marginRight: 10,
},
accountImage: {
width: '100%',
height: '100%',
},
accountName: {
color: '#fff',
fontSize: 20,
},
topbarRight: {
flex: 1,
alignItems: 'flex-end',
},
iconContainer: {
position: 'absolute',
bottom: 0,
right: 0,
backgroundColor: 'transparent',
width: 24,
height: 24,
},
accountSettings: {
width: '100%',
height: '100%',
},
})

@ -0,0 +1,31 @@
export class Geocalisation {
readonly id: number;
private gpsLat: number;
private gpsLong: number;
constructor(id: number, gpsLat: number, gpsLong: number) {
this.id = id;
this.gpsLat = gpsLat;
this.gpsLong = gpsLong;
}
getId() {
return this.id;
}
getGpsLat() {
return this.gpsLat;
}
setGpsLat(gpsLat: number) {
this.gpsLat = gpsLat;
}
getGpsLong() {
return this.gpsLong;
}
setGpsLong(gpsLong: number) {
this.gpsLong = gpsLong;
}
}

@ -0,0 +1,33 @@
import { Point } from "./Point";
export class Lap {
readonly id: number;
private points: Point[];
private time: number;
constructor(id: number, points: Point[], time: number) {
this.id = id;
this.points = points;
this.time = time;
}
getId() {
return this.id;
}
getPoints() {
return this.points;
}
setPoints(points: Point[]) {
this.points = points;
}
getTime() {
return this.time;
}
setTime(time: number) {
this.time = time;
}
}

@ -0,0 +1,9 @@
import { Session } from "./Session";
import { Team } from "./Team";
import { User } from "./User";
export class Member extends User {
constructor(id: number, pseudo: string, password: string, email: string, sessions: Session[], team: Team) {
super(id, pseudo, password, email, sessions, team);
}
}

@ -0,0 +1,9 @@
import { Session } from "./Session";
import { Team } from "./Team";
import { User } from "./User";
export class Owner extends User {
constructor(id: number, pseudo: string, password: string, email: string, sessions: Session[], team: Team) {
super(id, pseudo, password, email, sessions, team);
}
}

@ -0,0 +1,113 @@
import { Geocalisation } from "./Geocalisation";
export class Point {
readonly id: number;
private geo: Geocalisation;
private timer: number;
private distance: number;
private nGear: number;
private pBrakeF: number;
private aSteer: number;
private rPedal: number;
private gLong: number;
private gLat: number;
private vCar: number;
constructor(id: number, geo: Geocalisation, timer: number, distance: number, nGear: number, pBrakeF: number, aSteer: number, rPedal: number, gLong: number, gLat: number, vCar: number) {
this.id = id;
this.geo = geo;
this.timer = timer;
this.distance = distance;
this.nGear = nGear;
this.pBrakeF = pBrakeF;
this.aSteer = aSteer;
this.rPedal = rPedal;
this.gLong = gLong;
this.gLat = gLat;
this.vCar = vCar;
}
getId() {
return this.id;
}
getGeo() {
return this.geo;
}
setGeo(geo: Geocalisation) {
this.geo = geo;
}
setTimer(timer: number) {
this.timer = timer;
}
getTimer() {
return this.timer;
}
getDistance() {
return this.distance;
}
setDistance(distance: number) {
this.distance = distance;
}
getNGear() {
return this.nGear;
}
setNGear(nGear: number) {
this.nGear = nGear;
}
getPBreakF() {
return this.pBrakeF;
}
setPBreakF(pBreakF: number) {
this.pBrakeF = this.pBrakeF;
}
getASteer() {
return this.aSteer;
}
setASteer(aSteer: number) {
this.aSteer = aSteer;
}
getRPedal() {
return this.rPedal;
}
setRPedal(rPedal: number) {
this.rPedal = rPedal;
}
getGLong() {
return this.gLong;
}
setGLong(gLong: number) {
this.gLong = gLong;
}
getGLat() {
return this.gLat;
}
setGLat(gLat: number) {
this.gLat = gLat;
}
getVCar() {
return this.vCar;
}
setVCar(vCar: number) {
this.vCar = vCar;
}
}

@ -0,0 +1,32 @@
import { Lap } from "./Lap";
export class Session {
readonly id: number;
private name: string;
private laps: Lap[];
constructor(id: number, name: string, laps: Lap[]) {
this.id = id;
this.name = name;
this.laps = laps;
}
getId() {
return this.id;
}
getName() {
return this.name;
}
setName(name: string) {
this.name = name;
}
getLaps() {
return this.laps;
}
setLaps(laps: Lap[]) {
this.laps = laps;
}
}

@ -0,0 +1,10 @@
import { Session } from "./Session";
export abstract class SessionBuilder {
getSession(session: Session) {
return Session;
}
BuildSession() {
}
}

@ -0,0 +1,8 @@
enum SessionType {
Test,
PrivateTest,
Qualification,
ShortStroke,
LongStroke,
Unknown,
}

@ -0,0 +1,13 @@
import { Point } from "./Point";
import { SessionBuilder } from "./SessionBuilder";
export class StandartSessionBuilder extends SessionBuilder {
BuildSession() {
PointBuilder();
}
PointBuilder() {
new Point();
}
}

@ -0,0 +1,63 @@
import { User } from "./User";
export class Team {
readonly id: number;
private name: string;
private owner: User;
private members: User[];
private logo: File;
private waitList: User[];
constructor(id: number, name: string, owner: User,members: User[] = null, logo: File = null, waitList: User[] = null) {
this.id = id;
this.name = name;
this.owner = owner;
this.members = members;
this.logo = logo;
this.waitList = waitList;
}
getId() {
return this.id;
}
getName() {
return this.name;
}
setName(name: string) {
this.name = name;
}
getOwner() {
return this.owner;
}
setOwner(owner: User) {
this.owner = owner;
}
getMembers() {
return this.members;
}
setMembers(members: User[]) {
this.members = members;
}
getLogo() {
return this.logo;
}
setLogo(logo: File) {
this.logo = logo;
}
getWaitList() {
return this.waitList;
}
setWaitList(waitList: User[]) {
this.waitList = waitList;
}
}

@ -0,0 +1,21 @@
export class Track {
readonly id: number;
private name: string;
constructor(id: number, name: string) {
this.id = id;
this.name = name;
}
getId() {
return this.id;
}
getName() {
return this.name;
}
setName(name: string) {
this.name = name;
}
}

@ -0,0 +1,64 @@
import { Session } from "./Session";
import { Team } from "./Team";
export abstract class User {
readonly id: number;
private pseudo: string;
private password: string;
private email: string;
private sessions: Session[];
private team: Team;
constructor(id: number, pseudo: string, password: string, email: string, sessions: Session[] = null, team: Team = null) {
this.pseudo = pseudo;
this.password = password;
this.email = email;
this.sessions = sessions;
this.team = team;
}
getId() {
return this.id;
}
getPseudo() {
return this.pseudo;
}
setPseudo(pseudo: string) {
this.pseudo = pseudo;
}
getPassword() {
return this.password;
}
setPassword(password: string) {
this.password = password;
}
getEmail() {
return this.email;
}
setEmail(email: string) {
this.email = email;
}
getSessions() {
return this.sessions;
}
setSessions(sessions: Session[]) {
this.sessions = sessions;
}
getTeam() {
return this.team;
}
setTeam(team: Team) {
this.team = team;
}
}

@ -0,0 +1,9 @@
import { Session } from "./Session";
import { Team } from "./Team";
import { User } from "./User";
export class WaitingMember extends User {
constructor(id: number, pseudo: string, password: string, email: string, sessions: Session[], team: Team) {
super(id, pseudo, password, email, sessions, team);
}
}

@ -0,0 +1,15 @@
import { createStackNavigator } from "@react-navigation/stack";
import Login from "../screens/Login";
import Register from "../screens/Register";
import Navigation from "./Navigation";
export default function LoginStack() {
const Stack = createStackNavigator();
return (
<Stack.Navigator initialRouteName="SignIn" screenOptions={{ headerShown: false }}>
<Stack.Screen name="SignIn" component={Login} />
<Stack.Screen name="SignUp" component={Register} />
<Stack.Screen name="Home" component={Navigation} />
</Stack.Navigator>
)
}

@ -0,0 +1,17 @@
import { createStackNavigator } from "@react-navigation/stack";
import Lap from "../screens/Lap";
import NewTrack from "../screens/NewTrack";
import Session_browser from "../screens/Session_browser";
import SettingsStack from "./SettingsStack";
export default function MainStack() {
const Stack = createStackNavigator();
return (
<Stack.Navigator initialRouteName="Home" screenOptions={{ headerShown: false }}>
<Stack.Screen name="Home" component={Session_browser} />
<Stack.Screen name="Add" component={NewTrack} />
<Stack.Screen name="Lap" component={Lap} />
<Stack.Screen name="Settings" component={SettingsStack} />
</Stack.Navigator>
)
}

@ -0,0 +1,28 @@
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
import { NavigationContainer } from "@react-navigation/native";
import { FontAwesome } from '@expo/vector-icons';
import MainStack from "./MainStack";
import TeamStack from "./TeamStack";
export default function Navigation() {
const BottomTabNavigator = createBottomTabNavigator();
return (
<NavigationContainer independent={true}>
<BottomTabNavigator.Navigator initialRouteName="Home" screenOptions={{ headerShown: false }}>
<BottomTabNavigator.Screen name="Home" component={MainStack}
options={{
title: 'Home',
tabBarIcon: ({ color }) => <FontAwesome name="home" size={40} color={color} />
}} />
<BottomTabNavigator.Screen name="Team" component={TeamStack}
options={{
title: 'Team',
tabBarIcon: ({ color }) => <FontAwesome name="group" size={24} color={color} />
}}/>
</BottomTabNavigator.Navigator>
</NavigationContainer>
)
}

@ -0,0 +1,14 @@
import { createStackNavigator } from "@react-navigation/stack";
import ChangePassword from "../screens/ChangePassword";
import ManageAccount from "../screens/ManageAccount";
export default function SettingsStack() {
const Stack = createStackNavigator();
return (
<Stack.Navigator initialRouteName="Home" screenOptions={{ headerShown: false }}>
<Stack.Screen name="Home" component={ManageAccount} />
<Stack.Screen name="Password" component={ChangePassword} />
</Stack.Navigator>
)
}

@ -0,0 +1,16 @@
import { createStackNavigator } from "@react-navigation/stack";
import CreateTeam from "../screens/CreateTeam";
import InfoTeam from "../screens/InfoTeam";
import Team_Browser from "../screens/Team_Browser";
import Team_Selection from "../screens/Team_Selection";
export default function TeamInfoStack() {
const Stack = createStackNavigator();
return (
<Stack.Navigator initialRouteName="Home" screenOptions={{ headerShown: false }}>
<Stack.Screen name="Home" component={Team_Browser} />
<Stack.Screen name="Info" component={InfoTeam} />
</Stack.Navigator>
)
}

@ -0,0 +1,16 @@
import { createStackNavigator } from "@react-navigation/stack";
import CreateTeam from "../screens/CreateTeam";
import Team_Selection from "../screens/Team_Selection";
import TeamInfoStack from "./TeamInfoStack";
export default function TeamStack() {
const Stack = createStackNavigator();
return (
<Stack.Navigator initialRouteName="Home" screenOptions={{ headerShown: false }}>
<Stack.Screen name="Home" component={Team_Selection} />
<Stack.Screen name="Browse" component={TeamInfoStack} />
<Stack.Screen name="Create" component={CreateTeam} />
</Stack.Navigator>
)
}

25286
R-Dash/package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -0,0 +1,34 @@
{
"name": "r-dash",
"version": "1.0.0",
"main": "node_modules/expo/AppEntry.js",
"scripts": {
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios",
"web": "expo start --web"
},
"dependencies": {
"@react-native-mapbox-gl/maps": "^8.6.0-beta.0",
"@react-navigation/bottom-tabs": "^6.5.5",
"@react-navigation/native": "^6.1.6",
"@react-navigation/stack": "^6.3.16",
"@rneui/base": "^4.0.0-rc.7",
"expo": "~48.0.6",
"expo-document-picker": "~11.2.1",
"expo-status-bar": "~1.4.4",
"react": "18.2.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",
"typescript": "^4.9.4"
},
"devDependencies": {
"@babel/core": "^7.20.0",
"@types/react": "~18.0.14",
"typescript": "^4.9.4"
},
"private": true
}

@ -0,0 +1,101 @@
import React 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';
export default function ChangePassword(props: { navigation: any }) {
const { navigation } = props;
return (
<SafeAreaView style={styles.container}>
<View style={styles.maincard}>
<View style={{ alignItems: 'center' }}>
<Text style={{ paddingBottom: 10, fontSize: 30 }}>Change Password</Text>
<TextInput
style={styles.textInput}
secureTextEntry={true}
placeholder="Current password"
/>
<Text></Text>
<TextInput
style={styles.textInput}
secureTextEntry={true}
placeholder="New password"
/>
<Text></Text>
<TextInput
style={styles.textInput}
secureTextEntry={true}
placeholder="Confirm password"
/>
</View>
<View style={styles.placement}>
<Pressable style={styles.button} onPress={() => navigation.goBack() }>
<Image
style={styles.return}
source={require('../assets/images/return.png')}
/>
</Pressable>
<Pressable style={styles.button} onPress={() => navigation.goBack()} >
<Image
style={styles.return}
source={require('../assets/images/checked.png')}
/>
</Pressable>
</View>
</View>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#C5C5C5',
alignItems: 'center',
justifyContent: 'center',
},
maincard: {
height: "50%",
width: "80%",
backgroundColor: "#fff",
borderRadius: 15,
padding: 10,
elevation: 10,
shadowColor: '#000',
shadowOffset: { width: 0, height: 3 },
shadowOpacity: 0.5,
shadowRadius: 5,
justifyContent: 'space-evenly',
},
button: {
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 12,
paddingHorizontal: 32,
borderRadius: 10,
elevation: 3,
backgroundColor: '#BF181D',
},
placement: {
justifyContent: 'space-between',
flexDirection: 'row',
},
textInput: {
alignItems: 'center',
paddingVertical: 12,
paddingHorizontal: 32,
elevation: 3,
backgroundColor: '#fff',
borderWidth: 1,
borderColor: '#000',
width: '80%',
},
return: {
width: 30,
height: 30,
}
});

@ -0,0 +1,132 @@
import React 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';
export default function CreateTeam(props: { navigation: any }) {
const { navigation } = props;
return (
<SafeAreaView style={styles.container}>
<View style={styles.maincard}>
<Text style={{ paddingBottom: 10, fontSize: 30 }}>Create a team</Text>
<View style={styles.card}>
<View style={styles.placement}>
<Image
style={styles.logo}
source={require('../assets/images/image.png')}
/>
<Pressable>
<Image
style={styles.import}
source={require('../assets/images/import.png')}
/>
</Pressable>
</View>
<View >
<Text>Team name : </Text>
<TextInput
style={styles.teamNameCard}
secureTextEntry={true}
placeholder="Team name"
/>
</View>
<View style={styles.placement}>
<Pressable style={styles.button} onPress={() => navigation.goBack()}>
<Image
style={styles.return}
source={require('../assets/images/return.png')}
/>
</Pressable>
<Pressable style={styles.button} onPress={() => navigation.goBack()}>
<Image
style={styles.return}
source={require('../assets/images/checked.png')}
/>
</Pressable>
</View>
</View>
</View>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#C5C5C5',
alignItems: 'center',
justifyContent: 'center',
},
maincard: {
height: "60%",
width: "80%",
backgroundColor: "#fff",
borderRadius: 15,
padding: 10,
elevation: 10,
shadowColor: '#000',
shadowOffset: { width: 0, height: 3 },
shadowOpacity: 0.5,
shadowRadius: 5,
justifyContent: 'space-evenly',
alignItems: 'center',
},
card: {
height: "70%",
width: "80%",
backgroundColor: "#C8C8C8",
padding: 10,
elevation: 10,
shadowColor: '#000',
shadowOffset: { width: 0, height: 3 },
shadowOpacity: 0.5,
shadowRadius: 5,
justifyContent: 'space-evenly',
paddingHorizontal: 20,
},
button: {
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 12,
paddingHorizontal: 32,
borderRadius: 10,
elevation: 3,
backgroundColor: '#BF181D',
},
button_text: {
color: '#fff',
fontSize: 15,
},
logo: {
borderRadius: 100,
width: 100,
height: 100,
},
import: {
width: 70,
height: 70,
paddingLeft: 20,
},
placement: {
justifyContent: 'space-between',
flexDirection: 'row',
},
teamNameCard: {
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 12,
paddingHorizontal: 32,
elevation: 3,
backgroundColor: '#fff',
borderWidth: 1,
borderColor: '#000',
},
return: {
width: 30,
height: 30,
}
});

@ -0,0 +1,86 @@
import React from 'react';
import { Button, Pressable } from 'react-native';
import { StyleSheet, Text, View, Image } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
export default function InfoTeam(props: { navigation: any }) {
const { navigation } = props;
return (
<SafeAreaView style={styles.container}>
<View style={styles.maincard}>
<Text style={{ paddingBottom: 10, fontSize: 30 }} >Team Information</Text>
<View style={styles.card}>
<Image
style={styles.logo}
source={require('../assets/images/image.png')}
/>
<View >
<Text style={{ padding: 10 }}>Name : </Text>
<Text style={{ padding: 10 }}>Owner : </Text>
<Pressable style={styles.button}>
<Text style={styles.button_text}>Request to join</Text>
</Pressable>
</View>
</View>
<Pressable style={styles.button} onPress={() => navigation.goBack() }>
<Text style={styles.button_text}>Retour</Text>
</Pressable>
</View>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#C5C5C5',
alignItems: 'center',
justifyContent: 'center',
},
maincard: {
height: "60%",
width: "80%",
backgroundColor: "#fff",
borderRadius: 15,
padding: 10,
elevation: 10,
shadowColor: '#000',
shadowOffset: { width: 0, height: 3 },
shadowOpacity: 0.5,
shadowRadius: 5,
justifyContent: 'space-between',
alignItems: 'center',
},
card: {
height: "60%",
width: "80%",
backgroundColor: "#C8C8C8",
padding: 10,
elevation: 10,
shadowColor: '#000',
shadowOffset: { width: 0, height: 3 },
shadowOpacity: 0.5,
shadowRadius: 5,
justifyContent: 'center',
alignItems: 'center'
},
button: {
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 12,
paddingHorizontal: 32,
borderRadius: 10,
elevation: 3,
backgroundColor: '#BF181D',
},
button_text: {
color: '#fff',
fontSize: 15,
},
logo: {
borderRadius: 100,
width: 100,
height: 100,
},
});

@ -0,0 +1,230 @@
import { BackgroundImage } from '@rneui/base';
import { FlatList, StyleSheet, Text, View, Image, TouchableOpacity } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import MapView from 'react-native-maps';
import PROVIDER_OPENSTREETMAP, { Marker } from 'react-native-maps';
export default function Lap() {
return (
<SafeAreaView style={styles.container}>
<View style={styles.container}>
{/* Header */}
<View style={styles.topbar}>
<View>
<TouchableOpacity style={styles.accountContainerButton}>
<View style={styles.ImageContainer}>
<Image source={require('../assets/images/pfp.png')} style={styles.accountImage} />
</View>
<Text style={styles.accountName}>Mr X</Text>
</TouchableOpacity>
</View>
<View style={styles.topbarRight}>
<View style={styles.iconContainer}>
<Image source={require('../assets/images/settings.png')} style={styles.accountSettings} />
</View>
<TouchableOpacity style={styles.accountContainerButton}>
<View style={styles.ImageContainer}>
<Image source={require('../assets/images/rdash.png')} style={styles.accountImage} />
</View>
</TouchableOpacity>
</View>
</View>
{/* Body */}
<View style={styles.container}>
<BackgroundImage source={require('../assets/images/rdash.png')} resizeMode="contain" style={styles.backgroundImage}>
<View style={styles.top_lap}>
<TouchableOpacity style={styles.LapBrowserButton} >
<View>
<Text style={styles.button_text} >Previous lap</Text>
</View>
</TouchableOpacity>
<Text style={styles.text_title}>Lap X</Text>
<TouchableOpacity style={styles.LapBrowserButton}>
<View>
<Text style={styles.button_text} >Next lap</Text>
</View>
</TouchableOpacity>
</View>
<View style={styles.container}>
<MapView
style={styles.map}
region={{
latitude: 46.863415273862,
longitude: 3.161789595537,
latitudeDelta: 0.001,
longitudeDelta: 0.01,
}}
>
<Marker
coordinate={{
latitude: 46.863415273862,
longitude: 3.161789595537
}}
title="Marker Title"
description="Marker Description"
/>
<Marker
coordinate={{
latitude: 46.861927477535,
longitude: 3.160353322067
}}
title="Marker Title"
description="Marker Description"
/>
<Marker
coordinate={{
latitude: 46.859745172448,
longitude: 3.164897426081
}}
title="Marker Title"
description="Marker Description"
/>
</MapView>
<Text style={styles.textStyle} >Time: 1 30,62 seconds</Text>
<View style={styles.infoContainer}>
<Text style={styles.textStyle} >Average Speed: {"\n"} 102 km/h</Text>
<Text style={styles.textStyle} >G: {"\n"} 0.001 G</Text>
</View>
<Text style={styles.textStyle} ></Text>
</View>
</BackgroundImage>
</View>
</View>
</SafeAreaView>
);
}
// TROUBLE SHOOTING BORDER :
//borderColor:'red',
//borderWidth:3,
const styles = StyleSheet.create({
card: {
flexDirection: 'column',
height: "80%",
width: "80%",
backgroundColor: "#fff",
borderRadius: 15,
padding: 10,
elevation: 10,
shadowColor: '#000',
shadowOffset: { width: 0, height: 3 },
shadowOpacity: 0.5,
shadowRadius: 5,
},
infoContainer: {
margin: 3,
flex: 1,
flexDirection: 'row',
justifyContent: 'space-around',
},
map: {
height: "40%",
},
top_lap: {
height: "8%",
flexDirection: 'row',
justifyContent: 'space-between'
},
backgroundImage: {
flex: 1,
width: '100%',
},
container: {
flex: 1,
},
accountSettings: {
width: '100%',
height: '100%',
},
accountContainerButton: {
flexDirection: 'row',
alignItems: 'center',
},
LapBrowserButton: {
width: "30%",
margin: 5,
alignContent: 'center',
justifyContent: 'center',
borderRadius: 10,
backgroundColor: '#BF181F',
},
button_text: {
textAlign: 'center',
color: '#fff',
fontSize: 20,
},
ImageContainer: {
backgroundColor: '#fff',
borderRadius: 50,
width: 40,
height: 40,
overflow: 'hidden',
marginRight: 10,
},
accountImage: {
width: '100%',
height: '100%',
},
topbar: {
backgroundColor: '#BF181D',
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 20,
height: "8%",
},
accountName: {
color: '#fff',
fontSize: 20,
},
topbarRight: {
flex: 1,
alignItems: 'flex-end',
},
textStyle: {
margin: 3,
fontSize: 20,
backgroundColor: '#BF181D',
color: 'white',
padding: "2%",
borderRadius: 5,
},
text_title: {
fontWeight: 'bold',
fontSize: 30,
textAlign: 'center',
padding: 10,
textShadowColor: '#fff',
textShadowOffset: { width: 0, height: 0 },
textShadowRadius: 10,
},
iconContainer: {
position: 'absolute',
bottom: 0,
right: 0,
backgroundColor: 'transparent',
width: 24,
height: 24,
},
});

@ -0,0 +1,106 @@
import { useState } from 'react';
import React 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';
export default function Login(props: { navigation: any }) {
const { navigation } = props;
return (
<SafeAreaView style={styles.container}>
<View style={styles.maincard}>
<Text style={{ paddingBottom: 10, fontSize: 30 }} >Login</Text>
<View style={styles.email}>
<TextInput
keyboardType="email-address"
placeholder="Email"
/>
<Image
style={styles.logo}
source={require('../assets/images/email.png')}
/>
</View>
<View style={styles.email}>
<TextInput
secureTextEntry={true}
placeholder="Password"
/>
<Image
style={styles.logo}
source={require('../assets/images/cadna.png')}
/>
</View>
<Pressable style={styles.button} onPress={() => navigation.navigate('Home')}>
<Text style={styles.text}>Login</Text>
</Pressable>
<View style={{ alignItems: 'center', flexDirection: 'row' }}>
<Text style={styles.text}>Don't have Account ? </Text>
<Pressable onPress={() => navigation.replace('SignUp')}>
<Text style={styles.register}>Register</Text>
</Pressable>
</View>
</View>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#C5C5C5',
alignItems: 'center',
justifyContent: 'center',
},
maincard: {
height: "40%",
width: "80%",
backgroundColor: "#fff",
borderRadius: 15,
padding: 20,
elevation: 10,
shadowColor: '#000',
shadowOffset: { width: 0, height: 3 },
shadowOpacity: 0.5,
shadowRadius: 5,
justifyContent: 'space-between',
alignItems: 'center',
},
email: {
height: "auto",
width: 300,
borderRadius: 10,
backgroundColor: "#C8C8C8",
padding: 10,
elevation: 10,
shadowColor: '#000',
shadowOffset: { width: 0, height: 3 },
shadowOpacity: 0.5,
shadowRadius: 5,
justifyContent: 'space-between',
alignItems: 'center',
flexDirection: 'row',
},
button: {
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 12,
paddingHorizontal: 32,
borderRadius: 10,
elevation: 3,
backgroundColor: '#BF181D',
},
text: {
color: '#000',
fontSize: 15,
},
logo: {
width: 30,
height: 30,
},
register: {
color: '#ffa020',
fontSize: 15,
textDecorationLine: 'underline',
}
});

@ -0,0 +1,137 @@
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';
export default function ManageAccount(props: { navigation: any }) {
const { navigation } = props;
const [pickedDocument, setPickedDocument] = useState<DocumentPicker.DocumentResult | null>(null);
const handlePickDocument = async () => {
try {
const result = await DocumentPicker.getDocumentAsync({ type: ['image/png', 'image/jpeg', 'image/jpg'] });
if (result.type === 'success') {
setPickedDocument(result);
}
} catch (err) {
console.log(err);
}
};
return (
<SafeAreaView style={styles.container}>
<View style={styles.maincard}>
<Text style={{ paddingBottom: 10, fontSize: 30 }}>Manage account</Text>
<View style={styles.card}>
<View style={styles.placement}>
<Image style={styles.logo} source={require('../assets/images/image.png')} />
<Pressable onPress={handlePickDocument}>
<Image style={styles.import} source={require('../assets/images/import.png')} />
<Text>
Picked document: {pickedDocument ? pickedDocument.name : 'none'}
</Text>
</Pressable>
</View>
<View>
<Text>Name : </Text>
<TextInput style={styles.nameCard} secureTextEntry={true} placeholder="Name" />
</View>
<Pressable style={styles.button} onPress={() => navigation.navigate('Password')}>
<Text>Change password</Text>
</Pressable>
<View style={styles.placement}>
<Pressable style={styles.button} onPress={() => navigation.goBack()}>
<Image style={styles.return} source={require('../assets/images/return.png')} />
</Pressable>
<Pressable style={styles.button} onPress={() => navigation.goBack()}>
<Image style={styles.return} source={require('../assets/images/checked.png')} />
</Pressable>
</View>
</View>
</View>
</SafeAreaView>
);
};
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#C5C5C5',
alignItems: 'center',
justifyContent: 'center',
},
maincard: {
height: "60%",
width: "80%",
backgroundColor: "#fff",
borderRadius: 15,
padding: 10,
elevation: 10,
shadowColor: '#000',
shadowOffset: { width: 0, height: 3 },
shadowOpacity: 0.5,
shadowRadius: 5,
justifyContent: 'space-evenly',
alignItems: 'center',
},
card: {
height: "70%",
width: "80%",
backgroundColor: "#C8C8C8",
padding: 10,
elevation: 10,
shadowColor: '#000',
shadowOffset: { width: 0, height: 3 },
shadowOpacity: 0.5,
shadowRadius: 5,
justifyContent: 'space-evenly',
paddingHorizontal: 20,
},
button: {
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 12,
paddingHorizontal: 32,
borderRadius: 10,
elevation: 3,
backgroundColor: '#BF181D',
},
button_text: {
color: '#fff',
fontSize: 15,
},
logo: {
borderRadius: 100,
width: 100,
height: 100,
},
import: {
width: 70,
height: 70,
paddingLeft: 20,
},
placement: {
justifyContent: 'space-between',
flexDirection: 'row',
},
nameCard: {
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 12,
paddingHorizontal: 32,
elevation: 3,
backgroundColor: '#fff',
borderWidth: 1,
borderColor: '#000',
},
return: {
width: 30,
height: 30,
}
});

@ -0,0 +1,183 @@
import { StatusBar } from 'expo-status-bar';
import React from 'react';
import { Button, Pressable, StyleSheet, Text, View, Image, TouchableOpacity, TextInput } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
export default function NewTrack(props: { navigation: any }) {
const { navigation } = props;
return (
<SafeAreaView>
<View style={styles.container}>
<View style={styles.topbar}>
<View>
<TouchableOpacity style={styles.accountContainerButton}>
<View style={styles.ImageContainer}>
</View>
<Text style={styles.accountName}>Name</Text>
</TouchableOpacity>
</View>
<View style={styles.topbarRight}>
<View style={styles.iconContainer}>
<Image source={require('../assets/images/settings.png')} style={styles.accountSettings} />
</View>
<TouchableOpacity style={styles.accountContainerButton}>
<View style={styles.ImageContainer}>
<Image source={require('../assets/images/image.png')} style={styles.accountImage} />
</View>
</TouchableOpacity>
</View>
</View>
{/* Page */}
<View style={{ alignItems: 'center', width: "100%", height: "80%", justifyContent: 'space-around' }}>
<View style={styles.page}>
<View style={styles.placement}>
<Text style={{ paddingTop: 20 }}>Track name: </Text>
<TextInput
style={styles.textInput}
secureTextEntry={true}
placeholder="Track name"
/>
</View>
<View style={styles.placement}>
<Text style={{ paddingTop: 20 }}>Session name: </Text>
<TextInput
style={styles.textInput}
secureTextEntry={true}
placeholder="Session name"
/>
</View>
<View style={styles.placement}>
<Text style={{ paddingTop: 30 }}>Import file: </Text>
<Pressable>
<Image
style={styles.import}
source={require('../assets/images/import.png')}
/>
</Pressable>
</View>
</View>
</View>
<View style={styles.placement}>
<Pressable style={styles.button} onPress={() => navigation.goBack()}>
<Image
style={styles.return}
source={require('../assets/images/return.png')}
/>
</Pressable>
<Pressable style={styles.button} onPress={() => navigation.goBack()}>
<Image
style={styles.return}
source={require('../assets/images/checked.png')}
/>
</Pressable>
</View>
</View>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
backgroundImage: {
},
container: {
flexDirection: 'column',
},
accountSettings: {
width: '100%',
height: '100%',
},
accountContainerButton: {
flexDirection: 'row',
alignItems: 'center',
},
ImageContainer: {
backgroundColor: '#fff',
borderRadius: 50,
width: 40,
height: 40,
overflow: 'hidden',
marginRight: 10,
},
accountImage: {
width: '100%',
height: '100%',
},
topbar: {
backgroundColor: '#BF181D',
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingHorizontal: 20,
height: 80,
},
accountName: {
color: '#fff',
fontSize: 20,
},
topbarRight: {
flex: 1,
alignItems: 'flex-end',
},
text_title: {
flex: 1,
alignItems: 'flex-start',
fontWeight: 'bold',
fontSize: 30,
textAlign: 'center',
padding: 10,
},
iconContainer: {
position: 'absolute',
bottom: 0,
right: 0,
backgroundColor: 'transparent',
width: 24,
height: 24,
},
textInput: {
alignItems: 'center',
paddingVertical: 12,
paddingHorizontal: 32,
elevation: 3,
backgroundColor: '#fff',
borderWidth: 1,
borderColor: '#000',
width: '90%',
},
import: {
width: 70,
height: 70,
paddingLeft: 20,
},
placement: {
justifyContent: 'space-between',
flexDirection: 'row',
},
page: {
padding: 20,
justifyContent: 'space-between',
alignItems: 'center',
height: "60%",
width: "80%",
},
button: {
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 12,
paddingHorizontal: 32,
borderRadius: 10,
elevation: 3,
backgroundColor: '#BF181D',
},
return: {
width: 30,
height: 30,
}
});

@ -0,0 +1,126 @@
import { useState } from 'react';
import React from 'react';
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;
return (
<SafeAreaView style={styles.container}>
<View style={styles.maincard}>
<Text style={{ paddingBottom: 10, fontSize: 30 }}>Register</Text>
<View style={styles.input}>
<TextInput
placeholder="Name"
/>
<Image
style={styles.logo}
source={require('../assets/images/user.png')}
/>
</View>
<View style={styles.input}>
<TextInput
keyboardType="email-address"
placeholder="Email"
/>
<Image
style={styles.logo}
source={require('../assets/images/email.png')}
/>
</View>
<View style={styles.input}>
<TextInput
secureTextEntry={true}
placeholder="Password"
/>
<Image
style={styles.logo}
source={require('../assets/images/cadna.png')}
/>
</View>
<View style={styles.input}>
<TextInput
secureTextEntry={true}
placeholder="Confirm Password"
/>
<Image
style={styles.logo}
source={require('../assets/images/cadna.png')}
/>
</View>
<Pressable style={styles.button} onPress={() => navigation.navigate('Home')}>
<Text style={styles.text}>Sign Up</Text>
</Pressable>
<View style={{ alignItems: 'center', flexDirection: 'row' }}>
<Text style={styles.text}>Already a Member ? </Text>
<Pressable onPress={() => navigation.replace('SignIn')} >
<Text style={styles.register}>Sign in</Text>
</Pressable>
</View>
</View>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#C5C5C5',
alignItems: 'center',
justifyContent: 'center',
},
maincard: {
height: "60%",
width: "80%",
backgroundColor: "#fff",
borderRadius: 15,
padding: 20,
elevation: 10,
shadowColor: '#000',
shadowOffset: { width: 0, height: 3 },
shadowOpacity: 0.5,
shadowRadius: 5,
justifyContent: 'space-between',
alignItems: 'center',
},
input: {
height: "auto",
width: 300,
borderRadius: 10,
backgroundColor: "#C8C8C8",
padding: 10,
elevation: 10,
shadowColor: '#000',
shadowOffset: { width: 0, height: 3 },
shadowOpacity: 0.5,
shadowRadius: 5,
justifyContent: 'space-between',
alignItems: 'center',
flexDirection: 'row',
},
button: {
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 12,
paddingHorizontal: 32,
borderRadius: 10,
elevation: 3,
backgroundColor: '#BF181D',
},
text: {
color: '#000',
fontSize: 15,
},
logo: {
width: 30,
height: 30,
},
register: {
color: '#ffa020',
fontSize: 15,
textDecorationLine: 'underline',
}
});

@ -0,0 +1,144 @@
import { BackgroundImage } from '@rneui/base';
import React from 'react';
import { FlatList, StyleSheet, Text, View, Image, TouchableOpacity, TouchableHighlight } from 'react-native';
import TopBar from '../components/TopBar';
export default function Session_browser(props: {navigation: any}) {
type ItemProps = { title: string };
const { navigation } = props;
const Item = ({title}: ItemProps) => (
<View style={styles.item}>
<Text style={styles.title}>{title}</Text>
</View>
);
const DATA = [
{
id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
title: 'First Item',
},
{
id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
title: 'Second Item',
},
{
id: '58694a0f-3da1-471f-bd96-145571e29d71',
title: 'Third Item',
},
{
id: '58694a0f-3da1-471f-bd96-145571e29d78',
title: 'c Item',
},
{
id: '58694a0f-3da1-471f-bd96-145571e29d76',
title: 'b Item',
},
{
id: '58694a0f-3da1-471f-bd96-145571e29d75',
title: 'a Item',
},
{
id: '58694a0f-3da1-471f-bd96-145571e29d73',
title: 's Item',
},
{
id: '58694a0f-3da1-471f-bd96-145571e29d13',
title: 's Item',
},
];
return (
<View style={styles.container}>
<View style={styles.container}>
{/* Header */}
<TopBar navigation={navigation} />
{/* Body */}
<View style={styles.container}>
<BackgroundImage source={require('../assets/images/rdash.png')} resizeMode="contain" style={styles.backgroundImage}>
<Text style={styles.text_title}>Sessions</Text>
<FlatList data={DATA} renderItem={({ item }) =>
<TouchableHighlight onPress={() => navigation.navigate('Lap', { "lap": item })}>
<Item title={item.title} />
</TouchableHighlight>
} keyExtractor={(Item) => Item.title} />
<TouchableOpacity style={styles.addContainerButton} onPress={() => navigation.navigate('Add')}>
<View>
<Text style={styles.button_text} >Add a session</Text>
</View>
</TouchableOpacity>
</BackgroundImage>
</View>
</View>
</View>
);
}
const styles = StyleSheet.create({
item: {
borderRadius:10,
opacity:0.9,
backgroundColor: '#C5C5C5',
padding: 20,
marginVertical: 8,
marginHorizontal: 16,
},
title: {
fontSize: 32,
},
backgroundImage: {
flex:1,
width:'100%',
},
container: {
flex:1,
},
addImageContainer:{
backgroundColor: '#fff',
borderRadius: 50,
width: 40,
height: 40,
overflow: 'hidden',
alignItems:'center'
},
addContainerButton:{
margin:10,
alignItems:'center',
justifyContent:'center',
height: "10%",
paddingVertical: 12,
paddingHorizontal: 32,
borderRadius: 10,
elevation: 3,
backgroundColor: '#BF181F',
},
button_text: {
color:'#fff',
fontSize:20,
},
text_title: {
fontWeight: 'bold',
fontSize: 30,
textAlign:'center',
padding:10,
textShadowColor: '#fff',
textShadowOffset: { width: 0, height: 0 },
textShadowRadius: 10,
},
topbar: {
height: '10%',
}
});

@ -0,0 +1,125 @@
import { Button, FlatList, Pressable, StyleSheet, Text, View } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import { SearchBar } from '@rneui/base';
import { TouchableHighlight } from 'react-native-gesture-handler';
import React from 'react';
export default function Team_Browser(props: { navigation: any }) {
const { navigation } = props;
type ItemProps = { title: string };
const Item = ({title}: ItemProps) => (
<View style={styles.item}>
<Text style={styles.title}>{title}</Text>
</View>
);
const DATA = [
{
id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
title: 'First Item',
},
{
id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
title: 'Second Item',
},
{
id: '58694a0f-3da1-471f-bd96-145571e29d71',
title: 'Third Item',
},
{
id: '58694a0f-3da1-471f-bd96-145571e29d78',
title: 'c Item',
},
{
id: '58694a0f-3da1-471f-bd96-145571e29d76',
title: 'b Item',
},
{
id: '58694a0f-3da1-471f-bd96-145571e29d75',
title: 'a Item',
},
{
id: '58694a0f-3da1-471f-bd96-145571e29d73',
title: 's Item',
},
];
return (
<SafeAreaView style={styles.container}>
<View style={styles.card}>
<Text style={styles.text_title}> Browse teams </Text>
<SearchBar
platform="default"
lightTheme
/>
<FlatList data={DATA} renderItem={({ item }) =>
<TouchableHighlight onPress={() => navigation.navigate('Info', { "team": item })}>
<Item title={item.title} />
</TouchableHighlight>
}/>
</View>
</SafeAreaView>
);
}
const styles = StyleSheet.create({
item: {
backgroundColor: '#C5C5C5',
padding: 20,
marginVertical: 8,
marginHorizontal: 16,
},
title: {
fontSize: 32,
},
search: {
backgroundColor:'#fff',
lightTheme: 1,
},
button: {
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 12,
paddingHorizontal: 32,
borderRadius: 10,
elevation: 3,
backgroundColor: '#BF181D',
},
button_text: {
color:'#fff',
fontSize:15,
},
text_title: {
fontSize: 24,
textAlign:'center',
padding:10,
},
container: {
backgroundColor: "#C5C5C5",
flex:1,
justifyContent:'center',
alignItems:'center'
},
card: {
flexDirection:'column',
height: "80%",
width: "80%",
backgroundColor: "#fff",
borderRadius: 15,
padding: 10,
elevation: 10,
shadowColor: '#000',
shadowOffset: { width: 0, height: 3 },
shadowOpacity: 0.5,
shadowRadius: 5,
},
});

@ -0,0 +1,78 @@
import React from 'react';
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 }) {
const { navigation } = props;
return (
<View style={styles.main}>
<TopBar navigation={navigation}/>
<View style={styles.container}>
<View style={styles.card}>
<Text style={styles.text_title}> Create or join a team </Text>
<Pressable style={styles.button} onPress={() => navigation.navigate('Browse')}>
<Text style={styles.button_text}>Browse teams </Text>
</Pressable>
<Pressable style={styles.button} onPress={() => navigation.navigate('Create')} >
<Text style={styles.button_text}> Create a team </Text>
</Pressable>
{/*<Pressable style={styles.button} >*/}
{/* <Text style={styles.button_text}> Cancel </Text> */}
{/*</Pressable>*/}
</View>
</View>
</View>
);
}
const styles = StyleSheet.create({
main: {
flex: 1,
},
button: {
alignItems: 'center',
justifyContent: 'center',
paddingVertical: 12,
paddingHorizontal: 32,
borderRadius: 10,
elevation: 3,
backgroundColor: '#BF181D',
},
button_text: {
color:'#fff',
fontSize:15,
},
text_title: {
fontSize: 24,
textAlign:'center',
},
container: {
backgroundColor: "#C5C5C5",
flex:1,
alignItems:'center',
justifyContent:'center',
},
card: {
flexDirection:'column',
justifyContent: 'space-around',
alignItems:'center',
height: "50%",
width: "80%",
backgroundColor: "#fff",
borderRadius: 15,
padding: 10,
elevation: 10,
shadowColor: '#000',
shadowOffset: { width: 0, height: 3 },
shadowOpacity: 0.5,
shadowRadius: 5,
},
});

@ -0,0 +1,6 @@
{
"extends": "expo/tsconfig.base",
"compilerOptions": {
"strict": true
}
}
Loading…
Cancel
Save