Compare commits

..

1 Commits

Author SHA1 Message Date
Lucas Delanier 845476d057 add in the discovery section
continuous-integration/drone/push Build is passing Details
2 years ago

@ -7,28 +7,14 @@ trigger:
- push
steps:
- name: app-build
image: ghcr.io/cirruslabs/flutter:3.13.9
commands:
- cd ./Sources/justMUSIC/
- flutter build apk
- name: build-web
image: ghcr.io/cirruslabs/flutter:3.13.9
environment:
FIREBASE_TOKEN:
from_secret: FIREBASE_TOKEN
commands:
- cd ./Sources/justMUSIC/
- flutter build web --web-renderer canvaskit
- curl -sL https://firebase.tools | bash
- firebase deploy --token $${FIREBASE_TOKEN}
when:
branch:
- PROD-WEB
# - name: app-build
# image: cirrusci/flutter:stable
# commands:
# - cd ./Sources/justMUSIC/
# - flutter build apk
- name: code-analysis
image: ghcr.io/cirruslabs/flutter:3.13.9
image: cirrusci/flutter:stable
environment:
SONAR_TOKEN:
from_secret: SONAR_TOKEN
@ -40,4 +26,3 @@ steps:
- export PATH=$SONAR_SCANNER_HOME/bin:$PATH
- export SONAR_SCANNER_OPTS="-server"
- sonar-scanner -D sonar.projectKey=JustMusic -D sonar.sources=./Sources/justMUSIC -D sonar.host.url=https://codefirst.iut.uca.fr/sonar
ddepends_on: [app-build]

@ -12,144 +12,6 @@
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_core/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_core/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_core/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/geolocator_apple/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/geolocator_apple/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/geolocator_apple/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/google_sign_in_ios/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/google_sign_in_ios/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/google_sign_in_ios/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_auth/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_auth/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_auth/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/sqflite/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/sqflite/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/sqflite/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/sqflite/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/sqflite/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/sqflite/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/path_provider_foundation/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/path_provider_foundation/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/path_provider_foundation/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/image_picker_ios/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/image_picker_ios/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/image_picker_ios/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_core/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_core/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_core/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_storage/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_storage/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_storage/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/google_sign_in_ios/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/google_sign_in_ios/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/google_sign_in_ios/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/path_provider_foundation/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/path_provider_foundation/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/path_provider_foundation/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_auth/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_auth/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_auth/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/cloud_firestore/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/cloud_firestore/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/cloud_firestore/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/image_picker_ios/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/image_picker_ios/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/image_picker_ios/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/geolocator_apple/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/geolocator_apple/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/geolocator_apple/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/cloud_firestore/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/cloud_firestore/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/cloud_firestore/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_messaging/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_messaging/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_messaging/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/flutter_keyboard_visibility/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/flutter_keyboard_visibility/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/flutter_keyboard_visibility/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/audioplayers_darwin/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/audioplayers_darwin/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/audioplayers_darwin/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_messaging/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_messaging/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_messaging/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_storage/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_storage/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/firebase_storage/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/flutter_keyboard_visibility/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/flutter_keyboard_visibility/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/ios/.symlinks/plugins/flutter_keyboard_visibility/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_storage/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_storage/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_storage/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/cloud_firestore/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/cloud_firestore/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/cloud_firestore/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_auth/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_auth/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_auth/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/path_provider_foundation/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/path_provider_foundation/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/path_provider_foundation/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_auth/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_auth/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_auth/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/google_sign_in_ios/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/google_sign_in_ios/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/google_sign_in_ios/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/audioplayers_darwin/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/audioplayers_darwin/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/audioplayers_darwin/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_storage/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_storage/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_storage/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/geolocator_apple/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/geolocator_apple/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/geolocator_apple/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/flutter_keyboard_visibility/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/flutter_keyboard_visibility/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/flutter_keyboard_visibility/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/sqflite/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/sqflite/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/sqflite/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_messaging/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_messaging/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_messaging/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_core/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_core/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_core/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/flutter_keyboard_visibility/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/flutter_keyboard_visibility/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/flutter_keyboard_visibility/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_messaging/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_messaging/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_messaging/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_core/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_core/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/firebase_core/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/sqflite/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/sqflite/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/sqflite/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/cloud_firestore/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/cloud_firestore/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/cloud_firestore/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/image_picker_ios/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/image_picker_ios/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/image_picker_ios/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/image_picker_ios/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/image_picker_ios/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/image_picker_ios/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/google_sign_in_ios/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/google_sign_in_ios/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/google_sign_in_ios/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/geolocator_apple/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/geolocator_apple/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/geolocator_apple/example/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/path_provider_foundation/example/build" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/path_provider_foundation/example/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justMUSIC/ios/.symlinks/plugins/path_provider_foundation/example/.dart_tool" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />

File diff suppressed because it is too large Load Diff

@ -1,27 +1,26 @@
<component name="libraryTable">
<library name="Dart SDK">
<CLASSES>
<root url="file:///opt/homebrew/opt/dart/libexec/lib/async" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/cli" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/collection" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/convert" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/core" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/developer" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/ffi" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/html" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/indexed_db" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/io" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/isolate" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/js" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/js_interop" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/js_interop_unsafe" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/js_util" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/math" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/mirrors" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/svg" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/typed_data" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/web_audio" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/web_gl" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/async" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/cli" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/collection" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/convert" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/core" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/developer" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/ffi" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/html" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/indexed_db" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/io" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/isolate" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/js" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/js_interop" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/js_util" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/math" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/mirrors" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/svg" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/typed_data" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/web_audio" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/web_gl" />
</CLASSES>
<JAVADOC />
<SOURCES />

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 844 KiB

@ -4,10 +4,8 @@
---
&nbsp; ![Firebase](https://img.shields.io/badge/Firebase-FFCA28.svg?style=for-the-badge&logo=Firebase&logoColor=black)
&nbsp; ![Dart](https://img.shields.io/badge/Dart-000?style=for-the-badge&logo=dart&logoColor=blue&color=white)
&nbsp; ![Flutter](https://img.shields.io/badge/Flutter-000?style=for-the-badge&logo=flutter&logoColor=blue&color=white)
&nbsp; ![Spotify](https://img.shields.io/badge/Spotify-1DB954.svg?style=for-the-badge&logo=Spotify&logoColor=white)
---
@ -33,15 +31,13 @@ JustMusic est un projet collaboratif à but lucratif pour Android/IOS utilisant
C'est un réseau social donc l'utilisateur pourra publier et commenter des posts. Il pourra s'abonner à d'autre utilisateurs pour voir leurs post sur son fil d'actualité.
**Lien pour tester la version web:** [Just Music](https://justmusic-435d5.web.app) 🎶
## Répartition du Gitlab
La racine de notre gitlab est composé de deux dossier essentielles au projet:
[**Sources**](Sources) : **Code de l'application**
[**src**](src) : **Code de l'application**
[**Documentation**](Documentation) : **Regroupe l'entièreté de la documentation**
[**doc**](doc) : **Regroupe l'entièreté de la documentation**
</br>
@ -49,33 +45,10 @@ La racine de notre gitlab est composé de deux dossier essentielles au projet:
## Fonctionnement
<div align = center>
<img src="Documentation/Images/Overview.png" />
</div>
### Feeds
Une fois authentifié vous aurez la possibilité de voir les posts capsules de vos amis, de voir les musiques qu'ils mettent en avant accompagner éventuellement d'une image, d'une description, de leurs localisations... (Vous n'avez pas d'amis, pas de soucis, cliquer seulement sur l'icon en haut a gauche de la page pour suivre nimporte quel personne que vous voulez), Mais aussi juste d'un simple mouvement du doigt swiper pour vous retrouvez sur la page Discovery où vous verrais les posts récents en tendance dans le monde 🌎
Amuser vous à cliquer sur les posts pour ecouter la music mais aussi connaître les détails et savoir qui a commenter 💬 et liker ❤️. Si la musique vous plaît enregistrer la et vous la retrouverez lorsque vous aurez envie de poster.
### Post
Pour participer à cette aventure musicale avec des gens du monde entier, cliquez simplement sur l'icône JustMusic. Gardez à l'esprit que vous ne pourrez poster qu'une fois par jour, donc réfléchissez bien à la musique que vous souhaitez mettre en avant. N'hésitez pas à ajouter une photo et une description pour rendre votre publication plus chaleureuse 😃.
### Profil
Consultez l'aperçu de votre profil pour savoir combien de personnes vous suivent et que vous suivez. Vous pouvez également voir le nombre de capsules que vous avez publiées, personnaliser les paramètres de votre compte selon vos préférences, et explorez votre historique de capsules pour vous remémorer vos précédentes publications 🎧.
#### Bonne aventure musicale 🎵🌟
## Deploiement
- [x] &nbsp; ![IOS](https://img.shields.io/badge/IOS-000?style=for-the-badge&logo=apple&logoColor=black&color=white)
- [x] &nbsp; ![Android](https://img.shields.io/badge/Android-000?style=for-the-badge&logo=android&logoColor=white&color=green)
- [x] &nbsp; ![Safari](https://img.shields.io/badge/Safari-000000.svg?style=for-the-badge&logo=Safari&logoColor=white)
## Techniciens
@ -84,10 +57,10 @@ Consultez l'aperçu de votre profil pour savoir combien de personnes vous suiven
<img src ="https://codefirst.iut.uca.fr/git/avatars/6a3835d734392fccff3949f7c82a63b9?size=870" height="50px">
</a>
<a href = "https://codefirst.iut.uca.fr/git/emre.kartal">
<img src ="https://codefirst.iut.uca.fr/git/avatars/1ff65c9c5ab0e8c8883fb48adbcf972f?size=870" height="50px">
<img src ="https://codefirst.iut.uca.fr/git/avatars/402cf312e853192f42c0135a888725c2?size=870" height="50px">
</a>
<a href = "https://codefirst.iut.uca.fr/git/david.d_almeida">
<img src ="https://codefirst.iut.uca.fr/git/avatars/a16fa2dc52ceae18d8923c91121caa66?size=870" height="50px">
<img src ="https://codefirst.iut.uca.fr/git/avatars/0f8eaaad1e26d3de644ca522eccaea7c?size=870" height="50px">
</a>
<a href = "https://codefirst.iut.uca.fr/git/rayhan.hassou">
<img src ="https://codefirst.iut.uca.fr/git/avatars/84062b2bb326d9e9154a9859b375e599?size=870" height="50px">

@ -1,5 +0,0 @@
{
"projects": {
"default": "justmusic-435d5"
}
}

@ -30,7 +30,7 @@ migrate_working_dir/
.packages
.pub-cache/
.pub/
lib/values/keys.dart
.lib/values/keys.dart
/build/
# Symbolication related

@ -1,11 +1,11 @@
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled and should not be manually edited.
# This file should be version controlled.
version:
revision: "db7ef5bf9f59442b0e200a90587e8fa5e0c6336a"
channel: "stable"
revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
channel: stable
project_type: app
@ -13,26 +13,11 @@ project_type: app
migration:
platforms:
- platform: root
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
- platform: android
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
- platform: ios
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
- platform: linux
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
- platform: macos
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
- platform: web
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
- platform: windows
create_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
base_revision: db7ef5bf9f59442b0e200a90587e8fa5e0c6336a
create_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
base_revision: f468f3366c26a5092eb964a230ce7892fda8f2f8
# User provided section

@ -28,7 +28,7 @@ apply plugin: 'com.google.gms.google-services'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
namespace "com.justdev.justmusic"
namespace "com.example.justmusic"
compileSdkVersion 33
ndkVersion flutter.ndkVersion
@ -48,7 +48,7 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.justdev.justmusic"
applicationId "com.example.justmusic"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 19
@ -75,5 +75,6 @@ dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation(platform("com.google.firebase:firebase-bom:32.2.0"))
implementation 'com.google.firebase:firebase-analytics-ktx'
implementation 'com.google.android.gms:play-services-ads:22.2.0'
}
apply plugin: 'com.google.gms.google-services'

@ -12,58 +12,6 @@
"package_name": "com.example.justmusic"
}
},
"oauth_client": [
{
"client_id": "994903990520-a3im0ap1qqrs6j2u97v302v119e4jgbo.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "com.example.justmusic",
"certificate_hash": "b08e11598626ceeaaf75c6a3f71dce7af0846a07"
}
},
{
"client_id": "994903990520-tbbnoqubdo6eeo1d5iv94g7dofsdjnma.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "com.example.justmusic",
"certificate_hash": "883f6f500f08166c76009ec56ce77d98bb9fb831"
}
},
{
"client_id": "994903990520-rdk6ldrmbi71ddqt84qfhtuficm7ngon.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyCjkofl0nvfzQqRZPv_-H99WoyYa7O660g"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "994903990520-9jsnq9ipdn7smk7tlbdd20i7j6sl3jcd.apps.googleusercontent.com",
"client_type": 3
},
{
"client_id": "994903990520-n6jd98ena56kb1tvtrd67tvb5et3nfbf.apps.googleusercontent.com",
"client_type": 2,
"ios_info": {
"bundle_id": "com.example.justmusic"
}
}
]
}
}
},
{
"client_info": {
"mobilesdk_app_id": "1:994903990520:android:056f0394b9fb14410a9b0d",
"android_client_info": {
"package_name": "com.justdev.justmusic"
}
},
"oauth_client": [
{
"client_id": "994903990520-rdk6ldrmbi71ddqt84qfhtuficm7ngon.apps.googleusercontent.com",

@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.justdev.justmusic">
package="com.example.justmusic">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.justdev.justmusic">
package="com.example.justmusic">
<application
android:label="JustMUSIC"
android:name="${applicationName}"
@ -31,6 +31,9 @@ package="com.justdev.justmusic">
<meta-data
android:name="flutterEmbedding"
android:value="2" />
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-9896583895323467~5308111198"/>
</application>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

@ -0,0 +1,12 @@
package com.example.justmusic
import android.os.Bundle
import com.google.android.gms.ads.MobileAds
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
MobileAds.initialize(this)
}
}

@ -1,6 +0,0 @@
package com.justdev.justmusic
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
}

@ -9,6 +9,7 @@ buildscript {
classpath 'com.android.tools.build:gradle:7.1.2'
classpath 'com.google.gms:google-services:4.3.15'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 983 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.2 KiB

@ -1,17 +0,0 @@
{
"hosting": {
"site": "justmusic-435d5",
"public": "build/web",
"ignore": [
"firebase.json",
"**/.*",
"**/node_modules/**"
],
"rewrites": [
{
"source": "**",
"destination": "/index.html"
}
]
}
}

@ -1,2 +1 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"
#include "Generated.xcconfig"

@ -1,2 +1 @@
#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"

@ -1,44 +0,0 @@
# Uncomment this line to define a global platform for your project
platform :ios, '11.0'
# CocoaPods analytics sends network stats synchronously affecting flutter build latency.
ENV['COCOAPODS_DISABLE_STATS'] = 'true'
project 'Runner', {
'Debug' => :debug,
'Profile' => :release,
'Release' => :release,
}
def flutter_root
generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__)
unless File.exist?(generated_xcode_build_settings_path)
raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first"
end
File.foreach(generated_xcode_build_settings_path) do |line|
matches = line.match(/FLUTTER_ROOT\=(.*)/)
return matches[1].strip if matches
end
raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get"
end
require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root)
flutter_ios_podfile_setup
target 'Runner' do
use_frameworks!
use_modular_headers!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
inherit! :search_paths
end
end
post_install do |installer|
installer.pods_project.targets.each do |target|
flutter_additional_ios_build_settings(target)
end
end

@ -1,958 +0,0 @@
PODS:
- abseil/algorithm (1.20220623.0):
- abseil/algorithm/algorithm (= 1.20220623.0)
- abseil/algorithm/container (= 1.20220623.0)
- abseil/algorithm/algorithm (1.20220623.0):
- abseil/base/config
- abseil/algorithm/container (1.20220623.0):
- abseil/algorithm/algorithm
- abseil/base/core_headers
- abseil/meta/type_traits
- abseil/base (1.20220623.0):
- abseil/base/atomic_hook (= 1.20220623.0)
- abseil/base/base (= 1.20220623.0)
- abseil/base/base_internal (= 1.20220623.0)
- abseil/base/config (= 1.20220623.0)
- abseil/base/core_headers (= 1.20220623.0)
- abseil/base/dynamic_annotations (= 1.20220623.0)
- abseil/base/endian (= 1.20220623.0)
- abseil/base/errno_saver (= 1.20220623.0)
- abseil/base/fast_type_id (= 1.20220623.0)
- abseil/base/log_severity (= 1.20220623.0)
- abseil/base/malloc_internal (= 1.20220623.0)
- abseil/base/prefetch (= 1.20220623.0)
- abseil/base/pretty_function (= 1.20220623.0)
- abseil/base/raw_logging_internal (= 1.20220623.0)
- abseil/base/spinlock_wait (= 1.20220623.0)
- abseil/base/strerror (= 1.20220623.0)
- abseil/base/throw_delegate (= 1.20220623.0)
- abseil/base/atomic_hook (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/base/base (1.20220623.0):
- abseil/base/atomic_hook
- abseil/base/base_internal
- abseil/base/config
- abseil/base/core_headers
- abseil/base/dynamic_annotations
- abseil/base/log_severity
- abseil/base/raw_logging_internal
- abseil/base/spinlock_wait
- abseil/meta/type_traits
- abseil/base/base_internal (1.20220623.0):
- abseil/base/config
- abseil/meta/type_traits
- abseil/base/config (1.20220623.0)
- abseil/base/core_headers (1.20220623.0):
- abseil/base/config
- abseil/base/dynamic_annotations (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/base/endian (1.20220623.0):
- abseil/base/base
- abseil/base/config
- abseil/base/core_headers
- abseil/base/errno_saver (1.20220623.0):
- abseil/base/config
- abseil/base/fast_type_id (1.20220623.0):
- abseil/base/config
- abseil/base/log_severity (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/base/malloc_internal (1.20220623.0):
- abseil/base/base
- abseil/base/base_internal
- abseil/base/config
- abseil/base/core_headers
- abseil/base/dynamic_annotations
- abseil/base/raw_logging_internal
- abseil/base/prefetch (1.20220623.0):
- abseil/base/config
- abseil/base/pretty_function (1.20220623.0)
- abseil/base/raw_logging_internal (1.20220623.0):
- abseil/base/atomic_hook
- abseil/base/config
- abseil/base/core_headers
- abseil/base/errno_saver
- abseil/base/log_severity
- abseil/base/spinlock_wait (1.20220623.0):
- abseil/base/base_internal
- abseil/base/core_headers
- abseil/base/errno_saver
- abseil/base/strerror (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/base/errno_saver
- abseil/base/throw_delegate (1.20220623.0):
- abseil/base/config
- abseil/base/raw_logging_internal
- abseil/cleanup/cleanup (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/cleanup/cleanup_internal
- abseil/cleanup/cleanup_internal (1.20220623.0):
- abseil/base/base_internal
- abseil/base/core_headers
- abseil/utility/utility
- abseil/container/common (1.20220623.0):
- abseil/meta/type_traits
- abseil/types/optional
- abseil/container/compressed_tuple (1.20220623.0):
- abseil/utility/utility
- abseil/container/container_memory (1.20220623.0):
- abseil/base/config
- abseil/memory/memory
- abseil/meta/type_traits
- abseil/utility/utility
- abseil/container/fixed_array (1.20220623.0):
- abseil/algorithm/algorithm
- abseil/base/config
- abseil/base/core_headers
- abseil/base/dynamic_annotations
- abseil/base/throw_delegate
- abseil/container/compressed_tuple
- abseil/memory/memory
- abseil/container/flat_hash_map (1.20220623.0):
- abseil/algorithm/container
- abseil/base/core_headers
- abseil/container/container_memory
- abseil/container/hash_function_defaults
- abseil/container/raw_hash_map
- abseil/memory/memory
- abseil/container/flat_hash_set (1.20220623.0):
- abseil/algorithm/container
- abseil/base/core_headers
- abseil/container/container_memory
- abseil/container/hash_function_defaults
- abseil/container/raw_hash_set
- abseil/memory/memory
- abseil/container/hash_function_defaults (1.20220623.0):
- abseil/base/config
- abseil/hash/hash
- abseil/strings/cord
- abseil/strings/strings
- abseil/container/hash_policy_traits (1.20220623.0):
- abseil/meta/type_traits
- abseil/container/hashtable_debug_hooks (1.20220623.0):
- abseil/base/config
- abseil/container/hashtablez_sampler (1.20220623.0):
- abseil/base/base
- abseil/base/config
- abseil/base/core_headers
- abseil/debugging/stacktrace
- abseil/memory/memory
- abseil/profiling/exponential_biased
- abseil/profiling/sample_recorder
- abseil/synchronization/synchronization
- abseil/utility/utility
- abseil/container/inlined_vector (1.20220623.0):
- abseil/algorithm/algorithm
- abseil/base/core_headers
- abseil/base/throw_delegate
- abseil/container/inlined_vector_internal
- abseil/memory/memory
- abseil/container/inlined_vector_internal (1.20220623.0):
- abseil/base/core_headers
- abseil/container/compressed_tuple
- abseil/memory/memory
- abseil/meta/type_traits
- abseil/types/span
- abseil/container/layout (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/meta/type_traits
- abseil/strings/strings
- abseil/types/span
- abseil/utility/utility
- abseil/container/raw_hash_map (1.20220623.0):
- abseil/base/throw_delegate
- abseil/container/container_memory
- abseil/container/raw_hash_set
- abseil/container/raw_hash_set (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/base/endian
- abseil/base/prefetch
- abseil/container/common
- abseil/container/compressed_tuple
- abseil/container/container_memory
- abseil/container/hash_policy_traits
- abseil/container/hashtable_debug_hooks
- abseil/container/hashtablez_sampler
- abseil/memory/memory
- abseil/meta/type_traits
- abseil/numeric/bits
- abseil/utility/utility
- abseil/debugging/debugging_internal (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/base/dynamic_annotations
- abseil/base/errno_saver
- abseil/base/raw_logging_internal
- abseil/debugging/demangle_internal (1.20220623.0):
- abseil/base/base
- abseil/base/config
- abseil/base/core_headers
- abseil/debugging/stacktrace (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/debugging/debugging_internal
- abseil/debugging/symbolize (1.20220623.0):
- abseil/base/base
- abseil/base/config
- abseil/base/core_headers
- abseil/base/dynamic_annotations
- abseil/base/malloc_internal
- abseil/base/raw_logging_internal
- abseil/debugging/debugging_internal
- abseil/debugging/demangle_internal
- abseil/strings/strings
- abseil/functional/any_invocable (1.20220623.0):
- abseil/base/base_internal
- abseil/base/config
- abseil/base/core_headers
- abseil/meta/type_traits
- abseil/utility/utility
- abseil/functional/bind_front (1.20220623.0):
- abseil/base/base_internal
- abseil/container/compressed_tuple
- abseil/meta/type_traits
- abseil/utility/utility
- abseil/functional/function_ref (1.20220623.0):
- abseil/base/base_internal
- abseil/base/core_headers
- abseil/meta/type_traits
- abseil/hash/city (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/base/endian
- abseil/hash/hash (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/base/endian
- abseil/container/fixed_array
- abseil/functional/function_ref
- abseil/hash/city
- abseil/hash/low_level_hash
- abseil/meta/type_traits
- abseil/numeric/int128
- abseil/strings/strings
- abseil/types/optional
- abseil/types/variant
- abseil/utility/utility
- abseil/hash/low_level_hash (1.20220623.0):
- abseil/base/config
- abseil/base/endian
- abseil/numeric/bits
- abseil/numeric/int128
- abseil/memory (1.20220623.0):
- abseil/memory/memory (= 1.20220623.0)
- abseil/memory/memory (1.20220623.0):
- abseil/base/core_headers
- abseil/meta/type_traits
- abseil/meta (1.20220623.0):
- abseil/meta/type_traits (= 1.20220623.0)
- abseil/meta/type_traits (1.20220623.0):
- abseil/base/config
- abseil/numeric/bits (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/numeric/int128 (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/numeric/bits
- abseil/numeric/representation (1.20220623.0):
- abseil/base/config
- abseil/profiling/exponential_biased (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/profiling/sample_recorder (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/synchronization/synchronization
- abseil/time/time
- abseil/random/distributions (1.20220623.0):
- abseil/base/base_internal
- abseil/base/config
- abseil/base/core_headers
- abseil/meta/type_traits
- abseil/numeric/bits
- abseil/random/internal/distribution_caller
- abseil/random/internal/fast_uniform_bits
- abseil/random/internal/fastmath
- abseil/random/internal/generate_real
- abseil/random/internal/iostream_state_saver
- abseil/random/internal/traits
- abseil/random/internal/uniform_helper
- abseil/random/internal/wide_multiply
- abseil/strings/strings
- abseil/random/internal/distribution_caller (1.20220623.0):
- abseil/base/config
- abseil/base/fast_type_id
- abseil/utility/utility
- abseil/random/internal/fast_uniform_bits (1.20220623.0):
- abseil/base/config
- abseil/meta/type_traits
- abseil/random/internal/traits
- abseil/random/internal/fastmath (1.20220623.0):
- abseil/numeric/bits
- abseil/random/internal/generate_real (1.20220623.0):
- abseil/meta/type_traits
- abseil/numeric/bits
- abseil/random/internal/fastmath
- abseil/random/internal/traits
- abseil/random/internal/iostream_state_saver (1.20220623.0):
- abseil/meta/type_traits
- abseil/numeric/int128
- abseil/random/internal/nonsecure_base (1.20220623.0):
- abseil/base/core_headers
- abseil/container/inlined_vector
- abseil/meta/type_traits
- abseil/random/internal/pool_urbg
- abseil/random/internal/salted_seed_seq
- abseil/random/internal/seed_material
- abseil/types/span
- abseil/random/internal/pcg_engine (1.20220623.0):
- abseil/base/config
- abseil/meta/type_traits
- abseil/numeric/bits
- abseil/numeric/int128
- abseil/random/internal/fastmath
- abseil/random/internal/iostream_state_saver
- abseil/random/internal/platform (1.20220623.0):
- abseil/base/config
- abseil/random/internal/pool_urbg (1.20220623.0):
- abseil/base/base
- abseil/base/config
- abseil/base/core_headers
- abseil/base/endian
- abseil/base/raw_logging_internal
- abseil/random/internal/randen
- abseil/random/internal/seed_material
- abseil/random/internal/traits
- abseil/random/seed_gen_exception
- abseil/types/span
- abseil/random/internal/randen (1.20220623.0):
- abseil/base/raw_logging_internal
- abseil/random/internal/platform
- abseil/random/internal/randen_hwaes
- abseil/random/internal/randen_slow
- abseil/random/internal/randen_engine (1.20220623.0):
- abseil/base/endian
- abseil/meta/type_traits
- abseil/random/internal/iostream_state_saver
- abseil/random/internal/randen
- abseil/random/internal/randen_hwaes (1.20220623.0):
- abseil/base/config
- abseil/random/internal/platform
- abseil/random/internal/randen_hwaes_impl
- abseil/random/internal/randen_hwaes_impl (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/numeric/int128
- abseil/random/internal/platform
- abseil/random/internal/randen_slow (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/base/endian
- abseil/numeric/int128
- abseil/random/internal/platform
- abseil/random/internal/salted_seed_seq (1.20220623.0):
- abseil/container/inlined_vector
- abseil/meta/type_traits
- abseil/random/internal/seed_material
- abseil/types/optional
- abseil/types/span
- abseil/random/internal/seed_material (1.20220623.0):
- abseil/base/core_headers
- abseil/base/dynamic_annotations
- abseil/base/raw_logging_internal
- abseil/random/internal/fast_uniform_bits
- abseil/strings/strings
- abseil/types/optional
- abseil/types/span
- abseil/random/internal/traits (1.20220623.0):
- abseil/base/config
- abseil/numeric/bits
- abseil/numeric/int128
- abseil/random/internal/uniform_helper (1.20220623.0):
- abseil/base/config
- abseil/meta/type_traits
- abseil/numeric/int128
- abseil/random/internal/traits
- abseil/random/internal/wide_multiply (1.20220623.0):
- abseil/base/config
- abseil/numeric/bits
- abseil/numeric/int128
- abseil/random/internal/traits
- abseil/random/random (1.20220623.0):
- abseil/random/distributions
- abseil/random/internal/nonsecure_base
- abseil/random/internal/pcg_engine
- abseil/random/internal/pool_urbg
- abseil/random/internal/randen_engine
- abseil/random/seed_sequences
- abseil/random/seed_gen_exception (1.20220623.0):
- abseil/base/config
- abseil/random/seed_sequences (1.20220623.0):
- abseil/base/config
- abseil/random/internal/pool_urbg
- abseil/random/internal/salted_seed_seq
- abseil/random/internal/seed_material
- abseil/random/seed_gen_exception
- abseil/types/span
- abseil/status/status (1.20220623.0):
- abseil/base/atomic_hook
- abseil/base/core_headers
- abseil/base/raw_logging_internal
- abseil/base/strerror
- abseil/container/inlined_vector
- abseil/debugging/stacktrace
- abseil/debugging/symbolize
- abseil/functional/function_ref
- abseil/strings/cord
- abseil/strings/str_format
- abseil/strings/strings
- abseil/types/optional
- abseil/status/statusor (1.20220623.0):
- abseil/base/base
- abseil/base/core_headers
- abseil/base/raw_logging_internal
- abseil/meta/type_traits
- abseil/status/status
- abseil/strings/strings
- abseil/types/variant
- abseil/utility/utility
- abseil/strings/cord (1.20220623.0):
- abseil/base/base
- abseil/base/config
- abseil/base/core_headers
- abseil/base/endian
- abseil/base/raw_logging_internal
- abseil/container/fixed_array
- abseil/container/inlined_vector
- abseil/functional/function_ref
- abseil/meta/type_traits
- abseil/numeric/bits
- abseil/strings/cord_internal
- abseil/strings/cordz_functions
- abseil/strings/cordz_info
- abseil/strings/cordz_statistics
- abseil/strings/cordz_update_scope
- abseil/strings/cordz_update_tracker
- abseil/strings/internal
- abseil/strings/str_format
- abseil/strings/strings
- abseil/types/optional
- abseil/types/span
- abseil/strings/cord_internal (1.20220623.0):
- abseil/base/base_internal
- abseil/base/config
- abseil/base/core_headers
- abseil/base/endian
- abseil/base/raw_logging_internal
- abseil/base/throw_delegate
- abseil/container/compressed_tuple
- abseil/container/inlined_vector
- abseil/container/layout
- abseil/functional/function_ref
- abseil/meta/type_traits
- abseil/strings/strings
- abseil/types/span
- abseil/strings/cordz_functions (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/base/raw_logging_internal
- abseil/profiling/exponential_biased
- abseil/strings/cordz_handle (1.20220623.0):
- abseil/base/base
- abseil/base/config
- abseil/base/raw_logging_internal
- abseil/synchronization/synchronization
- abseil/strings/cordz_info (1.20220623.0):
- abseil/base/base
- abseil/base/config
- abseil/base/core_headers
- abseil/base/raw_logging_internal
- abseil/container/inlined_vector
- abseil/debugging/stacktrace
- abseil/strings/cord_internal
- abseil/strings/cordz_functions
- abseil/strings/cordz_handle
- abseil/strings/cordz_statistics
- abseil/strings/cordz_update_tracker
- abseil/synchronization/synchronization
- abseil/types/span
- abseil/strings/cordz_statistics (1.20220623.0):
- abseil/base/config
- abseil/strings/cordz_update_tracker
- abseil/strings/cordz_update_scope (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/strings/cord_internal
- abseil/strings/cordz_info
- abseil/strings/cordz_update_tracker
- abseil/strings/cordz_update_tracker (1.20220623.0):
- abseil/base/config
- abseil/strings/internal (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/base/endian
- abseil/base/raw_logging_internal
- abseil/meta/type_traits
- abseil/strings/str_format (1.20220623.0):
- abseil/strings/str_format_internal
- abseil/strings/str_format_internal (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/functional/function_ref
- abseil/meta/type_traits
- abseil/numeric/bits
- abseil/numeric/int128
- abseil/numeric/representation
- abseil/strings/strings
- abseil/types/optional
- abseil/types/span
- abseil/utility/utility
- abseil/strings/strings (1.20220623.0):
- abseil/base/base
- abseil/base/config
- abseil/base/core_headers
- abseil/base/endian
- abseil/base/raw_logging_internal
- abseil/base/throw_delegate
- abseil/memory/memory
- abseil/meta/type_traits
- abseil/numeric/bits
- abseil/numeric/int128
- abseil/strings/internal
- abseil/synchronization/graphcycles_internal (1.20220623.0):
- abseil/base/base
- abseil/base/base_internal
- abseil/base/config
- abseil/base/core_headers
- abseil/base/malloc_internal
- abseil/base/raw_logging_internal
- abseil/synchronization/kernel_timeout_internal (1.20220623.0):
- abseil/base/core_headers
- abseil/base/raw_logging_internal
- abseil/time/time
- abseil/synchronization/synchronization (1.20220623.0):
- abseil/base/atomic_hook
- abseil/base/base
- abseil/base/base_internal
- abseil/base/config
- abseil/base/core_headers
- abseil/base/dynamic_annotations
- abseil/base/malloc_internal
- abseil/base/raw_logging_internal
- abseil/debugging/stacktrace
- abseil/debugging/symbolize
- abseil/synchronization/graphcycles_internal
- abseil/synchronization/kernel_timeout_internal
- abseil/time/time
- abseil/time (1.20220623.0):
- abseil/time/internal (= 1.20220623.0)
- abseil/time/time (= 1.20220623.0)
- abseil/time/internal (1.20220623.0):
- abseil/time/internal/cctz (= 1.20220623.0)
- abseil/time/internal/cctz (1.20220623.0):
- abseil/time/internal/cctz/civil_time (= 1.20220623.0)
- abseil/time/internal/cctz/time_zone (= 1.20220623.0)
- abseil/time/internal/cctz/civil_time (1.20220623.0):
- abseil/base/config
- abseil/time/internal/cctz/time_zone (1.20220623.0):
- abseil/base/config
- abseil/time/internal/cctz/civil_time
- abseil/time/time (1.20220623.0):
- abseil/base/base
- abseil/base/core_headers
- abseil/base/raw_logging_internal
- abseil/numeric/int128
- abseil/strings/strings
- abseil/time/internal/cctz/civil_time
- abseil/time/internal/cctz/time_zone
- abseil/types (1.20220623.0):
- abseil/types/any (= 1.20220623.0)
- abseil/types/bad_any_cast (= 1.20220623.0)
- abseil/types/bad_any_cast_impl (= 1.20220623.0)
- abseil/types/bad_optional_access (= 1.20220623.0)
- abseil/types/bad_variant_access (= 1.20220623.0)
- abseil/types/compare (= 1.20220623.0)
- abseil/types/optional (= 1.20220623.0)
- abseil/types/span (= 1.20220623.0)
- abseil/types/variant (= 1.20220623.0)
- abseil/types/any (1.20220623.0):
- abseil/base/config
- abseil/base/core_headers
- abseil/base/fast_type_id
- abseil/meta/type_traits
- abseil/types/bad_any_cast
- abseil/utility/utility
- abseil/types/bad_any_cast (1.20220623.0):
- abseil/base/config
- abseil/types/bad_any_cast_impl
- abseil/types/bad_any_cast_impl (1.20220623.0):
- abseil/base/config
- abseil/base/raw_logging_internal
- abseil/types/bad_optional_access (1.20220623.0):
- abseil/base/config
- abseil/base/raw_logging_internal
- abseil/types/bad_variant_access (1.20220623.0):
- abseil/base/config
- abseil/base/raw_logging_internal
- abseil/types/compare (1.20220623.0):
- abseil/base/core_headers
- abseil/meta/type_traits
- abseil/types/optional (1.20220623.0):
- abseil/base/base_internal
- abseil/base/config
- abseil/base/core_headers
- abseil/memory/memory
- abseil/meta/type_traits
- abseil/types/bad_optional_access
- abseil/utility/utility
- abseil/types/span (1.20220623.0):
- abseil/algorithm/algorithm
- abseil/base/core_headers
- abseil/base/throw_delegate
- abseil/meta/type_traits
- abseil/types/variant (1.20220623.0):
- abseil/base/base_internal
- abseil/base/config
- abseil/base/core_headers
- abseil/meta/type_traits
- abseil/types/bad_variant_access
- abseil/utility/utility
- abseil/utility/utility (1.20220623.0):
- abseil/base/base_internal
- abseil/base/config
- abseil/meta/type_traits
- AppAuth (1.6.2):
- AppAuth/Core (= 1.6.2)
- AppAuth/ExternalUserAgent (= 1.6.2)
- AppAuth/Core (1.6.2)
- AppAuth/ExternalUserAgent (1.6.2):
- AppAuth/Core
- audioplayers_darwin (0.0.1):
- Flutter
- BoringSSL-GRPC (0.0.24):
- BoringSSL-GRPC/Implementation (= 0.0.24)
- BoringSSL-GRPC/Interface (= 0.0.24)
- BoringSSL-GRPC/Implementation (0.0.24):
- BoringSSL-GRPC/Interface (= 0.0.24)
- BoringSSL-GRPC/Interface (0.0.24)
- cloud_firestore (4.8.4):
- Firebase/Firestore (= 10.12.0)
- firebase_core
- Flutter
- nanopb (< 2.30910.0, >= 2.30908.0)
- Firebase/Auth (10.12.0):
- Firebase/CoreOnly
- FirebaseAuth (~> 10.12.0)
- Firebase/CoreOnly (10.12.0):
- FirebaseCore (= 10.12.0)
- Firebase/Firestore (10.12.0):
- Firebase/CoreOnly
- FirebaseFirestore (~> 10.12.0)
- Firebase/Messaging (10.12.0):
- Firebase/CoreOnly
- FirebaseMessaging (~> 10.12.0)
- Firebase/Storage (10.12.0):
- Firebase/CoreOnly
- FirebaseStorage (~> 10.12.0)
- firebase_auth (4.7.2):
- Firebase/Auth (= 10.12.0)
- firebase_core
- Flutter
- firebase_core (2.15.0):
- Firebase/CoreOnly (= 10.12.0)
- Flutter
- firebase_messaging (14.6.5):
- Firebase/Messaging (= 10.12.0)
- firebase_core
- Flutter
- firebase_storage (11.2.5):
- Firebase/Storage (= 10.12.0)
- firebase_core
- Flutter
- FirebaseAppCheckInterop (10.14.0)
- FirebaseAuth (10.12.0):
- FirebaseAppCheckInterop (~> 10.0)
- FirebaseCore (~> 10.0)
- GoogleUtilities/AppDelegateSwizzler (~> 7.8)
- GoogleUtilities/Environment (~> 7.8)
- GTMSessionFetcher/Core (< 4.0, >= 2.1)
- FirebaseAuthInterop (10.14.0)
- FirebaseCore (10.12.0):
- FirebaseCoreInternal (~> 10.0)
- GoogleUtilities/Environment (~> 7.8)
- GoogleUtilities/Logger (~> 7.8)
- FirebaseCoreExtension (10.14.0):
- FirebaseCore (~> 10.0)
- FirebaseCoreInternal (10.14.0):
- "GoogleUtilities/NSData+zlib (~> 7.8)"
- FirebaseFirestore (10.12.0):
- abseil/algorithm (~> 1.20220623.0)
- abseil/base (~> 1.20220623.0)
- abseil/container/flat_hash_map (~> 1.20220623.0)
- abseil/memory (~> 1.20220623.0)
- abseil/meta (~> 1.20220623.0)
- abseil/strings/strings (~> 1.20220623.0)
- abseil/time (~> 1.20220623.0)
- abseil/types (~> 1.20220623.0)
- FirebaseCore (~> 10.0)
- "gRPC-C++ (~> 1.50.1)"
- leveldb-library (~> 1.22)
- nanopb (< 2.30910.0, >= 2.30908.0)
- FirebaseInstallations (10.14.0):
- FirebaseCore (~> 10.0)
- GoogleUtilities/Environment (~> 7.8)
- GoogleUtilities/UserDefaults (~> 7.8)
- PromisesObjC (~> 2.1)
- FirebaseMessaging (10.12.0):
- FirebaseCore (~> 10.0)
- FirebaseInstallations (~> 10.0)
- GoogleDataTransport (~> 9.2)
- GoogleUtilities/AppDelegateSwizzler (~> 7.8)
- GoogleUtilities/Environment (~> 7.8)
- GoogleUtilities/Reachability (~> 7.8)
- GoogleUtilities/UserDefaults (~> 7.8)
- nanopb (< 2.30910.0, >= 2.30908.0)
- FirebaseStorage (10.12.0):
- FirebaseAppCheckInterop (~> 10.0)
- FirebaseAuthInterop (~> 10.0)
- FirebaseCore (~> 10.0)
- FirebaseCoreExtension (~> 10.0)
- GTMSessionFetcher/Core (< 4.0, >= 2.1)
- Flutter (1.0.0)
- flutter_keyboard_visibility (0.0.1):
- Flutter
- FMDB (2.7.5):
- FMDB/standard (= 2.7.5)
- FMDB/standard (2.7.5)
- geolocator_apple (1.2.0):
- Flutter
- google_sign_in_ios (0.0.1):
- Flutter
- GoogleSignIn (~> 6.2)
- GoogleDataTransport (9.2.5):
- GoogleUtilities/Environment (~> 7.7)
- nanopb (< 2.30910.0, >= 2.30908.0)
- PromisesObjC (< 3.0, >= 1.2)
- GoogleSignIn (6.2.4):
- AppAuth (~> 1.5)
- GTMAppAuth (~> 1.3)
- GTMSessionFetcher/Core (< 3.0, >= 1.1)
- GoogleUtilities/AppDelegateSwizzler (7.11.5):
- GoogleUtilities/Environment
- GoogleUtilities/Logger
- GoogleUtilities/Network
- GoogleUtilities/Environment (7.11.5):
- PromisesObjC (< 3.0, >= 1.2)
- GoogleUtilities/Logger (7.11.5):
- GoogleUtilities/Environment
- GoogleUtilities/Network (7.11.5):
- GoogleUtilities/Logger
- "GoogleUtilities/NSData+zlib"
- GoogleUtilities/Reachability
- "GoogleUtilities/NSData+zlib (7.11.5)"
- GoogleUtilities/Reachability (7.11.5):
- GoogleUtilities/Logger
- GoogleUtilities/UserDefaults (7.11.5):
- GoogleUtilities/Logger
- "gRPC-C++ (1.50.1)":
- "gRPC-C++/Implementation (= 1.50.1)"
- "gRPC-C++/Interface (= 1.50.1)"
- "gRPC-C++/Implementation (1.50.1)":
- abseil/base/base (= 1.20220623.0)
- abseil/base/core_headers (= 1.20220623.0)
- abseil/cleanup/cleanup (= 1.20220623.0)
- abseil/container/flat_hash_map (= 1.20220623.0)
- abseil/container/flat_hash_set (= 1.20220623.0)
- abseil/container/inlined_vector (= 1.20220623.0)
- abseil/functional/any_invocable (= 1.20220623.0)
- abseil/functional/bind_front (= 1.20220623.0)
- abseil/functional/function_ref (= 1.20220623.0)
- abseil/hash/hash (= 1.20220623.0)
- abseil/memory/memory (= 1.20220623.0)
- abseil/meta/type_traits (= 1.20220623.0)
- abseil/random/random (= 1.20220623.0)
- abseil/status/status (= 1.20220623.0)
- abseil/status/statusor (= 1.20220623.0)
- abseil/strings/cord (= 1.20220623.0)
- abseil/strings/str_format (= 1.20220623.0)
- abseil/strings/strings (= 1.20220623.0)
- abseil/synchronization/synchronization (= 1.20220623.0)
- abseil/time/time (= 1.20220623.0)
- abseil/types/optional (= 1.20220623.0)
- abseil/types/span (= 1.20220623.0)
- abseil/types/variant (= 1.20220623.0)
- abseil/utility/utility (= 1.20220623.0)
- "gRPC-C++/Interface (= 1.50.1)"
- gRPC-Core (= 1.50.1)
- "gRPC-C++/Interface (1.50.1)"
- gRPC-Core (1.50.1):
- gRPC-Core/Implementation (= 1.50.1)
- gRPC-Core/Interface (= 1.50.1)
- gRPC-Core/Implementation (1.50.1):
- abseil/base/base (= 1.20220623.0)
- abseil/base/core_headers (= 1.20220623.0)
- abseil/container/flat_hash_map (= 1.20220623.0)
- abseil/container/flat_hash_set (= 1.20220623.0)
- abseil/container/inlined_vector (= 1.20220623.0)
- abseil/functional/any_invocable (= 1.20220623.0)
- abseil/functional/bind_front (= 1.20220623.0)
- abseil/functional/function_ref (= 1.20220623.0)
- abseil/hash/hash (= 1.20220623.0)
- abseil/memory/memory (= 1.20220623.0)
- abseil/meta/type_traits (= 1.20220623.0)
- abseil/random/random (= 1.20220623.0)
- abseil/status/status (= 1.20220623.0)
- abseil/status/statusor (= 1.20220623.0)
- abseil/strings/cord (= 1.20220623.0)
- abseil/strings/str_format (= 1.20220623.0)
- abseil/strings/strings (= 1.20220623.0)
- abseil/synchronization/synchronization (= 1.20220623.0)
- abseil/time/time (= 1.20220623.0)
- abseil/types/optional (= 1.20220623.0)
- abseil/types/span (= 1.20220623.0)
- abseil/types/variant (= 1.20220623.0)
- abseil/utility/utility (= 1.20220623.0)
- BoringSSL-GRPC (= 0.0.24)
- gRPC-Core/Interface (= 1.50.1)
- gRPC-Core/Interface (1.50.1)
- GTMAppAuth (1.3.1):
- AppAuth/Core (~> 1.6)
- GTMSessionFetcher/Core (< 3.0, >= 1.5)
- GTMSessionFetcher/Core (2.3.0)
- image_picker_ios (0.0.1):
- Flutter
- leveldb-library (1.22.2)
- nanopb (2.30909.0):
- nanopb/decode (= 2.30909.0)
- nanopb/encode (= 2.30909.0)
- nanopb/decode (2.30909.0)
- nanopb/encode (2.30909.0)
- path_provider_foundation (0.0.1):
- Flutter
- FlutterMacOS
- PromisesObjC (2.3.1)
- sqflite (0.0.3):
- Flutter
- FMDB (>= 2.7.5)
DEPENDENCIES:
- audioplayers_darwin (from `.symlinks/plugins/audioplayers_darwin/ios`)
- cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`)
- firebase_auth (from `.symlinks/plugins/firebase_auth/ios`)
- firebase_core (from `.symlinks/plugins/firebase_core/ios`)
- firebase_messaging (from `.symlinks/plugins/firebase_messaging/ios`)
- firebase_storage (from `.symlinks/plugins/firebase_storage/ios`)
- Flutter (from `Flutter`)
- flutter_keyboard_visibility (from `.symlinks/plugins/flutter_keyboard_visibility/ios`)
- geolocator_apple (from `.symlinks/plugins/geolocator_apple/ios`)
- google_sign_in_ios (from `.symlinks/plugins/google_sign_in_ios/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`)
- sqflite (from `.symlinks/plugins/sqflite/ios`)
SPEC REPOS:
trunk:
- abseil
- AppAuth
- BoringSSL-GRPC
- Firebase
- FirebaseAppCheckInterop
- FirebaseAuth
- FirebaseAuthInterop
- FirebaseCore
- FirebaseCoreExtension
- FirebaseCoreInternal
- FirebaseFirestore
- FirebaseInstallations
- FirebaseMessaging
- FirebaseStorage
- FMDB
- GoogleDataTransport
- GoogleSignIn
- GoogleUtilities
- "gRPC-C++"
- gRPC-Core
- GTMAppAuth
- GTMSessionFetcher
- leveldb-library
- nanopb
- PromisesObjC
EXTERNAL SOURCES:
audioplayers_darwin:
:path: ".symlinks/plugins/audioplayers_darwin/ios"
cloud_firestore:
:path: ".symlinks/plugins/cloud_firestore/ios"
firebase_auth:
:path: ".symlinks/plugins/firebase_auth/ios"
firebase_core:
:path: ".symlinks/plugins/firebase_core/ios"
firebase_messaging:
:path: ".symlinks/plugins/firebase_messaging/ios"
firebase_storage:
:path: ".symlinks/plugins/firebase_storage/ios"
Flutter:
:path: Flutter
flutter_keyboard_visibility:
:path: ".symlinks/plugins/flutter_keyboard_visibility/ios"
geolocator_apple:
:path: ".symlinks/plugins/geolocator_apple/ios"
google_sign_in_ios:
:path: ".symlinks/plugins/google_sign_in_ios/ios"
image_picker_ios:
:path: ".symlinks/plugins/image_picker_ios/ios"
path_provider_foundation:
:path: ".symlinks/plugins/path_provider_foundation/darwin"
sqflite:
:path: ".symlinks/plugins/sqflite/ios"
SPEC CHECKSUMS:
abseil: 926fb7a82dc6d2b8e1f2ed7f3a718bce691d1e46
AppAuth: 3bb1d1cd9340bd09f5ed189fb00b1cc28e1e8570
audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40
BoringSSL-GRPC: 3175b25143e648463a56daeaaa499c6cb86dad33
cloud_firestore: 005e157ad342dbfb2e461cb111a9020aa71bfb22
Firebase: 07150e75d142fb9399f6777fa56a187b17f833a0
firebase_auth: 3f7820b22557dd4a1b024f4d86947d1a0ff8a10f
firebase_core: e477125798fc37cd4ab43ca6a8536bf7e0929c00
firebase_messaging: 334d68c3a36b6d4d5cd91e4f42509e0d4ae49828
firebase_storage: d5c1b95383db1230d9fed88c76cb257d8d1ec1d6
FirebaseAppCheckInterop: c87f1d5421c852413dd936b2b2340b21e62501a0
FirebaseAuth: a66c1e14ec58f41d154a4b41ce1a23ea00ad4805
FirebaseAuthInterop: 23be77be1ca68e4bd15214f403f807a6ca70d7e0
FirebaseCore: f86a1394906b97ac445ae49c92552a9425831bed
FirebaseCoreExtension: 976638051b1a46b503afce7ec80277f9161f2040
FirebaseCoreInternal: d558159ee6cc4b823c2296ecc193de9f6d9a5bb3
FirebaseFirestore: f94c9541515fa4a49af52269bbc50349009424b4
FirebaseInstallations: f672b1eda64e6381c21d424a2f680a943fd83f3b
FirebaseMessaging: bb2c4f6422a753038fe137d90ae7c1af57251316
FirebaseStorage: 1d7ca8c8953fc61ccacaa7c612696b5402968a0d
Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854
flutter_keyboard_visibility: 0339d06371254c3eb25eeb90ba8d17dca8f9c069
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
geolocator_apple: cc556e6844d508c95df1e87e3ea6fa4e58c50401
google_sign_in_ios: 1256ff9d941db546373826966720b0c24804bcdd
GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2
GoogleSignIn: 5651ce3a61e56ca864160e79b484cd9ed3f49b7a
GoogleUtilities: 13e2c67ede716b8741c7989e26893d151b2b2084
"gRPC-C++": 0968bace703459fd3e5dcb0b2bed4c573dbff046
gRPC-Core: 17108291d84332196d3c8466b48f016fc17d816d
GTMAppAuth: 0ff230db599948a9ad7470ca667337803b3fc4dd
GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2
image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5
leveldb-library: f03246171cce0484482ec291f88b6d563699ee06
nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431
path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943
PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4
sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a
PODFILE CHECKSUM: 6b9eb94e9f98a329f2ef624b852a6e42d090af2b
COCOAPODS: 1.14.3

@ -3,32 +3,18 @@
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
7F7390F210456EB7AFF1CF93 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C7930A860EC8743E6A941D8D /* Pods_RunnerTests.framework */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
C95EC3D52B114F7D00A316A2 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = C95EC3D42B114F7D00A316A2 /* GoogleService-Info.plist */; };
DE887488687930BD9A821E09 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 895D1BE06AED43E6E7367693 /* Pods_Runner.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 97C146E61CF9000F007C117D /* Project object */;
proxyType = 1;
remoteGlobalIDString = 97C146ED1CF9000F007C117D;
remoteInfo = Runner;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
@ -45,18 +31,10 @@
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
160A1A0B7CBEFB8A0DF876C4 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = "<group>"; };
1E7A433994B49CDF1BE8DE4C /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = "<group>"; };
2E9E3F1B12DC0CA59072CF15 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = "<group>"; };
331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = "<group>"; };
331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
5216BB03E33101AC0F022F4F /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
895D1BE06AED43E6E7367693 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; };
9652689A75201F19A551B879 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@ -64,39 +42,19 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
C7930A860EC8743E6A941D8D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C95EC3D42B114F7D00A316A2 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = "<group>"; };
F782B307897A4B77B59D0897 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
472D7C2F33BD994B5AD25717 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
7F7390F210456EB7AFF1CF93 /* Pods_RunnerTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
DE887488687930BD9A821E09 /* Pods_Runner.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
331C8082294A63A400263BE5 /* RunnerTests */ = {
isa = PBXGroup;
children = (
331C807B294A618700263BE5 /* RunnerTests.swift */,
);
path = RunnerTests;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
@ -114,9 +72,6 @@
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */,
E285F60DA3ED5F857F86301D /* Pods */,
C51FB947EEACC99574A07057 /* Frameworks */,
);
sourceTree = "<group>";
};
@ -124,7 +79,6 @@
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
331C8081294A63A400263BE5 /* RunnerTests.xctest */,
);
name = Products;
sourceTree = "<group>";
@ -132,7 +86,6 @@
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
C95EC3D42B114F7D00A316A2 /* GoogleService-Info.plist */,
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
@ -145,62 +98,19 @@
path = Runner;
sourceTree = "<group>";
};
C51FB947EEACC99574A07057 /* Frameworks */ = {
isa = PBXGroup;
children = (
895D1BE06AED43E6E7367693 /* Pods_Runner.framework */,
C7930A860EC8743E6A941D8D /* Pods_RunnerTests.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
E285F60DA3ED5F857F86301D /* Pods */ = {
isa = PBXGroup;
children = (
5216BB03E33101AC0F022F4F /* Pods-Runner.debug.xcconfig */,
F782B307897A4B77B59D0897 /* Pods-Runner.release.xcconfig */,
160A1A0B7CBEFB8A0DF876C4 /* Pods-Runner.profile.xcconfig */,
9652689A75201F19A551B879 /* Pods-RunnerTests.debug.xcconfig */,
2E9E3F1B12DC0CA59072CF15 /* Pods-RunnerTests.release.xcconfig */,
1E7A433994B49CDF1BE8DE4C /* Pods-RunnerTests.profile.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
331C8080294A63A400263BE5 /* RunnerTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */;
buildPhases = (
18C5F3AB1125881E89D29F2B /* [CP] Check Pods Manifest.lock */,
331C807D294A63A400263BE5 /* Sources */,
331C807F294A63A400263BE5 /* Resources */,
472D7C2F33BD994B5AD25717 /* Frameworks */,
);
buildRules = (
);
dependencies = (
331C8086294A63A400263BE5 /* PBXTargetDependency */,
);
name = RunnerTests;
productName = RunnerTests;
productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
44FFFF9947EC806B7CE88500 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
7EEED9B34346FEEF7394F416 /* [CP] Embed Pods Frameworks */,
);
buildRules = (
);
@ -217,14 +127,9 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 1430;
LastUpgradeCheck = 1300;
ORGANIZATIONNAME = "";
TargetAttributes = {
331C8080294A63A400263BE5 = {
CreatedOnToolsVersion = 14.0;
TestTargetID = 97C146ED1CF9000F007C117D;
};
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100;
@ -245,19 +150,11 @@
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
331C8080294A63A400263BE5 /* RunnerTests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
331C807F294A63A400263BE5 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
@ -266,43 +163,18 @@
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
C95EC3D52B114F7D00A316A2 /* GoogleService-Info.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
18C5F3AB1125881E89D29F2B /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
);
name = "Thin Binary";
outputPaths = (
@ -311,48 +183,8 @@
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
44FFFF9947EC806B7CE88500 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
7EEED9B34346FEEF7394F416 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
@ -368,14 +200,6 @@
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
331C807D294A63A400263BE5 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
@ -387,14 +211,6 @@
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 97C146ED1CF9000F007C117D /* Runner */;
targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
@ -438,7 +254,6 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -449,7 +264,6 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@ -458,7 +272,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@ -473,77 +287,21 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 35KQ5BDC64;
ENABLE_BITCODE = NO;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.justdev.justmusic;
PRODUCT_BUNDLE_IDENTIFIER = com.example.justmusic;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
331C8088294A63A400263BE5 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9652689A75201F19A551B879 /* Pods-RunnerTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.justdev.justmusic.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Debug;
};
331C8089294A63A400263BE5 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 2E9E3F1B12DC0CA59072CF15 /* Pods-RunnerTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.justdev.justmusic.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Release;
};
331C808A294A63A400263BE5 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 1E7A433994B49CDF1BE8DE4C /* Pods-RunnerTests.profile.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.justdev.justmusic.RunnerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
@ -567,7 +325,6 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -578,7 +335,6 @@
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@ -593,7 +349,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
@ -624,7 +380,6 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -635,7 +390,6 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@ -644,7 +398,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
@ -661,21 +415,15 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 35KQ5BDC64;
ENABLE_BITCODE = NO;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.justdev.justmusic;
PRODUCT_BUNDLE_IDENTIFIER = com.example.justmusic;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
@ -689,21 +437,15 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 35KQ5BDC64;
ENABLE_BITCODE = NO;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = com.justdev.justmusic;
PRODUCT_BUNDLE_IDENTIFIER = com.example.justmusic;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
@ -713,16 +455,6 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
331C8088294A63A400263BE5 /* Debug */,
331C8089294A63A400263BE5 /* Release */,
331C808A294A63A400263BE5 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1430"
LastUpgradeVersion = "1300"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@ -37,17 +37,6 @@
</BuildableReference>
</MacroExpansion>
<Testables>
<TestableReference
skipped = "NO"
parallelizable = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "331C8080294A63A400263BE5"
BuildableName = "RunnerTests.xctest"
BlueprintName = "RunnerTests"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
</TestAction>
<LaunchAction

@ -4,7 +4,4 @@
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 421 B

After

Width:  |  Height:  |  Size: 564 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 729 B

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

@ -6,8 +6,6 @@
<string>994903990520-n6jd98ena56kb1tvtrd67tvb5et3nfbf.apps.googleusercontent.com</string>
<key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.994903990520-n6jd98ena56kb1tvtrd67tvb5et3nfbf</string>
<key>ANDROID_CLIENT_ID</key>
<string>994903990520-073l30b0afj0uq7apsvc8p8ukantpu6q.apps.googleusercontent.com</string>
<key>API_KEY</key>
<string>AIzaSyBbYqsR6t7JTi8_XFNEHd43IRuKlYGeI3U</string>
<key>GCM_SENDER_ID</key>

@ -2,8 +2,6 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
@ -22,31 +20,10 @@
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleTypeRole</key>
<string>Editor</string>
<key>CFBundleURLSchemes</key>
<array>
<string>com.googleusercontent.apps.994903990520-n6jd98ena56kb1tvtrd67tvb5et3nfbf</string>
</array>
</dict>
</array>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSCameraUsageDescription</key>
<string>To capture profile photo please grant camera access</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>Votre message d'autorisation pour une utilisation continue de la localisation</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>Votre message d'autorisation lorsque l'application est en cours d'utilisation</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>App needs access to photo lib for profile images</string>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
@ -64,5 +41,11 @@
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict>
</plist>

@ -1,12 +0,0 @@
import Flutter
import UIKit
import XCTest
class RunnerTests: XCTestCase {
func testExample() {
// If you add code to the Runner application, consider adding tests here.
// See https://developer.apple.com/documentation/xctest for more information about using XCTest.
}
}

@ -0,0 +1,7 @@
{
"file_generated_by": "FlutterFire CLI",
"purpose": "FirebaseAppID & ProjectID for this Firebase app in this directory",
"GOOGLE_APP_ID": "1:994903990520:ios:93188f32e320babe0a9b0d",
"FIREBASE_PROJECT_ID": "justmusic-435d5",
"GCM_SENDER_ID": "994903990520"
}

@ -0,0 +1,33 @@
import 'dart:io';
class AdHelper {
static String get bannerAdUnitId {
if (Platform.isAndroid) {
return 'ca-app-pub-3940256099942544/6300978111';
} else if (Platform.isIOS) {
return 'ca-app-pub-3940256099942544/2934735716';
} else {
throw new UnsupportedError('Unsupported platform');
}
}
static String get interstitialAdUnitId {
if (Platform.isAndroid) {
return "ca-app-pub-3940256099942544/1033173712";
} else if (Platform.isIOS) {
return "ca-app-pub-3940256099942544/4411468910";
} else {
throw new UnsupportedError("Unsupported platform");
}
}
static String get rewardedAdUnitId {
if (Platform.isAndroid) {
return "ca-app-pub-3940256099942544/5224354917";
} else if (Platform.isIOS) {
return "ca-app-pub-3940256099942544/1712485313";
} else {
throw new UnsupportedError("Unsupported platform");
}
}
}

@ -0,0 +1,61 @@
import 'package:flutter/Material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:gradient_borders/box_borders/gradient_box_border.dart';
import 'package:ionicons/ionicons.dart';
import 'package:justmusic/values/constants.dart';
import 'package:zoom_tap_animation/zoom_tap_animation.dart';
class AdComponent extends StatefulWidget {
final Container ad;
const AdComponent({super.key, required this.ad});
@override
State<AdComponent> createState() => _AdComponentState();
}
class _AdComponentState extends State<AdComponent> {
@override
Widget build(BuildContext context) {
return SizedBox(
width: double.infinity,
child: Column(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Container(
padding: const EdgeInsets.fromLTRB(8, 4, 8, 4),
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(1000),
color: grayColor,
),
child: Row(
children: [
Icon(
Ionicons.information_circle,
color: grayText.withOpacity(0.4),
size: 15,
),
SizedBox(
width: 4,
),
Text(
"Sponsorisé",
style: GoogleFonts.plusJakartaSans(
color: grayText.withOpacity(0.4), fontWeight: FontWeight.w500, fontSize: 12),
),
],
)),
],
),
SizedBox(height: 10),
widget.ad,
],
));
}
}

@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import '../values/constants.dart';

@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:ionicons/ionicons.dart';
import 'package:tuple/tuple.dart';

@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import '../main.dart';
import '../model/Music.dart';
@ -27,6 +27,7 @@ class _ButtonPlayComponentState extends State<ButtonPlayComponent> {
@override
Widget build(BuildContext context) {
return GestureDetector(
child: GestureDetector(
onTap: () {
if (isPlaying) {
widget.music.stopSong();
@ -45,6 +46,6 @@ class _ButtonPlayComponentState extends State<ButtonPlayComponent> {
color: Colors.white,
size: 45,
),
);
));
}
}

@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/values/constants.dart';
import 'package:tuple/tuple.dart';

@ -1,3 +1,4 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
@ -10,21 +11,11 @@ class CommentComponent extends StatelessWidget {
final Comment comment;
const CommentComponent({Key? key, required this.comment}) : super(key: key);
String calculateTimeDifference(DateTime startDate) {
Duration difference = DateTime.now().difference(startDate);
if (difference.inDays > 0) {
return '${difference.inDays} jours';
} else if (difference.inHours > 0) {
return '${difference.inHours} heures';
} else if (difference.inMinutes > 0) {
return '${difference.inMinutes} minutes';
} else {
return '${difference.inSeconds} secondes';
}
}
@override
Widget build(BuildContext context) {
final now = DateTime.now();
final difference = now.difference(comment.date);
return Container(
width: double.infinity,
@ -40,11 +31,13 @@ class CommentComponent extends StatelessWidget {
height: 40,
width: 40,
// Image radius
child: FadeInImage.assetNetwork(
image: comment.user.pp,
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
child: CachedNetworkImage(
imageUrl: comment.user.pp,
fadeInDuration: const Duration(milliseconds: 200),
placeholder: (context, url) => Image(
image: AssetImage("assets/images/loadingPlaceholder.gif"),
),
errorWidget: (context, url, error) => Icon(Icons.error),
),
),
),
@ -66,7 +59,7 @@ class CommentComponent extends StatelessWidget {
Padding(
padding: EdgeInsets.only(top: 6, left: 10),
child: Text(
"il y a ${calculateTimeDifference(comment.date)}",
"il y a ${difference.inHours > 0 ? difference.inHours : difference.inMinutes}${difference.inHours > 0 ? "h" : "m"}",
style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.6), fontWeight: FontWeight.w400, fontSize: 10),
),

@ -1,9 +1,8 @@
import 'dart:io';
import 'package:animated_appear/animated_appear.dart';
import 'package:auto_size_text/auto_size_text.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/Material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -62,19 +61,17 @@ class _EditablePostComponentState extends State<EditablePostComponent> with Tick
}
Future pickImage(ImageSource source) async {
try {
final image = await ImagePicker().pickImage(source: source, imageQuality: 20);
if (image == null) return;
final imageTemp = File(image.path);
setState(() {
this.image = imageTemp;
widget.callBackImage(imageTemp);
});
} on PlatformException catch (e) {
print('Failed to pick image: $e');
}
try {
final image = await ImagePicker().pickImage(source: source, imageQuality: 20);
if (image == null) return;
final imageTemp = File(image.path);
setState(() {
this.image = imageTemp;
widget.callBackImage(imageTemp);
});
} on PlatformException catch (e) {
print('Failed to pick image: $e');
}
}
void _updateDescription(String text) {
@ -154,11 +151,10 @@ class _EditablePostComponentState extends State<EditablePostComponent> with Tick
),
),
)
: FadeInImage.assetNetwork(
image: widget.music!.cover!,
fit: BoxFit.cover,
: CachedNetworkImage(
imageUrl: widget.music!.cover!,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
errorWidget: (context, url, error) => Icon(Icons.error),
),
),
),
@ -185,10 +181,7 @@ class _EditablePostComponentState extends State<EditablePostComponent> with Tick
borderRadius: BorderRadius.circular(20),
child: InstaImageViewer(
backgroundIsTransparent: true,
child: kIsWeb?InstaImageViewer(
backgroundIsTransparent: true,
child: Image.network(image!.path)
):Image(
child: Image(
image: FileImage(image!),
fit: BoxFit.cover,
),
@ -256,8 +249,8 @@ class _EditablePostComponentState extends State<EditablePostComponent> with Tick
width: double.infinity,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ kIsWeb?Container()
:Expanded(
children: [
Expanded(
flex: 5,
child: GestureDetector(
onTap: () {
@ -268,7 +261,7 @@ class _EditablePostComponentState extends State<EditablePostComponent> with Tick
),
),
),
kIsWeb?Container():SizedBox(
SizedBox(
width: 15,
),
Expanded(
@ -291,7 +284,6 @@ class _EditablePostComponentState extends State<EditablePostComponent> with Tick
child: SizedBox(
width: double.infinity,
child: TextFormField(
keyboardType: TextInputType.text,
onChanged: (value) {
_updateDescription(value);
},

@ -1,105 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/main.dart';
import 'package:justmusic/values/constants.dart';
import 'package:tuple/tuple.dart';
import '../model/Music.dart';
class HistoricComponent extends StatefulWidget {
final int month;
final int year;
const HistoricComponent({super.key, required this.month, required this.year});
@override
State<HistoricComponent> createState() => _HistoricComponentState();
}
class _HistoricComponentState extends State<HistoricComponent> {
int getNumberOfDaysInMonth(int year, int month) {
if (month < 1 || month > 12) {
throw ArgumentError("Le numéro de mois doit être compris entre 1 et 12.");
}
return DateTime(year, month + 1, 0).day;
}
getHistoric() {}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: MyApp.musicViewModel
.getHistoryCapsulesMonthWhitIdUser(MyApp.userViewModel.userCurrent.id, widget.month, widget.year),
builder: (context, snapshot) {
if (snapshot.hasData) {
return Container(
constraints: const BoxConstraints( maxWidth: 600),
child: Wrap(
spacing: 14,
runSpacing: 14,
children: List.generate(getNumberOfDaysInMonth(widget.year, widget.month), (index) {
Tuple2<int, Music>? checkCapsule;
if (snapshot.data != null) {
for (var element in snapshot.data!) {
if (element.item1 == index + 1) {
checkCapsule = element;
}
}
}
if ((widget.year > DateTime.now().year || widget.month > DateTime.now().month) ||
(widget.year == DateTime.now().year &&
widget.month == DateTime.now().month &&
index > DateTime.now().day)) {
return Container(
decoration: BoxDecoration(
gradient: LinearGradient(colors: [
Color(0xFF1E1E1E).withOpacity(0.7),
Color(0xFF1E1E1E).withOpacity(0),
], begin: Alignment.topCenter, end: Alignment.bottomCenter),
borderRadius: BorderRadius.circular(5)),
height: 60,
width: 60,
);
}
if (checkCapsule != null) {
return Tooltip(
message: "${checkCapsule.item2.artists.first.name} - ${checkCapsule.item2.title}".length < 30? "${checkCapsule.item2.artists.first.name} - ${checkCapsule.item2.title}": "${checkCapsule.item2.artists.first.name} - ${checkCapsule.item2.title}".substring(0,30)+"...",
decoration: const BoxDecoration(
border: Border.fromBorderSide(BorderSide(color: Color(0xFF3A3A3A), width: 1)),
color: tooltipBackground, borderRadius: BorderRadius.all(Radius.circular(20))
),
child: Container(
decoration: BoxDecoration(
image: DecorationImage(image: NetworkImage((checkCapsule.item2.cover)!)),
borderRadius: BorderRadius.circular(5)),
height: 60,
width: 60,
));
} else {
return Container(
color: bgColor,
height: 60,
width: 60,
child: Center(
child: Text(
(index + 1).toString(),
style:
GoogleFonts.plusJakartaSans(color: Colors.white, fontSize: 22, fontWeight: FontWeight.w800),
),
),
);
}
// Generate widgets
}),
),
);
} else {
return CupertinoActivityIndicator();
}
});
}
}

@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import 'package:google_fonts/google_fonts.dart';
import '../values/constants.dart';

@ -4,9 +4,8 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
class LoginButton extends StatefulWidget {
final Function callback;
final String text;
const LoginButton({Key? key, required this.callback, required this.text}) : super(key: key);
const LoginButton({Key? key, required this.callback}) : super(key: key);
@override
State<LoginButton> createState() => _LoginButtonState();
@ -58,7 +57,7 @@ class _LoginButtonState extends State<LoginButton> {
),
alignment: Alignment.center,
child: Text(
widget.text,
"Se connecter",
textAlign: TextAlign.center,
style: TextStyle(color: Colors.white, fontSize: 18),
),

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/Material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/components/play_button_component.dart';
import 'package:text_scroll/text_scroll.dart';
@ -32,11 +33,13 @@ class MusicListComponent extends StatelessWidget {
height: 60,
width: 60,
// Image radius
child: FadeInImage.assetNetwork(
image: music.cover!,
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
child: CachedNetworkImage(
imageUrl: music.cover!,
fadeInDuration: const Duration(milliseconds: 200),
placeholder: (context, url) => Image(
image: AssetImage("assets/images/loadingPlaceholder.gif"),
),
errorWidget: (context, url, error) => Icon(Icons.error),
),
)
: Container(

@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import 'package:flutter_animated_play_button/flutter_animated_play_button.dart';
import 'package:ionicons/ionicons.dart';

@ -1,6 +1,6 @@
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import 'package:google_fonts/google_fonts.dart';
class PostButtonComponent extends StatefulWidget {

@ -1,4 +1,5 @@
import 'package:auto_size_text/auto_size_text.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
@ -29,29 +30,6 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
choice = !choice;
});
}
String formatPostDate(DateTime postDate) {
DateTime now = DateTime.now();
DateTime yesterday = DateTime(now.year, now.month, now.day - 1);
if (postDate.year == now.year && postDate.month == now.month && postDate.day == now.day) {
// Aujourd'hui
return "Aujourd'hui, ${postDate.hour}:${postDate.minute.toString().padLeft(2, '0')}";
} else if (postDate.year == yesterday.year && postDate.month == yesterday.month && postDate.day == yesterday.day) {
// Hier
return 'hier, ${postDate.hour}:${postDate.minute.toString().padLeft(2, '0')}';
} else {
// Autre date
return '${postDate.day} ${_getMonthAbbreviation(postDate.month)} ${postDate.hour}:${postDate.minute.toString().padLeft(2, '0')}';
}
}
String _getMonthAbbreviation(int month) {
const List<String> monthsAbbreviation = [
'janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.',
];
return monthsAbbreviation[month - 1];
}
@override
void initState() {
@ -62,13 +40,6 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
@override
Widget build(BuildContext context) {
var mins = "0";
if (widget.post.date.minute < 10) {
mins = "0${widget.post.date.minute}";
} else {
mins = widget.post.date.minute.toString();
}
return GestureDetector(
onTap: switchChoice,
child: SizedBox(
@ -109,11 +80,18 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
),
),
),
Text(
formatPostDate(widget.post.date),
DateTime(today.year, today.month, today.day).isAtSameMomentAs(
DateTime(widget.post.date.year, widget.post.date.month, widget.post.date.day))
? Text(
"Aujourd'hui, ${widget.post.date.hour}:${widget.post.date.minute}",
style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13),
)
: Text(
"hier, ${widget.post.date.hour}:${widget.post.date.minute}",
style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13),
),
],
),
SizedBox(height: 10),
@ -152,8 +130,13 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
children: [
SizedBox(
width: double.infinity,
child: Image.network(
widget.post.music.cover!,
child: CachedNetworkImage(
imageUrl: widget.post.music.cover!,
fadeInDuration: const Duration(milliseconds: 200),
placeholder: (context, url) => Image(
image: AssetImage("assets/images/loadingPlaceholder.gif"),
),
errorWidget: (context, url, error) => Icon(Icons.error),
),
),
Image(
@ -194,9 +177,14 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
child: ClipRRect(
borderRadius: BorderRadius.circular(13),
// implement image
child: Image.network(
widget.post.selfie!,
child: CachedNetworkImage(
imageUrl: widget.post.selfie!,
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 200),
placeholder: (context, url) => Image(
image: AssetImage("assets/images/loadingPlaceholder.gif"),
),
errorWidget: (context, url, error) => Icon(Icons.error),
),
),
),

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/Material.dart';
import '../config/routes.dart';
import '../model/User.dart';
@ -22,11 +23,13 @@ class ProfilPictureComponent extends StatelessWidget {
height: 40,
width: 40,
// Image radius
child: FadeInImage.assetNetwork(
image: user.pp,
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
child: CachedNetworkImage(
imageUrl: user.pp,
fadeInDuration: const Duration(milliseconds: 300),
placeholder: (context, url) => Image(
image: AssetImage("assets/images/loadingPlaceholder.gif"),
),
errorWidget: (context, url, error) => Icon(Icons.error),
),
),
),

@ -1,4 +1,5 @@
import 'package:auto_size_text/auto_size_text.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@ -22,11 +23,13 @@ class ProfileComponent extends StatelessWidget {
child: SizedBox(
width: 100.w,
height: 100.w,
child: FadeInImage.assetNetwork(
image: user.pp,
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
child: CachedNetworkImage(
imageUrl: user.pp,
fadeInDuration: const Duration(milliseconds: 300),
placeholder: (context, url) => Image(
image: AssetImage("assets/images/loadingPlaceholder.gif"),
),
errorWidget: (context, url, error) => Icon(Icons.error),
),
)),
),

@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/components/profil_picture_component.dart';

@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/Material.dart';
import 'package:google_fonts/google_fonts.dart';
import '../main.dart';
import '../model/User.dart' as justMusic;

@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import 'package:google_fonts/google_fonts.dart';
import '../values/constants.dart';

@ -1,5 +1,6 @@
import 'package:another_flushbar/flushbar.dart';
import 'package:auto_size_text/auto_size_text.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_countdown_timer/flutter_countdown_timer.dart';
@ -135,8 +136,10 @@ class _TopNavBarComponentState extends State<TopNavBarComponent> with TickerProv
@override
Widget build(BuildContext context) {
choice = widget.choice;
return SafeArea(top:true,child: Container(
padding: EdgeInsets.symmetric(horizontal: defaultPadding, vertical: 20),
return Padding(
padding: const EdgeInsets.only(top: defaultPadding),
child: Container(
padding: EdgeInsets.symmetric(horizontal: defaultPadding),
width: double.infinity,
height: 100,
child: Row(
@ -262,13 +265,14 @@ class _TopNavBarComponentState extends State<TopNavBarComponent> with TickerProv
child: ClipOval(
child: SizedBox(
width: 30,
height: 30,
// Image radius
child: FadeInImage.assetNetwork(
image: MyApp.userViewModel.userCurrent.pp,
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
child: CachedNetworkImage(
imageUrl: MyApp.userViewModel.userCurrent.pp,
fadeInDuration: const Duration(milliseconds: 300),
placeholder: (context, url) => Image(
image: AssetImage("assets/images/loadingPlaceholder.gif"),
),
errorWidget: (context, url, error) => Icon(Icons.error),
),
),
),

@ -1,11 +1,8 @@
import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import 'package:justmusic/screens/add_friend_screen.dart';
import 'package:justmusic/screens/capsule_historic_screen.dart';
import 'package:justmusic/screens/change_password_screen.dart';
import 'package:justmusic/screens/feed_screen.dart';
import 'package:justmusic/screens/profile_screen.dart';
import 'package:justmusic/screens/user_screen.dart';
import 'package:justmusic/screens/welcome_screen.dart';
import '../model/User.dart';
@ -74,51 +71,3 @@ Route routeUser(User user) {
},
);
}
Route routePassword() {
return PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) => const ChangePasswordScreen(),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
const begin = Offset(1.0, 0.0);
const end = Offset.zero;
const curve = Curves.ease;
var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
return SlideTransition(
position: animation.drive(tween),
child: child,
);
},
);
}
Route routeHistoric() {
return PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) => const CapsuleHistoricScreen(),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
const begin = Offset(1.0, 0.0);
const end = Offset.zero;
const curve = Curves.ease;
var tween = Tween(begin: begin, end: end).chain(CurveTween(curve: curve));
return SlideTransition(
position: animation.drive(tween),
child: child,
);
},
);
}
Route routeWelcome() {
return PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) => const WellcomeScreen(),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return FadeTransition(
opacity: animation,
child: child,
);
},
);
}

@ -1,6 +0,0 @@
class UserException implements Exception {
String code;
String description;
UserException(this.code,this.description);
}

@ -3,24 +3,20 @@ import 'package:audioplayers/audioplayers.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'package:justmusic/screens/add_friend_screen.dart';
import 'package:justmusic/screens/explanations_screen.dart';
import 'package:justmusic/screens/feed_screen.dart';
import 'package:justmusic/screens/forget_password_screen.dart';
import 'package:justmusic/screens/login_screen.dart';
import 'package:justmusic/screens/launching_rocker_screen.dart';
import 'package:justmusic/screens/post_screen.dart';
import 'package:justmusic/screens/profile_screen.dart';
import 'package:justmusic/screens/registration_screen.dart';
import 'package:justmusic/screens/verify_email_screen.dart';
import 'package:justmusic/screens/welcome_screen.dart';
import 'package:justmusic/values/constants.dart';
import 'package:justmusic/view_model/CommentViewModel.dart';
import 'package:justmusic/view_model/MusicViewModel.dart';
import 'package:justmusic/view_model/PostViewModel.dart';
@ -28,21 +24,20 @@ import 'package:justmusic/view_model/UserViewModel.dart';
import 'package:justmusic/model/User.dart' as userJustMusic;
import 'firebase_options.dart';
import 'package:timezone/data/latest.dart' as tz;
import 'package:intl/date_symbol_data_local.dart';
import 'package:fullscreen_window/fullscreen_window.dart';
Future<void> main() async {
tz.initializeTimeZones();
Paint.enableDithering = true;
WidgetsFlutterBinding.ensureInitialized(); // Initialize for French locale
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
await initializeDateFormatting('fr_FR', null);
if (!kIsWeb) {
await FirebaseMessaging.instance.requestPermission(sound: true);
try {
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
} catch (e) {
print('Error initializing Firebase: $e');
}
MobileAds.instance.initialize();
//await FirebaseMessaging.instance.requestPermission(sound: true);
runApp(const MyApp());
}
@ -54,6 +49,7 @@ class MyApp extends StatefulWidget {
static PostViewModel postViewModel = PostViewModel();
static AudioPlayer audioPlayer = AudioPlayer();
static CommentViewModel commentViewModel = CommentViewModel();
static const keyManager = 'customCacheKey';
const MyApp({super.key});
@ -63,11 +59,26 @@ class MyApp extends StatefulWidget {
class _MyAppState extends State<MyApp> {
late StreamSubscription<User?> user;
Stream<userJustMusic.User?> userCurrent = Stream.empty();
@override
void initState() {
FullScreenWindow.setFullScreen(true); // enter fullscreen
super.initState();
//checkSignIn();
}
Future<userJustMusic.User?> checkSignIn() async {
user = FirebaseAuth.instance.authStateChanges().listen((user) async {
if (user == null) {
print('User is currently signed out!');
return null;
} else {
MyApp.userViewModel.userCurrent = (await (MyApp.userViewModel.getUser(user.uid)))!;
userCurrent = Stream.value(MyApp.userViewModel.userCurrent);
print('User is signed in!');
}
});
return null;
}
@override
@ -80,13 +91,11 @@ class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
Paint.enableDithering = true; // enter fullscreen
Paint.enableDithering = true;
return ScreenUtilInit(
useInheritedMediaQuery: true,
builder: (context, child) {
return MaterialApp(
color: bgColor,
routes: {
'/welcome': (context) => const WellcomeScreen(),
'/feed': (context) => const FeedScreen(),
@ -97,39 +106,12 @@ class _MyAppState extends State<MyApp> {
'/explanation': (context) => const ExplanationsScreen(),
'/addFriend': (context) => const AddFriendScreen(),
'/launchingRocket': (context) => const LaunchingRocketScreen(),
'/verifyEmail': (context) => const VerifyEmailScreen(),
'/forgetPassword': (context) => const ForgetPasswordScreen(),
},
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, snapshot) {
if (ConnectionState.waiting == snapshot.connectionState) {
return const CupertinoActivityIndicator();
}
if (snapshot.hasData) {
return FutureBuilder<userJustMusic.User?>(
future: MyApp.userViewModel.getUser(snapshot.data!.uid),
builder: (context, userSnapshot) {
if (userSnapshot.connectionState == ConnectionState.waiting) {
return const CupertinoActivityIndicator();
} else {
if (userSnapshot.hasData) {
MyApp.userViewModel.userCurrent = userSnapshot.data!;
return FeedScreen();
} else {
return WellcomeScreen();
}
}
},
);
} else {
return WellcomeScreen();
}
}));
home: WellcomeScreen());
},
designSize: Size(390, 844),
);

@ -1,34 +0,0 @@
import 'package:tuple/tuple.dart';
import 'Music.dart';
class Capsule {
final String _id;
late Music _music;
Tuple2<String?,String?> _location;
DateTime _date;
// Constructor
Capsule(this._id, this._location, this._date);
//Getters and setters
String get id => _id;
Music get music => _music;
set music(Music value) {
_music = value;
}
Tuple2<String?, String?> get location => _location;
set location(Tuple2<String?, String?> value) {
_location = value;
}
DateTime get date => _date;
set date(DateTime value) {
_date = value;
}
}

@ -14,11 +14,11 @@ class Music {
List<Artist> _artists;
// Constructor
Music(
this._id, this._title, this._cover, this._previewUrl, this._date, this._duration, this._explicit, this._artists);
Music(this._id, this._title, this._cover, this._previewUrl, this._date,
this._duration, this._explicit, this._artists);
//Getters and setters
String get id => _id;
String? get id => _id;
String? get title => _title;

@ -9,13 +9,13 @@ class Post {
String? _description;
late Music _music;
Tuple2<String?,String?> _location;
List<String> _likes;
int _nblikes;
String? _selfie;
DateTime _date;
// Constructor
Post(this._id, this._user, this._description, this._location,
this._likes, this._selfie, this._date);
this._nblikes, this._selfie, this._date);
//Getters and setters
String get id => _id;
@ -40,10 +40,10 @@ class Post {
_location = value;
}
List<String> get likes => _likes;
int get nblikes => _nblikes;
set likes(List<String> value) {
_likes = value;
set nblikes(int value) {
_nblikes = value;
}
String? get selfie => _selfie;

@ -6,13 +6,12 @@ class User {
String _pp;
String _token;
List<String> _followers;
List<String> _musicsLikes;
int _capsules;
List<String> _followed;
// Constructor
User(this._id, this._pseudo, this._uniquePseudo, this._mail, this._pp, this._token, this._followers,
this._musicsLikes, this._capsules, this._followed);
User(this._id, this._pseudo, this._uniquePseudo, this._mail, this._pp,
this._token, this._followers, this._capsules, this._followed);
//Getters and setters
String get id => _id;
@ -23,12 +22,6 @@ class User {
_pseudo = value;
}
List<String> get musicsLikes => _musicsLikes;
set musicsLikes(List<String> value) {
_musicsLikes = value;
}
String get uniquePseudo => _uniquePseudo;
set uniquePseudo(String value) {

@ -15,7 +15,7 @@ class PostMapper {
user!,
data?["description"],
Tuple2(data?["place"][0], data?["place"][1]),
List<String>.from(data?["likes"] as List),
data?["likes"],
data?["selfie"],
data?["date"].toDate());
}

@ -12,7 +12,6 @@ class UserMapper {
data?["picture"],
data?["token_notify"],
List<String>.from(data?["followers"] as List),
List<String>.from(data?["musics_likes"] as List),
data?["nbCapsules"] ?? 0,
List<String>.from(data?["followed"] as List));
}

@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import 'package:flutter/services.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/values/constants.dart';

@ -1,151 +0,0 @@
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import '../components/historic_component.dart';
import '../values/constants.dart';
import 'package:intl/intl.dart';
class CapsuleHistoricScreen extends StatefulWidget {
const CapsuleHistoricScreen({super.key});
@override
State<CapsuleHistoricScreen> createState() => _CapsuleHistoricScreenState();
}
class _CapsuleHistoricScreenState extends State<CapsuleHistoricScreen> {
DateTime date = DateTime.now();
_reduceMonth() {
setState(() {
date = DateTime(date.year, date.month - 1, date.day);
});
}
_addMonth() {
setState(() {
date = DateTime(date.year, date.month + 1, date.day);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: PreferredSize(
preferredSize: Size(double.infinity, 58),
child: Container(
height: double.infinity,
color: bgAppBar,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: defaultPadding),
child: Stack(
alignment: Alignment.centerLeft,
children: [
GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
Navigator.pop(context, true);
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 10),
height: 30,
width: 30,
child: Image(
image: AssetImage("assets/images/return_icon.png"),
height: 8,
),
)),
Align(
child: Text(
"Historique des capsules",
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontSize: 14, fontWeight: FontWeight.bold),
),
)
],
),
),
),
),
body: Container(
width: double.infinity,
height: double.infinity,
color: bgColor,
child: SingleChildScrollView(
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: settingPadding),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Container(
padding: const EdgeInsets.only(top: 80, left: 30, right: 30),
constraints: const BoxConstraints( maxWidth: 700),
child: Align(
alignment: Alignment.center,
child: Row(
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
GestureDetector(
child: Container(
padding: EdgeInsets.symmetric(horizontal: 10),
height: 30,
width: 30,
child: Image(
image: AssetImage("assets/images/return_icon.png"),
height: 8,
),
),
onTap: _reduceMonth,
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 30),
child: Text(
'${DateFormat.MMMM('fr_FR').format(date)[0].toUpperCase()}${DateFormat.MMMM('fr_FR').format(date).substring(1)} ${date.year}',
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w600, fontSize: 16),
),
),
GestureDetector(
onTap: _addMonth,
child: Transform(
alignment: Alignment.center,
transform: Matrix4.rotationY(3.14159265),
child: Container(
padding: EdgeInsets.symmetric(horizontal: 10),
height: 30,
width: 30,
child: Image(
image: AssetImage("assets/images/return_icon.png"),
height: 8,
),
)),
)
],
),
),
),
Padding(
padding: EdgeInsets.only(top: 30, bottom: 40),
child: SizedBox(
width: double.infinity,
child: Container(
child: Column(
children: [
HistoricComponent(
month: date.month,
year: date.year,
),
],
),
)),
),
],
),
),
),
),
);
}
}

@ -1,311 +0,0 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/main.dart';
import '../values/constants.dart';
class ChangePasswordScreen extends StatefulWidget {
const ChangePasswordScreen({super.key});
@override
State<ChangePasswordScreen> createState() => _ChangePasswordScreenState();
}
class _ChangePasswordScreenState extends State<ChangePasswordScreen> {
final _currentPasswordTextField = TextEditingController();
final _newPasswordTextField = TextEditingController();
final _confirmPasswordTextField = TextEditingController();
final _formKey = GlobalKey<FormState>();
Future<void> resetFullScreen() async {
await SystemChannels.platform.invokeMethod<void>(
'SystemChrome.restoreSystemUIOverlays',
);
}
handleChange() async {
print("test");
if (_formKey.currentState!.validate()) {
var error;
try {
await FirebaseAuth.instance.signInWithEmailAndPassword(
email: MyApp.userViewModel.userCurrent.mail,
password: _currentPasswordTextField.text,
);
if (_newPasswordTextField.text == _confirmPasswordTextField.text) {
await FirebaseAuth.instance.currentUser?.updatePassword(_confirmPasswordTextField.text);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"Mot de passe mis à jour",
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w400, fontSize: 15.h),
),
backgroundColor: primaryColor,
closeIconColor: Colors.white,
),
);
} else {
throw FirebaseAuthException(code: "not-same", message: "Les mots de passe ne correspondent pas");
}
} on FirebaseAuthException catch (e) {
if (e.code == "wrong-password") {
error = "Mot de passe incorrect";
} else if (e.code == "too-many-requests") {
error = "Trop de tentatives infructueuses. Veuillez réessayer plus tard";
} else if (e.code == "channel-error") {
error = "Impossible de vérifier le mot de passe";
} else if (e.code == "weak-password") {
error = "Le mot de passe doit contenir 6 caractères minimum";
}
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
error ?? e.message,
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w400, fontSize: 15.h),
),
backgroundColor: Colors.red,
closeIconColor: Colors.white,
),
);
}
setState(() {
_currentPasswordTextField.clear();
_newPasswordTextField.clear();
_confirmPasswordTextField.clear();
});
}
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
FocusScopeNode currentFocus = FocusScope.of(context);
if (!currentFocus.hasPrimaryFocus) {
currentFocus.unfocus();
resetFullScreen();
}
},
child: Scaffold(
appBar: PreferredSize(
preferredSize: Size(double.infinity, 58),
child: Container(
height: double.infinity,
color: bgAppBar,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: defaultPadding),
child: Stack(
alignment: Alignment.centerLeft,
children: [
GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
Navigator.pop(context, true);
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 10),
height: 30,
width: 30,
child: Image(
image: AssetImage("assets/images/return_icon.png"),
height: 8,
),
)),
Align(
child: Text(
"Mettre le mot de passe à jour",
style:
GoogleFonts.plusJakartaSans(color: Colors.white, fontSize: 14, fontWeight: FontWeight.bold),
),
)
],
),
),
),
),
body: Container(
width: double.infinity,
height: double.infinity,
color: bgColor,
child: SingleChildScrollView(
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: settingPadding),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(top: 30, bottom: 40),
child: SizedBox(
width: double.infinity,
child: Form(
key: _formKey,
child: Stack(
alignment: Alignment.center,
children: [
Container(
constraints: BoxConstraints(maxWidth: 600),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Flexible(
child: Padding(
padding: const EdgeInsets.only(right: 10),
child: Text(
"Mot de passe actuel",
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w800, fontSize: 16),
),
)),
Expanded(
child: TextFormField(
controller: _currentPasswordTextField,
decoration: InputDecoration(
enabledBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.transparent),
),
// Hides the border when you click the TextField
focusedBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.transparent),
),
// Hides the border when the TextField is disabled
disabledBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.transparent),
),
filled: true,
hintText: '6 caractères minimum',
hintStyle: GoogleFonts.plusJakartaSans(color: strokeTextField)),
maxLines: 1,
obscureText: true,
cursorColor: primaryColor,
style: GoogleFonts.plusJakartaSans(
color: grayText, fontWeight: FontWeight.w400, fontSize: 16),
),
),
],
),
SizedBox(
height: 10,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Flexible(
child: Padding(
padding: const EdgeInsets.only(right: 10),
child: Text(
"Nouveau mot de passe",
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w800, fontSize: 16),
),
)),
Expanded(
child: TextField(
controller: _newPasswordTextField,
decoration: InputDecoration(
enabledBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.transparent),
),
// Hides the border when you click the TextField
focusedBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.transparent),
),
// Hides the border when the TextField is disabled
disabledBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.transparent),
),
filled: true,
hintText: '6 caractères minimum',
hintStyle: GoogleFonts.plusJakartaSans(color: strokeTextField)),
maxLines: 1,
obscureText: true,
cursorColor: primaryColor,
style: GoogleFonts.plusJakartaSans(
color: grayText, fontWeight: FontWeight.w400, fontSize: 16),
),
),
],
),
SizedBox(
height: 10,
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Flexible(
child: Padding(
padding: const EdgeInsets.only(right: 10),
child: Text(
"Confirmer",
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w800, fontSize: 16),
),
)),
Expanded(
child: TextField(
obscureText: true,
controller: _confirmPasswordTextField,
decoration: InputDecoration(
enabledBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.transparent),
),
// Hides the border when you click the TextField
focusedBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.transparent),
),
// Hides the border when the TextField is disabled
disabledBorder: OutlineInputBorder(
borderSide: const BorderSide(color: Colors.transparent),
),
filled: true,
hintText: '6 caractères minimum',
hintStyle: GoogleFonts.plusJakartaSans(color: strokeTextField)),
maxLines: 1,
cursorColor: primaryColor,
style: GoogleFonts.plusJakartaSans(
color: grayText, fontWeight: FontWeight.w400, fontSize: 16),
),
),
],
),
],
),
)
],
),
),
),
),
GestureDetector(
onTap: handleChange,
child: Align(
child: Container(
height: 35,
width: 160,
decoration:
BoxDecoration(color: primaryColor, borderRadius: BorderRadius.all(Radius.circular(10))),
child: Center(
child: Text(
"Mettre à jour",
style: GoogleFonts.plusJakartaSans(color: Colors.white),
),
),
),
),
)
],
),
),
),
),
),
);
}
}

@ -1,11 +1,11 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/Material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/svg.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:pinch_zoom/pinch_zoom.dart';
import 'package:text_scroll/text_scroll.dart';
import 'package:zoom_tap_animation/zoom_tap_animation.dart';
import '../components/button_play_component.dart';
@ -45,14 +45,6 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
});
}
bool isSaved() {
return MyApp.userViewModel.userCurrent.musicsLikes.contains(widget.post.music.id);
}
bool isLiked() {
return widget.post.likes.contains(MyApp.userViewModel.userCurrent.id);
}
@override
void dispose() {
MyApp.audioPlayer.release();
@ -67,45 +59,9 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
}
final ScrollController _scrollController = ScrollController();
String formatPostDate(DateTime postDate) {
DateTime now = DateTime.now();
DateTime yesterday = DateTime(now.year, now.month, now.day - 1);
if (postDate.year == now.year && postDate.month == now.month && postDate.day == now.day) {
// Aujourd'hui
return "Aujourd'hui, ${postDate.hour}:${postDate.minute.toString().padLeft(2, '0')}";
} else if (postDate.year == yesterday.year && postDate.month == yesterday.month && postDate.day == yesterday.day) {
// Hier
return 'hier, ${postDate.hour}:${postDate.minute.toString().padLeft(2, '0')}';
} else {
// Autre date
return '${postDate.day} ${_getMonthAbbreviation(postDate.month)} ${postDate.hour}:${postDate.minute.toString().padLeft(2, '0')}';
}
}
String _getMonthAbbreviation(int month) {
const List<String> monthsAbbreviation = [
'janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.',
];
return monthsAbbreviation[month - 1];
}
// Exemple d'utilisation :
void main() {
DateTime postDate = DateTime(2023, 11, 17, 17, 55); // Remplacez par votre date
String formattedDate = formatPostDate(postDate);
print(formattedDate); // Affichera "17 nov. 17:55" ou "hier, 17:55" selon la date
}
@override
Widget build(BuildContext context) {
_scrollController.addListener(() {
if (_scrollController.position.pixels < 0) _scrollController.jumpTo(0);
});
return GestureDetector(
onTap: () {
FocusScopeNode currentFocus = FocusScope.of(context);
@ -116,7 +72,6 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
},
child: Container(
height: 760.h,
color: bgAppBar,
child: Column(
children: [
Expanded(
@ -135,154 +90,165 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
child: Container(
height: 400,
width: double.infinity,
child: PinchZoom(
resetDuration: const Duration(milliseconds: 400),
maxScale: 2.5,
child: FadeInImage.assetNetwork(
placeholder: "assets/images/loadingPlaceholder.gif",
image: choice ? widget.post.selfie! : widget.post.music.cover!,
width: double.infinity,
fit: BoxFit.cover,
)),
child: CachedNetworkImage(
imageUrl: choice ? widget.post.selfie! : widget.post.music.cover!,
fadeInDuration: const Duration(milliseconds: 300),
fit: BoxFit.cover,
placeholder: (context, url) => Image(
image: AssetImage("assets/images/loadingPlaceholder.gif"),
),
errorWidget: (context, url, error) => Icon(Icons.error),
),
),
),
Column(
children: [
Container(
height: 200,
margin: EdgeInsets.only(top: 230),
width: double.infinity,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
Colors.transparent,
bgModal.withOpacity(0.5),
bgModal.withOpacity(0.75),
bgModal
],
stops: [0, 0.2, 0.4, 0.8],
),
height: 200,
margin: EdgeInsets.only(top: 230),
width: double.infinity,
decoration: const BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [Colors.transparent, bgModal],
stops: [0, 0.8],
),
child: Padding(
padding: const EdgeInsets.fromLTRB(20, 0, 20, 10),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Padding(
padding: const EdgeInsets.only(right: 10),
child: choice
? Padding(
padding: const EdgeInsets.all(4),
child: ClipOval(
child: SizedBox.fromSize(
// Image radius
child: ProfilPictureComponent(user: widget.post.user),
),
),
)
: widget.post.music.previewUrl != null
? ButtonPlayComponent(music: widget.post.music)
: Container(),
),
Flexible(
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Flexible(
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Expanded(
child: ScrollConfiguration(
behavior: ScrollBehavior().copyWith(scrollbars: false),
child: TextScroll(
choice ? widget.post.user.pseudo : widget.post.music.title!,
style: GoogleFonts.plusJakartaSans(
height: 1,
color: Colors.white,
fontWeight: FontWeight.w800,
fontSize: 22,
),
mode: TextScrollMode.endless,
pauseBetween: Duration(milliseconds: 500),
velocity: Velocity(pixelsPerSecond: Offset(20, 0)),
),
child: Padding(
padding: const EdgeInsets.fromLTRB(20, 0, 20, 10),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Padding(
padding: const EdgeInsets.only(right: 10),
child: choice
? Padding(
padding: const EdgeInsets.all(4),
child: ClipOval(
child: SizedBox.fromSize(
// Image radius
child: ProfilPictureComponent(user: widget.post.user),
),
),
)
: widget.post.music.previewUrl != null
? ButtonPlayComponent(music: widget.post.music)
: Container(),
),
Flexible(
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Flexible(
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Expanded(
child: ScrollConfiguration(
behavior: ScrollBehavior().copyWith(scrollbars: false),
child: TextScroll(
choice ? widget.post.user.pseudo : widget.post.music.title!,
style: GoogleFonts.plusJakartaSans(
height: 1,
color: Colors.white,
fontWeight: FontWeight.w800,
fontSize: 22,
),
mode: TextScrollMode.endless,
pauseBetween: Duration(milliseconds: 500),
velocity: Velocity(pixelsPerSecond: Offset(20, 0)),
),
),
Padding(
padding: const EdgeInsets.only(left: 20.0),
child: choice
? Text(
formatPostDate(widget.post.date),
),
Padding(
padding: const EdgeInsets.only(left: 20.0),
child: choice
? DateTime(today.year, today.month, today.day)
.isAtSameMomentAs(
DateTime(
widget.post.date.year,
widget.post.date.month,
widget.post.date.day,
),
)
? Text(
"Aujourd'hui, ${widget.post.date.hour}:${widget.post.date.minute}",
style: GoogleFonts.plusJakartaSans(
height: 1,
color: Colors.white,
fontWeight: FontWeight.w900,
fontSize: 18,
),
)
: Text(
"hier, ${widget.post.date.hour}:${widget.post.date.minute}",
style: GoogleFonts.plusJakartaSans(
height: 1,
color: Colors.white,
fontWeight: FontWeight.w900,
fontSize: 18,
),
)
: Text(
widget.post.music.date.toString(),
style: GoogleFonts.plusJakartaSans(
height: 1,
color: Colors.white,
fontWeight: FontWeight.w900,
fontSize: 18,
),
),
),
],
),
),
choice
? widget.post.location.item2 != null
? Text(
"${widget.post.location.item1}, ${widget.post.location.item2}",
style: GoogleFonts.plusJakartaSans(
height: 1,
color: Colors.white,
fontWeight: FontWeight.w900,
fontSize: 18,
color: Colors.white.withOpacity(0.5),
fontWeight: FontWeight.w400,
fontSize: 15,
),
)
: Text(
widget.post.music.date.toString(),
: Text(
"",
style: GoogleFonts.plusJakartaSans(
height: 1,
color: Colors.white,
fontWeight: FontWeight.w900,
fontSize: 18,
color: Colors.white.withOpacity(0.4),
fontWeight: FontWeight.w300,
fontSize: 13,
),
)
: ScrollConfiguration(
behavior: ScrollBehavior().copyWith(scrollbars: false),
child: TextScroll(
widget.post.music.artists.first.name!,
style: GoogleFonts.plusJakartaSans(
height: 1,
color: Colors.white,
fontWeight: FontWeight.w500,
fontSize: 17,
),
mode: TextScrollMode.endless,
pauseBetween: Duration(milliseconds: 500),
velocity: Velocity(pixelsPerSecond: Offset(20, 0)),
),
],
),
),
choice
? widget.post.location.item2 != null
? Text(
"${widget.post.location.item1}, ${widget.post.location.item2}",
style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.5),
fontWeight: FontWeight.w400,
fontSize: 15,
),
)
: Text(
"",
style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.4),
fontWeight: FontWeight.w300,
fontSize: 13,
),
)
: ScrollConfiguration(
behavior: ScrollBehavior().copyWith(scrollbars: false),
child: TextScroll(
widget.post.music.artists.first.name!,
style: GoogleFonts.plusJakartaSans(
height: 1,
color: Colors.white,
fontWeight: FontWeight.w500,
fontSize: 17,
),
mode: TextScrollMode.endless,
pauseBetween: Duration(milliseconds: 500),
velocity: Velocity(pixelsPerSecond: Offset(20, 0)),
),
),
],
),
],
),
],
),
),
],
),
),
widget.post.description != null ? Align(
),
widget.post.description != null
? Align(
alignment: Alignment.bottomLeft,
child: Container(
child: Padding(
padding: const EdgeInsets.fromLTRB(50, 35, 50, 35),
color: bgModal,
width: double.infinity,
child: Text(
widget.post.description!,
textAlign: TextAlign.left,
@ -296,7 +262,7 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
),
)
: Container(
height: 0,
height: 30,
),
Container(
width: double.infinity,
@ -312,171 +278,21 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
child: Column(
children: [
Padding(
padding: EdgeInsets.only(top: 30, bottom: 20),
padding: EdgeInsets.symmetric(vertical: 20),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
children: [
GestureDetector(
onTap: () async {
var bool = await MyApp.postViewModel
.addOrDeleteFavoritePost(widget.post.id);
print("testttt");
if (!bool) {
widget.post.likes.add(MyApp.userViewModel.userCurrent.id);
setState(() {});
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text("Vous avez liké cette capsule",
style: TextStyle(fontWeight: FontWeight.bold)),
backgroundColor: primaryColor,
closeIconColor: Colors.white,
),
);
} else {
widget.post.likes.remove(MyApp.userViewModel.userCurrent.id);
setState(() {});
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text("Vous avez supprimé votre like",
style: TextStyle(fontWeight: FontWeight.bold)),
backgroundColor: Colors.red,
closeIconColor: Colors.white,
),
);
}
},
child: SvgPicture.asset(
"assets/images/heart.svg",
semanticsLabel: 'Like Logo',
color: isLiked() ? primaryColor : Colors.white,
),
),
Container(
padding: EdgeInsets.only(top: 8),
height: 30,
child: FutureBuilder<List<String>>(
future: MyApp.postViewModel.getLikesByPostId(widget.post.id),
builder:
(BuildContext context, AsyncSnapshot<List<String>> snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data!.length.toString(),
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w800,
));
} else {
return Container(
child: Center(
child: CupertinoActivityIndicator(),
),
);
}
},
),
)
],
),
Column(
children: [
GestureDetector(
onTap: () {
myFocusNode.requestFocus();
},
child: SvgPicture.asset("assets/images/chat.svg",
semanticsLabel: 'Chat Logo'),
),
Container(
padding: EdgeInsets.only(top: 8),
height: 30,
child: FutureBuilder<List<Comment>>(
future: MyApp.commentViewModel.getCommentsByPostId(widget.post.id),
builder:
(BuildContext context, AsyncSnapshot<List<Comment>> snapshot) {
if (snapshot.hasData) {
return Text(snapshot.data!.length.toString(),
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w800,
));
} else {
return Container(
child: Center(
child: CupertinoActivityIndicator(),
),
);
}
},
),
)
],
SvgPicture.asset("assets/images/heart.svg", semanticsLabel: 'Like Logo'),
GestureDetector(
onTap: () {
myFocusNode.requestFocus();
},
child: SvgPicture.asset("assets/images/chat.svg",
semanticsLabel: 'Chat Logo'),
),
SvgPicture.asset("assets/images/add.svg",
semanticsLabel: 'Add playlist Logo'),
GestureDetector(
onTap: () async {
var bool = await MyApp.musicViewModel
.addOrDeleteFavoriteMusic(widget.post.music.id);
!bool
? ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: RichText(
textAlign: TextAlign.center,
maxLines: 1,
overflow: TextOverflow.ellipsis,
text: TextSpan(
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w400,
fontSize: 15,
),
children: <TextSpan>[
TextSpan(
text: "${widget.post.music.title}",
style: TextStyle(fontWeight: FontWeight.bold)),
TextSpan(text: " ajouté à votre collection"),
],
),
),
backgroundColor: primaryColor,
closeIconColor: Colors.white,
),
)
: ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: RichText(
textAlign: TextAlign.center,
maxLines: 1,
overflow: TextOverflow.ellipsis,
text: TextSpan(
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w400,
fontSize: 15,
),
children: <TextSpan>[
TextSpan(
text: "${widget.post.music.title}",
style: TextStyle(fontWeight: FontWeight.bold)),
TextSpan(text: " retiré de votre collection"),
],
),
),
backgroundColor: Colors.red,
closeIconColor: Colors.white,
),
);
setState(() {});
},
child: SvgPicture.asset(
"assets/images/save.svg",
semanticsLabel: 'Save Logo',
color: isSaved() ? primaryColor : Colors.white,
)),
SvgPicture.asset("assets/images/save.svg", semanticsLabel: 'Save Logo'),
SvgPicture.asset("assets/images/report.svg", semanticsLabel: 'Report Logo'),
],
),
@ -487,6 +303,31 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
if (snapshot.hasData) {
return Column(
children: [
snapshot.data!.length > 0
? Padding(
padding: const EdgeInsets.all(15.0),
child: RichText(
text: TextSpan(
text: snapshot.data!.length.toString(),
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w800,
),
children: [
TextSpan(
text: snapshot.data!.length > 1
? " commentaires"
: " commentaire",
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w400,
),
),
],
),
),
)
: Container(),
snapshot.data!.length > 0
? Padding(
padding: const EdgeInsets.fromLTRB(20, 0, 20, 20),
@ -598,13 +439,9 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
ClipOval(
child: SizedBox.fromSize(
// Rayon de l'image
child: FadeInImage.assetNetwork(
image: MyApp.userViewModel.userCurrent.pp,
child: Image.network(
MyApp.userViewModel.userCurrent.pp,
width: 45,
height: 45,
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
),
),
),
@ -612,7 +449,6 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
Expanded(
child: TextField(
keyboardAppearance: Brightness.dark,
keyboardType: TextInputType.text,
controller: _textController,
focusNode: myFocusNode,
onSubmitted: (value) async {
@ -627,6 +463,7 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
setState(() {});
},
cursorColor: primaryColor,
keyboardType: TextInputType.emailAddress,
style: GoogleFonts.plusJakartaSans(color: Colors.white),
decoration: InputDecoration(
suffixIcon: _textController.text.isEmpty
@ -645,12 +482,12 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
_textController.clear();
});
},
icon: const Icon(
icon: Icon(
Icons.send,
color: primaryColor,
size: 20,
)),
focusedBorder: const OutlineInputBorder(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(width: 1, color: grayText),
borderRadius: BorderRadius.all(Radius.circular(100)),
),
@ -658,7 +495,7 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
fillColor: bgModal,
filled: true,
focusColor: Color.fromRGBO(255, 255, 255, 0.30),
enabledBorder: const OutlineInputBorder(
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(width: 1, color: grayText),
borderRadius: BorderRadius.all(Radius.circular(100)),
),

@ -5,8 +5,11 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:google_mobile_ads/google_mobile_ads.dart';
import 'package:justmusic/main.dart';
import 'package:tuple/tuple.dart';
import '../ad_helper.dart';
import '../components/ad_component.dart';
import '../components/post_component.dart';
import '../components/top_nav_bar_component.dart';
import '../model/Post.dart';
@ -25,21 +28,23 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
late Animation<double> animation;
late List<Post> friendFeed;
Timer? timer;
var pageFriend = 0;
late BannerAd _bannerAd;
late List<Post> discoveryFeed;
late Tuple2<List<Post>, List<Post>> displayFeed;
bool isDismissed = true;
bool choiceFeed = true;
PageController controller = PageController();
final String AdUnitId = "ca-app-pub-9896583895323467~5308111198";
bool isBannerAdReady = false;
@override
void initState() {
super.initState();
friendFeed = MyApp.postViewModel.postsFriends;
discoveryFeed = MyApp.postViewModel.bestPosts;
createWidgetAd();
animationController = AnimationController(
vsync: this,
duration: Duration(milliseconds: 400),
@ -56,6 +61,32 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
});
}
createWidgetAd() {
try {
_bannerAd = BannerAd(
size: AdSize.banner,
adUnitId: AdHelper.bannerAdUnitId,
listener: BannerAdListener(
onAdLoaded: (Ad ad) {
setState(() {
isBannerAdReady = true;
});
},
onAdFailedToLoad: (Ad ad, LoadAdError error) {
ad.dispose();
print("error loading ad!");
},
onAdOpened: (Ad ad) => print("Ad open!"),
onAdClosed: (Ad ad) => print("Ad closed!"),
onAdImpression: (Ad ad) => print("Ad impressed!"),
),
request: const AdRequest());
_bannerAd.load();
} catch (e) {
print(e);
}
}
@override
void dispose() {
controller.dispose();
@ -93,14 +124,7 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
builder: ((BuildContext context) {
return ClipRRect(
borderRadius: BorderRadius.only(topLeft: Radius.circular(20), topRight: Radius.circular(20)),
child: SizedBox(
height: 760.h,
child: Scaffold(
primary: false,
extendBody: false,
backgroundColor: Colors.transparent,
body: DetailPostScreen(post: post)),
));
child: DetailPostScreen(post: post));
}),
);
}
@ -126,25 +150,17 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
@override
Widget build(BuildContext context) {
displayFeed =
Tuple2(MyApp.postViewModel.postsFriends.toList(), MyApp.postViewModel.bestPosts.toList());
Tuple2(MyApp.postViewModel.postsFriends.reversed.toList(), MyApp.postViewModel.bestPosts.reversed.toList());
bool empty =
(choiceFeed == true && displayFeed.item1.isEmpty) || (choiceFeed == false && displayFeed.item2.isEmpty);
ScrollController _scrollController = ScrollController();
_scrollController.addListener(() {
if (_scrollController.position.maxScrollExtent ==
_scrollController.position.pixels) {
print("fin");
if (choiceFeed) {
setState(() {
MyApp.postViewModel.getMorePostsFriends();
});
} else {
setState(() {
MyApp.postViewModel.getMoreBestPosts();
});
}
}
});
final AdWidget adWidget = AdWidget(ad: _bannerAd);
final Container adContainer = Container(
alignment: Alignment.center,
width: _bannerAd.size.width.toDouble(),
height: _bannerAd.size.height.toDouble(),
child: adWidget,
);
return Scaffold(
resizeToAvoidBottomInset: false,
@ -204,7 +220,6 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
clipBehavior: Clip.none,
shrinkWrap: false,
controller: _scrollController,
itemCount: displayFeed.item1.length,
itemBuilder: (BuildContext context, int index) {
return Padding(
@ -213,7 +228,6 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
PostComponent(callback: openDetailPost, post: displayFeed.item1[index], index: index),
);
},
),
),
),
@ -232,8 +246,7 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
displacement: 20,
triggerMode: RefreshIndicatorTriggerMode.onEdge,
onRefresh: _refresh,
child: ListView.builder(
controller: _scrollController,
child: ListView.separated(
physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
clipBehavior: Clip.none,
shrinkWrap: false,
@ -245,6 +258,16 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
PostComponent(callback: openDetailPost, post: displayFeed.item2[index], index: index),
);
},
separatorBuilder: (BuildContext context, int index) {
print("separator");
return isBannerAdReady
? Padding(
padding: const EdgeInsets.only(bottom: 40),
child: AdComponent(
ad: adContainer,
))
: Container();
},
),
),
),

@ -1,234 +0,0 @@
import 'dart:async';
import 'package:auto_size_text/auto_size_text.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import '../components/login_button.dart';
import '../values/constants.dart';
class ForgetPasswordScreen extends StatefulWidget {
const ForgetPasswordScreen({Key? key}) : super(key: key);
@override
State<ForgetPasswordScreen> createState() => _ForgetPasswordScreenState();
}
class _ForgetPasswordScreenState extends State<ForgetPasswordScreen> {
bool canResendEmail = true;
Timer? timer;
final _formKey = GlobalKey<FormState>();
final _mailTextField = TextEditingController();
@override
void dispose() {
timer?.cancel();
super.dispose();
}
Future sendForgetPasswordEmail() async {
if (_formKey.currentState!.validate()) {
var error;
try {
await FirebaseAuth.instance
.sendPasswordResetEmail(email: _mailTextField.text);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"Un e-mail de réinitialisation a été envoyé. Veuillez patienter pendant 30 secondes avant la prochaine utilisation.",
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w400,
fontSize: 15.h),
),
backgroundColor: primaryColor,
),
);
setState(() => canResendEmail = false);
await Future.delayed(Duration(minutes: 1));
setState(() => canResendEmail = true);
} on FirebaseAuthException catch (e) {
if (e.code == "invalid-email") {
error = "Format de mail incorrect";
} else if (e.code == "user-not-found") {
error = "Mail incorrect";
} else if (e.code == "too-many-requests") {
error =
"Trop de tentatives. Veuillez réessayer plus tard";
}
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
error,
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w400,
fontSize: 20.h),
),
backgroundColor: Colors.red,
),
);
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: bgColor,
body: Form(
key: _formKey,
child: Stack(
children: [
SingleChildScrollView(
child: SizedBox(
width: double.infinity,
child: Column(
children: [
Padding(
padding: EdgeInsets.only(top: 185.h),
child: Align(
child: SizedBox(
width: 56.h,
child: Image(
image: AssetImage(
"assets/images/key_icon.png")),
),
)),
Padding(
padding: EdgeInsets.only(top: 28.h),
child: AutoSizeText(
"Mot de passe oublié",
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w600,
fontSize: 24.w),
maxLines: 1,
maxFontSize: 30,
overflow: TextOverflow.fade,
),
),
Padding(
padding:
EdgeInsets.symmetric(horizontal: defaultPadding),
child: Padding(
padding: EdgeInsets.only(bottom: 20.h),
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
SizedBox(
height: 15.h,
),
SizedBox(
width: 346.h,
child: AutoSizeText(
"Afin de procéder à la récupération de votre mot de passe, veuillez renseigner votre adresse mail correspondant a votre compte JustMusic.",
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w100,
fontSize: 16.w),
maxFontSize: 20,
textAlign: TextAlign.center,
),
),
],
),
),
),
ConstrainedBox(
constraints: BoxConstraints(maxWidth: 600),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(
bottom: 68.h,
left: defaultPadding,
right: defaultPadding),
child: TextFormField(
controller: _mailTextField,
keyboardAppearance: Brightness.dark,
validator: (value) {
if (value == null || value.isEmpty) {
return 'entrez un email valide';
}
return null;
},
cursorColor: primaryColor,
keyboardType:
TextInputType.emailAddress,
style: GoogleFonts.plusJakartaSans(
color: primaryColor),
decoration: InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
width: 1,
color: strokeTextField),
borderRadius: BorderRadius.all(
Radius.circular(10))),
prefix: const Padding(
padding: EdgeInsets.only(
left: 20.0)),
suffix: const Padding(
padding: EdgeInsets.only(
left: 20.0)),
fillColor: bgTextField,
filled: true,
focusColor: Color.fromRGBO(
255, 255, 255, 0.30),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
width: 1,
color: strokeTextField),
borderRadius: BorderRadius.all(
Radius.circular(10))),
hintText: 'Email',
hintStyle: GoogleFonts.plusJakartaSans(color: strokeTextField)),
)),
Padding(
padding: EdgeInsets.symmetric(
horizontal: defaultPadding),
child: SizedBox(
width: 600,
child: LoginButton(
callback: () {
canResendEmail
? sendForgetPasswordEmail()
: null;
},
text: "Envoyer",
)),
),
])),
Align(
child: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
Navigator.pushNamed(context, '/login');
},
child: Padding(
padding: EdgeInsets.only(top: 101),
child: RichText(
textAlign: TextAlign.center,
text: TextSpan(
text: 'Revenir a létape précédente',
style: GoogleFonts.plusJakartaSans(
fontSize: 15,
fontWeight: FontWeight.w400,
color: primaryColor),
),
),
),
),
),
],
),
),
),
],
)));
}
}

@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import 'package:justmusic/config/routes.dart';
import 'package:lottie/lottie.dart';

@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import '../values/constants.dart';

@ -1,3 +1,4 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@ -9,7 +10,6 @@ import 'package:justmusic/main.dart';
import 'package:justmusic/values/constants.dart';
import '../components/login_button.dart';
import '../exceptions/user_exception.dart';
class LoginScreen extends StatefulWidget {
const LoginScreen({Key? key}) : super(key: key);
@ -33,7 +33,7 @@ class _LoginScreenState extends State<LoginScreen> {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
e.toString(),
e.toString() ?? "",
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w400, fontSize: 20.h),
),
backgroundColor: Colors.red,
@ -43,18 +43,6 @@ class _LoginScreenState extends State<LoginScreen> {
}
}
signInWithGoogle() async {
try {
await MyApp.userViewModel.signInWithGoogle();
} on UserException catch (e) {
if (e.code == 'user-created') {
Navigator.pushNamed(context, '/explanation');
} else if (e.code == 'user-already-exist') {
Navigator.pushNamed(context, '/feed');
}
}
}
@override
Widget build(BuildContext context) {
return GestureDetector(
@ -85,7 +73,7 @@ class _LoginScreenState extends State<LoginScreen> {
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text(
"Te revoilà !",
"Te revoilà!",
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w600, fontSize: 38.h),
),
@ -95,7 +83,7 @@ class _LoginScreenState extends State<LoginScreen> {
SizedBox(
width: 230.w,
child: Text(
"Bon retour parmis nous. Tu nous as manqué !",
"Bon retour parmis nous tu nous as manqué!",
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w400, fontSize: 20.h),
textAlign: TextAlign.center,
@ -116,7 +104,7 @@ class _LoginScreenState extends State<LoginScreen> {
keyboardAppearance: Brightness.dark,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Entrez un email valide';
return 'entrez un email valide';
}
return null;
},
@ -148,7 +136,7 @@ class _LoginScreenState extends State<LoginScreen> {
obscureText: passenable,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Entrez un mot de passe valide';
return 'entrez un mot de passe valide';
}
return null;
},
@ -194,18 +182,13 @@ class _LoginScreenState extends State<LoginScreen> {
errorStyle: TextStyle(fontSize: 9, height: 0.3),
),
),
GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
Navigator.pushNamed(context, '/forgetPassword');
},
child: Padding(
padding: EdgeInsets.only(top: 10),
child: Text(
"Mot de passe oublié ?",
style: GoogleFonts.plusJakartaSans(color: Colors.white),
),
)),
Padding(
padding: EdgeInsets.only(top: 10),
child: Text(
"Mot de passe oublié?",
style: GoogleFonts.plusJakartaSans(color: Colors.white),
),
),
SizedBox(
height: defaultPadding,
),
@ -213,7 +196,6 @@ class _LoginScreenState extends State<LoginScreen> {
width: 600,
child: LoginButton(
callback: handleLogin,
text: "Se connecter",
)),
Align(
child: GestureDetector(
@ -226,14 +208,14 @@ class _LoginScreenState extends State<LoginScreen> {
child: RichText(
textAlign: TextAlign.center,
text: TextSpan(
text: 'Pas encore inscrit ?',
text: 'Pas encore inscrit?',
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w400,
fontSize: 15),
children: <TextSpan>[
TextSpan(
text: " Sinscrire",
text: " Sinscire",
style: GoogleFonts.plusJakartaSans(
fontSize: 15,
fontWeight: FontWeight.w400,
@ -284,19 +266,10 @@ class _LoginScreenState extends State<LoginScreen> {
),
),
SizedBox(height: defaultPadding),
ConstrainedBox(
constraints: BoxConstraints(maxWidth: 540),
child: SizedBox(
width: 300.sp,
height: 50,
child: SignInButton(
Buttons.Google,
text: "Login with Google",
onPressed: signInWithGoogle,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(20))),
),
),
SignInButton(
Buttons.Google,
text: "Login with Google",
onPressed: () {},
),
],
),

@ -1,7 +1,7 @@
import 'dart:io';
import 'dart:ui';
import 'package:animations/animations.dart';
import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:justmusic/components/back_button.dart';
import 'package:justmusic/screens/launching_rocker_screen.dart';
@ -11,6 +11,7 @@ import '../components/editable_post_component.dart';
import '../components/post_button_component.dart';
import '../main.dart';
import '../model/Music.dart';
import '../model/Post.dart';
import '../values/constants.dart';
class PostScreen extends StatefulWidget {
@ -92,7 +93,7 @@ class _PostScreenState extends State<PostScreen> with SingleTickerProviderStateM
}
handleSubmit() async {
MyApp.postViewModel.addPost(description, selectedMusic!.id, selectedImage, selectedCity);
MyApp.postViewModel.addPost(description, (selectedMusic?.id)!, selectedImage, selectedCity);
quit();
}

@ -1,8 +1,8 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/services/AuthService.dart';
import 'package:justmusic/values/icons.dart';
import '../components/profile_component.dart';
import '../components/setting_part_component.dart';
@ -20,191 +20,137 @@ class ProfileScreen extends StatefulWidget {
class _ProfileScreenState extends State<ProfileScreen> {
@override
Widget build(BuildContext context) {
void logout() {
MyApp.userViewModel.logout();
Navigator.of(context).push(routeWelcome());
}
void _openHistoric() {
Navigator.of(context).push(routeHistoric());
Future<void> logout() async {
print("cc");
await FirebaseAuth.instance.signOut();
Navigator.pushNamed(context, '/welcome');
}
void _openDetail() {
Navigator.of(context).push(routeUser(MyApp.userViewModel.userCurrent));
}
void openConfirmationDelete() {
showCupertinoModalPopup<void>(
context: context,
barrierColor: Colors.black.withOpacity(0.7),
builder: (BuildContext context) => Container(
child: CupertinoActionSheet(
title: Text(
'Supprimer mon compte',
style: GoogleFonts.plusJakartaSans(fontWeight: FontWeight.bold),
),
actions: <CupertinoActionSheetAction>[
CupertinoActionSheetAction(
onPressed: () {
MyApp.userViewModel.delete();
Navigator.pop(context);
Navigator.of(context).push(routeWelcome());
},
child: Text('Confirmer', style: TextStyle(color: Colors.blue),),
),
],
cancelButton: CupertinoActionSheetAction(
isDestructiveAction: true,
onPressed: () {
Navigator.pop(context);
},
child: const Text('Annuler'),
),
),
),
);
}
void openPassword() {
Navigator.of(context).push(routePassword());
}
return Scaffold(
appBar: PreferredSize(
preferredSize: Size(double.infinity, 58),
child: Container(
height: double.infinity,
color: bgAppBar,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: defaultPadding),
child: Stack(
alignment: Alignment.centerLeft,
children: [
GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
Navigator.pop(context, true);
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 10),
height: 30,
width: 30,
child: Image(
image: AssetImage("assets/images/return_icon.png"),
height: 8,
),
)),
Align(
child: Text(
"Profile",
style:
GoogleFonts.plusJakartaSans(color: Colors.white, fontSize: 14, fontWeight: FontWeight.bold),
),
)
],
),
appBar: PreferredSize(
preferredSize: Size(double.infinity, 58),
child: Container(
height: double.infinity,
color: bgAppBar,
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: defaultPadding),
child: Stack(
alignment: Alignment.centerLeft,
children: [
GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
Navigator.pop(context, true);
},
child: Container(
padding: EdgeInsets.symmetric(horizontal: 10),
height: 30,
width: 30,
child: Image(
image: AssetImage("assets/images/return_icon.png"),
height: 8,
),
)),
Align(
child: Text(
"Profile",
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontSize: 14, fontWeight: FontWeight.bold),
),
)
],
),
),
),
body: Container(
width: double.infinity,
height: double.infinity,
color: bgColor,
child: RefreshIndicator(
displacement: 20,
triggerMode: RefreshIndicatorTriggerMode.onEdge,
onRefresh: _refresh,
child: SingleChildScrollView(
physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: settingPadding),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(top: 68.h, bottom: 40),
child: ProfileComponent(user: MyApp.userViewModel.userCurrent),
),
Padding(
padding: const EdgeInsets.only(bottom: 12, left: defaultPadding),
child: Text(
"Compte",
style: GoogleFonts.plusJakartaSans(color: grayText, fontWeight: FontWeight.w800, fontSize: 16),
),
body: Container(
width: double.infinity,
height: double.infinity,
color: bgColor,
child: SingleChildScrollView(
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: settingPadding),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.only(top: 68.h, bottom: 40),
child: ProfileComponent(user: MyApp.userViewModel.userCurrent),
),
Padding(
padding: const EdgeInsets.only(bottom: 12, left: defaultPadding),
child: Text(
"Compte",
style: GoogleFonts.plusJakartaSans(color: grayText, fontWeight: FontWeight.w800, fontSize: 16),
),
),
ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Column(
children: [
SettingPartComponent(
icon: JustMusicIcon.profile,
label: 'Compte',
action: _openDetail,
),
const SettingPartComponent(
icon: JustMusicIcon.history,
label: 'Historiques des capsules',
action: null,
),
),
ClipRRect(
borderRadius: BorderRadius.circular(8),
child: Column(
children: [
SettingPartComponent(
icon: JustMusicIcon.profile,
label: 'Compte',
action: _openDetail,
),
SettingPartComponent(
icon: JustMusicIcon.history,
label: 'Historiques des capsules',
action: _openHistoric,
),
const SettingPartComponent(
icon: JustMusicIcon.spotify,
label: 'Lier un compte Spotify',
action: null,
),
SettingPartComponent(
icon: JustMusicIcon.password,
label: 'Modifier mon mot de passe',
action: openPassword,
),
SettingPartComponent(
icon: JustMusicIcon.trash,
label: 'Supprimer mon compte',
action: openConfirmationDelete,
),
SettingPartComponent(
icon: JustMusicIcon.cross,
label: 'Déconnexion',
important: true,
action: logout,
),
],
const SettingPartComponent(
icon: JustMusicIcon.spotify,
label: 'Lier un compte Spotify',
action: null,
),
),
Padding(
padding: const EdgeInsets.only(bottom: 12, left: defaultPadding, top: 40),
child: Text(
"Préférences",
style: GoogleFonts.plusJakartaSans(color: grayText, fontWeight: FontWeight.w800, fontSize: 16),
const SettingPartComponent(
icon: JustMusicIcon.trash,
label: 'Supprimer mon compte',
action: null,
),
),
ClipRRect(
borderRadius: BorderRadius.circular(8),
child: const Column(
children: [
SettingPartComponent(
icon: JustMusicIcon.theme,
label: 'Thême de l\'application',
action: null,
),
SettingPartComponent(
icon: JustMusicIcon.notification,
label: 'Notifications',
action: null,
),
],
SettingPartComponent(
icon: JustMusicIcon.cross,
label: 'Déconnexion',
important: true,
action: logout,
),
)
],
],
),
),
Padding(
padding: const EdgeInsets.only(bottom: 12, left: defaultPadding, top: 40),
child: Text(
"Préférences",
style: GoogleFonts.plusJakartaSans(color: grayText, fontWeight: FontWeight.w800, fontSize: 16),
),
),
),
ClipRRect(
borderRadius: BorderRadius.circular(8),
child: const Column(
children: [
SettingPartComponent(
icon: JustMusicIcon.theme,
label: 'Thême de l\'application',
action: null,
),
SettingPartComponent(
icon: JustMusicIcon.notification,
label: 'Notifications',
action: null,
),
],
),
)
],
),
),
));
}
Future<void> _refresh() async {
setState(() {});
),
),
);
}
}

@ -7,7 +7,6 @@ import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_signin_button/button_list.dart';
import 'package:flutter_signin_button/button_view.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/exceptions/user_exception.dart';
import 'package:justmusic/values/constants.dart';
import '../components/login_button.dart';
@ -32,12 +31,12 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
if (_formKey.currentState!.validate()) {
try {
await MyApp.userViewModel.register(_userPseudoTextField.text, _passwordTextField.text, _userMailTextField.text);
Navigator.pushNamed(context, '/verifyEmail');
Navigator.pushNamed(context, '/explanation');
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
e.toString(),
e.toString() ?? "",
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w400, fontSize: 20.h),
),
backgroundColor: Colors.red,
@ -47,18 +46,6 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
}
}
signInWithGoogle() async {
try {
await MyApp.userViewModel.signInWithGoogle();
} on UserException catch (e) {
if (e.code == 'user-created') {
Navigator.pushNamed(context, '/explanation');
} else if (e.code == 'user-already-exist') {
Navigator.pushNamed(context, '/feed');
}
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
@ -76,10 +63,8 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
padding: EdgeInsets.only(top: 100.h),
child: AutoSizeText(
"On a besoin de ça!",
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w600,
fontSize: 30.w),
style:
GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w600, fontSize: 30.w),
maxLines: 1,
maxFontSize: 50,
overflow: TextOverflow.fade,
@ -91,8 +76,7 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
mainAxisAlignment: MainAxisAlignment.start,
children: [
Padding(
padding: EdgeInsets.symmetric(
horizontal: defaultPadding),
padding: EdgeInsets.symmetric(horizontal: defaultPadding),
child: Padding(
padding: EdgeInsets.only(bottom: 50.h),
child: Column(
@ -106,9 +90,7 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
child: AutoSizeText(
"Promis cest rapide.",
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w400,
fontSize: 17.w),
color: Colors.white, fontWeight: FontWeight.w400, fontSize: 17.w),
maxFontSize: 20,
textAlign: TextAlign.center,
),
@ -118,10 +100,7 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
),
),
Padding(
padding: EdgeInsets.only(
bottom: 16.h,
left: defaultPadding,
right: defaultPadding),
padding: EdgeInsets.only(bottom: 16.h, left: defaultPadding, right: defaultPadding),
child: TextFormField(
controller: _userPseudoTextField,
keyboardAppearance: Brightness.dark,
@ -133,37 +112,24 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
},
cursorColor: primaryColor,
keyboardType: TextInputType.emailAddress,
style: GoogleFonts.plusJakartaSans(
color: primaryColor, fontSize: 15),
style: GoogleFonts.plusJakartaSans(color: primaryColor, fontSize: 15),
decoration: InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
width: 1.sp,
color: strokeTextField),
borderRadius: const BorderRadius.all(
Radius.circular(10))),
prefix: const Padding(
padding: EdgeInsets.only(left: 20.0)),
suffix: const Padding(
padding: EdgeInsets.only(left: 20.0)),
borderSide: BorderSide(width: 1.sp, color: strokeTextField),
borderRadius: const BorderRadius.all(Radius.circular(10))),
prefix: const Padding(padding: EdgeInsets.only(left: 20.0)),
suffix: const Padding(padding: EdgeInsets.only(left: 20.0)),
fillColor: bgTextField,
filled: true,
focusColor: const Color.fromRGBO(
255, 255, 255, 0.30),
focusColor: const Color.fromRGBO(255, 255, 255, 0.30),
enabledBorder: const OutlineInputBorder(
borderSide: BorderSide(
width: 1, color: strokeTextField),
borderRadius: BorderRadius.all(
Radius.circular(10))),
borderSide: BorderSide(width: 1, color: strokeTextField),
borderRadius: BorderRadius.all(Radius.circular(10))),
hintText: 'Pseudo',
hintStyle: GoogleFonts.plusJakartaSans(
color: strokeTextField)),
hintStyle: GoogleFonts.plusJakartaSans(color: strokeTextField)),
)),
Padding(
padding: EdgeInsets.only(
bottom: 16.h,
left: defaultPadding,
right: defaultPadding),
padding: EdgeInsets.only(bottom: 16.h, left: defaultPadding, right: defaultPadding),
child: TextFormField(
controller: _userMailTextField,
keyboardAppearance: Brightness.dark,
@ -175,36 +141,24 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
},
cursorColor: primaryColor,
keyboardType: TextInputType.emailAddress,
style: GoogleFonts.plusJakartaSans(
color: primaryColor),
style: GoogleFonts.plusJakartaSans(color: primaryColor),
decoration: InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
width: 1, color: strokeTextField),
borderRadius: BorderRadius.all(
Radius.circular(10))),
prefix: const Padding(
padding: EdgeInsets.only(left: 20.0)),
suffix: const Padding(
padding: EdgeInsets.only(left: 20.0)),
borderSide: BorderSide(width: 1, color: strokeTextField),
borderRadius: BorderRadius.all(Radius.circular(10))),
prefix: const Padding(padding: EdgeInsets.only(left: 20.0)),
suffix: const Padding(padding: EdgeInsets.only(left: 20.0)),
fillColor: bgTextField,
filled: true,
focusColor:
Color.fromRGBO(255, 255, 255, 0.30),
focusColor: Color.fromRGBO(255, 255, 255, 0.30),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
width: 1, color: strokeTextField),
borderRadius: BorderRadius.all(
Radius.circular(10))),
borderSide: BorderSide(width: 1, color: strokeTextField),
borderRadius: BorderRadius.all(Radius.circular(10))),
hintText: 'Email',
hintStyle: GoogleFonts.plusJakartaSans(
color: strokeTextField)),
hintStyle: GoogleFonts.plusJakartaSans(color: strokeTextField)),
)),
Padding(
padding: EdgeInsets.only(
bottom: 16.h,
left: defaultPadding,
right: defaultPadding),
padding: EdgeInsets.only(bottom: 16.h, left: defaultPadding, right: defaultPadding),
child: TextFormField(
controller: _passwordTextField,
keyboardAppearance: Brightness.dark,
@ -216,29 +170,21 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
return null;
},
cursorColor: primaryColor,
style: GoogleFonts.plusJakartaSans(
color: primaryColor),
style: GoogleFonts.plusJakartaSans(color: primaryColor),
decoration: InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
width: 1, color: strokeTextField),
borderRadius:
BorderRadius.all(Radius.circular(10))),
prefix: const Padding(
padding: EdgeInsets.only(left: 20.0)),
suffix: const Padding(
padding: EdgeInsets.only(left: 20.0)),
borderSide: BorderSide(width: 1, color: strokeTextField),
borderRadius: BorderRadius.all(Radius.circular(10))),
prefix: const Padding(padding: EdgeInsets.only(left: 20.0)),
suffix: const Padding(padding: EdgeInsets.only(left: 20.0)),
fillColor: bgTextField,
filled: true,
focusColor: Color.fromRGBO(255, 255, 255, 0.30),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
width: 1, color: strokeTextField),
borderRadius:
BorderRadius.all(Radius.circular(10))),
borderSide: BorderSide(width: 1, color: strokeTextField),
borderRadius: BorderRadius.all(Radius.circular(10))),
hintText: 'Mot de passe',
hintStyle: GoogleFonts.plusJakartaSans(
color: strokeTextField),
hintStyle: GoogleFonts.plusJakartaSans(color: strokeTextField),
suffixIcon: Container(
padding: EdgeInsets.only(right: 10),
margin: EdgeInsets.all(5),
@ -258,10 +204,8 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
// Splash color over image
child: Image(
image: passenable
? AssetImage(
"assets/images/show_icon.png")
: AssetImage(
"assets/images/hide_icon.png"),
? AssetImage("assets/images/show_icon.png")
: AssetImage("assets/images/hide_icon.png"),
height: 2,
),
)),
@ -269,10 +213,7 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
),
),
Padding(
padding: EdgeInsets.only(
bottom: 16.h,
left: defaultPadding,
right: defaultPadding),
padding: EdgeInsets.only(bottom: 16.h, left: defaultPadding, right: defaultPadding),
child: TextFormField(
controller: _passwordConfirmTextField,
keyboardAppearance: Brightness.dark,
@ -287,29 +228,21 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
},
cursorColor: primaryColor,
keyboardType: TextInputType.emailAddress,
style: GoogleFonts.plusJakartaSans(
color: primaryColor),
style: GoogleFonts.plusJakartaSans(color: primaryColor),
decoration: InputDecoration(
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(
width: 1, color: strokeTextField),
borderRadius:
BorderRadius.all(Radius.circular(10))),
prefix: const Padding(
padding: EdgeInsets.only(left: 20.0)),
suffix: const Padding(
padding: EdgeInsets.only(left: 20.0)),
borderSide: BorderSide(width: 1, color: strokeTextField),
borderRadius: BorderRadius.all(Radius.circular(10))),
prefix: const Padding(padding: EdgeInsets.only(left: 20.0)),
suffix: const Padding(padding: EdgeInsets.only(left: 20.0)),
fillColor: bgTextField,
filled: true,
focusColor: Color.fromRGBO(255, 255, 255, 0.30),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(
width: 1, color: strokeTextField),
borderRadius:
BorderRadius.all(Radius.circular(10))),
borderSide: BorderSide(width: 1, color: strokeTextField),
borderRadius: BorderRadius.all(Radius.circular(10))),
hintText: 'Confirmation du Mot de passe',
hintStyle: GoogleFonts.plusJakartaSans(
color: strokeTextField),
hintStyle: GoogleFonts.plusJakartaSans(color: strokeTextField),
suffixIcon: Container(
padding: EdgeInsets.only(right: 10),
margin: EdgeInsets.all(5),
@ -329,10 +262,8 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
// Splash color over image
child: Image(
image: passenable
? AssetImage(
"assets/images/show_icon.png")
: AssetImage(
"assets/images/hide_icon.png"),
? AssetImage("assets/images/show_icon.png")
: AssetImage("assets/images/hide_icon.png"),
height: 2,
),
)),
@ -340,13 +271,11 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
),
),
Padding(
padding: EdgeInsets.symmetric(
horizontal: defaultPadding),
padding: EdgeInsets.symmetric(horizontal: defaultPadding),
child: SizedBox(
width: 600,
child: LoginButton(
callback: handleRegister,
text: "Continuer",
)),
),
Align(
@ -362,16 +291,12 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
text: TextSpan(
text: 'Tu as déjà un compte?',
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w400,
fontSize: 15),
color: Colors.white, fontWeight: FontWeight.w400, fontSize: 15),
children: <TextSpan>[
TextSpan(
text: " Connexion",
style: GoogleFonts.plusJakartaSans(
fontSize: 15,
fontWeight: FontWeight.w400,
color: primaryColor)),
fontSize: 15, fontWeight: FontWeight.w400, color: primaryColor)),
],
),
),
@ -393,13 +318,10 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
),
),
Padding(
padding: const EdgeInsets.only(
left: defaultPadding, right: defaultPadding),
padding: const EdgeInsets.only(left: defaultPadding, right: defaultPadding),
child: Text(
'Ou',
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.bold),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.bold),
),
),
Expanded(
@ -419,10 +341,8 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
child: SignInButton(
Buttons.Google,
text: "Login with Google",
onPressed: signInWithGoogle,
shape: RoundedRectangleBorder(
borderRadius:
BorderRadius.all(Radius.circular(20))),
onPressed: () {},
shape: RoundedRectangleBorder(borderRadius: BorderRadius.all(Radius.circular(20))),
),
),
),
@ -433,13 +353,10 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
child: Container(
height: 240.h,
decoration: BoxDecoration(
gradient: LinearGradient(begin: Alignment.topRight, stops: [
0,
1
], colors: [
bgColor.withOpacity(1),
bgColor.withOpacity(0)
])),
gradient: LinearGradient(
begin: Alignment.topRight,
stops: [0, 1],
colors: [bgColor.withOpacity(1), bgColor.withOpacity(0)])),
),
),
Align(
@ -447,13 +364,12 @@ class _RegistrationScreenState extends State<RegistrationScreen> {
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: 800),
child: Padding(
padding: EdgeInsets.only(
top: 45.h, left: defaultPadding, right: defaultPadding),
padding: EdgeInsets.only(top: 45.h, left: defaultPadding, right: defaultPadding),
child: ClipRRect(
borderRadius: BorderRadius.circular(10.0),
child: LinearProgressIndicator(
minHeight: 5,
value: 0.1,
value: 0.5,
backgroundColor: grayColor,
color: primaryColor,
),

@ -1,6 +1,6 @@
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import 'package:flutter/cupertino.dart';
import '../components/city_list_component.dart';

@ -1,8 +1,7 @@
import 'dart:async';
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/Material.dart';
import 'package:flutter/services.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/model/Music.dart';
@ -22,8 +21,6 @@ class SearchSongScreen extends StatefulWidget {
class _SearchSongScreenState extends State<SearchSongScreen> {
final ScrollController _scrollController = ScrollController();
final TextEditingController _textEditingController = TextEditingController();
PageController controller = PageController();
bool isCollectionSelected = false;
int? playingIndex;
@ -84,24 +81,6 @@ class _SearchSongScreenState extends State<SearchSongScreen> {
}
}
_changePage(int index) {
/*if (isCollectionSelected) {
setState(() {
isCollectionSelected = !isCollectionSelected;
controller.animateTo(1, duration: Duration(milliseconds: 200), curve: Curves.easeOut);
});
} else {
setState(() {
isCollectionSelected = !isCollectionSelected;
controller.animateTo(0, duration: Duration(milliseconds: 200), curve: Curves.easeOut);
});
}*/
}
Future<List<Music>> _fetchSavedSong() async {
return await MyApp.musicViewModel.getFavoriteMusicsByUserId(MyApp.userViewModel.userCurrent.id);
}
@override
void dispose() {
MyApp.audioPlayer.pause();
@ -145,6 +124,7 @@ class _SearchSongScreenState extends State<SearchSongScreen> {
child: SizedBox(
height: 40,
child: TextField(
autofocus: true,
controller: _textEditingController,
keyboardAppearance: Brightness.dark,
onEditingComplete: resetFullScreen,
@ -152,15 +132,11 @@ class _SearchSongScreenState extends State<SearchSongScreen> {
if (_textEditingController.text.isEmpty) {
fetchTrendingMusic();
} else {
setState(() {
filteredData = [];
});
filteredData = await MyApp.musicViewModel.getMusicsWithNameOrArtistName(value);
setState(() {
filteredData = filteredData;
});
}
controller.animateTo(0, duration: Duration(milliseconds: 200), curve: Curves.easeIn);
},
cursorColor: Colors.white,
keyboardType: TextInputType.text,
@ -186,229 +162,43 @@ class _SearchSongScreenState extends State<SearchSongScreen> {
),
),
),
Padding(
padding: const EdgeInsets.only(top: 10, bottom: 20),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: _changePage(0),
child: Text(
"Recherche",
style: GoogleFonts.plusJakartaSans(
color: isCollectionSelected ? Color(0xFF9A9A9A) : Colors.white,
fontWeight: isCollectionSelected ? FontWeight.w500 : FontWeight.w700),
),
),
GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: _changePage(1),
child: Text("Collection",
style: GoogleFonts.plusJakartaSans(
color: isCollectionSelected ? Colors.white : Color(0xFF9A9A9A),
fontWeight: isCollectionSelected ? FontWeight.w700 : FontWeight.w500)),
),
],
),
),
Flexible(
child: PageView(
controller: controller,
physics: BouncingScrollPhysics(),
onPageChanged: (index) {
setState(() {
if (index == 1) {
isCollectionSelected = true;
} else {
isCollectionSelected = false;
}
});
},
children: [
ScrollConfiguration(
behavior: ScrollBehavior().copyWith(scrollbars: true),
child: ListView.builder(
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
controller: _scrollController,
itemCount: filteredData.length,
itemBuilder: (context, index) {
if (playingIndex == index) {
return InkWell(
onTap: () {
widget.callback(filteredData[index]);
},
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: MusicListComponent(
music: filteredData[index],
playing: true,
callback: playMusic,
index: index,
),
));
}
return InkWell(
onTap: () {
widget.callback(filteredData[index]);
},
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: MusicListComponent(
music: filteredData[index],
playing: false,
callback: playMusic,
index: index,
),
));
}),
),
ScrollConfiguration(
behavior: ScrollBehavior().copyWith(scrollbars: true),
child: FutureBuilder(
future: _fetchSavedSong(),
builder: (BuildContext context, AsyncSnapshot<List<Music>> snapshot) {
if (snapshot.hasData) {
if (snapshot.data?.length == 0) {
return Container(
width: double.infinity,
height: double.infinity,
child: Column(
children: [
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
"Votre collection est vide.",
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w800, fontSize: 18),
),
),
Image.asset(
"assets/images/empty_collection.png",
width: 300,
)
],
child: ScrollConfiguration(
behavior: ScrollBehavior().copyWith(scrollbars: true),
child: ListView.builder(
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
controller: _scrollController,
itemCount: filteredData.length,
itemBuilder: (context, index) {
if (playingIndex == index) {
return InkWell(
onTap: () {
widget.callback(filteredData[index]);
},
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: MusicListComponent(
music: filteredData[index],
playing: true,
callback: playMusic,
index: index,
),
);
} else {
return ListView.builder(
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
controller: _scrollController,
itemCount: snapshot.data?.length,
itemBuilder: (context, index) {
if (playingIndex == index) {
return InkWell(
onTap: () {
widget.callback((snapshot.data?[index])!);
},
onLongPress: () {
showCupertinoModalPopup<void>(
context: context,
builder: (BuildContext context) => CupertinoAlertDialog(
title: const Text('Supprimer la musique'),
content: Text(
'Etes-vous sur de vouloir supprimer ${(snapshot.data?[index])!.title} de votre collection?'),
actions: <CupertinoDialogAction>[
CupertinoDialogAction(
/// This parameter indicates this action is the default,
/// and turns the action's text to bold text.
isDefaultAction: true,
onPressed: () {
Navigator.pop(context);
},
child: const Text('Annuler'),
),
CupertinoDialogAction(
/// This parameter indicates the action would perform
/// a destructive action such as deletion, and turns
/// the action's text color to red.
isDestructiveAction: true,
onPressed: () async {
Navigator.pop(context);
await MyApp.musicViewModel
.addOrDeleteFavoriteMusic((snapshot.data?[index])!.id);
MyApp.userViewModel.userCurrent.musicsLikes
.remove((snapshot.data?[index])!.id);
MyApp.audioPlayer.release();
setState(() {
playingIndex = null;
});
},
child: const Text('Supprimer'),
),
],
),
);
},
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: MusicListComponent(
music: (snapshot.data?[index])!,
playing: true,
callback: playMusic,
index: index,
),
));
}
return InkWell(
onTap: () {
widget.callback((snapshot.data?[index])!);
},
onLongPress: () {
showCupertinoModalPopup<void>(
context: context,
builder: (BuildContext context) => CupertinoAlertDialog(
title: const Text('Supprimer la musique'),
content: Text(
'Etes-vous sur de vouloir supprimer ${(snapshot.data?[index])!.title} de votre collection?'),
actions: <CupertinoDialogAction>[
CupertinoDialogAction(
/// This parameter indicates this action is the default,
/// and turns the action's text to bold text.
isDefaultAction: true,
onPressed: () {
Navigator.pop(context);
},
child: const Text('Annuler'),
),
CupertinoDialogAction(
/// This parameter indicates the action would perform
/// a destructive action such as deletion, and turns
/// the action's text color to red.
isDestructiveAction: true,
onPressed: () async {
Navigator.pop(context);
await MyApp.musicViewModel
.addOrDeleteFavoriteMusic((snapshot.data?[index])!.id);
MyApp.userViewModel.userCurrent.musicsLikes
.remove((snapshot.data?[index])!.id);
setState(() {});
},
child: const Text('Supprimer'),
),
],
),
);
},
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: MusicListComponent(
music: (snapshot.data?[index])!,
playing: false,
callback: playMusic,
index: index,
),
));
});
}
} else {
return CupertinoActivityIndicator();
}
},
),
)
],
));
}
return InkWell(
onTap: () {
widget.callback(filteredData[index]);
},
child: Padding(
padding: const EdgeInsets.symmetric(horizontal: 20),
child: MusicListComponent(
music: filteredData[index],
playing: false,
callback: playMusic,
index: index,
),
));
}),
))
],
),

@ -1,19 +1,15 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:flutter/Material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:image_picker/image_picker.dart';
import '../components/profile_component.dart';
import '../components/recap_component.dart';
import '../main.dart';
import '../model/User.dart' as UserJstMusic;
import '../model/User.dart';
import '../values/constants.dart';
class UserScreen extends StatefulWidget {
final UserJstMusic.User user;
final User user;
const UserScreen({super.key, required this.user});
@override
@ -22,78 +18,6 @@ class UserScreen extends StatefulWidget {
class _UserScreenState extends State<UserScreen> {
late bool isClicked;
File? image;
Future pickImage(ImageSource source) async {
try {
final image = await ImagePicker().pickImage(source: source, imageQuality: 20);
if (image == null) return;
final imageTemp = File(image.path);
await MyApp.userViewModel.updateImage(imageTemp);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
"Votre photo de profile a bien été mise à jour",
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w400, fontSize: 15.h),
),
backgroundColor: primaryColor,
closeIconColor: Colors.white,
),
);
} on PlatformException catch (e) {
print('Failed to pick image: $e');
}
}
void manageImage() {
if (image != null) {
setState(() {
image = null;
});
} else {
_showActionSheet(context);
}
}
void _showActionSheet(BuildContext context) {
showCupertinoModalPopup<void>(
context: context,
barrierColor: Colors.black.withOpacity(0.5),
builder: (BuildContext context) => Container(
color: Colors.black,
child: CupertinoActionSheet(
title: Text(
'Ajouter une photo',
style: GoogleFonts.plusJakartaSans(fontWeight: FontWeight.bold),
),
actions: <CupertinoActionSheetAction>[
CupertinoActionSheetAction(
onPressed: () {
pickImage(ImageSource.gallery);
Navigator.pop(context);
},
child: const Text('Galerie'),
),
CupertinoActionSheetAction(
onPressed: () {
pickImage(ImageSource.camera);
Navigator.pop(context);
},
child: const Text('Prendre un selfie'),
),
],
cancelButton: CupertinoActionSheetAction(
isDestructiveAction: true,
onPressed: () {
Navigator.pop(context);
},
child: const Text('Annuler'),
),
),
),
);
}
@override
Widget build(BuildContext context) {
isClicked = MyApp.userViewModel.isFriend(widget.user.id);
@ -143,39 +67,11 @@ class _UserScreenState extends State<UserScreen> {
padding: const EdgeInsets.symmetric(horizontal: settingPadding),
child: Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
Padding(
padding: EdgeInsets.only(top: 68.h, bottom: 40),
constraints: const BoxConstraints( maxWidth: 500),
child: Stack(
alignment: Alignment.center,
children: [
ProfileComponent(user: widget.user),
MyApp.userViewModel.userCurrent.id == widget.user.id
? Padding(
padding: const EdgeInsets.only(left: 70, bottom: 10),
child: GestureDetector(
onTap: () {
_showActionSheet(context);
},
child: ClipOval(
child: Container(
width: 30,
height: 30,
color: grayColor,
child: Icon(
Icons.edit,
color: Colors.white,
size: 16,
),
),
),
),
)
: Container(),
],
),
child: ProfileComponent(user: widget.user),
),
MyApp.userViewModel.userCurrent.id != widget.user.id
? Align(
@ -250,11 +146,7 @@ class _UserScreenState extends State<UserScreen> {
SizedBox(
height: 40,
),
Container(
constraints: const BoxConstraints( maxWidth: 500),
child: RecapComponent(user: widget.user),
)
RecapComponent(user: widget.user)
],
),
),

@ -1,213 +0,0 @@
import 'dart:async';
import 'package:auto_size_text/auto_size_text.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/main.dart';
import 'package:justmusic/values/constants.dart';
import '../components/login_button.dart';
class VerifyEmailScreen extends StatefulWidget {
const VerifyEmailScreen({Key? key}) : super(key: key);
@override
State<VerifyEmailScreen> createState() => _VerifyEmailScreenState();
}
class _VerifyEmailScreenState extends State<VerifyEmailScreen> {
bool isEmailVerified = false;
bool canResendEmail = false;
Timer? timer;
@override
void initState() {
super.initState();
isEmailVerified = FirebaseAuth.instance.currentUser!.emailVerified;
if (!isEmailVerified) {
sendVerificationEmail();
timer = Timer.periodic(
Duration(seconds: 5),
(_) => checkEmailVerified(),
);
}
}
@override
void dispose() {
timer?.cancel();
super.dispose();
}
Future checkEmailVerified() async {
await FirebaseAuth.instance.currentUser!.reload();
setState(() {
isEmailVerified = FirebaseAuth.instance.currentUser!.emailVerified;
});
if (isEmailVerified) {
timer?.cancel();
Navigator.pushNamed(context, '/explanation');
}
}
cancel() {
Navigator.pushNamed(context, '/register');
MyApp.userViewModel.delete();
}
Future sendVerificationEmail() async {
try {
final user = FirebaseAuth.instance.currentUser!;
await user.sendEmailVerification();
setState(() => canResendEmail = false);
await Future.delayed(Duration(minutes: 1));
setState(() => canResendEmail = true);
} catch (e) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(
e.toString(),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w400, fontSize: 20.h),
),
backgroundColor: Colors.red,
),
);
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: bgColor,
body: Stack(
children: [
SingleChildScrollView(
child: SizedBox(
width: double.infinity,
child: Column(
children: [
Padding(
padding: EdgeInsets.only(top: 200.h),
child: Align(
child: SizedBox(
width: 56.h,
child: Image(image: AssetImage("assets/images/plane_icon.png")),
),
)),
Padding(
padding: EdgeInsets.only(top: 43.h),
child: AutoSizeText(
"Verification de ton Email",
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w600, fontSize: 24.w),
maxLines: 1,
maxFontSize: 30,
overflow: TextOverflow.fade,
),
),
Padding(
padding: EdgeInsets.symmetric(horizontal: defaultPadding),
child: Padding(
padding: EdgeInsets.only(bottom: 50.h),
child: Column(
mainAxisAlignment: MainAxisAlignment.end,
children: [
SizedBox(
height: 15.h,
),
SizedBox(
width: 346.h,
child: AutoSizeText(
"Nous vous avons envoyé un lien de confirmation a l'adresse ${MyApp.userViewModel.userCurrent.mail}.\nVeuillez verifier votre messagerie et cliquer sur le lien pour vérifier votre Email.",
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w100, fontSize: 16.w),
maxFontSize: 20,
textAlign: TextAlign.center,
),
),
],
),
),
),
Padding(
padding: EdgeInsets.symmetric(horizontal: defaultPadding),
child: SizedBox(
width: 600,
child: LoginButton(
callback: checkEmailVerified,
text: "Continuer",
)),
),
Align(
child: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
canResendEmail ? sendVerificationEmail() : null;
},
child: Padding(
padding: EdgeInsets.only(top: 55),
child: RichText(
textAlign: TextAlign.center,
text: TextSpan(
text: 'Renvoyer lEmail de confirmation',
style: GoogleFonts.plusJakartaSans(
fontSize: 15, fontWeight: FontWeight.w400, color: primaryColor),
),
),
),
),
),
Align(
child: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
cancel();
},
child: Padding(
padding: EdgeInsets.only(top: 43),
child: RichText(
textAlign: TextAlign.center,
text: TextSpan(
text: 'Revenir a létape précédente',
style: GoogleFonts.plusJakartaSans(
fontSize: 15, fontWeight: FontWeight.w400, color: primaryColor),
),
),
),
),
),
],
),
),
),
Align(
alignment: Alignment.topCenter,
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: 800),
child: Padding(
padding: EdgeInsets.only(top: 45.h, left: defaultPadding, right: defaultPadding),
child: ClipRRect(
borderRadius: BorderRadius.circular(10.0),
child: LinearProgressIndicator(
minHeight: 5,
value: 0.5,
backgroundColor: grayColor,
color: primaryColor,
),
),
),
),
)
],
));
}
}

@ -78,7 +78,7 @@ class WellcomeScreen extends StatelessWidget {
child: Padding(
padding: const EdgeInsets.all(3.0),
child: Text(
"Tu as déja un compte ? Connexion",
"Tu as déja un compte? Connexion",
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w400,

@ -2,54 +2,44 @@ import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/foundation.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:justmusic/exceptions/user_exception.dart';
import '../main.dart';
class AuthService {
Future<void> addUserToFirestore(
UserCredential userCredential, String pseudo, String email) async {
var token;
if (!kIsWeb) {
token = await FirebaseMessaging.instance.getToken();
} else {
token = "empty";
}
String uniqueId = await generateUniqueId(pseudo);
final user = <String, dynamic>{
"mail": email,
"pseudo": pseudo,
"unique_id": uniqueId,
"followed": [],
"nbCapsules": 0,
"followers": [],
"token_notify": token,
"musics_likes": [],
"creation_date": DateTime.now(),
"picture":
"https://firebasestorage.googleapis.com/v0/b/justmusic-435d5.appspot.com/o/justMusicDefaultImage.png?alt=media&token=020d0fcb-b7df-4d4d-b380-e99597293fcc"
};
try {
await MyApp.db
.collection("users")
.doc(userCredential.user?.uid)
.set(user);
print("User Added");
} catch (error) {
print("Failed to add user: $error");
}
}
Future<void> register(String pseudo, String email, String password) async {
register(String pseudo, String email, String password) async {
try {
var token;
final data = await FirebaseAuth.instance.createUserWithEmailAndPassword(
email: email,
password: password,
);
await addUserToFirestore(data, pseudo, email);
if (kIsWeb) {
token = "empty";
} else {
token = await FirebaseMessaging.instance.getToken();
}
String uniqueId = await generateUniqueId(pseudo);
final user = <String, dynamic>{
"mail": email,
"pseudo": pseudo,
"unique_id": uniqueId,
"followed": [],
"nbCapsules": 0,
"followers": [],
"token_notify": token,
"musics_likes": [],
"picture":
"https://firebasestorage.googleapis.com/v0/b/justmusic-435d5.appspot.com/o/justMusicDefaultImage.png?alt=media&token=020d0fcb-b7df-4d4d-b380-e99597293fcc"
};
MyApp.db
.collection("users")
.doc(data.user?.uid)
.set(user)
.then((value) => print("User Added"))
.catchError((error) => print("Failed to add user: $error"));
} on FirebaseAuthException catch (e) {
if (e.code == 'weak-password') {
throw ('Mot de passe trop court');
@ -62,30 +52,6 @@ class AuthService {
}
}
signInWithGoogle() async {
final GoogleSignInAccount? gUser = await GoogleSignIn().signIn();
final GoogleSignInAuthentication gAuth = await gUser!.authentication;
final credential = GoogleAuthProvider.credential(
accessToken: gAuth.accessToken,
idToken: gAuth.idToken,
);
final userCredential =
await FirebaseAuth.instance.signInWithCredential(credential);
final user =
await MyApp.db.collection("users").doc(userCredential.user?.uid).get();
if (!user.exists) {
await addUserToFirestore(
userCredential,
userCredential.user?.displayName?.toLowerCase().replaceAll(' ', '') ?? "user",
userCredential.user?.email ?? "");
throw UserException("user-created", "L'utilisateur vien d'être créé");
}
throw UserException("user-already-exist", "L'utilisateur existe déjà");
}
Future<String> generateUniqueId(String pseudo) async {
String uniqueId = '$pseudo#0001';
int suffix = 1;
@ -120,20 +86,13 @@ class AuthService {
}
}
signOut() async {
void signOut() async {
await FirebaseAuth.instance.signOut();
if (!kIsWeb) {
final GoogleSignIn googleSignIn = GoogleSignIn();
if (await googleSignIn.isSignedIn()) {
await googleSignIn.signOut();
}
}
}
Future<void> delete() async {
try {
User? currentUser = FirebaseAuth.instance.currentUser;
String? id = currentUser?.uid;
await MyApp.db
.collection("users")
.doc(currentUser?.uid)
@ -142,37 +101,9 @@ class AuthService {
.catchError(
(error) => print("Error deleting user from Firestore: $error"));
QuerySnapshot usersSnapshot = await MyApp.db.collection("users").get();
// Delete all posts
QuerySnapshot postsSnapshot = await MyApp.db.collection("posts").where("user_id", isEqualTo: id).get();
for (var postDoc in postsSnapshot.docs) {
await postDoc.reference.delete();
}
// Delete all comments
QuerySnapshot commentsSnapshot = await MyApp.db.collection("comments").where("user_id", isEqualTo: id).get();
for (var commentDoc in commentsSnapshot.docs) {
await commentDoc.reference.delete();
}
for (var userDoc in usersSnapshot.docs) {
if (userDoc.exists) {
var userData = userDoc.data() as Map<String, dynamic>;
List<String> followers = List<String>.from(userData['followers'] ?? []);
List<String> followed = List<String>.from(userData['followed'] ?? []);
if (followers.contains(id)) {
followers.remove(id);
}
if (followed.contains(id)) {
followed.remove(id);
}
await userDoc.reference.update({'followers': followers, 'followed': followed});
}
}
await currentUser?.delete();
await FirebaseAuth.instance.signOut();
} on FirebaseAuthException catch (e) {
if (e.code == 'requires-recent-login') {
throw ('Please log in again to delete your account');

@ -1,33 +0,0 @@
import 'package:cloud_firestore/cloud_firestore.dart';
class CapsuleService {
Future<List<bool>> recapSevenDays(String id) async {
List<bool> recapList = [];
DateTime sevenDaysAgo = DateTime.now().subtract(Duration(days: 6));
QuerySnapshot<Map<String, dynamic>> response = await FirebaseFirestore
.instance
.collection("capsules")
.where("user_id", isEqualTo: id)
.get();
List<Map<String, dynamic>?> capsuleList = response.docs
.map((DocumentSnapshot<Map<String, dynamic>> doc) => doc.data())
.toList();
for (int i = 0; i < 7; i++) {
DateTime date = sevenDaysAgo.add(Duration(days: i));
bool capsuleExists = capsuleList.any((post) =>
post?["date"] != null &&
post?["date"].toDate().year == date.year &&
post?["date"].toDate().month == date.month &&
post?["date"].toDate().day == date.day);
recapList.add(capsuleExists);
}
return recapList;
}
}

@ -15,16 +15,6 @@ class CommentService {
await MyApp.db.collection("comments").add(comment);
}
deleteComment(String id) async {
await MyApp.db
.collection("comments")
.doc(id)
.delete()
.then((value) => print("Firestore deleted comment"))
.catchError(
(error) => print("Error deleting comment from Firestore: $error"));
}
Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getCommentsByPostId(
String id) async {
var response = await FirebaseFirestore.instance

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save