diff --git a/.gitignore b/.gitignore index 29a3a50..d5af130 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,4 @@ app.*.map.json /android/app/debug /android/app/profile /android/app/release +.vscode/settings.json diff --git a/assets/Chanel.png b/assets/Chanel.png new file mode 100644 index 0000000..d6b8d00 Binary files /dev/null and b/assets/Chanel.png differ diff --git a/assets/OneOfWun.png b/assets/OneOfWun.png new file mode 100644 index 0000000..bbd3059 Binary files /dev/null and b/assets/OneOfWun.png differ diff --git a/assets/back.svg b/assets/back.svg new file mode 100644 index 0000000..529d9db --- /dev/null +++ b/assets/back.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/bg.svg b/assets/bg.svg new file mode 100644 index 0000000..95fb1f6 --- /dev/null +++ b/assets/bg.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/bg_admin.svg b/assets/bg_admin.svg new file mode 100644 index 0000000..66fae44 --- /dev/null +++ b/assets/bg_admin.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/bg_new.svg b/assets/bg_new.svg new file mode 100644 index 0000000..6bf99cb --- /dev/null +++ b/assets/bg_new.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/assets/bg_splash.svg b/assets/bg_splash.svg new file mode 100644 index 0000000..d55ed97 --- /dev/null +++ b/assets/bg_splash.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/assets/collabify.svg b/assets/collabify.svg new file mode 100644 index 0000000..7f6666d --- /dev/null +++ b/assets/collabify.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/dino.png b/assets/dino.png new file mode 100644 index 0000000..79eecaa Binary files /dev/null and b/assets/dino.png differ diff --git a/assets/hexathon.png b/assets/hexathon.png new file mode 100644 index 0000000..f320ae7 Binary files /dev/null and b/assets/hexathon.png differ diff --git a/assets/highlight.svg b/assets/highlight.svg new file mode 100644 index 0000000..6a7ec74 --- /dev/null +++ b/assets/highlight.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/login_bg/Union-1.svg b/assets/login_bg/Union-1.svg new file mode 100644 index 0000000..c33ae56 --- /dev/null +++ b/assets/login_bg/Union-1.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/login_bg/Union-2.svg b/assets/login_bg/Union-2.svg new file mode 100644 index 0000000..4eb63fc --- /dev/null +++ b/assets/login_bg/Union-2.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/login_bg/Union-3.svg b/assets/login_bg/Union-3.svg new file mode 100644 index 0000000..b044cb3 --- /dev/null +++ b/assets/login_bg/Union-3.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/login_bg/Union-4.svg b/assets/login_bg/Union-4.svg new file mode 100644 index 0000000..24eb389 --- /dev/null +++ b/assets/login_bg/Union-4.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/login_bg/Union-5.svg b/assets/login_bg/Union-5.svg new file mode 100644 index 0000000..f5b28b9 --- /dev/null +++ b/assets/login_bg/Union-5.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/login_bg/Union-6.svg b/assets/login_bg/Union-6.svg new file mode 100644 index 0000000..c60eb12 --- /dev/null +++ b/assets/login_bg/Union-6.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/login_bg/Union.svg b/assets/login_bg/Union.svg new file mode 100644 index 0000000..33bb823 --- /dev/null +++ b/assets/login_bg/Union.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/logo.svg b/assets/logo.svg index c07d96d..3fa6858 100644 --- a/assets/logo.svg +++ b/assets/logo.svg @@ -1,9 +1,4 @@ - - - - - - - - + + + diff --git a/assets/path.svg b/assets/path.svg new file mode 100644 index 0000000..36d8c4d --- /dev/null +++ b/assets/path.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/plus.svg b/assets/plus.svg new file mode 100644 index 0000000..307797b --- /dev/null +++ b/assets/plus.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/assets/splash_left.svg b/assets/splash_left.svg new file mode 100644 index 0000000..43adc15 --- /dev/null +++ b/assets/splash_left.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/splash_right.svg b/assets/splash_right.svg new file mode 100644 index 0000000..cea9e45 --- /dev/null +++ b/assets/splash_right.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/wt.png b/assets/wt.png new file mode 100644 index 0000000..b2218f8 Binary files /dev/null and b/assets/wt.png differ diff --git a/fonts/Gotham/Gotham-Black.otf b/fonts/Gotham/Gotham-Black.otf new file mode 100644 index 0000000..95a7d3b Binary files /dev/null and b/fonts/Gotham/Gotham-Black.otf differ diff --git a/fonts/Gotham/Gotham-BlackItalic.otf b/fonts/Gotham/Gotham-BlackItalic.otf new file mode 100644 index 0000000..ec07448 Binary files /dev/null and b/fonts/Gotham/Gotham-BlackItalic.otf differ diff --git a/fonts/Gotham/Gotham-Bold.otf b/fonts/Gotham/Gotham-Bold.otf new file mode 100644 index 0000000..3ea826b Binary files /dev/null and b/fonts/Gotham/Gotham-Bold.otf differ diff --git a/fonts/Gotham/Gotham-BoldItalic.otf b/fonts/Gotham/Gotham-BoldItalic.otf new file mode 100644 index 0000000..b91195f Binary files /dev/null and b/fonts/Gotham/Gotham-BoldItalic.otf differ diff --git a/fonts/Gotham/Gotham-Book.otf b/fonts/Gotham/Gotham-Book.otf new file mode 100644 index 0000000..d949123 Binary files /dev/null and b/fonts/Gotham/Gotham-Book.otf differ diff --git a/fonts/Gotham/Gotham-BookItalic.otf b/fonts/Gotham/Gotham-BookItalic.otf new file mode 100644 index 0000000..0dde86d Binary files /dev/null and b/fonts/Gotham/Gotham-BookItalic.otf differ diff --git a/fonts/Gotham/Gotham-Light.otf b/fonts/Gotham/Gotham-Light.otf new file mode 100644 index 0000000..8c11c33 Binary files /dev/null and b/fonts/Gotham/Gotham-Light.otf differ diff --git a/fonts/Gotham/Gotham-LightItalic.otf b/fonts/Gotham/Gotham-LightItalic.otf new file mode 100644 index 0000000..0202759 Binary files /dev/null and b/fonts/Gotham/Gotham-LightItalic.otf differ diff --git a/fonts/Gotham/Gotham-Medium.otf b/fonts/Gotham/Gotham-Medium.otf new file mode 100644 index 0000000..1ce92eb Binary files /dev/null and b/fonts/Gotham/Gotham-Medium.otf differ diff --git a/fonts/Gotham/Gotham-MediumItalic.otf b/fonts/Gotham/Gotham-MediumItalic.otf new file mode 100644 index 0000000..afe9383 Binary files /dev/null and b/fonts/Gotham/Gotham-MediumItalic.otf differ diff --git a/fonts/Gotham/Gotham-Thin.otf b/fonts/Gotham/Gotham-Thin.otf new file mode 100644 index 0000000..cb344a7 Binary files /dev/null and b/fonts/Gotham/Gotham-Thin.otf differ diff --git a/fonts/Gotham/Gotham-ThinItalic.otf b/fonts/Gotham/Gotham-ThinItalic.otf new file mode 100644 index 0000000..5ce10d9 Binary files /dev/null and b/fonts/Gotham/Gotham-ThinItalic.otf differ diff --git a/fonts/Gotham/Gotham-Ultra.otf b/fonts/Gotham/Gotham-Ultra.otf new file mode 100644 index 0000000..a9e3d18 Binary files /dev/null and b/fonts/Gotham/Gotham-Ultra.otf differ diff --git a/fonts/Gotham/Gotham-UltraItalic.otf b/fonts/Gotham/Gotham-UltraItalic.otf new file mode 100644 index 0000000..dcb16ef Binary files /dev/null and b/fonts/Gotham/Gotham-UltraItalic.otf differ diff --git a/fonts/Gotham/Gotham-XLight.otf b/fonts/Gotham/Gotham-XLight.otf new file mode 100644 index 0000000..bc9241c Binary files /dev/null and b/fonts/Gotham/Gotham-XLight.otf differ diff --git a/fonts/Gotham/Gotham-XLightItalic.otf b/fonts/Gotham/Gotham-XLightItalic.otf new file mode 100644 index 0000000..6d44643 Binary files /dev/null and b/fonts/Gotham/Gotham-XLightItalic.otf differ diff --git a/fonts/Poppins/Poppins-Black.ttf b/fonts/Poppins/Poppins-Black.ttf new file mode 100644 index 0000000..71c0f99 Binary files /dev/null and b/fonts/Poppins/Poppins-Black.ttf differ diff --git a/fonts/Poppins/Poppins-BlackItalic.ttf b/fonts/Poppins/Poppins-BlackItalic.ttf new file mode 100644 index 0000000..7aeb58b Binary files /dev/null and b/fonts/Poppins/Poppins-BlackItalic.ttf differ diff --git a/fonts/Poppins/Poppins-Bold.ttf b/fonts/Poppins/Poppins-Bold.ttf new file mode 100644 index 0000000..00559ee Binary files /dev/null and b/fonts/Poppins/Poppins-Bold.ttf differ diff --git a/fonts/Poppins/Poppins-BoldItalic.ttf b/fonts/Poppins/Poppins-BoldItalic.ttf new file mode 100644 index 0000000..e61e8e8 Binary files /dev/null and b/fonts/Poppins/Poppins-BoldItalic.ttf differ diff --git a/fonts/Poppins/Poppins-ExtraBold.ttf b/fonts/Poppins/Poppins-ExtraBold.ttf new file mode 100644 index 0000000..df70936 Binary files /dev/null and b/fonts/Poppins/Poppins-ExtraBold.ttf differ diff --git a/fonts/Poppins/Poppins-ExtraBoldItalic.ttf b/fonts/Poppins/Poppins-ExtraBoldItalic.ttf new file mode 100644 index 0000000..14d2b37 Binary files /dev/null and b/fonts/Poppins/Poppins-ExtraBoldItalic.ttf differ diff --git a/fonts/Poppins/Poppins-ExtraLight.ttf b/fonts/Poppins/Poppins-ExtraLight.ttf new file mode 100644 index 0000000..e76ec69 Binary files /dev/null and b/fonts/Poppins/Poppins-ExtraLight.ttf differ diff --git a/fonts/Poppins/Poppins-ExtraLightItalic.ttf b/fonts/Poppins/Poppins-ExtraLightItalic.ttf new file mode 100644 index 0000000..89513d9 Binary files /dev/null and b/fonts/Poppins/Poppins-ExtraLightItalic.ttf differ diff --git a/fonts/Poppins/Poppins-Italic.ttf b/fonts/Poppins/Poppins-Italic.ttf new file mode 100644 index 0000000..12b7b3c Binary files /dev/null and b/fonts/Poppins/Poppins-Italic.ttf differ diff --git a/fonts/Poppins/Poppins-Light.ttf b/fonts/Poppins/Poppins-Light.ttf new file mode 100644 index 0000000..bc36bcc Binary files /dev/null and b/fonts/Poppins/Poppins-Light.ttf differ diff --git a/fonts/Poppins/Poppins-LightItalic.ttf b/fonts/Poppins/Poppins-LightItalic.ttf new file mode 100644 index 0000000..9e70be6 Binary files /dev/null and b/fonts/Poppins/Poppins-LightItalic.ttf differ diff --git a/fonts/Poppins/Poppins-Medium.ttf b/fonts/Poppins/Poppins-Medium.ttf new file mode 100644 index 0000000..6bcdcc2 Binary files /dev/null and b/fonts/Poppins/Poppins-Medium.ttf differ diff --git a/fonts/Poppins/Poppins-MediumItalic.ttf b/fonts/Poppins/Poppins-MediumItalic.ttf new file mode 100644 index 0000000..be67410 Binary files /dev/null and b/fonts/Poppins/Poppins-MediumItalic.ttf differ diff --git a/fonts/Poppins/Poppins-Regular.ttf b/fonts/Poppins/Poppins-Regular.ttf new file mode 100644 index 0000000..9f0c71b Binary files /dev/null and b/fonts/Poppins/Poppins-Regular.ttf differ diff --git a/fonts/Poppins/Poppins-SemiBold.ttf b/fonts/Poppins/Poppins-SemiBold.ttf new file mode 100644 index 0000000..74c726e Binary files /dev/null and b/fonts/Poppins/Poppins-SemiBold.ttf differ diff --git a/fonts/Poppins/Poppins-SemiBoldItalic.ttf b/fonts/Poppins/Poppins-SemiBoldItalic.ttf new file mode 100644 index 0000000..3e6c942 Binary files /dev/null and b/fonts/Poppins/Poppins-SemiBoldItalic.ttf differ diff --git a/fonts/Poppins/Poppins-Thin.ttf b/fonts/Poppins/Poppins-Thin.ttf new file mode 100644 index 0000000..03e7366 Binary files /dev/null and b/fonts/Poppins/Poppins-Thin.ttf differ diff --git a/fonts/Poppins/Poppins-ThinItalic.ttf b/fonts/Poppins/Poppins-ThinItalic.ttf new file mode 100644 index 0000000..e26db5d Binary files /dev/null and b/fonts/Poppins/Poppins-ThinItalic.ttf differ diff --git a/fonts/Product-Sans/Product-Sans-Regular.ttf b/fonts/Product-Sans/Product-Sans-Regular.ttf new file mode 100644 index 0000000..c0442ee Binary files /dev/null and b/fonts/Product-Sans/Product-Sans-Regular.ttf differ diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig index 592ceee..ec97fc6 100644 --- a/ios/Flutter/Debug.xcconfig +++ b/ios/Flutter/Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig index 592ceee..c4855bf 100644 --- a/ios/Flutter/Release.xcconfig +++ b/ios/Flutter/Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 0000000..d97f17e --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,44 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '12.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 diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 0000000..c7be6e0 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,22 @@ +PODS: + - Flutter (1.0.0) + - image_picker_ios (0.0.1): + - Flutter + +DEPENDENCIES: + - Flutter (from `Flutter`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) + +EXTERNAL SOURCES: + Flutter: + :path: Flutter + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" + +SPEC CHECKSUMS: + Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7 + image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1 + +PODFILE CHECKSUM: 819463e6a0290f5a72f145ba7cde16e8b6ef0796 + +COCOAPODS: 1.15.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index d801279..66d5349 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -14,6 +14,8 @@ 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 */; }; + B302BB5DD26B88CB194B7FA1 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43487896E58C5652BC84018D /* Pods_Runner.framework */; }; + E7C87BE02A3886B26674AD6F /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FE6F3217B378785C9C7471D /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -45,9 +47,12 @@ 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 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 = ""; }; + 43487896E58C5652BC84018D /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4FE6F3217B378785C9C7471D /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 94D49256AA4B7672FE714391 /* 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 = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -55,13 +60,27 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A0D4FC88199DD146DCC8C06A /* 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 = ""; }; + AB5531E5CFA9242370CC454D /* 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 = ""; }; + E0A4DB0A88E8387741EC0414 /* 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 = ""; }; + EADB8A8FD658FBABA46A254C /* 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 = ""; }; + FCBFF0ADD9BBFF152E81CBA0 /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 5F8A8CC8C37BA82325E7B498 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E7C87BE02A3886B26674AD6F /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 97C146EB1CF9000F007C117D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + B302BB5DD26B88CB194B7FA1 /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -76,6 +95,29 @@ path = RunnerTests; sourceTree = ""; }; + 48033C5E693DDB60157C2A95 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 43487896E58C5652BC84018D /* Pods_Runner.framework */, + 4FE6F3217B378785C9C7471D /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 6C6E603878653EAC091284D8 /* Pods */ = { + isa = PBXGroup; + children = ( + A0D4FC88199DD146DCC8C06A /* Pods-Runner.debug.xcconfig */, + E0A4DB0A88E8387741EC0414 /* Pods-Runner.release.xcconfig */, + FCBFF0ADD9BBFF152E81CBA0 /* Pods-Runner.profile.xcconfig */, + AB5531E5CFA9242370CC454D /* Pods-RunnerTests.debug.xcconfig */, + EADB8A8FD658FBABA46A254C /* Pods-RunnerTests.release.xcconfig */, + 94D49256AA4B7672FE714391 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -94,6 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, + 6C6E603878653EAC091284D8 /* Pods */, + 48033C5E693DDB60157C2A95 /* Frameworks */, ); sourceTree = ""; }; @@ -128,8 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( + A3305580CE125C4C5D682F45 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, + 5F8A8CC8C37BA82325E7B498 /* Frameworks */, ); buildRules = ( ); @@ -145,12 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 72AB96DBC8F7ED65BA57AAF0 /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + 1330E8FDC9A81927025A5EC6 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -222,6 +270,23 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 1330E8FDC9A81927025A5EC6 /* [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; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -238,6 +303,28 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 72AB96DBC8F7ED65BA57AAF0 /* [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; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -253,6 +340,28 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + A3305580CE125C4C5D682F45 /* [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; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -369,7 +478,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.spotifycollab; + PRODUCT_BUNDLE_IDENTIFIER = com.ssaakaash.spotifycollab; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; @@ -379,6 +488,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = AB5531E5CFA9242370CC454D /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -396,6 +506,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = EADB8A8FD658FBABA46A254C /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -411,6 +522,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 94D49256AA4B7672FE714391 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -549,7 +661,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.spotifycollab; + PRODUCT_BUNDLE_IDENTIFIER = com.ssaakaash.spotifycollab; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -572,7 +684,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.example.spotifycollab; + PRODUCT_BUNDLE_IDENTIFIER = com.ssaakaash.spotifycollab; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..21a3cc1 100644 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index 223195f..f1948ba 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -2,6 +2,8 @@ + CADisableMinimumFrameDurationOnPhone + CFBundleDevelopmentRegion $(DEVELOPMENT_LANGUAGE) CFBundleDisplayName @@ -24,6 +26,8 @@ $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS + UIApplicationSupportsIndirectInputEvents + UILaunchStoryboardName LaunchScreen UIMainStoryboardFile @@ -41,9 +45,5 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - CADisableMinimumFrameDurationOnPhone - - UIApplicationSupportsIndirectInputEvents - diff --git a/lib/app/app.dart b/lib/app/app.dart index 575db33..be5f7fc 100644 --- a/lib/app/app.dart +++ b/lib/app/app.dart @@ -11,7 +11,7 @@ class CollabifyApp extends StatelessWidget { return MaterialApp.router( title: 'Kalculate', theme: darkTheme, - themeMode: ThemeMode.dark, + // themeMode: ThemeMode.dark, debugShowCheckedModeBanner: false, routerConfig: router, ); diff --git a/lib/app/router/router.dart b/lib/app/router/router.dart index e627f67..94076df 100644 --- a/lib/app/router/router.dart +++ b/lib/app/router/router.dart @@ -1,13 +1,59 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; -import 'package:spotify_collab_app/view/screens/u_home_screen.dart'; +import 'package:spotify_collab_app/view/screens/admin_screen.dart'; +import 'package:spotify_collab_app/view/screens/create_screen.dart'; +import 'package:spotify_collab_app/view/screens/join_screen.dart'; +import 'package:spotify_collab_app/view/screens/landing_screen.dart'; +import 'package:spotify_collab_app/view/screens/login_screen.dart'; +import 'package:spotify_collab_app/view/screens/signup_screen.dart'; +import 'package:spotify_collab_app/view/screens/home_screen.dart'; +import 'package:spotify_collab_app/view/screens/connect_screen.dart'; final router = GoRouter( initialLocation: '/', routes: [ GoRoute( path: '/', - pageBuilder: (context, state) => const MaterialPage(child: HomeScreen()), + pageBuilder: (context, state) => const MaterialPage( + child: LandingScreen(), + ), + routes: [ + GoRoute( + path: 'login', + pageBuilder: (context, state) => + const MaterialPage(child: LoginScreen()), + ), + GoRoute( + path: 'signup', + pageBuilder: (context, state) => + const MaterialPage(child: SignupScreen()), + ), + GoRoute( + path: 'connect', + pageBuilder: (context, state) => + const MaterialPage(child: ConnectScreen()), + ), + GoRoute( + path: 'home', + pageBuilder: (context, state) => + const MaterialPage(child: HomeScreen()), + ), + GoRoute( + path: 'create', + pageBuilder: (context, state) => + const MaterialPage(child: CreateScreen()), + ), + GoRoute( + path: 'join', + pageBuilder: (context, state) => + const MaterialPage(child: JoinScreen()), + ), + GoRoute( + path: 'admin', + pageBuilder: (context, state) => + const MaterialPage(child: AdminScreen()), + ), + ], ), ], ); diff --git a/lib/app/theme/theme.dart b/lib/app/theme/theme.dart index 522fe0e..d3acc4b 100644 --- a/lib/app/theme/theme.dart +++ b/lib/app/theme/theme.dart @@ -2,10 +2,10 @@ import 'package:flutter/material.dart'; final ThemeData darkTheme = ThemeData( brightness: Brightness.dark, - primaryColor: const Color(0xFF1ED760), + primaryColor: const Color(0xFF5822EE), colorScheme: const ColorScheme.dark( - primary: Color(0xFF1ED760), - secondary: Color(0xFF1ED760), + primary: Color(0xFF5822EE), + secondary: Color(0xFF5822EE), ), scaffoldBackgroundColor: const Color(0xFF121212), appBarTheme: const AppBarTheme( @@ -15,11 +15,11 @@ final ThemeData darkTheme = ThemeData( filled: true, fillColor: Color(0xFF2C2C2C), border: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFF1ED760)), + borderSide: BorderSide(color: Color(0xFF5822EE)), ), ), buttonTheme: const ButtonThemeData( - buttonColor: Color(0xFF1ED760), + buttonColor: Color(0xFF5822EE), textTheme: ButtonTextTheme.primary, ), ); diff --git a/lib/main.dart b/lib/main.dart index c33a45f..ea4900b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,6 +1,11 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:spotify_collab_app/app/app.dart'; import 'package:flutter/material.dart'; void main() { - runApp(const CollabifyApp()); + runApp( + const ProviderScope( + child: CollabifyApp(), + ), + ); } diff --git a/lib/providers/admin_screen_provider.dart b/lib/providers/admin_screen_provider.dart new file mode 100644 index 0000000..2fa9d49 --- /dev/null +++ b/lib/providers/admin_screen_provider.dart @@ -0,0 +1,8 @@ +import 'package:flutter_riverpod/flutter_riverpod.dart'; + +enum RequestAction { none, acceptAll, rejectAll } + +final tabProvider = StateProvider((ref) => 0); + +final requestActionProvider = + StateProvider((ref) => RequestAction.none); diff --git a/lib/providers/photo_upload_notifier.dart b/lib/providers/photo_upload_notifier.dart new file mode 100644 index 0000000..1a71766 --- /dev/null +++ b/lib/providers/photo_upload_notifier.dart @@ -0,0 +1,25 @@ +import 'dart:io'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:image_picker/image_picker.dart'; + +class PhotoUploadNotifier extends StateNotifier { + PhotoUploadNotifier() : super(null); + + final ImagePicker _picker = ImagePicker(); + + Future pickImage() async { + final pickedFile = await _picker.pickImage(source: ImageSource.gallery); + if (pickedFile != null) { + state = File(pickedFile.path); + } + } + + void clearImage() { + state = null; + } +} + +final photoUploadProvider = + StateNotifierProvider((ref) { + return PhotoUploadNotifier(); +}); diff --git a/lib/view/screens/admin_screen.dart b/lib/view/screens/admin_screen.dart new file mode 100644 index 0000000..ca649b6 --- /dev/null +++ b/lib/view/screens/admin_screen.dart @@ -0,0 +1,457 @@ +import 'dart:math'; +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:spotify_collab_app/providers/admin_screen_provider.dart'; + +class AdminScreen extends ConsumerStatefulWidget { + const AdminScreen({super.key}); + + @override + ConsumerState createState() => _AdminScreenState(); +} + +class _AdminScreenState extends ConsumerState + with SingleTickerProviderStateMixin { + late TabController _tabController; + + @override + void initState() { + super.initState(); + final initialIndex = ref.read(tabProvider); + _tabController = + TabController(length: 3, vsync: this, initialIndex: initialIndex); + + _tabController.addListener(() { + if (_tabController.indexIsChanging) { + ref.read(tabProvider.notifier).state = _tabController.index; + } + }); + } + + @override + void dispose() { + _tabController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + double width = MediaQuery.sizeOf(context).width; + double height = MediaQuery.sizeOf(context).height; + + final currentIndex = ref.watch(tabProvider); + final requestAction = ref.watch(requestActionProvider); + + final List> items = [ + { + "title": "One of Wun", + "subtitle": "Gunna", + "imageUrl": "assets/OneOfWun.png", + }, + { + "title": "Chanel", + "subtitle": "Frank Ocean", + "imageUrl": "assets/Chanel.png", + }, + ]; + + final participants = [ + "Souvik", + "Jothish", + "Aakaash", + "Aditya", + "Karan", + ]; + if (_tabController.index != currentIndex) { + _tabController.animateTo(currentIndex); + } + + return Stack( + children: [ + Scaffold( + resizeToAvoidBottomInset: false, + backgroundColor: const Color(0xff5822EE), + appBar: AppBar( + centerTitle: false, + automaticallyImplyLeading: false, + title: IconButton( + onPressed: () {}, + iconSize: 16, + icon: const Icon( + Icons.arrow_back_ios, + color: Color(0xffD1D2D9), + ), + ), + actions: [ + IconButton( + onPressed: () {}, + iconSize: 16, + icon: const Icon( + Icons.more_vert, + color: Color(0xffD1D2D9), + ), + ), + ], + backgroundColor: Colors.transparent, + ), + body: Stack( + children: [ + Padding( + padding: EdgeInsets.only( + top: height * 0.03, + ), + child: const Align( + alignment: Alignment.topCenter, + child: Text( + "DevJams’ 24", + style: TextStyle( + fontFamily: 'Gotham', + color: Colors.white, + fontWeight: FontWeight.w700, + fontSize: 45, + ), + ), + ), + ), + Container( + margin: EdgeInsets.only(top: height * 0.12), + decoration: const BoxDecoration( + color: Color.fromRGBO(12, 13, 14, 1), + borderRadius: BorderRadius.only( + topLeft: Radius.circular(16), + topRight: Radius.circular(16), + ), + ), + child: Column( + children: [ + SizedBox(height: height * 0.02), + Padding( + padding: EdgeInsets.only(right: width * 0.138), + child: TabBar( + controller: _tabController, + indicatorColor: const Color(0xffF674A2), + labelColor: Colors.white, + dividerColor: Colors.transparent, + unselectedLabelColor: Colors.grey, + tabs: const [ + Tab( + child: Text( + "Playlist", + style: TextStyle( + fontFamily: 'Gotham', + fontWeight: FontWeight.w600, + ), + ), + ), + Tab( + child: Text( + "Requests", + style: TextStyle( + fontFamily: 'Gotham', + fontWeight: FontWeight.w600, + ), + ), + ), + Tab( + child: Text( + "Participants", + style: TextStyle( + fontFamily: 'Gotham', + fontWeight: FontWeight.w600, + ), + ), + ), + ], + ), + ), + const Divider( + color: Color(0xffCCCCCC), + height: 1, + ), + Expanded( + child: TabBarView( + controller: _tabController, + physics: const NeverScrollableScrollPhysics(), + children: [ + buildTabContent(items, isPlaylist: true), + buildRequestTabContent(items, requestAction), + buildTabContent(participants, isParticipant: true), + ], + ), + ), + ], + ), + ), + ], + ), + ), + IgnorePointer( + ignoring: true, + child: Container( + margin: EdgeInsets.only(top: height * 0.12), + height: double.infinity, + width: double.infinity, + child: SvgPicture.asset( + 'assets/bg_admin.svg', + colorFilter: + const ColorFilter.mode(Color(0xffd1dfdb), BlendMode.srcIn), + fit: BoxFit.cover, + ), + ), + ), + Positioned( + right: width * 0.05, + top: height * 0.1, + child: SvgPicture.asset('assets/path.svg'), + ) + ], + ); + } + + Widget buildTabContent(List items, + {bool isPlaylist = false, + bool isRequest = false, + bool isParticipant = false}) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0), + child: Column( + children: [ + if (isParticipant) + Align( + alignment: Alignment.topRight, + child: Text( + 'Total Participants - ${items.length}', + style: const TextStyle( + fontFamily: 'Gotham', + color: Colors.white, + fontWeight: FontWeight.w300, + fontSize: 12, + ), + ), + ) + else + const SizedBox(), + Expanded( + child: ListView.separated( + itemCount: items.length, + separatorBuilder: (context, index) => const Divider( + color: Color(0xFFCCCCCC), + height: 1, + ), + itemBuilder: (context, index) { + final item = items[index]; + return isPlaylist + ? MusicListItem( + title: item["title"]!, + subtitle: item["subtitle"]!, + imageUrl: item["imageUrl"]!, + isPlaylist: isPlaylist, + isRequest: isRequest, + isParticipant: isParticipant, + ) + : MusicListItem( + title: item!, + subtitle: null, + imageUrl: null, + isPlaylist: isPlaylist, + isRequest: isRequest, + isParticipant: isParticipant, + ); + }, + ), + ), + ], + ), + ); + } + + Widget buildRequestTabContent( + List> items, RequestAction action) { + return Column( + children: [ + Align( + alignment: Alignment.topRight, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Radio( + value: RequestAction.rejectAll, + groupValue: action, + onChanged: (value) => + ref.read(requestActionProvider.notifier).state = value!, + activeColor: Colors.red, + fillColor: const WidgetStatePropertyAll(Colors.red), + ), + const Text( + "Reject All", + style: TextStyle( + fontFamily: 'Gotham', + color: Colors.white, + fontWeight: FontWeight.w600, + fontSize: 10, + ), + ), + Radio( + value: RequestAction.acceptAll, + groupValue: action, + onChanged: (value) => + ref.read(requestActionProvider.notifier).state = value!, + activeColor: Colors.green, + fillColor: const WidgetStatePropertyAll(Colors.green), + ), + const Text( + "Accept All", + style: TextStyle( + fontFamily: 'Gotham', + color: Colors.white, + fontWeight: FontWeight.w600, + fontSize: 10, + ), + ), + ], + ), + ), + Expanded( + child: ListView.separated( + padding: + const EdgeInsets.symmetric(vertical: 8.0, horizontal: 16.0), + itemCount: items.length, + separatorBuilder: (context, index) => const Divider( + color: Color(0xFFCCCCCC), + height: 1, + ), + itemBuilder: (context, index) { + final item = items[index]; + return MusicListItem( + title: item["title"]!, + subtitle: item["subtitle"]!, + imageUrl: item["imageUrl"]!, + isRequest: true, + ); + }, + ), + ), + ], + ); + } +} + +class MusicListItem extends StatelessWidget { + final String title; + final String? subtitle; + final String? imageUrl; + final bool isPlaylist; + final bool isRequest; + final bool isParticipant; + + const MusicListItem({ + super.key, + required this.title, + this.subtitle, + this.imageUrl, + this.isPlaylist = false, + this.isRequest = false, + this.isParticipant = false, + }); + + Color getRandomColor() { + final Random random = Random(); + return Color.fromARGB( + 255, + random.nextInt(256), + random.nextInt(256), + random.nextInt(256), + ); + } + + @override + Widget build(BuildContext context) { + return ListTile( + contentPadding: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8), + leading: isParticipant + ? ClipRRect( + borderRadius: BorderRadius.circular(50), + child: Container( + width: 50, + height: 50, + decoration: BoxDecoration( + gradient: LinearGradient( + colors: [ + getRandomColor(), + Colors.black, + ], + begin: Alignment.topLeft, + end: Alignment.bottomRight, + ), + shape: BoxShape.circle, + ), + child: Center( + child: Text( + title[0].toUpperCase(), + style: TextStyle( + color: const Color(0xFFFFFFFF).withOpacity(0.8), + fontWeight: FontWeight.bold, + fontSize: 24, + ), + ), + ), + ), + ) + : Container( + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8.0), + ), + child: Image.asset( + imageUrl!, + ), + ), + title: Text( + title, + style: const TextStyle( + fontFamily: 'Gotham', + fontWeight: FontWeight.w700, + color: Colors.white, + fontSize: 14, + ), + ), + subtitle: isParticipant + ? null + : Text( + subtitle ?? '', + style: const TextStyle( + fontFamily: 'Gotham', + fontWeight: FontWeight.w300, + color: Colors.grey, + fontSize: 10, + ), + ), + trailing: isRequest + ? Row( + mainAxisSize: MainAxisSize.min, + children: [ + IconButton( + icon: const Icon(Icons.close, color: Colors.red), + onPressed: () {}, + ), + IconButton( + icon: const Icon(Icons.check, color: Colors.green), + onPressed: () {}, + ), + ], + ) + : isParticipant + ? null + : InkWell( + onTap: () {}, + child: InkWell( + onTap: () {}, + child: const Icon( + Icons.more_vert, + color: Color(0xff737373), + ), + ), + ), + ); + } +} diff --git a/lib/view/screens/connect_screen.dart b/lib/view/screens/connect_screen.dart new file mode 100644 index 0000000..0278575 --- /dev/null +++ b/lib/view/screens/connect_screen.dart @@ -0,0 +1,104 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter_svg/svg.dart'; + +class ConnectScreen extends StatelessWidget { + const ConnectScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color(0xff5822EE), + appBar: AppBar( + automaticallyImplyLeading: false, + backgroundColor: Colors.transparent, + ), + body: Stack(children: [ + SizedBox( + height: double.infinity, + width: double.infinity, + child: SvgPicture.asset( + 'assets/bg_splash.svg', + fit: BoxFit.cover, + ), + ), + Padding( + padding: const EdgeInsets.all(40.0), + child: Column( + children: [ + const Spacer(), + const Text( + "welcome to collabify", + textAlign: TextAlign.left, + style: TextStyle( + fontFamily: "Gotham", + fontSize: 45, + fontWeight: FontWeight.w900, + color: Colors.white, + height: 1.2, + ), + ), + const SizedBox( + height: 20, + ), + const Text( + "Unlock a world of music possibilities by connecting your " + "Spotify account and dive into a seamless experience tailored " + "just for you.", + style: TextStyle( + fontFamily: "Product-Sans", + fontSize: 16.53, + fontWeight: FontWeight.w400, + color: Colors.white, + ), + ), + const Spacer(), + Container( + decoration: const BoxDecoration( + color: Color(0xff1db954), + borderRadius: BorderRadius.all(Radius.circular(12)), + ), + height: 45, + width: 225, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Text( + "Connect", + style: TextStyle( + fontFamily: "Gotham", + fontSize: 20, + fontWeight: FontWeight.w700, + color: Colors.white, + ), + ), + const SizedBox( + width: 5, + ), + SvgPicture.asset("assets/logo.svg") + ], + ), + ), + const SizedBox( + height: 15, + ), + const Text( + "Authorize Collabify to access your Spotify account, " + "enabling you to explore, play and share music with friends " + "effortlessly.", + style: TextStyle( + fontFamily: "Gotham", + fontSize: 11, + fontWeight: FontWeight.w300, + color: Colors.white, + backgroundColor: Color.fromARGB(13, 0, 0, 0)), + textAlign: TextAlign.center, + ), + const Spacer(), + ], + ), + ), + ]), + ); + } +} diff --git a/lib/view/screens/create_screen.dart b/lib/view/screens/create_screen.dart new file mode 100644 index 0000000..d1cd098 --- /dev/null +++ b/lib/view/screens/create_screen.dart @@ -0,0 +1,157 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:spotify_collab_app/view/widgets/background_widget.dart'; +import 'package:spotify_collab_app/view/widgets/custom_text_field.dart'; +import 'package:spotify_collab_app/providers/photo_upload_notifier.dart'; + +class CreateScreen extends ConsumerWidget { + const CreateScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + double width = MediaQuery.sizeOf(context).width; + double height = MediaQuery.sizeOf(context).height; + final TextEditingController eventNameController = TextEditingController(); + + return Scaffold( + resizeToAvoidBottomInset: false, + body: Stack( + children: [ + BackgroundWidget( + width: width, + height: height, + color: Colors.white.withOpacity(0.35), + ), + Padding( + padding: EdgeInsets.symmetric( + horizontal: width * 0.05, + vertical: height * 0.06, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + IconButton( + onPressed: () {}, + icon: const Icon(Icons.arrow_back_ios), + color: const Color(0xff5822EE), + ), + ], + ), + SizedBox( + height: height * 0.04, + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: width * 0.03), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'new shared playlist', + style: TextStyle( + fontFamily: 'Gotham', + shadows: [ + Shadow( + color: Color(0xffDA84FE), + offset: Offset(0, 2), + ), + ], + fontSize: 30, + fontWeight: FontWeight.w900, + color: Colors.white, + ), + ), + SizedBox( + height: height * 0.04, + ), + Center( + child: GestureDetector( + onTap: () { + ref.read(photoUploadProvider.notifier).pickImage(); + }, + child: Stack( + children: [ + CircleAvatar( + radius: width * 0.15, + backgroundImage: ref + .watch(photoUploadProvider) != + null + ? FileImage(ref.watch(photoUploadProvider)!) + : null, + child: ref.watch(photoUploadProvider) == null + ? const Text( + 'Upload\n Photo', + textAlign: TextAlign.center, + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 20, + fontWeight: FontWeight.w400, + color: Colors.white, + ), + ) + : null, + ), + Positioned( + top: height * 0.1, + bottom: 0, + child: SvgPicture.asset( + 'assets/plus.svg', + ), + ), + ], + ), + ), + ), + SizedBox( + height: height * 0.055, + ), + CustomTextField( + labelText: 'event name', + obscureText: false, + textEditingController: eventNameController, + ), + SizedBox( + height: height * 0.02, + ), + Align( + alignment: Alignment.centerRight, + child: ElevatedButton( + style: ButtonStyle( + shape: WidgetStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + ), + backgroundColor: WidgetStateProperty.all( + const Color(0xff5822EE), + ), + ), + onPressed: () {}, + child: const Padding( + padding: EdgeInsets.symmetric( + horizontal: 5.0, vertical: 5), + child: Text( + 'create event', + style: TextStyle( + fontFamily: 'Gotham', + fontSize: 16, + color: Colors.white, + ), + ), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/view/screens/home_screen.dart b/lib/view/screens/home_screen.dart new file mode 100644 index 0000000..b0c3561 --- /dev/null +++ b/lib/view/screens/home_screen.dart @@ -0,0 +1,284 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter_svg/svg.dart'; + +class HomeScreen extends StatelessWidget { + const HomeScreen({super.key}); + + @override + Widget build(BuildContext context) { + return Scaffold( + backgroundColor: const Color(0xff111111), + appBar: AppBar( + title: const Title( + title: "shared playlists", + ), + backgroundColor: Colors.transparent, + ), + body: Stack( + children: [ + SizedBox( + height: double.maxFinite, + width: double.maxFinite, + child: SvgPicture.asset( + 'assets/bg.svg', + colorFilter: + const ColorFilter.mode(Color(0xffd1dfdb), BlendMode.srcIn), + fit: BoxFit.cover, + ), + ), + const Padding( + padding: EdgeInsets.all(32.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "Create new Playlist ·", + style: TextStyle( + fontFamily: "Gotham", + fontWeight: FontWeight.w700, + fontSize: 16, + ), + ), + SizedBox( + height: 10, + ), + NewPlaylistButton(), + SizedBox( + height: 20, + ), + Text( + "Active ·", + style: TextStyle( + fontFamily: "Gotham", + fontWeight: FontWeight.w700, + fontSize: 16, + ), + ), + SizedBox( + height: 10, + ), + PlaylistCard( + isActive: true, + ), + SizedBox( + height: 20, + ), + Text( + "Recent ·", + style: TextStyle( + fontFamily: "Gotham", + fontWeight: FontWeight.w700, + fontSize: 16, + ), + ), + SizedBox( + height: 10, + ), + PlaylistCard( + name: "WomenTechies' 24", + participants: 234, + img: "assets/wt.png", + ), + SizedBox( + height: 15, + ), + PlaylistCard( + name: "Hexathon' 23", + participants: 1200, + img: "assets/hexathon.png", + ), + ], + ), + ), + ], + ), + ); + } +} + +class Title extends StatelessWidget { + const Title({ + super.key, + required this.title, + }); + + final String title; + + @override + Widget build(BuildContext context) { + return Row( + children: [ + const Spacer(), + const SizedBox( + width: 20, + ), + Text( + title, + style: const TextStyle( + fontFamily: "Gotham", + fontWeight: FontWeight.w700, + fontSize: 34, + shadows: [ + Shadow(offset: Offset(0, 1), color: Color(0xffDA84FE)) + ]), + ), + Column( + children: [ + SvgPicture.asset( + 'assets/highlight.svg', + ), + const SizedBox( + height: 30, + ), + ], + ), + const Spacer(), + ], + ); + } +} + +class PlaylistCard extends StatelessWidget { + const PlaylistCard( + {super.key, + this.isActive = false, + this.name = "DevJams' 24", + this.participants = 587, + this.img = "assets/dino.png"}); + + final bool isActive; + final String name; + final int participants; + final String img; + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: Container( + height: 102, + decoration: BoxDecoration( + color: isActive ? const Color(0xff5822EE) : Colors.white, + borderRadius: const BorderRadius.all(Radius.circular(8))), + child: Padding( + padding: const EdgeInsets.all(20.0), + child: Stack(children: [ + Row( + children: [ + Container( + height: 57, + width: 57, + decoration: BoxDecoration( + image: DecorationImage( + image: AssetImage(img), fit: BoxFit.cover), + shape: BoxShape.circle, + ), + ), + const SizedBox( + width: 10, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + name, + style: TextStyle( + fontFamily: "Gotham", + fontWeight: FontWeight.w700, + fontSize: 16, + color: !isActive + ? const Color.fromARGB(255, 0, 0, 0) + : Colors.white), + ), + Row( + children: [ + Icon( + Icons.people_alt_outlined, + size: 19, + color: !isActive + ? const Color(0xff000000) + : Colors.white, + ), + const SizedBox( + width: 5, + ), + Text( + participants.toString(), + style: TextStyle( + fontFamily: "Gotham", + fontWeight: FontWeight.w700, + fontSize: 16, + color: !isActive + ? const Color(0xff000000) + : Colors.white, + ), + ) + ], + ) + ], + ), + const Spacer(), + ], + ), + Align( + alignment: Alignment.bottomRight, + child: Container( + width: 97, + height: 31, + decoration: BoxDecoration( + color: + !isActive ? const Color(0xff5822EE) : Colors.white, + borderRadius: + const BorderRadius.all(Radius.circular(8)), + ), + child: Center( + child: Text( + isActive ? "Manage" : "View", + style: TextStyle( + color: isActive + ? const Color(0xff5822EE) + : Colors.white, + fontFamily: "Gotham", + fontWeight: FontWeight.w700, + fontSize: 16, + ), + ), + ), + ), + ) + ]), + )), + ), + ], + ); + } +} + +class NewPlaylistButton extends StatelessWidget { + const NewPlaylistButton({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return Row( + children: [ + Expanded( + child: Container( + height: 59, + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(8))), + child: const Icon( + Icons.add_circle, + color: Color(0xff5822EE), + size: 43, + ), + ), + ), + ], + ); + } +} diff --git a/lib/view/screens/join_screen.dart b/lib/view/screens/join_screen.dart new file mode 100644 index 0000000..ca92341 --- /dev/null +++ b/lib/view/screens/join_screen.dart @@ -0,0 +1,209 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:spotify_collab_app/view/widgets/background_widget.dart'; + +class JoinScreen extends ConsumerWidget { + const JoinScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + double width = MediaQuery.sizeOf(context).width; + double height = MediaQuery.sizeOf(context).height; + + return Scaffold( + resizeToAvoidBottomInset: false, + body: Stack( + children: [ + BackgroundWidget( + width: width, + height: height, + color: Colors.white.withOpacity(0.35), + ), + Padding( + padding: EdgeInsets.symmetric( + horizontal: width * 0.05, + vertical: height * 0.06, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + IconButton( + onPressed: () {}, + icon: const Icon(Icons.arrow_back_ios), + color: const Color(0xff5822EE), + ), + ], + ), + SizedBox( + height: height * 0.05, + ), + Padding( + padding: EdgeInsets.symmetric(horizontal: width * 0.03), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Text( + 'join Event', + style: TextStyle( + fontFamily: 'Gotham', + shadows: [ + Shadow( + color: Color(0xffDA84FE), + offset: Offset(0, 2), + ), + ], + fontSize: 30, + fontWeight: FontWeight.w900, + color: Colors.white, + ), + ), + SizedBox( + height: height * 0.05, + ), + const Text( + 'event link:', + style: TextStyle( + fontFamily: 'Gotham', + fontSize: 20, + fontWeight: FontWeight.w700, + color: Colors.white, + ), + ), + SizedBox( + height: height * 0.01, + ), + Row( + children: [ + Expanded( + child: SizedBox( + height: height * 0.045, + child: TextField( + style: const TextStyle( + fontFamily: 'Gotham', + fontSize: 16, + color: Colors.black, + ), + decoration: InputDecoration( + fillColor: Colors.white, + contentPadding: EdgeInsets.symmetric( + vertical: (height * 0.045 - 32) / 2, + horizontal: 10), + filled: true, + border: OutlineInputBorder( + borderRadius: BorderRadius.circular(10), + borderSide: const BorderSide( + color: Color(0xff5822EE), + ), + ), + ), + ), + )), + const SizedBox(width: 10), + ElevatedButton( + style: ButtonStyle( + shape: WidgetStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + ), + backgroundColor: WidgetStateProperty.all( + const Color(0xff5822EE), + ), + ), + onPressed: () {}, + child: const Padding( + padding: EdgeInsets.symmetric( + horizontal: 2.5, vertical: 2.5), + child: Text( + 'copy link', + style: TextStyle( + fontFamily: 'Gotham', + fontSize: 16, + color: Colors.white, + ), + ), + ), + ), + ], + ), + SizedBox( + height: height * 0.02, + ), + Row( + children: [ + Expanded( + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 10.0), + child: Divider( + color: Colors.white.withOpacity(0.5), + thickness: 1, + ), + ), + ), + Text( + 'or', + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 16, + fontWeight: FontWeight.w400, + color: Colors.white.withOpacity(0.5), + ), + ), + Expanded( + child: Padding( + padding: + const EdgeInsets.symmetric(horizontal: 10.0), + child: Divider( + color: Colors.white.withOpacity(0.5), + thickness: 1, + ), + ), + ), + ], + ), + SizedBox( + height: height * 0.02, + ), + SizedBox( + width: double.infinity, + child: ElevatedButton( + style: ButtonStyle( + shape: WidgetStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + ), + backgroundColor: WidgetStateProperty.all( + const Color(0xff5822EE), + ), + ), + onPressed: () {}, + child: const Padding( + padding: EdgeInsets.symmetric( + horizontal: 2.5, vertical: 2.5), + child: Text( + 'generate qr', + style: TextStyle( + fontFamily: 'Gotham', + fontSize: 16, + color: Colors.white, + ), + ), + ), + ), + ), + ], + ), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/view/screens/landing_screen.dart b/lib/view/screens/landing_screen.dart new file mode 100644 index 0000000..9e816d8 --- /dev/null +++ b/lib/view/screens/landing_screen.dart @@ -0,0 +1,139 @@ +import 'package:flutter/material.dart'; + +import 'package:go_router/go_router.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter_svg/svg.dart'; + +class LandingScreen extends StatelessWidget { + const LandingScreen({super.key}); + + @override + Widget build(BuildContext context) { + double height = MediaQuery.sizeOf(context).height; + + return Scaffold( + appBar: AppBar( + backgroundColor: Colors.transparent, + ), + backgroundColor: const Color(0xff5822EE), + body: Stack( + children: [ + SizedBox( + height: double.infinity, + width: double.infinity, + child: SvgPicture.asset( + 'assets/bg_splash.svg', + fit: BoxFit.cover, + ), + ), + Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + const Spacer(), + Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Column( + children: [ + const SizedBox( + height: 40, + ), + SvgPicture.asset( + 'assets/splash_left.svg', + fit: BoxFit.cover, + ), + ], + ), + const Text( + 'collabify', + style: TextStyle( + fontFamily: 'Gotham', + shadows: [ + Shadow( + color: Color(0xffDA84FE), + offset: Offset(0, 2), + ), + ], + fontSize: 45, + fontWeight: FontWeight.w900, + color: Colors.white, + ), + ), + Column( + children: [ + SvgPicture.asset( + 'assets/splash_right.svg', + fit: BoxFit.cover, + ), + const SizedBox( + height: 25, + ), + ], + ), + ], + ), + ), + const Spacer(), + ElevatedButton( + style: ButtonStyle( + shape: WidgetStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(42.0), + ), + ), + backgroundColor: WidgetStateProperty.all( + const Color(0xff111111), + ), + ), + onPressed: () => context.go('/signup'), + child: const Padding( + padding: EdgeInsets.symmetric(horizontal: 32.0, vertical: 16), + child: Text( + 'Not a member? Sign up', + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 20, + color: Colors.white, + ), + ), + ), + ), + ElevatedButton( + style: ButtonStyle( + elevation: WidgetStateProperty.all(0), + shape: WidgetStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(42.0), + ), + ), + backgroundColor: WidgetStateProperty.all( + Colors.transparent, + ), + ), + onPressed: () => context.go('/login'), + child: const Padding( + padding: EdgeInsets.symmetric( + horizontal: 32.0, + vertical: 16, + ), + child: Text( + 'Log in', + style: TextStyle( + fontFamily: 'Poppins', + fontSize: 20, + color: Colors.white, + ), + ), + ), + ), + SizedBox( + height: height * 0.01, + ) + ], + ), + ], + ), + ); + } +} diff --git a/lib/view/screens/login_screen.dart b/lib/view/screens/login_screen.dart new file mode 100644 index 0000000..f40915e --- /dev/null +++ b/lib/view/screens/login_screen.dart @@ -0,0 +1,203 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:spotify_collab_app/view/widgets/custom_text_field.dart'; + +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter_svg/svg.dart'; + +final textFieldVisibilityProvider = StateProvider((ref) => 0); + +class LoginScreen extends ConsumerWidget { + const LoginScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + double width = MediaQuery.sizeOf(context).width; + double height = MediaQuery.sizeOf(context).height; + + final textFieldVisibility = ref.watch(textFieldVisibilityProvider); + final emailController = TextEditingController(); + final passwordController = TextEditingController(); + + return Scaffold( + resizeToAvoidBottomInset: false, + appBar: AppBar( + centerTitle: false, + automaticallyImplyLeading: false, + title: IconButton( + onPressed: () { + if (textFieldVisibility == 1) { + ref.read(textFieldVisibilityProvider.notifier).state = 0; + } else { + context.go('/'); + } + }, + icon: SvgPicture.asset( + 'assets/back.svg', + colorFilter: + const ColorFilter.mode(Color(0xff5822EE), BlendMode.srcIn), + fit: BoxFit.cover, + ), + ), + backgroundColor: Colors.transparent, + ), + body: Stack( + children: [ + SizedBox( + height: double.infinity, + width: double.infinity, + child: SvgPicture.asset( + 'assets/bg.svg', + colorFilter: + const ColorFilter.mode(Color(0xffd1dfdb), BlendMode.srcIn), + fit: BoxFit.cover, + ), + ), + Padding( + padding: EdgeInsets.symmetric( + horizontal: width * 0.05, + vertical: height * 0.06, + ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: width * 0.05, + ), + child: const Row( + children: [ + Text( + 'log in', + style: TextStyle( + fontFamily: 'Gotham', + shadows: [ + Shadow( + color: Color(0xffDA84FE), + offset: Offset(0, 2), + ), + ], + fontSize: 40, + fontWeight: FontWeight.w900, + color: Colors.white, + ), + ), + ], + ), + ), + if (textFieldVisibility == 0) ...[ + Padding( + padding: EdgeInsets.symmetric( + horizontal: width * 0.05, + vertical: height * 0.025, + ), + child: CustomTextField( + textEditingController: emailController, + labelText: 'whats your email?', + obscureText: false, + ), + ), + Padding( + padding: EdgeInsets.only(right: width * 0.05), + child: Align( + alignment: Alignment.centerRight, + child: ElevatedButton( + style: ButtonStyle( + shape: WidgetStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + ), + backgroundColor: WidgetStateProperty.all( + const Color(0xff5822EE), + ), + ), + onPressed: () { + ref.read(textFieldVisibilityProvider.notifier).state = + 1; + }, + child: const Padding( + padding: EdgeInsets.symmetric( + horizontal: 5.0, vertical: 5), + child: Text( + 'Next', + style: TextStyle( + fontFamily: 'Gotham', + fontSize: 16, + color: Colors.white, + ), + ), + ), + ), + ), + ), + ] else if (textFieldVisibility == 1) ...[ + Padding( + padding: EdgeInsets.symmetric( + horizontal: width * 0.05, + vertical: height * 0.025, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomTextField( + textEditingController: passwordController, + labelText: 'password', + obscureText: true, + ), + Padding( + padding: EdgeInsets.only(top: height * 0.01), + child: const Text( + 'forgot password?', + style: TextStyle( + fontFamily: 'Gotham', + fontSize: 11, + fontWeight: FontWeight.w200, + color: Color(0xffffffff), + ), + ), + ) + ], + ), + ), + Padding( + padding: EdgeInsets.only(right: width * 0.05), + child: Align( + alignment: Alignment.centerRight, + child: ElevatedButton( + style: ButtonStyle( + shape: WidgetStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + ), + backgroundColor: WidgetStateProperty.all( + const Color(0xff5822EE), + ), + ), + onPressed: () {}, + child: const Padding( + padding: EdgeInsets.symmetric( + horizontal: 5.0, vertical: 5), + child: Text( + 'Continue', + style: TextStyle( + fontFamily: 'Gotham', + fontSize: 16, + color: Colors.white, + ), + ), + ), + ), + ), + ), + ], + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/view/screens/signup_screen.dart b/lib/view/screens/signup_screen.dart new file mode 100644 index 0000000..ec5cc96 --- /dev/null +++ b/lib/view/screens/signup_screen.dart @@ -0,0 +1,199 @@ +import 'package:flutter/material.dart'; + +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; +import 'package:spotify_collab_app/view/widgets/custom_text_field.dart'; + +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter_svg/svg.dart'; + +final textFieldVisibilityProvider = StateProvider((ref) => 0); + +class SignupScreen extends ConsumerWidget { + const SignupScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + double width = MediaQuery.sizeOf(context).width; + double height = MediaQuery.sizeOf(context).height; + + final textFieldVisibility = ref.watch(textFieldVisibilityProvider); + final emailController = TextEditingController(); + final passwordController = TextEditingController(); + final confirmPasswordController = TextEditingController(); + + return Scaffold( + resizeToAvoidBottomInset: false, + appBar: AppBar( + centerTitle: false, + automaticallyImplyLeading: false, + title: IconButton( + onPressed: () { + if (textFieldVisibility == 1) { + ref.read(textFieldVisibilityProvider.notifier).state = 0; + } else { + context.go('/'); + } + }, + icon: SvgPicture.asset( + 'assets/back.svg', + colorFilter: + const ColorFilter.mode(Color(0xff5822EE), BlendMode.srcIn), + fit: BoxFit.cover, + ), + ), + backgroundColor: Colors.transparent, + ), + body: Stack( + children: [ + SizedBox( + height: double.infinity, + width: double.infinity, + child: SvgPicture.asset( + 'assets/bg.svg', + colorFilter: + const ColorFilter.mode(Color(0xffd1dfdb), BlendMode.srcIn), + fit: BoxFit.cover, + ), + ), + Padding( + padding: EdgeInsets.symmetric( + horizontal: width * 0.05, + vertical: height * 0.06, + ), + child: Column( + children: [ + Padding( + padding: EdgeInsets.symmetric( + horizontal: width * 0.05, + ), + child: const Row( + children: [ + Text( + 'sign up', + style: TextStyle( + fontFamily: 'Gotham', + shadows: [ + Shadow( + color: Color(0xffDA84FE), + offset: Offset(0, 2), + ), + ], + fontSize: 40, + fontWeight: FontWeight.w900, + color: Colors.white, + ), + ), + ], + ), + ), + if (textFieldVisibility == 0) ...[ + Padding( + padding: EdgeInsets.symmetric( + horizontal: width * 0.05, + vertical: height * 0.025, + ), + child: CustomTextField( + textEditingController: emailController, + labelText: 'whats your email?', + obscureText: false, + ), + ), + Padding( + padding: EdgeInsets.only(right: width * 0.05), + child: Align( + alignment: Alignment.centerRight, + child: ElevatedButton( + style: ButtonStyle( + shape: WidgetStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + ), + backgroundColor: WidgetStateProperty.all( + const Color(0xff5822EE), + ), + ), + onPressed: () { + ref.read(textFieldVisibilityProvider.notifier).state = + 1; + }, + child: const Padding( + padding: EdgeInsets.symmetric( + horizontal: 5.0, vertical: 5), + child: Text( + 'Next', + style: TextStyle( + fontFamily: 'Gotham', + fontSize: 16, + color: Colors.white, + ), + ), + ), + ), + ), + ), + ] else if (textFieldVisibility == 1) ...[ + Padding( + padding: EdgeInsets.symmetric( + horizontal: width * 0.05, + vertical: height * 0.025, + ), + child: CustomTextField( + textEditingController: passwordController, + labelText: 'password', + obscureText: true, + ), + ), + Padding( + padding: EdgeInsets.only( + left: width * 0.05, + right: width * 0.05, + bottom: height * 0.025, + ), + child: CustomTextField( + textEditingController: confirmPasswordController, + labelText: 'confirm password', + obscureText: true, + ), + ), + Padding( + padding: EdgeInsets.only(right: width * 0.05), + child: Align( + alignment: Alignment.centerRight, + child: ElevatedButton( + style: ButtonStyle( + shape: WidgetStateProperty.all( + RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + ), + backgroundColor: WidgetStateProperty.all( + const Color(0xff5822EE), + ), + ), + onPressed: () {}, + child: const Padding( + padding: EdgeInsets.symmetric( + horizontal: 5.0, vertical: 5), + child: Text( + 'Continue', + style: TextStyle( + fontFamily: 'Gotham', + fontSize: 16, + color: Colors.white, + ), + ), + ), + ), + ), + ), + ], + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/view/screens/u_login_screen.dart b/lib/view/screens/u_login_screen.dart deleted file mode 100644 index 1fb3228..0000000 --- a/lib/view/screens/u_login_screen.dart +++ /dev/null @@ -1,80 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:spotify_collab_app/view/widgets/u_custom_text_field.dart'; - -class LoginScreen extends StatelessWidget { - const LoginScreen({super.key}); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - leading: IconButton( - icon: const Icon(Icons.arrow_back, color: Colors.white), - onPressed: () { - // Handle back button press - }, - ), - centerTitle: true, - title: const Text( - 'Sign in to your account', - style: TextStyle( - color: Colors.white, - fontSize: 20, - fontWeight: FontWeight.w600, - ), - ), - ), - body: Container( - decoration: const BoxDecoration( - gradient: LinearGradient( - begin: Alignment.topLeft, - end: Alignment(0.8, 1), - colors: [ - Color(0xff000000), - Color(0xff051e0f), - Color(0xff083216), - ], - tileMode: TileMode.mirror, - ), - ), - child: SafeArea( - child: LayoutBuilder( - builder: (context, constraints) { - return SingleChildScrollView( - physics: const NeverScrollableScrollPhysics(), - padding: - const EdgeInsets.symmetric(horizontal: 20, vertical: 40), - child: ConstrainedBox( - constraints: BoxConstraints( - minHeight: constraints.maxHeight, - ), - child: const IntrinsicHeight( - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - SizedBox(height: 50), - CustomTextField( - labelText: 'Email ID', - obscureText: false, - ), - SizedBox(height: 50), - CustomTextField( - labelText: 'Password', - obscureText: true, - ), - SizedBox(height: 70), - Center( - child: LoginButton(), - ), - ], - ), - ), - ), - ); - }, - ), - ), - ), - ); - } -} diff --git a/lib/view/widgets/background_widget.dart b/lib/view/widgets/background_widget.dart new file mode 100644 index 0000000..96d9ad5 --- /dev/null +++ b/lib/view/widgets/background_widget.dart @@ -0,0 +1,98 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +class BackgroundWidget extends StatelessWidget { + const BackgroundWidget({ + super.key, + required this.width, + required this.height, + required this.color, + }); + + final double width; + final double height; + final Color color; + + @override + Widget build(BuildContext context) { + return IgnorePointer( + ignoring: true, + child: Stack( + children: [ + Positioned( + left: width * 0.3, + child: SvgPicture.asset( + 'assets/login_bg/Union.svg', + colorFilter: ColorFilter.mode( + color, + BlendMode.modulate, + ), + ), + ), + Positioned( + top: height * 0.27, + left: width * 0.6, + child: SvgPicture.asset( + 'assets/login_bg/Union-1.svg', + colorFilter: ColorFilter.mode( + color, + BlendMode.modulate, + ), + ), + ), + Positioned( + top: height * 0.45, + child: SvgPicture.asset( + 'assets/login_bg/Union-2.svg', + colorFilter: ColorFilter.mode( + color, + BlendMode.modulate, + ), + ), + ), + Positioned( + top: height * 0.05, + child: SvgPicture.asset( + 'assets/login_bg/Union-3.svg', + colorFilter: ColorFilter.mode( + color, + BlendMode.modulate, + ), + ), + ), + Positioned( + top: height * 0.45, + right: 0, + child: SvgPicture.asset( + 'assets/login_bg/Union-4.svg', + colorFilter: ColorFilter.mode( + color, + BlendMode.modulate, + ), + ), + ), + Positioned( + bottom: 0, + child: SvgPicture.asset( + 'assets/login_bg/Union-5.svg', + colorFilter: ColorFilter.mode( + color, + BlendMode.modulate, + ), + ), + ), + Positioned( + right: 0, + child: SvgPicture.asset( + 'assets/login_bg/Union-6.svg', + colorFilter: ColorFilter.mode( + color, + BlendMode.modulate, + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/view/widgets/u_custom_text_field.dart b/lib/view/widgets/custom_text_field.dart similarity index 72% rename from lib/view/widgets/u_custom_text_field.dart rename to lib/view/widgets/custom_text_field.dart index 492beac..3d4b0c2 100644 --- a/lib/view/widgets/u_custom_text_field.dart +++ b/lib/view/widgets/custom_text_field.dart @@ -3,11 +3,13 @@ import 'package:flutter/material.dart'; class CustomTextField extends StatefulWidget { final String labelText; final bool obscureText; + final TextEditingController textEditingController; const CustomTextField({ super.key, required this.labelText, required this.obscureText, + required this.textEditingController, }); @override @@ -27,7 +29,7 @@ class CustomTextFieldState extends State { style: const TextStyle( color: Colors.white, fontSize: 18, - fontFamily: 'Avenir Next', + fontFamily: 'Gotham', fontWeight: FontWeight.w600, ), ), @@ -38,7 +40,8 @@ class CustomTextFieldState extends State { borderRadius: BorderRadius.circular(10), ), child: TextField( - style: const TextStyle(color: Colors.white), + controller: widget.textEditingController, + style: const TextStyle(color: Colors.white, fontFamily: 'Gotham'), obscureText: widget.obscureText && !_isPasswordVisible, decoration: InputDecoration( border: OutlineInputBorder( @@ -77,36 +80,3 @@ class CustomTextFieldState extends State { ); } } - -class LoginButton extends StatelessWidget { - const LoginButton({super.key}); - - @override - Widget build(BuildContext context) { - return Container( - width: double.infinity, - height: 50, - decoration: BoxDecoration( - border: Border.all(color: Colors.white), - borderRadius: BorderRadius.circular(25), - ), - child: ElevatedButton( - onPressed: () { - // Handle login button press - }, - style: ElevatedButton.styleFrom( - shadowColor: Colors.transparent, - ), - child: const Text( - 'Login', - style: TextStyle( - color: Colors.white, - fontSize: 18, - fontFamily: 'Avenir Next', - fontWeight: FontWeight.w600, - ), - ), - ), - ); - } -} diff --git a/linux/flutter/generated_plugin_registrant.cc b/linux/flutter/generated_plugin_registrant.cc index e71a16d..64a0ece 100644 --- a/linux/flutter/generated_plugin_registrant.cc +++ b/linux/flutter/generated_plugin_registrant.cc @@ -6,6 +6,10 @@ #include "generated_plugin_registrant.h" +#include void fl_register_plugins(FlPluginRegistry* registry) { + g_autoptr(FlPluginRegistrar) file_selector_linux_registrar = + fl_plugin_registry_get_registrar_for_plugin(registry, "FileSelectorPlugin"); + file_selector_plugin_register_with_registrar(file_selector_linux_registrar); } diff --git a/linux/flutter/generated_plugins.cmake b/linux/flutter/generated_plugins.cmake index 2e1de87..2db3c22 100644 --- a/linux/flutter/generated_plugins.cmake +++ b/linux/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + file_selector_linux ) list(APPEND FLUTTER_FFI_PLUGIN_LIST diff --git a/macos/Flutter/Flutter-Debug.xcconfig b/macos/Flutter/Flutter-Debug.xcconfig index c2efd0b..4b81f9b 100644 --- a/macos/Flutter/Flutter-Debug.xcconfig +++ b/macos/Flutter/Flutter-Debug.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/Flutter-Release.xcconfig b/macos/Flutter/Flutter-Release.xcconfig index c2efd0b..5caa9d1 100644 --- a/macos/Flutter/Flutter-Release.xcconfig +++ b/macos/Flutter/Flutter-Release.xcconfig @@ -1 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" #include "ephemeral/Flutter-Generated.xcconfig" diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index cccf817..14b5f7c 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,6 +5,8 @@ import FlutterMacOS import Foundation +import file_selector_macos func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + FileSelectorPlugin.register(with: registry.registrar(forPlugin: "FileSelectorPlugin")) } diff --git a/macos/Podfile b/macos/Podfile new file mode 100644 index 0000000..c795730 --- /dev/null +++ b/macos/Podfile @@ -0,0 +1,43 @@ +platform :osx, '10.14' + +# 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', 'ephemeral', '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 Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_macos_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_macos_build_settings(target) + end +end diff --git a/macos/Podfile.lock b/macos/Podfile.lock new file mode 100644 index 0000000..da62184 --- /dev/null +++ b/macos/Podfile.lock @@ -0,0 +1,22 @@ +PODS: + - file_selector_macos (0.0.1): + - FlutterMacOS + - FlutterMacOS (1.0.0) + +DEPENDENCIES: + - file_selector_macos (from `Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos`) + - FlutterMacOS (from `Flutter/ephemeral`) + +EXTERNAL SOURCES: + file_selector_macos: + :path: Flutter/ephemeral/.symlinks/plugins/file_selector_macos/macos + FlutterMacOS: + :path: Flutter/ephemeral + +SPEC CHECKSUMS: + file_selector_macos: 54fdab7caa3ac3fc43c9fac4d7d8d231277f8cf2 + FlutterMacOS: 8f6f14fa908a6fb3fba0cd85dbd81ec4b251fb24 + +PODFILE CHECKSUM: 236401fc2c932af29a9fcf0e97baeeb2d750d367 + +COCOAPODS: 1.15.2 diff --git a/macos/Runner.xcodeproj/project.pbxproj b/macos/Runner.xcodeproj/project.pbxproj index 35f939b..8bba76d 100644 --- a/macos/Runner.xcodeproj/project.pbxproj +++ b/macos/Runner.xcodeproj/project.pbxproj @@ -27,6 +27,8 @@ 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; + 4B3FE7F8545C7F725E76729A /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0B9DC62D50145A83CA6E23EA /* Pods_Runner.framework */; }; + 6C2CB41FB61EE65C48348B55 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 80CADBF94CA5B2A8F7DA6281 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -60,11 +62,12 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 0B9DC62D50145A83CA6E23EA /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; - 33CC10ED2044A3C60003C045 /* spotifycollab.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "spotifycollab.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10ED2044A3C60003C045 /* spotifycollab.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = spotifycollab.app; sourceTree = BUILT_PRODUCTS_DIR; }; 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; @@ -76,8 +79,15 @@ 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 45B0E43EBA7E00D582B06EE2 /* 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 = ""; }; + 5EDE34327016041CADE858ED /* 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 = ""; }; + 742DFBD42C194F9FFAEF1DF6 /* 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 = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 80CADBF94CA5B2A8F7DA6281 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 892D19F8B195B127CE334336 /* 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 = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + 9E7A56ACDE1948DB81F7B475 /* 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 = ""; }; + B463B0B318361D8E4A8FB4D4 /* 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 = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -85,6 +95,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 6C2CB41FB61EE65C48348B55 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -92,6 +103,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 4B3FE7F8545C7F725E76729A /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -125,6 +137,7 @@ 331C80D6294CF71000263BE5 /* RunnerTests */, 33CC10EE2044A3C60003C045 /* Products */, D73912EC22F37F3D000D13A0 /* Frameworks */, + DB2A3578F5D3C179F8D04E5B /* Pods */, ); sourceTree = ""; }; @@ -175,10 +188,26 @@ D73912EC22F37F3D000D13A0 /* Frameworks */ = { isa = PBXGroup; children = ( + 0B9DC62D50145A83CA6E23EA /* Pods_Runner.framework */, + 80CADBF94CA5B2A8F7DA6281 /* Pods_RunnerTests.framework */, ); name = Frameworks; sourceTree = ""; }; + DB2A3578F5D3C179F8D04E5B /* Pods */ = { + isa = PBXGroup; + children = ( + 892D19F8B195B127CE334336 /* Pods-Runner.debug.xcconfig */, + 742DFBD42C194F9FFAEF1DF6 /* Pods-Runner.release.xcconfig */, + 5EDE34327016041CADE858ED /* Pods-Runner.profile.xcconfig */, + 9E7A56ACDE1948DB81F7B475 /* Pods-RunnerTests.debug.xcconfig */, + B463B0B318361D8E4A8FB4D4 /* Pods-RunnerTests.release.xcconfig */, + 45B0E43EBA7E00D582B06EE2 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -186,6 +215,7 @@ isa = PBXNativeTarget; buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( + 5D5953BBE27480F588968FF3 /* [CP] Check Pods Manifest.lock */, 331C80D1294CF70F00263BE5 /* Sources */, 331C80D2294CF70F00263BE5 /* Frameworks */, 331C80D3294CF70F00263BE5 /* Resources */, @@ -204,11 +234,13 @@ isa = PBXNativeTarget; buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + B1F8B2A2E72955DDC06121BE /* [CP] Check Pods Manifest.lock */, 33CC10E92044A3C60003C045 /* Sources */, 33CC10EA2044A3C60003C045 /* Frameworks */, 33CC10EB2044A3C60003C045 /* Resources */, 33CC110E2044A8840003C045 /* Bundle Framework */, 3399D490228B24CF009A79C7 /* ShellScript */, + 9280B4316AC9F8951982546A /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -329,6 +361,67 @@ shellPath = /bin/sh; shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; }; + 5D5953BBE27480F588968FF3 /* [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; + }; + 9280B4316AC9F8951982546A /* [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; + }; + B1F8B2A2E72955DDC06121BE /* [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; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -380,6 +473,7 @@ /* Begin XCBuildConfiguration section */ 331C80DB294CF71000263BE5 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 9E7A56ACDE1948DB81F7B475 /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -394,6 +488,7 @@ }; 331C80DC294CF71000263BE5 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = B463B0B318361D8E4A8FB4D4 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; @@ -408,6 +503,7 @@ }; 331C80DD294CF71000263BE5 /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 45B0E43EBA7E00D582B06EE2 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CURRENT_PROJECT_VERSION = 1; diff --git a/macos/Runner.xcworkspace/contents.xcworkspacedata b/macos/Runner.xcworkspace/contents.xcworkspacedata index 1d526a1..21a3cc1 100644 --- a/macos/Runner.xcworkspace/contents.xcworkspacedata +++ b/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -4,4 +4,7 @@ + + diff --git a/pubspec.lock b/pubspec.lock index 150ada7..6f92f75 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -49,6 +49,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.18.0" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "7caf6a750a0c04effbb52a676dce9a4a592e10ad35c34d6d2d0e4811160d5670" + url: "https://pub.dev" + source: hosted + version: "0.3.4+2" cupertino_icons: dependency: "direct main" description: @@ -65,6 +73,38 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" + url: "https://pub.dev" + source: hosted + version: "0.9.2+1" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: f42eacb83b318e183b1ae24eead1373ab1334084404c8c16e0354f9a3e55d385 + url: "https://pub.dev" + source: hosted + version: "0.9.4" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: "2ad726953f6e8affbc4df8dc78b77c3b4a060967a291e528ef72ae846c60fb69" + url: "https://pub.dev" + source: hosted + version: "0.9.3+2" flutter: dependency: "direct main" description: flutter @@ -78,6 +118,22 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.2" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: "9d98bd47ef9d34e803d438f17fd32b116d31009f534a6fa5ce3a1167f189a6de" + url: "https://pub.dev" + source: hosted + version: "2.0.21" + flutter_riverpod: + dependency: "direct main" + description: + name: flutter_riverpod + sha256: "0f1974eff5bbe774bf1d870e406fc6f29e3d6f1c46bd9c58e7172ff68a785d7d" + url: "https://pub.dev" + source: hosted + version: "2.5.1" flutter_svg: dependency: "direct main" description: @@ -120,6 +176,70 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.2" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "021834d9c0c3de46bf0fe40341fa07168407f694d9b2bb18d532dc1261867f7a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "8c5abf0dcc24fe6e8e0b4a5c0b51a5cf30cefdf6407a3213dae61edc75a70f56" + url: "https://pub.dev" + source: hosted + version: "0.8.12+12" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: "65d94623e15372c5c51bebbcb820848d7bcb323836e12dfdba60b5d3a8b39e50" + url: "https://pub.dev" + source: hosted + version: "3.0.5" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: "6703696ad49f5c3c8356d576d7ace84d1faf459afb07accbb0fae780753ff447" + url: "https://pub.dev" + source: hosted + version: "0.8.12" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80" + url: "https://pub.dev" + source: hosted + version: "2.10.0" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" leak_tracker: dependency: transitive description: @@ -184,6 +304,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.12.0" + mime: + dependency: transitive + description: + name: mime + sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" + url: "https://pub.dev" + source: hosted + version: "1.0.5" path: dependency: transitive description: @@ -208,6 +336,22 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.2" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + riverpod: + dependency: transitive + description: + name: riverpod + sha256: f21b32ffd26a36555e501b04f4a5dca43ed59e16343f1a30c13632b2351dfa4d + url: "https://pub.dev" + source: hosted + version: "2.5.1" sky_engine: dependency: transitive description: flutter @@ -229,6 +373,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.11.1" + state_notifier: + dependency: transitive + description: + name: state_notifier + sha256: b8677376aa54f2d7c58280d5a007f9e8774f1968d1fb1c096adcb4792fba29bb + url: "https://pub.dev" + source: hosted + version: "1.0.0" stream_channel: dependency: transitive description: @@ -327,4 +479,4 @@ packages: version: "6.5.0" sdks: dart: ">=3.4.3 <4.0.0" - flutter: ">=3.18.0-18.0.pre.54" + flutter: ">=3.22.0" diff --git a/pubspec.yaml b/pubspec.yaml index 3541061..bfc9b63 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,6 +36,8 @@ dependencies: cupertino_icons: ^1.0.6 flutter_svg: ^2.0.10+1 go_router: ^14.2.1 + flutter_riverpod: ^2.5.1 + image_picker: ^1.1.2 dev_dependencies: flutter_test: @@ -60,7 +62,8 @@ flutter: # To add assets to your application, add an assets section, like this: assets: - - assets/logo.svg + - assets/ + - assets/login_bg/ # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware @@ -73,7 +76,117 @@ flutter: # "family" key with the font family name, and a "fonts" key with a # list giving the asset and other descriptors for the font. For # example: - # fonts: + fonts: + - family: Gotham + fonts: + - asset: fonts/Gotham/Gotham-Black.otf + weight: 900 + style: normal + - asset: fonts/Gotham/Gotham-BlackItalic.otf + weight: 900 + style: italic + - asset: fonts/Gotham/Gotham-Bold.otf + weight: 700 + style: normal + - asset: fonts/Gotham/Gotham-BoldItalic.otf + weight: 700 + style: italic + - asset: fonts/Gotham/Gotham-Book.otf + weight: 400 + style: normal + - asset: fonts/Gotham/Gotham-BookItalic.otf + weight: 400 + style: italic + - asset: fonts/Gotham/Gotham-Light.otf + weight: 300 + style: normal + - asset: fonts/Gotham/Gotham-LightItalic.otf + weight: 300 + style: italic + - asset: fonts/Gotham/Gotham-Medium.otf + weight: 500 + style: normal + - asset: fonts/Gotham/Gotham-MediumItalic.otf + weight: 500 + style: italic + - asset: fonts/Gotham/Gotham-Thin.otf + weight: 100 + style: normal + - asset: fonts/Gotham/Gotham-ThinItalic.otf + weight: 100 + style: italic + - asset: fonts/Gotham/Gotham-Ultra.otf + weight: 800 + style: normal + - asset: fonts/Gotham/Gotham-UltraItalic.otf + weight: 800 + style: italic + - asset: fonts/Gotham/Gotham-XLight.otf + weight: 200 + style: normal + - asset: fonts/Gotham/Gotham-XLightItalic.otf + weight: 200 + style: italic + - family: Poppins + fonts: + - asset: fonts/Poppins/Poppins-Black.ttf + weight: 900 + style: normal + - asset: fonts/Poppins/Poppins-BlackItalic.ttf + weight: 900 + style: italic + - asset: fonts/Poppins/Poppins-Bold.ttf + weight: 700 + style: normal + - asset: fonts/Poppins/Poppins-BoldItalic.ttf + weight: 700 + style: italic + - asset: fonts/Poppins/Poppins-ExtraBold.ttf + weight: 800 + style: normal + - asset: fonts/Poppins/Poppins-ExtraBoldItalic.ttf + weight: 800 + style: italic + - asset: fonts/Poppins/Poppins-ExtraLight.ttf + weight: 200 + style: normal + - asset: fonts/Poppins/Poppins-ExtraLightItalic.ttf + weight: 200 + style: italic + - asset: fonts/Poppins/Poppins-Italic.ttf + weight: 400 + style: italic + - asset: fonts/Poppins/Poppins-Light.ttf + weight: 300 + style: normal + - asset: fonts/Poppins/Poppins-LightItalic.ttf + weight: 300 + style: italic + - asset: fonts/Poppins/Poppins-Medium.ttf + weight: 500 + style: normal + - asset: fonts/Poppins/Poppins-MediumItalic.ttf + weight: 500 + style: italic + - asset: fonts/Poppins/Poppins-Regular.ttf + weight: 400 + style: normal + - asset: fonts/Poppins/Poppins-SemiBold.ttf + weight: 600 + style: normal + - asset: fonts/Poppins/Poppins-SemiBoldItalic.ttf + weight: 600 + style: italic + - asset: fonts/Poppins/Poppins-Thin.ttf + weight: 100 + style: normal + - asset: fonts/Poppins/Poppins-ThinItalic.ttf + weight: 100 + style: italic + - family: Product-Sans + fonts: + - asset: fonts/Product-Sans/Product-Sans-Regular.ttf + # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages diff --git a/windows/flutter/generated_plugin_registrant.cc b/windows/flutter/generated_plugin_registrant.cc index 8b6d468..77ab7a0 100644 --- a/windows/flutter/generated_plugin_registrant.cc +++ b/windows/flutter/generated_plugin_registrant.cc @@ -6,6 +6,9 @@ #include "generated_plugin_registrant.h" +#include void RegisterPlugins(flutter::PluginRegistry* registry) { + FileSelectorWindowsRegisterWithRegistrar( + registry->GetRegistrarForPlugin("FileSelectorWindows")); } diff --git a/windows/flutter/generated_plugins.cmake b/windows/flutter/generated_plugins.cmake index b93c4c3..a423a02 100644 --- a/windows/flutter/generated_plugins.cmake +++ b/windows/flutter/generated_plugins.cmake @@ -3,6 +3,7 @@ # list(APPEND FLUTTER_PLUGIN_LIST + file_selector_windows ) list(APPEND FLUTTER_FFI_PLUGIN_LIST