Compare commits

..

168 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
Lucas Delanier 3b9a39407d historic page
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 7b9f81b543 Merge branch 'master' into HISTORIC_CAPSULE_LDE
2 years ago
Lucas Delanier c725e355c7 historic page
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 4474c95247 Merge branch 'master' of https://codefirst.iut.uca.fr/git/justDEV/justMusic
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 6c80a6b1aa add function for get History Capsules
2 years ago
Lucas Delanier bb064697a0 Merge remote-tracking branch 'origin/master'
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 55294f9b8a perisst
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL d45a724d01 Merge pull request 'RESET_PASSWORD_EKA' (#52) from RESET_PASSWORD_EKA into master
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL cb1fbb43db Forgot password done
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL a96d17891f Forgot password done
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 8a561bd4ed change password
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier c2df7f2512 change password
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 7b8a9182dd change pp
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 552db38458 change % in top bar
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL c5e42a40ec Merge pull request 'VERIFY_MAIL_EKA' (#48) from VERIFY_MAIL_EKA into master
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier ddcfdc9d99 change % in top bar
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL d1565f7c2e UI Verify Screen done
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL f5721be47f page redirect
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 02dc68e458 Verify email done
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL ebc09e5969 add functions for update image and pseudo
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier ddf6bf8638 add icon
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 73789d9620 add icon
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
Emre KARTAL a7cb743f8b Merge pull request 'FAVORITE_MUSICS_EKA' (#45) from FAVORITE_MUSICS_EKA into master
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 1c53052523 Merge branch 'master' into FAVORITE_MUSICS_EKA
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL e738a92cfd Merge add and delete Favorite Music Functions
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier d67acfea4e add icon
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 9c3f3024cc Merge branch 'PROFIL_PAGE_LDE'
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 6ffe34bd4f add icon
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 95c90cc25a add icon
2 years ago
Lucas Delanier cff55c26ee add icon
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier adf3897417 add icon
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier eb551aefa9 recap component
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL c8b93c51cd Get, add and delete Favorite Musics done
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier b502084aff Merge branch 'master' into PROFIL_PAGE_LDE
2 years ago
Lucas Delanier 2e266b85c2 recap component
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 120735e0c6 Add functions recapSevenDays and sendNotifyComment
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 5125645e5c Merge remote-tracking branch 'origin/master'
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL 5672edc715 Add function for delete User
2 years ago
Lucas Delanier 43e0e279bd enfinnnnnnnnnn
continuous-integration/drone/push Build is passing Details
2 years ago
emre.kartal 46a11ded7c Merge branch 'NEW_REFRESH_LDE'
continuous-integration/drone/push Build is passing Details
2 years ago
Emre KARTAL fd9b015fa3 Merge pull request 'NOTIFICATION_EKA' (#42) from NOTIFICATION_EKA into master
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 10f2b967a8 enfinnnnnnnnnn
continuous-integration/drone/push Build is passing Details
2 years ago
Lucas Delanier 6396a8dba8 enfinnnnnnnnnn
continuous-integration/drone/push Build is passing Details
2 years ago

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

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

File diff suppressed because it is too large Load Diff

@ -1,26 +1,27 @@
<component name="libraryTable">
<library name="Dart SDK">
<CLASSES>
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/async" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/cli" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/collection" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/convert" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/core" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/developer" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/ffi" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/html" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/indexed_db" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/io" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/isolate" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/js" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/js_interop" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/js_util" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/math" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/mirrors" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/svg" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/typed_data" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/web_audio" />
<root url="file://$PROJECT_DIR$/../../../../src/flutter/bin/cache/dart-sdk/lib/web_gl" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/async" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/cli" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/collection" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/convert" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/core" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/developer" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/ffi" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/html" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/indexed_db" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/io" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/isolate" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/js" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/js_interop" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/js_interop_unsafe" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/js_util" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/math" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/mirrors" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/svg" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/typed_data" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/web_audio" />
<root url="file:///opt/homebrew/opt/dart/libexec/lib/web_gl" />
</CLASSES>
<JAVADOC />
<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; ![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é.
**Lien pour tester la version web:** [Just Music](https://justmusic-435d5.web.app) 🎶
## Répartition du Gitlab
La racine de notre gitlab est composé de deux dossier essentielles au projet:
[**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>
@ -45,10 +49,33 @@ La racine de notre gitlab est composé de deux dossier essentielles au projet:
## Fonctionnement
<div align = center>
<img src="Documentation/Images/Overview.png" />
</div>
### Feeds
Une fois authentifié vous aurez la possibilité de voir les posts capsules de vos amis, de voir les musiques qu'ils mettent en avant accompagner éventuellement d'une image, d'une description, de leurs localisations... (Vous n'avez pas d'amis, pas de soucis, cliquer seulement sur l'icon en haut a gauche de la page pour suivre nimporte quel personne que vous voulez), Mais aussi juste d'un simple mouvement du doigt swiper pour vous retrouvez sur la page Discovery où vous verrais les posts récents en tendance dans le monde 🌎
Amuser vous à cliquer sur les posts pour ecouter la music mais aussi connaître les détails et savoir qui a commenter 💬 et liker ❤️. Si la musique vous plaît enregistrer la et vous la retrouverez lorsque vous aurez envie de poster.
### Post
Pour participer à cette aventure musicale avec des gens du monde entier, cliquez simplement sur l'icône JustMusic. Gardez à l'esprit que vous ne pourrez poster qu'une fois par jour, donc réfléchissez bien à la musique que vous souhaitez mettre en avant. N'hésitez pas à ajouter une photo et une description pour rendre votre publication plus chaleureuse 😃.
### Profil
Consultez l'aperçu de votre profil pour savoir combien de personnes vous suivent et que vous suivez. Vous pouvez également voir le nombre de capsules que vous avez publiées, personnaliser les paramètres de votre compte selon vos préférences, et explorez votre historique de capsules pour vous remémorer vos précédentes publications 🎧.
#### Bonne aventure musicale 🎵🌟
## Deploiement
- [x] &nbsp; ![IOS](https://img.shields.io/badge/IOS-000?style=for-the-badge&logo=apple&logoColor=black&color=white)
- [x] &nbsp; ![Android](https://img.shields.io/badge/Android-000?style=for-the-badge&logo=android&logoColor=white&color=green)
- [x] &nbsp; ![Safari](https://img.shields.io/badge/Safari-000000.svg?style=for-the-badge&logo=Safari&logoColor=white)
## Techniciens
@ -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">
</a>
<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 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 href = "https://codefirst.iut.uca.fr/git/rayhan.hassou">
<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
.pub-cache/
.pub/
.lib/values/keys.dart
lib/values/keys.dart
/build/
# Symbolication related

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

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

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

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

@ -1,10 +1,9 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.justmusic">
package="com.justdev.justmusic">
<application
android:label="justmusic"
android:label="JustMUSIC"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher"
android:enableOnBackInvokedCallback="true">
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"

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

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<item android:drawable="@android:color/black" />
<!-- You can insert your own image assets here -->
<!-- <item>

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<item android:drawable="@android:color/black" />
<!-- You can insert your own image assets here -->
<!-- <item>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 544 B

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 442 B

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 721 B

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

@ -1,9 +1,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.justmusic">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 983 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 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"

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

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

@ -4,4 +4,7 @@
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</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>
<key>REVERSED_CLIENT_ID</key>
<string>com.googleusercontent.apps.994903990520-n6jd98ena56kb1tvtrd67tvb5et3nfbf</string>
<key>ANDROID_CLIENT_ID</key>
<string>994903990520-073l30b0afj0uq7apsvc8p8ukantpu6q.apps.googleusercontent.com</string>
<key>API_KEY</key>
<string>AIzaSyBbYqsR6t7JTi8_XFNEHd43IRuKlYGeI3U</string>
<key>GCM_SENDER_ID</key>

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

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

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

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

@ -10,17 +10,25 @@ class CommentComponent extends StatelessWidget {
final Comment comment;
const CommentComponent({Key? key, required this.comment}) : super(key: key);
String calculateTimeDifference(DateTime startDate) {
Duration difference = DateTime.now().difference(startDate);
if (difference.inDays > 0) {
return '${difference.inDays} jours';
} else if (difference.inHours > 0) {
return '${difference.inHours} heures';
} else if (difference.inMinutes > 0) {
return '${difference.inMinutes} minutes';
} else {
return '${difference.inSeconds} secondes';
}
}
@override
Widget build(BuildContext context) {
final now = DateTime.now();
final difference = now.difference(comment.date);
return Container(
width: double.infinity,
decoration: BoxDecoration(
color: bgComment.withOpacity(0.6),
borderRadius: BorderRadius.circular(15)),
decoration: BoxDecoration(color: bgComment.withOpacity(0.6), borderRadius: BorderRadius.circular(15)),
padding: EdgeInsets.fromLTRB(20, 10, 20, 10),
margin: EdgeInsets.only(bottom: 13),
child: Row(
@ -28,11 +36,15 @@ class CommentComponent extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start,
children: [
ClipOval(
child: SizedBox.fromSize(
// Image radius
child: Image(
image: NetworkImage(comment.user.pp),
child: SizedBox(
height: 40,
width: 40,
// Image radius
child: FadeInImage.assetNetwork(
image: comment.user.pp,
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
),
),
),
@ -49,17 +61,14 @@ class CommentComponent extends StatelessWidget {
),
Text(
comment.user.pseudo,
style: GoogleFonts.plusJakartaSans(
color: Colors.white, fontWeight: FontWeight.w600),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w600),
),
Padding(
padding: EdgeInsets.only(top: 6, left: 10),
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(
color: Colors.white.withOpacity(0.6),
fontWeight: FontWeight.w400,
fontSize: 10),
color: Colors.white.withOpacity(0.6), fontWeight: FontWeight.w400, fontSize: 10),
),
),
],
@ -71,10 +80,7 @@ class CommentComponent extends StatelessWidget {
padding: const EdgeInsets.symmetric(horizontal: 10),
child: Text(
comment.text,
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w400,
fontSize: 15),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w400, fontSize: 15),
),
),
],

@ -1,9 +1,9 @@
import 'dart:io';
import 'package:animated_appear/animated_appear.dart';
import 'package:auto_size_text/auto_size_text.dart';
import 'package:circular_reveal_animation/circular_reveal_animation.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/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
@ -62,6 +62,7 @@ class _EditablePostComponentState extends State<EditablePostComponent> with Tick
}
Future pickImage(ImageSource source) async {
try {
final image = await ImagePicker().pickImage(source: source, imageQuality: 20);
if (image == null) return;
@ -73,6 +74,7 @@ class _EditablePostComponentState extends State<EditablePostComponent> with Tick
} on PlatformException catch (e) {
print('Failed to pick image: $e');
}
}
void _updateDescription(String text) {
@ -143,13 +145,20 @@ class _EditablePostComponentState extends State<EditablePostComponent> with Tick
// implement image
child: widget.music == null
? Container(
color: grayColor,
width: double.infinity,
child: Center(
child: Icon(
Icons.headphones,
color: grayColor.withOpacity(0.4),
size: 150,
),
),
)
: Image(
image: NetworkImage(widget.music?.cover ?? ""),
: FadeInImage.assetNetwork(
image: widget.music!.cover!,
fit: BoxFit.cover,
width: double.infinity,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
),
),
),
@ -176,7 +185,10 @@ class _EditablePostComponentState extends State<EditablePostComponent> with Tick
borderRadius: BorderRadius.circular(20),
child: InstaImageViewer(
backgroundIsTransparent: true,
child: Image(
child: kIsWeb?InstaImageViewer(
backgroundIsTransparent: true,
child: Image.network(image!.path)
):Image(
image: FileImage(image!),
fit: BoxFit.cover,
),
@ -244,8 +256,8 @@ class _EditablePostComponentState extends State<EditablePostComponent> with Tick
width: double.infinity,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Expanded(
children: [ kIsWeb?Container()
:Expanded(
flex: 5,
child: GestureDetector(
onTap: () {
@ -256,7 +268,7 @@ class _EditablePostComponentState extends State<EditablePostComponent> with Tick
),
),
),
SizedBox(
kIsWeb?Container():SizedBox(
width: 15,
),
Expanded(
@ -279,6 +291,7 @@ class _EditablePostComponentState extends State<EditablePostComponent> with Tick
child: SizedBox(
width: double.infinity,
child: TextFormField(
keyboardType: TextInputType.text,
onChanged: (value) {
_updateDescription(value);
},

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

@ -0,0 +1,52 @@
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import '../values/constants.dart';
class LittleCapsule extends StatelessWidget {
final bool isEmpty;
final DateTime date;
const LittleCapsule({super.key, required this.isEmpty, required this.date});
@override
Widget build(BuildContext context) {
if (isEmpty) {
return Flexible(
child: Container(
constraints: BoxConstraints(maxWidth: 45, maxHeight: 45),
decoration: BoxDecoration(
color: searchBarColor,
borderRadius: BorderRadius.circular(5),
border: Border.all(color: Color(0xFF282828), width: 1),
),
child: const Center(
child: Icon(
Icons.rocket_launch,
color: Color(0xFF464646),
size: 18,
),
),
),
);
}
return Flexible(
child: Container(
constraints: BoxConstraints(maxWidth: 45, maxHeight: 45),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [bgModal, bgModal.withOpacity(0)],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
stops: [0, 1]),
borderRadius: BorderRadius.circular(5),
),
child: Center(
child: Text(
date.day.toString(),
style: GoogleFonts.plusJakartaSans(color: Color(0xFF464646), fontWeight: FontWeight.w800, fontSize: 17),
),
),
),
);
}
}

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

@ -1,4 +1,4 @@
import 'package:flutter/Material.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/components/play_button_component.dart';
import 'package:text_scroll/text_scroll.dart';
@ -28,12 +28,17 @@ class MusicListComponent extends StatelessWidget {
return ClipRRect(
borderRadius: BorderRadius.all(Radius.circular(5)),
child: music.cover != null
? FadeInImage.assetNetwork(
? SizedBox(
height: 60,
width: 60,
// Image radius
child: FadeInImage.assetNetwork(
image: music.cover!,
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
image: music.cover!)
),
)
: Container(
height: 60,
width: 60,
@ -41,8 +46,8 @@ class MusicListComponent extends StatelessWidget {
),
);
} else {
return Image(
image: AssetImage("assets/images/exemple_cover.png"),
return const Image(
image: AssetImage("assets/images/loadingPlaceholder.gif"),
height: 60,
width: 60,
);

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

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

@ -3,13 +3,14 @@ import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:gradient_borders/box_borders/gradient_box_border.dart';
import 'package:justmusic/components/profil_picture_component.dart';
import 'package:text_scroll/text_scroll.dart';
import 'package:zoom_tap_animation/zoom_tap_animation.dart';
import '../model/Post.dart';
class PostComponent extends StatefulWidget {
final Function(int)? callback;
final Function(Post)? callback;
final Post post;
final int index;
@ -28,6 +29,29 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
choice = !choice;
});
}
String formatPostDate(DateTime postDate) {
DateTime now = DateTime.now();
DateTime yesterday = DateTime(now.year, now.month, now.day - 1);
if (postDate.year == now.year && postDate.month == now.month && postDate.day == now.day) {
// Aujourd'hui
return "Aujourd'hui, ${postDate.hour}:${postDate.minute.toString().padLeft(2, '0')}";
} else if (postDate.year == yesterday.year && postDate.month == yesterday.month && postDate.day == yesterday.day) {
// Hier
return 'hier, ${postDate.hour}:${postDate.minute.toString().padLeft(2, '0')}';
} else {
// Autre date
return '${postDate.day} ${_getMonthAbbreviation(postDate.month)} ${postDate.hour}:${postDate.minute.toString().padLeft(2, '0')}';
}
}
String _getMonthAbbreviation(int month) {
const List<String> monthsAbbreviation = [
'janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.',
];
return monthsAbbreviation[month - 1];
}
@override
void initState() {
@ -38,27 +62,23 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
@override
Widget build(BuildContext context) {
var mins = "0";
if (widget.post.date.minute < 10) {
mins = "0${widget.post.date.minute}";
} else {
mins = widget.post.date.minute.toString();
}
return GestureDetector(
onTap: switchChoice,
child: LayoutBuilder(
builder: (BuildContext context, BoxConstraints constraints) {
if (widget.callback == null) {
return SizedBox(
child: SizedBox(
width: double.infinity,
child: Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
ClipOval(
child: SizedBox.fromSize(
// Image radius
child: Image(
image: NetworkImage(widget.post.user.pp),
width: 40,
),
),
),
ProfilPictureComponent(user: widget.post.user),
Expanded(
flex: 8,
child: Padding(
@ -89,211 +109,17 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
),
),
),
DateTime(today.year, today.month, today.day).isAtSameMomentAs(
DateTime(widget.post.date.year, widget.post.date.month, widget.post.date.day))
? Text(
"Aujourd'hui, ${widget.post.date.hour}:${widget.post.date.minute}",
style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13),
)
: Text(
"${widget.post.date.day}/${widget.post.date.month}/${widget.post.date.year}-${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),
ZoomTapAnimation(
onTap: () {
if (widget.post.selfie != null) {
switchChoice();
}
},
enableLongTapRepeatEvent: false,
longTapRepeatDuration: const Duration(milliseconds: 100),
begin: 1.0,
end: 0.99,
beginDuration: const Duration(milliseconds: 70),
endDuration: const Duration(milliseconds: 100),
beginCurve: Curves.decelerate,
endCurve: Curves.easeInOutSine,
child: AspectRatio(
aspectRatio: 1 / 1,
child: Container(
decoration: BoxDecoration(
// add border
border: const GradientBoxBorder(
gradient: LinearGradient(colors: [
Colors.transparent,
Color(0xFF323232),
], begin: Alignment.topCenter, end: Alignment.bottomCenter),
width: 2.5,
),
// set border radius
borderRadius: BorderRadius.circular(20),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(18),
// implement image
child: Stack(
alignment: Alignment.bottomCenter,
children: [
Image(
image: NetworkImage(choice ? widget.post.selfie! : widget.post.music.cover!),
fit: BoxFit.cover,
width: double.infinity,
),
widget.post.selfie != null
? Positioned(
top: 0,
right: 0,
child: Padding(
padding: EdgeInsets.all(12),
child: Container(
constraints: BoxConstraints(maxWidth: 140, maxHeight: 140),
width: 90.sp,
height: 90.sp,
decoration: BoxDecoration(
color: Colors.white,
// add border
border: Border.all(width: 3, color: Colors.white),
// set border radius
borderRadius: BorderRadius.circular(15),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(13),
// implement image
child: Image(
image: NetworkImage(
choice ? widget.post.music.cover! : widget.post.selfie!),
fit: BoxFit.cover,
),
),
),
))
: Container(),
],
),
),
),
)),
SizedBox(height: 15),
Row(
crossAxisAlignment: CrossAxisAlignment.end,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Flexible(
flex: 8,
child: TextScroll(
widget.post.music.artists.first.name!,
style: GoogleFonts.plusJakartaSans(
height: 1, color: Colors.white, fontWeight: FontWeight.w600, fontSize: 26.h),
mode: TextScrollMode.endless,
pauseBetween: Duration(milliseconds: 500),
velocity: Velocity(pixelsPerSecond: Offset(20, 0)),
)),
Padding(
padding: EdgeInsets.only(bottom: 10.h, right: 5.w, left: 5.w),
child: ClipOval(
child: Container(
width: 5.h,
height: 5.h,
color: Colors.white,
),
),
),
Expanded(
flex: 8,
child: Padding(
padding: EdgeInsets.only(bottom: 2),
child: TextScroll(
widget.post.music.title!,
style: GoogleFonts.plusJakartaSans(
height: 1, color: Colors.white, fontWeight: FontWeight.w300, fontSize: 16.h),
mode: TextScrollMode.endless,
velocity: Velocity(pixelsPerSecond: Offset(50, 20)),
pauseBetween: Duration(milliseconds: 500),
),
)),
Container(width: 10),
AutoSizeText(
widget.post.music.date.toString(),
style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.5), fontWeight: FontWeight.w300, fontSize: 16.h),
textAlign: TextAlign.end,
maxFontSize: 20,
),
],
),
],
));
}
return SizedBox(
width: double.infinity,
child: Column(
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
ClipOval(
child: SizedBox.fromSize(
// Image radius
child: Image(
image: NetworkImage(widget.post.user.pp),
width: 40,
),
),
),
Expanded(
flex: 8,
child: Padding(
padding: const EdgeInsets.only(left: 10),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
widget.post.user.pseudo,
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w600),
),
widget.post.location.item2 != null
? Text(
"${widget.post.location.item1}, ${widget.post.location.item2}",
style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.4),
fontWeight: FontWeight.w300,
fontSize: 13),
)
: Text(
"",
style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.4),
fontWeight: FontWeight.w300,
fontSize: 13),
)
],
),
),
),
DateTime(today.year, today.month, today.day).isAtSameMomentAs(
DateTime(widget.post.date.year, widget.post.date.month, widget.post.date.day))
? Text(
"Aujourd'hui, ${widget.post.date.hour}:${widget.post.date.minute}",
formatPostDate(widget.post.date),
style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13),
)
: Text(
"hier, ${widget.post.date.hour}:${widget.post.date.minute}",
style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.4), fontWeight: FontWeight.w300, fontSize: 13),
),
],
),
SizedBox(height: 10),
ZoomTapAnimation(
onTap: () {
widget.callback!(widget.index);
widget.callback!(widget.post);
},
enableLongTapRepeatEvent: false,
longTapRepeatDuration: const Duration(milliseconds: 100),
@ -324,10 +150,11 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
child: Stack(
alignment: Alignment.bottomCenter,
children: [
Image(
image: NetworkImage(widget.post.music.cover!),
fit: BoxFit.cover,
SizedBox(
width: double.infinity,
child: Image.network(
widget.post.music.cover!,
),
),
Image(
image: AssetImage("assets/images/shadow_post.png"),
@ -367,8 +194,8 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
child: ClipRRect(
borderRadius: BorderRadius.circular(13),
// implement image
child: Image(
image: NetworkImage(widget.post.selfie!),
child: Image.network(
widget.post.selfie!,
fit: BoxFit.cover,
),
),
@ -381,9 +208,7 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
),
)),
SizedBox(height: 15),
SizedBox(
height: 60,
child: Column(
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
@ -413,26 +238,17 @@ class _PostComponentState extends State<PostComponent> with TickerProviderStateM
),
],
),
Expanded(
flex: 8,
child: TextScroll(
TextScroll(
widget.post.music.artists.first.name!,
style: GoogleFonts.plusJakartaSans(
height: 1,
color: Colors.white.withOpacity(0.5),
fontWeight: FontWeight.w300,
fontSize: 16.h),
height: 1, color: Colors.white.withOpacity(0.5), fontWeight: FontWeight.w300, fontSize: 16.h),
mode: TextScrollMode.endless,
pauseBetween: Duration(milliseconds: 500),
velocity: Velocity(pixelsPerSecond: Offset(20, 0)),
)),
],
),
)
],
));
},
),
);
],
)));
}
}

@ -0,0 +1,35 @@
import 'package:flutter/material.dart';
import '../config/routes.dart';
import '../model/User.dart';
class ProfilPictureComponent extends StatelessWidget {
final User user;
const ProfilPictureComponent({super.key, required this.user});
void _openDetail(BuildContext context) {
print("cc");
Navigator.of(context).push(routeUser(user));
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () {
_openDetail(context);
},
child: ClipOval(
child: SizedBox(
height: 40,
width: 40,
// Image radius
child: FadeInImage.assetNetwork(
image: user.pp,
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
),
),
),
);
}
}

@ -19,12 +19,16 @@ class ProfileComponent extends StatelessWidget {
ClipOval(
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: 200, maxHeight: 200),
child: Image(
image: NetworkImage(user.pp),
height: 100.w,
child: SizedBox(
width: 100.w,
height: 100.w,
child: FadeInImage.assetNetwork(
image: user.pp,
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
),
),
)),
),
SizedBox(
height: 10,

@ -1,6 +1,7 @@
import 'package:flutter/Material.dart';
import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/components/profil_picture_component.dart';
import '../main.dart';
import '../model/User.dart';
import '../values/constants.dart';
@ -23,13 +24,7 @@ class _ProfileListComponentState extends State<ProfileListComponent> {
padding: const EdgeInsets.only(bottom: 5),
child: Row(
children: [
ClipOval(
child: FadeInImage.assetNetwork(
height: 50,
width: 50,
fit: BoxFit.cover,
placeholder: "assets/images/loadingPlaceholder.gif",
image: widget.user.pp)),
ProfilPictureComponent(user: widget.user),
const SizedBox(
width: 10,
),

@ -0,0 +1,124 @@
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import '../main.dart';
import '../model/User.dart' as justMusic;
import '../values/constants.dart';
import 'little_post_recap_component.dart';
class RecapComponent extends StatelessWidget {
final justMusic.User user;
const RecapComponent({super.key, required this.user});
Future<List<bool>>? _fetchdata() async {
return await MyApp.postViewModel.recapSevenDays(user.id);
}
@override
Widget build(BuildContext context) {
List<String> weekDays = ['L', 'M', 'M', 'J', 'V', 'S', 'D'];
DateTime currentDate = DateTime.now();
return Container(
decoration: BoxDecoration(
color: profileBttnColor,
borderRadius: BorderRadius.circular(10),
border: Border.all(color: grayColor, width: 1)),
height: 120,
clipBehavior: Clip.hardEdge,
child: Column(
children: [
Expanded(
child: Container(
padding: EdgeInsets.symmetric(horizontal: 10),
decoration: BoxDecoration(
color: postbutton,
borderRadius: BorderRadius.only(topRight: Radius.circular(10), topLeft: Radius.circular(10)),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Flexible(
child: Center(
child: Text(
weekDays[currentDate.subtract(Duration(days: 6)).weekday - 1].substring(0, 1),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w800, fontSize: 17),
),
)),
Flexible(
child: Center(
child: Text(
weekDays[currentDate.subtract(Duration(days: 5)).weekday - 1].substring(0, 1),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w800, fontSize: 17),
),
)),
Flexible(
child: Center(
child: Text(
weekDays[currentDate.subtract(Duration(days: 4)).weekday - 1].substring(0, 1),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w800, fontSize: 17),
),
)),
Flexible(
child: Center(
child: Text(
weekDays[currentDate.subtract(Duration(days: 3)).weekday - 1].substring(0, 1),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w800, fontSize: 17),
),
)),
Flexible(
child: Center(
child: Text(
weekDays[currentDate.subtract(Duration(days: 2)).weekday - 1].substring(0, 1),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w800, fontSize: 17),
),
)),
Flexible(
child: Center(
child: Text(
weekDays[currentDate.subtract(Duration(days: 1)).weekday - 1].substring(0, 1),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w800, fontSize: 17),
),
)),
Flexible(
child: Center(
child: Text(
weekDays[currentDate.subtract(Duration(days: 0)).weekday - 1].substring(0, 1),
style: GoogleFonts.plusJakartaSans(color: Colors.white, fontWeight: FontWeight.w800, fontSize: 17),
),
)),
],
),
)),
FutureBuilder<List<bool>>(
future: _fetchdata(), // a previously-obtained Future<String> or null
builder: (BuildContext context, AsyncSnapshot<List<bool>> snapshot) {
if (snapshot.hasData) {
return Padding(
padding: EdgeInsets.all(12),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
LittleCapsule(
isEmpty: snapshot.data![0],
date: currentDate.subtract(const Duration(days: 6)),
),
LittleCapsule(isEmpty: snapshot.data![1], date: currentDate.subtract(const Duration(days: 5))),
LittleCapsule(isEmpty: snapshot.data![2], date: currentDate.subtract(const Duration(days: 4))),
LittleCapsule(isEmpty: snapshot.data![3], date: currentDate.subtract(const Duration(days: 3))),
LittleCapsule(isEmpty: snapshot.data![4], date: currentDate.subtract(const Duration(days: 2))),
LittleCapsule(isEmpty: snapshot.data![5], date: currentDate.subtract(const Duration(days: 1))),
LittleCapsule(isEmpty: snapshot.data![6], date: currentDate.subtract(const Duration(days: 0))),
],
),
);
} else {
return Container();
}
}),
],
),
);
}
}

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

@ -9,7 +9,9 @@ class SettingPartComponent extends StatelessWidget {
final JustMusicIcon icon;
final String label;
final bool important;
const SettingPartComponent({Key? key, required this.icon, required this.label, this.important = false})
final VoidCallback? action;
const SettingPartComponent(
{Key? key, required this.icon, required this.label, this.important = false, required this.action})
: super(key: key);
@override
@ -24,11 +26,7 @@ class SettingPartComponent extends StatelessWidget {
color: important ? warningBttnColor : settingColor,
borderOnForeground: false,
child: InkWell(
onTap: () {
if (icon == JustMusicIcon.cross) {
logout();
}
},
onTap: action,
splashColor: Colors.transparent,
highlightColor: Colors.white.withOpacity(0.08),
child: Container(

@ -15,22 +15,19 @@ import '../values/constants.dart';
class TopNavBarComponent extends StatefulWidget {
final Function(bool) callback;
const TopNavBarComponent({Key? key, required this.callback})
: super(key: key);
final bool choice;
const TopNavBarComponent({Key? key, required this.callback, required this.choice}) : super(key: key);
@override
State<TopNavBarComponent> createState() => _TopNavBarComponentState();
}
class _TopNavBarComponentState extends State<TopNavBarComponent>
with TickerProviderStateMixin {
bool choice = true;
class _TopNavBarComponentState extends State<TopNavBarComponent> with TickerProviderStateMixin {
late bool choice;
bool isDismissed = true;
final DateTime midnight = DateTime(
DateTime.now().year, DateTime.now().month, DateTime.now().day + 1);
final DateTime midnight = DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day + 1);
void actionSurBouton(bool choice) async {
widget.callback(choice);
@ -49,8 +46,7 @@ class _TopNavBarComponentState extends State<TopNavBarComponent>
var now = tz.TZDateTime.now(franceTimeZone);
// Calculate the midnight time for the next day in France timezone
var midnight =
tz.TZDateTime(franceTimeZone, now.year, now.month, now.day + 1);
var midnight = tz.TZDateTime(franceTimeZone, now.year, now.month, now.day + 1);
bool res = await MyApp.postViewModel.getAvailable();
if (res) {
@ -69,8 +65,7 @@ class _TopNavBarComponentState extends State<TopNavBarComponent>
alignment: Alignment.centerLeft,
child: Text(
"Capsule disponible",
style:
GoogleFonts.plusJakartaSans(color: Colors.grey, fontSize: 15),
style: GoogleFonts.plusJakartaSans(color: Colors.grey, fontSize: 15),
),
),
flushbarStyle: FlushbarStyle.FLOATING,
@ -107,8 +102,7 @@ class _TopNavBarComponentState extends State<TopNavBarComponent>
alignment: Alignment.centerLeft,
child: CountdownTimer(
endTime: midnight.millisecondsSinceEpoch,
textStyle:
GoogleFonts.plusJakartaSans(color: Colors.grey, fontSize: 15),
textStyle: GoogleFonts.plusJakartaSans(color: Colors.grey, fontSize: 15),
),
),
flushbarStyle: FlushbarStyle.FLOATING,
@ -140,10 +134,9 @@ class _TopNavBarComponentState extends State<TopNavBarComponent>
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.only(top: defaultPadding),
child: Container(
padding: EdgeInsets.symmetric(horizontal: defaultPadding),
choice = widget.choice;
return SafeArea(top:true,child: Container(
padding: EdgeInsets.symmetric(horizontal: defaultPadding, vertical: 20),
width: double.infinity,
height: 100,
child: Row(
@ -154,7 +147,7 @@ class _TopNavBarComponentState extends State<TopNavBarComponent>
flex: 1,
child: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () async {
onTap: () {
Navigator.of(context).push(routeAddFriend());
},
child: const Icon(
@ -200,30 +193,23 @@ class _TopNavBarComponentState extends State<TopNavBarComponent>
}
},
child: LayoutBuilder(
builder: (BuildContext context,
BoxConstraints constraints) {
builder: (BuildContext context, BoxConstraints constraints) {
if (choice) {
return Padding(
padding: const EdgeInsets.only(
left: 8, top: 0, right: 8, bottom: 6),
padding: const EdgeInsets.only(left: 8, top: 0, right: 8, bottom: 6),
child: AutoSizeText(
"Mes amis",
style: GoogleFonts.plusJakartaSans(
fontWeight: FontWeight.w500,
fontSize: 16,
color: Colors.white),
fontWeight: FontWeight.w500, fontSize: 16, color: Colors.white),
),
);
} else {
return Padding(
padding: const EdgeInsets.only(
left: 8, top: 0, right: 8, bottom: 6),
padding: const EdgeInsets.only(left: 8, top: 0, right: 8, bottom: 6),
child: AutoSizeText(
"Mes amis",
style: GoogleFonts.plusJakartaSans(
fontWeight: FontWeight.w300,
fontSize: 16,
color: unactiveFeed),
fontWeight: FontWeight.w300, fontSize: 16, color: unactiveFeed),
));
}
},
@ -240,29 +226,22 @@ class _TopNavBarComponentState extends State<TopNavBarComponent>
}
},
child: LayoutBuilder(
builder: (BuildContext context,
BoxConstraints constraints) {
builder: (BuildContext context, BoxConstraints constraints) {
if (choice) {
return Padding(
padding: const EdgeInsets.only(
left: 8, top: 0, right: 8, bottom: 6),
padding: const EdgeInsets.only(left: 8, top: 0, right: 8, bottom: 6),
child: AutoSizeText(
"Discovery",
style: GoogleFonts.plusJakartaSans(
fontWeight: FontWeight.w300,
fontSize: 16,
color: unactiveFeed),
fontWeight: FontWeight.w300, fontSize: 16, color: unactiveFeed),
));
} else {
return Padding(
padding: const EdgeInsets.only(
left: 8, top: 0, right: 8, bottom: 6),
padding: const EdgeInsets.only(left: 8, top: 0, right: 8, bottom: 6),
child: AutoSizeText(
"Discovery",
style: GoogleFonts.plusJakartaSans(
fontWeight: FontWeight.w500,
fontSize: 16,
color: Colors.white),
fontWeight: FontWeight.w500, fontSize: 16, color: Colors.white),
));
}
},
@ -281,13 +260,17 @@ class _TopNavBarComponentState extends State<TopNavBarComponent>
Navigator.of(context).push(routeProfile());
},
child: ClipOval(
child: SizedBox.fromSize(
child: SizedBox(
width: 30,
height: 30,
// Image radius
child: FadeInImage.assetNetwork(
placeholder: 'assets/images/loadingPlaceholder.gif',
image: MyApp.userViewModel.userCurrent.pp,
width: 30,
)),
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
),
),
),
),
)

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

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

@ -5,19 +5,22 @@ import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:justmusic/screens/add_friend_screen.dart';
import 'package:justmusic/screens/explanations_screen.dart';
import 'package:justmusic/screens/feed_screen.dart';
import 'package:justmusic/screens/loading_screen.dart';
import 'package:justmusic/screens/forget_password_screen.dart';
import 'package:justmusic/screens/login_screen.dart';
import 'package:justmusic/screens/launching_rocker_screen.dart';
import 'package:justmusic/screens/post_screen.dart';
import 'package:justmusic/screens/profile_screen.dart';
import 'package:justmusic/screens/registration_screen.dart';
import 'package:justmusic/screens/verify_email_screen.dart';
import 'package:justmusic/screens/welcome_screen.dart';
import 'package:justmusic/values/constants.dart';
import 'package:justmusic/view_model/CommentViewModel.dart';
import 'package:justmusic/view_model/MusicViewModel.dart';
import 'package:justmusic/view_model/PostViewModel.dart';
@ -25,14 +28,21 @@ import 'package:justmusic/view_model/UserViewModel.dart';
import 'package:justmusic/model/User.dart' as userJustMusic;
import 'firebase_options.dart';
import 'package:timezone/data/latest.dart' as tz;
import 'package:intl/date_symbol_data_local.dart';
import 'package:fullscreen_window/fullscreen_window.dart';
Future<void> main() async {
tz.initializeTimeZones();
WidgetsFlutterBinding.ensureInitialized();
Paint.enableDithering = true;
WidgetsFlutterBinding.ensureInitialized(); // Initialize for French locale
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
await initializeDateFormatting('fr_FR', null);
if (!kIsWeb) {
await FirebaseMessaging.instance.requestPermission(sound: true);
}
runApp(const MyApp());
}
@ -53,27 +63,11 @@ class MyApp extends StatefulWidget {
class _MyAppState extends State<MyApp> {
late StreamSubscription<User?> user;
Stream<userJustMusic.User?> userCurrent = Stream.empty();
@override
void initState() {
FullScreenWindow.setFullScreen(true); // enter fullscreen
super.initState();
checkSignIn();
}
Future<userJustMusic.User?> checkSignIn() async {
user = FirebaseAuth.instance.authStateChanges().listen((user) async {
if (user == null) {
print('User is currently signed out!');
return null;
} else {
MyApp.userViewModel.userCurrent =
(await (MyApp.userViewModel.getUser(user.uid)))!;
userCurrent = Stream.value(MyApp.userViewModel.userCurrent);
print('User is signed in!');
}
});
return null;
}
@override
@ -86,11 +80,13 @@ class _MyAppState extends State<MyApp> {
@override
Widget build(BuildContext context) {
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
Paint.enableDithering = true;
Paint.enableDithering = true; // enter fullscreen
return ScreenUtilInit(
useInheritedMediaQuery: true,
builder: (context, child) {
return MaterialApp(
color: bgColor,
routes: {
'/welcome': (context) => const WellcomeScreen(),
'/feed': (context) => const FeedScreen(),
@ -101,43 +97,39 @@ class _MyAppState extends State<MyApp> {
'/explanation': (context) => const ExplanationsScreen(),
'/addFriend': (context) => const AddFriendScreen(),
'/launchingRocket': (context) => const LaunchingRocketScreen(),
'/verifyEmail': (context) => const VerifyEmailScreen(),
'/forgetPassword': (context) => const ForgetPasswordScreen(),
},
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: StreamBuilder<User?>(
home: StreamBuilder(
stream: FirebaseAuth.instance.authStateChanges(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return LoadingScreen();
} else if (snapshot.hasData) {
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 LoadingScreen();
} else if (userSnapshot.hasData) {
if (userSnapshot.connectionState == ConnectionState.waiting) {
return const CupertinoActivityIndicator();
} else {
if (userSnapshot.hasData) {
MyApp.userViewModel.userCurrent = userSnapshot.data!;
return AnimatedSwitcher(
duration: Duration(milliseconds: 1000),
transitionBuilder: (child, animation) {
return FadeTransition(
opacity: animation, child: child);
},
child: FeedScreen(),
);
return FeedScreen();
} else {
return WellcomeScreen();
}
}
},
);
} else {
return WellcomeScreen();
}
},
));
}));
},
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;
// Constructor
Music(this._id, this._title, this._cover, this._previewUrl, this._date,
this._duration, this._explicit, this._artists);
Music(
this._id, this._title, this._cover, this._previewUrl, this._date, this._duration, this._explicit, this._artists);
//Getters and setters
String? get id => _id;
String get id => _id;
String? get title => _title;

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

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

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

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

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

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

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

@ -1,19 +1,16 @@
import 'dart:async';
import 'package:flutter/Material.dart';
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart';
import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:flutter_svg/svg.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:pinch_zoom/pinch_zoom.dart';
import 'package:text_scroll/text_scroll.dart';
import 'package:zoom_tap_animation/zoom_tap_animation.dart';
import '../components/button_play_component.dart';
import '../components/comment_component.dart';
import '../components/profil_picture_component.dart';
import '../main.dart';
import '../model/Post.dart';
import '../model/Comment.dart';
@ -48,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
void dispose() {
MyApp.audioPlayer.release();
@ -57,27 +62,50 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
@override
void initState() {
print("post: ${widget.post.date.toString()}");
print("ajrd: ${DateTime.now().toString()}");
super.initState();
myFocusNode = FocusNode();
var keyboardVisibilityController = KeyboardVisibilityController();
print(
'Keyboard visibility direct query: ${keyboardVisibilityController.isVisible}');
}
super.initState();
final ScrollController _scrollController = ScrollController();
String formatPostDate(DateTime postDate) {
DateTime now = DateTime.now();
DateTime yesterday = DateTime(now.year, now.month, now.day - 1);
keyboardSubscription =
keyboardVisibilityController.onChange.listen((bool visible) {
if (!visible) {
myFocusNode.unfocus();
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')}';
}
});
}
final ScrollController _scrollController = ScrollController();
String _getMonthAbbreviation(int month) {
const List<String> monthsAbbreviation = [
'janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.',
];
return monthsAbbreviation[month - 1];
}
// Exemple d'utilisation :
void main() {
DateTime postDate = DateTime(2023, 11, 17, 17, 55); // Remplacez par votre date
String formattedDate = formatPostDate(postDate);
print(formattedDate); // Affichera "17 nov. 17:55" ou "hier, 17:55" selon la date
}
@override
Widget build(BuildContext context) {
_scrollController.addListener(() {
if (_scrollController.position.pixels < 0) _scrollController.jumpTo(0);
});
return GestureDetector(
onTap: () {
FocusScopeNode currentFocus = FocusScope.of(context);
@ -88,6 +116,7 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
},
child: Container(
height: 760.h,
color: bgAppBar,
child: Column(
children: [
Expanded(
@ -106,15 +135,15 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
child: Container(
height: 400,
width: double.infinity,
child: PinchZoom(
resetDuration: const Duration(milliseconds: 400),
maxScale: 2.5,
child: FadeInImage.assetNetwork(
placeholder:
"assets/images/loadingPlaceholder.gif",
image: choice
? widget.post.selfie!
: widget.post.music.cover!,
placeholder: "assets/images/loadingPlaceholder.gif",
image: choice ? widget.post.selfie! : widget.post.music.cover!,
width: double.infinity,
fit: BoxFit.cover,
),
)),
),
),
Column(
@ -123,143 +152,84 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
height: 200,
margin: EdgeInsets.only(top: 230),
width: double.infinity,
decoration: const BoxDecoration(
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [Colors.transparent, bgModal],
stops: [0, 0.8],
colors: [
Colors.transparent,
bgModal.withOpacity(0.5),
bgModal.withOpacity(0.75),
bgModal
],
stops: [0, 0.2, 0.4, 0.8],
),
),
child: Padding(
padding:
const EdgeInsets.fromLTRB(20, 0, 20, 10),
padding: const EdgeInsets.fromLTRB(20, 0, 20, 10),
child: Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Padding(
padding:
const EdgeInsets.only(right: 10),
padding: const EdgeInsets.only(right: 10),
child: choice
? Padding(
padding:
const EdgeInsets.all(4),
padding: const EdgeInsets.all(4),
child: ClipOval(
child: SizedBox.fromSize(
// Image radius
child: Image(
image: NetworkImage(
widget.post.user.pp),
width: 45,
),
child: ProfilPictureComponent(user: widget.post.user),
),
),
)
: widget.post.music.previewUrl !=
null
? ButtonPlayComponent(
music: widget.post.music)
: widget.post.music.previewUrl != null
? ButtonPlayComponent(music: widget.post.music)
: Container(),
),
Flexible(
child: Column(
mainAxisAlignment:
MainAxisAlignment.end,
crossAxisAlignment:
CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Flexible(
child: Row(
crossAxisAlignment:
CrossAxisAlignment.end,
crossAxisAlignment: CrossAxisAlignment.end,
children: [
Expanded(
child: ScrollConfiguration(
behavior: ScrollBehavior()
.copyWith(
scrollbars:
false),
behavior: ScrollBehavior().copyWith(scrollbars: false),
child: TextScroll(
choice
? widget.post.user
.pseudo
: widget.post.music
.title!,
style: GoogleFonts
.plusJakartaSans(
choice ? widget.post.user.pseudo : widget.post.music.title!,
style: GoogleFonts.plusJakartaSans(
height: 1,
color: Colors.white,
fontWeight:
FontWeight.w800,
fontWeight: FontWeight.w800,
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:
const EdgeInsets.only(
left: 20.0),
padding: const EdgeInsets.only(left: 20.0),
child: choice
? DateTime(
today.year,
today.month,
today.day)
.isAtSameMomentAs(
DateTime(
widget.post.date
.year,
widget.post.date
.month,
widget.post.date
.day,
),
)
? Text(
"Aujourd'hui, ${widget.post.date.hour}:${widget.post.date.minute}",
style: GoogleFonts
.plusJakartaSans(
height: 1,
color: Colors
.white,
fontWeight:
FontWeight
.w900,
fontSize: 18,
),
)
: Text(
"hier, ${widget.post.date.hour}:${widget.post.date.minute}",
style: GoogleFonts
.plusJakartaSans(
formatPostDate(widget.post.date),
style: GoogleFonts.plusJakartaSans(
height: 1,
color: Colors
.white,
fontWeight:
FontWeight
.w900,
color: Colors.white,
fontWeight: FontWeight.w900,
fontSize: 18,
),
)
: Text(
widget
.post.music.date
.toString(),
style: GoogleFonts
.plusJakartaSans(
widget.post.music.date.toString(),
style: GoogleFonts.plusJakartaSans(
height: 1,
color:
Colors.white,
fontWeight:
FontWeight
.w900,
color: Colors.white,
fontWeight: FontWeight.w900,
fontSize: 18,
),
),
@ -268,52 +238,36 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
),
),
choice
? widget.post.location.item2 !=
null
? 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,
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,
style: GoogleFonts.plusJakartaSans(
color: Colors.white.withOpacity(0.4),
fontWeight: FontWeight.w300,
fontSize: 13,
),
)
: ScrollConfiguration(
behavior: ScrollBehavior()
.copyWith(
scrollbars: false),
behavior: ScrollBehavior().copyWith(scrollbars: false),
child: TextScroll(
widget.post.music.artists
.first.name!,
style: GoogleFonts
.plusJakartaSans(
widget.post.music.artists.first.name!,
style: GoogleFonts.plusJakartaSans(
height: 1,
color: Colors.white,
fontWeight:
FontWeight.w500,
fontWeight: FontWeight.w500,
fontSize: 17,
),
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)),
),
),
],
@ -323,12 +277,12 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
),
),
),
widget.post.description != null
? Align(
widget.post.description != null ? Align(
alignment: Alignment.bottomLeft,
child: Padding(
padding: const EdgeInsets.fromLTRB(
50, 35, 50, 35),
child: Container(
padding: const EdgeInsets.fromLTRB(50, 35, 50, 35),
color: bgModal,
width: double.infinity,
child: Text(
widget.post.description!,
textAlign: TextAlign.left,
@ -342,7 +296,7 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
),
)
: Container(
height: 30,
height: 0,
),
Container(
width: double.infinity,
@ -358,103 +312,190 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
child: Column(
children: [
Padding(
padding:
EdgeInsets.symmetric(vertical: 20),
padding: EdgeInsets.only(top: 30, bottom: 20),
child: Row(
mainAxisAlignment:
MainAxisAlignment.spaceEvenly,
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
children: [
SvgPicture.asset(
GestureDetector(
onTap: () async {
var bool = await MyApp.postViewModel
.addOrDeleteFavoritePost(widget.post.id);
print("testttt");
if (!bool) {
widget.post.likes.add(MyApp.userViewModel.userCurrent.id);
setState(() {});
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text("Vous avez liké cette capsule",
style: TextStyle(fontWeight: FontWeight.bold)),
backgroundColor: primaryColor,
closeIconColor: Colors.white,
),
);
} else {
widget.post.likes.remove(MyApp.userViewModel.userCurrent.id);
setState(() {});
ScaffoldMessenger.of(context).showSnackBar(
const SnackBar(
content: Text("Vous avez supprimé votre like",
style: TextStyle(fontWeight: FontWeight.bold)),
backgroundColor: Colors.red,
closeIconColor: Colors.white,
),
);
}
},
child: SvgPicture.asset(
"assets/images/heart.svg",
semanticsLabel: 'Like Logo'),
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",
child: SvgPicture.asset("assets/images/chat.svg",
semanticsLabel: 'Chat Logo'),
),
SvgPicture.asset(
"assets/images/add.svg",
semanticsLabel:
'Add playlist Logo'),
SvgPicture.asset(
"assets/images/save.svg",
semanticsLabel: 'Save Logo'),
SvgPicture.asset(
"assets/images/report.svg",
semanticsLabel: 'Report 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",
semanticsLabel: 'Add playlist Logo'),
GestureDetector(
onTap: () async {
var bool = await MyApp.musicViewModel
.addOrDeleteFavoriteMusic(widget.post.music.id);
!bool
? ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: RichText(
textAlign: TextAlign.center,
maxLines: 1,
overflow: TextOverflow.ellipsis,
text: TextSpan(
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight: FontWeight.w400,
fontSize: 15,
),
FutureBuilder<List<Comment>>(
future: MyApp.commentViewModel
.getCommentsByPostId(widget.post.id),
builder: (BuildContext context,
AsyncSnapshot<List<Comment>>
snapshot) {
if (snapshot.hasData) {
print("test:");
return Column(
children: [
snapshot.data!.length > 0
? Padding(
padding:
const EdgeInsets.all(
15.0),
child: RichText(
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(
text: snapshot
.data!.length
.toString(),
style: GoogleFonts
.plusJakartaSans(
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontWeight:
FontWeight.w800,
fontWeight: FontWeight.w400,
fontSize: 15,
),
children: [
children: <TextSpan>[
TextSpan(
text: snapshot
.data!
.length >
1
? " commentaires"
: " commentaire",
style: GoogleFonts
.plusJakartaSans(
color: Colors
.white,
fontWeight:
FontWeight
.w400,
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'),
],
),
),
)
: Container(),
FutureBuilder<List<Comment>>(
future: MyApp.commentViewModel.getCommentsByPostId(widget.post.id),
builder: (BuildContext context, AsyncSnapshot<List<Comment>> snapshot) {
if (snapshot.hasData) {
return Column(
children: [
snapshot.data!.length > 0
? Padding(
padding: const EdgeInsets
.fromLTRB(
20, 0, 20, 20),
padding: const EdgeInsets.fromLTRB(20, 0, 20, 20),
child: ListView.builder(
shrinkWrap: true,
physics:
NeverScrollableScrollPhysics(),
itemCount: snapshot
.data?.length,
itemBuilder:
(BuildContext
context,
int index) {
return CommentComponent(
comment: snapshot
.data![
index]);
physics: NeverScrollableScrollPhysics(),
itemCount: snapshot.data?.length,
itemBuilder: (BuildContext context, int index) {
return CommentComponent(comment: snapshot.data![index]);
},
),
)
@ -464,8 +505,7 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
} else {
return Container(
child: Center(
child:
CupertinoActivityIndicator(),
child: CupertinoActivityIndicator(),
),
);
}
@ -486,14 +526,11 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
}
},
enableLongTapRepeatEvent: false,
longTapRepeatDuration:
const Duration(milliseconds: 100),
longTapRepeatDuration: const Duration(milliseconds: 100),
begin: 1.0,
end: 0.96,
beginDuration:
const Duration(milliseconds: 70),
endDuration:
const Duration(milliseconds: 100),
beginDuration: const Duration(milliseconds: 70),
endDuration: const Duration(milliseconds: 100),
beginCurve: Curves.decelerate,
endCurve: Curves.easeInOutSine,
child: Container(
@ -502,16 +539,14 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
height: 120,
decoration: BoxDecoration(
borderRadius: BorderRadius.circular(20),
border: Border.all(
width: 4, color: Colors.white),
border: Border.all(width: 4, color: Colors.white),
),
child: ClipRRect(
borderRadius: BorderRadius.circular(15),
// implementer l'image
child: Image(
image: NetworkImage(choice
? widget.post.music.cover!
: widget.post.selfie!),
image:
NetworkImage(choice ? widget.post.music.cover! : widget.post.selfie!),
fit: BoxFit.cover,
),
),
@ -547,8 +582,7 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
),
),
Padding(
padding: EdgeInsets.only(
bottom: MediaQuery.of(context).viewInsets.bottom),
padding: EdgeInsets.only(bottom: MediaQuery.of(context).viewInsets.bottom),
child: Container(
height: 70,
width: double.infinity,
@ -564,9 +598,13 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
ClipOval(
child: SizedBox.fromSize(
// Rayon de l'image
child: Image.network(
MyApp.userViewModel.userCurrent.pp,
child: FadeInImage.assetNetwork(
image: MyApp.userViewModel.userCurrent.pp,
width: 45,
height: 45,
fit: BoxFit.cover,
fadeInDuration: const Duration(milliseconds: 100),
placeholder: "assets/images/loadingPlaceholder.gif",
),
),
),
@ -574,47 +612,58 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
Expanded(
child: TextField(
keyboardAppearance: Brightness.dark,
keyboardType: TextInputType.text,
controller: _textController,
focusNode: myFocusNode,
onSubmitted: (value) async {
if (value.isNotEmpty) {
await MyApp.commentViewModel
.addComment(value, widget.post.id);
await MyApp.commentViewModel.addComment(value, widget.post.id, widget.post.user);
}
setState(() {
_textController.clear();
});
},
onChanged: (value) {
setState(() {});
},
cursorColor: primaryColor,
keyboardType: TextInputType.emailAddress,
style: GoogleFonts.plusJakartaSans(
color: Colors.white),
style: GoogleFonts.plusJakartaSans(color: Colors.white),
decoration: InputDecoration(
suffixIcon: Icon(
suffixIcon: _textController.text.isEmpty
? Container(
height: 20,
width: 20,
)
: IconButton(
onPressed: () async {
if (_textController.text.isNotEmpty) {
await MyApp.commentViewModel
.addComment(_textController.text, widget.post.id, widget.post.user);
}
myFocusNode.unfocus();
setState(() {
_textController.clear();
});
},
icon: const Icon(
Icons.send,
color: grayText,
color: primaryColor,
size: 20,
)),
focusedBorder: const OutlineInputBorder(
borderSide: BorderSide(width: 1, color: grayText),
borderRadius: BorderRadius.all(Radius.circular(100)),
),
focusedBorder: OutlineInputBorder(
borderSide:
BorderSide(width: 1, color: grayText),
borderRadius:
BorderRadius.all(Radius.circular(100)),
),
contentPadding: EdgeInsets.only(
top: 0, bottom: 0, left: 20, right: 20),
contentPadding: EdgeInsets.only(top: 0, bottom: 0, left: 20, right: 20),
fillColor: bgModal,
filled: true,
focusColor: Color.fromRGBO(255, 255, 255, 0.30),
enabledBorder: OutlineInputBorder(
borderSide:
BorderSide(width: 1, color: grayText),
borderRadius:
BorderRadius.all(Radius.circular(100)),
enabledBorder: const OutlineInputBorder(
borderSide: BorderSide(width: 1, color: grayText),
borderRadius: BorderRadius.all(Radius.circular(100)),
),
hintText: 'Ajoutez une réponse...',
hintStyle:
GoogleFonts.plusJakartaSans(color: grayText),
hintStyle: GoogleFonts.plusJakartaSans(color: grayText),
),
),
),
@ -626,15 +675,13 @@ class _DetailPostScreenState extends State<DetailPostScreen> {
),
],
),
),
);
));
}
}
class MyBehavior extends ScrollBehavior {
@override
Widget buildOverscrollIndicator(
BuildContext context, Widget child, ScrollableDetails details) {
Widget buildOverscrollIndicator(BuildContext context, Widget child, ScrollableDetails details) {
return child;
}
}

@ -6,7 +6,6 @@ import 'package:flutter/services.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:justmusic/main.dart';
import 'package:justmusic/main.dart';
import 'package:tuple/tuple.dart';
import '../components/post_component.dart';
import '../components/top_nav_bar_component.dart';
@ -21,23 +20,26 @@ class FeedScreen extends StatefulWidget {
State<FeedScreen> createState() => _FeedScreenState();
}
class _FeedScreenState extends State<FeedScreen>
with SingleTickerProviderStateMixin {
class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateMixin {
late AnimationController animationController;
late Animation<double> animation;
late List<Post> friendFeed;
Timer? timer;
var pageFriend = 0;
late List<Post> discoveryFeed;
late List<Post> displayFeed;
late Tuple2<List<Post>, List<Post>> displayFeed;
bool isDismissed = true;
bool choiceFeed = false;
bool choiceFeed = true;
PageController controller = PageController();
@override
void initState() {
super.initState();
friendFeed = MyApp.postViewModel.postsFriends;
discoveryFeed = MyApp.postViewModel.bestPosts;
animationController = AnimationController(
vsync: this,
duration: Duration(milliseconds: 400),
@ -47,38 +49,37 @@ class _FeedScreenState extends State<FeedScreen>
curve: Curves.easeInOutSine,
);
animationController.forward();
_fetchData().then((tuple) {
friendFeed = tuple.item2;
discoveryFeed = tuple.item1;
setState(() {});
});
}
Future _refresh() async {
if (choiceFeed) {
await MyApp.postViewModel.getBestPosts();
setState(() {});
} else {
await MyApp.postViewModel.getPostsFriends();
setState(() {});
@override
void dispose() {
controller.dispose();
animationController.dispose();
super.dispose();
}
Future<void> _refresh() async {
Tuple2<List<Post>, List<Post>> tuple = await _fetchData();
displayFeed = Tuple2(tuple.item1, tuple.item2);
setState(() {});
}
void changeFeed(bool choice) {
// Mettez ici le code pour l'action que vous souhaitez effectuer avec le paramètre
if (choice) {
setState(() {
animationController.reset();
displayFeed = MyApp.postViewModel.postsFriends.reversed.toList();
animationController.forward();
choiceFeed = false;
});
if (choice) {
controller.nextPage(duration: Duration(milliseconds: 300), curve: Curves.linear);
} else {
setState(() {
animationController.reset();
displayFeed = MyApp.postViewModel.bestPosts.reversed.toList();
animationController.forward();
choiceFeed = true;
});
controller.previousPage(duration: Duration(milliseconds: 300), curve: Curves.linear);
}
});
}
void openDetailPost(int index) {
void openDetailPost(Post post) {
showModalBottomSheet(
backgroundColor: bgModal,
elevation: 1,
@ -88,13 +89,18 @@ class _FeedScreenState extends State<FeedScreen>
isScrollControlled: true,
context: context,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(20), topRight: Radius.circular(20))),
borderRadius: BorderRadius.only(topLeft: Radius.circular(20), topRight: Radius.circular(20))),
builder: ((BuildContext context) {
return ClipRRect(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(20), topRight: Radius.circular(20)),
child: DetailPostScreen(post: displayFeed[index]));
borderRadius: BorderRadius.only(topLeft: Radius.circular(20), topRight: Radius.circular(20)),
child: SizedBox(
height: 760.h,
child: Scaffold(
primary: false,
extendBody: false,
backgroundColor: Colors.transparent,
body: DetailPostScreen(post: post)),
));
}),
);
}
@ -102,143 +108,149 @@ class _FeedScreenState extends State<FeedScreen>
_fetchData() async {
friendFeed = await MyApp.postViewModel.getPostsFriends();
discoveryFeed = await MyApp.postViewModel.getBestPosts();
return Tuple2(friendFeed, displayFeed);
return Tuple2(friendFeed, discoveryFeed);
}
switchTopBar(int index) {
if (index == 0) {
setState(() {
choiceFeed = true;
});
} else {
setState(() {
choiceFeed = false;
});
}
}
@override
Widget build(BuildContext context) {
displayFeed =
Tuple2(MyApp.postViewModel.postsFriends.toList(), MyApp.postViewModel.bestPosts.toList());
bool empty =
(choiceFeed == true && displayFeed.item1.isEmpty) || (choiceFeed == false && displayFeed.item2.isEmpty);
ScrollController _scrollController = ScrollController();
_scrollController.addListener(() {
if (_scrollController.position.maxScrollExtent ==
_scrollController.position.pixels) {
print("fin");
if (choiceFeed) {
displayFeed = MyApp.postViewModel.postsFriends.reversed.toList();
setState(() {
MyApp.postViewModel.getMorePostsFriends();
});
} else {
displayFeed = MyApp.postViewModel.bestPosts.reversed.toList();
setState(() {
MyApp.postViewModel.getMoreBestPosts();
});
}
_fetchData();
}
});
return Scaffold(
resizeToAvoidBottomInset: true,
resizeToAvoidBottomInset: false,
backgroundColor: bgColor,
extendBodyBehindAppBar: true,
body: displayFeed.isEmpty
? Container(
body: Container(
width: double.infinity,
height: double.infinity,
child: Stack(
fit: StackFit.expand,
children: [
Container(
AnimatedOpacity(
opacity: empty ? 1 : 0,
duration: const Duration(milliseconds: 300),
curve: Curves.easeIn,
child: Container(
decoration: const BoxDecoration(
image: DecorationImage(
image: AssetImage("assets/images/empty_bg.png"),
fit: BoxFit.cover,
opacity: 0.3),
image:
DecorationImage(image: AssetImage("assets/images/empty_bg.png"), fit: BoxFit.cover, opacity: 0.3),
),
child: Padding(
padding:
EdgeInsets.only(top: 140.h, left: defaultPadding),
padding: EdgeInsets.only(top: 140.h, left: defaultPadding),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("Suis tes amis pour voir leurs capsules",
style: GoogleFonts.plusJakartaSans(
color: Colors.white,
fontSize: 23,
fontWeight: FontWeight.w800))
color: Colors.white, fontSize: 23, fontWeight: FontWeight.w800))
],
),
),
),
),
PageView(
onPageChanged: (value) {
switchTopBar(value);
},
controller: controller,
scrollBehavior: const ScrollBehavior().copyWith(overscroll: false),
physics: AlwaysScrollableScrollPhysics(),
scrollDirection: Axis.horizontal,
children: [
Align(
alignment: Alignment.topCenter,
child: IgnorePointer(
child: CircularRevealAnimation(
animation: animation,
centerOffset: Offset(30.w, -100),
child: Container(
height: 240.h,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topRight,
stops: [
0.3,
1
],
colors: [
bgColor.withOpacity(0.9),
bgColor.withOpacity(0)
])),
),
height: double.infinity,
constraints: BoxConstraints(maxWidth: 600),
padding: EdgeInsets.fromLTRB(defaultPadding, 100.h, defaultPadding, 0),
child: RefreshIndicator(
displacement: 20,
triggerMode: RefreshIndicatorTriggerMode.onEdge,
onRefresh: _refresh,
child: ListView.builder(
physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
clipBehavior: Clip.none,
shrinkWrap: false,
controller: _scrollController,
itemCount: displayFeed.item1.length,
itemBuilder: (BuildContext context, int index) {
return Padding(
padding: const EdgeInsets.only(bottom: 40),
child:
PostComponent(callback: openDetailPost, post: displayFeed.item1[index], index: index),
);
},
),
),
Align(
alignment: Alignment.topCenter,
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: 800),
child: TopNavBarComponent(callback: changeFeed),
),
),
],
),
)
: Container(
width: double.infinity,
height: double.infinity,
child: Stack(
fit: StackFit.expand,
children: [
Expanded(
child: Align(
Align(
alignment: Alignment.topCenter,
child: CircularRevealAnimation(
animation: animation,
centerOffset: Offset(30.w, -100),
child: Expanded(
child: Container(
height: double.infinity,
constraints: BoxConstraints(maxWidth: 600),
padding: EdgeInsets.fromLTRB(
defaultPadding, 100.h, defaultPadding, 0),
child: Expanded(
child: FutureBuilder(
future: _fetchData(),
builder: (BuildContext context,
AsyncSnapshot<dynamic> snapshot) {
if (snapshot.hasData) {
return RefreshIndicator(
padding: EdgeInsets.fromLTRB(defaultPadding, 100.h, defaultPadding, 0),
child: RefreshIndicator(
displacement: 20,
triggerMode:
RefreshIndicatorTriggerMode
.onEdge,
triggerMode: RefreshIndicatorTriggerMode.onEdge,
onRefresh: _refresh,
child: Expanded(
child: ListView.builder(
physics:
const AlwaysScrollableScrollPhysics(),
controller: _scrollController,
physics: const BouncingScrollPhysics(parent: AlwaysScrollableScrollPhysics()),
clipBehavior: Clip.none,
shrinkWrap: true,
itemCount: displayFeed.length,
itemBuilder:
(BuildContext context,
int index) {
shrinkWrap: false,
itemCount: displayFeed.item2.length,
itemBuilder: (BuildContext context, int index) {
return Padding(
padding:
const EdgeInsets.only(
bottom: 40),
child: PostComponent(
callback: openDetailPost,
post: displayFeed[index],
index: index),
padding: const EdgeInsets.only(bottom: 40),
child:
PostComponent(callback: openDetailPost, post: displayFeed.item2[index], index: index),
);
},
),
),
);
} else {
return Center(
child: CupertinoActivityIndicator(),
);
}
},
),
)),
),
),
),
],
),
Align(
alignment: Alignment.topCenter,
@ -248,14 +260,8 @@ class _FeedScreenState extends State<FeedScreen>
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topRight,
stops: [
0.3,
1
],
colors: [
bgColor.withOpacity(0.9),
bgColor.withOpacity(0)
])),
stops: [0.3, 1],
colors: [bgColor.withOpacity(0.9), bgColor.withOpacity(0)])),
),
),
),
@ -263,11 +269,39 @@ class _FeedScreenState extends State<FeedScreen>
alignment: Alignment.topCenter,
child: ConstrainedBox(
constraints: BoxConstraints(maxWidth: 800),
child: TopNavBarComponent(callback: changeFeed),
child: TopNavBarComponent(callback: changeFeed, choice: choiceFeed),
),
),
],
),
));
),
);
}
}
class NoEdgeEffectScrollPhysics extends ScrollPhysics {
const NoEdgeEffectScrollPhysics({ScrollPhysics? parent}) : super(parent: parent);
@override
NoEdgeEffectScrollPhysics applyTo(ScrollPhysics? ancestor) {
return NoEdgeEffectScrollPhysics(parent: buildParent(ancestor));
}
@override
double applyBoundaryConditions(ScrollMetrics position, double value) {
// Supprimez l'effet de bord (effet de vague)
return 0.0;
}
@override
double applyPhysicsToUserOffset(ScrollMetrics position, double offset) {
// Supprimez la rétroaction haptique
return offset;
}
@override
Simulation? createBallisticSimulation(ScrollMetrics position, double velocity) {
// Désactivez l'overscroll
return super.createBallisticSimulation(position, 0.0);
}
}

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

Loading…
Cancel
Save