├── ios ├── Flutter │ ├── Debug.xcconfig │ ├── Release.xcconfig │ └── AppFrameworkInfo.plist ├── Runner │ ├── Runner-Bridging-Header.h │ ├── Assets.xcassets │ │ ├── LaunchImage.imageset │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ ├── README.md │ │ │ └── Contents.json │ │ └── AppIcon.appiconset │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-83.5x83.5@2x.png │ │ │ └── Contents.json │ ├── AppDelegate.swift │ ├── Base.lproj │ │ ├── Main.storyboard │ │ └── LaunchScreen.storyboard │ └── Info.plist ├── Runner.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── WorkspaceSettings.xcsettings │ │ │ └── IDEWorkspaceChecks.plist │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── WorkspaceSettings.xcsettings │ │ └── IDEWorkspaceChecks.plist └── .gitignore ├── .gitattributes ├── assets ├── images │ ├── logo.png │ ├── plus.png │ ├── email.png │ ├── google.png │ ├── logOut.png │ ├── minus.png │ ├── aboutUs.png │ ├── business.png │ ├── compass.png │ ├── facebook.png │ ├── location.png │ ├── macLogo.png │ ├── MaskGroup1.png │ ├── alhijraLogo.png │ ├── alnoorLogo.png │ ├── chathamLogo.png │ ├── editProfile.png │ ├── hifzProgram.png │ ├── windsorLogo.png │ ├── Notifications.png │ ├── alhijra_img.jpeg │ ├── masjidNoorLogo.jpg │ ├── member_module.png │ ├── prayerTimings.png │ ├── logoBackground.jpeg │ ├── mosqueBackground.jpg │ ├── windsorMemorials.png │ ├── prayerPagePicture.png │ ├── countryMeadowsCemetery.png │ ├── needle.svg │ ├── logIn.svg │ ├── logOut.svg │ ├── kaaba-building.svg │ ├── reading-quran.svg │ ├── signUp.svg │ ├── shop.svg │ ├── corpse.svg │ ├── community.svg │ ├── aboutUs.svg │ └── muslim-man-praying.svg ├── introPics │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ ├── 9.png │ └── 10.png └── policy.md ├── android ├── gradle.properties ├── app │ ├── src │ │ ├── main │ │ │ ├── res │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ │ └── mipmap-xhdpi │ │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── mipmap-xxxhdpi │ │ │ │ │ └── ic_launcher.png │ │ │ │ ├── drawable │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── drawable-v21 │ │ │ │ │ └── launch_background.xml │ │ │ │ ├── values │ │ │ │ │ └── styles.xml │ │ │ │ └── values-night │ │ │ │ │ └── styles.xml │ │ │ ├── kotlin │ │ │ │ └── com │ │ │ │ │ └── hassan │ │ │ │ │ └── windsor_essex_muslim_care │ │ │ │ │ └── MainActivity.kt │ │ │ └── AndroidManifest.xml │ │ ├── debug │ │ │ └── AndroidManifest.xml │ │ └── profile │ │ │ └── AndroidManifest.xml │ ├── google-services.json │ └── build.gradle ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── .gitignore ├── settings.gradle └── build.gradle ├── .metadata ├── lib ├── screens │ ├── islamicSchools.dart │ ├── aboutUs.dart │ ├── hifzProgram.dart │ ├── mosquesList.dart │ ├── allBusinessPage.dart │ ├── homePage.dart │ ├── qiblaPage.dart │ ├── announcements │ │ └── announcements.dart │ ├── credentials │ │ └── loginRelated │ │ │ └── forgetPasswordPage.dart │ ├── onBardingPage.dart │ └── prayerTimings.dart ├── tools │ ├── loading.dart │ ├── custom_toast.dart │ ├── glassmorphism │ │ └── src │ │ │ ├── blur.dart │ │ │ ├── glass_container.dart │ │ │ └── hollow_shadow_painter.dart │ ├── loadingErrorWidget.dart │ ├── neuomorphic.dart │ ├── policy.dart │ └── notificationHandler.dart ├── config │ └── collection_names.dart ├── models │ ├── bankDetailsModel.dart │ ├── announcementsModel.dart │ ├── businessModel.dart │ ├── communityServiceModel.dart │ └── userModel.dart ├── data │ └── boardOfDirectors.dart ├── credentials │ ├── signUpRelated │ │ ├── signUpPage.dart │ │ └── signUpOptions.dart │ └── loginRelated │ │ └── forgetPasswordPage.dart ├── Database │ ├── local_database.dart │ └── database.dart ├── main.dart ├── services │ └── authentication_service.dart ├── constants.dart └── commonUIFunctions.dart ├── README.md ├── .vscode └── launch.json ├── .gitignore ├── test └── widget_test.dart └── pubspec.yaml /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Generated.xcconfig" 2 | -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /assets/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/logo.png -------------------------------------------------------------------------------- /assets/images/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/plus.png -------------------------------------------------------------------------------- /assets/introPics/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/introPics/1.png -------------------------------------------------------------------------------- /assets/introPics/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/introPics/2.png -------------------------------------------------------------------------------- /assets/introPics/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/introPics/3.png -------------------------------------------------------------------------------- /assets/introPics/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/introPics/4.png -------------------------------------------------------------------------------- /assets/introPics/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/introPics/5.png -------------------------------------------------------------------------------- /assets/introPics/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/introPics/6.png -------------------------------------------------------------------------------- /assets/introPics/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/introPics/7.png -------------------------------------------------------------------------------- /assets/introPics/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/introPics/8.png -------------------------------------------------------------------------------- /assets/introPics/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/introPics/9.png -------------------------------------------------------------------------------- /assets/images/email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/email.png -------------------------------------------------------------------------------- /assets/images/google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/google.png -------------------------------------------------------------------------------- /assets/images/logOut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/logOut.png -------------------------------------------------------------------------------- /assets/images/minus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/minus.png -------------------------------------------------------------------------------- /assets/introPics/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/introPics/10.png -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /assets/images/aboutUs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/aboutUs.png -------------------------------------------------------------------------------- /assets/images/business.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/business.png -------------------------------------------------------------------------------- /assets/images/compass.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/compass.png -------------------------------------------------------------------------------- /assets/images/facebook.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/facebook.png -------------------------------------------------------------------------------- /assets/images/location.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/location.png -------------------------------------------------------------------------------- /assets/images/macLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/macLogo.png -------------------------------------------------------------------------------- /assets/images/MaskGroup1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/MaskGroup1.png -------------------------------------------------------------------------------- /assets/images/alhijraLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/alhijraLogo.png -------------------------------------------------------------------------------- /assets/images/alnoorLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/alnoorLogo.png -------------------------------------------------------------------------------- /assets/images/chathamLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/chathamLogo.png -------------------------------------------------------------------------------- /assets/images/editProfile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/editProfile.png -------------------------------------------------------------------------------- /assets/images/hifzProgram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/hifzProgram.png -------------------------------------------------------------------------------- /assets/images/windsorLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/windsorLogo.png -------------------------------------------------------------------------------- /assets/images/Notifications.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/Notifications.png -------------------------------------------------------------------------------- /assets/images/alhijra_img.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/alhijra_img.jpeg -------------------------------------------------------------------------------- /assets/images/masjidNoorLogo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/masjidNoorLogo.jpg -------------------------------------------------------------------------------- /assets/images/member_module.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/member_module.png -------------------------------------------------------------------------------- /assets/images/prayerTimings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/prayerTimings.png -------------------------------------------------------------------------------- /assets/images/logoBackground.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/logoBackground.jpeg -------------------------------------------------------------------------------- /assets/images/mosqueBackground.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/mosqueBackground.jpg -------------------------------------------------------------------------------- /assets/images/windsorMemorials.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/windsorMemorials.png -------------------------------------------------------------------------------- /assets/images/prayerPagePicture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/prayerPagePicture.png -------------------------------------------------------------------------------- /assets/images/countryMeadowsCemetery.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/assets/images/countryMeadowsCemetery.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/android/app/src/main/res/mipmap-xxhdpi/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/android/app/src/main/res/mipmap-xxhdpi/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/android/app/src/main/res/mipmap-xxhdpi/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hassan-zafar/muslim_community_app/HEAD/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/hassan/windsor_essex_muslim_care/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.hassan.windsor_essex_muslim_care 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Jun 23 08:50:38 CEST 2017 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip 7 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 1d9032c7e1d867f071f2277eb1673e8f9b0274e3 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /lib/screens/islamicSchools.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | class IslamicSchools extends StatefulWidget { 3 | @override 4 | _IslamicSchoolsState createState() => _IslamicSchoolsState(); 5 | } 6 | 7 | class _IslamicSchoolsState extends State { 8 | @override 9 | Widget build(BuildContext context) { 10 | return Container( 11 | 12 | ); 13 | } 14 | } -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "LaunchImage.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "LaunchImage@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "LaunchImage@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/tools/loading.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | import 'package:flutter/cupertino.dart'; 4 | import 'package:flutter/material.dart'; 5 | 6 | class LoadingIndicator extends StatelessWidget { 7 | @override 8 | Widget build(BuildContext context) { 9 | final widget = (Platform.isAndroid) 10 | ? CircularProgressIndicator( 11 | backgroundColor: Colors.black, 12 | ) 13 | : CupertinoActivityIndicator(); 14 | return Container( 15 | alignment: Alignment.center, 16 | child: widget, 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/tools/custom_toast.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:fluttertoast/fluttertoast.dart'; 3 | 4 | void successToast({ 5 | @required String message, 6 | int duration = 3, 7 | }) { 8 | Fluttertoast.showToast( 9 | msg: message, 10 | timeInSecForIosWeb: duration, 11 | backgroundColor: Colors.green, 12 | ); 13 | } 14 | 15 | void errorToast({ 16 | @required String message, 17 | int duration = 4, 18 | }) { 19 | Fluttertoast.showToast( 20 | msg: message, 21 | timeInSecForIosWeb: duration, 22 | backgroundColor: Colors.red, 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # windsor_essex_muslim_care 2 | 3 | A new Flutter application. 4 | 5 | ## Getting Started 6 | 7 | This project is a starting point for a Flutter application. 8 | 9 | A few resources to get you started if this is your first Flutter project: 10 | 11 | - [Lab: Write your first Flutter app](https://flutter.dev/docs/get-started/codelab) 12 | - [Cookbook: Useful Flutter samples](https://flutter.dev/docs/cookbook) 13 | 14 | For help getting started with Flutter, view our 15 | [online documentation](https://flutter.dev/docs), which offers tutorials, 16 | samples, guidance on mobile development, and a full API reference. 17 | -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/app.flx 22 | Flutter/app.zip 23 | Flutter/flutter_assets/ 24 | Flutter/flutter_export_environment.sh 25 | ServiceDefinitions.json 26 | Runner/GeneratedPluginRegistrant.* 27 | 28 | # Exceptions to above rules. 29 | !default.mode1v3 30 | !default.mode2v3 31 | !default.pbxuser 32 | !default.perspectivev3 33 | -------------------------------------------------------------------------------- /lib/screens/aboutUs.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:windsor_essex_muslim_care/constants.dart'; 3 | import 'package:webview_flutter/webview_flutter.dart'; 4 | 5 | class AboutUsPage extends StatefulWidget { 6 | @override 7 | _AboutUsPageState createState() => _AboutUsPageState(); 8 | } 9 | 10 | class _AboutUsPageState extends State { 11 | @override 12 | Widget build(BuildContext context) { 13 | return SafeArea( 14 | child: Container( 15 | decoration: backgroundColorBoxDecoration(), 16 | child: WebView( 17 | initialUrl: "https://wemuslimcare.ca/about-us", 18 | javascriptMode: JavascriptMode.unrestricted, 19 | ), 20 | )); 21 | } 22 | } 23 | //bla bla -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.6.10' 3 | repositories { 4 | google() 5 | jcenter() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:4.1.0' 10 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 11 | classpath 'com.google.gms:google-services:4.3.5' 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | google() 18 | jcenter() 19 | } 20 | } 21 | 22 | rootProject.buildDir = '../build' 23 | subprojects { 24 | project.buildDir = "${rootProject.buildDir}/${project.name}" 25 | project.evaluationDependsOn(':app') 26 | } 27 | 28 | task clean(type: Delete) { 29 | delete rootProject.buildDir 30 | } 31 | -------------------------------------------------------------------------------- /lib/config/collection_names.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | 3 | const String userDataCollection = "userData"; 4 | const String bankInfoCollection = "bankInfo"; 5 | const String communityServicesCollection = "communityServices"; 6 | final bankInfoRef = 7 | FirebaseFirestore.instance.collection(bankInfoCollection); 8 | const String businessDetailsCollection = "businessDetails"; 9 | final userRef = FirebaseFirestore.instance.collection(userDataCollection); 10 | final businessRef = 11 | FirebaseFirestore.instance.collection(businessDetailsCollection); 12 | final communityRef = 13 | FirebaseFirestore.instance.collection(communityServicesCollection); 14 | final announcementsRef = FirebaseFirestore.instance.collection('announcements'); 15 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "name": "muslim_community_app", 9 | "request": "launch", 10 | "type": "dart" 11 | }, 12 | { 13 | "name": "muslim_community_app (profile mode)", 14 | "request": "launch", 15 | "type": "dart", 16 | "flutterMode": "profile" 17 | }, 18 | { 19 | "name": "muslim_community_app (release mode)", 20 | "request": "launch", 21 | "type": "dart", 22 | "flutterMode": "release" 23 | } 24 | ] 25 | } -------------------------------------------------------------------------------- /lib/models/bankDetailsModel.dart: -------------------------------------------------------------------------------- 1 | class BankDetailsModel { 2 | final String email; 3 | 4 | final String bankName; 5 | final String transitNo; 6 | final String accountNo; 7 | final String referenceNo; 8 | final String timeStamp; 9 | 10 | BankDetailsModel({ 11 | this.bankName, 12 | this.email, 13 | this.transitNo, 14 | this.referenceNo, 15 | this.timeStamp, 16 | this.accountNo, 17 | }); 18 | 19 | Map toMap() { 20 | return {}; 21 | } 22 | 23 | factory BankDetailsModel.fromDocument(doc) { 24 | return BankDetailsModel( 25 | bankName: doc.data()["bankName"], 26 | email: doc.data()["email"], 27 | transitNo: doc.data()["transitNo"], 28 | referenceNo: doc.data()["referenceNo"], 29 | accountNo: doc.data()["accountNo"], 30 | timeStamp: doc.data()["timeStamp"], 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 8.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | # The .vscode folder contains launch configuration and tasks you configure in 19 | # VS Code which you may wish to be included in version control, so this line 20 | # is commented out by default. 21 | #.vscode/ 22 | 23 | # Flutter/Dart/Pub related 24 | **/doc/api/ 25 | **/ios/Flutter/.last_build_id 26 | .dart_tool/ 27 | .flutter-plugins 28 | .flutter-plugins-dependencies 29 | .packages 30 | .pub-cache/ 31 | .pub/ 32 | /build/ 33 | 34 | # Web related 35 | lib/generated_plugin_registrant.dart 36 | 37 | # Symbolication related 38 | app.*.symbols 39 | 40 | # Obfuscation related 41 | app.*.map.json 42 | 43 | # Android Studio will place build artifacts here 44 | /android/app/debug 45 | /android/app/profile 46 | /android/app/release 47 | -------------------------------------------------------------------------------- /lib/tools/glassmorphism/src/blur.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | import 'package:flutter/material.dart'; 4 | 5 | /// Widget that blur it's child 6 | class Blur extends StatelessWidget { 7 | /// Widget that blur it's child 8 | const Blur({key, this.blur, this.child}); 9 | 10 | ///Blur intensity 11 | final double blur; 12 | 13 | ///[Widget] child to be blurred. 14 | final Widget child; 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | if (blur < 1) return child; 19 | 20 | return ImageFiltered( 21 | imageFilter: ImageFilter.blur(sigmaX: blur, sigmaY: blur), 22 | child: child, 23 | ); 24 | } 25 | } 26 | 27 | ///Widget Blur Extensions 28 | extension BlurWidgetExt on Widget { 29 | ///Blur the widget 30 | Widget blur({double blur}) { 31 | return Blur(blur: blur, child: this); 32 | } 33 | 34 | ///[Blur] widget with [ClipRect] parent 35 | Widget blurClipped({double blur}) { 36 | return ClipRect(child: Blur(blur: blur, child: this)); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /lib/tools/glassmorphism/src/glass_container.dart: -------------------------------------------------------------------------------- 1 | import 'dart:ui'; 2 | 3 | import 'package:flutter/material.dart'; 4 | 5 | /// Widget that blur it's child 6 | class Blur extends StatelessWidget { 7 | /// Widget that blur it's child 8 | const Blur({key, this.blur, this.child}); 9 | 10 | ///Blur intensity 11 | final double blur; 12 | 13 | ///[Widget] child to be blurred. 14 | final Widget child; 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | if (blur < 1) return child; 19 | 20 | return ImageFiltered( 21 | imageFilter: ImageFilter.blur(sigmaX: blur, sigmaY: blur), 22 | child: child, 23 | ); 24 | } 25 | } 26 | 27 | ///Widget Blur Extensions 28 | extension BlurWidgetExt on Widget { 29 | ///Blur the widget 30 | Widget blur({ double blur}) { 31 | return Blur(blur: blur, child: this); 32 | } 33 | 34 | ///[Blur] widget with [ClipRect] parent 35 | Widget blurClipped({ double blur}) { 36 | return ClipRect(child: Blur(blur: blur, child: this)); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /lib/models/announcementsModel.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | 3 | class AnnouncementsModel { 4 | final String userId; 5 | final String announcementId; 6 | final String announcementTitle; 7 | final String description; 8 | final Timestamp timestamp; 9 | final String token; 10 | final String imageUrl; 11 | 12 | AnnouncementsModel({ 13 | this.userId, 14 | this.announcementId, 15 | this.announcementTitle, 16 | this.description, 17 | this.timestamp, 18 | this.token, 19 | this.imageUrl, 20 | }); 21 | 22 | Map toMap() { 23 | return {}; 24 | } 25 | 26 | factory AnnouncementsModel.fromDocument(doc) { 27 | return AnnouncementsModel( 28 | userId: doc.data()["userId"], 29 | announcementId: doc.data()["announcementId"], 30 | announcementTitle: doc.data()["announcementTitle"], 31 | description: doc.data()["description"], 32 | timestamp: doc.data()["timestamp"], 33 | token: doc.data()["token"], 34 | imageUrl: doc.data()["imageUrl"], 35 | ); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 15 | 18 | 19 | -------------------------------------------------------------------------------- /test/widget_test.dart: -------------------------------------------------------------------------------- 1 | // This is a basic Flutter widget test. 2 | // 3 | // To perform an interaction with a widget in your test, use the WidgetTester 4 | // utility that Flutter provides. For example, you can send tap and scroll 5 | // gestures. You can also use WidgetTester to find child widgets in the widget 6 | // tree, read text, and verify that the values of widget properties are correct. 7 | 8 | import 'package:flutter/material.dart'; 9 | import 'package:flutter_test/flutter_test.dart'; 10 | 11 | import 'package:windsor_essex_muslim_care/main.dart'; 12 | 13 | void main() { 14 | testWidgets('Counter increments smoke test', (WidgetTester tester) async { 15 | // Build our app and trigger a frame. 16 | await tester.pumpWidget(MyApp()); 17 | 18 | // Verify that our counter starts at 0. 19 | expect(find.text('0'), findsOneWidget); 20 | expect(find.text('1'), findsNothing); 21 | 22 | // Tap the '+' icon and trigger a frame. 23 | await tester.tap(find.byIcon(Icons.add)); 24 | await tester.pump(); 25 | 26 | // Verify that our counter has incremented. 27 | expect(find.text('0'), findsNothing); 28 | expect(find.text('1'), findsOneWidget); 29 | }); 30 | } 31 | -------------------------------------------------------------------------------- /lib/models/businessModel.dart: -------------------------------------------------------------------------------- 1 | class BusinessModel { 2 | final String id; 3 | 4 | final String businessName; 5 | final String imageUrl; 6 | final String websiteLink; 7 | final String description; 8 | final String location; 9 | final bool approve; 10 | final String userId; 11 | final String email; 12 | final String token; 13 | 14 | BusinessModel( 15 | {this.id, 16 | this.businessName, 17 | this.description, 18 | this.imageUrl, 19 | this.location, 20 | this.websiteLink, 21 | this.email, 22 | this.userId, 23 | this.token, 24 | this.approve}); 25 | 26 | Map toMap() { 27 | return {}; 28 | } 29 | 30 | factory BusinessModel.fromDocument(doc) { 31 | return BusinessModel( 32 | id: doc.data()["id"], 33 | businessName: doc.data()["businessName"], 34 | description: doc.data()["description"], 35 | imageUrl: doc.data()["imageUrl"], 36 | location: doc.data()["location"], 37 | websiteLink: doc.data()["websiteLink"], 38 | approve: doc.data()["approve"], 39 | userId: doc.data()["userId"], 40 | email: doc.data()["email"], 41 | token: doc.data()["token"], 42 | ); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /lib/tools/loadingErrorWidget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class LocationErrorWidget extends StatelessWidget { 4 | final String error; 5 | final Function callback; 6 | 7 | const LocationErrorWidget({Key key, this.error, this.callback}) 8 | : super(key: key); 9 | 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | final box = SizedBox(height: 32); 14 | final errorColor = Color(0xffb00020); 15 | 16 | return Container( 17 | child: Center( 18 | child: Column( 19 | mainAxisSize: MainAxisSize.min, 20 | children: [ 21 | Icon( 22 | Icons.location_off, 23 | size: 150, 24 | color: errorColor, 25 | ), 26 | box, 27 | Text( 28 | error, 29 | style: TextStyle( 30 | color: errorColor, fontWeight: FontWeight.bold), 31 | ), 32 | box, 33 | RaisedButton( 34 | child: Text("Retry"), 35 | onPressed: () { 36 | if (callback != null) callback(); 37 | }, 38 | ) 39 | ], 40 | ), 41 | ), 42 | ); 43 | } 44 | } -------------------------------------------------------------------------------- /lib/models/communityServiceModel.dart: -------------------------------------------------------------------------------- 1 | class CommunityServiceModel { 2 | final String id; 3 | final String communityName; 4 | final String imageUrl; 5 | final String websiteLink; 6 | final String description; 7 | final String location; 8 | final String token; 9 | 10 | final bool isApproved; 11 | 12 | final String email; 13 | final String userId; 14 | CommunityServiceModel( 15 | {this.id, 16 | this.communityName, 17 | this.description, 18 | this.imageUrl, 19 | this.location, 20 | this.websiteLink, 21 | this.userId, 22 | this.token, 23 | this.email, 24 | this.isApproved}); 25 | 26 | Map toMap() { 27 | return {}; 28 | } 29 | 30 | factory CommunityServiceModel.fromDocument(doc) { 31 | return CommunityServiceModel( 32 | id: doc.data()["id"], 33 | communityName: doc.data()["communityName"], 34 | description: doc.data()["description"], 35 | imageUrl: doc.data()["imageUrl"], 36 | location: doc.data()["location"], 37 | websiteLink: doc.data()["websiteLink"], 38 | isApproved: doc.data()["isApproved"], 39 | email: doc.data()["email"], 40 | userId: doc.data()["userId"], 41 | token: doc.data()["token"], 42 | ); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /lib/data/boardOfDirectors.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | TextStyle directorTextStyle() { 4 | return TextStyle(fontSize: 16, fontWeight: FontWeight.w200); 5 | } 6 | 7 | Column boardOfDirectorsList() { 8 | return Column( 9 | children: [ 10 | Padding( 11 | padding: const EdgeInsets.all(8.0), 12 | child: Text( 13 | "Sr. Rubina Waqar, President", 14 | style: directorTextStyle(), 15 | ), 16 | ), 17 | Padding( 18 | padding: const EdgeInsets.all(8.0), 19 | child: Text( 20 | "Sr. Abeer Rizek, Secretary", 21 | style: directorTextStyle(), 22 | ), 23 | ), 24 | Padding( 25 | padding: const EdgeInsets.all(8.0), 26 | child: Text( 27 | "Br. Gihad Gawanmeh, Board Member", 28 | style: directorTextStyle(), 29 | ), 30 | ), 31 | Padding( 32 | padding: const EdgeInsets.all(8.0), 33 | child: Text( 34 | "Br. Sami Issa, Board Member", 35 | style: directorTextStyle(), 36 | ), 37 | ), 38 | Padding( 39 | padding: const EdgeInsets.all(8.0), 40 | child: Text( 41 | "Sh. Abdullah Hammoud, Imam & Religious Advisor", 42 | style: directorTextStyle(), 43 | ), 44 | ), 45 | Padding( 46 | padding: const EdgeInsets.all(8.0), 47 | child: Text( 48 | "Sr. Waheeda Khan, School Principal", 49 | style: directorTextStyle(), 50 | ), 51 | ), 52 | ], 53 | ); 54 | } 55 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /assets/images/needle.svg: -------------------------------------------------------------------------------- 1 | needle -------------------------------------------------------------------------------- /ios/Runner/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | windsor_essex_muslim_care 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | $(FLUTTER_BUILD_NAME) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(FLUTTER_BUILD_NUMBER) 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UISupportedInterfaceOrientations 30 | 31 | UIInterfaceOrientationPortrait 32 | UIInterfaceOrientationLandscapeLeft 33 | UIInterfaceOrientationLandscapeRight 34 | 35 | UISupportedInterfaceOrientations~ipad 36 | 37 | UIInterfaceOrientationPortrait 38 | UIInterfaceOrientationPortraitUpsideDown 39 | UIInterfaceOrientationLandscapeLeft 40 | UIInterfaceOrientationLandscapeRight 41 | 42 | UIViewControllerBasedStatusBarAppearance 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /assets/images/logIn.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/images/logOut.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /android/app/google-services.json: -------------------------------------------------------------------------------- 1 | { 2 | "project_info": { 3 | "project_number": "570384505161", 4 | "project_id": "muslimcare-app", 5 | "storage_bucket": "muslimcare-app.appspot.com" 6 | }, 7 | "client": [ 8 | { 9 | "client_info": { 10 | "mobilesdk_app_id": "1:570384505161:android:e52507ea4665c98664e298", 11 | "android_client_info": { 12 | "package_name": "com.hassan.windsor_essex_muslim_care" 13 | } 14 | }, 15 | "oauth_client": [ 16 | { 17 | "client_id": "570384505161-94jkuppj2430cl95euti2t02nhkmhide.apps.googleusercontent.com", 18 | "client_type": 1, 19 | "android_info": { 20 | "package_name": "com.hassan.windsor_essex_muslim_care", 21 | "certificate_hash": "bc0cbf9062896b59c22e63101bb302cef893ef3c" 22 | } 23 | }, 24 | { 25 | "client_id": "570384505161-sqt69i6dc0rggkitac5bneopvin7kdu2.apps.googleusercontent.com", 26 | "client_type": 1, 27 | "android_info": { 28 | "package_name": "com.hassan.windsor_essex_muslim_care", 29 | "certificate_hash": "a38e75bc78f57ab76e91317120445129ba6d45ca" 30 | } 31 | }, 32 | { 33 | "client_id": "570384505161-573i8067dntpq8uft0nr8ugt61nt6l12.apps.googleusercontent.com", 34 | "client_type": 3 35 | } 36 | ], 37 | "api_key": [ 38 | { 39 | "current_key": "AIzaSyAQvdN54zrfpL6IXRboIs5fkGiJQiNG6qc" 40 | } 41 | ], 42 | "services": { 43 | "appinvite_service": { 44 | "other_platform_oauth_client": [ 45 | { 46 | "client_id": "570384505161-573i8067dntpq8uft0nr8ugt61nt6l12.apps.googleusercontent.com", 47 | "client_type": 3 48 | } 49 | ] 50 | } 51 | } 52 | } 53 | ], 54 | "configuration_version": "1" 55 | } -------------------------------------------------------------------------------- /lib/credentials/signUpRelated/signUpPage.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../constants.dart'; 4 | 5 | class SignUpPage extends StatefulWidget { 6 | @override 7 | _SignUpPageState createState() => _SignUpPageState(); 8 | } 9 | 10 | class _SignUpPageState extends State { 11 | bool _obscureText = true; 12 | TextEditingController _passwordController = TextEditingController(); 13 | @override 14 | Widget build(BuildContext context) { 15 | return Container( 16 | decoration: backgroundColorBoxDecoration(), 17 | child: Scaffold( 18 | body: Column( 19 | children: [ 20 | //Password 21 | Padding( 22 | padding: const EdgeInsets.only(left: 18.0, right: 18.0), 23 | child: TextFormField( 24 | obscureText: _obscureText, 25 | validator: (val) => 26 | val != null && val.length < 6 ? 'Password Too Short' : null, 27 | controller: _passwordController, 28 | decoration: InputDecoration( 29 | suffixIcon: GestureDetector( 30 | onTap: () { 31 | setState(() { 32 | _obscureText = !_obscureText; 33 | }); 34 | }, 35 | child: Icon( 36 | _obscureText ? Icons.visibility : Icons.visibility_off), 37 | ), 38 | border: OutlineInputBorder( 39 | borderRadius: BorderRadius.all(Radius.circular(5.0)), 40 | ), 41 | labelText: "Password", 42 | hintText: "Enter a valid password, min length 6", 43 | icon: Icon( 44 | Icons.lock, 45 | color: Theme.of(context).accentColor, 46 | ), 47 | ), 48 | ), 49 | ), 50 | ], 51 | ), 52 | ), 53 | ); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /lib/tools/neuomorphic.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_svg/svg.dart'; 3 | import 'package:neuomorphic_container/neuomorphic_container.dart'; 4 | 5 | import '../constants.dart'; 6 | 7 | class EditedNeuomprphicContainer extends StatelessWidget { 8 | EditedNeuomprphicContainer( 9 | {this.icon, this.text, this.isImage = false, this.isLanding = false}); 10 | final String icon; 11 | final String text; 12 | final isImage; 13 | final bool isLanding; 14 | @override 15 | Widget build(BuildContext context) { 16 | return Padding( 17 | padding: const EdgeInsets.all(12.0), 18 | child: NeuomorphicContainer( 19 | color: containerColor, 20 | borderRadius: BorderRadius.circular(20), 21 | style: NeuomorphicStyle.Convex, 22 | intensity: 0.6, 23 | width: isImage && !isLanding ? 120 : 100, 24 | //blur: 8, 25 | // shadowStrength: 10, 26 | height: isImage && !isLanding ? 120 : 100, 27 | // opacity: 0.2, 28 | child: Center( 29 | child: Padding( 30 | padding: const EdgeInsets.all(8.0), 31 | child: Column( 32 | mainAxisAlignment: MainAxisAlignment.center, 33 | crossAxisAlignment: CrossAxisAlignment.center, 34 | children: [ 35 | isImage 36 | ? Image.asset( 37 | icon, 38 | height: 40, 39 | ) 40 | : SvgPicture.asset( 41 | icon, 42 | height: 35, 43 | ), 44 | Padding( 45 | padding: const EdgeInsets.all(4.0), 46 | child: Text( 47 | text, 48 | textAlign: TextAlign.center, 49 | style: TextStyle(fontWeight: FontWeight.bold), 50 | ), 51 | ) 52 | ], 53 | ), 54 | ), 55 | ), 56 | ), 57 | ); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /ios/Runner/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /lib/tools/policy.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter/services.dart'; 3 | import 'package:flutter_markdown/flutter_markdown.dart'; 4 | import 'package:windsor_essex_muslim_care/tools/loading.dart'; 5 | 6 | class PolicyDialog extends StatelessWidget { 7 | PolicyDialog({ 8 | Key key, 9 | this.radius = 8, 10 | @required this.mdFileName, 11 | }) : assert(mdFileName.contains('.md'), 12 | 'The file must contain the .md extension'), 13 | super(key: key); 14 | 15 | final double radius; 16 | final String mdFileName; 17 | 18 | @override 19 | Widget build(BuildContext context) { 20 | return Dialog( 21 | shape: 22 | RoundedRectangleBorder(borderRadius: BorderRadius.circular(radius)), 23 | child: Column( 24 | children: [ 25 | Expanded( 26 | child: FutureBuilder( 27 | future: Future.delayed(Duration(milliseconds: 150)).then((value) { 28 | return rootBundle.loadString('assets/$mdFileName'); 29 | }), 30 | builder: (context, snapshot) { 31 | if (snapshot.hasData) { 32 | return Markdown( 33 | data: snapshot.data, 34 | ); 35 | } 36 | return Center( 37 | child: LoadingIndicator(), 38 | ); 39 | }, 40 | ), 41 | ), 42 | FlatButton( 43 | padding: EdgeInsets.all(0), 44 | color: Theme.of(context).buttonColor, 45 | onPressed: () => Navigator.of(context).pop(), 46 | shape: RoundedRectangleBorder( 47 | borderRadius: BorderRadius.only( 48 | bottomLeft: Radius.circular(radius), 49 | bottomRight: Radius.circular(radius), 50 | ), 51 | ), 52 | child: Container( 53 | decoration: BoxDecoration( 54 | borderRadius: BorderRadius.only( 55 | bottomLeft: Radius.circular(radius), 56 | bottomRight: Radius.circular(radius), 57 | ), 58 | ), 59 | alignment: Alignment.center, 60 | height: 50, 61 | width: double.infinity, 62 | child: Text( 63 | "CLOSE", 64 | style: TextStyle( 65 | fontSize: 20, 66 | fontWeight: FontWeight.bold, 67 | color: Theme.of(context).textTheme.button.color, 68 | ), 69 | ), 70 | ), 71 | ), 72 | ], 73 | ), 74 | ); 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /lib/tools/glassmorphism/src/hollow_shadow_painter.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | ///Render Shadow around the container 4 | class HollowShadowPainter extends CustomPainter { 5 | HollowShadowPainter({ 6 | this.shape, 7 | this.borderRadius, 8 | this.shadowColor, 9 | this.shadowStrength = 1, 10 | }); 11 | 12 | final double shadowStrength; 13 | final Color shadowColor; 14 | final BoxShape shape; 15 | final BorderRadius borderRadius; 16 | 17 | static double _convertRadiusToSigma(double radius) { 18 | return radius * 0.57735 + 0.5; 19 | } 20 | 21 | Paint customPainter({ 22 | double blurStrength, 23 | Color color, 24 | double strokeWidth, 25 | }) { 26 | return Paint() 27 | ..style = PaintingStyle.stroke 28 | ..color = color 29 | ..strokeWidth = strokeWidth 30 | ..maskFilter = MaskFilter.blur( 31 | BlurStyle.normal, 32 | _convertRadiusToSigma(blurStrength), 33 | ); 34 | } 35 | 36 | @override 37 | void paint(Canvas canvas, Size size) { 38 | if (shadowStrength == 0) return; 39 | 40 | if (shape == BoxShape.circle) { 41 | return canvas.drawCircle( 42 | Offset(size.width / 2, size.height / 2), 43 | size.width / 2 + shadowStrength / 2, 44 | customPainter( 45 | color: shadowColor, 46 | blurStrength: 20, 47 | strokeWidth: shadowStrength, 48 | ), 49 | ); 50 | } 51 | 52 | final RRect rrect = RRect.fromRectAndCorners( 53 | Rect.fromPoints( 54 | Offset(-shadowStrength / 2, -shadowStrength / 2), 55 | Offset( 56 | size.width + shadowStrength / 2, 57 | size.height + shadowStrength / 2, 58 | ), 59 | ), 60 | bottomLeft: borderRadius.bottomLeft, 61 | bottomRight: borderRadius.bottomRight, 62 | topLeft: borderRadius.topLeft, 63 | topRight: borderRadius.topRight, 64 | ); 65 | 66 | canvas.drawRRect( 67 | rrect, 68 | customPainter( 69 | color: shadowColor, 70 | blurStrength: 20, 71 | strokeWidth: shadowStrength, 72 | ), 73 | ); 74 | } 75 | 76 | @override 77 | bool shouldRepaint(HollowShadowPainter oldDelegate) => oldDelegate != this; 78 | 79 | @override 80 | bool operator ==(Object other) { 81 | if (identical(this, other)) return true; 82 | 83 | return other is HollowShadowPainter && 84 | other.shadowStrength == shadowStrength && 85 | other.shadowColor == shadowColor && 86 | other.shape == shape && 87 | other.borderRadius == borderRadius; 88 | } 89 | 90 | @override 91 | int get hashCode { 92 | return shadowStrength.hashCode ^ 93 | shadowColor.hashCode ^ 94 | shape.hashCode ^ 95 | borderRadius.hashCode; 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /assets/images/kaaba-building.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lib/screens/hifzProgram.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:url_launcher/url_launcher.dart'; 3 | import 'package:windsor_essex_muslim_care/constants.dart'; 4 | import 'package:windsor_essex_muslim_care/tools/neuomorphic.dart'; 5 | 6 | class HifzProgram extends StatefulWidget { 7 | @override 8 | _HifzProgramState createState() => _HifzProgramState(); 9 | } 10 | 11 | class _HifzProgramState extends State { 12 | void launchURL(String _url) async => await canLaunch(_url) 13 | ? await launch( 14 | _url, 15 | ) 16 | : throw 'Could not launch $_url'; 17 | @override 18 | Widget build(BuildContext context) { 19 | return SafeArea( 20 | child: Container( 21 | decoration: backgroundColorBoxDecoration(), 22 | child: Scaffold( 23 | body: SingleChildScrollView( 24 | child: Column( 25 | children: [ 26 | // LottieBuilder.asset( 27 | // reciteKoranLottie, 28 | // repeat: true, 29 | // ), 30 | SizedBox( 31 | height: MediaQuery.of(context).size.height * 0.12, 32 | ), 33 | Image.asset( 34 | logo, 35 | height: 200, 36 | ), 37 | SizedBox( 38 | height: MediaQuery.of(context).size.height * 0.12, 39 | ), 40 | Row( 41 | mainAxisAlignment: MainAxisAlignment.center, 42 | children: [ 43 | hifzPrograms( 44 | image: alnoorLogo, 45 | programName: "An-Noor Private School", 46 | url: "http://www.annoorschool.ca/islamic-atmosphere/"), 47 | hifzPrograms( 48 | image: alhijraLogo, 49 | programName: "Al Hijra Academy", 50 | url: 51 | "http://alhijraacademy.com/academics/quran-program/"), 52 | ], 53 | ), 54 | hifzPrograms( 55 | image: chathamLogo, 56 | programName: "Chatham Islamic Centre", 57 | url: "https://www.thecic.ca/"), 58 | ], 59 | ), 60 | ), 61 | ), 62 | ), 63 | ); 64 | } 65 | 66 | Widget hifzPrograms({ 67 | String programName, 68 | String url, 69 | String image, 70 | }) => 71 | Padding( 72 | padding: const EdgeInsets.all(12.0), 73 | child: InkWell( 74 | onTap: () { 75 | launchURL(url); 76 | }, 77 | child: EditedNeuomprphicContainer( 78 | isImage: true, 79 | icon: image, 80 | text: programName, 81 | ), 82 | ), 83 | ); 84 | } 85 | -------------------------------------------------------------------------------- /android/app/build.gradle: -------------------------------------------------------------------------------- 1 | def localProperties = new Properties() 2 | def localPropertiesFile = rootProject.file('local.properties') 3 | if (localPropertiesFile.exists()) { 4 | localPropertiesFile.withReader('UTF-8') { reader -> 5 | localProperties.load(reader) 6 | } 7 | } 8 | 9 | def flutterRoot = localProperties.getProperty('flutter.sdk') 10 | if (flutterRoot == null) { 11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") 12 | } 13 | 14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode') 15 | if (flutterVersionCode == null) { 16 | flutterVersionCode = '1' 17 | } 18 | 19 | def flutterVersionName = localProperties.getProperty('flutter.versionName') 20 | if (flutterVersionName == null) { 21 | flutterVersionName = '1.0' 22 | } 23 | 24 | apply plugin: 'com.android.application' 25 | apply plugin: 'kotlin-android' 26 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" 27 | apply plugin: 'com.google.gms.google-services' 28 | 29 | def keystoreProperties = new Properties() 30 | def keystorePropertiesFile = rootProject.file('key.properties') 31 | if (keystorePropertiesFile.exists()) { 32 | keystoreProperties.load(new FileInputStream(keystorePropertiesFile)) 33 | } 34 | 35 | android { 36 | compileSdkVersion 31 37 | 38 | sourceSets { 39 | main.java.srcDirs += 'src/main/kotlin' 40 | } 41 | lintOptions { 42 | disable 'InvalidPackage' 43 | disable "Instantiatable" 44 | checkReleaseBuilds false 45 | abortOnError false 46 | } 47 | defaultConfig { 48 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). 49 | applicationId "com.hassan.windsor_essex_muslim_care" 50 | minSdkVersion 23 51 | targetSdkVersion 31 52 | versionCode flutterVersionCode.toInteger() 53 | versionName flutterVersionName 54 | multiDexEnabled true 55 | 56 | } 57 | signingConfigs { 58 | // release { 59 | // keyAlias keystoreProperties['keyAlias'] 60 | // keyPassword keystoreProperties['keyPassword'] 61 | // storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null 62 | // storePassword keystoreProperties['storePassword'] 63 | // } 64 | } 65 | buildTypes { 66 | release { 67 | // TODO: Add your own signing config for the release build. 68 | // Signing with the debug keys for now, so `flutter run --release` works. 69 | signingConfig signingConfigs.debug 70 | } 71 | } 72 | } 73 | 74 | flutter { 75 | source '../..' 76 | } 77 | 78 | dependencies { 79 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 80 | implementation 'com.google.firebase:firebase-analytics-ktx' 81 | implementation platform('com.google.firebase:firebase-bom:27.1.0') 82 | implementation 'androidx.multidex:multidex:2.0.1' 83 | 84 | } 85 | -------------------------------------------------------------------------------- /assets/images/reading-quran.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 16 | 18 | 21 | 24 | 26 | 28 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "size" : "20x20", 5 | "idiom" : "iphone", 6 | "filename" : "Icon-App-20x20@2x.png", 7 | "scale" : "2x" 8 | }, 9 | { 10 | "size" : "20x20", 11 | "idiom" : "iphone", 12 | "filename" : "Icon-App-20x20@3x.png", 13 | "scale" : "3x" 14 | }, 15 | { 16 | "size" : "29x29", 17 | "idiom" : "iphone", 18 | "filename" : "Icon-App-29x29@1x.png", 19 | "scale" : "1x" 20 | }, 21 | { 22 | "size" : "29x29", 23 | "idiom" : "iphone", 24 | "filename" : "Icon-App-29x29@2x.png", 25 | "scale" : "2x" 26 | }, 27 | { 28 | "size" : "29x29", 29 | "idiom" : "iphone", 30 | "filename" : "Icon-App-29x29@3x.png", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "size" : "40x40", 35 | "idiom" : "iphone", 36 | "filename" : "Icon-App-40x40@2x.png", 37 | "scale" : "2x" 38 | }, 39 | { 40 | "size" : "40x40", 41 | "idiom" : "iphone", 42 | "filename" : "Icon-App-40x40@3x.png", 43 | "scale" : "3x" 44 | }, 45 | { 46 | "size" : "60x60", 47 | "idiom" : "iphone", 48 | "filename" : "Icon-App-60x60@2x.png", 49 | "scale" : "2x" 50 | }, 51 | { 52 | "size" : "60x60", 53 | "idiom" : "iphone", 54 | "filename" : "Icon-App-60x60@3x.png", 55 | "scale" : "3x" 56 | }, 57 | { 58 | "size" : "20x20", 59 | "idiom" : "ipad", 60 | "filename" : "Icon-App-20x20@1x.png", 61 | "scale" : "1x" 62 | }, 63 | { 64 | "size" : "20x20", 65 | "idiom" : "ipad", 66 | "filename" : "Icon-App-20x20@2x.png", 67 | "scale" : "2x" 68 | }, 69 | { 70 | "size" : "29x29", 71 | "idiom" : "ipad", 72 | "filename" : "Icon-App-29x29@1x.png", 73 | "scale" : "1x" 74 | }, 75 | { 76 | "size" : "29x29", 77 | "idiom" : "ipad", 78 | "filename" : "Icon-App-29x29@2x.png", 79 | "scale" : "2x" 80 | }, 81 | { 82 | "size" : "40x40", 83 | "idiom" : "ipad", 84 | "filename" : "Icon-App-40x40@1x.png", 85 | "scale" : "1x" 86 | }, 87 | { 88 | "size" : "40x40", 89 | "idiom" : "ipad", 90 | "filename" : "Icon-App-40x40@2x.png", 91 | "scale" : "2x" 92 | }, 93 | { 94 | "size" : "76x76", 95 | "idiom" : "ipad", 96 | "filename" : "Icon-App-76x76@1x.png", 97 | "scale" : "1x" 98 | }, 99 | { 100 | "size" : "76x76", 101 | "idiom" : "ipad", 102 | "filename" : "Icon-App-76x76@2x.png", 103 | "scale" : "2x" 104 | }, 105 | { 106 | "size" : "83.5x83.5", 107 | "idiom" : "ipad", 108 | "filename" : "Icon-App-83.5x83.5@2x.png", 109 | "scale" : "2x" 110 | }, 111 | { 112 | "size" : "1024x1024", 113 | "idiom" : "ios-marketing", 114 | "filename" : "Icon-App-1024x1024@1x.png", 115 | "scale" : "1x" 116 | } 117 | ], 118 | "info" : { 119 | "version" : 1, 120 | "author" : "xcode" 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /lib/tools/notificationHandler.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'dart:convert'; 3 | import 'package:flutter_local_notifications/flutter_local_notifications.dart'; 4 | import 'package:meta/meta.dart'; 5 | import 'package:firebase_messaging/firebase_messaging.dart'; 6 | import 'package:flutter/material.dart'; 7 | import 'package:http/http.dart' as http; 8 | import 'package:windsor_essex_muslim_care/main.dart'; 9 | 10 | Future> sendAndRetrieveMessage( 11 | {@required String token, 12 | @required String message, 13 | @required BuildContext context,String imageUrl, 14 | @required String title}) async { 15 | final String serverToken = 16 | "AAAAhM2Q2Uk:APA91bE1AODQPXPTjQR7QRsluocwMvcML9ICujROVj3s4JcK6fC71SKLC-vXSBXbv4MZwSN2G8KPyuTQ1wj62LAmtfL-KspT27AmFv_OZXDtZUjEk07-voMBsIKp95rlquD34Cd8zTjX"; 17 | final FirebaseMessaging _firebaseMessaging = FirebaseMessaging.instance; 18 | 19 | await http 20 | .post( 21 | Uri.parse('https://fcm.googleapis.com/fcm/send'), 22 | headers: { 23 | 'Content-Type': 'application/json', 24 | 'Authorization': 'key=$serverToken', 25 | }, 26 | body: jsonEncode( 27 | { 28 | 'notification': { 29 | 'body': message, 30 | 'title': '$title', 31 | imageUrl==null ? "":"image":imageUrl 32 | }, 33 | 'priority': 'high', 34 | 'data': { 35 | 'click_action': 'FLUTTER_NOTIFICATION_CLICK', 36 | 'id': '1', 37 | 'status': 'done' 38 | }, 39 | 'to': token, 40 | }, 41 | ), 42 | ) 43 | .then((value) => print("Notification Sent")); 44 | FirebaseMessaging.onMessage.listen((RemoteMessage message) { 45 | RemoteNotification notification = message.notification; 46 | AndroidNotification android = message.notification?.android; 47 | if (notification != null && android != null) { 48 | flutterLocalNotificationsPlugin.show( 49 | notification.hashCode, 50 | notification.title, 51 | notification.body, 52 | NotificationDetails( 53 | android: AndroidNotificationDetails( 54 | channel.id, 55 | channel.name, 56 | color: Colors.blue, 57 | playSound: true, 58 | icon: '@mipmap/ic_launcher', 59 | ), 60 | )); 61 | } 62 | }); 63 | FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) { 64 | RemoteNotification notification = message.notification; 65 | AndroidNotification android = message.notification?.android; 66 | if (notification != null && android != null) { 67 | showDialog( 68 | context: context, 69 | builder: (_) { 70 | return AlertDialog( 71 | title: Text(notification.title), 72 | content: SingleChildScrollView( 73 | child: Column( 74 | crossAxisAlignment: CrossAxisAlignment.start, 75 | children: [Text(notification.body)], 76 | ), 77 | ), 78 | ); 79 | }); 80 | } 81 | }); 82 | return null; 83 | } 84 | -------------------------------------------------------------------------------- /android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 31 | 35 | 39 | 44 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 59 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /lib/Database/local_database.dart: -------------------------------------------------------------------------------- 1 | import 'package:get_storage/get_storage.dart'; 2 | import 'package:shared_preferences/shared_preferences.dart'; 3 | import 'package:windsor_essex_muslim_care/screens/landingPage.dart'; 4 | 5 | class UserLocalData { 6 | String s = 'sd'; 7 | SharedPreferences _preferences; 8 | final getStorageProference = GetStorage(); 9 | 10 | Future init() async => _preferences = await SharedPreferences.getInstance(); 11 | 12 | // Future logOut() => _preferences.clear(); 13 | 14 | Future logOut() { 15 | userUid = ''; 16 | email = ''; 17 | isAdmin = false; 18 | token = ''; 19 | getStorageProference.erase(); 20 | } 21 | 22 | final _userModelString = 'USERMODELSTRING'; 23 | final _uidKey = 'UIDKEY'; 24 | final _isLoggedIn = "ISLOGGEDIN"; 25 | final _emailKey = 'EMAILKEY'; 26 | final _displayNameKey = 'DISPLAYNAMEKEY'; 27 | final _phoneNumberKey = 'PhoneNumber'; 28 | final _imageUrlKey = 'IMAGEURLKEY'; 29 | final _password = 'PASSWORD'; 30 | final _isAdmin = 'ISADMIN'; 31 | final _token = 'TOKEN'; 32 | 33 | // 34 | // Setters 35 | // 36 | Future setUserModelData(String userModelString) async => 37 | _preferences.setString(_userModelString, userModelString ?? ""); 38 | Future setUserEmail(String email) async => 39 | getStorageProference.write(_emailKey, email); 40 | 41 | Future setToken(String token) async => 42 | getStorageProference.write(_token, token); 43 | 44 | Future setIsAdmin(bool isAdmin) async => 45 | getStorageProference.write(_isAdmin, isAdmin); 46 | 47 | Future setUserUID(String uid) async => 48 | getStorageProference.write(_uidKey, uid); 49 | Future setNotLoggedIn() async => 50 | getStorageProference.write(_isLoggedIn, false); 51 | Future setLoggedIn(bool isLoggedIn) async => 52 | getStorageProference.write(_isLoggedIn, isLoggedIn ?? false); 53 | // Future setUserUID(String uid) async => 54 | // _preferences.setString(_uidKey, uid ?? ''); 55 | 56 | // Future setUserEmail(String email) async => 57 | // _preferences.setString(_emailKey, email ?? ''); 58 | 59 | Future setUserDisplayName(String name) async => 60 | _preferences.setString(_displayNameKey, name ?? ''); 61 | 62 | Future setUserPhoneNumber(String number) async => 63 | _preferences.setString(_phoneNumberKey, number ?? ''); 64 | 65 | Future setUserImageUrl(String url) async => 66 | _preferences.setString(_imageUrlKey, url ?? ''); 67 | Future setUserPassword(String password) async => 68 | _preferences.setString(_password, password ?? ''); 69 | 70 | // 71 | // Getters 72 | // 73 | bool getIsAdmin() => getStorageProference.read(_isAdmin) ?? false; 74 | String getUserToken() => getStorageProference.read(_token) ?? ''; 75 | 76 | String getUserModelData() => _preferences.getString(_userModelString) ?? ''; 77 | String getUserUIDGet() => getStorageProference.read(_uidKey) ?? ''; 78 | bool isLoggedIn() => getStorageProference.read(_uidKey); 79 | String getUserUID() => _preferences.getString(_uidKey) ?? ''; 80 | String getUserEmail() => getStorageProference.read(_emailKey) ?? ''; 81 | String getUserDisplayName() => _preferences.getString(_displayNameKey) ?? ''; 82 | String getUserPhoneNumber() => _preferences.getString(_phoneNumberKey) ?? ''; 83 | String getUserPassword() => _preferences.getString(_password) ?? ''; 84 | String getUserImageUrl() => _preferences.getString(_imageUrlKey) ?? ''; 85 | } 86 | -------------------------------------------------------------------------------- /assets/images/signUp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 13 | 19 | 21 | 23 | 25 | 27 | 30 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 56 | 62 | 63 | 64 | 65 | 66 | 67 | 73 | 75 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /assets/images/shop.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 31 | 32 | 33 | 34 | 35 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /lib/main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:animated_splash_screen/animated_splash_screen.dart'; 3 | import 'package:bot_toast/bot_toast.dart'; 4 | import 'package:get_storage/get_storage.dart'; 5 | import 'package:windsor_essex_muslim_care/Database/local_database.dart'; 6 | import 'package:windsor_essex_muslim_care/constants.dart'; 7 | import 'package:windsor_essex_muslim_care/screens/credentials/loginRelated/login.dart'; 8 | import 'screens/landingPage.dart'; 9 | import 'package:firebase_core/firebase_core.dart'; 10 | import 'package:get/get.dart'; 11 | import 'package:firebase_messaging/firebase_messaging.dart'; 12 | import 'package:flutter_local_notifications/flutter_local_notifications.dart'; 13 | 14 | const AndroidNotificationChannel channel = AndroidNotificationChannel( 15 | "high_importance_channel", 16 | "High Importance Notifications", 17 | importance: Importance.high, 18 | playSound: true, 19 | ); 20 | 21 | final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = 22 | FlutterLocalNotificationsPlugin(); 23 | 24 | Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { 25 | await Firebase.initializeApp(); 26 | } 27 | 28 | Future main() async { 29 | WidgetsFlutterBinding.ensureInitialized(); 30 | 31 | await GetStorage.init(); 32 | await Firebase.initializeApp(); 33 | FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); 34 | 35 | await flutterLocalNotificationsPlugin 36 | .resolvePlatformSpecificImplementation() 37 | ?.createNotificationChannel(channel); 38 | 39 | await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions( 40 | alert: true, 41 | badge: true, 42 | sound: true, 43 | ); 44 | runApp(MyApp()); 45 | } 46 | 47 | class MyApp extends StatelessWidget { 48 | // This widget is the root of your application. 49 | 50 | @override 51 | Widget build(BuildContext context) { 52 | UserLocalData().setNotLoggedIn(); 53 | userUid = UserLocalData().getUserUIDGet(); 54 | email = UserLocalData().getUserEmail(); 55 | isAdmin = UserLocalData().getIsAdmin(); 56 | token = UserLocalData().getUserToken(); 57 | 58 | return GetMaterialApp( 59 | title: 'Windsor Essex Muslim Care', 60 | builder: BotToastInit(), 61 | navigatorObservers: [BotToastNavigatorObserver()], 62 | theme: ThemeData( 63 | visualDensity: VisualDensity.adaptivePlatformDensity, 64 | primaryColor: Color(0xff96B7BF), 65 | accentColor: Color(0xffDEEEFE), 66 | scaffoldBackgroundColor: Colors.transparent, 67 | appBarTheme: AppBarTheme(color: Color(0xff96B7BF)), 68 | canvasColor: Colors.transparent, 69 | ), 70 | home: AnimatedSplashScreen( 71 | splashIconSize: 160, 72 | splash: Hero( 73 | tag: "logo", 74 | child: Image.asset( 75 | logo, 76 | height: 160, 77 | )), 78 | animationDuration: Duration(seconds: 1), 79 | centered: true, 80 | backgroundColor: Color(0xff96B7BF), 81 | //Color(0xff387A53), 82 | nextScreen: LandingPage(), 83 | duration: 1, 84 | splashTransition: SplashTransition.fadeTransition, 85 | ), 86 | // ), 87 | ); 88 | } 89 | } 90 | 91 | // class AuthenticationWrapper extends StatelessWidget { 92 | // @override 93 | // Widget build(BuildContext context) { 94 | // final firebaseUser = context.watch(); 95 | 96 | // if (firebaseUser != null) { 97 | // return HomePage(); 98 | // } 99 | // return SignUpOptions(); 100 | // } 101 | // } 102 | -------------------------------------------------------------------------------- /lib/credentials/signUpRelated/signUpOptions.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:get/get.dart'; 4 | import 'package:windsor_essex_muslim_care/screens/homePage.dart'; 5 | 6 | import '../../commonUIFunctions.dart'; 7 | import '../../constants.dart'; 8 | import 'emailSignUp.dart'; 9 | 10 | class SignUpOptions extends StatefulWidget { 11 | @override 12 | _SignUpOptionsState createState() => _SignUpOptionsState(); 13 | } 14 | 15 | class _SignUpOptionsState extends State { 16 | // TapGestureRecognizer _gestureRecognizer=TapGestureRecognizer()..onTap=(){ 17 | // Navigator.push(context, MaterialPageRoute(builder: (context)=>LogIn)); 18 | // } 19 | bool _isLoading = false; 20 | @override 21 | Widget build(BuildContext context) { 22 | return SafeArea( 23 | child: Container( 24 | decoration: backgroundColorBoxDecoration(), 25 | child: Scaffold( 26 | body: Center( 27 | child: Column( 28 | mainAxisAlignment: MainAxisAlignment.center, 29 | crossAxisAlignment: CrossAxisAlignment.center, 30 | children: [ 31 | SizedBox( 32 | height: 30, 33 | ), 34 | Hero( 35 | tag: "logo", 36 | child: Image.asset( 37 | logo, 38 | height: 120, 39 | )), 40 | SizedBox( 41 | height: 30, 42 | ), 43 | 44 | GestureDetector( 45 | // onTap: () => Navigator.push( 46 | // context, 47 | // MaterialPageRoute( 48 | // builder: (context) => EmailSignUp( 49 | // isSocial: true, 50 | // isEdit: false, 51 | // ))), 52 | onTap: () => Get.to(() => HomePage()), 53 | child: buildSignUpLoginButton( 54 | context: context, 55 | btnText: "Continue With Google", 56 | assetImage: googleLogo, 57 | hasIcon: true), 58 | ), 59 | 60 | //Other Options Text only 61 | Padding( 62 | padding: const EdgeInsets.all(8.0), 63 | child: Text( 64 | "Other Options", 65 | style: TextStyle( 66 | fontWeight: FontWeight.bold, 67 | fontSize: 25, 68 | ), 69 | ), 70 | ), 71 | GestureDetector( 72 | onTap: () => Navigator.push( 73 | context, 74 | MaterialPageRoute( 75 | builder: (context) => EmailSignUp( 76 | isSocial: false, 77 | isEdit: false, 78 | ))), 79 | child: buildSignUpLoginButton( 80 | context: context, 81 | btnText: "Sign Up with Email", 82 | assetImage: emailIcon, 83 | hasIcon: true, 84 | textColor: Colors.white, 85 | color: Colors.green), 86 | ), 87 | 88 | SizedBox( 89 | height: 10, 90 | ), 91 | // Move to Log In Page 92 | ], 93 | ), 94 | ), 95 | bottomSheet: buildSignUpLoginText( 96 | context: context, 97 | text1: "Already have an account? ", 98 | text2: "Log In", 99 | moveToLogIn: true), 100 | ), 101 | ), 102 | ); 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /lib/screens/mosquesList.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:lottie/lottie.dart'; 3 | import 'package:url_launcher/url_launcher.dart'; 4 | import 'package:windsor_essex_muslim_care/constants.dart'; 5 | import 'package:windsor_essex_muslim_care/tools/neuomorphic.dart'; 6 | 7 | class MosquesPrayerTimings extends StatelessWidget { 8 | void launchURL(String _url) async => await canLaunch(_url) 9 | ? await launch( 10 | _url, 11 | ) 12 | : throw 'Could not launch $_url'; 13 | @override 14 | Widget build(BuildContext context) { 15 | return SafeArea( 16 | child: Container( 17 | decoration: backgroundColorBoxDecoration(), 18 | child: Scaffold( 19 | body: SingleChildScrollView( 20 | child: Column( 21 | mainAxisAlignment: MainAxisAlignment.center, 22 | children: [ 23 | Row( 24 | children: [ 25 | Hero( 26 | tag: "mosqueIcon", 27 | child: LottieBuilder.asset( 28 | mosqueGumbatLottie, 29 | height: 200, 30 | ), 31 | ), 32 | Hero( 33 | tag: "mosque_timings", 34 | child: Text( 35 | "Local Mosque's\nPrayer Timings", 36 | style: titleTextStyle(), 37 | ), 38 | ), 39 | ], 40 | ), 41 | SizedBox( 42 | height: 60, 43 | ), 44 | Padding( 45 | padding: const EdgeInsets.all(8.0), 46 | child: Row( 47 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 48 | children: [ 49 | mosqueInfo( 50 | imageName: chathamLogo, 51 | mosqueName: "Chatham Islamic Centre", 52 | url: "https://www.thecic.ca/"), 53 | mosqueInfo( 54 | imageName: alhijraLogo, 55 | mosqueName: "Al Hijra Mosque", 56 | url: "http://alhijramosque.com/"), 57 | ], 58 | ), 59 | ), 60 | Padding( 61 | padding: const EdgeInsets.all(8.0), 62 | child: Row( 63 | mainAxisAlignment: MainAxisAlignment.spaceEvenly, 64 | children: [ 65 | mosqueInfo( 66 | imageName: windsorLogo, 67 | mosqueName: "Windsor Islamic Association", 68 | url: "https://windsorislamicassociation.com/"), 69 | mosqueInfo( 70 | imageName: macLogo, 71 | mosqueName: "Muslim Association of Canada", 72 | url: "https://centres.macnet.ca/rcic/"), 73 | ], 74 | ), 75 | ), 76 | Padding( 77 | padding: const EdgeInsets.all(8.0), 78 | child: mosqueInfo( 79 | imageName: masjidNoorLogo, 80 | mosqueName: "Masjid Noor-Ul-Islam", 81 | url: "http://masjid-noor-ul-islam.edan.io/"), 82 | ), 83 | ], 84 | ), 85 | ), 86 | ), 87 | ), 88 | ); 89 | } 90 | 91 | Widget mosqueInfo({ 92 | String imageName, 93 | String mosqueName, 94 | String url, 95 | }) { 96 | return InkWell( 97 | onTap: () { 98 | launchURL(url); 99 | }, 100 | child: EditedNeuomprphicContainer( 101 | icon: imageName, 102 | isImage: true, 103 | text: mosqueName, 104 | ), 105 | ); 106 | } 107 | } 108 | -------------------------------------------------------------------------------- /pubspec.yaml: -------------------------------------------------------------------------------- 1 | name: windsor_essex_muslim_care 2 | description: A new Flutter application. 3 | 4 | # The following line prevents the package from being accidentally published to 5 | # pub.dev using `pub publish`. This is preferred for private packages. 6 | publish_to: 'none' # Remove this line if you wish to publish to pub.dev 7 | 8 | # The following defines the version and build number for your application. 9 | # A version number is three numbers separated by dots, like 1.2.43 10 | # followed by an optional build number separated by a +. 11 | # Both the version and the builder number may be overridden in flutter 12 | # build by specifying --build-name and --build-number, respectively. 13 | # In Android, build-name is used as versionName while build-number used as versionCode. 14 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning 15 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion. 16 | # Read more about iOS versioning at 17 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html 18 | version: 1.0.3+4 19 | 20 | environment: 21 | sdk: ">=2.7.0 <3.0.0" 22 | 23 | dependencies: 24 | flutter: 25 | sdk: flutter 26 | bot_toast: 27 | cached_network_image: 28 | geolocator: 29 | geocoding: 30 | loading_animations: 31 | animated_splash_screen: 32 | get: 33 | get_storage: 34 | # glassmorphism_ui: ^0.3.0 35 | floating_navbar: ^2.0.1 36 | adhan: 37 | location: 38 | intl: 39 | url_launcher: 40 | firebase_core: ^1.0.4 41 | firebase_auth: ^3.4.1 42 | cloud_firestore: ^3.2.1 43 | fluttertoast: 44 | shared_preferences: ^2.0.5 45 | cupertino_icons: ^1.0.2 46 | flutter_qiblah: 47 | flutter_svg: 48 | webview_flutter: 49 | neuomorphic_container: ^2.0.3 50 | animations: 51 | lottie: 52 | introduction_screen: ^3.0.2 53 | flutter_markdown: 54 | image_picker: 55 | firebase_storage: 56 | liquid_swipe: ^3.0.0 57 | firebase_messaging: 58 | flutter_local_notifications: 59 | http: 60 | image: 61 | # The following adds the Cupertino Icons font to your application. 62 | # Use with the CupertinoIcons class for iOS style icons. 63 | 64 | 65 | dev_dependencies: 66 | flutter_test: 67 | sdk: flutter 68 | 69 | # For information on the generic Dart part of this file, see the 70 | # following page: https://dart.dev/tools/pub/pubspec 71 | 72 | # The following section is specific to Flutter. 73 | flutter: 74 | 75 | # The following line ensures that the Material Icons font is 76 | # included with your application, so that you can use the icons in 77 | # the material Icons class. 78 | uses-material-design: true 79 | 80 | assets: 81 | - assets/images/ 82 | - assets/lottie/ 83 | - assets/introPics/ 84 | - assets/policy.md 85 | 86 | 87 | # To add assets to your application, add an assets section, like this: 88 | # assets: 89 | # - images/a_dot_burr.jpeg 90 | # - images/a_dot_ham.jpeg 91 | 92 | # An image asset can refer to one or more resolution-specific "variants", see 93 | # https://flutter.dev/assets-and-images/#resolution-aware. 94 | 95 | # For details regarding adding assets from package dependencies, see 96 | # https://flutter.dev/assets-and-images/#from-packages 97 | 98 | # To add custom fonts to your application, add a fonts section here, 99 | # in this "flutter" section. Each entry in this list should have a 100 | # "family" key with the font family name, and a "fonts" key with a 101 | # list giving the asset and other descriptors for the font. For 102 | # example: 103 | # fonts: 104 | # - family: Schyler 105 | # fonts: 106 | # - asset: fonts/Schyler-Regular.ttf 107 | # - asset: fonts/Schyler-Italic.ttf 108 | # style: italic 109 | # - family: Trajan Pro 110 | # fonts: 111 | # - asset: fonts/TrajanPro.ttf 112 | # - asset: fonts/TrajanPro_Bold.ttf 113 | # weight: 700 114 | # 115 | # For details regarding fonts from package dependencies, 116 | # see https://flutter.dev/custom-fonts/#from-packages 117 | -------------------------------------------------------------------------------- /lib/screens/allBusinessPage.dart: -------------------------------------------------------------------------------- 1 | import 'package:cached_network_image/cached_network_image.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:get/get.dart'; 4 | import 'package:windsor_essex_muslim_care/screens/productDetails.dart'; 5 | 6 | import '../constants.dart'; 7 | 8 | class AllBusinessesPage extends StatefulWidget { 9 | @override 10 | _AllBusinessesPageState createState() => _AllBusinessesPageState(); 11 | } 12 | 13 | class _AllBusinessesPageState extends State { 14 | @override 15 | Widget build(BuildContext context) { 16 | return Container( 17 | decoration: backgroundColorBoxDecoration(), 18 | child: Scaffold( 19 | backgroundColor: Colors.transparent, 20 | body: ListView( 21 | children: [ 22 | businessesTile( 23 | businessName: "Any Business", 24 | location: "Block A, Etc Etc", 25 | imageLink: 26 | "https://upmetrics.co/assets/media/convenience-store-business-plan-example.jpg"), 27 | businessesTile( 28 | businessName: "Grossery Store", 29 | imageLink: 30 | "https://images.unsplash.com/photo-1578916171728-46686eac8d58?ixid=MnwxMjA3fDB8MHxzZWFyY2h8MTZ8fGdyb2NlcnklMjBzdG9yZXxlbnwwfHwwfHw%3D&ixlib=rb-1.2.1&w=1000&q=80", 31 | location: "Block B, bla bla Etc Etc"), 32 | businessesTile( 33 | businessName: "Coffee Shop", 34 | location: "Block A, blaadasd Etc Etc", 35 | imageLink: 36 | "https://images.unsplash.com/photo-1453614512568-c4024d13c247?ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mnx8Y29mZmVlJTIwc2hvcHxlbnwwfHwwfHw%3D&ixlib=rb-1.2.1&w=1000&q=80"), 37 | businessesTile( 38 | businessName: "Shoe Mart", 39 | imageLink: 40 | "https://i.pinimg.com/originals/e0/66/2b/e0662b9290406182ef0b6d6e6b5192a0.jpg", 41 | location: "Block A, North east Etc Etc"), 42 | ], 43 | ), 44 | ), 45 | ); 46 | } 47 | 48 | Padding businessesTile({ 49 | @required String businessName, 50 | @required String location, 51 | @required String imageLink, 52 | }) { 53 | return Padding( 54 | padding: 55 | const EdgeInsets.only(left: 40.0, right: 40, top: 10, bottom: 10), 56 | child: GestureDetector( 57 | onTap: () => Get.to(() => BusinessDetails( 58 | businessName: businessName, 59 | imageUrl: imageLink, 60 | location: location, 61 | )), 62 | child: Container( 63 | child: Column( 64 | crossAxisAlignment: CrossAxisAlignment.start, 65 | children: [ 66 | Hero( 67 | tag: imageLink, 68 | child: Container( 69 | height: 120, 70 | width: 350, 71 | child: CachedNetworkImage( 72 | height: 100, 73 | imageUrl: imageLink, 74 | placeholder: (context, url) => CircularProgressIndicator(), 75 | errorWidget: (context, url, error) => Icon(Icons.error), 76 | fit: BoxFit.cover, 77 | ), 78 | ), 79 | ), 80 | Column( 81 | crossAxisAlignment: CrossAxisAlignment.start, 82 | mainAxisAlignment: MainAxisAlignment.start, 83 | children: [ 84 | Padding( 85 | padding: const EdgeInsets.all(8.0), 86 | child: Hero( 87 | tag: businessName, 88 | child: Text( 89 | businessName, 90 | style: TextStyle(fontWeight: FontWeight.bold), 91 | ), 92 | ), 93 | ), 94 | Padding( 95 | padding: const EdgeInsets.only(left: 8.0, bottom: 12), 96 | child: Text( 97 | "Location: $location", 98 | style: TextStyle(fontWeight: FontWeight.w300), 99 | ), 100 | ), 101 | ], 102 | ), 103 | ], 104 | ), 105 | ), 106 | ), 107 | ); 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /assets/images/corpse.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lib/Database/database.dart: -------------------------------------------------------------------------------- 1 | import 'package:cloud_firestore/cloud_firestore.dart'; 2 | import 'package:firebase_messaging/firebase_messaging.dart'; 3 | import 'package:flutter/material.dart'; 4 | import 'package:windsor_essex_muslim_care/Database/local_database.dart'; 5 | import 'package:windsor_essex_muslim_care/config/collection_names.dart'; 6 | import 'package:windsor_essex_muslim_care/models/announcementsModel.dart'; 7 | import 'package:windsor_essex_muslim_care/models/userModel.dart'; 8 | import 'package:windsor_essex_muslim_care/screens/landingPage.dart'; 9 | import 'package:windsor_essex_muslim_care/tools/custom_toast.dart'; 10 | 11 | class DatabaseMethods { 12 | // Future> getproductData() async { 13 | // return FirebaseFirestore.instance.collection(productCollection).snapshots(); 14 | // } 15 | 16 | Future addUserInfoToFirebase( 17 | {@required UserModel userModel, 18 | @required String userId, 19 | @required email}) async { 20 | final Map userInfoMap = userModel.toMap(); 21 | return FirebaseFirestore.instance 22 | .collection(userDataCollection) 23 | .doc(userId) 24 | .set(userInfoMap) 25 | .then((value) { 26 | createToken(userId); 27 | 28 | UserLocalData().setUserUID(userModel.userId); 29 | UserLocalData().setUserEmail(userModel.email); 30 | UserLocalData().setIsAdmin(userModel.isAdmin); 31 | }).catchError( 32 | (Object obj) { 33 | errorToast(message: obj.toString()); 34 | }, 35 | ); 36 | } 37 | 38 | addAnnouncements( 39 | {final String postId, 40 | final String announcementTitle, 41 | final String imageUrl, 42 | final String eachUserId, 43 | String eachUserToken, 44 | final String description}) async { 45 | FirebaseFirestore.instance 46 | .collection("announcements") 47 | .doc(eachUserId) 48 | .collection("userAnnouncements") 49 | .doc(postId) 50 | .set({ 51 | "announcementId": postId, 52 | "announcementTitle": announcementTitle, 53 | "description": description, 54 | "timestamp": DateTime.now(), 55 | "token": eachUserToken, 56 | "imageUrl": imageUrl, 57 | "userId": userUid 58 | }); 59 | } 60 | 61 | createToken(String uid) { 62 | FirebaseMessaging.instance.getToken().then((token) { 63 | userRef.doc(uid).update({"androidNotificationToken": token}); 64 | UserLocalData().setToken(token); 65 | }); 66 | } 67 | 68 | Future getAnnouncements() async { 69 | List tempAllAnnouncements = []; 70 | QuerySnapshot tempAnnouncementsSnapshot = await FirebaseFirestore.instance 71 | .collection('announcements') 72 | .doc(userUid) 73 | .collection("userAnnouncements") 74 | .get(); 75 | tempAnnouncementsSnapshot.docs.forEach((element) { 76 | tempAllAnnouncements.add(AnnouncementsModel.fromDocument(element)); 77 | }); 78 | return tempAllAnnouncements; 79 | } 80 | 81 | Future addBankInfoToFirebase( 82 | {final String accountNo, 83 | final String transitNo, 84 | final String referenceNo, 85 | final String bankName, 86 | final String email, 87 | @required final String userId}) async { 88 | // final Map userInfoMap = userModel.toMap(); 89 | return FirebaseFirestore.instance 90 | .collection(bankInfoCollection) 91 | .doc(userId) 92 | .set({ 93 | "accountNo": accountNo, 94 | "email": email, 95 | "referenceNo": referenceNo, 96 | "transitNo": transitNo, 97 | "bankName": bankName, 98 | }).catchError( 99 | (Object obj) { 100 | errorToast(message: obj.toString()); 101 | }, 102 | ); 103 | } 104 | 105 | Future fetchUserInfoFromFirebase({@required String uid}) async { 106 | final DocumentSnapshot _user = await userRef.doc(uid).get(); 107 | createToken(uid); 108 | 109 | UserModel currentUser = UserModel.fromDocument(_user); 110 | UserLocalData().setUserUID(currentUser.androidNotificationToken); 111 | UserLocalData().setUserUID(currentUser.userId); 112 | UserLocalData().setUserEmail(currentUser.email); 113 | UserLocalData().setIsAdmin(currentUser.isAdmin); 114 | isAdmin = currentUser.isAdmin; 115 | userUid = UserLocalData().getUserUIDGet(); 116 | email = UserLocalData().getUserEmail(); 117 | isAdmin = UserLocalData().getIsAdmin(); 118 | token = UserLocalData().getUserToken(); 119 | return currentUser; 120 | // UserLocalData().setUserModelData(_userDataString); 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /lib/models/userModel.dart: -------------------------------------------------------------------------------- 1 | class UserModel { 2 | final String userId; 3 | final String firstName; 4 | final String middleName; 5 | final String displayName; 6 | final String androidNotificationToken; 7 | final String password; 8 | final String lastName; 9 | final String nextToKinName; 10 | final String timestamp; 11 | final bool isAdmin; 12 | final String email; 13 | final String postalCode; 14 | final String phoneNo; 15 | final String cellNo; 16 | final String homePhoneNo; 17 | final String emergencyPhoneNo; 18 | final String emergencyName; 19 | final String city; 20 | final bool isCanadianCitizen; 21 | final bool hasWillPrepared; 22 | final bool workAsVolunteer; 23 | final String immigrationStatus; 24 | final List dependents; 25 | UserModel({ 26 | this.userId, 27 | this.firstName, 28 | this.middleName, 29 | this.password, 30 | this.displayName, 31 | this.lastName, 32 | this.nextToKinName, 33 | this.timestamp, 34 | this.email, 35 | this.postalCode, 36 | this.phoneNo, 37 | this.cellNo, 38 | this.homePhoneNo, 39 | this.emergencyPhoneNo, 40 | this.emergencyName, 41 | this.city, 42 | this.hasWillPrepared, 43 | this.immigrationStatus, 44 | this.isAdmin, 45 | this.isCanadianCitizen, 46 | this.workAsVolunteer, 47 | this.androidNotificationToken, 48 | this.dependents, 49 | }); 50 | 51 | Map toMap() { 52 | return { 53 | "userId": userId, 54 | "displayName": displayName, 55 | "password": password, 56 | "firstName": firstName, 57 | "middleName": middleName, 58 | "lastName": lastName, 59 | "nextToKinName": nextToKinName, 60 | "timestamp": timestamp, 61 | "postalCode": postalCode, 62 | "email": email, 63 | "cellNo": cellNo, 64 | "homePhoneNo": homePhoneNo, 65 | "emergencyPhoneNo": emergencyPhoneNo, 66 | "emergencyName": emergencyName, 67 | "city": city, 68 | "immigrationStatus": immigrationStatus, 69 | "isCanadianCitizen": isCanadianCitizen, 70 | "workAsVolunteer": workAsVolunteer, 71 | "hasWillPrepared": hasWillPrepared, 72 | "phoneNo": phoneNo, 73 | "isAdmin": isAdmin, 74 | "androidNotificationToken": androidNotificationToken, 75 | "dependents": dependents, 76 | }; 77 | } 78 | 79 | factory UserModel.fromMap(Map map) { 80 | return UserModel( 81 | userId: map["userId"], 82 | firstName: map["firstName"], 83 | displayName: map["displayName"], 84 | password: map["password"], 85 | middleName: map["middleName"], 86 | lastName: map["lastName"], 87 | nextToKinName: map["nextToKinName"], 88 | timestamp: map["timestamp"], 89 | postalCode: map["postalCode"], 90 | email: map["email"], 91 | cellNo: map["cellNo"], 92 | homePhoneNo: map["homePhoneNo"], 93 | emergencyPhoneNo: map["emergencyPhoneNo"], 94 | emergencyName: map["emergencyName"], 95 | city: map["city"], 96 | immigrationStatus: map["immigrationStatus"], 97 | isCanadianCitizen: map["isCanadianCitizen"], 98 | workAsVolunteer: map["workAsVolunteer"], 99 | hasWillPrepared: map["hasWillPrepared"], 100 | phoneNo: map["phoneNo"], 101 | isAdmin: map["isAdmin"], 102 | androidNotificationToken: map["androidNotificationToken"], 103 | dependents: map["dependents"], 104 | ); 105 | } 106 | 107 | factory UserModel.fromDocument(doc) { 108 | return UserModel( 109 | userId: doc.data()["userId"], 110 | firstName: doc.data()["firstName"], 111 | password: doc.data()["password"], 112 | middleName: doc.data()["middleName"], 113 | displayName: doc.data()["displayName"], 114 | lastName: doc.data()["lastName"], 115 | nextToKinName: doc.data()["nextToKinName"], 116 | timestamp: doc.data()["timestamp"], 117 | postalCode: doc.data()["postalCode"], 118 | email: doc.data()["email"], 119 | cellNo: doc.data()["cellNo"], 120 | homePhoneNo: doc.data()["homePhoneNo"], 121 | emergencyPhoneNo: doc.data()["emergencyPhoneNo"], 122 | emergencyName: doc.data()["emergencyName"], 123 | city: doc.data()["city"], 124 | immigrationStatus: doc.data()["immigrationStatus"], 125 | isCanadianCitizen: doc.data()["isCanadianCitizen"], 126 | workAsVolunteer: doc.data()["workAsVolunteer"], 127 | hasWillPrepared: doc.data()["hasWillPrepared"], 128 | phoneNo: doc.data()["phoneNo"], 129 | isAdmin: doc.data()["isAdmin"], 130 | androidNotificationToken: doc.data()["androidNotificationToken"], 131 | dependents: doc.data()["dependents"], 132 | ); 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /assets/images/community.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lib/screens/homePage.dart: -------------------------------------------------------------------------------- 1 | 2 | import 'package:flutter/material.dart'; 3 | import 'package:windsor_essex_muslim_care/screens/allBusinessPage.dart'; 4 | import 'package:windsor_essex_muslim_care/screens/islamicSchools.dart'; 5 | import 'package:windsor_essex_muslim_care/screens/prayerTimings.dart'; 6 | import 'package:windsor_essex_muslim_care/screens/qiblaPage.dart'; 7 | 8 | import '../constants.dart'; 9 | import '../tools/glassmorphism/src/blur.dart'; 10 | 11 | class HomePage extends StatefulWidget { 12 | @override 13 | _HomePageState createState() => _HomePageState(); 14 | } 15 | 16 | class _HomePageState extends State { 17 | PageController pageController; 18 | int pageIndex = 0; 19 | 20 | onPageChanged(int pageIndex) { 21 | setState(() { 22 | this.pageIndex = pageIndex; 23 | }); 24 | } 25 | 26 | onTap(int pageIndex) { 27 | pageController.jumpToPage( 28 | pageIndex, 29 | ); 30 | } 31 | 32 | @override 33 | void initState() { 34 | super.initState(); 35 | pageController = PageController(); 36 | } 37 | 38 | @override 39 | Widget build(BuildContext context) { 40 | return SafeArea( 41 | child: Container( 42 | decoration: backgroundColorBoxDecoration(), 43 | child: Scaffold( 44 | extendBody: true, 45 | backgroundColor: Colors.transparent, 46 | body: Stack( 47 | alignment: Alignment.bottomCenter, 48 | children: [ 49 | PageView( 50 | controller: pageController, 51 | onPageChanged: onPageChanged, 52 | physics: NeverScrollableScrollPhysics(), 53 | children: [ 54 | AllBusinessesPage(), 55 | IslamicSchools(), 56 | QiblahCompass(), 57 | PrayersTimings() 58 | ], 59 | ), 60 | ], 61 | ), 62 | bottomNavigationBar: Container( 63 | decoration: BoxDecoration( 64 | borderRadius: BorderRadius.only( 65 | topLeft: Radius.circular(10), 66 | topRight: Radius.circular(10), 67 | ), 68 | ), 69 | child: BottomNavigationBar( 70 | backgroundColor: Color(0x00ffffff), 71 | currentIndex: pageIndex, 72 | onTap: onTap, 73 | elevation: 0, 74 | showUnselectedLabels: false, 75 | unselectedItemColor: Colors.black, 76 | selectedItemColor: Colors.white, 77 | items: [ 78 | BottomNavigationBarItem( 79 | icon: Icon(Icons.shopping_basket_outlined), 80 | label: "businesses", 81 | ), 82 | BottomNavigationBarItem( 83 | icon: Icon(Icons.ac_unit), label: "qibla Directions"), 84 | BottomNavigationBarItem( 85 | icon: Icon(Icons.ac_unit), label: "Islamic Schools"), 86 | BottomNavigationBarItem( 87 | icon: Icon(Icons.local_pharmacy_rounded), 88 | label: "Prayer Timings") 89 | ], 90 | ), 91 | ), 92 | // Row( 93 | // mainAxisAlignment: MainAxisAlignment.spaceEvenly, 94 | // children: [ 95 | // Icon( 96 | // Icons.shopping_basket_outlined, 97 | // size: 35, 98 | // ), 99 | // Icon( 100 | // Icons.assistant_navigation, 101 | // size: 35, 102 | // ) 103 | // ], 104 | // ), 105 | 106 | // bottomNavigationBar: Blur( 107 | // opacity: 1, 108 | // blur: 8, 109 | // child: FloatingNavBar( 110 | // color: Colors.white10, 111 | // selectedIconColor: Colors.white, 112 | // unselectedIconColor: Colors.white.withOpacity(0.6), 113 | // items: [ 114 | // FloatingNavBarItem( 115 | // iconData: Icons.home_outlined, 116 | // page: AllBusinessesPage(), 117 | // title: 'Home'), 118 | // FloatingNavBarItem( 119 | // iconData: Icons.home_outlined, 120 | // page: QiblaPage(), 121 | // title: 'Home'), 122 | // ], 123 | // horizontalPadding: 10.0, 124 | // hapticFeedback: true, 125 | // showTitle: true, 126 | // ), 127 | // ), 128 | ), 129 | ), 130 | ); 131 | } 132 | } 133 | -------------------------------------------------------------------------------- /lib/services/authentication_service.dart: -------------------------------------------------------------------------------- 1 | import 'package:firebase_auth/firebase_auth.dart'; 2 | import 'package:windsor_essex_muslim_care/Database/database.dart'; 3 | import 'package:windsor_essex_muslim_care/models/userModel.dart'; 4 | import 'package:windsor_essex_muslim_care/tools/custom_toast.dart'; 5 | 6 | class AuthenticationService { 7 | final FirebaseAuth _firebaseAuth = FirebaseAuth.instance; 8 | Future getCurrentUser() async { 9 | return _firebaseAuth.currentUser; 10 | } 11 | 12 | // AuthenticationService(this._firebaseAuth); 13 | 14 | /// Changed to idTokenChanges as it updates depending on more cases. 15 | // Stream get authStateChanges => _firebaseAuth.idTokenChanges(); 16 | 17 | /// This won't pop routes so you could do something like 18 | /// Navigator.of(context).pushNamedAndRemoveUntil('/', (Route route) => false); 19 | /// after you called this method if you want to pop all routes. 20 | 21 | Future forgetPassword({String email}) async { 22 | await _firebaseAuth.sendPasswordResetEmail(email: email); 23 | } 24 | 25 | Future signOut() async { 26 | await _firebaseAuth.signOut(); 27 | } 28 | 29 | /// There are a lot of different ways on how you can do exception handling. 30 | /// This is to make it as easy as possible but a better way would be to 31 | /// use your own custom class that would take the exception and return better 32 | /// error messages. That way you can throw, return or whatever you prefer with that instead. 33 | Future logIn({ 34 | String email, 35 | final String password, 36 | }) async { 37 | try { 38 | final UserCredential result = await _firebaseAuth 39 | .signInWithEmailAndPassword(email: email, password: password); 40 | return result.user.uid; 41 | } on FirebaseAuthException catch (e) { 42 | errorToast(message: e.message); 43 | return null; 44 | } 45 | } 46 | 47 | Future signUp({ 48 | String password, 49 | final String userId, 50 | final String firstName, 51 | final String middleName, 52 | final String displayName, 53 | final String lastName, 54 | final String nextToKinName, 55 | final timestamp, 56 | final String email, 57 | final String postalCode, 58 | final String phoneNo, 59 | final String cellNo, 60 | final String homePhoneNo, 61 | final String emergencyPhoneNo, 62 | final String emergencyName, 63 | final String city, 64 | final bool isCanadianCitizen, 65 | final bool hasWillPrepared, 66 | final bool workAsVolunteer, 67 | final String immigrationStatus, 68 | final String accountNo, 69 | final String transitNo, 70 | final String referenceNo, 71 | final List dependents, 72 | final String bankName, 73 | }) async { 74 | try { 75 | final UserCredential result = await _firebaseAuth 76 | .createUserWithEmailAndPassword(email: email, password: password) 77 | .catchError((Object obj) { 78 | errorToast(message: obj.toString()); 79 | }); 80 | final User user = result.user; 81 | assert(user != null); 82 | assert(await user.getIdToken() != null); 83 | if (user != null) { 84 | final UserModel currentUser = UserModel( 85 | userId: user.uid, 86 | displayName: displayName, 87 | phoneNo: phoneNo.trim(), 88 | email: email.trim(), 89 | password: password, 90 | cellNo: cellNo, 91 | city: city, 92 | emergencyName: emergencyName, 93 | emergencyPhoneNo: emergencyPhoneNo, 94 | firstName: firstName, 95 | hasWillPrepared: hasWillPrepared, 96 | homePhoneNo: homePhoneNo, 97 | immigrationStatus: immigrationStatus, 98 | isCanadianCitizen: isCanadianCitizen, 99 | lastName: lastName, 100 | middleName: middleName, 101 | nextToKinName: nextToKinName, 102 | postalCode: postalCode, 103 | timestamp: timestamp, 104 | dependents: dependents, 105 | isAdmin: false, 106 | workAsVolunteer: workAsVolunteer); 107 | await DatabaseMethods().addUserInfoToFirebase( 108 | userModel: currentUser, userId: user.uid, email: email); 109 | await DatabaseMethods().addBankInfoToFirebase( 110 | accountNo: accountNo, 111 | bankName: bankName, 112 | email: email, 113 | userId: user.uid, 114 | referenceNo: referenceNo, 115 | transitNo: transitNo); 116 | } 117 | return user; 118 | } on FirebaseAuthException catch (e) { 119 | errorToast(message: e.message); 120 | return null; 121 | } 122 | } 123 | } 124 | -------------------------------------------------------------------------------- /lib/constants.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | String announcementsIcon = "assets/images/loudspeaker.svg"; 4 | String logo = "assets/images/logo.png"; 5 | String logoBackground = "assets/images/logoBackground.jpeg"; 6 | String countryMeadowsCemetery = "assets/images/countryMeadowsCemetery.png"; 7 | String windLottie = "assets/lottie/weather-wind.json"; 8 | String communityIcon = "assets/images/community.svg"; 9 | String windsorMemorials = "assets/images/windsorMemorials.png"; 10 | String kaaba = "assets/images/kaaba-building.svg"; 11 | String prayer = "assets/images/prayerTimings.png"; 12 | String mosqueBackGround = "assets/images/mosqueBackground.jpg"; 13 | String loginIcon = "assets/images/logIn.svg"; 14 | String signUp = "assets/images/signUp.svg"; 15 | String hifzProgram = "assets/images/hifzProgram.png"; 16 | String memberModule = "assets/images/member_module.png"; 17 | String lastJourney = "assets/images/corpse.svg"; 18 | String shop = "assets/images/business.png"; 19 | String googleLogo = "assets/images/google.png"; 20 | String facebookLogo = "assets/images/facebook.png"; 21 | String emailIcon = "assets/images/email.png"; 22 | String forgetPassPageIcon = "assets/images/MaskGroup1.png"; 23 | String plusIcon = "assets/images/plus.png"; 24 | String minusIcon = "assets/images/minus.png"; 25 | String deleteIcon = "assets/images/Icon_Delete.png"; 26 | String bagIcon = "assets/images/bag.png"; 27 | String locationIcon = "assets/images/location.png"; 28 | String bellIcon = "assets/images/bell.png"; 29 | String editProfileIcon = "assets/images/editProfile.png"; 30 | String notificationIcon = "assets/images/Notifications.png"; 31 | String logoutIcon = "assets/images/logOut.svg"; 32 | String aboutUsIcon = "assets/images/aboutUs.png"; 33 | String makeAdanLottie = "assets/lottie/make_adan.json"; 34 | String reciteKoranLottie = "assets/lottie/read_koran.json"; 35 | String staryCeilingLottie = "assets/lottie/stary_ceiling.json"; 36 | String mosqueGumbatLottie = "assets/lottie/mosque_gumbat.json"; 37 | String announcementsLottie = "assets/lottie/announcement.json"; 38 | String windsorLogo = "assets/images/windsorLogo.png"; 39 | String alhijraLogo = "assets/images/alhijraLogo.png"; 40 | String chathamLogo = "assets/images/chathamLogo.png"; 41 | String macLogo = "assets/images/macLogo.png"; 42 | String masjidNoorLogo = "assets/images/masjidNoorLogo.jpg"; 43 | String prayerPagePicture = "assets/images/prayerPagePicture.png"; 44 | String alnoorLogo = "assets/images/alnoorLogo.png"; 45 | String alhijraImg = "assets/images/alhijra_img.jpeg"; 46 | String userDetailsLottie = "assets/lottie/userDetails.json"; 47 | String searchUsersLottie = "assets/lottie/searchUsers.json"; 48 | 49 | TextStyle titleTextStyle({double fontSize = 25, Color color = Colors.black}) { 50 | return TextStyle( 51 | fontSize: fontSize, 52 | fontWeight: FontWeight.w600, 53 | color: color, 54 | letterSpacing: 1.8); 55 | } 56 | 57 | TextStyle customTextStyle( 58 | {FontWeight fontWeight = FontWeight.w300, 59 | double fontSize = 25, 60 | Color color = Colors.black}) { 61 | return TextStyle( 62 | fontSize: fontSize, 63 | fontWeight: fontWeight, 64 | color: color, 65 | letterSpacing: 3); 66 | } 67 | 68 | Color containerColor = Color(0xff96B7BF); 69 | 70 | // Colors.white; 71 | // Color(0xffFED5E3); 72 | BoxDecoration backgroundColorBoxDecorationLogo() { 73 | return BoxDecoration( 74 | image: DecorationImage( 75 | image: AssetImage(logo), 76 | colorFilter: ColorFilter.mode(Colors.white70, BlendMode.srcATop), 77 | alignment: Alignment.center, 78 | scale: 0.3), 79 | gradient: LinearGradient( 80 | colors: [ 81 | // Color(0xff387A53), 82 | // Color(0xff8BE78B), 83 | 84 | Colors.white, 85 | 86 | Color(0xff96B7BF), 87 | 88 | // Colors.green[100], 89 | // Colors.blue[200], 90 | ], 91 | begin: Alignment.topLeft, 92 | end: Alignment.bottomLeft, 93 | ), 94 | ); 95 | } 96 | 97 | BoxDecoration backgroundColorBoxDecoration() { 98 | return BoxDecoration( 99 | gradient: LinearGradient( 100 | colors: [ 101 | // Color(0xff387A53), 102 | // Color(0xff8BE78B), 103 | 104 | Colors.white, 105 | // Color(0xffFED5E3), 106 | Color(0xff96B7BF), 107 | 108 | // Colors.green[100], 109 | // Colors.blue[200], 110 | ], 111 | begin: Alignment.topLeft, 112 | end: Alignment.bottomLeft, 113 | ), 114 | ); 115 | } 116 | 117 | BoxDecoration drawerColorBoxDecoration() { 118 | return BoxDecoration( 119 | gradient: LinearGradient( 120 | colors: [ 121 | // Color(0xff8BE78B), 122 | Colors.black, 123 | Colors.green[100], 124 | ], 125 | begin: Alignment.bottomRight, 126 | end: Alignment.topLeft, 127 | ), 128 | ); 129 | } 130 | -------------------------------------------------------------------------------- /assets/policy.md: -------------------------------------------------------------------------------- 1 | **Aims and Objectives:** 2 | 3 | Windsor-Essex Muslim Care is a non-profit organization aimed 4 | 5 | at collectively providing Muslim funeral expenses to its 6 | 7 | members and family members registered with this trust. This is 8 | 9 | to relieve some of the worries at the time of human loss. 10 | 11 | **1. Member Eligibility** 12 | 13 | 1a. Must be of legal age to register 14 | 15 | 1b. Must reside in the Windsor-Essex and surrounding areas 16 | 17 | 1c. Spouse, children and parents living at the same address are 18 | 19 | eligible under primary member 20 | 21 | 1d. Married children must register separately 22 | 23 | 1e. International students and refugee who resides in the 24 | 25 | Windsor-Essex and surrounding area can get a 26 | 27 | membership 28 | 29 | 1f. **WEMC recommends having the "The Last WILL" available** 30 | 31 | **at the time of registration** 32 | 33 | **2. Membership Requirements and Registration Fee** 34 | 35 | 2a. Membership and membership status are non-transferrable 36 | 37 | 2b. Membership registration includes filling out a membership 38 | 39 | form with electronic funds transfer information and 40 | 41 | providing one-time registration fee 42 | 43 | 2c. Services will be activated 90 days from the day the 44 | 45 | application is approved 46 | 47 | 2d. Initial, one time, non-refundable and non-transferrable 48 | 49 | membership fee is due at sign up. See table 1 for 50 | 51 | registration fee structure 52 | 53 | Table 1: Registration fee structure 54 | 55 | Initial, one-time, non-refundable, non-transferable 56 | 57 | registration fee, CAD 58 | 59 | **Primary member**** Spouse Children Dependent Parents** 60 | 61 | $100 $20 $20/child $20/each 62 | 63 | 2e. If there is a newborn in a family, member is required to 64 | 65 | update the information with Trust within 3 months and 66 | 67 | pay registration fee as per registration fee structure 68 | 69 | 2f. A member must be in a good standing with initial 70 | 71 | registration fee and incidental payments for 72 | 73 | him/her to qualify for a claim payment 74 | 75 | 2g. Member is responsible for NSF charges if banking 76 | 77 | information is not updated timely 78 | 79 | 2h. Member will be issued warning if any payment is missed 80 | 81 | and WEMC reserves the right to ultimately terminate the 82 | 83 | membership if a payment is not received within 30 days 84 | 85 | including any NSF charges 86 | 87 | **3. Claim Payments** 88 | 89 | 3a. Payment checks will be written in the name of funeral 90 | 91 | service providers or to the family if expenses have already 92 | 93 | been paid by the family and will be given to the 94 | 95 | member/family. The information of the funeral service 96 | 97 | providers will be gathered from member, his/her family, or 98 | 99 | his/her friends. 100 | 101 | 3b. Claim payment will not exceed 6000CAD 102 | 103 | 3c. Claim payments will be made for funeral services and burial 104 | 105 | in Canada so long as the membership remains in good 106 | 107 | standing at all times 108 | 109 | 3d. If a member or eligible dependent requiring payment 110 | 111 | outside of Canada, request will be reviewed by the WEMC 112 | 113 | core committee (maximum amount criteria still hold) 114 | 115 | **4. Claimable Funeral Expenses** 116 | 117 | 4a. Funeral services 118 | 119 | 4b. Casket/coffin 120 | 121 | 4c. Grave 122 | 123 | 4d. Shroud 124 | 125 | 4e. Preparation of body for burial 126 | 127 | 4f. Local transportation for burial 128 | 129 | **5. Unclaimable Funeral Expenses** 130 | 131 | 5a. Headstones or plaques 132 | 133 | 5b. Long distance transportation and extended storage of body 134 | 135 | 5c. Floral tributes 136 | 137 | 5d. Media announcements 138 | 139 | 5e. Cost of additional transportation (family & friends) 140 | 141 | 5f. Viewing/wake services 142 | 143 | **6. Initiation and Disbursement of the claim** 144 | 145 | 6a. A list of "to do things" is available for the members for 146 | 147 | reference. Please follow the link to get the copy of the list 148 | 149 | 6b. As soon as the death is announced by 150 | 151 | member/family/mosque, WEMC committee will inform all 152 | 153 | the members by email, text messages or telephone about 154 | 155 | Salah-tul-Janaza's location, date and time. 156 | 157 | 6c. WEMC committee will coordinate with the grieving family 158 | 159 | to gather information on the funeral service expenses 160 | 161 | 6d. WEMC will pay funeral expenses as described in section 3, 162 | 163 | 4, and 5 using the funds collected via registration fee 164 | 165 | 6e. Total expense paid (not exceeding 6000CAD) will then be 166 | 167 | equally distributed to all primary members 168 | 169 | 6f. WEMC will then withdraw the amount (as calculated in the 170 | 171 | term 6e) from the member bank account 72 hours after the 172 | 173 | expenses are paid 174 | 175 | 6g. Zakat, Sadaka and charitable donations are not accepted 176 | 177 | towards article "6e". Hence no tax receipt will be issued. -------------------------------------------------------------------------------- /lib/screens/qiblaPage.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | import 'dart:math' show pi; 3 | import 'package:flutter_svg/flutter_svg.dart'; 4 | import 'package:flutter/material.dart'; 5 | import 'package:flutter_qiblah/flutter_qiblah.dart'; 6 | import 'package:geolocator/geolocator.dart'; 7 | import 'package:windsor_essex_muslim_care/constants.dart'; 8 | import 'package:windsor_essex_muslim_care/tools/loading.dart'; 9 | import 'package:windsor_essex_muslim_care/tools/loadingErrorWidget.dart'; 10 | 11 | class QiblahCompass extends StatefulWidget { 12 | @override 13 | _QiblahCompassState createState() => _QiblahCompassState(); 14 | } 15 | 16 | class _QiblahCompassState extends State { 17 | final _locationStreamController = 18 | StreamController.broadcast(); 19 | 20 | get stream => _locationStreamController.stream; 21 | 22 | @override 23 | void initState() { 24 | _checkLocationStatus(); 25 | super.initState(); 26 | } 27 | 28 | @override 29 | Widget build(BuildContext context) { 30 | return SafeArea( 31 | child: Container( 32 | decoration: backgroundColorBoxDecoration(), 33 | child: Scaffold( 34 | body: StreamBuilder( 35 | stream: stream, 36 | builder: (context, AsyncSnapshot snapshot) { 37 | if (snapshot.connectionState == ConnectionState.waiting) 38 | return Center(child: LoadingIndicator()); 39 | if (snapshot.data.enabled == true) { 40 | switch (snapshot.data.status) { 41 | case LocationPermission.always: 42 | case LocationPermission.whileInUse: 43 | return QiblahCompassWidget(); 44 | 45 | case LocationPermission.denied: 46 | return LocationErrorWidget( 47 | error: "Location service permission denied", 48 | callback: _checkLocationStatus, 49 | ); 50 | case LocationPermission.deniedForever: 51 | return LocationErrorWidget( 52 | error: "Location service Denied Forever !", 53 | callback: _checkLocationStatus, 54 | ); 55 | // case GeolocationStatus.unknown: 56 | // return LocationErrorWidget( 57 | // error: "Unknown Location service error", 58 | // callback: _checkLocationStatus, 59 | // ); 60 | default: 61 | return Container(); 62 | } 63 | } else { 64 | return LocationErrorWidget( 65 | error: "Please enable Location service", 66 | callback: _checkLocationStatus, 67 | ); 68 | } 69 | }, 70 | ), 71 | ), 72 | ), 73 | ); 74 | } 75 | 76 | Future _checkLocationStatus() async { 77 | final locationStatus = await FlutterQiblah.checkLocationStatus(); 78 | if (locationStatus.enabled && 79 | locationStatus.status == LocationPermission.denied) { 80 | await FlutterQiblah.requestPermissions(); 81 | final s = await FlutterQiblah.checkLocationStatus(); 82 | _locationStreamController.sink.add(s); 83 | } else 84 | _locationStreamController.sink.add(locationStatus); 85 | } 86 | 87 | @override 88 | void dispose() { 89 | super.dispose(); 90 | _locationStreamController.close(); 91 | FlutterQiblah().dispose(); 92 | } 93 | } 94 | 95 | class QiblahCompassWidget extends StatelessWidget { 96 | final _compassSvg = SvgPicture.asset('assets/images/compass.svg'); 97 | final _needleSvg = SvgPicture.asset( 98 | 'assets/images/needle.svg', 99 | fit: BoxFit.contain, 100 | height: 300, 101 | alignment: Alignment.center, 102 | ); 103 | 104 | @override 105 | Widget build(BuildContext context) { 106 | return StreamBuilder( 107 | stream: FlutterQiblah.qiblahStream, 108 | builder: (_, AsyncSnapshot snapshot) { 109 | if (snapshot.connectionState == ConnectionState.waiting) 110 | return CircularProgressIndicator(); 111 | 112 | final qiblahDirection = snapshot.data; 113 | 114 | return Stack( 115 | alignment: Alignment.center, 116 | children: [ 117 | Transform.rotate( 118 | angle: (qiblahDirection.direction * (pi / 180) * -1), 119 | child: _compassSvg, 120 | ), 121 | Transform.rotate( 122 | angle: (qiblahDirection.qiblah * (pi / 180) * -1), 123 | alignment: Alignment.center, 124 | child: _needleSvg, 125 | ), 126 | Positioned( 127 | bottom: 8, 128 | child: Text("${qiblahDirection.offset.toStringAsFixed(3)}°"), 129 | ) 130 | ], 131 | ); 132 | }, 133 | ); 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /assets/images/aboutUs.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /lib/credentials/loginRelated/forgetPasswordPage.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:windsor_essex_muslim_care/tools/loading.dart'; 3 | 4 | import '../../commonUIFunctions.dart'; 5 | import '../../constants.dart'; 6 | 7 | class ForgetPasswordPage extends StatefulWidget { 8 | @override 9 | _ForgetPasswordPageState createState() => _ForgetPasswordPageState(); 10 | } 11 | 12 | class _ForgetPasswordPageState extends State { 13 | TextEditingController _emailController = TextEditingController(); 14 | final _textFormKey = GlobalKey(); 15 | 16 | bool _isLoading = false; 17 | 18 | @override 19 | Widget build(BuildContext context) { 20 | return SafeArea( 21 | child: Container( 22 | decoration: backgroundColorBoxDecoration(), 23 | child: Scaffold( 24 | body: SingleChildScrollView( 25 | child: Stack( 26 | children: [ 27 | Column( 28 | children: [ 29 | Padding( 30 | padding: const EdgeInsets.all(20.0), 31 | child: Hero( 32 | tag: "logo", 33 | child: Image.asset( 34 | logo, 35 | height: 90, 36 | )), 37 | ), 38 | Center( 39 | child: Padding( 40 | padding: const EdgeInsets.all(8.0), 41 | child: Image.asset( 42 | forgetPassPageIcon, 43 | height: 60, 44 | ), 45 | ), 46 | ), 47 | SizedBox( 48 | height: 20, 49 | ), 50 | Padding( 51 | padding: const EdgeInsets.all(8.0), 52 | child: Hero( 53 | tag: "passFor", 54 | child: Text( 55 | "Forgot Password?", 56 | style: TextStyle( 57 | fontWeight: FontWeight.bold, 58 | fontSize: 20, 59 | ), 60 | ), 61 | ), 62 | ), 63 | Form( 64 | key: _textFormKey, 65 | child: Padding( 66 | padding: const EdgeInsets.all(12.0), 67 | child: Card( 68 | elevation: 4, 69 | child: TextFormField( 70 | controller: _emailController, 71 | keyboardType: TextInputType.text, 72 | validator: (String val) { 73 | if (val == null) { 74 | return null; 75 | } 76 | if (val.isEmpty) { 77 | return "Field is Empty"; 78 | } else if (!val.contains("@") || 79 | val.trim().length < 4) { 80 | return "Invalid E-mail!"; 81 | } else { 82 | return null; 83 | } 84 | }, 85 | // onSaved: (val) => phoneNo = val, 86 | autofocus: true, 87 | decoration: InputDecoration( 88 | border: InputBorder.none, 89 | filled: true, 90 | fillColor: Colors.white, 91 | labelText: "E-mail", 92 | labelStyle: TextStyle(fontSize: 15.0), 93 | hintText: "Please enter your valid E-mail", 94 | ), 95 | ), 96 | ), 97 | ), 98 | ), 99 | SizedBox( 100 | height: 10, 101 | ), 102 | GestureDetector( 103 | onTap: () => handleForgetPass(), 104 | child: buildSignUpLoginButton( 105 | context: context, 106 | btnText: "Continue", 107 | hasIcon: false, 108 | textColor: Colors.white, 109 | color: Colors.green), 110 | ), 111 | ], 112 | ), 113 | _isLoading ? LoadingIndicator() : Container(), 114 | ], 115 | ), 116 | ), 117 | bottomSheet: buildSignUpLoginText( 118 | context: context, 119 | text1: "Don't have an account ", 120 | text2: "Sign Up", 121 | moveToLogIn: false), 122 | ), 123 | ), 124 | ); 125 | } 126 | 127 | getPass({ 128 | @required String email, 129 | }) async {} 130 | 131 | handleForgetPass() async { 132 | final FormState _form = _textFormKey.currentState; 133 | 134 | if (_form == null) { 135 | return null; 136 | } 137 | if (_form.validate()) { 138 | setState(() { 139 | _isLoading = false; 140 | }); 141 | } 142 | } 143 | } 144 | -------------------------------------------------------------------------------- /assets/images/muslim-man-praying.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 10 | 48 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /lib/commonUIFunctions.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_svg/flutter_svg.dart'; 3 | import 'package:windsor_essex_muslim_care/screens/credentials/loginRelated/login.dart'; 4 | import 'package:windsor_essex_muslim_care/screens/onBardingPage.dart'; 5 | 6 | 7 | TextStyle homePageTextStyle({ 8 | bool isClicked = false, 9 | }) { 10 | return TextStyle( 11 | fontSize: isClicked ? 25 : 18, 12 | fontWeight: isClicked ? FontWeight.bold : FontWeight.w200); 13 | } 14 | 15 | Widget filterTextWidget(String filterText) { 16 | return Padding( 17 | padding: const EdgeInsets.all(8.0), 18 | child: Container( 19 | decoration: BoxDecoration( 20 | color: Colors.white, 21 | borderRadius: BorderRadius.circular(12), 22 | ), 23 | child: Padding( 24 | padding: const EdgeInsets.all(16.0), 25 | child: Text( 26 | "Try: $filterText", 27 | style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15), 28 | ), 29 | ), 30 | ), 31 | ); 32 | } 33 | 34 | Container smallPositionedColored( 35 | {var color = Colors.green, @required String text}) { 36 | return Container( 37 | decoration: BoxDecoration( 38 | borderRadius: BorderRadius.circular(6), 39 | color: color, 40 | ), 41 | child: Padding( 42 | padding: 43 | const EdgeInsets.only(top: 6.0, bottom: 6, right: 12, left: 12), 44 | child: Text( 45 | text, 46 | style: TextStyle(color: Colors.white, fontWeight: FontWeight.bold), 47 | ), 48 | )); 49 | } 50 | 51 | List bxShadow = [ 52 | BoxShadow( 53 | color: Colors.grey.shade600, 54 | spreadRadius: 0.3, 55 | blurRadius: 8, 56 | offset: Offset(4, 4)), 57 | BoxShadow( 58 | color: Colors.white, 59 | spreadRadius: 0.5, 60 | blurRadius: 5, 61 | offset: Offset(-4, -4)), 62 | ]; 63 | buildSignUpLoginButton( 64 | {@required BuildContext context, 65 | @required String btnText, 66 | String assetImage, 67 | bool hasIcon = false, 68 | double fontSize = 20, 69 | Color color = Colors.white, 70 | double leftRightPadding = 20.0, 71 | textColor = Colors.black}) { 72 | return Padding( 73 | padding: const EdgeInsets.all(8), 74 | child: Container( 75 | width: MediaQuery.of(context).size.width * 0.9, 76 | // blur: 4, 77 | // shadowStrength: 8, 78 | // padding: EdgeInsets.all(8), 79 | // color: color, 80 | // intensity: 0.35, 81 | // style: NeuomorphicStyle.Concave, 82 | // borderRadius: BorderRadius.circular(20), 83 | child: hasIcon 84 | ? Row( 85 | children: [ 86 | Padding( 87 | padding: const EdgeInsets.only( 88 | left: 20, right: 20, top: 8, bottom: 8), 89 | child: SvgPicture.asset( 90 | assetImage, 91 | height: 25, 92 | ), 93 | ), 94 | Padding( 95 | padding: const EdgeInsets.all(8.0), 96 | child: Text( 97 | btnText, 98 | style: TextStyle( 99 | color: textColor, 100 | fontSize: fontSize, 101 | fontWeight: FontWeight.bold), 102 | ), 103 | ) 104 | ], 105 | ) 106 | : Center( 107 | child: Padding( 108 | padding: const EdgeInsets.all(8.0), 109 | child: Text( 110 | btnText, 111 | style: TextStyle( 112 | color: textColor, 113 | fontSize: 20, 114 | fontWeight: FontWeight.bold), 115 | ), 116 | ), 117 | ), 118 | ), 119 | ); 120 | } 121 | 122 | buildSignUpLoginText( 123 | {@required BuildContext context, 124 | @required String text1, 125 | @required String text2, 126 | @required bool moveToLogIn}) { 127 | return Container( 128 | color: Colors.transparent, 129 | child: Padding( 130 | padding: const EdgeInsets.all(8.0), 131 | child: Row( 132 | mainAxisAlignment: MainAxisAlignment.center, 133 | children: [ 134 | Text( 135 | text1, 136 | style: TextStyle( 137 | fontSize: 15.0, 138 | ), 139 | ), 140 | GestureDetector( 141 | onTap: () => Navigator.push( 142 | context, 143 | MaterialPageRoute( 144 | builder: (context) => 145 | moveToLogIn ? LoginPage() : OnBoardingPage())), 146 | child: Text( 147 | text2, 148 | style: TextStyle( 149 | fontWeight: FontWeight.bold, 150 | fontSize: 18.0, 151 | fontStyle: FontStyle.italic), 152 | ), 153 | ), 154 | ], 155 | ) 156 | // RichText( 157 | // text: TextSpan( 158 | // text: "Already have an account? ", 159 | // style: TextStyle(fontSize: 15.0, color: Colors.black), 160 | // children: [ 161 | // TextSpan( 162 | // text: 'Log In', 163 | // style: TextStyle( 164 | // fontWeight: FontWeight.bold, 165 | // fontSize: 18.0, 166 | // fontStyle: FontStyle.italic),recognizer: _gestureRecognizer 167 | // ), 168 | // ]), 169 | // ), 170 | ), 171 | ); 172 | } 173 | -------------------------------------------------------------------------------- /lib/screens/announcements/announcements.dart: -------------------------------------------------------------------------------- 1 | import 'package:cached_network_image/cached_network_image.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:get/get.dart'; 4 | import 'package:windsor_essex_muslim_care/Database/database.dart'; 5 | import 'package:windsor_essex_muslim_care/config/collection_names.dart'; 6 | import 'package:windsor_essex_muslim_care/constants.dart'; 7 | import 'package:windsor_essex_muslim_care/models/announcementsModel.dart'; 8 | import 'package:windsor_essex_muslim_care/screens/announcements/addAnnouncements.dart'; 9 | import 'package:windsor_essex_muslim_care/screens/landingPage.dart'; 10 | import 'package:windsor_essex_muslim_care/tools/loading.dart'; 11 | 12 | class Announcements extends StatefulWidget { 13 | @override 14 | _AnnouncementsState createState() => _AnnouncementsState(); 15 | } 16 | 17 | class _AnnouncementsState extends State { 18 | List allAnnouncements = []; 19 | bool _isLoading = false; 20 | @override 21 | void initState() { 22 | super.initState(); 23 | getAnnouncements(); 24 | } 25 | 26 | getAnnouncements() async { 27 | setState(() { 28 | _isLoading = true; 29 | this.allAnnouncements = []; 30 | }); 31 | List allAnnouncements = 32 | await DatabaseMethods().getAnnouncements(); 33 | setState(() { 34 | this.allAnnouncements = allAnnouncements; 35 | _isLoading = false; 36 | }); 37 | } 38 | 39 | @override 40 | Widget build(BuildContext context) { 41 | return Container( 42 | decoration: backgroundColorBoxDecorationLogo(), 43 | child: Scaffold( 44 | floatingActionButton: isAdmin 45 | ? FloatingActionButton( 46 | onPressed: () => Get.to(() => AddAnnouncements()) 47 | .then((value) => getAnnouncements()), 48 | child: Icon(Icons.add), 49 | tooltip: "Add New Announcement", 50 | ) 51 | : Container(), 52 | body: ListView( 53 | shrinkWrap: true, 54 | physics: BouncingScrollPhysics(), 55 | children: [ 56 | Center( 57 | child: Text( 58 | "WEMC Updates", 59 | style: titleTextStyle(), 60 | ), 61 | ), 62 | ListView.builder( 63 | shrinkWrap: true, 64 | physics: NeverScrollableScrollPhysics(), 65 | itemBuilder: (context, index) { 66 | return Padding( 67 | padding: const EdgeInsets.all(12.0), 68 | child: GestureDetector( 69 | onLongPress: () { 70 | return isAdmin 71 | ? deleteNotification( 72 | context, allAnnouncements[index].announcementId) 73 | : null; 74 | }, 75 | child: _isLoading 76 | ? LoadingIndicator() 77 | : Container( 78 | // blur: 4, 79 | // shadowStrength: 16, 80 | child: Padding( 81 | padding: const EdgeInsets.all(16.0), 82 | child: Column( 83 | crossAxisAlignment: 84 | allAnnouncements[index].imageUrl != null 85 | ? CrossAxisAlignment.center 86 | : CrossAxisAlignment.start, 87 | children: [ 88 | allAnnouncements[index].imageUrl != null 89 | ? CachedNetworkImage( 90 | imageUrl: 91 | allAnnouncements[index].imageUrl) 92 | : Container(), 93 | Text( 94 | allAnnouncements[index].announcementTitle, 95 | style: customTextStyle(), 96 | ), 97 | Text( 98 | allAnnouncements[index].description, 99 | style: customTextStyle(fontSize: 18), 100 | ), 101 | ], 102 | ), 103 | ), 104 | ), 105 | ), 106 | ); 107 | }, 108 | itemCount: allAnnouncements.length, 109 | ), 110 | ], 111 | ), 112 | ), 113 | ); 114 | } 115 | 116 | deleteNotification(BuildContext parentContext, String id) { 117 | return showDialog( 118 | context: parentContext, 119 | builder: (context) { 120 | return SimpleDialog( 121 | children: [ 122 | SimpleDialogOption( 123 | onPressed: () { 124 | allUsersList.forEach((e) { 125 | announcementsRef 126 | .doc(e.userId) 127 | .collection("userAnnouncements") 128 | .doc(id) 129 | .delete(); 130 | }); 131 | getAnnouncements(); 132 | Navigator.pop(context); 133 | }, 134 | child: Text( 135 | 'Delete Announcement', 136 | ), 137 | ), 138 | SimpleDialogOption( 139 | onPressed: () => Navigator.pop(context), 140 | child: Text('Cancel'), 141 | ) 142 | ], 143 | ); 144 | }); 145 | } 146 | } 147 | -------------------------------------------------------------------------------- /lib/screens/credentials/loginRelated/forgetPasswordPage.dart: -------------------------------------------------------------------------------- 1 | import 'package:bot_toast/bot_toast.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:get/get.dart'; 4 | import 'package:windsor_essex_muslim_care/commonUIFunctions.dart'; 5 | import 'package:windsor_essex_muslim_care/constants.dart'; 6 | import 'package:windsor_essex_muslim_care/services/authentication_service.dart'; 7 | import 'package:windsor_essex_muslim_care/tools/loading.dart'; 8 | 9 | class ForgetPasswordPage extends StatefulWidget { 10 | @override 11 | _ForgetPasswordPageState createState() => _ForgetPasswordPageState(); 12 | } 13 | 14 | class _ForgetPasswordPageState extends State { 15 | TextEditingController _emailController = TextEditingController(); 16 | final _textFormKey = GlobalKey(); 17 | 18 | bool _isLoading = false; 19 | 20 | @override 21 | Widget build(BuildContext context) { 22 | return SafeArea( 23 | child: Container( 24 | decoration: backgroundColorBoxDecoration(), 25 | child: Scaffold( 26 | body: SingleChildScrollView( 27 | child: Stack( 28 | children: [ 29 | Column( 30 | children: [ 31 | Padding( 32 | padding: const EdgeInsets.all(20.0), 33 | child: Hero( 34 | tag: "logo", 35 | child: Image.asset( 36 | logo, 37 | height: 90, 38 | )), 39 | ), 40 | Center( 41 | child: Padding( 42 | padding: const EdgeInsets.all(8.0), 43 | child: Image.asset( 44 | forgetPassPageIcon, 45 | height: 60, 46 | ), 47 | ), 48 | ), 49 | SizedBox( 50 | height: 20, 51 | ), 52 | Padding( 53 | padding: const EdgeInsets.all(8.0), 54 | child: Hero( 55 | tag: "passFor", 56 | child: Text( 57 | "Forgot Password?", 58 | style: TextStyle( 59 | fontWeight: FontWeight.bold, 60 | fontSize: 20, 61 | ), 62 | ), 63 | ), 64 | ), 65 | Form( 66 | key: _textFormKey, 67 | child: Padding( 68 | padding: const EdgeInsets.all(12.0), 69 | child: Container( 70 | 71 | child: TextFormField( 72 | controller: _emailController, 73 | keyboardType: TextInputType.text, 74 | validator: (String val) { 75 | if (val == null) { 76 | return null; 77 | } 78 | if (val.isEmpty) { 79 | return "Field is Empty"; 80 | } else if (!val.contains("@") || 81 | val.trim().length < 4) { 82 | return "Invalid E-mail!"; 83 | } else { 84 | return null; 85 | } 86 | }, 87 | // onSaved: (val) => phoneNo = val, 88 | autofocus: true, 89 | decoration: InputDecoration( 90 | border: InputBorder.none, 91 | filled: true, 92 | labelText: "E-mail", 93 | labelStyle: TextStyle(fontSize: 15.0), 94 | hintText: "Please enter your valid E-mail", 95 | ), 96 | ), 97 | ), 98 | ), 99 | ), 100 | SizedBox( 101 | height: 10, 102 | ), 103 | GestureDetector( 104 | onTap: () => handleForgetPass(), 105 | child: buildSignUpLoginButton( 106 | context: context, 107 | btnText: "Continue", 108 | hasIcon: false, 109 | textColor: Colors.white, 110 | color: Color(0xff387A53)), 111 | ), 112 | ], 113 | ), 114 | _isLoading ? LoadingIndicator() : Container(), 115 | ], 116 | ), 117 | ), 118 | bottomSheet: buildSignUpLoginText( 119 | context: context, 120 | text1: "Don't have an account ", 121 | text2: "Sign Up", 122 | moveToLogIn: false), 123 | ), 124 | ), 125 | ); 126 | } 127 | 128 | getPass({ 129 | @required String email, 130 | }) async {} 131 | 132 | handleForgetPass() async { 133 | final FormState _form = _textFormKey.currentState; 134 | 135 | if (_form == null) { 136 | return null; 137 | } 138 | if (_form.validate()) { 139 | setState(() { 140 | _isLoading = true; 141 | }); 142 | AuthenticationService() 143 | .forgetPassword(email: _emailController.text) 144 | .then((value) { 145 | BotToast.showText( 146 | text: 147 | "Email for password recovery as been sent to\n ${_emailController.text}", 148 | onClose: () => Get.back()); 149 | return null; 150 | }); 151 | } 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /lib/screens/onBardingPage.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:get/get.dart'; 3 | import 'package:introduction_screen/introduction_screen.dart'; 4 | 5 | import 'package:liquid_swipe/liquid_swipe.dart'; 6 | import 'package:windsor_essex_muslim_care/constants.dart'; 7 | import 'package:windsor_essex_muslim_care/screens/credentials/signUpRelated/emailSignUp.dart'; 8 | 9 | class OnBoardingPage extends StatefulWidget { 10 | @override 11 | _OnBoardingPageState createState() => _OnBoardingPageState(); 12 | } 13 | 14 | class _OnBoardingPageState extends State { 15 | LiquidController liquidController; 16 | @override 17 | void initState() { 18 | super.initState(); 19 | liquidController = LiquidController(); 20 | } 21 | 22 | @override 23 | Widget build(BuildContext context) { 24 | return Container( 25 | decoration: backgroundColorBoxDecoration(), 26 | child: Scaffold( 27 | body: Stack( 28 | children: [ 29 | LiquidSwipe( 30 | pages: pages, 31 | liquidController: liquidController, 32 | ), 33 | Positioned( 34 | bottom: 20, 35 | left: 40, 36 | child: ElevatedButton.icon( 37 | onPressed: () { 38 | Get.off(() => EmailSignUp(isSocial: false, isEdit: false)); 39 | }, 40 | icon: Icon(Icons.skip_next_rounded), 41 | label: Text("Skip")), 42 | ), 43 | Positioned( 44 | bottom: 20, 45 | right: 40, 46 | child: ElevatedButton.icon( 47 | onPressed: () { 48 | if (liquidController.currentPage < 9) { 49 | liquidController.animateToPage( 50 | page: liquidController.currentPage + 1); 51 | } else { 52 | Get.off( 53 | () => EmailSignUp(isSocial: false, isEdit: false)); 54 | } 55 | }, 56 | icon: Icon(Icons.next_plan_rounded), 57 | label: Text("Next")), 58 | ), 59 | ], 60 | ), 61 | ), 62 | ); 63 | 64 | // Container( 65 | // decoration: backgroundColorBoxDecoration(), 66 | // child: Scaffold( 67 | // body: IntroductionScreen( 68 | // pages: listPagesViewModel, 69 | // color: Colors.white, 70 | // onDone: () { 71 | // Get.off(() => EmailSignUp(isSocial: false, isEdit: false)); 72 | // }, 73 | // onSkip: () { 74 | // Get.off(() => EmailSignUp(isSocial: false, isEdit: false)); 75 | // }, 76 | // showSkipButton: true, 77 | // skip: Row( 78 | // children: [ 79 | // const Icon(Icons.skip_next), 80 | // const Text(" Skip"), 81 | // ], 82 | // ), 83 | // next: Row( 84 | // children: [ 85 | // const Icon(Icons.next_plan_outlined), 86 | // const Text(" Next"), 87 | // ], 88 | // ), 89 | // done: 90 | // const Text("Done", style: TextStyle(fontWeight: FontWeight.w600)), 91 | // dotsDecorator: DotsDecorator( 92 | // size: const Size.square(3.0), 93 | // activeSize: const Size(6.0, 3.0), 94 | // activeColor: Theme.of(context).accentColor, 95 | // color: Colors.black26, 96 | // spacing: const EdgeInsets.symmetric(horizontal: 3.0), 97 | // activeShape: RoundedRectangleBorder( 98 | // borderRadius: BorderRadius.circular(25.0))), 99 | // ), 100 | // ), 101 | // ); 102 | } 103 | } 104 | 105 | final pages = [ 106 | presentationImages("1"), 107 | presentationImages("2"), 108 | presentationImages("3"), 109 | presentationImages("4"), 110 | presentationImages("5"), 111 | presentationImages("6"), 112 | presentationImages("7"), 113 | presentationImages("8"), 114 | presentationImages("9"), 115 | presentationImages("10"), 116 | ]; 117 | 118 | Container presentationImages(String count) { 119 | return Container( 120 | decoration: BoxDecoration( 121 | image: DecorationImage( 122 | image: AssetImage("assets/introPics/$count.png"), 123 | ), 124 | ), 125 | ); 126 | } 127 | 128 | final listPagesViewModel = [ 129 | PageViewModel( 130 | image: Image.asset( 131 | "assets/introPics/1.png", 132 | fit: BoxFit.fitWidth, 133 | ), 134 | body: "", 135 | title: "1", 136 | ), 137 | PageViewModel( 138 | image: Image.asset( 139 | "assets/introPics/2.png", 140 | fit: BoxFit.fitWidth, 141 | ), 142 | body: "", 143 | title: "2", 144 | ), 145 | PageViewModel( 146 | image: Image.asset( 147 | "assets/introPics/3.png", 148 | fit: BoxFit.fitWidth, 149 | ), 150 | body: "", 151 | title: "3", 152 | ), 153 | PageViewModel( 154 | image: Image.asset( 155 | "assets/introPics/4.png", 156 | fit: BoxFit.fitWidth, 157 | ), 158 | body: "", 159 | title: "4", 160 | ), 161 | PageViewModel( 162 | image: Image.asset( 163 | "assets/introPics/5.png", 164 | fit: BoxFit.fitWidth, 165 | ), 166 | body: "", 167 | title: "5", 168 | ), 169 | PageViewModel( 170 | image: Image.asset( 171 | "assets/introPics/6.png", 172 | fit: BoxFit.fitWidth, 173 | ), 174 | body: "", 175 | title: "6", 176 | ), 177 | PageViewModel( 178 | image: Image.asset( 179 | "assets/introPics/7.png", 180 | fit: BoxFit.fitWidth, 181 | ), 182 | body: "", 183 | title: "7", 184 | ), 185 | PageViewModel( 186 | image: Image.asset( 187 | "assets/introPics/8.png", 188 | fit: BoxFit.fitWidth, 189 | ), 190 | body: "", 191 | title: "8", 192 | ), 193 | PageViewModel( 194 | image: Image.asset( 195 | "assets/introPics/9.png", 196 | fit: BoxFit.fitWidth, 197 | ), 198 | body: "", 199 | title: "9", 200 | ), 201 | PageViewModel( 202 | image: Image.asset( 203 | "assets/introPics/10.png", 204 | fit: BoxFit.fitWidth, 205 | ), 206 | body: "", 207 | title: "10", 208 | ), 209 | PageViewModel( 210 | image: Image.asset( 211 | "assets/introPics/11.png", 212 | fit: BoxFit.fitWidth, 213 | ), 214 | body: "", 215 | title: "11", 216 | ), 217 | PageViewModel( 218 | image: Image.asset( 219 | "assets/introPics/12.png", 220 | fit: BoxFit.fitWidth, 221 | ), 222 | body: "", 223 | title: "12", 224 | ), 225 | ]; 226 | -------------------------------------------------------------------------------- /lib/screens/prayerTimings.dart: -------------------------------------------------------------------------------- 1 | import 'package:animations/animations.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:adhan/adhan.dart'; 4 | import 'package:intl/intl.dart'; 5 | import 'package:location/location.dart'; 6 | import 'package:lottie/lottie.dart'; 7 | import 'package:neuomorphic_container/neuomorphic_container.dart'; 8 | import 'package:windsor_essex_muslim_care/constants.dart'; 9 | import 'package:url_launcher/url_launcher.dart'; 10 | import 'package:windsor_essex_muslim_care/screens/mosquesList.dart'; 11 | 12 | class PrayersTimings extends StatefulWidget { 13 | @override 14 | _PrayersTimingsState createState() => _PrayersTimingsState(); 15 | } 16 | 17 | class _PrayersTimingsState extends State { 18 | void _incrementCounter() { 19 | setState(() {}); 20 | } 21 | 22 | void launchURL(_url) async => await canLaunch(_url) 23 | ? await launch( 24 | _url, 25 | ) 26 | : throw 'Could not launch $_url'; 27 | final _url = 'http://www.windsorislamicassociation.com/'; 28 | 29 | final location = new Location(); 30 | String locationError; 31 | PrayerTimes prayerTimes; 32 | 33 | @override 34 | void initState() { 35 | getLocationData().then((locationData) { 36 | if (!mounted) { 37 | return; 38 | } 39 | if (locationData != null) { 40 | setState(() { 41 | prayerTimes = PrayerTimes( 42 | Coordinates(locationData.latitude, locationData.longitude), 43 | DateComponents.from(DateTime.now()), 44 | CalculationMethod.north_america.getParameters()); 45 | }); 46 | } else { 47 | setState(() { 48 | locationError = "Couldn't Get Your Location!"; 49 | }); 50 | } 51 | }); 52 | 53 | super.initState(); 54 | } 55 | 56 | Future getLocationData() async { 57 | var _serviceEnabled = await location.serviceEnabled(); 58 | if (!_serviceEnabled) { 59 | _serviceEnabled = await location.requestService(); 60 | if (!_serviceEnabled) { 61 | return null; 62 | } 63 | } 64 | 65 | var _permissionGranted = await location.hasPermission(); 66 | if (_permissionGranted == PermissionStatus.denied) { 67 | _permissionGranted = await location.requestPermission(); 68 | if (_permissionGranted != PermissionStatus.granted) { 69 | return null; 70 | } 71 | } 72 | return await location.getLocation(); 73 | } 74 | 75 | @override 76 | Widget build(BuildContext context) { 77 | return SafeArea( 78 | child: Container( 79 | decoration: backgroundColorBoxDecoration(), 80 | child: Scaffold( 81 | backgroundColor: Colors.transparent, 82 | body: SingleChildScrollView( 83 | child: Builder( 84 | builder: (BuildContext context) { 85 | if (prayerTimes != null) { 86 | return Column( 87 | children: [ 88 | Image.asset( 89 | prayerPagePicture, 90 | fit: BoxFit.fitWidth, 91 | colorBlendMode: BlendMode.srcOver, 92 | ), 93 | Column( 94 | children: [ 95 | Padding( 96 | padding: const EdgeInsets.all(8.0), 97 | child: Text( 98 | 'Prayer Timings for Today', 99 | style: TextStyle( 100 | fontSize: 26, fontWeight: FontWeight.bold), 101 | textAlign: TextAlign.center, 102 | ), 103 | ), 104 | prayerTimingsContainer( 105 | prayTime: prayerTimes.fajr, 106 | prayerName: "Fajr Time"), 107 | prayerTimingsContainer( 108 | prayTime: prayerTimes.sunrise, 109 | prayerName: "Sunrise Time"), 110 | prayerTimingsContainer( 111 | prayTime: prayerTimes.dhuhr, 112 | prayerName: "Dhuhr Time"), 113 | prayerTimingsContainer( 114 | prayTime: prayerTimes.asr, 115 | prayerName: "Asr Time"), 116 | prayerTimingsContainer( 117 | prayTime: prayerTimes.maghrib, 118 | prayerName: "Maghrib Time"), 119 | prayerTimingsContainer( 120 | prayTime: prayerTimes.isha, 121 | prayerName: "Isha Time"), 122 | OpenContainer( 123 | //closedColor: Colors.transparent, 124 | //closedElevation: 0, 125 | closedBuilder: 126 | (BuildContext context, void Function() action) { 127 | return NeuomorphicContainer( 128 | color: containerColor, 129 | style: NeuomorphicStyle.Convex, 130 | width: 200, 131 | intensity: 0.6, 132 | child: Padding( 133 | padding: const EdgeInsets.all(4.0), 134 | child: Row( 135 | mainAxisAlignment: MainAxisAlignment.center, 136 | children: [ 137 | Hero( 138 | tag: "mosqueIcon", 139 | child: Lottie.asset(mosqueGumbatLottie, 140 | height: 80), 141 | ), 142 | Hero( 143 | tag: "mosque_timings", 144 | child: Text( 145 | "Local Mosque's\nPrayer Timings")), 146 | ], 147 | ), 148 | ), 149 | ); 150 | }, 151 | openBuilder: (BuildContext context, 152 | void Function({Object returnValue}) action) { 153 | return MosquesPrayerTimings(); 154 | }, 155 | ), 156 | ], 157 | ), 158 | ], 159 | ); 160 | } 161 | if (locationError != null) { 162 | return Text(locationError); 163 | } 164 | return Center(child: Text('Waiting for Your Location...')); 165 | }, 166 | ), 167 | ), 168 | ), 169 | ), 170 | ); 171 | // This trailing comma makes auto-formatting nicer for build methods. 172 | } 173 | 174 | Widget prayerTimingsContainer({String prayerName, DateTime prayTime}) { 175 | var asd = prayerTimes.nextPrayerByDateTime(prayTime); 176 | bool isNext = false; 177 | var nextPrayer = prayerTimes.nextPrayerByDateTime(DateTime.now()); 178 | if (asd == nextPrayer) isNext = true; 179 | return Container( 180 | color: isNext ? Color(0xff467D89) : Colors.transparent, 181 | child: Padding( 182 | padding: const EdgeInsets.all(8.0), 183 | child: Center( 184 | child: Padding( 185 | padding: const EdgeInsets.all(8.0), 186 | child: Row( 187 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 188 | children: [ 189 | Text( 190 | '$prayerName ', 191 | style: TextStyle( 192 | fontSize: 24, 193 | color: isNext ? Colors.white : Colors.black, 194 | ), 195 | ), 196 | Text( 197 | DateFormat.jm().format(prayTime), 198 | style: TextStyle( 199 | fontSize: 24, 200 | color: isNext ? Colors.white : Colors.black, 201 | ), 202 | ), 203 | ], 204 | ), 205 | ), 206 | ), 207 | ), 208 | ); 209 | } 210 | } 211 | --------------------------------------------------------------------------------