Compare commits

...

125 Commits

Author SHA1 Message Date
Rayhân HASSOU 3fb79fcb30 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
1 year ago
David D'ALMEIDA 28d58c398a Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
1 year ago
Rayhân HASSOU a2eb549ba2 Merge pull request 'CORRECT_GRAMMARY' (#73) from CORRECT_GRAMMARY into master
continuous-integration/drone/push Build is passing Details
1 year ago
Rayhân HASSOU b08b5434ac Mise à jour de 'Sources/justMUSIC/lib/screens/login_screen.dart'
continuous-integration/drone/push Build is passing Details
1 year ago
Rayhân HASSOU 210e4e4d4e Mise à jour de 'Sources/justMUSIC/lib/screens/welcome_screen.dart'
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL 67c734aaf3 Correct historic capsules 🐛
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL efc86170a8 change class name
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL 7699c1b883 add Capsule collection
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL 9db264c0d1 Mise à jour de 'Sources/justMUSIC/lib/screens/forget_password_screen.dart'
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL db866e7955 Transférer les fichiers vers 'Documentation/Diagrammes'
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL d4eaefc03c Update README.md
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL 5efab7ea60 Merge pull request 'FIX/FEED_PAGINATION' (#62) from FIX/FEED_PAGINATION into master
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL 2908d00b0f fix feeds pagination 🔨
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL d17f5d7687 fix feeds pagination 🔨
1 year ago
Lucas DELANIER d9df95b6d2 trigger method when end of the feed
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER f951b513aa add tooltip over historic capsule
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER b84d8394ac bind delete user
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER 30c5d2248f fix loading image
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER d74ac5d9ec fix keyboard type
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER dc61eae0d4 fix ios app
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER 08856fe818 historic page and profil page responsive
continuous-integration/drone/push Build is failing Details
1 year ago
Lucas DELANIER d45d9b53ec Merge branch 'fix/web-images'
continuous-integration/drone/push Build is failing Details
1 year ago
Lucas DELANIER 2d6a3c54ff fix somes issues
1 year ago
Emre KARTAL 83968d90a5 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL f4bd188e2e fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL 374ff13888 fix somes issues
1 year ago
Lucas DELANIER 6d96f4548e fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER d741611493 fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER 770b08a10b fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER a4c238d8e1 fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER 5cacac45ee fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER 111a25957e fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER fbdef7af11 fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER 225a994e80 fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER 3c0a626932 fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER 3e3a2102b5 fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER 58cdbbb048 fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER 5b743d49c7 fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER a3b3b4d9d2 fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER cec3369577 fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER fdc2c79d0d fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER 77c1afd5ee fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER f6d2aaad36 Merge remote-tracking branch 'origin/master'
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER 918144ac9c fix somes issues
1 year ago
Lucas DELANIER 8e6172463a Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER 92df1cbc49 fix somes issues
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL a3d529193e Merge pull request 'DRONE' (#61) from DRONE into master
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL eb7d43990e Correct error localisation and sign in for WEB
1 year ago
Emre KARTAL 88c7db41f0 Mise à jour de 'Sources/justMUSIC/firebase.json'
1 year ago
Emre KARTAL f1522eb002 Mise à jour de '.drone.yml'
1 year ago
Emre KARTAL e67653675e Remove windows files
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL 252b6f196e Mise à jour de 'README.md'
continuous-integration/drone/push Build was killed Details
1 year ago
Emre KARTAL 87cc08276e Merge remote-tracking branch 'origin/DRONE' into DRONE
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL 21175b0160 Correct error navigator
1 year ago
Emre KARTAL 63c7116d36 Mise à jour de 'Sources/justMUSIC/firebase.json'
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 8ec1619ad6 delete useless files
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 034e384ded For deploy web
1 year ago
Emre KARTAL 7491ff813d Mise à jour de 'Sources/justMUSIC/firebase.json'
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 250f9cdca8 Mise à jour de 'Sources/justMUSIC/firebase.json'
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL f9315759bd For deploy web
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 3d7f368724 Ajouter 'Sources/justMUSIC/firebase.json'
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 1b3102d9ff Build WEB
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 191a760ab6 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 6342b123e3 For drone
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 5a722101a6 For drone
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 7bcbc64205 Upgrade
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 096a4be8a9 Transférer les fichiers vers 'Sources/justMUSIC/lib/values'
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL f352b6cdfc Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 743fe18792 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL dcea6407f4 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 08ca1e72dc Change SDK min version
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL d657dfe0c9 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 693a47bfd8 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 224e8d3667 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 10393685d8 Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL 2861b14e7d Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is failing Details
1 year ago
Emre KARTAL b61603dbf1 Merge pull request 'fix somes issues' (#60) from fix/fix-issues into master
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL e70e2aee42 Fix error Google sign in for ios 🐛
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER 7dc0ed5a96 fix somes issues
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL 88524290ad Change ios for localisation and notification
continuous-integration/drone/push Build is passing Details
1 year ago
Lucas DELANIER 3af1116215 safearea on top for ios
continuous-integration/drone/push Build is passing Details
1 year ago
Emre KARTAL 2140c77f8b naming convention
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 6ffd84abb2 Error order 🐛
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 923fc02d49 Update getPosts 🔨
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas DELANIER 45b0f68323 Merge remote-tracking branch 'origin/master'
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL b80dba28a3 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 23e502f5d1 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 3a126b1f5a Mise à jour de 'Sources/justMUSIC/.gitignore'
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 924f602671 Supprimer 'Sources/justMUSIC/lib/values/keys.dart'
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas DELANIER 46879f6765 ios
2 years ago
Emre KARTAL b9537c726f Mise à jour de 'Sources/justMUSIC/.gitignore'
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 20d3944c13 Mise à jour de 'Sources/justMUSIC/.gitignore'
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL a55e27c4f4 Change android package name and correct error notification token 🔨
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL d4493fc128 Mise à jour de 'privacy-policy.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL e57b3b55e6 Ajouter 'privacy-policy'
continuous-integration/drone/push Build is passing Details
2 years ago
root e3017fad2a Merge with HISTORIC_CAPSULE_LDE 🔀
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL c03be279ee Add sendNotifyLike, sendNotifyLike and deleteComment functions and update deleteUser function
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier db48302aa0 fix date 2 digits
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier e776abfeab stay connected! display info when empty collection song and possibility to delete song from collection in the list when logpress
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 1ac6d85f59 fix likes
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 2b6182f5d0 fix probleme with date displaying "hier" when display date
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier d714e18cbb fix probleme with date displaying "hier" when display date
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 08434c6902 add label to inform user of the current selected list
2 years ago
Lucas Delanier 83f87e4ed3 Merge branch 'LIKES_POST_LDE-EKA' into SAVE_SONG_LDE
2 years ago
Lucas Delanier 1017257e76 add label to inform user of the current selected list
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier fd4cb7b483 Merge branch 'SAVE_SONG_LDE'
2 years ago
Lucas Delanier 1f772b5343 add label to inform user of the current selected list
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier b6d77d582b saved song
2 years ago
Lucas Delanier 2ac95d384c saved song
2 years ago
Emre KARTAL ee88c97446 Add likes functions
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier a8bbb0b066 saved song
2 years ago
Emre KARTAL 6d6da9f2e1 Merge with 'SAVE_SONG_LDE'
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 7cb82b0f62 Merge remote-tracking branch 'origin/master'
2 years ago
Emre KARTAL 927b671955 Change likes
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier d88a92fcf3 Merge branch 'SAVE_SONG_LDE'
2 years ago
Lucas Delanier 5d254431db saved song
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 8c8f5e65d7 Merge with 'GOOGLE_EKA' branch
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL deb97c0a09 Merge remote-tracking branch 'origin/GOOGLE_EKA' into GOOGLE_EKA
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 31ee70e83f filtered pseudo
2 years ago
Emre KARTAL a21f3f42da For web
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL cf0accfc47 Connection with google done
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 75ca7ba086 Starting SignInWithGoogle 🔨
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 4036f02391 add icon
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 18eacc6e56 Merge branch 'master' into SAVE_SONG_LDE
2 years ago
Lucas Delanier 2302e3941e add icon
2 years ago

@ -7,14 +7,28 @@ trigger:
- push - push
steps: steps:
# - name: app-build - name: app-build
# image: cirrusci/flutter:stable image: ghcr.io/cirruslabs/flutter:3.13.9
# commands: commands:
# - cd ./Sources/justMUSIC/ - cd ./Sources/justMUSIC/
# - flutter build apk - 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: code-analysis - name: code-analysis
image: cirrusci/flutter:stable image: ghcr.io/cirruslabs/flutter:3.13.9
environment: environment:
SONAR_TOKEN: SONAR_TOKEN:
from_secret: SONAR_TOKEN from_secret: SONAR_TOKEN
@ -26,3 +40,4 @@ steps:
- export PATH=$SONAR_SCANNER_HOME/bin:$PATH - export PATH=$SONAR_SCANNER_HOME/bin:$PATH
- export SONAR_SCANNER_OPTS="-server" - 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 - 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,6 +12,144 @@
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/.pub" /> <excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/.pub" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/.dart_tool" /> <excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/.dart_tool" />
<excludeFolder url="file://$MODULE_DIR$/Sources/justmusic/build" /> <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> </content>
<orderEntry type="inheritedJdk" /> <orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />

File diff suppressed because it is too large Load Diff

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 844 KiB

@ -4,8 +4,10 @@
--- ---
&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; ![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; ![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)
--- ---
@ -31,13 +33,15 @@ 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é. 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 ## Répartition du Gitlab
La racine de notre gitlab est composé de deux dossier essentielles au projet: La racine de notre gitlab est composé de deux dossier essentielles au projet:
[**src**](src) : **Code de l'application** [**Sources**](Sources) : **Code de l'application**
[**doc**](doc) : **Regroupe l'entièreté de la documentation** [**Documentation**](Documentation) : **Regroupe l'entièreté de la documentation**
</br> </br>
@ -45,10 +49,33 @@ La racine de notre gitlab est composé de deux dossier essentielles au projet:
## Fonctionnement ## 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 ## Deploiement
- [x] &nbsp; ![IOS](https://img.shields.io/badge/IOS-000?style=for-the-badge&logo=apple&logoColor=black&color=white) - [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; ![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 ## Techniciens
@ -57,10 +84,10 @@ La racine de notre gitlab est composé de deux dossier essentielles au projet:
<img src ="https://codefirst.iut.uca.fr/git/avatars/6a3835d734392fccff3949f7c82a63b9?size=870" height="50px"> <img src ="https://codefirst.iut.uca.fr/git/avatars/6a3835d734392fccff3949f7c82a63b9?size=870" height="50px">
</a> </a>
<a href = "https://codefirst.iut.uca.fr/git/emre.kartal"> <a href = "https://codefirst.iut.uca.fr/git/emre.kartal">
<img src ="https://codefirst.iut.uca.fr/git/avatars/402cf312e853192f42c0135a888725c2?size=870" height="50px"> <img src ="https://codefirst.iut.uca.fr/git/avatars/1ff65c9c5ab0e8c8883fb48adbcf972f?size=870" height="50px">
</a> </a>
<a href = "https://codefirst.iut.uca.fr/git/david.d_almeida"> <a href = "https://codefirst.iut.uca.fr/git/david.d_almeida">
<img src ="https://codefirst.iut.uca.fr/git/avatars/0f8eaaad1e26d3de644ca522eccaea7c?size=870" height="50px"> <img src ="https://codefirst.iut.uca.fr/git/avatars/a16fa2dc52ceae18d8923c91121caa66?size=870" height="50px">
</a> </a>
<a href = "https://codefirst.iut.uca.fr/git/rayhan.hassou"> <a href = "https://codefirst.iut.uca.fr/git/rayhan.hassou">
<img src ="https://codefirst.iut.uca.fr/git/avatars/84062b2bb326d9e9154a9859b375e599?size=870" height="50px"> <img src ="https://codefirst.iut.uca.fr/git/avatars/84062b2bb326d9e9154a9859b375e599?size=870" height="50px">

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

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

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

@ -28,7 +28,7 @@ apply plugin: 'com.google.gms.google-services'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android { android {
namespace "com.example.justmusic" namespace "com.justdev.justmusic"
compileSdkVersion 33 compileSdkVersion 33
ndkVersion flutter.ndkVersion ndkVersion flutter.ndkVersion
@ -48,7 +48,7 @@ android {
defaultConfig { defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "com.example.justmusic" applicationId "com.justdev.justmusic"
// You can update the following values to match your application needs. // 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. // For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 19 minSdkVersion 19

@ -12,6 +12,58 @@
"package_name": "com.example.justmusic" "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": [ "oauth_client": [
{ {
"client_id": "994903990520-rdk6ldrmbi71ddqt84qfhtuficm7ngon.apps.googleusercontent.com", "client_id": "994903990520-rdk6ldrmbi71ddqt84qfhtuficm7ngon.apps.googleusercontent.com",

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

@ -1,5 +1,5 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.justmusic"> package="com.justdev.justmusic">
<application <application
android:label="JustMUSIC" android:label="JustMUSIC"
android:name="${applicationName}" android:name="${applicationName}"

@ -1,4 +1,4 @@
package com.example.justmusic package com.justdev.justmusic
import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.android.FlutterActivity

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

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

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

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

@ -0,0 +1,44 @@
# 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

@ -0,0 +1,958 @@
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,18 +3,32 @@
archiveVersion = 1; archiveVersion = 1;
classes = { classes = {
}; };
objectVersion = 50; objectVersion = 54;
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 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 */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; 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 */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; 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 */ /* 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 */ /* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = { 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase; isa = PBXCopyFilesBuildPhase;
@ -31,10 +45,18 @@
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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>"; }; 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; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
@ -42,19 +64,39 @@
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; 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>"; }; 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>"; }; 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 */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
472D7C2F33BD994B5AD25717 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
7F7390F210456EB7AFF1CF93 /* Pods_RunnerTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EB1CF9000F007C117D /* Frameworks */ = { 97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
DE887488687930BD9A821E09 /* Pods_Runner.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
331C8082294A63A400263BE5 /* RunnerTests */ = {
isa = PBXGroup;
children = (
331C807B294A618700263BE5 /* RunnerTests.swift */,
);
path = RunnerTests;
sourceTree = "<group>";
};
9740EEB11CF90186004384FC /* Flutter */ = { 9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@ -72,6 +114,9 @@
9740EEB11CF90186004384FC /* Flutter */, 9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */, 97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */, 97C146EF1CF9000F007C117D /* Products */,
331C8082294A63A400263BE5 /* RunnerTests */,
E285F60DA3ED5F857F86301D /* Pods */,
C51FB947EEACC99574A07057 /* Frameworks */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@ -79,6 +124,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
97C146EE1CF9000F007C117D /* Runner.app */, 97C146EE1CF9000F007C117D /* Runner.app */,
331C8081294A63A400263BE5 /* RunnerTests.xctest */,
); );
name = Products; name = Products;
sourceTree = "<group>"; sourceTree = "<group>";
@ -86,6 +132,7 @@
97C146F01CF9000F007C117D /* Runner */ = { 97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
C95EC3D42B114F7D00A316A2 /* GoogleService-Info.plist */,
97C146FA1CF9000F007C117D /* Main.storyboard */, 97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */, 97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
@ -98,19 +145,62 @@
path = Runner; path = Runner;
sourceTree = "<group>"; 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 */ /* End PBXGroup section */
/* Begin PBXNativeTarget 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 */ = { 97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = ( buildPhases = (
44FFFF9947EC806B7CE88500 /* [CP] Check Pods Manifest.lock */,
9740EEB61CF901F6004384FC /* Run Script */, 9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */, 97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */, 97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */, 97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */, 9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
7EEED9B34346FEEF7394F416 /* [CP] Embed Pods Frameworks */,
); );
buildRules = ( buildRules = (
); );
@ -127,9 +217,14 @@
97C146E61CF9000F007C117D /* Project object */ = { 97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastUpgradeCheck = 1300; BuildIndependentTargetsInParallel = YES;
LastUpgradeCheck = 1430;
ORGANIZATIONNAME = ""; ORGANIZATIONNAME = "";
TargetAttributes = { TargetAttributes = {
331C8080294A63A400263BE5 = {
CreatedOnToolsVersion = 14.0;
TestTargetID = 97C146ED1CF9000F007C117D;
};
97C146ED1CF9000F007C117D = { 97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1; CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100; LastSwiftMigration = 1100;
@ -150,11 +245,19 @@
projectRoot = ""; projectRoot = "";
targets = ( targets = (
97C146ED1CF9000F007C117D /* Runner */, 97C146ED1CF9000F007C117D /* Runner */,
331C8080294A63A400263BE5 /* RunnerTests */,
); );
}; };
/* End PBXProject section */ /* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */ /* Begin PBXResourcesBuildPhase section */
331C807F294A63A400263BE5 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EC1CF9000F007C117D /* Resources */ = { 97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase; isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@ -163,18 +266,43 @@
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
C95EC3D52B114F7D00A316A2 /* GoogleService-Info.plist in Resources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase 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 */ = { 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputPaths = ( inputPaths = (
"${TARGET_BUILD_DIR}/${INFOPLIST_PATH}",
); );
name = "Thin Binary"; name = "Thin Binary";
outputPaths = ( outputPaths = (
@ -183,8 +311,48 @@
shellPath = /bin/sh; shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; 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 */ = { 9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
@ -200,6 +368,14 @@
/* End PBXShellScriptBuildPhase section */ /* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */
331C807D294A63A400263BE5 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
97C146EA1CF9000F007C117D /* Sources */ = { 97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@ -211,6 +387,14 @@
}; };
/* End PBXSourcesBuildPhase section */ /* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
331C8086294A63A400263BE5 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 97C146ED1CF9000F007C117D /* Runner */;
targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */ /* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = { 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup; isa = PBXVariantGroup;
@ -254,6 +438,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -264,6 +449,7 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES; GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@ -272,7 +458,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos; SUPPORTED_PLATFORMS = iphoneos;
@ -287,21 +473,77 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 35KQ5BDC64;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = com.example.justmusic; PRODUCT_BUNDLE_IDENTIFIER = com.justdev.justmusic;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
}; };
name = Profile; 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 */ = { 97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
buildSettings = { buildSettings = {
@ -325,6 +567,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -335,6 +578,7 @@
DEBUG_INFORMATION_FORMAT = dwarf; DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES; ENABLE_TESTABILITY = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO; GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES; GCC_NO_COMMON_BLOCKS = YES;
@ -349,7 +593,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = YES; MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
@ -380,6 +624,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -390,6 +635,7 @@
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO; ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu99; GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES; GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@ -398,7 +644,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0; IPHONEOS_DEPLOYMENT_TARGET = 12.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos; SUPPORTED_PLATFORMS = iphoneos;
@ -415,15 +661,21 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 35KQ5BDC64;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = com.example.justmusic; PRODUCT_BUNDLE_IDENTIFIER = com.justdev.justmusic;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
@ -437,15 +689,21 @@
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_MODULES = YES;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
DEVELOPMENT_TEAM = 35KQ5BDC64;
ENABLE_BITCODE = NO; ENABLE_BITCODE = NO;
ENABLE_USER_SCRIPT_SANDBOXING = NO;
INFOPLIST_FILE = Runner/Info.plist; INFOPLIST_FILE = Runner/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
LD_RUNPATH_SEARCH_PATHS = ( LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)", "$(inherited)",
"@executable_path/Frameworks", "@executable_path/Frameworks",
); );
PRODUCT_BUNDLE_IDENTIFIER = com.example.justmusic; PRODUCT_BUNDLE_IDENTIFIER = com.justdev.justmusic;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0; SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic"; VERSIONING_SYSTEM = "apple-generic";
@ -455,6 +713,16 @@
/* End XCBuildConfiguration section */ /* End XCBuildConfiguration section */
/* Begin XCConfigurationList 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" */ = { 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList; isa = XCConfigurationList;
buildConfigurations = ( buildConfigurations = (

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

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 564 B

After

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 729 B

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: 1.9 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

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

@ -2,6 +2,8 @@
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string> <string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
@ -20,10 +22,31 @@
<string>$(FLUTTER_BUILD_NAME)</string> <string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <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> <key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string> <string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key> <key>LSRequiresIPhoneOS</key>
<true/> <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> <key>UILaunchStoryboardName</key>
<string>LaunchScreen</string> <string>LaunchScreen</string>
<key>UIMainStoryboardFile</key> <key>UIMainStoryboardFile</key>
@ -41,11 +64,5 @@
<string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string> <string>UIInterfaceOrientationLandscapeRight</string>
</array> </array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict> </dict>
</plist> </plist>

@ -0,0 +1,12 @@
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.
}
}

@ -1,7 +0,0 @@
{
"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"
}

@ -1,4 +1,4 @@
import 'package:flutter/Material.dart'; import 'package:flutter/material.dart';
import '../values/constants.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:google_fonts/google_fonts.dart';
import 'package:ionicons/ionicons.dart'; import 'package:ionicons/ionicons.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';

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

@ -10,11 +10,21 @@ class CommentComponent extends StatelessWidget {
final Comment comment; final Comment comment;
const CommentComponent({Key? key, required this.comment}) : super(key: key); 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final now = DateTime.now();
final difference = now.difference(comment.date);
return Container( return Container(
width: double.infinity, width: double.infinity,
@ -56,7 +66,7 @@ class CommentComponent extends StatelessWidget {
Padding( Padding(
padding: EdgeInsets.only(top: 6, left: 10), padding: EdgeInsets.only(top: 6, left: 10),
child: Text( child: Text(
"il y a ${difference.inHours > 0 ? difference.inHours : difference.inMinutes}${difference.inHours > 0 ? "h" : "m"}", "il y a ${calculateTimeDifference(comment.date)}",
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.6), fontWeight: FontWeight.w400, fontSize: 10), color: Colors.white.withOpacity(0.6), fontWeight: FontWeight.w400, fontSize: 10),
), ),

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

@ -1,4 +1,4 @@
import 'package:flutter/Material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/main.dart'; import 'package:justmusic/main.dart';
@ -34,59 +34,68 @@ class _HistoricComponentState extends State<HistoricComponent> {
.getHistoryCapsulesMonthWhitIdUser(MyApp.userViewModel.userCurrent.id, widget.month, widget.year), .getHistoryCapsulesMonthWhitIdUser(MyApp.userViewModel.userCurrent.id, widget.month, widget.year),
builder: (context, snapshot) { builder: (context, snapshot) {
if (snapshot.hasData) { if (snapshot.hasData) {
return Wrap( return Container(
spacing: 14, constraints: const BoxConstraints( maxWidth: 600),
runSpacing: 14, child: Wrap(
children: List.generate(getNumberOfDaysInMonth(widget.year, widget.month), (index) { spacing: 14,
Tuple2<int, Music>? checkCapsule; runSpacing: 14,
if (snapshot.data != null) { children: List.generate(getNumberOfDaysInMonth(widget.year, widget.month), (index) {
for (var element in snapshot.data!) { Tuple2<int, Music>? checkCapsule;
if (element.item1 == index + 1) { if (snapshot.data != null) {
checkCapsule = element; for (var element in snapshot.data!) {
if (element.item1 == index + 1) {
checkCapsule = element;
}
} }
} }
}
if ((widget.year > DateTime.now().year || widget.month > DateTime.now().month) || if ((widget.year > DateTime.now().year || widget.month > DateTime.now().month) ||
(widget.year == DateTime.now().year && (widget.year == DateTime.now().year &&
widget.month == DateTime.now().month && widget.month == DateTime.now().month &&
index > DateTime.now().day)) { index > DateTime.now().day)) {
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
gradient: LinearGradient(colors: [ gradient: LinearGradient(colors: [
Color(0xFF1E1E1E).withOpacity(0.7), Color(0xFF1E1E1E).withOpacity(0.7),
Color(0xFF1E1E1E).withOpacity(0), Color(0xFF1E1E1E).withOpacity(0),
], begin: Alignment.topCenter, end: Alignment.bottomCenter), ], begin: Alignment.topCenter, end: Alignment.bottomCenter),
borderRadius: BorderRadius.circular(5)), borderRadius: BorderRadius.circular(5)),
height: 60, height: 60,
width: 60, width: 60,
); );
} }
if (checkCapsule != null) { if (checkCapsule != null) {
return Container( return Tooltip(
decoration: BoxDecoration( 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)+"...",
image: DecorationImage(image: NetworkImage((checkCapsule.item2.cover)!)), decoration: const BoxDecoration(
borderRadius: BorderRadius.circular(5)), border: Border.fromBorderSide(BorderSide(color: Color(0xFF3A3A3A), width: 1)),
height: 60, color: tooltipBackground, borderRadius: BorderRadius.all(Radius.circular(20))
width: 60, ),
); child: Container(
} else { decoration: BoxDecoration(
return Container( image: DecorationImage(image: NetworkImage((checkCapsule.item2.cover)!)),
color: bgColor, borderRadius: BorderRadius.circular(5)),
height: 60, height: 60,
width: 60, width: 60,
child: Center( ));
child: Text( } else {
(index + 1).toString(), return Container(
style: color: bgColor,
GoogleFonts.plusJakartaSans(color: Colors.white, fontSize: 22, fontWeight: FontWeight.w800), height: 60,
width: 60,
child: Center(
child: Text(
(index + 1).toString(),
style:
GoogleFonts.plusJakartaSans(color: Colors.white, fontSize: 22, fontWeight: FontWeight.w800),
),
), ),
), );
); }
}
// Generate widgets // Generate widgets
}), }),
),
); );
} else { } else {
return CupertinoActivityIndicator(); return CupertinoActivityIndicator();

@ -1,4 +1,4 @@
import 'package:flutter/Material.dart'; import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import '../values/constants.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:google_fonts/google_fonts.dart';
import 'package:justmusic/components/play_button_component.dart'; import 'package:justmusic/components/play_button_component.dart';
import 'package:text_scroll/text_scroll.dart'; import 'package:text_scroll/text_scroll.dart';

@ -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:flutter_animated_play_button/flutter_animated_play_button.dart';
import 'package:ionicons/ionicons.dart'; import 'package:ionicons/ionicons.dart';

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

@ -29,6 +29,29 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
choice = !choice; 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 @override
void initState() { void initState() {
@ -39,6 +62,13 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
@override @override
Widget build(BuildContext context) { 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( return GestureDetector(
onTap: switchChoice, onTap: switchChoice,
child: SizedBox( child: SizedBox(
@ -79,18 +109,11 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
), ),
), ),
), ),
DateTime(today.year, today.month, today.day).isAtSameMomentAs( Text(
DateTime(widget.post.date.year, widget.post.date.month, widget.post.date.day)) formatPostDate(widget.post.date),
? Text(
"Aujourd'hui, ${widget.post.date.hour}:${widget.post.date.minute}",
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13), 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), SizedBox(height: 10),
@ -129,10 +152,8 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
children: [ children: [
SizedBox( SizedBox(
width: double.infinity, width: double.infinity,
child: FadeInImage.assetNetwork( child: Image.network(
image: widget.post.music.cover!, widget.post.music.cover!,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
), ),
), ),
Image( Image(
@ -173,11 +194,9 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
child: ClipRRect( child: ClipRRect(
borderRadius: BorderRadius.circular(13), borderRadius: BorderRadius.circular(13),
// implement image // implement image
child: FadeInImage.assetNetwork( child: Image.network(
image: widget.post.selfie!, widget.post.selfie!,
fit: BoxFit.cover, fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
), ),
), ),
), ),

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

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

@ -1,5 +1,4 @@
import 'package:firebase_auth/firebase_auth.dart'; import 'package:flutter/material.dart';
import 'package:flutter/Material.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import '../main.dart'; import '../main.dart';
import '../model/User.dart' as justMusic; 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 'package:google_fonts/google_fonts.dart';
import '../values/constants.dart'; import '../values/constants.dart';

@ -135,10 +135,8 @@ class _TopNavBarComponentState extends State<TopNavBarComponent> with TickerProv
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
choice = widget.choice; choice = widget.choice;
return Padding( return SafeArea(top:true,child: Container(
padding: const EdgeInsets.only(top: defaultPadding), padding: EdgeInsets.symmetric(horizontal: defaultPadding, vertical: 20),
child: Container(
padding: EdgeInsets.symmetric(horizontal: defaultPadding),
width: double.infinity, width: double.infinity,
height: 100, height: 100,
child: Row( child: Row(

@ -1,10 +1,11 @@
import 'package:flutter/Material.dart'; import 'package:flutter/material.dart';
import 'package:justmusic/screens/add_friend_screen.dart'; import 'package:justmusic/screens/add_friend_screen.dart';
import 'package:justmusic/screens/capsule_historic_screen.dart'; import 'package:justmusic/screens/capsule_historic_screen.dart';
import 'package:justmusic/screens/change_password_screen.dart'; import 'package:justmusic/screens/change_password_screen.dart';
import 'package:justmusic/screens/feed_screen.dart'; import 'package:justmusic/screens/feed_screen.dart';
import 'package:justmusic/screens/profile_screen.dart'; import 'package:justmusic/screens/profile_screen.dart';
import 'package:justmusic/screens/user_screen.dart'; import 'package:justmusic/screens/user_screen.dart';
import 'package:justmusic/screens/welcome_screen.dart';
import '../model/User.dart'; import '../model/User.dart';
@ -109,3 +110,15 @@ Route routeHistoric() {
}, },
); );
} }
Route routeWelcome() {
return PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) => const WellcomeScreen(),
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return FadeTransition(
opacity: animation,
child: child,
);
},
);
}

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

@ -5,6 +5,7 @@ import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -19,6 +20,7 @@ import 'package:justmusic/screens/profile_screen.dart';
import 'package:justmusic/screens/registration_screen.dart'; import 'package:justmusic/screens/registration_screen.dart';
import 'package:justmusic/screens/verify_email_screen.dart'; import 'package:justmusic/screens/verify_email_screen.dart';
import 'package:justmusic/screens/welcome_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/CommentViewModel.dart';
import 'package:justmusic/view_model/MusicViewModel.dart'; import 'package:justmusic/view_model/MusicViewModel.dart';
import 'package:justmusic/view_model/PostViewModel.dart'; import 'package:justmusic/view_model/PostViewModel.dart';
@ -26,18 +28,21 @@ import 'package:justmusic/view_model/UserViewModel.dart';
import 'package:justmusic/model/User.dart' as userJustMusic; import 'package:justmusic/model/User.dart' as userJustMusic;
import 'firebase_options.dart'; import 'firebase_options.dart';
import 'package:timezone/data/latest.dart' as tz; import 'package:timezone/data/latest.dart' as tz;
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:intl/date_symbol_data_local.dart'; import 'package:intl/date_symbol_data_local.dart';
import 'package:fullscreen_window/fullscreen_window.dart';
Future<void> main() async { Future<void> main() async {
tz.initializeTimeZones(); tz.initializeTimeZones();
WidgetsFlutterBinding.ensureInitialized(); Paint.enableDithering = true;
WidgetsFlutterBinding.ensureInitialized(); // Initialize for French locale
await Firebase.initializeApp( await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform, options: DefaultFirebaseOptions.currentPlatform,
); );
await initializeDateFormatting('fr_FR', null); await initializeDateFormatting('fr_FR', null);
await FirebaseMessaging.instance.requestPermission(sound: true); if (!kIsWeb) {
await FirebaseMessaging.instance.requestPermission(sound: true);
}
runApp(const MyApp()); runApp(const MyApp());
} }
@ -49,7 +54,6 @@ class MyApp extends StatefulWidget {
static PostViewModel postViewModel = PostViewModel(); static PostViewModel postViewModel = PostViewModel();
static AudioPlayer audioPlayer = AudioPlayer(); static AudioPlayer audioPlayer = AudioPlayer();
static CommentViewModel commentViewModel = CommentViewModel(); static CommentViewModel commentViewModel = CommentViewModel();
static const keyManager = 'customCacheKey';
const MyApp({super.key}); const MyApp({super.key});
@ -59,26 +63,11 @@ class MyApp extends StatefulWidget {
class _MyAppState extends State<MyApp> { class _MyAppState extends State<MyApp> {
late StreamSubscription<User?> user; late StreamSubscription<User?> user;
Stream<userJustMusic.User?> userCurrent = Stream.empty();
@override @override
void initState() { void initState() {
FullScreenWindow.setFullScreen(true); // enter fullscreen
super.initState(); 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 @override
@ -91,11 +80,13 @@ class _MyAppState extends State<MyApp> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
Paint.enableDithering = true; Paint.enableDithering = true; // enter fullscreen
return ScreenUtilInit( return ScreenUtilInit(
useInheritedMediaQuery: true, useInheritedMediaQuery: true,
builder: (context, child) { builder: (context, child) {
return MaterialApp( return MaterialApp(
color: bgColor,
routes: { routes: {
'/welcome': (context) => const WellcomeScreen(), '/welcome': (context) => const WellcomeScreen(),
'/feed': (context) => const FeedScreen(), '/feed': (context) => const FeedScreen(),
@ -113,7 +104,32 @@ class _MyAppState extends State<MyApp> {
theme: ThemeData( theme: ThemeData(
primarySwatch: Colors.blue, primarySwatch: Colors.blue,
), ),
home: WellcomeScreen()); 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();
}
}));
}, },
designSize: Size(390, 844), designSize: Size(390, 844),
); );

@ -0,0 +1,34 @@
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; List<Artist> _artists;
// Constructor // Constructor
Music(this._id, this._title, this._cover, this._previewUrl, this._date, Music(
this._duration, this._explicit, this._artists); this._id, this._title, this._cover, this._previewUrl, this._date, this._duration, this._explicit, this._artists);
//Getters and setters //Getters and setters
String? get id => _id; String get id => _id;
String? get title => _title; String? get title => _title;

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

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

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

@ -12,6 +12,7 @@ class UserMapper {
data?["picture"], data?["picture"],
data?["token_notify"], data?["token_notify"],
List<String>.from(data?["followers"] as List), List<String>.from(data?["followers"] as List),
List<String>.from(data?["musics_likes"] as List),
data?["nbCapsules"] ?? 0, data?["nbCapsules"] ?? 0,
List<String>.from(data?["followed"] as List)); 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:flutter/services.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/values/constants.dart'; import 'package:justmusic/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:google_fonts/google_fonts.dart';
import '../components/historic_component.dart'; import '../components/historic_component.dart';
@ -77,8 +77,9 @@ class _CapsuleHistoricScreenState extends State<CapsuleHistoricScreen> {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Padding( Container(
padding: const EdgeInsets.only(top: 80, left: 60, right: 60), padding: const EdgeInsets.only(top: 80, left: 30, right: 30),
constraints: const BoxConstraints( maxWidth: 700),
child: Align( child: Align(
alignment: Alignment.center, alignment: Alignment.center,
child: Row( child: Row(
@ -130,8 +131,6 @@ class _CapsuleHistoricScreenState extends State<CapsuleHistoricScreen> {
child: SizedBox( child: SizedBox(
width: double.infinity, width: double.infinity,
child: Container( child: Container(
padding: EdgeInsets.symmetric(horizontal: 15),
constraints: BoxConstraints(maxWidth: 600),
child: Column( child: Column(
children: [ children: [
HistoricComponent( HistoricComponent(

@ -1,6 +1,6 @@
import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/Material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';

@ -1,10 +1,11 @@
import 'dart:async'; import 'dart:async';
import 'package:flutter/Material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/svg.dart'; import 'package:flutter_svg/svg.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:pinch_zoom/pinch_zoom.dart';
import 'package:text_scroll/text_scroll.dart'; import 'package:text_scroll/text_scroll.dart';
import 'package:zoom_tap_animation/zoom_tap_animation.dart'; import 'package:zoom_tap_animation/zoom_tap_animation.dart';
import '../components/button_play_component.dart'; import '../components/button_play_component.dart';
@ -44,6 +45,14 @@ 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 @override
void dispose() { void dispose() {
MyApp.audioPlayer.release(); MyApp.audioPlayer.release();
@ -58,9 +67,45 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
} }
final ScrollController _scrollController = ScrollController(); 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
_scrollController.addListener(() {
if (_scrollController.position.pixels < 0) _scrollController.jumpTo(0);
});
return GestureDetector( return GestureDetector(
onTap: () { onTap: () {
FocusScopeNode currentFocus = FocusScope.of(context); FocusScopeNode currentFocus = FocusScope.of(context);
@ -71,6 +116,7 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
}, },
child: Container( child: Container(
height: 760.h, height: 760.h,
color: bgAppBar,
child: Column( child: Column(
children: [ children: [
Expanded( Expanded(
@ -89,162 +135,154 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
child: Container( child: Container(
height: 400, height: 400,
width: double.infinity, width: double.infinity,
child: FadeInImage.assetNetwork( child: PinchZoom(
fit: BoxFit.cover, resetDuration: const Duration(milliseconds: 400),
image: choice ? widget.post.selfie! : widget.post.music.cover!, maxScale: 2.5,
fadeInDuration: const Duration(milliseconds: 100), child: FadeInImage.assetNetwork(
placeholder: "assets/images/loadingPlaceholder.gif", placeholder: "assets/images/loadingPlaceholder.gif",
), image: choice ? widget.post.selfie! : widget.post.music.cover!,
width: double.infinity,
fit: BoxFit.cover,
)),
), ),
), ),
Column( Column(
children: [ children: [
Container( Container(
height: 200, height: 200,
margin: EdgeInsets.only(top: 230), margin: EdgeInsets.only(top: 230),
width: double.infinity, width: double.infinity,
decoration: const BoxDecoration( decoration: BoxDecoration(
gradient: LinearGradient( gradient: LinearGradient(
begin: Alignment.topCenter, begin: Alignment.topCenter,
end: Alignment.bottomCenter, end: Alignment.bottomCenter,
colors: [Colors.transparent, bgModal], colors: [
stops: [0, 0.8], Colors.transparent,
bgModal.withOpacity(0.5),
bgModal.withOpacity(0.75),
bgModal
],
stops: [0, 0.2, 0.4, 0.8],
),
), ),
), child: Padding(
child: Padding( padding: const EdgeInsets.fromLTRB(20, 0, 20, 10),
padding: const EdgeInsets.fromLTRB(20, 0, 20, 10), child: Row(
child: Row( crossAxisAlignment: CrossAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end, children: [
children: [ Padding(
Padding( padding: const EdgeInsets.only(right: 10),
padding: const EdgeInsets.only(right: 10), child: choice
child: choice ? Padding(
? Padding( padding: const EdgeInsets.all(4),
padding: const EdgeInsets.all(4), child: ClipOval(
child: ClipOval( child: SizedBox.fromSize(
child: SizedBox.fromSize( // Image radius
// Image radius child: ProfilPictureComponent(user: widget.post.user),
child: ProfilPictureComponent(user: widget.post.user), ),
), ),
), )
) : widget.post.music.previewUrl != null
: widget.post.music.previewUrl != null ? ButtonPlayComponent(music: widget.post.music)
? ButtonPlayComponent(music: widget.post.music) : Container(),
: Container(), ),
), Flexible(
Flexible( child: Column(
child: Column( mainAxisAlignment: MainAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, children: [
children: [ Flexible(
Flexible( child: Row(
child: Row( crossAxisAlignment: CrossAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end, children: [
children: [ Expanded(
Expanded( child: ScrollConfiguration(
child: ScrollConfiguration( behavior: ScrollBehavior().copyWith(scrollbars: false),
behavior: ScrollBehavior().copyWith(scrollbars: false), child: TextScroll(
child: TextScroll( choice ? widget.post.user.pseudo : widget.post.music.title!,
choice ? widget.post.user.pseudo : widget.post.music.title!, style: GoogleFonts.plusJakartaSans(
style: GoogleFonts.plusJakartaSans( height: 1,
height: 1, color: Colors.white,
color: Colors.white, fontWeight: FontWeight.w800,
fontWeight: FontWeight.w800, fontSize: 22,
fontSize: 22, ),
mode: TextScrollMode.endless,
pauseBetween: Duration(milliseconds: 500),
velocity: Velocity(pixelsPerSecond: Offset(20, 0)),
), ),
mode: TextScrollMode.endless,
pauseBetween: Duration(milliseconds: 500),
velocity: Velocity(pixelsPerSecond: Offset(20, 0)),
), ),
), ),
), Padding(
Padding( padding: const EdgeInsets.only(left: 20.0),
padding: const EdgeInsets.only(left: 20.0), child: choice
child: choice ? Text(
? DateTime(today.year, today.month, today.day) formatPostDate(widget.post.date),
.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( style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.5), height: 1,
fontWeight: FontWeight.w400, color: Colors.white,
fontSize: 15, fontWeight: FontWeight.w900,
fontSize: 18,
), ),
) )
: Text( : Text(
"", widget.post.music.date.toString(),
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.4), height: 1,
fontWeight: FontWeight.w300, color: Colors.white,
fontSize: 13, fontWeight: FontWeight.w900,
fontSize: 18,
), ),
)
: 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, alignment: Alignment.bottomLeft,
child: Padding( child: Container(
padding: const EdgeInsets.fromLTRB(50, 35, 50, 35), padding: const EdgeInsets.fromLTRB(50, 35, 50, 35),
color: bgModal,
width: double.infinity,
child: Text( child: Text(
widget.post.description!, widget.post.description!,
textAlign: TextAlign.left, textAlign: TextAlign.left,
@ -258,7 +296,7 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
), ),
) )
: Container( : Container(
height: 30, height: 0,
), ),
Container( Container(
width: double.infinity, width: double.infinity,
@ -274,21 +312,171 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
child: Column( child: Column(
children: [ children: [
Padding( Padding(
padding: EdgeInsets.symmetric(vertical: 20), padding: EdgeInsets.only(top: 30, bottom: 20),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly, mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
SvgPicture.asset("assets/images/heart.svg", semanticsLabel: 'Like Logo'), Column(
GestureDetector( children: [
onTap: () { GestureDetector(
myFocusNode.requestFocus(); onTap: () async {
}, var bool = await MyApp.postViewModel
child: SvgPicture.asset("assets/images/chat.svg", .addOrDeleteFavoritePost(widget.post.id);
semanticsLabel: 'Chat Logo'), 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/add.svg", SvgPicture.asset("assets/images/add.svg",
semanticsLabel: 'Add playlist Logo'), semanticsLabel: 'Add playlist Logo'),
SvgPicture.asset("assets/images/save.svg", semanticsLabel: 'Save 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/report.svg", semanticsLabel: 'Report Logo'), SvgPicture.asset("assets/images/report.svg", semanticsLabel: 'Report Logo'),
], ],
), ),
@ -299,31 +487,6 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
if (snapshot.hasData) { if (snapshot.hasData) {
return Column( return Column(
children: [ 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 snapshot.data!.length > 0
? Padding( ? Padding(
padding: const EdgeInsets.fromLTRB(20, 0, 20, 20), padding: const EdgeInsets.fromLTRB(20, 0, 20, 20),
@ -449,6 +612,7 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
Expanded( Expanded(
child: TextField( child: TextField(
keyboardAppearance: Brightness.dark, keyboardAppearance: Brightness.dark,
keyboardType: TextInputType.text,
controller: _textController, controller: _textController,
focusNode: myFocusNode, focusNode: myFocusNode,
onSubmitted: (value) async { onSubmitted: (value) async {
@ -463,7 +627,6 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
setState(() {}); setState(() {});
}, },
cursorColor: primaryColor, cursorColor: primaryColor,
keyboardType: TextInputType.emailAddress,
style: GoogleFonts.plusJakartaSans(color: Colors.white), style: GoogleFonts.plusJakartaSans(color: Colors.white),
decoration: InputDecoration( decoration: InputDecoration(
suffixIcon: _textController.text.isEmpty suffixIcon: _textController.text.isEmpty
@ -482,12 +645,12 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
_textController.clear(); _textController.clear();
}); });
}, },
icon: Icon( icon: const Icon(
Icons.send, Icons.send,
color: primaryColor, color: primaryColor,
size: 20, size: 20,
)), )),
focusedBorder: OutlineInputBorder( focusedBorder: const OutlineInputBorder(
borderSide: BorderSide(width: 1, color: grayText), borderSide: BorderSide(width: 1, color: grayText),
borderRadius: BorderRadius.all(Radius.circular(100)), borderRadius: BorderRadius.all(Radius.circular(100)),
), ),
@ -495,7 +658,7 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
fillColor: bgModal, fillColor: bgModal,
filled: true, filled: true,
focusColor: Color.fromRGBO(255, 255, 255, 0.30), focusColor: Color.fromRGBO(255, 255, 255, 0.30),
enabledBorder: OutlineInputBorder( enabledBorder: const OutlineInputBorder(
borderSide: BorderSide(width: 1, color: grayText), borderSide: BorderSide(width: 1, color: grayText),
borderRadius: BorderRadius.all(Radius.circular(100)), borderRadius: BorderRadius.all(Radius.circular(100)),
), ),

@ -25,13 +25,15 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
late Animation<double> animation; late Animation<double> animation;
late List<Post> friendFeed; late List<Post> friendFeed;
Timer? timer; Timer? timer;
var pageFriend = 0;
late List<Post> discoveryFeed; late List<Post> discoveryFeed;
late Tuple2<List<Post>, List<Post>> displayFeed; late Tuple2<List<Post>, List<Post>> displayFeed;
bool isDismissed = true; bool isDismissed = true;
bool choiceFeed = true; bool choiceFeed = true;
PageController controller = PageController(); PageController controller = PageController();
@override @override
void initState() { void initState() {
super.initState(); super.initState();
@ -91,7 +93,14 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
builder: ((BuildContext context) { builder: ((BuildContext context) {
return ClipRRect( return ClipRRect(
borderRadius: BorderRadius.only(topLeft: Radius.circular(20), topRight: Radius.circular(20)), borderRadius: BorderRadius.only(topLeft: Radius.circular(20), topRight: Radius.circular(20)),
child: DetailPostScreen(post: post)); child: SizedBox(
height: 760.h,
child: Scaffold(
primary: false,
extendBody: false,
backgroundColor: Colors.transparent,
body: DetailPostScreen(post: post)),
));
}), }),
); );
} }
@ -117,9 +126,26 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
displayFeed = displayFeed =
Tuple2(MyApp.postViewModel.postsFriends.reversed.toList(), MyApp.postViewModel.bestPosts.reversed.toList()); Tuple2(MyApp.postViewModel.postsFriends.toList(), MyApp.postViewModel.bestPosts.toList());
bool empty = bool empty =
(choiceFeed == true && displayFeed.item1.isEmpty) || (choiceFeed == false && displayFeed.item2.isEmpty); (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();
});
}
}
});
return Scaffold( return Scaffold(
resizeToAvoidBottomInset: false, resizeToAvoidBottomInset: false,
backgroundColor: bgColor, backgroundColor: bgColor,
@ -178,6 +204,7 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()), physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
clipBehavior: Clip.none, clipBehavior: Clip.none,
shrinkWrap: false, shrinkWrap: false,
controller: _scrollController,
itemCount: displayFeed.item1.length, itemCount: displayFeed.item1.length,
itemBuilder: (BuildContext context, int index) { itemBuilder: (BuildContext context, int index) {
return Padding( return Padding(
@ -186,6 +213,7 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
PostComponent(callback: openDetailPost, post: displayFeed.item1[index], index: index), PostComponent(callback: openDetailPost, post: displayFeed.item1[index], index: index),
); );
}, },
), ),
), ),
), ),
@ -205,6 +233,7 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
triggerMode: RefreshIndicatorTriggerMode.onEdge, triggerMode: RefreshIndicatorTriggerMode.onEdge,
onRefresh: _refresh, onRefresh: _refresh,
child: ListView.builder( child: ListView.builder(
controller: _scrollController,
physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()), physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
clipBehavior: Clip.none, clipBehavior: Clip.none,
shrinkWrap: false, shrinkWrap: false,

@ -2,7 +2,7 @@ import 'dart:async';
import 'package:auto_size_text/auto_size_text.dart'; import 'package:auto_size_text/auto_size_text.dart';
import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/Material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
@ -52,9 +52,9 @@ class _ForgetPasswordScreenState extends State<ForgetPasswordScreen> {
setState(() => canResendEmail = true); setState(() => canResendEmail = true);
} on FirebaseAuthException catch (e) { } on FirebaseAuthException catch (e) {
if (e.code == "invalid-email") { if (e.code == "invalid-email") {
error = "Mail incorrect";
} else if (e.code == "user-not-found") {
error = "Format de mail incorrect"; error = "Format de mail incorrect";
} else if (e.code == "user-not-found") {
error = "Mail incorrect";
} else if (e.code == "too-many-requests") { } else if (e.code == "too-many-requests") {
error = error =
"Trop de tentatives. Veuillez réessayer plus tard"; "Trop de tentatives. Veuillez réessayer plus tard";

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

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

@ -9,6 +9,7 @@ import 'package:justmusic/main.dart';
import 'package:justmusic/values/constants.dart'; import 'package:justmusic/values/constants.dart';
import '../components/login_button.dart'; import '../components/login_button.dart';
import '../exceptions/user_exception.dart';
class LoginScreen extends StatefulWidget { class LoginScreen extends StatefulWidget {
const LoginScreen({Key? key}) : super(key: key); const LoginScreen({Key? key}) : super(key: key);
@ -26,18 +27,14 @@ class _LoginScreenState extends State<LoginScreen> {
handleLogin() async { handleLogin() async {
if (_formKey.currentState!.validate()) { if (_formKey.currentState!.validate()) {
try { try {
await MyApp.userViewModel await MyApp.userViewModel.login(_userMailTextField.text, _passwordTextField.text);
.login(_userMailTextField.text, _passwordTextField.text);
Navigator.pushNamed(context, '/feed'); Navigator.pushNamed(context, '/feed');
} catch (e) { } catch (e) {
ScaffoldMessenger.of(context).showSnackBar( ScaffoldMessenger.of(context).showSnackBar(
SnackBar( SnackBar(
content: Text( content: Text(
e.toString(), e.toString(),
style: GoogleFonts.plusJakartaSans( style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w400, fontSize: 20.h),
color: Colors.white,
fontWeight: FontWeight.w400,
fontSize: 20.h),
), ),
backgroundColor: Colors.red, backgroundColor: Colors.red,
), ),
@ -46,6 +43,18 @@ 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 @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return GestureDetector( return GestureDetector(
@ -66,25 +75,19 @@ class _LoginScreenState extends State<LoginScreen> {
child: Form( child: Form(
key: _formKey, key: _formKey,
child: Column( child: Column(
crossAxisAlignment: crossAxisAlignment: CrossAxisAlignment.center,
CrossAxisAlignment.center,
children: [ children: [
Flexible( Flexible(
flex: 4, flex: 4,
child: Padding( child: Padding(
padding: EdgeInsets.only(bottom: 60), padding: EdgeInsets.only(bottom: 60),
child: Column( child: Column(
mainAxisAlignment: mainAxisAlignment: MainAxisAlignment.end,
MainAxisAlignment.end,
children: [ children: [
Text( Text(
"Te revoilà!", "Te revoilà !",
style: style: GoogleFonts.plusJakartaSans(
GoogleFonts.plusJakartaSans( color: Colors.white, fontWeight: FontWeight.w600, fontSize: 38.h),
color: Colors.white,
fontWeight:
FontWeight.w600,
fontSize: 38.h),
), ),
SizedBox( SizedBox(
height: 10, height: 10,
@ -92,13 +95,9 @@ class _LoginScreenState extends State<LoginScreen> {
SizedBox( SizedBox(
width: 230.w, width: 230.w,
child: Text( child: Text(
"Bon retour parmis nous tu nous as manqué!", "Bon retour parmis nous. Tu nous as manqué !",
style: GoogleFonts style: GoogleFonts.plusJakartaSans(
.plusJakartaSans( color: Colors.white, fontWeight: FontWeight.w400, fontSize: 20.h),
color: Colors.white,
fontWeight:
FontWeight.w400,
fontSize: 20.h),
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),
), ),
@ -109,51 +108,33 @@ class _LoginScreenState extends State<LoginScreen> {
Expanded( Expanded(
flex: 5, flex: 5,
child: Column( child: Column(
crossAxisAlignment: crossAxisAlignment: CrossAxisAlignment.end,
CrossAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.center,
mainAxisAlignment:
MainAxisAlignment.center,
children: [ children: [
TextFormField( TextFormField(
controller: _userMailTextField, controller: _userMailTextField,
keyboardAppearance: keyboardAppearance: Brightness.dark,
Brightness.dark,
validator: (value) { validator: (value) {
if (value == null || if (value == null || value.isEmpty) {
value.isEmpty) { return 'Entrez un email valide';
return 'entrez un email valide';
} }
return null; return null;
}, },
cursorColor: primaryColor, cursorColor: primaryColor,
keyboardType: keyboardType: TextInputType.emailAddress,
TextInputType.emailAddress, style: GoogleFonts.plusJakartaSans(color: primaryColor),
style:
GoogleFonts.plusJakartaSans(
color: primaryColor),
decoration: InputDecoration( decoration: InputDecoration(
focusedBorder: OutlineInputBorder( focusedBorder: OutlineInputBorder(
borderSide: BorderSide( borderSide: BorderSide(width: 1, color: strokeTextField),
width: 1, borderRadius: BorderRadius.all(Radius.circular(10))),
color: prefix: const Padding(padding: EdgeInsets.only(left: 20.0)),
strokeTextField), suffix: const Padding(padding: EdgeInsets.only(left: 20.0)),
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, fillColor: bgTextField,
filled: true, filled: true,
errorStyle: TextStyle( errorStyle: TextStyle(fontSize: 9, height: 0.3),
fontSize: 9, height: 0.3), focusColor: Color.fromRGBO(255, 255, 255, 0.30),
focusColor: Color.fromRGBO(
255, 255, 255, 0.30),
enabledBorder: OutlineInputBorder( enabledBorder: OutlineInputBorder(
borderSide: borderSide: BorderSide(width: 1, color: strokeTextField),
BorderSide(width: 1, color: strokeTextField),
borderRadius: BorderRadius.all(Radius.circular(10))), borderRadius: BorderRadius.all(Radius.circular(10))),
hintText: 'Email', hintText: 'Email',
hintStyle: GoogleFonts.plusJakartaSans(color: strokeTextField)), hintStyle: GoogleFonts.plusJakartaSans(color: strokeTextField)),
@ -163,55 +144,31 @@ class _LoginScreenState extends State<LoginScreen> {
), ),
TextFormField( TextFormField(
controller: _passwordTextField, controller: _passwordTextField,
keyboardAppearance: keyboardAppearance: Brightness.dark,
Brightness.dark,
obscureText: passenable, obscureText: passenable,
validator: (value) { validator: (value) {
if (value == null || if (value == null || value.isEmpty) {
value.isEmpty) { return 'Entrez un mot de passe valide';
return 'entrez un mot de passe valide';
} }
return null; return null;
}, },
cursorColor: primaryColor, cursorColor: primaryColor,
style: style: GoogleFonts.plusJakartaSans(color: primaryColor),
GoogleFonts.plusJakartaSans(
color: primaryColor),
decoration: InputDecoration( decoration: InputDecoration(
focusedBorder: focusedBorder: OutlineInputBorder(
OutlineInputBorder( borderSide: BorderSide(width: 1, color: strokeTextField),
borderSide: BorderSide( borderRadius: BorderRadius.all(Radius.circular(10))),
width: 1,
color:
strokeTextField),
borderRadius:
BorderRadius.all(
Radius.circular(
10))),
fillColor: bgTextField, fillColor: bgTextField,
filled: true, filled: true,
focusColor: Color.fromRGBO( focusColor: Color.fromRGBO(255, 255, 255, 0.30),
255, 255, 255, 0.30), enabledBorder: OutlineInputBorder(
enabledBorder: borderSide: BorderSide(width: 1, color: strokeTextField),
OutlineInputBorder( borderRadius: BorderRadius.all(Radius.circular(10))),
borderSide: BorderSide(
width: 1,
color:
strokeTextField),
borderRadius:
BorderRadius.all(
Radius.circular(
10))),
hintText: 'Mot de passe', hintText: 'Mot de passe',
hintStyle: hintStyle: GoogleFonts.plusJakartaSans(color: strokeTextField),
GoogleFonts.plusJakartaSans( prefix: const Padding(padding: EdgeInsets.only(left: 20.0)),
color: strokeTextField),
prefix: const Padding(
padding: EdgeInsets.only(
left: 20.0)),
suffixIcon: Container( suffixIcon: Container(
padding: EdgeInsets.only( padding: EdgeInsets.only(right: 10),
right: 10),
margin: EdgeInsets.all(5), margin: EdgeInsets.all(5),
height: 3, height: 3,
child: InkWell( child: InkWell(
@ -225,38 +182,28 @@ class _LoginScreenState extends State<LoginScreen> {
}); });
}, },
// Image tapped // Image tapped
splashColor: splashColor: Colors.white10,
Colors.white10,
// Splash color over image // Splash color over image
child: Image( child: Image(
image: passenable image: passenable
? AssetImage( ? AssetImage("assets/images/show_icon.png")
"assets/images/show_icon.png") : AssetImage("assets/images/hide_icon.png"),
: AssetImage(
"assets/images/hide_icon.png"),
height: 2, height: 2,
), ),
)), )),
errorStyle: TextStyle( errorStyle: TextStyle(fontSize: 9, height: 0.3),
fontSize: 9, height: 0.3),
), ),
), ),
GestureDetector( GestureDetector(
behavior: behavior: HitTestBehavior.translucent,
HitTestBehavior.translucent,
onTap: () { onTap: () {
Navigator.pushNamed( Navigator.pushNamed(context, '/forgetPassword');
context, '/forgetPassword');
}, },
child: Padding( child: Padding(
padding: padding: EdgeInsets.only(top: 10),
EdgeInsets.only(top: 10),
child: Text( child: Text(
"Mot de passe oublié?", "Mot de passe oublié ?",
style: GoogleFonts style: GoogleFonts.plusJakartaSans(color: Colors.white),
.plusJakartaSans(
color:
Colors.white),
), ),
)), )),
SizedBox( SizedBox(
@ -270,40 +217,27 @@ class _LoginScreenState extends State<LoginScreen> {
)), )),
Align( Align(
child: GestureDetector( child: GestureDetector(
behavior: behavior: HitTestBehavior.translucent,
HitTestBehavior.translucent,
onTap: () { onTap: () {
Navigator.pushNamed( Navigator.pushNamed(context, '/register');
context, '/register');
}, },
child: Padding( child: Padding(
padding: padding: EdgeInsets.only(top: 20),
EdgeInsets.only(top: 20),
child: RichText( child: RichText(
textAlign: TextAlign.center, textAlign: TextAlign.center,
text: TextSpan( text: TextSpan(
text: text: 'Pas encore inscrit ?',
'Pas encore inscrit?', style: GoogleFonts.plusJakartaSans(
style: GoogleFonts color: Colors.white,
.plusJakartaSans( fontWeight: FontWeight.w400,
color: fontSize: 15),
Colors.white,
fontWeight:
FontWeight
.w400,
fontSize: 15),
children: <TextSpan>[ children: <TextSpan>[
TextSpan( TextSpan(
text: " Sinscire", text: " Sinscrire",
style: GoogleFonts style: GoogleFonts.plusJakartaSans(
.plusJakartaSans( fontSize: 15,
fontSize: fontWeight: FontWeight.w400,
15, color: primaryColor)),
fontWeight:
FontWeight
.w400,
color:
primaryColor)),
], ],
), ),
), ),
@ -318,59 +252,51 @@ class _LoginScreenState extends State<LoginScreen> {
child: Padding( child: Padding(
padding: EdgeInsets.only(top: 20), padding: EdgeInsets.only(top: 20),
child: Column( child: Column(
mainAxisAlignment: mainAxisAlignment: MainAxisAlignment.start,
MainAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center,
crossAxisAlignment:
CrossAxisAlignment.center,
children: [ children: [
ConstrainedBox( ConstrainedBox(
constraints: BoxConstraints( constraints: BoxConstraints(maxWidth: 600),
maxWidth: 600),
child: Row( child: Row(
mainAxisAlignment: mainAxisAlignment: MainAxisAlignment.spaceEvenly,
MainAxisAlignment
.spaceEvenly,
children: [ children: [
Expanded( Expanded(
child: Container( child: Container(
color: color: Color(0xFF3D3D3D),
Color(0xFF3D3D3D),
height: 1, height: 1,
), ),
), ),
Padding( Padding(
padding: const EdgeInsets padding: const EdgeInsets.only(
.only( left: defaultPadding, right: defaultPadding),
left:
defaultPadding,
right:
defaultPadding),
child: Text( child: Text(
'Ou', 'Ou',
style: GoogleFonts style: GoogleFonts.plusJakartaSans(
.plusJakartaSans( color: Colors.white, fontWeight: FontWeight.bold),
color: Colors
.white,
fontWeight:
FontWeight
.bold),
), ),
), ),
Expanded( Expanded(
child: Container( child: Container(
height: 1, height: 1,
color: color: Color(0xFF3D3D3D),
Color(0xFF3D3D3D),
)), )),
], ],
), ),
), ),
SizedBox( SizedBox(height: defaultPadding),
height: defaultPadding), ConstrainedBox(
SignInButton( constraints: BoxConstraints(maxWidth: 540),
Buttons.Google, child: SizedBox(
text: "Login with Google", width: 300.sp,
onPressed: () {}, height: 50,
child: SignInButton(
Buttons.Google,
text: "Login with Google",
onPressed: signInWithGoogle,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(20))),
),
),
), ),
], ],
), ),

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

@ -1,8 +1,8 @@
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/services/AuthService.dart';
import 'package:justmusic/values/icons.dart'; import 'package:justmusic/values/icons.dart';
import '../components/profile_component.dart'; import '../components/profile_component.dart';
import '../components/setting_part_component.dart'; import '../components/setting_part_component.dart';
@ -20,10 +20,9 @@ class ProfileScreen extends StatefulWidget {
class _ProfileScreenState extends State<ProfileScreen> { class _ProfileScreenState extends State<ProfileScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Future<void> logout() async { void logout() {
print("cc"); MyApp.userViewModel.logout();
await FirebaseAuth.instance.signOut(); Navigator.of(context).push(routeWelcome());
Navigator.pushNamed(context, '/welcome');
} }
void _openHistoric() { void _openHistoric() {
@ -34,7 +33,40 @@ class _ProfileScreenState extends State<ProfileScreen> {
Navigator.of(context).push(routeUser(MyApp.userViewModel.userCurrent)); Navigator.of(context).push(routeUser(MyApp.userViewModel.userCurrent));
} }
void _openPassword() { 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()); Navigator.of(context).push(routePassword());
} }
@ -124,12 +156,12 @@ class _ProfileScreenState extends State<ProfileScreen> {
SettingPartComponent( SettingPartComponent(
icon: JustMusicIcon.password, icon: JustMusicIcon.password,
label: 'Modifier mon mot de passe', label: 'Modifier mon mot de passe',
action: _openPassword, action: openPassword,
), ),
const SettingPartComponent( SettingPartComponent(
icon: JustMusicIcon.trash, icon: JustMusicIcon.trash,
label: 'Supprimer mon compte', label: 'Supprimer mon compte',
action: null, action: openConfirmationDelete,
), ),
SettingPartComponent( SettingPartComponent(
icon: JustMusicIcon.cross, icon: JustMusicIcon.cross,

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

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

@ -1,7 +1,8 @@
import 'dart:async'; import 'dart:async';
import 'dart:ui'; import 'dart:ui';
import 'package:flutter/Material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/model/Music.dart'; import 'package:justmusic/model/Music.dart';
@ -21,6 +22,8 @@ class SearchSongScreen extends StatefulWidget {
class _SearchSongScreenState extends State<SearchSongScreen> { class _SearchSongScreenState extends State<SearchSongScreen> {
final ScrollController _scrollController = ScrollController(); final ScrollController _scrollController = ScrollController();
final TextEditingController _textEditingController = TextEditingController(); final TextEditingController _textEditingController = TextEditingController();
PageController controller = PageController();
bool isCollectionSelected = false;
int? playingIndex; int? playingIndex;
@ -81,6 +84,24 @@ 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 @override
void dispose() { void dispose() {
MyApp.audioPlayer.pause(); MyApp.audioPlayer.pause();
@ -124,7 +145,6 @@ class _SearchSongScreenState extends State<SearchSongScreen> {
child: SizedBox( child: SizedBox(
height: 40, height: 40,
child: TextField( child: TextField(
autofocus: true,
controller: _textEditingController, controller: _textEditingController,
keyboardAppearance: Brightness.dark, keyboardAppearance: Brightness.dark,
onEditingComplete: resetFullScreen, onEditingComplete: resetFullScreen,
@ -132,11 +152,15 @@ class _SearchSongScreenState extends State<SearchSongScreen> {
if (_textEditingController.text.isEmpty) { if (_textEditingController.text.isEmpty) {
fetchTrendingMusic(); fetchTrendingMusic();
} else { } else {
setState(() {
filteredData = [];
});
filteredData = await MyApp.musicViewModel.getMusicsWithNameOrArtistName(value); filteredData = await MyApp.musicViewModel.getMusicsWithNameOrArtistName(value);
setState(() { setState(() {
filteredData = filteredData; filteredData = filteredData;
}); });
} }
controller.animateTo(0, duration: Duration(milliseconds: 200), curve: Curves.easeIn);
}, },
cursorColor: Colors.white, cursorColor: Colors.white,
keyboardType: TextInputType.text, keyboardType: TextInputType.text,
@ -162,43 +186,229 @@ 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( Flexible(
child: ScrollConfiguration( child: PageView(
behavior: ScrollBehavior().copyWith(scrollbars: true), controller: controller,
child: ListView.builder( physics: BouncingScrollPhysics(),
physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast), onPageChanged: (index) {
controller: _scrollController, setState(() {
itemCount: filteredData.length, if (index == 1) {
itemBuilder: (context, index) { isCollectionSelected = true;
if (playingIndex == index) { } else {
return InkWell( isCollectionSelected = false;
onTap: () { }
widget.callback(filteredData[index]); });
}, },
child: Padding( children: [
padding: const EdgeInsets.symmetric(horizontal: 20), ScrollConfiguration(
child: MusicListComponent( behavior: ScrollBehavior().copyWith(scrollbars: true),
music: filteredData[index], child: ListView.builder(
playing: true, physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
callback: playMusic, controller: _scrollController,
index: index, 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,
)
],
), ),
)); );
} } else {
return InkWell( return ListView.builder(
onTap: () { physics: const BouncingScrollPhysics(decelerationRate: ScrollDecelerationRate.fast),
widget.callback(filteredData[index]); controller: _scrollController,
}, itemCount: snapshot.data?.length,
child: Padding( itemBuilder: (context, index) {
padding: const EdgeInsets.symmetric(horizontal: 20), if (playingIndex == index) {
child: MusicListComponent( return InkWell(
music: filteredData[index], onTap: () {
playing: false, widget.callback((snapshot.data?[index])!);
callback: playMusic, },
index: 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();
}
},
),
)
],
)) ))
], ],
), ),

@ -1,8 +1,5 @@
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/Material.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -146,10 +143,11 @@ class _UserScreenState extends State<UserScreen> {
padding: const EdgeInsets.symmetric(horizontal: settingPadding), padding: const EdgeInsets.symmetric(horizontal: settingPadding),
child: Column( child: Column(
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
Padding( Container(
padding: EdgeInsets.only(top: 68.h, bottom: 40), padding: EdgeInsets.only(top: 68.h, bottom: 40),
constraints: const BoxConstraints( maxWidth: 500),
child: Stack( child: Stack(
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
@ -252,7 +250,11 @@ class _UserScreenState extends State<UserScreen> {
SizedBox( SizedBox(
height: 40, height: 40,
), ),
RecapComponent(user: widget.user) Container(
constraints: const BoxConstraints( maxWidth: 500),
child: RecapComponent(user: widget.user),
)
], ],
), ),
), ),

@ -2,7 +2,7 @@ import 'dart:async';
import 'package:auto_size_text/auto_size_text.dart'; import 'package:auto_size_text/auto_size_text.dart';
import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter/Material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart'; import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/main.dart'; import 'package:justmusic/main.dart';

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

@ -2,44 +2,54 @@ import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart'; import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/foundation.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'; import '../main.dart';
class AuthService { class AuthService {
register(String pseudo, String email, String password) async { 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 {
try { try {
var token;
final data = await FirebaseAuth.instance.createUserWithEmailAndPassword( final data = await FirebaseAuth.instance.createUserWithEmailAndPassword(
email: email, email: email,
password: password, 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) { } on FirebaseAuthException catch (e) {
if (e.code == 'weak-password') { if (e.code == 'weak-password') {
throw ('Mot de passe trop court'); throw ('Mot de passe trop court');
@ -52,6 +62,30 @@ 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 { Future<String> generateUniqueId(String pseudo) async {
String uniqueId = '$pseudo#0001'; String uniqueId = '$pseudo#0001';
int suffix = 1; int suffix = 1;
@ -86,13 +120,20 @@ class AuthService {
} }
} }
void signOut() async { signOut() async {
await FirebaseAuth.instance.signOut(); await FirebaseAuth.instance.signOut();
if (!kIsWeb) {
final GoogleSignIn googleSignIn = GoogleSignIn();
if (await googleSignIn.isSignedIn()) {
await googleSignIn.signOut();
}
}
} }
Future<void> delete() async { Future<void> delete() async {
try { try {
User? currentUser = FirebaseAuth.instance.currentUser; User? currentUser = FirebaseAuth.instance.currentUser;
String? id = currentUser?.uid;
await MyApp.db await MyApp.db
.collection("users") .collection("users")
.doc(currentUser?.uid) .doc(currentUser?.uid)
@ -101,6 +142,35 @@ class AuthService {
.catchError( .catchError(
(error) => print("Error deleting user from Firestore: $error")); (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 currentUser?.delete();
await FirebaseAuth.instance.signOut(); await FirebaseAuth.instance.signOut();
} on FirebaseAuthException catch (e) { } on FirebaseAuthException catch (e) {

@ -0,0 +1,33 @@
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,6 +15,16 @@ class CommentService {
await MyApp.db.collection("comments").add(comment); 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( Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getCommentsByPostId(
String id) async { String id) async {
var response = await FirebaseFirestore.instance var response = await FirebaseFirestore.instance

@ -38,7 +38,7 @@ class GeoApi {
Position position = await Geolocator.getCurrentPosition( Position position = await Geolocator.getCurrentPosition(
desiredAccuracy: LocationAccuracy.high); desiredAccuracy: LocationAccuracy.high);
String apiUrl = String apiUrl =
'http://api.openweathermap.org/data/2.5/find?lat=${position.latitude}&lon=${position.longitude}&cnt=10&appid=$apiKey'; 'https://api.openweathermap.org/data/2.5/find?lat=${position.latitude}&lon=${position.longitude}&cnt=10&appid=$apiKey';
var response = await http.get(Uri.parse(apiUrl)); var response = await http.get(Uri.parse(apiUrl));
if (response.statusCode == 200) { if (response.statusCode == 200) {
var data = json.decode(response.body); var data = json.decode(response.body);

@ -7,38 +7,28 @@ class MusicService {
Future<dynamic> getFavoriteMusicsByUserId(String id) async { Future<dynamic> getFavoriteMusicsByUserId(String id) async {
var response = await FirebaseFirestore.instance.collection("users").doc(id).get(); var response = await FirebaseFirestore.instance.collection("users").doc(id).get();
if (response.exists) { if (response.exists) {
var musicFavorite = response.get("musics_likes"); var musicFavorite = response.get("saved_musics");
return List.from(musicFavorite); return List.from(musicFavorite);
} else { } else {
return []; return [];
} }
} }
deleteFavoriteMusic(String id) async {
var userRef = await FirebaseFirestore.instance.collection("users").doc(MyApp.userViewModel.userCurrent.id);
var response = await userRef.get();
List<dynamic> musicFavorite = List.from(response.get("musics_likes"));
if (!musicFavorite.contains(id)) {
musicFavorite.remove(id);
await userRef.update({"musics_likes": musicFavorite});
} else {
print("Delete error: The music is not in the user's favorite music list");
}
}
Future<bool> addOrDeleteFavoriteMusic(String id) async { Future<bool> addOrDeleteFavoriteMusic(String id) async {
var userRef = await FirebaseFirestore.instance.collection("users").doc(MyApp.userViewModel.userCurrent.id); var userRef = await FirebaseFirestore.instance.collection("users").doc(MyApp.userViewModel.userCurrent.id);
var response = await userRef.get(); var response = await userRef.get();
List<dynamic> musicFavorite = List.from(response.get("musics_likes")); List<String> musicFavorite = List.from(response.get("musics_likes"));
if (!musicFavorite.contains(id)) { if (!musicFavorite.contains(id)) {
musicFavorite.add(id); musicFavorite.add(id);
await userRef.update({"musics_likes": musicFavorite}); await userRef.update({"musics_likes": musicFavorite});
MyApp.userViewModel.userCurrent.musicsLikes.add(id);
return false; return false;
} else { } else {
musicFavorite.remove(id); musicFavorite.remove(id);
await userRef.update({"musics_likes": musicFavorite}); await userRef.update({"musics_likes": musicFavorite});
MyApp.userViewModel.userCurrent.musicsLikes.remove(id);
return true; return true;
} }
} }
@ -47,7 +37,7 @@ class MusicService {
List<Tuple2<int, String>> capsules = []; List<Tuple2<int, String>> capsules = [];
var querySnapshot = await FirebaseFirestore.instance var querySnapshot = await FirebaseFirestore.instance
.collection('posts') .collection('capsules')
.where('user_id', isEqualTo: idUser) .where('user_id', isEqualTo: idUser)
.where('date', isGreaterThanOrEqualTo: DateTime(year, month)) .where('date', isGreaterThanOrEqualTo: DateTime(year, month))
.where('date', isLessThan: DateTime(year, month + 1)) .where('date', isLessThan: DateTime(year, month + 1))

@ -34,6 +34,16 @@ class NotificationService {
sendNotifyComment(String token, String text) async { sendNotifyComment(String token, String text) async {
var pseudo = MyApp.userViewModel.userCurrent.pseudo; var pseudo = MyApp.userViewModel.userCurrent.pseudo;
await sendPushMessage(token, "Nouveau message de $pseudo", "$text\"."); await sendPushMessage(token, "$pseudo a commenté votre capsule", "$text");
}
sendNotifyLike(String token, int nbLikes) async {
var pseudo = MyApp.userViewModel.userCurrent.pseudo;
await sendPushMessage(token, "$pseudo a aimé votre capsule", "Votre capsule a été aimé $nbLikes fois.");
}
sendNotifyFriend(String token) async {
var pseudo = MyApp.userViewModel.userCurrent.pseudo;
await sendPushMessage(token, "$pseudo vous suit.", "Il pourra à présent voir votre activité dans son Feed \"Mes Amis\".");
} }
} }

@ -7,7 +7,8 @@ import 'package:firebase_storage/firebase_storage.dart';
import '../main.dart'; import '../main.dart';
class PostService { class PostService {
createPost(String? description, String idMusic, File? image, Tuple2<String, String>? location) async { createPost(String? description, String idMusic, File? image,
Tuple2<String, String>? location) async {
var id = MyApp.userViewModel.userCurrent.id; var id = MyApp.userViewModel.userCurrent.id;
final post = <String, dynamic>{ final post = <String, dynamic>{
"user_id": id, "user_id": id,
@ -15,13 +16,22 @@ class PostService {
"date": DateTime.now(), "date": DateTime.now(),
"place": [location?.item1, location?.item2], "place": [location?.item1, location?.item2],
"song_id": idMusic, "song_id": idMusic,
"likes": 0 "likes": []
}; };
var postAdd = await MyApp.db.collection("posts").add(post); var postAdd = await MyApp.db.collection("posts").add(post);
var userRef = MyApp.db.collection("users").doc(id); var userRef = MyApp.db.collection("users").doc(id);
var capsule = {
"user_id": id,
"date": DateTime.now(),
"place": [location?.item1, location?.item2],
"song_id": idMusic,
};
await MyApp.db.collection("capsules").doc(postAdd.id).set(capsule);
await MyApp.db.runTransaction((transaction) async { await MyApp.db.runTransaction((transaction) async {
var userSnapshot = await transaction.get(userRef); var userSnapshot = await transaction.get(userRef);
if (userSnapshot.exists) { if (userSnapshot.exists) {
@ -41,16 +51,19 @@ class PostService {
deletePost() {} deletePost() {}
Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getPopularPosts({int limit = 10, int offset = 0}) async { Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getPopularPosts(int limit) async {
DateTime twentyFourHoursAgo = DateTime.now().subtract(Duration(hours: 24)); DateTime twentyFourHoursAgo = DateTime.now().subtract(Duration(hours: 24));
Timestamp twentyFourHoursAgoTimestamp = Timestamp.fromDate(twentyFourHoursAgo); var response = await FirebaseFirestore.instance
QuerySnapshot<Map<String, dynamic>> response = await FirebaseFirestore.instance
.collection("posts") .collection("posts")
.where("date", isGreaterThan: twentyFourHoursAgoTimestamp) .where("date", isGreaterThan: twentyFourHoursAgo)
.orderBy("date", descending: true)
.limit(limit) .limit(limit)
.get(); .get();
MyApp.postViewModel.lastPostDiscovery = response.docs.isNotEmpty
? response.docs.last
: MyApp.postViewModel.lastPostDiscovery;
var filteredPosts = response.docs.where((doc) { var filteredPosts = response.docs.where((doc) {
String user = doc["user_id"]; String user = doc["user_id"];
return user != MyApp.userViewModel.userCurrent.id; return user != MyApp.userViewModel.userCurrent.id;
@ -58,60 +71,111 @@ class PostService {
return filteredPosts; return filteredPosts;
} }
Timestamp _getTwentyFourHoursAgoTimestamp() { Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getMorePopularPosts(int limit) async {
DateTime twentyFourHoursAgo = DateTime.now().subtract(Duration(hours: 24)); DateTime twentyFourHoursAgo = DateTime.now().subtract(Duration(hours: 24));
return Timestamp.fromDate(twentyFourHoursAgo); QuerySnapshot<Map<String, dynamic>> response;
response = await FirebaseFirestore.instance
.collection("posts")
.where("date", isGreaterThan: twentyFourHoursAgo)
.orderBy("date", descending: true)
.limit(limit)
.startAfterDocument(MyApp.postViewModel.lastPostDiscovery)
.get();
MyApp.postViewModel.lastPostDiscovery = response.docs.isNotEmpty
? response.docs.last
: MyApp.postViewModel.lastPostDiscovery;
var filteredPosts = response.docs.where((doc) {
String user = doc["user_id"];
return user != MyApp.userViewModel.userCurrent.id;
}).toList();
return filteredPosts;
} }
Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getPostsFriends({int limit = 10, int offset = 0}) async { Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getPostsFriends(int limit) async {
var timestamp = _getTwentyFourHoursAgoTimestamp();
var response = await FirebaseFirestore.instance var response = await FirebaseFirestore.instance
.collection("posts") .collection("posts")
.where("user_id", whereIn: MyApp.userViewModel.userCurrent.followed) .where("user_id", whereIn: [
.where("date", isGreaterThan: timestamp) MyApp.userViewModel.userCurrent.id,
.orderBy("date") ...MyApp.userViewModel.userCurrent.followed
])
.where("")
.orderBy("date", descending: true)
.limit(limit) .limit(limit)
.get(); .get();
MyApp.postViewModel.lastPostFriend = response.docs.isNotEmpty
? response.docs.last
: MyApp.postViewModel.lastPostFriend;
return response.docs;
}
Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getMorePostsFriends(int limit) async {
var response = await FirebaseFirestore.instance
.collection("posts")
.where("user_id", whereIn: [
MyApp.userViewModel.userCurrent.id,
...MyApp.userViewModel.userCurrent.followed
])
.orderBy("date", descending: true)
.limit(limit)
.startAfterDocument(MyApp.postViewModel.lastPostFriend)
.get();
MyApp.postViewModel.lastPostFriend = response.docs.isNotEmpty
? response.docs.last
: MyApp.postViewModel.lastPostFriend;
return response.docs; return response.docs;
} }
Future<bool> getAvailable(String idUser) async { Future<bool> getAvailable(String idUser) async {
DateTime today = DateTime.now(); DateTime today = DateTime.now();
QuerySnapshot<Map<String, dynamic>> response = QuerySnapshot<Map<String, dynamic>> response = await FirebaseFirestore
await FirebaseFirestore.instance.collection("posts").where("user_id", isEqualTo: idUser).get(); .instance
.collection("posts")
.where("user_id", isEqualTo: idUser)
.get();
bool isTodayAvailable = response.docs.any((doc) { bool isTodayAvailable = response.docs.any((doc) {
DateTime date = doc["date"].toDate(); // Assuming the field name is "date" DateTime date = doc["date"].toDate();
return date.day == today.day && date.month == today.month && date.year == today.year; return date.day == today.day &&
date.month == today.month &&
date.year == today.year;
}); });
return !isTodayAvailable; return !isTodayAvailable;
} }
Future<List<bool>> recapSevenDays(String id) async { Future<List<String>> getLikesByPostId(String id) async {
List<bool> recapList = []; var response =
await FirebaseFirestore.instance.collection("posts").doc(id).get();
DateTime sevenDaysAgo = DateTime.now().subtract(Duration(days: 6)); if (response.exists) {
var musicFavorite = response.get("likes");
QuerySnapshot<Map<String, dynamic>> response = return List.from(musicFavorite);
await FirebaseFirestore.instance.collection("posts").where("user_id", isEqualTo: id).get(); } else {
return [];
List<Map<String, dynamic>?> postList =
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 postExists = postList.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(postExists);
} }
}
return recapList; Future<bool> addOrDeleteFavoritePost(String id) async {
final idUser = MyApp.userViewModel.userCurrent.id;
var postRef = await FirebaseFirestore.instance.collection("posts").doc(id);
var response = await postRef.get();
List<String> likes = List.from(response.get("likes"));
if (!likes.contains(idUser)) {
likes.add(idUser);
await postRef.update({"likes": likes});
return false;
} else {
likes.remove(idUser);
await postRef.update({"likes": likes});
return true;
}
} }
} }

@ -13,7 +13,7 @@ const bgTextField = Color(0xFF1C1B23);
const strokeTextField = Color(0xFF373546); const strokeTextField = Color(0xFF373546);
const unactiveFeed = Color(0xFF848484); const unactiveFeed = Color(0xFF848484);
const gradiantPost = Color(0xFF0D0D0D); const gradiantPost = Color(0xFF0D0D0D);
const bgModal = Color(0xFF1E1E1E); const bgModal = Color(0xFF222222);
const textFieldMessage = Color(0xFF232323); const textFieldMessage = Color(0xFF232323);
const bgComment = Color(0xFF222222); const bgComment = Color(0xFF222222);
const bgAppBar = Color(0xFF181818); const bgAppBar = Color(0xFF181818);
@ -24,6 +24,7 @@ const searchBarColor = Color(0xFF161616);
const postbutton = Color(0xFF1B1B1B); const postbutton = Color(0xFF1B1B1B);
const fillButton = Color(0xFF633AF4); const fillButton = Color(0xFF633AF4);
const selectedButton = Color(0xFF1F1B2E); const selectedButton = Color(0xFF1F1B2E);
const tooltipBackground = Color(0xFF2D2D2D);
// All constants important too us // All constants important too us
const defaultPadding = 30.0; const defaultPadding = 30.0;

@ -3,6 +3,7 @@ import 'dart:convert';
import 'package:justmusic/view_model/TokenSpotify.dart'; import 'package:justmusic/view_model/TokenSpotify.dart';
import 'package:http/http.dart' as http; import 'package:http/http.dart' as http;
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
import '../main.dart';
import '../model/Artist.dart'; import '../model/Artist.dart';
import '../model/Music.dart'; import '../model/Music.dart';
import '../services/MusicService.dart'; import '../services/MusicService.dart';
@ -210,7 +211,12 @@ class MusicViewModel {
Future<List<Music>> getFavoriteMusicsByUserId(String id) async { Future<List<Music>> getFavoriteMusicsByUserId(String id) async {
try { try {
var idMusics = await _musicService.getFavoriteMusicsByUserId(id); List<String> idMusics = [];
if (id == MyApp.userViewModel.userCurrent.id) {
idMusics = MyApp.userViewModel.userCurrent.musicsLikes;
} else {
idMusics = await _musicService.getFavoriteMusicsByUserId(id);
}
return await getMusicsWithIds(idMusics); return await getMusicsWithIds(idMusics);
} catch (e) { } catch (e) {
print(e); print(e);
@ -235,9 +241,13 @@ class MusicViewModel {
var musics = await getMusicsWithIds(capsulesData.map((capsule) => capsule.item2).toList()); var musics = await getMusicsWithIds(capsulesData.map((capsule) => capsule.item2).toList());
for (var capsule in capsulesData) { for (var capsule in capsulesData) {
var music = musics.firstWhere((music) => music.id == capsule.item2); var music = musics.firstWhere(
print(capsule.item1); (music) => music.id == capsule.item2,
capsules.add(Tuple2(capsule.item1, music)); orElse: () => Music("-1", "", "", "", 0, 0, false, []),
);
if (music.id != "-1")
capsules.add(Tuple2(capsule.item1, music));
} }
return capsules; return capsules;
} catch (e) { } catch (e) {

@ -1,6 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'package:justmusic/model/Post.dart'; import 'package:justmusic/model/Post.dart';
import 'package:justmusic/services/CapsuleService.dart';
import 'package:justmusic/services/PostService.dart'; import 'package:justmusic/services/PostService.dart';
import 'package:tuple/tuple.dart'; import 'package:tuple/tuple.dart';
@ -11,7 +12,10 @@ import '../model/mapper/PostMapper.dart';
class PostViewModel { class PostViewModel {
List<Post> _postsFriends = []; List<Post> _postsFriends = [];
List<Post> _bestPosts = []; List<Post> _bestPosts = [];
var lastPostFriend;
var lastPostDiscovery;
final PostService _postService = PostService(); final PostService _postService = PostService();
final CapsuleService _capsuleService = CapsuleService();
// Constructor // Constructor
PostViewModel(); PostViewModel();
@ -22,15 +26,14 @@ class PostViewModel {
List<Post> get bestPosts => _bestPosts; List<Post> get bestPosts => _bestPosts;
// Methods // Methods
addPost(String? description, String idMusic, File? image, addPost(String? description, String idMusic, File? image, Tuple2<String, String>? location) async {
Tuple2<String, String>? location) async {
await _postService.createPost(description, idMusic, image, location); await _postService.createPost(description, idMusic, image, location);
} }
Future<List<Post>> getPostsFriends() async { Future<List<Post>> getPostsFriends({int limit = 10}) async {
try { try {
_postsFriends = []; _postsFriends = [];
var responseData = await _postService.getPostsFriends(); var responseData = await _postService.getPostsFriends(limit);
List<String> ids = []; List<String> ids = [];
var postsFutures = responseData.map((value) { var postsFutures = responseData.map((value) {
ids.add(value.data()["song_id"]); ids.add(value.data()["song_id"]);
@ -41,7 +44,7 @@ class PostViewModel {
for (int i = 0; i < posts.length; i++) { for (int i = 0; i < posts.length; i++) {
posts[i].music = musics[i]; posts[i].music = musics[i];
} }
_postsFriends = posts; _postsFriends.addAll(posts);
return _postsFriends; return _postsFriends;
} catch (e) { } catch (e) {
print(e); print(e);
@ -50,13 +53,29 @@ class PostViewModel {
} }
} }
List<Post> getMorePostsFriends() { void getMorePostsFriends({int limit = 10}) async {
throw new Error(); try {
var responseData = await _postService.getMorePostsFriends(limit);
List<String> ids = [];
var postsFutures = responseData.map((value) {
ids.add(value.data()["song_id"]);
return PostMapper.toModel(value);
}).toList();
var posts = await Future.wait(postsFutures);
List<Music> musics = await MyApp.musicViewModel.getMusicsWithIds(ids);
for (int i = 0; i < posts.length; i++) {
posts[i].music = musics[i];
}
_postsFriends.addAll(posts);
} catch (e) {
print(e);
}
} }
Future<List<Post>> getBestPosts() async { Future<List<Post>> getBestPosts({int limit = 10}) async {
try { try {
var responseData = await _postService.getPopularPosts(); _bestPosts = [];
var responseData = await _postService.getPopularPosts(limit);
List<String> ids = []; List<String> ids = [];
var postsFutures = responseData.map((value) async { var postsFutures = responseData.map((value) async {
ids.add(value.data()["song_id"]); ids.add(value.data()["song_id"]);
@ -67,7 +86,7 @@ class PostViewModel {
for (int i = 0; i < posts.length; i++) { for (int i = 0; i < posts.length; i++) {
posts[i].music = musics[i]; posts[i].music = musics[i];
} }
_bestPosts = posts; _bestPosts.addAll(posts);
return _bestPosts; return _bestPosts;
} catch (e) { } catch (e) {
print(e); print(e);
@ -76,13 +95,28 @@ class PostViewModel {
} }
} }
List<Post> getMoreBestPosts() { void getMoreBestPosts({int limit = 10}) async {
throw new Error(); try {
var responseData = await _postService.getMorePopularPosts(limit);
List<String> ids = [];
var postsFutures = responseData.map((value) async {
ids.add(value.data()["song_id"]);
return await PostMapper.toModel(value);
}).toList();
var posts = await Future.wait(postsFutures);
List<Music> musics = await MyApp.musicViewModel.getMusicsWithIds(ids);
for (int i = 0; i < posts.length; i++) {
posts[i].music = musics[i];
}
_bestPosts.addAll(posts);
} catch (e) {
print(e);
}
} }
Future<List<bool>> recapSevenDays(String id) async { Future<List<bool>> recapSevenDays(String id) async {
try { try {
return await _postService.recapSevenDays(id); return await _capsuleService.recapSevenDays(id);
} catch (e) { } catch (e) {
print(e); print(e);
rethrow; rethrow;
@ -91,11 +125,29 @@ class PostViewModel {
Future<bool> getAvailable() async { Future<bool> getAvailable() async {
try { try {
return await _postService return await _postService.getAvailable(MyApp.userViewModel.userCurrent.id);
.getAvailable(MyApp.userViewModel.userCurrent.id);
} catch (e) { } catch (e) {
print(e); print(e);
rethrow; rethrow;
} }
} }
Future<List<String>> getLikesByPostId(String id) async {
try {
return await _postService.getLikesByPostId(id);
} catch (e) {
print(e);
rethrow;
}
}
Future<bool> addOrDeleteFavoritePost(String id) async {
try {
var bool = await _postService.addOrDeleteFavoritePost(id);
print(bool);
return bool;
} catch (e) {
rethrow;
}
}
} }

@ -12,7 +12,7 @@ import '../main.dart';
class UserViewModel { class UserViewModel {
late User _userCurrent; late User _userCurrent;
final AuthService authService = AuthService(); final AuthService _authService = AuthService();
final UserService _userService = UserService(); final UserService _userService = UserService();
User get userCurrent => _userCurrent; User get userCurrent => _userCurrent;
@ -33,17 +33,9 @@ class UserViewModel {
login(String pseudo, String password) async { login(String pseudo, String password) async {
try { try {
var token; await _authService.login(pseudo, password);
await authService.login(pseudo, password);
if (firebase_auth.FirebaseAuth.instance.currentUser!.emailVerified) { if (firebase_auth.FirebaseAuth.instance.currentUser!.emailVerified) {
await updateUserCurrent(); await updateUserCurrent();
if (!kIsWeb) {
token = await FirebaseMessaging.instance.getToken();
if (_userCurrent.token != token) {
_userService.updateTokenNotify(_userCurrent.id, token);
_userCurrent.token = token;
}
}
} else { } else {
throw ("Le mail n'a pas encore été vérifié"); throw ("Le mail n'a pas encore été vérifié");
} }
@ -62,6 +54,14 @@ class UserViewModel {
final user = await MyApp.db.collection("users").doc(firebase_auth.FirebaseAuth.instance.currentUser?.uid).get(); final user = await MyApp.db.collection("users").doc(firebase_auth.FirebaseAuth.instance.currentUser?.uid).get();
User data = UserMapper.toModel(user); User data = UserMapper.toModel(user);
_userCurrent = data; _userCurrent = data;
if (!kIsWeb) {
var token;
token = await FirebaseMessaging.instance.getToken();
if (_userCurrent.token != token) {
_userService.updateTokenNotify(_userCurrent.id, token);
_userCurrent.token = token;
}
}
} catch (e) { } catch (e) {
print(e); print(e);
} }
@ -73,13 +73,23 @@ class UserViewModel {
} }
try { try {
await authService.register(pseudo.toLowerCase(), email, password); await _authService.register(pseudo.toLowerCase(), email, password);
await updateUserCurrent(); await updateUserCurrent();
} catch (e) { } catch (e) {
rethrow; rethrow;
} }
} }
signInWithGoogle() async {
try {
await _authService.signInWithGoogle();
await updateUserCurrent();
} catch (e) {
print(e);
rethrow;
}
}
Future<List<User>> getUsersByUniqueId(String uniqueId) async { Future<List<User>> getUsersByUniqueId(String uniqueId) async {
try { try {
var response = await _userService.getUsersByIdUnique(uniqueId.toLowerCase()); var response = await _userService.getUsersByIdUnique(uniqueId.toLowerCase());
@ -101,12 +111,12 @@ class UserViewModel {
} }
} }
logout() { logout() async {
authService.signOut(); await _authService.signOut();
} }
delete() { delete() async {
authService.delete(); await _authService.delete();
} }
bool isFriend(String id) { bool isFriend(String id) {

@ -61,58 +61,58 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: audioplayers name: audioplayers
sha256: "61583554386721772f9309f509e17712865b38565a903c761f96b1115a979282" sha256: c05c6147124cd63e725e861335a8b4d57300b80e6e92cea7c145c739223bbaef
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.1.0" version: "5.2.1"
audioplayers_android: audioplayers_android:
dependency: transitive dependency: transitive
description: description:
name: audioplayers_android name: audioplayers_android
sha256: dbdc9b7f2aa2440314c638aa55aadd45c7705e8340d5eddf2e3fb8da32d4ae2c sha256: b00e1a0e11365d88576320ec2d8c192bc21f1afb6c0e5995d1c57ae63156acb5
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.0.2" version: "4.0.3"
audioplayers_darwin: audioplayers_darwin:
dependency: transitive dependency: transitive
description: description:
name: audioplayers_darwin name: audioplayers_darwin
sha256: "6aea96df1d12f7ad5a71d88c6d1b22a216211a9564219920124c16768e456e9d" sha256: "3034e99a6df8d101da0f5082dcca0a2a99db62ab1d4ddb3277bed3f6f81afe08"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.1.0" version: "5.0.2"
audioplayers_linux: audioplayers_linux:
dependency: transitive dependency: transitive
description: description:
name: audioplayers_linux name: audioplayers_linux
sha256: "396b62ac62c92dd26c3bc5106583747f57a8b325ebd2b41e5576f840cfc61338" sha256: "60787e73fefc4d2e0b9c02c69885402177e818e4e27ef087074cf27c02246c9e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.0" version: "3.1.0"
audioplayers_platform_interface: audioplayers_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: audioplayers_platform_interface name: audioplayers_platform_interface
sha256: f7daaed4659143094151ecf6bacd927d29ab8acffba98c110c59f0b81ae51143 sha256: "365c547f1bb9e77d94dd1687903a668d8f7ac3409e48e6e6a3668a1ac2982adb"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "5.0.1" version: "6.1.0"
audioplayers_web: audioplayers_web:
dependency: transitive dependency: transitive
description: description:
name: audioplayers_web name: audioplayers_web
sha256: ec84fd46eed1577148ed4113f5998a36a18da4fce7170c37ce3e21b631393339 sha256: "22cd0173e54d92bd9b2c80b1204eb1eb159ece87475ab58c9788a70ec43c2a62"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.1.0" version: "4.1.0"
audioplayers_windows: audioplayers_windows:
dependency: transitive dependency: transitive
description: description:
name: audioplayers_windows name: audioplayers_windows
sha256: "1d3aaac98a192b8488167711ba1e67d8b96333e8d0572ede4e2912e5bbce69a3" sha256: "9536812c9103563644ada2ef45ae523806b0745f7a78e89d1b5fb1951de90e1a"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.2" version: "3.1.0"
auto_size_text: auto_size_text:
dependency: "direct main" dependency: "direct main"
description: description:
@ -161,6 +161,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.3.0" version: "1.3.0"
checked_yaml:
dependency: transitive
description:
name: checked_yaml
sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff
url: "https://pub.dev"
source: hosted
version: "2.0.3"
circular_reveal_animation: circular_reveal_animation:
dependency: "direct main" dependency: "direct main"
description: description:
@ -169,6 +177,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.0.1" version: "2.0.1"
cli_util:
dependency: transitive
description:
name: cli_util
sha256: b8db3080e59b2503ca9e7922c3df2072cf13992354d5e944074ffa836fba43b7
url: "https://pub.dev"
source: hosted
version: "0.4.0"
clock: clock:
dependency: transitive dependency: transitive
description: description:
@ -205,10 +221,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.17.1" version: "1.18.0"
convert: convert:
dependency: transitive dependency: transitive
description: description:
@ -494,6 +510,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
flutter_launcher_icons:
dependency: "direct main"
description:
name: flutter_launcher_icons
sha256: "526faf84284b86a4cb36d20a5e45147747b7563d921373d4ee0559c54fcdbcea"
url: "https://pub.dev"
source: hosted
version: "0.13.1"
flutter_lints: flutter_lints:
dependency: "direct dev" dependency: "direct dev"
description: description:
@ -552,6 +576,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "9.2.0" version: "9.2.0"
fullscreen_window:
dependency: "direct main"
description:
name: fullscreen_window
sha256: fe3014f91bff16a82d142ba9d834980b8a84b4bb03347a92588d389ad92bd1d3
url: "https://pub.dev"
source: hosted
version: "1.0.4"
geolocator: geolocator:
dependency: "direct main" dependency: "direct main"
description: description:
@ -604,10 +636,58 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: google_fonts name: google_fonts
sha256: "6b6f10f0ce3c42f6552d1c70d2c28d764cf22bb487f50f66cca31dcd5194f4d6" sha256: f0b8d115a13ecf827013ec9fc883390ccc0e87a96ed5347a3114cac177ef18e8
url: "https://pub.dev"
source: hosted
version: "6.1.0"
google_identity_services_web:
dependency: transitive
description:
name: google_identity_services_web
sha256: "7940fdc3b1035db4d65d387c1bdd6f9574deaa6777411569c05ecc25672efacd"
url: "https://pub.dev"
source: hosted
version: "0.2.1"
google_sign_in:
dependency: "direct main"
description:
name: google_sign_in
sha256: aab6fdc41374014494f9e9026b9859e7309639d50a0bf4a2a412467a5ae4abc6
url: "https://pub.dev"
source: hosted
version: "6.1.4"
google_sign_in_android:
dependency: transitive
description:
name: google_sign_in_android
sha256: "8d60a787b29cb7d2bcf29230865f4a91f17323c6ac5b6b9027a6418e48d9ffc3"
url: "https://pub.dev"
source: hosted
version: "6.1.18"
google_sign_in_ios:
dependency: transitive
description:
name: google_sign_in_ios
sha256: "6ec0e13a4c5c646471b9f6a25ceb3ae76d339889d4c0f79b729bf0714215a63e"
url: "https://pub.dev"
source: hosted
version: "5.6.2"
google_sign_in_platform_interface:
dependency: transitive
description:
name: google_sign_in_platform_interface
sha256: e69553c0fc6a76216e9d06a8c3767e291ad9be42171f879aab7ab708569d4393
url: "https://pub.dev"
source: hosted
version: "2.4.1"
google_sign_in_web:
dependency: transitive
description:
name: google_sign_in_web
sha256: "69b9ce0e760945ff52337921a8b5871592b74c92f85e7632293310701eea68cc"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.0.4" version: "0.12.0+2"
gradiantbutton: gradiantbutton:
dependency: "direct main" dependency: "direct main"
description: description:
@ -628,10 +708,10 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: http name: http
sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.13.6" version: "1.1.0"
http_parser: http_parser:
dependency: transitive dependency: transitive
description: description:
@ -640,14 +720,22 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.0.2" version: "4.0.2"
image:
dependency: transitive
description:
name: image
sha256: a72242c9a0ffb65d03de1b7113bc4e189686fc07c7147b8b41811d0dd0e0d9bf
url: "https://pub.dev"
source: hosted
version: "4.0.17"
image_picker: image_picker:
dependency: "direct main" dependency: "direct main"
description: description:
name: image_picker name: image_picker
sha256: "6296e98782726d37f59663f0727d0e978eee1ced1ffed45ccaba591786a7f7b3" sha256: "7d7f2768df2a8b0a3cefa5ef4f84636121987d403130e70b17ef7e2cf650ba84"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.1" version: "1.0.4"
image_picker_android: image_picker_android:
dependency: transitive dependency: transitive
description: description:
@ -660,10 +748,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: image_picker_for_web name: image_picker_for_web
sha256: "869fe8a64771b7afbc99fc433a5f7be2fea4d1cb3d7c11a48b6b579eb9c797f0" sha256: "50bc9ae6a77eea3a8b11af5eb6c661eeb858fdd2f734c2a4fd17086922347ef7"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.2.0" version: "3.0.1"
image_picker_ios: image_picker_ios:
dependency: transitive dependency: transitive
description: description:
@ -736,6 +824,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.6.7" version: "0.6.7"
json_annotation:
dependency: transitive
description:
name: json_annotation
sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467
url: "https://pub.dev"
source: hosted
version: "4.8.1"
lints: lints:
dependency: transitive dependency: transitive
description: description:
@ -756,26 +852,26 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.12.15" version: "0.12.16"
material_color_utilities: material_color_utilities:
dependency: transitive dependency: transitive
description: description:
name: material_color_utilities name: material_color_utilities
sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.2.0" version: "0.5.0"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" sha256: a6e590c838b18133bb482a2745ad77c5bb7715fb0451209e1a7567d416678b8e
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.9.1" version: "1.10.0"
mime: mime:
dependency: transitive dependency: transitive
description: description:
@ -904,6 +1000,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "3.7.3" version: "3.7.3"
quiver:
dependency: transitive
description:
name: quiver
sha256: b1c1ac5ce6688d77f65f3375a9abb9319b3cb32486bdc7a1e0fdf004d7ba4e47
url: "https://pub.dev"
source: hosted
version: "3.2.1"
rxdart: rxdart:
dependency: transitive dependency: transitive
description: description:
@ -937,10 +1041,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.9.1" version: "1.10.0"
sqflite: sqflite:
dependency: transitive dependency: transitive
description: description:
@ -961,18 +1065,18 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: stack_trace name: stack_trace
sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.11.0" version: "1.11.1"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
name: stream_channel name: stream_channel
sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.1" version: "2.1.2"
string_scanner: string_scanner:
dependency: transitive dependency: transitive
description: description:
@ -1001,10 +1105,10 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b"
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "0.5.1" version: "0.6.1"
text_scroll: text_scroll:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1085,6 +1189,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.1.4" version: "2.1.4"
web:
dependency: transitive
description:
name: web
sha256: afe077240a270dcfd2aafe77602b4113645af95d0ad31128cc02bce5ac5d5152
url: "https://pub.dev"
source: hosted
version: "0.3.0"
win32: win32:
dependency: transitive dependency: transitive
description: description:
@ -1109,6 +1221,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.3.0" version: "6.3.0"
yaml:
dependency: transitive
description:
name: yaml
sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5"
url: "https://pub.dev"
source: hosted
version: "3.1.2"
zoom_tap_animation: zoom_tap_animation:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1118,5 +1238,5 @@ packages:
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
sdks: sdks:
dart: ">=3.0.0 <4.0.0" dart: ">=3.2.0-194.0.dev <4.0.0"
flutter: ">=3.10.0" flutter: ">=3.10.0"

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

Loading…
Cancel
Save