diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist index 7c56964..1dc6cf7 100644 --- a/ios/Flutter/AppFrameworkInfo.plist +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -21,6 +21,6 @@ CFBundleVersion 1.0 MinimumOSVersion - 12.0 + 13.0 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..620e46e --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,43 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '13.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! + + 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..992c012 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,47 @@ +PODS: + - country_codes (0.0.1): + - Flutter + - Flutter (1.0.0) + - flutter_timezone (0.0.1): + - Flutter + - package_info_plus (0.4.5): + - Flutter + - shared_preferences_foundation (0.0.1): + - Flutter + - FlutterMacOS + - url_launcher_ios (0.0.1): + - Flutter + +DEPENDENCIES: + - country_codes (from `.symlinks/plugins/country_codes/ios`) + - Flutter (from `Flutter`) + - flutter_timezone (from `.symlinks/plugins/flutter_timezone/ios`) + - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + +EXTERNAL SOURCES: + country_codes: + :path: ".symlinks/plugins/country_codes/ios" + Flutter: + :path: Flutter + flutter_timezone: + :path: ".symlinks/plugins/flutter_timezone/ios" + package_info_plus: + :path: ".symlinks/plugins/package_info_plus/ios" + shared_preferences_foundation: + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + +SPEC CHECKSUMS: + country_codes: b534fe92b5dd4d4cfd31a720f2bfa223373d162c + Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 + flutter_timezone: 7c838e17ffd4645d261e87037e5bebf6d38fe544 + package_info_plus: af8e2ca6888548050f16fa2f1938db7b5a5df499 + shared_preferences_foundation: 7036424c3d8ec98dfe75ff1667cb0cd531ec82bb + url_launcher_ios: 7a95fa5b60cc718a708b8f2966718e93db0cef1b + +PODFILE CHECKSUM: 3c63482e143d1b91d2d2560aee9fb04ecc74ac7e + +COCOAPODS: 1.16.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 43c90eb..57e9dc1 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 */; }; + D6AF61536FE25E9599461A74 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E57E810A499B08BAF03CC0D0 /* Pods_Runner.framework */; }; + EB6883DE340144BEBF060281 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5D944ECEE9C0E97512C6BCF1 /* Pods_RunnerTests.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -45,9 +47,13 @@ 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 = ""; }; + 5D944ECEE9C0E97512C6BCF1 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6229F102B123ED5F9F3BFE93 /* 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 = ""; }; + 6C0CDC925BB7C99C8EBD017E /* 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 = ""; }; 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 = ""; }; + 95C0595C8BB6FB8A5D611ED3 /* 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 = ""; }; 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,6 +61,10 @@ 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 = ""; }; + A17D7A19F74C6329B176EB0B /* 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 = ""; }; + AFBDA15C6A50D5350FED866E /* 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 = ""; }; + C79473F1C197D763A58E5350 /* 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 = ""; }; + E57E810A499B08BAF03CC0D0 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -62,12 +72,30 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + D6AF61536FE25E9599461A74 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E609A07D3395C2C4ECEA45C4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + EB6883DE340144BEBF060281 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 02A04AD3A6C2D216A3C8D5C8 /* Frameworks */ = { + isa = PBXGroup; + children = ( + E57E810A499B08BAF03CC0D0 /* Pods_Runner.framework */, + 5D944ECEE9C0E97512C6BCF1 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 331C8082294A63A400263BE5 /* RunnerTests */ = { isa = PBXGroup; children = ( @@ -76,6 +104,20 @@ path = RunnerTests; sourceTree = ""; }; + 7A415DEB957D1F1E6678B5C6 /* Pods */ = { + isa = PBXGroup; + children = ( + A17D7A19F74C6329B176EB0B /* Pods-Runner.debug.xcconfig */, + C79473F1C197D763A58E5350 /* Pods-Runner.release.xcconfig */, + AFBDA15C6A50D5350FED866E /* Pods-Runner.profile.xcconfig */, + 6C0CDC925BB7C99C8EBD017E /* Pods-RunnerTests.debug.xcconfig */, + 95C0595C8BB6FB8A5D611ED3 /* Pods-RunnerTests.release.xcconfig */, + 6229F102B123ED5F9F3BFE93 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( @@ -94,6 +136,8 @@ 97C146F01CF9000F007C117D /* Runner */, 97C146EF1CF9000F007C117D /* Products */, 331C8082294A63A400263BE5 /* RunnerTests */, + 7A415DEB957D1F1E6678B5C6 /* Pods */, + 02A04AD3A6C2D216A3C8D5C8 /* Frameworks */, ); sourceTree = ""; }; @@ -128,8 +172,10 @@ isa = PBXNativeTarget; buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; buildPhases = ( + 7A415F6AF1E8B7A582616E65 /* [CP] Check Pods Manifest.lock */, 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, + E609A07D3395C2C4ECEA45C4 /* Frameworks */, ); buildRules = ( ); @@ -145,12 +191,14 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( + 084A0FF0EE9676034AAFB1BE /* [CP] Check Pods Manifest.lock */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + EA6377470422299BFB036C7F /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -222,6 +270,28 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ + 084A0FF0EE9676034AAFB1BE /* [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; + }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -238,6 +308,28 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; + 7A415F6AF1E8B7A582616E65 /* [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; + }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -253,6 +345,23 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; }; + EA6377470422299BFB036C7F /* [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; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -346,7 +455,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; @@ -378,6 +487,7 @@ }; 331C8088294A63A400263BE5 /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 6C0CDC925BB7C99C8EBD017E /* Pods-RunnerTests.debug.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -395,6 +505,7 @@ }; 331C8089294A63A400263BE5 /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 95C0595C8BB6FB8A5D611ED3 /* Pods-RunnerTests.release.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -410,6 +521,7 @@ }; 331C808A294A63A400263BE5 /* Profile */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 6229F102B123ED5F9F3BFE93 /* Pods-RunnerTests.profile.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_STYLE = Automatic; @@ -472,7 +584,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -523,7 +635,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = iphoneos; diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme index 8e3ca5d..e3773d4 100644 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -26,6 +26,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + customLLDBInitFile = "$(SRCROOT)/Flutter/ephemeral/flutter_lldbinit" shouldUseLaunchSchemeArgsEnv = "YES"> 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/lib/features/events/screens/events_screen.dart b/lib/features/events/screens/events_screen.dart index 53237e0..b0c2cc1 100644 --- a/lib/features/events/screens/events_screen.dart +++ b/lib/features/events/screens/events_screen.dart @@ -1,10 +1,10 @@ -import 'package:fade_shimmer/fade_shimmer.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:icons_plus/icons_plus.dart'; import 'package:intl/intl.dart'; import 'package:pulse/features/events/cubit/events_cubit.dart'; import 'package:pulse/features/websites/models/website.dart'; +import 'package:pulse/widgets/loading_shimmer.dart'; import '../../../utils/colors.dart'; import '../../../utils/utils.dart'; import '../../../widgets/drop_down_btn.dart'; @@ -83,12 +83,7 @@ class _SessionsScreenState extends State { indent: 20, ), itemBuilder: (_, i) => state.appState == AppState.loading - ? FadeShimmer( - height: 80, - width: double.infinity, - radius: 8, - fadeTheme: FadeTheme.light, - ) + ? LoadingShimmer() : EventCard(event: state.events[i]), itemCount: state.appState == AppState.loading ? 6 diff --git a/lib/features/events/widgets/event_card.dart b/lib/features/events/widgets/event_card.dart index 0a364b0..5ca5182 100644 --- a/lib/features/events/widgets/event_card.dart +++ b/lib/features/events/widgets/event_card.dart @@ -51,10 +51,13 @@ class EventCard extends StatelessWidget { children: [ TextSpan( text: '${isEvent ? 'event' : 'view'} - ', - style: kBodyTextStyle.copyWith( - color: Colors.black, - fontWeight: FontWeight.bold, - ), + style: Theme.of(context) + .textTheme + .bodyMedium + ?.copyWith( + fontSize: 12, + fontWeight: FontWeight.bold, + ), ), TextSpan( text: isEvent ? event.eventName : event.urlPath, diff --git a/lib/features/nav_bar.dart b/lib/features/nav_bar.dart index 9ee618c..5ca8325 100644 --- a/lib/features/nav_bar.dart +++ b/lib/features/nav_bar.dart @@ -71,7 +71,7 @@ class _NavBarState extends State with TickerProviderStateMixin { kBodyTextStyle.copyWith(fontWeight: FontWeight.w600), unselectedLabelStyle: kBodyTextStyle.copyWith(color: kGreyColor), showSelectedLabels: true, - // backgroundColor: Theme.of(context).appBarTheme.backgroundColor, + backgroundColor: Theme.of(context).appBarTheme.backgroundColor, items: const [ BottomNavigationBarItem( icon: Icon(Icons.bar_chart_outlined), diff --git a/lib/features/overview/screens/overview_screen.dart b/lib/features/overview/screens/overview_screen.dart index d62fb7a..722c1ee 100644 --- a/lib/features/overview/screens/overview_screen.dart +++ b/lib/features/overview/screens/overview_screen.dart @@ -8,8 +8,8 @@ import 'package:pulse/features/websites/models/website.dart'; import 'package:pulse/utils/text.dart'; import 'package:pulse/widgets/drop_down.dart'; import 'package:pulse/widgets/drop_down_btn.dart'; -import 'package:fade_shimmer/fade_shimmer.dart'; import 'package:pulse/widgets/loading_indicator.dart'; +import 'package:pulse/widgets/loading_shimmer.dart'; import 'package:pulse/widgets/title_card.dart'; import '../../../utils/utils.dart'; import '../cubit/overview_cubit.dart'; @@ -94,11 +94,9 @@ class _OverviewScreenState extends State { ), TitleCard(title: 'Summary'), state.stats == null || state.appState == AppState.loading - ? FadeShimmer( + ? LoadingShimmer( height: 100, - width: double.infinity, radius: 16, - fadeTheme: FadeTheme.light, ) : StatCard( stat: state.stats!.entries.first, @@ -120,11 +118,10 @@ class _OverviewScreenState extends State { return state.stats == null || state.appState == AppState.loading - ? FadeShimmer( + ? LoadingShimmer( height: 8, - width: 150, radius: 16, - fadeTheme: FadeTheme.light, + width: 150, ) : StatCard( stat: stats.entries @@ -177,11 +174,9 @@ class _OverviewScreenState extends State { PageviewChart( data: state.pageview!, unit: state.unit.toLowerCase()) else - FadeShimmer( + LoadingShimmer( height: 250, - width: double.infinity, radius: 16, - fadeTheme: FadeTheme.light, ), TitleCard(title: 'Metrics'), CustomDropDown( @@ -237,17 +232,13 @@ class _OverviewScreenState extends State { spacing: 10, children: state.appState == AppState.secondaryLoading ? [ - FadeShimmer( + LoadingShimmer( height: 50, - width: double.infinity, radius: 8, - fadeTheme: FadeTheme.light, ), - FadeShimmer( + LoadingShimmer( height: 50, - width: double.infinity, radius: 8, - fadeTheme: FadeTheme.light, ), ] : state.metrics diff --git a/lib/features/overview/widgets/pageview_chart.dart b/lib/features/overview/widgets/pageview_chart.dart index ab5e11f..d1e9865 100644 --- a/lib/features/overview/widgets/pageview_chart.dart +++ b/lib/features/overview/widgets/pageview_chart.dart @@ -27,8 +27,10 @@ class PageviewChart extends StatelessWidget { child: Column( spacing: 5, children: [ - getIndicator(title: 'Pageviews', color: Colors.orange), - getIndicator(title: 'Sessions', color: Colors.blue), + getIndicator( + title: 'Pageviews', color: Colors.orange, context: context), + getIndicator( + title: 'Sessions', color: Colors.blue, context: context), ], ), ), @@ -77,7 +79,7 @@ class PageviewChart extends StatelessWidget { ); } - Row getIndicator({required Color color, required String title}) { + Row getIndicator({required Color color, required String title, context}) { return Row( spacing: 8, children: [ @@ -91,8 +93,10 @@ class PageviewChart extends StatelessWidget { ), Text( title, - style: kBodyTextStyle.copyWith( - fontWeight: FontWeight.bold, color: Colors.black), + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + fontSize: 12, + fontWeight: FontWeight.bold, + ), ), ], ); diff --git a/lib/features/overview/widgets/stat_card.dart b/lib/features/overview/widgets/stat_card.dart index 63b185c..f5ab34a 100644 --- a/lib/features/overview/widgets/stat_card.dart +++ b/lib/features/overview/widgets/stat_card.dart @@ -19,8 +19,6 @@ class StatCard extends StatelessWidget { @override Widget build(BuildContext context) { - logger.i(stat); - logger.i(comp); double percentage = OverviewRepo().getPercentage(current: stat.value, previous: comp.value); return ContainerWrapper( diff --git a/lib/features/sessions/screens/session_details_screen.dart b/lib/features/sessions/screens/session_details_screen.dart index d869fb4..9a990c1 100644 --- a/lib/features/sessions/screens/session_details_screen.dart +++ b/lib/features/sessions/screens/session_details_screen.dart @@ -17,6 +17,7 @@ import 'package:pulse/utils/text.dart'; import 'package:pulse/utils/utils.dart'; import 'package:pulse/widgets/custom_appbar.dart'; import 'package:country_codes/country_codes.dart'; +import 'package:pulse/widgets/loading_shimmer.dart'; import 'package:pulse/widgets/title_card.dart'; import '../../../widgets/drop_down_btn.dart'; @@ -121,11 +122,9 @@ class _SessionDetailsScreenState extends State { ], ), _session == null - ? FadeShimmer( + ? LoadingShimmer( height: 100, - width: double.infinity, radius: 16, - fadeTheme: FadeTheme.light, ) : Row( spacing: 15, @@ -271,7 +270,10 @@ class _SessionDetailsScreenState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(title, - style: kBodyTitleTextStyle.copyWith(fontWeight: FontWeight.bold)), + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + fontWeight: FontWeight.bold, + fontSize: 14, + )), Row( spacing: 5, crossAxisAlignment: CrossAxisAlignment.center, diff --git a/lib/features/sessions/screens/sessions_screen.dart b/lib/features/sessions/screens/sessions_screen.dart index 190a34e..d03f3c4 100644 --- a/lib/features/sessions/screens/sessions_screen.dart +++ b/lib/features/sessions/screens/sessions_screen.dart @@ -1,4 +1,3 @@ -import 'package:fade_shimmer/fade_shimmer.dart'; import 'package:flutter/material.dart'; import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:icons_plus/icons_plus.dart'; @@ -7,6 +6,7 @@ import 'package:pulse/features/sessions/cubit/sessions_cubit.dart'; import 'package:pulse/features/sessions/widget/session_card.dart'; import 'package:pulse/features/websites/models/website.dart'; import 'package:pulse/widgets/loading_indicator.dart'; +import 'package:pulse/widgets/loading_shimmer.dart'; import '../../../utils/colors.dart'; import '../../../utils/utils.dart'; @@ -125,11 +125,9 @@ class _SessionsScreenState extends State { indent: 20, ), itemBuilder: (_, i) => state.appState == AppState.loading - ? FadeShimmer( + ? LoadingShimmer( height: 80, - width: double.infinity, radius: 8, - fadeTheme: FadeTheme.light, ) : SessionCard(session: state.sessions[i]), itemCount: state.appState == AppState.loading diff --git a/lib/features/sessions/widget/session_card.dart b/lib/features/sessions/widget/session_card.dart index 520959a..04f1a38 100644 --- a/lib/features/sessions/widget/session_card.dart +++ b/lib/features/sessions/widget/session_card.dart @@ -58,10 +58,10 @@ class SessionCard extends StatelessWidget { children: [ Text( '${CountryCodes.name(locale: Locale(session.language, session.country))}, ${session.city} -- ${session.os}', - style: kBodyTextStyle.copyWith( - fontWeight: FontWeight.bold, - color: Colors.black, - ), + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + fontSize: 12, + fontWeight: FontWeight.bold, + ), ), Text( '${DateFormat('EEE, MMM d y').format(session.createdAt!.toLocal())} at ${DateFormat('HH:mm').format(session.createdAt!.toLocal())} hrs', diff --git a/lib/features/theme/cubit/theme_state.dart b/lib/features/theme/cubit/theme_state.dart index 1d6ffda..04c17a3 100644 --- a/lib/features/theme/cubit/theme_state.dart +++ b/lib/features/theme/cubit/theme_state.dart @@ -2,7 +2,7 @@ part of 'theme_cubit.dart'; class ThemeState extends Equatable { final bool darkMode; - const ThemeState({this.darkMode = false}); + const ThemeState({this.darkMode = true}); @override List get props => [darkMode]; diff --git a/lib/main.dart b/lib/main.dart index ee776aa..e5c6e10 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -43,6 +43,7 @@ class Pulse extends StatelessWidget { child: BlocBuilder( builder: (context, state) { return MaterialApp( + navigatorKey: navigatorKey, debugShowCheckedModeBanner: false, theme: ThemeData( scaffoldBackgroundColor: @@ -60,7 +61,38 @@ class Pulse extends StatelessWidget { state.darkMode ? Color(0xff292929) : const Color(0xffF5F9FE), fontFamily: 'Montserrat', useMaterial3: true, - colorScheme: ColorScheme.fromSeed(seedColor: kPrimaryColor), + colorScheme: ColorScheme.fromSeed( + seedColor: kPrimaryColor, + brightness: state.darkMode ? Brightness.dark : Brightness.light, + ).copyWith( + surface: + state.darkMode ? const Color(0xff1A1A1A) : Colors.white, + onSurface: state.darkMode ? Colors.white : Colors.black87, + ), + datePickerTheme: DatePickerThemeData( + backgroundColor: + state.darkMode ? const Color(0xff1A1A1A) : Colors.white, + headerBackgroundColor: + state.darkMode ? const Color(0xff1A1A1A) : null, + headerForegroundColor: + state.darkMode ? Colors.white : Colors.black87, + dayForegroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.disabled)) { + return state.darkMode + ? Colors.white.withOpacity(.38) + : Colors.black.withOpacity(.38); + } + return state.darkMode ? Colors.white : Colors.black87; + }), + yearForegroundColor: WidgetStateProperty.resolveWith((states) { + if (states.contains(WidgetState.disabled)) { + return state.darkMode + ? Colors.white.withOpacity(.38) + : Colors.black.withOpacity(.38); + } + return state.darkMode ? Colors.white : Colors.black87; + }), + ), ), home: SplashScreen(), ); diff --git a/lib/widgets/container_wrapper.dart b/lib/widgets/container_wrapper.dart index d96538a..f1f534c 100644 --- a/lib/widgets/container_wrapper.dart +++ b/lib/widgets/container_wrapper.dart @@ -25,7 +25,7 @@ class ContainerWrapper extends StatelessWidget { width: width, height: height, decoration: BoxDecoration( - color: Colors.white, + color: Theme.of(context).cardColor, borderRadius: BorderRadius.circular(bRadius), boxShadow: shadows, border: Border.all( diff --git a/lib/widgets/custom_appbar.dart b/lib/widgets/custom_appbar.dart index c1cf731..1ca11ba 100644 --- a/lib/widgets/custom_appbar.dart +++ b/lib/widgets/custom_appbar.dart @@ -1,4 +1,3 @@ -import 'package:pulse/utils/text.dart'; import 'package:pulse/widgets/icon_btn.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/drop_down.dart b/lib/widgets/drop_down.dart index c04ab5e..75dbd17 100644 --- a/lib/widgets/drop_down.dart +++ b/lib/widgets/drop_down.dart @@ -12,7 +12,7 @@ class CustomDropDown extends StatelessWidget { required this.hint, required this.onChanged, this.preIcon, - this.fillColor = Colors.white, + this.fillColor, this.title, this.removePadding = false, this.isRequired = false, @@ -41,7 +41,11 @@ class CustomDropDown extends StatelessWidget { children: [ Padding( padding: const EdgeInsets.only(bottom: 8.0), - child: Text(title!, style: kBodyTitleTextStyle), + child: Text(title!, + style: Theme.of(context).textTheme.bodyMedium?.copyWith( + fontSize: 14, + fontWeight: FontWeight.w600, + )), ), ], ), @@ -51,7 +55,7 @@ class CustomDropDown extends StatelessWidget { padding: const EdgeInsets.symmetric(horizontal: 10), height: maxHeight, decoration: BoxDecoration( - color: fillColor, + color: fillColor ?? Theme.of(context).cardColor, border: Border.all(color: kGreyColor.withOpacity(.3), width: 1.5), borderRadius: BorderRadius.circular(10.0), ), @@ -69,6 +73,7 @@ class CustomDropDown extends StatelessWidget { ), Expanded( child: DropdownButton( + dropdownColor: Theme.of(context).appBarTheme.backgroundColor, underline: const SizedBox(), icon: const Icon( Icons.keyboard_arrow_down_rounded, diff --git a/lib/widgets/loading_shimmer.dart b/lib/widgets/loading_shimmer.dart new file mode 100644 index 0000000..7ae881d --- /dev/null +++ b/lib/widgets/loading_shimmer.dart @@ -0,0 +1,29 @@ +import 'package:fade_shimmer/fade_shimmer.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:pulse/features/theme/cubit/theme_cubit.dart'; + +class LoadingShimmer extends StatelessWidget { + final double height; + final double radius; + final double width; + const LoadingShimmer( + {super.key, + this.height = 80, + this.radius = 8, + this.width = double.infinity}); + + @override + Widget build(BuildContext context) { + return BlocBuilder( + builder: (context, state) { + return FadeShimmer( + height: height, + width: width, + radius: radius, + fadeTheme: state.darkMode ? FadeTheme.dark : FadeTheme.light, + ); + }, + ); + } +} 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/Podfile b/macos/Podfile new file mode 100644 index 0000000..ff5ddb3 --- /dev/null +++ b/macos/Podfile @@ -0,0 +1,42 @@ +platform :osx, '10.15' + +# 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! + + 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