Nouveau git, tout nettoyé. ancien git : https://codefirst.iut.uca.fr/git/R-Dash/R-Dash_APP
@ -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
|
@ -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"
|
||||
}
|
||||
}
|
||||
}
|
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 9.3 KiB |
After Width: | Height: | Size: 5.2 KiB |
After Width: | Height: | Size: 8.8 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 61 KiB |
After Width: | Height: | Size: 8.1 KiB |
After Width: | Height: | Size: 116 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 13 KiB |
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 7.0 KiB |
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>
|
||||
)
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|