From 384d69f9a7ba806c73539a3d94e05866a0c3ec68 Mon Sep 17 00:00:00 2001 From: Sumitra Saksham <35868598+sumitra19jha@users.noreply.github.com> Date: Tue, 29 Jun 2021 07:08:03 +0530 Subject: [PATCH] GSoC-Develop Merge (#904) * Added mdoel to the locator and debugging * Flutter Format * Fixing travis tests * Add FutureBuilder Logic To Main.dart * logic correction * setted MVVM structure * Attached viewModel * reduced lines * refactored and completed local device test. * updated tests * Add news_article+page_view_model.dart * Implements the ViewModel * ptch: Updated the Test * ptch: flutter linting * logic correction * minor error fixing after merge conflict * minor error fixing after merge conflict * minor error fixing after merge conflict * Flutter format * Fixing errors * Updated Tests * ptch: Adding Comment Bug Fix * ptch: flutter linitng * ptch: test update * Fixed code formatting * bfix: fixes comment count not updating on newsfeed * ptch: Change in Loader * ptch: Change in Loader * ptch: added default parameter in Loader * logic correction * upstream fetch * Flutter format . * conflict * Url controller * url page controller addn * controller registration * Unused files removal * Adding test * conflict resoved * fixing tests * Fixed errors * Flutter format . * Flutter Format * Merge remote-tracking branch 'upstream/master' into newPagination * flutter format . * flutter format * flutter format . * Fixes #793 * flutter format . * fixed changes * flutter format * Merge remote-tracking branch 'upstream/master' into provider-add * flutter format . * fixed formatting * Fixed formatting * Merge remote-tracking branch 'upstream/master' into provider-add * Merge remote-tracking branch 'upstream/master' into provider-add * Fixed travis build fail * chore: fixes linting issue * events update * ptch: Flutter lint * ptch: Replace the Column with Listview in Loader.dart * controlller add * flutter format . * Image Handler * Image Ui and Controller Connection * Test Updates * uniformisation * Code style prttification * app localization and language controller addition * language * logic correction with generalised approach rather than specific case-wise approach * change of a minor error in pull-request.yml * addition of justified docstrings and methodogy * correction of a specific case in group_controller.dart's formatting * increasing the legibility of the code * removed usused import from post_cotroller.dart for resubmitting for the build * Fix : Not able to close pop up in Join Organization Screen #815 Bug was caused due to Page context was used in close button instated new context of builder. Fix: Refactor : ctx -> dialogContext Change : context -> dialogContext (line 142) * undoing the change in pubspec.yaml for travis CI build * Splash Screen Added * travis ci fix * fix * http ^0.12.0+4 * fix * dependency overide * dependency overide * dependency change * compatible packages * adding crypto 2.1.3 * crypto: 3.0.1 * To rerun travis ci * Done : code formatting * Red screen error resolved from the update profile page(Issue #824) * [Fix] RenderFlex overflow in Member details Screen * Merge branch 'functionality-to-crop-picture' of https://github.com/afaanshariff/talawa into functionality-to-crop-picture * resolved merge conflicts * resolved exceptions in image_service.dart * resolved exceptions in image_service.dart * Organisation setting bug fix - Fixes bug #833 - Code reformatting of profile_page_viewModel.dart and profile_page.dart * Updated CONTRIBUTING.md with new Branching Strategy * Removed gitflow from CONTRIBUTING.md * Fixed typo in CONTRIBUTING.md * User will not able to delete others event fix #832 * Simplification of LeaveOrg and OrgSetting Button * Using snake case in file names - Flutter SDK was showing Warning as the Camel case was used in the file names so the file was renamed as snake case. * Organisations directory file size reduction - dart file size reduction (under 300 lines) of files under "lib/views/pages/organization" directory - Code refactored and reformatted * Users can't see an option to delete if they are not allowed * Fixes #840 * Fixes #840 * Minor change : Ternary operators removed * event_dialog file size reduction - Widgets common between add_event_dialog.dart and edit_event_dialog.dart have been separated into file event_widgets.dart - Data is passed as parameter - Register form also reformatted * Organization names are displayed in sorted order. * File size reduction set_url_page.dart * Reformatted - Reformatted with flutter format - URL Page Animation extracted and moved to other file * Update register_form_test.dart * Added linting,actions and other repo related files * Preauth screens with applogo native,flutter splash screens * Fonts added - refactor * Add HomePage * Add widget test for homepage * update line limit to 400 in countline.py * HomePage starter UI * Updated the tests * Updated GitHub workflow to exclude 'lib/custom_painters/talawa_logo.dart'. Fixes #856 * Updated GitHub workflow to exclude 'lib/custom_painters/talawa_logo.dart'. Fixes #856 * Updated GitHub workflow to exclude 'lib/custom_painters/talawa_logo.dart'. Fixes #856 * Add themeclass for light and dark theme * Refractor textstyles * Delete textstyles.dart * Update pull_request_template.md * [GSoC] - Code re-write and migration (#863) * Validators,Plugins,File structuring,Test fail fix and joinorg,waiting pages * Updated the workflow for minimum coverage, will we reverted back soon * [Gsoc ] Added UI and implemented MVVM started on OrganizationFeedPage (#864) * Added CustomCarousel * Added models * Removing linting problems * Fixed errors except sort dependency * Completed - demo data and models implemented MVVM * Removed problems * [GSoC] Deeplinking in application for invitation links, renaming according to lint (#866) * Validators,Plugins,File structuring,Test fail fix and joinorg,waiting pages * Updated the workflow for minimum coverage, will we reverted back soon * Deeplinking for invitation links completed * [Gsoc] Added Individual Post Page , Pinned post Page (#867) * Added CustomCarousel * Added models * Removing linting problems * Fixed errors except sort dependency * Completed - demo data and models implemented MVVM * Removed problems * Finished Pinned Post Page and Individual Post Page * [GSoC] - Pre-auth view_models and model implementation, refactor needed (#868) * Validators,Plugins,File structuring,Test fail fix and joinorg,waiting pages * Updated the workflow for minimum coverage, will we reverted back soon * Deeplinking for invitation links completed * Pre-auth view_models and model implementation, refactor needed * [GSoC] Added UI with basic implementation of MVVM started for Explore Events Screen (#870) * add explore events page with mvvm * modify tests * add eventInfo Page and createEvent Page (#874) * [GSoC] - Pre-auth new navigation flow completion with server linking (#878) * Validators,Plugins,File structuring,Test fail fix and joinorg,waiting pages * Updated the workflow for minimum coverage, will we reverted back soon * Deeplinking for invitation links completed * Pre-auth view_models and model implementation, refactor needed * Minor route fixes * [GSoC] - Test Fix, invite link deprecation fix (#880) * Model refactoring and invite link fix * # This is a combination of 2 commits. # This is the 1st commit message: fix test failure # This is the commit message #2: Added flutter analyser * [GSoC] homeview UI refractoring and adding drawer UI (#881) * fixed generated plugin error * Refactored UI for dark mode * Added drawer UI * Added Drawer UI * [GSoC] Created "Add post page" UI (#884) * fixed generated plugin error * Created Add Post Page UI * Updated Home page test * [GSoC] - Organisation Switching from drawer (#885) * Added flutter analyzer * Switiching org from drawer and minor bug fixes * Added test for splash screen * [GSoC] Add Profile and Edit Profile screens with MVVM (#886) * add profile and edit profile screen * delete home_page.dart and fix profile textfield * [GSoC] - Update the UserConfig to get realtime updates (#887) * fixed generated plugin error * Used subscriptions to get realtime UI updates. * Updated tests * Refactored to work with stream data (#888) * fixed generated plugin error * Used subscriptions to get realtime UI updates. * Updated tests * refactored to work with the stream data * Fixed travis build error * Analyzer fixes * [GSoC] - Refactoring, common alert popup & test (#889) * Refactoring, common alert popup & test' * talawa analysis point increment * [GSoC] - Connected Post Service with backend and switch organization service (#890) * fixed generated plugin error * Used subscriptions to get realtime UI updates. * Updated tests * refactored to work with the stream data * Fixed travis build error * Analyzer fixes * Inital code for post service * Added Stream setup for posts * Integrated post service and preserved page state * Fixing the analyzer * Tests updates * Refactoring and join org page after auth (#891) * [GSoC] - Mockito testing setup with the services || Service Stream Refactoring (#893) * fixed generated plugin error * Used subscriptions to get realtime UI updates. * Updated tests * refactored to work with the stream data * Fixed travis build error * Analyzer fixes * Inital code for post service * Added Stream setup for posts * Integrated post service and preserved page state * Fixing the analyzer * Tests updates * Refactored Services & added Local cache "LIKE" fun * Finished mocking the services using Mockito * Fixing the travis build failure * [GSoC] Connect explore events and create events with the backend (#894) * connect explore events with backend * add create event functionality * Fix failing tests * [GSoC] - Refactoring in functions class, use of global model for post (#895) * Refactoring in functions class, use of global model for post * Merge conflicts fix * [GSoC] Add validation for create_event_form.dart and refractor. (#896) * fix events not displaying issue * Remove unused imports * Updated connectivity_plus plugin (#899) * GSoC - Adding / Removing || Adding comment (#903) * fixed generated plugin error * Added like functionality * Added Removing like feature * Added comment feature without single source truth * Added comment features and Updated test. Co-authored-by: rutvik11062000 * GSoC branch lang controller addition (#897) * language controller and befor auth language addition * Pubspec update * test changes * test updates * Updates * test updated * language updates * selection test case updated * Final Updates * viewmodel update * Test file updates * Flutter code analyze update Co-authored-by: rutvik11062000 Co-authored-by: Shreyash Lata Co-authored-by: Astha Nayak Co-authored-by: StrangeNoob Co-authored-by: raunak_k02 Co-authored-by: Sagar Utekar Co-authored-by: Peter Harrison Co-authored-by: afaanshariff Co-authored-by: AFFAN SHARIFF <57586853+afaanshariff@users.noreply.github.com> Co-authored-by: ahluwaliatikant Co-authored-by: Aditya Birangal Co-authored-by: Muskan Modi <500068213@stu.upes.ac.in> Co-authored-by: Muskan Modi <63671368+muskan399@users.noreply.github.com> Co-authored-by: Troy Anderson <33005486+TheHazeEffect@users.noreply.github.com> Co-authored-by: Aman Anand Co-authored-by: DangaRanga Co-authored-by: Piyush Goel Co-authored-by: CyberWake Co-authored-by: Utkarsh S Co-authored-by: Rutvik Chandla <47498552+rutvik11062000@users.noreply.github.com> Co-authored-by: CyberWake <44184786+CyberWake@users.noreply.github.com> Co-authored-by: rutvik11062000 --- .github/FUNDING.yml | 12 + .github/ISSUE_TEMPLATE/bug_report.md | 29 + .github/ISSUE_TEMPLATE/feature_request.md | 22 + .github/PR_TEMPLATE/pr-template.md | 8 + .github/pull_request_template.md | 51 ++ .github/workflows/README.md | 22 + .github/workflows/countline.py | 169 +++++ .github/workflows/issues.yml | 23 + .github/workflows/pull-request.yml | 81 +++ .github/workflows/push.yaml | 81 +++ .github/workflows/trailing_commas.py | 111 +++ .gitignore | 191 +++++ .readthedocs.yml | 22 + .travis.yml | 39 + CODE_OF_CONDUCT.md | 133 ++++ CONTRIBUTING.md | 189 +++++ LICENSE | 674 ++++++++++++++++++ PR-guidelines.md | 21 + README.md | 63 ++ analysis_options.yaml | 46 ++ android/.gitignore | 11 + android/app/build.gradle | 59 ++ android/app/src/debug/AndroidManifest.xml | 9 + android/app/src/main/AndroidManifest.xml | 53 ++ .../kotlin/com/example/talawa/MainActivity.kt | 6 + .../res/drawable-night/launch_background.xml | 9 + .../main/res/drawable-night/launch_image.png | Bin 0 -> 6438 bytes .../res/drawable-night/launcher_image.xml | 18 + .../main/res/drawable/launch_background.xml | 10 + .../src/main/res/drawable/launch_image.png | Bin 0 -> 6438 bytes .../src/main/res/drawable/launcher_image.xml | 18 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 2891 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1832 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 3883 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 5998 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 8266 bytes android/app/src/main/res/values/colors.xml | 4 + android/app/src/main/res/values/styles.xml | 18 + android/build.gradle | 29 + android/gradle.properties | 4 + .../gradle/wrapper/gradle-wrapper.properties | 6 + android/settings.gradle | 11 + assets/fonts/OpenSans-Bold.ttf | Bin 0 -> 104120 bytes assets/fonts/OpenSans-Regular.ttf | Bin 0 -> 96932 bytes assets/fonts/OpenSans-SemiBold.ttf | Bin 0 -> 100820 bytes assets/fonts/ProductSans-Bold.ttf | Bin 0 -> 92096 bytes assets/fonts/ProductSans-Medium.ttf | Bin 0 -> 92312 bytes assets/fonts/ProductSans-Regular.ttf | Bin 0 -> 109128 bytes assets/images/launcher_icon.png | Bin 0 -> 6438 bytes assets/images/no_internet.png | Bin 0 -> 96758 bytes docs/conf.py | 169 +++++ ios/.gitignore | 33 + ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 1 + ios/Flutter/Release.xcconfig | 1 + ios/Runner.xcodeproj/project.pbxproj | 471 ++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../AppIcon.appiconset/1024.png | Bin 0 -> 90654 bytes .../AppIcon.appiconset/114.png | Bin 0 -> 4603 bytes .../AppIcon.appiconset/120.png | Bin 0 -> 4845 bytes .../AppIcon.appiconset/180.png | Bin 0 -> 7575 bytes .../Assets.xcassets/AppIcon.appiconset/29.png | Bin 0 -> 1047 bytes .../Assets.xcassets/AppIcon.appiconset/40.png | Bin 0 -> 1504 bytes .../Assets.xcassets/AppIcon.appiconset/57.png | Bin 0 -> 2220 bytes .../Assets.xcassets/AppIcon.appiconset/58.png | Bin 0 -> 2284 bytes .../Assets.xcassets/AppIcon.appiconset/60.png | Bin 0 -> 2372 bytes .../Assets.xcassets/AppIcon.appiconset/80.png | Bin 0 -> 3208 bytes .../Assets.xcassets/AppIcon.appiconset/87.png | Bin 0 -> 3575 bytes .../AppIcon.appiconset/Contents.json | 1 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 564 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 1588 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 1025 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 1716 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 1920 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 1283 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 1895 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 2665 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 3831 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 1888 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 3294 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 3612 bytes .../LaunchBackground.imageset/Contents.json | 21 + .../LaunchBackground.imageset/background.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes ios/Runner/Base.lproj/LaunchScreen.storyboard | 44 ++ ios/Runner/Info.plist | 47 ++ ios/Runner/Runner-Bridging-Header.h | 1 + issue-guidelines.md | 15 + lang/en.json | 156 ++++ lang/es.json | 151 ++++ lang/fr.json | 155 ++++ lang/hi.json | 151 ++++ lang/zh.json | 151 ++++ lib/constants/constants.dart | 34 + lib/constants/custom_theme.dart | 129 ++++ lib/constants/routing_constants.dart | 25 + lib/custom_painters/language_icon.dart | 271 +++++++ lib/custom_painters/talawa_logo.dart | 379 ++++++++++ lib/demo_server_data/events_demo_data.dart | 193 +++++ .../pinned_post_demo_data.dart | 154 ++++ lib/demo_server_data/post_demo_data.dart | 178 +++++ lib/enums/enums.dart | 9 + lib/locator.dart | 83 +++ lib/main.dart | 108 +++ lib/models/comment/comment_model.dart | 24 + lib/models/events/event_model.dart | 82 +++ lib/models/language/language_model.dart | 13 + lib/models/options/options.dart | 15 + lib/models/organization/org_info.dart | 89 +++ lib/models/organization/org_info.g.dart | 62 ++ lib/models/post/post_model.dart | 96 +++ lib/models/user/user_info.dart | 126 ++++ lib/models/user/user_info.g.dart | 71 ++ lib/router.dart | 118 +++ lib/services/comment_service.dart | 32 + lib/services/database_mutation_functions.dart | 183 +++++ lib/services/event_service.dart | 106 +++ lib/services/graphql_config.dart | 70 ++ lib/services/navigation_service.dart | 56 ++ lib/services/post_service.dart | 119 ++++ lib/services/size_config.dart | 48 ++ lib/services/user_config.dart | 126 ++++ lib/splash_screen.dart | 156 ++++ lib/utils/app_localization.dart | 95 +++ lib/utils/comment_queries.dart | 31 + lib/utils/event_queries.dart | 83 +++ lib/utils/post_queries.dart | 59 ++ lib/utils/queries.dart | 337 +++++++++ lib/utils/validators.dart | 117 +++ .../create_event_view_model.dart | 86 +++ .../explore_events_view_model.dart | 76 ++ .../organization_feed_view_model.dart | 114 +++ .../edit_profile_view_model.dart | 18 + .../profile_page_view_model.dart | 52 ++ lib/view_model/base_view_model.dart | 14 + lib/view_model/lang_view_model.dart | 63 ++ lib/view_model/main_screen_view_model.dart | 10 + .../login_view_model.dart | 77 ++ .../select_organization_view_model.dart | 333 +++++++++ .../set_url_view_model.dart | 85 +++ .../signup_details_view_model.dart | 119 ++++ .../waiting_view_model.dart | 52 ++ .../comments_view_model.dart | 54 ++ .../custom_drawer_view_model.dart | 48 ++ .../like_button_view_model.dart | 76 ++ .../progress_dialog_view_model.dart | 21 + .../after_auth_screens/add_post_page.dart | 79 ++ .../events/create_event_form.dart | 117 +++ .../events/create_event_page.dart | 270 +++++++ .../events/event_info_page.dart | 257 +++++++ .../events/explore_event_dialogue.dart | 142 ++++ .../events/explore_events.dart | 195 +++++ .../feed/individual_post.dart | 218 ++++++ .../feed/organization_feed.dart | 60 ++ .../feed/pinned_post_page.dart | 23 + .../join_organisation_after_auth.dart | 107 +++ .../profile/edit_profile_page.dart | 187 +++++ .../profile/profile_page.dart | 161 +++++ lib/views/base_view.dart | 41 ++ lib/views/main_screen.dart | 68 ++ .../pre_auth_screens/change_password.dart | 132 ++++ lib/views/pre_auth_screens/login.dart | 162 +++++ lib/views/pre_auth_screens/recover.dart | 103 +++ .../pre_auth_screens/select_language.dart | 146 ++++ .../pre_auth_screens/select_organization.dart | 96 +++ lib/views/pre_auth_screens/set_url.dart | 188 +++++ .../pre_auth_screens/signup_details.dart | 278 ++++++++ .../waiting_to_join_private_org.dart | 125 ++++ lib/widgets/custom_alert_dialog.dart | 61 ++ lib/widgets/custom_avatar.dart | 54 ++ lib/widgets/custom_drawer.dart | 108 +++ lib/widgets/custom_list_tile.dart | 136 ++++ lib/widgets/custom_progress_dialog.dart | 52 ++ lib/widgets/date_time_picker.dart | 25 + lib/widgets/event_card.dart | 203 ++++++ lib/widgets/event_date_time_tile.dart | 20 + lib/widgets/from_palisadoes.dart | 44 ++ lib/widgets/pinned_carousel_widget.dart | 153 ++++ lib/widgets/post_detailed_page.dart | 76 ++ lib/widgets/post_list_widget.dart | 37 + lib/widgets/post_widget.dart | 109 +++ lib/widgets/raised_round_edge_button.dart | 88 +++ lib/widgets/rich_text.dart | 27 + lib/widgets/signup_progress_indicator.dart | 63 ++ pubspec.yaml | 93 +++ test/helpers/test_helpers.dart | 143 ++++ test/helpers/test_helpers.mocks.dart | 267 +++++++ test/splash_screen_test.dart | 193 +++++ test/widget_tests/home_page_test.dart | 125 ++++ .../select_language_page_test.dart | 270 +++++++ test/widget_tests/set_url_page_test.dart | 509 +++++++++++++ 201 files changed, 15094 insertions(+) create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/PR_TEMPLATE/pr-template.md create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/README.md create mode 100755 .github/workflows/countline.py create mode 100644 .github/workflows/issues.yml create mode 100644 .github/workflows/pull-request.yml create mode 100644 .github/workflows/push.yaml create mode 100644 .github/workflows/trailing_commas.py create mode 100644 .gitignore create mode 100644 .readthedocs.yml create mode 100644 .travis.yml create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 LICENSE create mode 100644 PR-guidelines.md create mode 100644 README.md create mode 100644 analysis_options.yaml create mode 100644 android/.gitignore create mode 100644 android/app/build.gradle create mode 100644 android/app/src/debug/AndroidManifest.xml create mode 100644 android/app/src/main/AndroidManifest.xml create mode 100644 android/app/src/main/kotlin/com/example/talawa/MainActivity.kt create mode 100644 android/app/src/main/res/drawable-night/launch_background.xml create mode 100644 android/app/src/main/res/drawable-night/launch_image.png create mode 100644 android/app/src/main/res/drawable-night/launcher_image.xml create mode 100644 android/app/src/main/res/drawable/launch_background.xml create mode 100644 android/app/src/main/res/drawable/launch_image.png create mode 100644 android/app/src/main/res/drawable/launcher_image.xml create mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 android/app/src/main/res/values/colors.xml create mode 100644 android/app/src/main/res/values/styles.xml create mode 100644 android/build.gradle create mode 100644 android/gradle.properties create mode 100644 android/gradle/wrapper/gradle-wrapper.properties create mode 100644 android/settings.gradle create mode 100644 assets/fonts/OpenSans-Bold.ttf create mode 100644 assets/fonts/OpenSans-Regular.ttf create mode 100644 assets/fonts/OpenSans-SemiBold.ttf create mode 100644 assets/fonts/ProductSans-Bold.ttf create mode 100644 assets/fonts/ProductSans-Medium.ttf create mode 100644 assets/fonts/ProductSans-Regular.ttf create mode 100644 assets/images/launcher_icon.png create mode 100644 assets/images/no_internet.png create mode 100644 docs/conf.py create mode 100644 ios/.gitignore create mode 100644 ios/Flutter/AppFrameworkInfo.plist create mode 100644 ios/Flutter/Debug.xcconfig create mode 100644 ios/Flutter/Release.xcconfig create mode 100644 ios/Runner.xcodeproj/project.pbxproj create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/Runner/Info.plist create mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 issue-guidelines.md create mode 100644 lang/en.json create mode 100644 lang/es.json create mode 100644 lang/fr.json create mode 100644 lang/hi.json create mode 100644 lang/zh.json create mode 100644 lib/constants/constants.dart create mode 100644 lib/constants/custom_theme.dart create mode 100644 lib/constants/routing_constants.dart create mode 100644 lib/custom_painters/language_icon.dart create mode 100644 lib/custom_painters/talawa_logo.dart create mode 100644 lib/demo_server_data/events_demo_data.dart create mode 100644 lib/demo_server_data/pinned_post_demo_data.dart create mode 100644 lib/demo_server_data/post_demo_data.dart create mode 100644 lib/enums/enums.dart create mode 100644 lib/locator.dart create mode 100644 lib/main.dart create mode 100644 lib/models/comment/comment_model.dart create mode 100644 lib/models/events/event_model.dart create mode 100644 lib/models/language/language_model.dart create mode 100644 lib/models/options/options.dart create mode 100644 lib/models/organization/org_info.dart create mode 100644 lib/models/organization/org_info.g.dart create mode 100644 lib/models/post/post_model.dart create mode 100644 lib/models/user/user_info.dart create mode 100644 lib/models/user/user_info.g.dart create mode 100644 lib/router.dart create mode 100644 lib/services/comment_service.dart create mode 100644 lib/services/database_mutation_functions.dart create mode 100644 lib/services/event_service.dart create mode 100644 lib/services/graphql_config.dart create mode 100644 lib/services/navigation_service.dart create mode 100644 lib/services/post_service.dart create mode 100644 lib/services/size_config.dart create mode 100644 lib/services/user_config.dart create mode 100644 lib/splash_screen.dart create mode 100644 lib/utils/app_localization.dart create mode 100644 lib/utils/comment_queries.dart create mode 100644 lib/utils/event_queries.dart create mode 100644 lib/utils/post_queries.dart create mode 100644 lib/utils/queries.dart create mode 100644 lib/utils/validators.dart create mode 100644 lib/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart create mode 100644 lib/view_model/after_auth_view_models/event_view_models/explore_events_view_model.dart create mode 100644 lib/view_model/after_auth_view_models/feed_view_models/organization_feed_view_model.dart create mode 100644 lib/view_model/after_auth_view_models/profile_view_models/edit_profile_view_model.dart create mode 100644 lib/view_model/after_auth_view_models/profile_view_models/profile_page_view_model.dart create mode 100644 lib/view_model/base_view_model.dart create mode 100644 lib/view_model/lang_view_model.dart create mode 100644 lib/view_model/main_screen_view_model.dart create mode 100644 lib/view_model/pre_auth_view_models/login_view_model.dart create mode 100644 lib/view_model/pre_auth_view_models/select_organization_view_model.dart create mode 100644 lib/view_model/pre_auth_view_models/set_url_view_model.dart create mode 100644 lib/view_model/pre_auth_view_models/signup_details_view_model.dart create mode 100644 lib/view_model/pre_auth_view_models/waiting_view_model.dart create mode 100644 lib/view_model/widgets_view_models/comments_view_model.dart create mode 100644 lib/view_model/widgets_view_models/custom_drawer_view_model.dart create mode 100644 lib/view_model/widgets_view_models/like_button_view_model.dart create mode 100644 lib/view_model/widgets_view_models/progress_dialog_view_model.dart create mode 100644 lib/views/after_auth_screens/add_post_page.dart create mode 100644 lib/views/after_auth_screens/events/create_event_form.dart create mode 100644 lib/views/after_auth_screens/events/create_event_page.dart create mode 100644 lib/views/after_auth_screens/events/event_info_page.dart create mode 100644 lib/views/after_auth_screens/events/explore_event_dialogue.dart create mode 100644 lib/views/after_auth_screens/events/explore_events.dart create mode 100644 lib/views/after_auth_screens/feed/individual_post.dart create mode 100644 lib/views/after_auth_screens/feed/organization_feed.dart create mode 100644 lib/views/after_auth_screens/feed/pinned_post_page.dart create mode 100644 lib/views/after_auth_screens/join_organisation_after_auth.dart create mode 100644 lib/views/after_auth_screens/profile/edit_profile_page.dart create mode 100644 lib/views/after_auth_screens/profile/profile_page.dart create mode 100644 lib/views/base_view.dart create mode 100644 lib/views/main_screen.dart create mode 100644 lib/views/pre_auth_screens/change_password.dart create mode 100644 lib/views/pre_auth_screens/login.dart create mode 100644 lib/views/pre_auth_screens/recover.dart create mode 100644 lib/views/pre_auth_screens/select_language.dart create mode 100644 lib/views/pre_auth_screens/select_organization.dart create mode 100644 lib/views/pre_auth_screens/set_url.dart create mode 100644 lib/views/pre_auth_screens/signup_details.dart create mode 100644 lib/views/pre_auth_screens/waiting_to_join_private_org.dart create mode 100644 lib/widgets/custom_alert_dialog.dart create mode 100644 lib/widgets/custom_avatar.dart create mode 100644 lib/widgets/custom_drawer.dart create mode 100644 lib/widgets/custom_list_tile.dart create mode 100644 lib/widgets/custom_progress_dialog.dart create mode 100644 lib/widgets/date_time_picker.dart create mode 100644 lib/widgets/event_card.dart create mode 100644 lib/widgets/event_date_time_tile.dart create mode 100644 lib/widgets/from_palisadoes.dart create mode 100644 lib/widgets/pinned_carousel_widget.dart create mode 100644 lib/widgets/post_detailed_page.dart create mode 100644 lib/widgets/post_list_widget.dart create mode 100644 lib/widgets/post_widget.dart create mode 100644 lib/widgets/raised_round_edge_button.dart create mode 100644 lib/widgets/rich_text.dart create mode 100644 lib/widgets/signup_progress_indicator.dart create mode 100644 pubspec.yaml create mode 100644 test/helpers/test_helpers.dart create mode 100644 test/helpers/test_helpers.mocks.dart create mode 100644 test/splash_screen_test.dart create mode 100644 test/widget_tests/home_page_test.dart create mode 100644 test/widget_tests/select_language_page_test.dart create mode 100644 test/widget_tests/set_url_page_test.dart diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 000000000..50defe410 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,12 @@ +# These are supported funding model platforms + +github: [palisadoes] +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: PalisadoesFoundation/talawa +otechie: # Replace with a single Otechie username +custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..ccbb9c4d8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,29 @@ +--- +name: Bug report +about: Create a report to help us improve. +title: Bug report +labels: Bug +assignees: "" +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +1. +2. +3. +4. + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Actual behavior** +A clear and concise description of how the code performed w.r.t expectations. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Additional details** diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..1c93611c4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,22 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: Feature request +labels: Feature +assignees: "" +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Approach to be followed (optional)** +A clear and concise description of approach to be followed. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/PR_TEMPLATE/pr-template.md b/.github/PR_TEMPLATE/pr-template.md new file mode 100644 index 000000000..0401cd75c --- /dev/null +++ b/.github/PR_TEMPLATE/pr-template.md @@ -0,0 +1,8 @@ +- **What kind of change does this PR introduce:** +- **Issue Number:** +- **Did you add tests for your code?** +- **Snapshots/Videos:** +- **Does this PR introduce a breaking change?** +- **Other information:** +- **Have you read the [contributing guide](https://github.com/PalisadoesFoundation/talawa/blob/master/CONTRIBUTING.md)?** + diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..a944fcc75 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,51 @@ + + + + +**What kind of change does this PR introduce?** + + + +**Issue Number:** + +Fixes # + +**Did you add tests for your changes?** + + + +**Snapshots/Videos:** + + + +**If relevant, did you update the documentation?** + + + +**Summary** + + + + +**Does this PR introduce a breaking change?** + + + +**Other information** + + + +**Have you read the [contributing guide](https://github.com/PalisadoesFoundation/talawa/blob/master/CONTRIBUTING.md)?** + + diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 000000000..5a6126b23 --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,22 @@ +# Talawa GitHub Workflows Guidelines + +Here are some contributing guidelines for this directory. + +## YAML Files + +Follow these guidelines when creating new YAML defined GitHub actions. + +1. Place all actions related to issues in the `issues.yml` file. +1. Place all actions related to pull requests in the `pull-requests.yml` file. + +## Scripts + +Follow these guidelines when creating or modifying scripts in this directory. + +1. All scripts in this directory must be written in python3 for consistency. +1. The python3 scripts must follow the following coding standards. Run these commands against your scripts before submitting PRs that modify or create python3 scripts in this directory. + 1. Pycodestyle + 1. Pydocstyle + 1. Pylint + 1. Flake8 +1. All scripts must run a main() function. diff --git a/.github/workflows/countline.py b/.github/workflows/countline.py new file mode 100755 index 000000000..396bb5fba --- /dev/null +++ b/.github/workflows/countline.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python3 +# -*- coding: UTF-8 -*- +"""Script to encourage more efficient coding practices. + +Methodology: + + Analyses the `lib` and `test` directories to find files that exceed a + pre-defined number of lines of code. + + This script was created to help improve code quality by encouraging + contributors to create reusable code. + +NOTE: + + This script complies with our python3 coding and documentation standards + and should be used as a reference guide. It complies with: + + 1) Pylint + 2) Pydocstyle + 3) Pycodestyle + 4) Flake8 + + Run these commands from the CLI to ensure the code is compliant for all + your pull requests. + +""" + +# Standard imports +import os +import sys +import argparse + + +def _excluded_filepaths(excludes): + """Create a list of full file paths to exclude from the analysis. + + Args: + excludes: List of files to exclude + + Returns: + result: A list of full file paths + + """ + # Initialize key variables + result = [] + + if bool(excludes) is True: + for filename in excludes: + # Ignore files that appear to be full paths because they start + # with a '/' or whatever the OS uses to distinguish directories + if filename.startswith(os.sep): + result.append(filename) + continue + + # Create a file path + filepath = '{}{}{}'.format(os.getcwd(), os.sep, filename) + if os.path.isfile(filepath) is True: + result.append(filepath) + # Return + return result + + +def _arg_parser_resolver(): + """Resolve the CLI arguments provided by the user. + + Args: + None + + Returns: + result: Parsed argument object + + """ + # Initialize parser and add the CLI options we should expect + parser = argparse.ArgumentParser() + parser.add_argument('--lines', type=int, required=False, default=300, + help='The maximum number of lines of code to accept.') + parser.add_argument('--directory', type=str, required=False, + default=os.getcwd(), + help='The parent directory of files to analyze.') + parser.add_argument('--exclude', type=str, required=False, + nargs='*', + default=None, + const=None, + help='''\ +An optional list of files to exclude from the analysis separated by spaces.''') + + # Return parser + result = parser.parse_args() + # print(result.exclude) + # sys.exit(0) + return result + + +def main(): + """Analyze dart files. + + This function finds, and prints the files that exceed the CLI + defined defaults. + + Args: + None + + Returns: + None + + """ + # Initialize key variables + lookup = {} + errors_found = False + file_count = 0 + excluded_filepaths = [] + + # Get the CLI arguments + args = _arg_parser_resolver() + + # Define the directories of interest + directories = [ + os.path.expanduser(os.path.join(args.directory, 'lib')), + os.path.expanduser(os.path.join(args.directory, 'test')) + ] + + # Get a corrected list of filenames to exclude + excluded_filepaths = _excluded_filepaths(args.exclude) + + # Iterate and analyze each directory + for directory in directories: + for root, _, files in os.walk(directory, topdown=False): + for name in files: + # Read each file and count the lines found + filepath = os.path.join(root, name) + + # Skip excluded files + if bool(args.exclude) is True: + if filepath in excluded_filepaths: + continue + + # Process the rest + with open(filepath) as code: + line_count = sum( + 1 for line in code + if line.strip() and not line.startswith('#') + ) + lookup[filepath] = line_count + + # If the line rule is voilated then the value is changed to 1 + for filepath, line_count in lookup.items(): + if line_count > args.lines: + errors_found = True + file_count += 1 + if file_count == 1: + print(''' +LINE COUNT ERROR: Files with excessive lines of code have been found\n''') + + print(' Line count: {:>5} File: {}'.format(line_count, filepath)) + + # Evaluate and exit + if bool(errors_found) is True: + print(''' +The {} files listed above have more than {} lines of code. + +Please fix this. It is a pre-requisite for pull request approval. +'''.format(file_count, args.lines)) + sys.exit(1) + else: + sys.exit(0) + + +if __name__ == '__main__': + main() diff --git a/.github/workflows/issues.yml b/.github/workflows/issues.yml new file mode 100644 index 000000000..9b5a2594b --- /dev/null +++ b/.github/workflows/issues.yml @@ -0,0 +1,23 @@ +name: Issues Workflow +on: + issues: + types: ['opened'] +jobs: + Opened-issue-label: + name: Adding Issue Label + runs-on: ubuntu-latest + steps: + - uses: Renato66/auto-label@v2.2.0 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + ignore-comments: true + default-labels: '["unapproved"]' + + Issue-Greeting: + name: Greeting Message to User + runs-on: ubuntu-latest + steps: + - uses: actions/first-interaction@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + issue-message: "Congratulations on making your first Issue! :confetti_ball: If you haven't already, check out our [Contributing Guidelines](https://github.com/PalisadoesFoundation/talawa/blob/master/CONTRIBUTING.md) and [Issue Reporting Guidelines](https://github.com/PalisadoesFoundation/talawa/blob/master/issue-guidelines.md) to ensure that you are following our guidelines for contributing and making issues." \ No newline at end of file diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 000000000..409236a59 --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,81 @@ +name: PR Workflow +on: [pull_request] + +jobs: + PR-Greeting: + name: Greeting Message to user + runs-on: ubuntu-latest + steps: + - uses: actions/first-interaction@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + pr-message: "Congratulations on making your first PR! :confetti_ball: If you haven't already, check out our [Contributing Guidelines](https://github.com/PalisadoesFoundation/talawa/blob/master/CONTRIBUTING.md) and [PR Reporting Guidelines](https://github.com/PalisadoesFoundation/talawa/blob/master/PR-guidelines.md) to ensure that you are following our guidelines for contributing and creating PR." + + Linter: + name: Checking if code formatting is done correctly + runs-on: ubuntu-latest + needs: PR-Greeting + steps: + - uses: actions/checkout@v2 + - uses: axel-op/dart-package-analyzer@v3 + with: + githubToken: ${{ secrets.GITHUB_TOKEN }} + - uses: subosito/flutter-action@v1 + with: + channel: 'beta' + - run: flutter format --set-exit-if-changed . + + Flutter-analyze: + name: Analyzing flutter code + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: axel-op/dart-package-analyzer@v3 + with: + githubToken: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/setup-java@v1 + with: + java-version: '12.x' + - uses: subosito/flutter-action@v1 + with: + channel: 'stable' + flutter-version: '2.2.1' + - run: flutter pub get + - run: flutter analyze --no-pub + + Count-lines-of-code: + name: Total number of lines in every file should not be more than 300 + needs: Linter + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: chmod +x ./.github/workflows/countline.py + - run: ./.github/workflows/countline.py --exclude lib/custom_painters/talawa_logo.dart lib/utils/queries.dart test/widget_tests/set_url_page_test.dart lib/view_model/pre_auth_view_models/select_organization_view_model.dart + + Trailing-Comma-Pattern: + name: Trailing comma added at the end of every required code + needs: Linter + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: chmod +x ./.github/workflows/trailing_commas.py + - run: ./.github/workflows/trailing_commas.py + + Coverage-Report: + name: Generate coverage report + needs: Linter + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Sets up a Flutter environment + uses: subosito/flutter-action@v1 + with: + channel: 'beta' + - name: Generates LCOV file + run: flutter test --coverage + - name: Report code coverage + uses: VeryGoodOpenSource/very_good_coverage@v1.1.1 + with: + path: "./coverage/lcov.info" + min_coverage: 3 diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml new file mode 100644 index 000000000..749a2e148 --- /dev/null +++ b/.github/workflows/push.yaml @@ -0,0 +1,81 @@ +name: PUSH Workflow +on: [push] + +jobs: + PR-Greeting: + name: Greeting Message to user + runs-on: ubuntu-latest + steps: + - uses: actions/first-interaction@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + pr-message: "Congratulations on making your first PR! :confetti_ball: If you haven't already, check out our [Contributing Guidelines](https://github.com/PalisadoesFoundation/talawa/blob/master/CONTRIBUTING.md) and [PR Reporting Guidelines](https://github.com/PalisadoesFoundation/talawa/blob/master/PR-guidelines.md) to ensure that you are following our guidelines for contributing and creating PR." + + Linter: + name: Checking if code formatting is done correctly + runs-on: ubuntu-latest + needs: PR-Greeting + steps: + - uses: actions/checkout@v2 + - uses: axel-op/dart-package-analyzer@v3 + with: + githubToken: ${{ secrets.GITHUB_TOKEN }} + - uses: subosito/flutter-action@v1 + with: + channel: 'beta' + - run: flutter format --set-exit-if-changed . + + Flutter-analyze: + name: Analyzing flutter code + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: axel-op/dart-package-analyzer@v3 + with: + githubToken: ${{ secrets.GITHUB_TOKEN }} + - uses: actions/setup-java@v1 + with: + java-version: '12.x' + - uses: subosito/flutter-action@v1 + with: + channel: 'stable' + flutter-version: '2.2.1' + - run: flutter pub get + - run: flutter analyze --no-pub + + Count-lines-of-code: + name: Total number of lines in every file should not be more than 300 + needs: Linter + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: chmod +x ./.github/workflows/countline.py + - run: ./.github/workflows/countline.py --exclude lib/custom_painters/talawa_logo.dart lib/utils/queries.dart test/widget_tests/set_url_page_test.dart lib/view_model/pre_auth_view_models/select_organization_view_model.dart + + Trailing-Comma-Pattern: + name: Trailing comma added at the end of every required code + needs: Linter + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - run: chmod +x ./.github/workflows/trailing_commas.py + - run: ./.github/workflows/trailing_commas.py + + Coverage-Report: + name: Generate coverage report + needs: Linter + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Sets up a Flutter environment + uses: subosito/flutter-action@v1 + with: + channel: 'beta' + - name: Generates LCOV file + run: flutter test --coverage + - name: Report code coverage + uses: VeryGoodOpenSource/very_good_coverage@v1.1.1 + with: + path: "./coverage/lcov.info" + min_coverage: 3 \ No newline at end of file diff --git a/.github/workflows/trailing_commas.py b/.github/workflows/trailing_commas.py new file mode 100644 index 000000000..51e1b35f2 --- /dev/null +++ b/.github/workflows/trailing_commas.py @@ -0,0 +1,111 @@ +#!/usr/bin/env python3 +# -*- coding=UTF-8 -*- +"""This is a prettify script so that flutter formatting can work efficiently. + +Methodology: + Analyses the `lib` and `test` directories to go through the code line by + line and add commas if the syntax matches the conditions. + This script was created to help improve code quality by making it prettier + and more readable. + +NOTE: + This script complies with our python3 coding and documentation standards + and should be used as a reference guide. It complies with: + 1) Pylint + 2) Pydocstyle + 3) Pycodestyle + Run these commands from the CLI to ensure the code is compliant for all + your pull requests if you want to contribute to this file. + +""" + +# Standard imports +import os +import sys +import argparse + + +def arg_parser_resolver(): + """Resolve the CLI arguments provided by the user. + + Args: + None + + Returns: + result: Parsed argument object + + """ + parser = argparse.ArgumentParser( + description='for parsing across the directory') + parser.add_argument('--dir', type=str, required=False, default=os.getcwd(), + help='directory-location where files are present') + return parser.parse_args() + + +def syntax_matcher(root: str, files: list): + """Pattern matching and adding trailing commas at the required places. + + Args: + root : Name of the root directory + files : List of all the files'(including sub-folders) paths + + Returns: + None + """ + for name in files: + + file_location = os.path.join(root, name) + data = [] + with open(file_location, 'r') as read_loc: + data = read_loc.readlines() + with open(file_location, 'w') as write_loc: + + for index in range(0, len(data)): + # genral case of addition of commas + if '))' and not ')) {' in data[index]: + data[index] = data[index].replace('))', '),)') + + # for cases of function declaration without any parameters + if '(,)' in data[index]: + data[index] = data[index].replace('(,)', '()') + + # for commas already exist and formatting is already done + if ',));' in data[index]: + data[index] = data[index].replace(',));', '));') + + # for the unique exception occuring in grops_controller.dart + # since a conditional operator means it is an IF line + # and adding an trailing comma will cause an error + if '==' or '!=' in data[index]: + data[index] = data[index].replace('(),)', '())') + + # for removal of comma at the start of function call + if '),).' in data[index]: + data[index] = data[index].replace('),).', ')).') + write_loc.write(data[index]) + + +def main(): + """Find, and update, for files having comma in trailing sequence. + + Args: + None + + Returns: + None + + """ + args = arg_parser_resolver() + # libPath and testPath dir location + lib_path = os.path.expanduser(os.path.join(args.dir, 'lib')) + test_path = os.path.expanduser(os.path.join(args.dir, 'test')) + # counting lines in lib and test + for root, _, files in os.walk(lib_path, topdown=False): + syntax_matcher(root, files) + for root, _, files in os.walk(test_path, topdown=False): + syntax_matcher(root, files) + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..992bc99f1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,191 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +**/doc/api/ +.dart_tool/ +.flutter-plugins +.packages +.pub-cache/ +.pub/ +/build/ +.flutter-plugins-dependencies + +# Android related +**/android/**/gradle-wrapper.jar +**/android/.gradle +**/android/captures/ +**/android/gradlew +**/android/gradlew.bat +**/android/local.properties +**/android/**/GeneratedPluginRegistrant.java + +# iOS/XCode related +**/ios/**/*.mode1v3 +**/ios/**/*.mode2v3 +**/ios/**/*.moved-aside +**/ios/**/*.pbxuser +**/ios/**/*.perspectivev3 +**/ios/**/*sync/ +**/ios/**/.sconsign.dblite +**/ios/**/.tags* +**/ios/**/.vagrant/ +**/ios/**/DerivedData/ +**/ios/**/Icon? +**/ios/**/Pods/ +**/ios/**/.symlinks/ +**/ios/**/profile +**/ios/**/xcuserdata +**/ios/.generated/ +**/ios/Flutter/App.framework +**/ios/Flutter/Flutter.framework +**/ios/Flutter/Generated.xcconfig +**/ios/Flutter/app.flx +**/ios/Flutter/app.zip +**/ios/Flutter/flutter_assets/ +**/ios/Flutter/flutter_export_environment.sh +**/ios/ServiceDefinitions.json +**/ios/Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!**/ios/**/default.mode1v3 +!**/ios/**/default.mode2v3 +!**/ios/**/default.pbxuser +!**/ios/**/default.perspectivev3 +!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages +# Sphinx documentation +docs/_build/ + + +############################################################################### +# Generic Python Exclusions (Provided by GitHub) +# +# Created by https://www.gitignore.io/api/python +# Edit at https://www.gitignore.io/?templates=python +############################################################################### + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# Mr Developer +.mr.developer.cfg +.project +.pydevproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# End of https://www.gitignore.io/api/python +.flutter-plugins-dependencies +pubspec.lock diff --git a/.readthedocs.yml b/.readthedocs.yml new file mode 100644 index 000000000..36ddd6bf7 --- /dev/null +++ b/.readthedocs.yml @@ -0,0 +1,22 @@ +# File: .readthedocs.yml +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details + +# Required +version: 2 + +# Build documentation in the docs/ directory with Sphinx +sphinx: + configuration: docs/conf.py + +# Optionally build your docs in additional formats such as PDF and ePub +formats: all + +# Optionally set the version of Python and requirements required to build docs +# We have to set this or else ReadTheDocs will attempt to install pip packages +# from pip_requirements that have system library dependencies that ReadTheDocs +# does not have +python: + version: 3.6 + install: + - requirements: docs/requirements.txt diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..cc0cc31f1 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,39 @@ +{ + "language": "dart", + "os": [ + "linux" + ], + "dist": "xenial", + "addons": { + "apt": { + "packages": [ + "lib32stdc++6" + ] + } + }, + "install": [ + "git clone https://github.com/flutter/flutter.git -b stable", + "./flutter/bin/flutter doctor" + ], + "script": [ + "./flutter/bin/flutter test" + ], + "deploy": [ + { + "provider": "pages", + "strategy": "git", + "on": { + "branch": [ + "drewdev" + ] + }, + "cleanup": true, + "token": "$GITHUB_TOKEN" + } + ], + "cache": { + "directories": [ + "$HOME/.pub-cache" + ] + } +} \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..5b0d1618a --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,133 @@ + +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or + advances of any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email + address, without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at [The Palisadoes Foundation](http://www.palisadoes.org/) + +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available +at [https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.0]: https://www.contributor-covenant.org/version/2/0/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..e26eb2386 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,189 @@ +# Contributing to Talawa + +Thank you for your interest in contributing to Talawa. Regardless of the size of the contribution you make, all contributions are welcome and are appreciated. + +If you are new to contributing to open source, please read the Open Source Guides on [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/). + +## Code of Conduct + +A safe environment is required for everyone to contribute. Read our [Code of Conduct Guide](https://github.com/PalisadoesFoundation/talawa/blob/master/CODE_OF_CONDUCT.md) to understand what this means. Let us know immediately if you have unacceptable experiences in this area. + +No one should fear voicing their opinion. Respones must be respectful. + +## Ways to Contribute + +If you are ready to start contributing code right away, we have a list of [good first issues](https://github.com/PalisadoesFoundation/talawa/labels/good%20first%20issue) that contain issues with a limited scope. + +### Our Development Process + +We utilize GitHub issues and pull requests to keep track of issues and contributions from the community. + +#### Issues + +Make sure you are following [issue report guidelines](https://github.com/PalisadoesFoundation/talawa/blob/master/issue-guidelines.md) available here before creating any new issues on Talawa project. + +#### Pull Requests + +[Pull Request guidelines](https://github.com/PalisadoesFoundation/talawa/blob/master/PR-guidelines.md) is best resource to follow to start working on open issues. + +#### Branching Strategy + +For Talawa, we had employed the following branching strategy to simplify the development process and to ensure that only stable code is pushed to the `master` branch: + +- `develop`: For unstable code and bug fixing +- `alpha-x.x.x`: For stability testing +- `master`: Where the stable production ready code lies + +### Contributing Code + +Code contributions to Talawa come in the form of pull requests. These are done by forking the repo and making changes locally. + +The process of proposing a change to Talawa can be summarized as: + +1. Fork the Talawa repository and branch off `master`. +1. The repository can be cloned locally using `git clone `. +1. Make the desired changes to the Talawa source. +1. Run the app and test your changes. +1. If you've added code that should be tested, write tests. +1. Ensure that your code is appropriately formatted before making your submission. Submissions which are not properly formatted will be rejected if they are not fixed by the contributor. + 1. **In your IDE:** + 1. _Visual Studio Code:_ There is a setting which allows your code to be formatted [automatically when you save](https://stackoverflow.com/a/66538607/15290492), or you may manually trigger it using `Ctrl + Shift + P` or `Cmd + Shift + P` and typing `Format Document`. + 1. _IntelliJ_, _Android Studio_, and other _Jetbrains_-based IDEs. Use the `Ctrl + Alt + L` or `Cmd + Opt + L` to trigger code formatting. + 1. **On the command line before committing**: Run this command from the root of your repository directory tree. + ``` + flutter format --set-exit-if-changed . + ``` +1. Ensure that **your code should not more than 300 lines**. It is there to make the code more modular and readable. Submissions that are not properly maintained will be rejected if the contributor does not fix them. Otherwise, the contributor will have to explain the need for it. +1. After making changes you can add them to git locally using `git add `(to add changes only in a particular file) or `git add .` (to add all changes). +1. After adding the changes you need to commit them using `git commit -m ''`(look at the commit guidelines below for commit messages). + 1. You can link and automatically close the issue tied to your pull request by [using a supported keyword in either the pull request's description or in a commit message.](https://docs.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue) This is a very useful feature that helps to prevent zombie issues that never die. +1. Once you have successfully commited your changes, you need to push the changes to the forked repo on github using: `git push origin `.(Here branch name must be name of the branch you want to push the changes to.) +1. Now create a pull request to the Talawa repository from your forked repo. Open an issue regarding the same and link your PR to it. +1. Ensure the test suite passes, either locally or on CI once a PR has been created. +1. Review and address comments on your pull request if requested. + +### General Guidelines + +#### Folder Description + +- `controllers`: The folder contains all the files responsible for managing the state. + ``` + 1. Files contain codes for all the business logic related to any screen. + 2. Files also contain the client-side query & mutation calls and server-side side response. + 3. Before adding any controller make sure whether it already exists or not. + ``` +- `enum`: The folder contains all the enumerator used in the entire project. + ``` + 1. File contains an enum that is either used with controllers or widgets. + 2. Before creating any new enum files check if the existing enum can be modified to fulfil your requirement. + ``` +- `model`: The folder contains all the data models file. + ``` + 1. Files contains data model that is used in controller file that contains the server-side response in an organised form. + 2. These data models are used to effectively organise projects and render the data on widgets. + 3. In the controller file, convert every response to a particular data model type. + ``` +- `utils`: The folder contains all the external utility files. + ``` + 1. Codes related to an external utility like validator, UI-scaling, constant strings etc + 2. Any utility-related files should be created here if not already present. + ``` +- `views`: The folder contains all the files related to the UI display. + ``` + 1. Pages: Folder that contains all the pages related to sub-folder and code. + 2. Widgets: Folder that contains widget file for pages to avoid code duplication + ``` + +#### File Code Rules + +- Filename should be created with lowercase and underscore letters +- The business logic & UI based file should be separated from each other. + - `controllers`: Folder that contains all business logic files + - `views`: Folder that contains UI specific files +- If it is UI based file, try to use as much `stateless widget` as possible. +- Don't use the `print` statement in your code, instead use `debugPrint`. +- Constructor should be present just after the class declaration. +- Make sure to add proper `keyword` (final or const) and data types for any variable. +- In your files, structure code this way inside your widget class: + ``` + -- constructor + -- explicitly defined variables using its type (private if possible) + -- build method (Inside build(), use sub methods like _buildAppBar() + -- sub-build methods + -- other methods + -- utility methods + ``` + +**_Note: Don't use constant numerical value anywhere in your UI related code. Use SizeConfig class to assign the constant value. SizeConfig class does the job of scaling the UI based on the device size._** + +Example: + +``` +Incorrect Way: +SizedBox(height: 8, width: 4) + +Correct Way: +SizedBox(height: SizeConfig.safeBlockVertical, width: SizeConfig.safeBlockHorizontal) +``` + +The value of `safeBlockVertical` and `safeBlockHorizontal` will be displayed in your `console` and varies based on the device being used. + +#### Before making PR, ensure these: + + - All your file should contain at max `300` lines of code. + - Follow proper code formatting and run `flutter format .` before your PR. + - Run `flutter analyze` before your PR and make sure to resolve all the found issues. + +#### Project structure + +``` +app +- presentation: interactions and data presented to the user + - screens: app and feature screens + - + - .screen.dart + - widget: internal widgets related to a screen/feature + - viewmodels: shared business logic, so we can extract it easily soon as we modularize our app +- resources: local and remote data sources, other services + +components +- example: runnable app to view all components added in the app +- + - src + - component.configs.dart + - component.name.dart + +core +- enums: common enums shared +- models: business data models, entities +- theme: application theme, colors, dimens +- utils: utility classes +``` + +#### Commit guidelines + +``` +feat: (addition of a new feature) +rfac: (refactoring the code: optimization/ different logic of existing code - output doesn't change, just the way of execution changes) +docs: (documenting the code, be it readme, or extra comments) +bfix: (bug fixing) +chor: (chore - beautifying code, indents, spaces, camelcasing, changing variable names to have an appropriate meaning) +ptch: (patches - small changes in code, mainly UI, for example color of a button, increasing size of text, etc) +conf: (configurational settings - changing directory structure, updating gitignore, add libraries, changing manifest etc) +``` + +### Internships + +We have internship partnerships with a number of organizations. See below for more details. + +#### GSoC + +If you are participating in the 2021 Summer of Code, please read more about us and our processes [here](https://palisadoesfoundation.github.io/talawa-docs/docs/internships/gsoc/gsoc-introduction) + +#### GitHub Externship + +If you are participating in the 2021 GitHub Externship, please read more about us and our processes [here](https://palisadoesfoundation.github.io/talawa-docs/docs/internships/github/github-introduction) + +### Community + +The Palisadoes Foundation has a Slack channel where members can assist with support and clarification. Click [here](https://join.slack.com/t/thepalisadoes-dyb6419/shared_invite/zt-nk79xxlg-OxTdlrD7RLaswu8EO_Q5rg) to join our slack channel. diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..f288702d2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/PR-guidelines.md b/PR-guidelines.md new file mode 100644 index 000000000..80047d4ad --- /dev/null +++ b/PR-guidelines.md @@ -0,0 +1,21 @@ +# Pull Request Guidelines + +:+1::tada: First off, thanks for taking the time to contribute! :tada::+1: + +In order to give everyone a chance to submit a pull request and contribute to the Talawa project, we have put restrictions in place. This section outlines the guidelines that should be imposed upon pull requests in the Talawa project. + +1. Do not start working on any open issue and raise a PR unless it is assigned to you. +3. Pull requests must be based on [open issues](https://github.com/PalisadoesFoundation/talawa/issues) available. +4. [Use this method to automatically close the issue when the PR is completed.](https://docs.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue) +5. Each contributor may only create one pull request at a time. We have this rule in place due to our limited resources - if everyone was allowed to post multiple pull requests we will not be able to review them properly. It is also better for contributors because you can focus on creating one quality PR - so spend time making sure it is as good as it can be. +6. If the pull request's code quality is not up to par, or it would break the app, it will more likely be closed. So please be careful when creating a PR. +7. Please follow the [PR template](https://github.com/PalisadoesFoundation/talawa/blob/master/.github/PR_TEMPLATE/pr-template.md). Ensure the PR title clearly describes the problem it is solving. In the description, include the relevant issue number, snapshots and videos after changes added. +8. If you are borrowing code, please disclose it. It is fine and sometimes even recommended to borrow code, but we need to know about it to assess your work. If we find out that your pull request contains a lot of code copied from elsewhere, we will close the pull request. +9. All pull request must have test units. If for some reason it is not possible to add tests, please let us know and explain why. In that case, you'll need to tell us what steps you followed to manually test your changes. +10. No Work In Progress. ONLY completed and working pull requests, and with test units, will be accepted. A WIP would fall under rule 4 and be closed immediately. +11. Please do not @mention contributors and mentors. Sometimes it takes time before we can review your pull request or answer your questions but we'll get to it sooner or later. @mentioning someone just adds to the pile of notifications we get and it won't make us look at your issue faster. +12. Do not force push. If you make changes to your pull request, please simply add a new commit as that makes it easy for us to review your new changes. If you force push, we'll have to review everything from the beginning. +13. PR should be small, easy to review and should follow standard coding styles. +14. If PR has conflicts because of recently added changes to the same file, resolve issues, test new changes and submit PR again for review. +15. PRs should be atomic. That is, they should address one item (issue or feature) +16. After submitting PR, if you are not replying within 48 hours then in that case we may need to assign issue to other contributors based on priority of the issue. diff --git a/README.md b/README.md new file mode 100644 index 000000000..057715c74 --- /dev/null +++ b/README.md @@ -0,0 +1,63 @@ +# Talawa +[![Build Status](https://travis-ci.org/PalisadoesFoundation/talawa.svg?branch=master)](http://www.palisadoes.org/) +[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) +[![GitHub stars](https://img.shields.io/github/stars/PalisadoesFoundation/talawa.svg?style=social&label=Star&maxAge=2592000)](https://github.com/PalisadoesFoundation/talawa) +[![GitHub forks](https://img.shields.io/github/forks/PalisadoesFoundation/talawa.svg?style=social&label=Fork&maxAge=2592000)](https://github.com/PalisadoesFoundation/talawa) + +[![N|Solid](images/talawa-logo-lite-200x200.png)](https://github.com/PalisadoesFoundation/talawa) + +Talawa is a modular open source project to manage group activities of both non-profit organizations and businesses. + +Core features include: + + 1. Membership management + 2. Groups management + 3. Event registrations + 4. Recurring meetings + 5. Facilities registrations + + ``talawa`` is based on the original ``quito`` code created by the [Palisadoes Foundation](http://www.palisadoes.org) as part of its annual Calico Challenge program. Calico provides paid summer internships for Jamaican university students to work on selected open source projects. They are mentored by software professionals and receive stipends based on the completion of predefined milestones. Calico was started in 2015. Visit [The Palisadoes Foundation's website](http://www.palisadoes.org/) for more details on its origin and activities. + +# Talawa Components + +`talawa` has these major software components: + +1. **talawa**: [A mobile application with social media features](https://github.com/PalisadoesFoundation/talawa) +1. **talawa-api**: [An API providing access to user data and features](https://github.com/PalisadoesFoundation/talawa-api) +1. **talawa-admin**: [A web based administrative portal](https://github.com/PalisadoesFoundation/talawa-admin) +1. **talawa-docs**: [The online documentation website](https://github.com/PalisadoesFoundation/talawa-docs) + +# Documentation + - The talawa documentation can be found [here](https://palisadoesfoundation.github.io/talawa-docs/). + - Want to contribute? Look at [CONTRIBUTING.md](https://github.com/PalisadoesFoundation/talawa/blob/master/CONTRIBUTING.md) to get started. + - Visit the [Talawa GitHub](https://github.com/PalisadoesFoundation/talawa) to see the code. + +# Installation for Developers + +You can test talawa in your own development environment. This section shows you how. + +## Prerequisites + +You'll need to setup the IDE and mobile device emulator on your local system, and have access to a system running the Talawa API which the mobile needs to access to operate properly. + +1. **Development Environment**: You'll need to have the following installed: + 1. [Flutter SDK](https://flutter.dev/docs/get-started/install) + 1. [Android Studio](https://developer.android.com/studio) +1. **API Environment**: You will need to enter the URL of the API server in the Talawa app when it first starts up. The URL could be active on a system you control or in our test environment. + 1. *Your API Server:* Check the [Talawa API repository](https://github.com/PalisadoesFoundation/talawa-api) for information on how to setup the API on your local machine or a machine under your legitimate control. There is a section in the README.md file that discusses installation. + 2. *Our API Server for Talawa Contributors*: We also have a test environment that our open source contributors use. Try it if you are not inclined to setup or customize your own API server.This is a development environment. The data stored on this server may be modified or deleted without warning. Information about this server can be found in the [Talawa documentation site](https://palisadoesfoundation.github.io/talawa-docs/) + +## Command Line Steps + +We have tried to make the process simple. Here's what you need to do. + +1. Clone and change into the project. + ```sh + $ git clone https://github.com/PalisadoesFoundation/talawa.git + $ cd talawa + ``` +1. Install packages + ```sh + $ flutter pub get + ``` +1. Start developing! diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 000000000..d80865eef --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,46 @@ +include: package:lint/analysis_options.yaml + +analyzer: + exclude: [lib/generated_plugin_registrant.dart] + +linter: + rules: + # Make constructors the first thing in every class + sort_constructors_first: true + + # Use parameter order as in json response + always_put_required_named_parameters_first: false + + # Util classes + avoid_classes_with_only_static_members: false + + avoid_redundant_argument_values: false + + # Unnecessary use of this in constructors should not be done + unnecessary_this: false + + # source files name using lowercase_with_underscores + lowercase_with_underscores: true + + leading_newlines_in_multiline_strings: false + + always_declare_return_types: false + + type_annotate_public_apis: false + #always_use_package_imports to make a quick navigation to particular files + always_use_package_imports: true + + directives_ordering: true + + # In case of production should be set to true + avoid_print: false + + avoid_unnecessary_containers: false + + prefer_if_elements_to_conditional_expressions: false + + avoid_function_literals_in_foreach_calls: false + + join_return_with_assignment: false + + prefer_const_literals_to_create_immutables: false \ No newline at end of file diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 000000000..0a741cb43 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,11 @@ +gradle-wrapper.jar +/.gradle +/captures/ +/gradlew +/gradlew.bat +/local.properties +GeneratedPluginRegistrant.java + +# Remember to never publicly share your keystore. +# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app +key.properties diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 000000000..0cbd33251 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,59 @@ +def localProperties = new Properties() +def localPropertiesFile = rootProject.file('local.properties') +if (localPropertiesFile.exists()) { + localPropertiesFile.withReader('UTF-8') { reader -> + localProperties.load(reader) + } +} + +def flutterRoot = localProperties.getProperty('flutter.sdk') +if (flutterRoot == null) { + throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") +} + +def flutterVersionCode = localProperties.getProperty('flutter.versionCode') +if (flutterVersionCode == null) { + flutterVersionCode = '1' +} + +def flutterVersionName = localProperties.getProperty('flutter.versionName') +if (flutterVersionName == null) { + flutterVersionName = '1.0' +} + +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" + +android { + compileSdkVersion 30 + + sourceSets { + main.java.srcDirs += 'src/main/kotlin' + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId "com.example.talawa" + minSdkVersion 18 + targetSdkVersion 30 + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig signingConfigs.debug + } + } +} + +flutter { + source '../..' +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" +} diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 000000000..d1b4ad2aa --- /dev/null +++ b/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,9 @@ + + + + + + diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..127f9df3a --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/com/example/talawa/MainActivity.kt b/android/app/src/main/kotlin/com/example/talawa/MainActivity.kt new file mode 100644 index 000000000..7366da855 --- /dev/null +++ b/android/app/src/main/kotlin/com/example/talawa/MainActivity.kt @@ -0,0 +1,6 @@ +package com.example.talawa + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity: FlutterActivity() { +} diff --git a/android/app/src/main/res/drawable-night/launch_background.xml b/android/app/src/main/res/drawable-night/launch_background.xml new file mode 100644 index 000000000..81618253b --- /dev/null +++ b/android/app/src/main/res/drawable-night/launch_background.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable-night/launch_image.png b/android/app/src/main/res/drawable-night/launch_image.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebc349e694b05a2a2737c2d60ea5426d9687700 GIT binary patch literal 6438 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 + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/launch_background.xml b/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 000000000..8b8748cca --- /dev/null +++ b/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/launch_image.png b/android/app/src/main/res/drawable/launch_image.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebc349e694b05a2a2737c2d60ea5426d9687700 GIT binary patch literal 6438 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 + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..afb72e0566df691154d7699601e0e6a3e328343d GIT binary patch literal 2891 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..12fd512e057cdfc98ccccdfe58fbf823f78935c5 GIT binary patch literal 1832 zcmV+@2iN$CP)Nkl052AM$X+>{Mr<)v(_Afqdk-oD(|bIk9#_gu@1c+a`FL6biJ zG&z0FIls^M`+a`TbFQ*&+vfjxsBwVX?B2Kox7h&39k|f}8+2nE-P{x?V@%8{t^>Ap z>q7tA|2-fU5kM4IkQ{`*zr)};NXNh|gYtT)Yy_pC$PmQ=kjO}JJ%57k-$3kAHbyEF zCBqMq=}`X_n0S9tAqod@6g~MObngVS1dPCSVXz@Jl5wcv8!)N4Xb^<~IK`iT1>W5P z!OBcw*DT;Hi}Hb$%=~ZOkDzR7Q6LHc$Ywq@1V_FJiL0ReH!t4tLm-k-sA+9_g;Vxeg}a(9S{I%wKLnG=E45~fbN&z)HW9msLcK_XMIsxY5@*pcip~su;2PF zO4_IHK(`tS+fHK{VT=XO>P=3z58Ylp4(|Z^h1oODU)R8uQ{W2&{~01}$rPId$NVH_ zJW0!<1z47aVR%0$c?NL4L@)ObvTxfDc>Ggm029lyF|HF-FfA$Gw28+2Jo8!=aXZAC zZ?C4JqC!idGFG@Ao&g-?wr~42uO95+p$3CxjUQw9WY;yYadpto3!PPb zI1nNoA7u8Nxh!A4ydW1m0XW51gJb8y z{IM&-m6(r^U(QYj!^6X@Sh0eJh6c|Nt^u6rB$G)tZrn(3Z!e~4qOciBE6jw#z9&Ya zAx0z#SCry}&qvLXFjN0&K*-JjKQCV3@TU#5!V9-;PTmv}j@7c45y?gf(i9|@J zGdr+ECGCTQpNZ370xAtY!0)#yA6Cpi7{o|{osGNC=OY@8($dmGYip|~7hC~|`l8&0 z3m4e5Y11{`Ly8I{6vrEroUKn1iYr~H4w4P=fX(!iCilK;k_gzSY{DETR;^malqpkO zL%0SI+qZ1lLQhW*;c!^1FNOM3&|hismj#Jjao4vLnfJgOLCX6TDL;CixG*v@LTzm= z0-@vRq9eHmh{xl!x3|;L(SbM;3Wu?*G)5X-{FQ18fAZfk$sI&(NSaW6$zbl`0G1!^ zU~D9&A)1?;S+Zmafk0sF07fg?)z!uB-Mcya!TUsvFz4zmj?GNy7&#eN*&Wu-ejkY9 z5}(Gm157?+Fkp=^V|ty=|Fmh-T<-yT|M2qDqO*`wsTBKP+0UyT2Y9_HN;;5O}7IsExXSuDFVCsY#cFz9}!R)USF)P8t9UJ&?xHq>RMDhOQAWLhT*xdMa z&n~zI&^cBHhx(55)wh03nSX-Lc4py9_J{e|oRxg8x*-=SDfYGAqdfWcbCjDU*Id7v z9OC)eD_M9)V`h!GjFKyWOmq|pE2$MdJ9Lq-FQ7Y2M$sXb*3Q2{QOB{BM}Nw`i*M#2 zBr-88$>eY~yPDSONXa{#_M1CNDRwV^V11HJO%9 zBkArL>ElaB*6Vwuc#%Waj6`YqT`hd;?nm|J=*ES-0UY(k@?{+x=pMRARiG@V*yTi& z@7?z}Pu#iqrg?T;`1$*P;OX~vkpJc}aYqUFZc*@s>ya6(2vdk{^QLJBg zmi7yW2^fBz-TNbVv3*{fR#vGS`-%Sev~8{aW1T0Rrlo+_nXdf z<$&`9al*-}>;Z>9KF&jv=H^v|^O^bki*NGzI~w)E6&IuhyHVbGnI{0}=Fx4>P4^f* z*GuahtyDn(&bn~gXkHd%Cl#W4Q32c(Jr;8dc3>=ua`Vh_05@ul#oTcR#zIv$&-@n- WZNQ#&j~99X0000t5($N{!3E?Zw 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..133cc242f511119257dbaaaf1e286f98a8982f34 GIT binary patch literal 8266 zcmds7^;gu-_kO_=(%lV=Ql+RFJQmBrttTnd0O4vzX6}wR%>aOECPdz@ofSe0^y!t%mOBhVe zdG<3|vle^F>}8P=*(5P46F7PVH<>93iXpJPlh^tXbcipy_FVLGD=#Up@yN)~(qp3T z@jm47?$P*_zW#@+XV?a5s3`zU(Z`fKR|g6}Az@`4jDY#h0mVlOfKbx>9riQ8!2h=Y z4?2KGV331~3S_JV*ZZOXJ)n$o7yv74HRCn~pvSQPTf-tY<4- z&?)3JG_U%z!}Tt&V8%KWiSAmO9f{4^xHQ!pWlPtyCVvU#H*IH zTu<+rub4q$CD+96ov_njJZo!Amr3qY>K^C*H;R-^&XNdC`joTwRX|O8c9b?(J#~`q zoC!~!2<*QF+d;I6Vl*XiGArsFhE4)&&jzy#OC0 zLs0-eWLFwNU)`DbEK^BEqZq}AjneKR(!=~WL+EZN%56KSELh!DWf5VFSDHs)EnT!p z9F~6?ZP=4T@eFTrs_T7>n#Sv6-)+m_hw&5>knD-J`Q1^IbO(&qqD0GAgf-O&<0o*C4jm$EqC!IjidFhGV;D@QXie?Z24A#0uXG_OVs<#V zCCoA0R(L8>-I7-Z!&WH(`>vh5>%^~^Eqt?Tq;a_JyZxS|oMn)ATj4qHx$iX-3l7u43XiM;0e7Z|bkq&rpRga&$$FoZ9bfm2XWIlyvA3=jg(2Kht%13Z{t(g7z7004pZEr414l@yA%a|t#ii)8<^Y)j*ZXgWUT2v+S~F!1h$AxNWSIØ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 + #ffffff + #18191A + \ No newline at end of file diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..2ba34d5e4 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 000000000..bc151583f --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,29 @@ +buildscript { + ext.kotlin_version = '1.3.50' + repositories { + google() + jcenter() + } + + dependencies { + classpath 'com.android.tools.build:gradle:4.2.1' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + } +} + +allprojects { + repositories { + google() + jcenter() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 000000000..a5965ab8d --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,4 @@ +org.gradle.jvmargs=-Xmx1536M +android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true \ No newline at end of file diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..939efa295 --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Fri Jun 23 08:50:38 CEST 2017 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7.1-all.zip diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 000000000..44e62bcf0 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,11 @@ +include ':app' + +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() + +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } + +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/assets/fonts/OpenSans-Bold.ttf b/assets/fonts/OpenSans-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..efdd5e84a0397ecada7b9cfde51db87db08766bd GIT binary patch literal 104120 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

n{#NV($fZ=b2Ttd7 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 -Ui0>vvum!cQP#SwwX988o3plLZOz)* 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/OpenSans-Regular.ttf b/assets/fonts/OpenSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..29bfd35a2bfdd92b6e8b4ec2970f4d1eebf49357 GIT binary patch literal 96932 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

_T_kl)Xoan=RX{3lY#VQTZ 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 literal 0 HcmV?d00001 diff --git a/assets/fonts/OpenSans-SemiBold.ttf b/assets/fonts/OpenSans-SemiBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..54e7059cf36359cb5a3860085714a95306af0dea GIT binary patch literal 100820 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 DEZ%x^ literal 0 HcmV?d00001 diff --git a/assets/fonts/ProductSans-Bold.ttf b/assets/fonts/ProductSans-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..96619df92e347c5852b6c50d71c362e4404c4c3c GIT binary patch literal 92096 zcmcG%33wdEnKxe5b4xR$IW&jn?3tcJ(r9$dNSe`MX)If^Z26FE$(C$mOSZ7_*cc-l zYz~9LfQ>jpNWvzBBy51dLY9>wOB`~Mgb=bJ2_bCACgdQ=?y`Jg!;)i(gJ=G~s_v0S z!esaPp6@TIyZWeltLnY#t+(E45lRTL;iM+wz`*Fb6OX4qLg?NH@zl3!W&ePAxn(t> z)oXFTX4UY9OWyZ;*pyYT*_gy??0VN+8o-yrTFgg%1≤gS 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 F>3?g0VA}uy literal 0 HcmV?d00001 diff --git a/assets/fonts/ProductSans-Regular.ttf b/assets/fonts/ProductSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e2c69c3fb94651237de80e67a69d458c55b45649 GIT binary patch literal 109128 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 B-RJ-S literal 0 HcmV?d00001 diff --git a/assets/images/launcher_icon.png b/assets/images/launcher_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9ebc349e694b05a2a2737c2d60ea5426d9687700 GIT binary patch literal 6438 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

b_0lXN<=8}p{?D=dGm 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 literal 0 HcmV?d00001 diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 000000000..9d474a326 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# +# Talawa documentation build configuration file, created by +# sphinx-quickstart on Tue Oct 22 22:23:00 2019. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- General configuration ------------------------------------------------ + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['sphinxcontrib.fulltoc'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = 'Talawa' +copyright = '2019, Peter Harrison' +author = 'Peter Harrison' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = '' +# The full version, including alpha/beta/rc tags. +release = '' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = False + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] +html_favicon = '_static/talawa-rtd.png' +html_logo = '_static/talawa-rtd.png' + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# This is required for the alabaster theme +# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars +html_sidebars = { + '**': [ + 'globaltoc.html', + 'relations.html', # needs 'show_related': True theme option to display + 'searchbox.html', + ] +} + + +# -- Options for HTMLHelp output ------------------------------------------ + +# Output file base name for HTML help builder. +htmlhelp_basename = 'Talawadoc' + + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'Talawa.tex', 'Talawa Documentation', + 'Peter Harrison', 'manual'), +] + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'talawa', 'Talawa Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'Talawa', 'Talawa Documentation', + author, 'Talawa', 'One line description of project.', + 'Miscellaneous'), +] diff --git a/ios/.gitignore b/ios/.gitignore new file mode 100644 index 000000000..151026b91 --- /dev/null +++ b/ios/.gitignore @@ -0,0 +1,33 @@ +*.mode1v3 +*.mode2v3 +*.moved-aside +*.pbxuser +*.perspectivev3 +**/*sync/ +.sconsign.dblite +.tags* +**/.vagrant/ +**/DerivedData/ +Icon? +**/Pods/ +**/.symlinks/ +profile +xcuserdata +**/.generated/ +Flutter/App.framework +Flutter/Flutter.framework +Flutter/Flutter.podspec +Flutter/Generated.xcconfig +Flutter/ephemeral/ +Flutter/app.flx +Flutter/app.zip +Flutter/flutter_assets/ +Flutter/flutter_export_environment.sh +ServiceDefinitions.json +Runner/GeneratedPluginRegistrant.* + +# Exceptions to above rules. +!default.mode1v3 +!default.mode2v3 +!default.pbxuser +!default.perspectivev3 diff --git a/ios/Flutter/AppFrameworkInfo.plist b/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 000000000..9367d483e --- /dev/null +++ b/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 8.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 000000000..592ceee85 --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 000000000..592ceee85 --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1 @@ +#include "Generated.xcconfig" diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000..2fa683c03 --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,471 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 1020; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.example.talawa; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.example.talawa; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.example.talawa; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 000000000..f9b0d7c5e --- /dev/null +++ b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png new file mode 100644 index 0000000000000000000000000000000000000000..11d3da68998bbd2d99a109cd0b408ea79e9426f1 GIT binary patch literal 90654 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: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

ir7Tuy|ElSXw&A5|Z( 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 R3U2@a002ovPDHLkV1h@q_5lC@ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png new file mode 100644 index 0000000000000000000000000000000000000000..463b58b71d405ba18671b5317875a21d0b9d0c25 GIT binary patch literal 1504 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..73d3b7f6d --- /dev/null +++ b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1 @@ +{"images":[{"size":"60x60","expected-size":"180","filename":"180.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"40x40","expected-size":"80","filename":"80.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"40x40","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"60x60","expected-size":"120","filename":"120.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"57x57","expected-size":"57","filename":"57.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"58","filename":"58.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"29x29","expected-size":"29","filename":"29.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"1x"},{"size":"29x29","expected-size":"87","filename":"87.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"57x57","expected-size":"114","filename":"114.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"40","filename":"40.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"2x"},{"size":"20x20","expected-size":"60","filename":"60.png","folder":"Assets.xcassets/AppIcon.appiconset/","idiom":"iphone","scale":"3x"},{"size":"1024x1024","filename":"1024.png","expected-size":"1024","idiom":"ios-marketing","folder":"Assets.xcassets/AppIcon.appiconset/","scale":"1x"}]} \ No newline at end of file diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 zcmeHN2~<R zh`|8`A_PQ1nSu(UMFx?8j8PC!!VDphaL#`F42fd#7Vlc`zIE4n%Y~eiz4y1j|NDpi z?<@|pSJ-HM`qifhf@m%MamgwK83`XpBA<+azdF#2QsT{X@z0A9Bq>~TVErigKH1~P zRX-!h-f0NJ4Mh++{D}J+K>~~rq}d%o%+4dogzXp7RxX4C>Km5XEI|PAFDmo;DFm6G zzjVoB`@qW98Yl0Kvc-9w09^PrsobmG*Eju^=3f?0o-t$U)TL1B3;sZ^!++3&bGZ!o-*6w?;oOhf z=A+Qb$scV5!RbG+&2S}BQ6YH!FKb0``VVX~T$dzzeSZ$&9=X$3)_7Z{SspSYJ!lGE z7yig_41zpQ)%5dr4ff0rh$@ky3-JLRk&DK)NEIHecf9c*?Z1bUB4%pZjQ7hD!A0r-@NF(^WKdr(LXj|=UE7?gBYGgGQV zidf2`ZT@pzXf7}!NH4q(0IMcxsUGDih(0{kRSez&z?CFA0RVXsVFw3^u=^KMtt95q z43q$b*6#uQDLoiCAF_{RFc{!H^moH_cmll#Fc^KXi{9GDl{>%+3qyfOE5;Zq|6#Hb zp^#1G+z^AXfRKaa9HK;%b3Ux~U@q?xg<2DXP%6k!3E)PA<#4$ui8eDy5|9hA5&{?v z(-;*1%(1~-NTQ`Is1_MGdQ{+i*ccd96ab$R$T3=% zw_KuNF@vI!A>>Y_2pl9L{9h1-C6H8<)J4gKI6{WzGBi<@u3P6hNsXG=bRq5c+z;Gc3VUCe;LIIFDmQAGy+=mRyF++u=drBWV8-^>0yE9N&*05XHZpPlE zxu@?8(ZNy7rm?|<+UNe0Vs6&o?l`Pt>P&WaL~M&#Eh%`rg@Mbb)J&@DA-wheQ>hRV z<(XhigZAT z>=M;URcdCaiO3d^?H<^EiEMDV+7HsTiOhoaMX%P65E<(5xMPJKxf!0u>U~uVqnPN7T!X!o@_gs3Ct1 zlZ_$5QXP4{Aj645wG_SNT&6m|O6~Tsl$q?nK*)(`{J4b=(yb^nOATtF1_aS978$x3 zx>Q@s4i3~IT*+l{@dx~Hst21fR*+5}S1@cf>&8*uLw-0^zK(+OpW?cS-YG1QBZ5q! zgTAgivzoF#`cSz&HL>Ti!!v#?36I1*l^mkrx7Y|K6L#n!-~5=d3;K<;Zqi|gpNUn_ z_^GaQDEQ*jfzh;`j&KXb66fWEk1K7vxQIMQ_#Wu_%3 z4Oeb7FJ`8I>Px;^S?)}2+4D_83gHEq>8qSQY0PVP?o)zAv3K~;R$fnwTmI-=ZLK`= zTm+0h*e+Yfr(IlH3i7gUclNH^!MU>id$Jw>O?2i0Cila#v|twub21@e{S2v}8Z13( zNDrTXZVgris|qYm<0NU(tAPouG!QF4ZNpZPkX~{tVf8xY690JqY1NVdiTtW+NqyRP zZ&;T0ikb8V{wxmFhlLTQ&?OP7 z;(z*<+?J2~z*6asSe7h`$8~Se(@t(#%?BGLVs$p``;CyvcT?7Y!{tIPva$LxCQ&4W z6v#F*);|RXvI%qnoOY&i4S*EL&h%hP3O zLsrFZhv&Hu5tF$Lx!8(hs&?!Kx5&L(fdu}UI5d*wn~A`nPUhG&Rv z2#ixiJdhSF-K2tpVL=)5UkXRuPAFrEW}7mW=uAmtVQ&pGE-&az6@#-(Te^n*lrH^m@X-ftVcwO_#7{WI)5v(?>uC9GG{lcGXYJ~Q8q zbMFl7;t+kV;|;KkBW2!P_o%Czhw&Q(nXlxK9ak&6r5t_KH8#1Mr-*0}2h8R9XNkr zto5-b7P_auqTJb(TJlmJ9xreA=6d=d)CVbYP-r4$hDn5|TIhB>SReMfh&OVLkMk-T zYf%$taLF0OqYF?V{+6Xkn>iX@TuqQ?&cN6UjC9YF&%q{Ut3zv{U2)~$>-3;Dp)*(? zg*$mu8^i=-e#acaj*T$pNowo{xiGEk$%DusaQiS!KjJH96XZ-hXv+jk%ard#fu=@Q z$AM)YWvE^{%tDfK%nD49=PI|wYu}lYVbB#a7wtN^Nml@CE@{Gv7+jo{_V?I*jkdLD zJE|jfdrmVbkfS>rN*+`#l%ZUi5_bMS<>=MBDNlpiSb_tAF|Zy`K7kcp@|d?yaTmB^ zo?(vg;B$vxS|SszusORgDg-*Uitzdi{dUV+glA~R8V(?`3GZIl^egW{a919!j#>f` znL1o_^-b`}xnU0+~KIFLQ)$Q6#ym%)(GYC`^XM*{g zv3AM5$+TtDRs%`2TyR^$(hqE7Y1b&`Jd6dS6B#hDVbJlUXcG3y*439D8MrK!2D~6gn>UD4Imctb z+IvAt0iaW73Iq$K?4}H`7wq6YkTMm`tcktXgK0lKPmh=>h+l}Y+pDtvHnG>uqBA)l zAH6BV4F}v$(o$8Gfo*PB>IuaY1*^*`OTx4|hM8jZ?B6HY;F6p4{`OcZZ(us-RVwDx zUzJrCQlp@mz1ZFiSZ*$yX3c_#h9J;yBE$2g%xjmGF4ca z&yL`nGVs!Zxsh^j6i%$a*I3ZD2SoNT`{D%mU=LKaEwbN(_J5%i-6Va?@*>=3(dQy` zOv%$_9lcy9+(t>qohkuU4r_P=R^6ME+wFu&LA9tw9RA?azGhjrVJKy&8=*qZT5Dr8g--d+S8zAyJ$1HlW3Olryt`yE zFIph~Z6oF&o64rw{>lgZISC6p^CBer9C5G6yq%?8tC+)7*d+ib^?fU!JRFxynRLEZ zj;?PwtS}Ao#9whV@KEmwQgM0TVP{hs>dg(1*DiMUOKHdQGIqa0`yZnHk9mtbPfoLx zo;^V6pKUJ!5#n`w2D&381#5#_t}AlTGEgDz$^;u;-vxDN?^#5!zN9ngytY@oTv!nc zp1Xn8uR$1Z;7vY`-<*?DfPHB;x|GUi_fI9@I9SVRv1)qETbNU_8{5U|(>Du84qP#7 z*l9Y$SgA&wGbj>R1YeT9vYjZuC@|{rajTL0f%N@>3$DFU=`lSPl=Iv;EjuGjBa$Gw zHD-;%YOE@<-!7-Mn`0WuO3oWuL6tB2cpPw~Nvuj|KM@))ixuDK`9;jGMe2d)7gHin zS<>k@!x;!TJEc#HdL#RF(`|4W+H88d4V%zlh(7#{q2d0OQX9*FW^`^_<3r$kabWAB z$9BONo5}*(%kx zOXi-yM_cmB3>inPpI~)duvZykJ@^^aWzQ=eQ&STUa}2uT@lV&WoRzkUoE`rR0)`=l zFT%f|LA9fCw>`enm$p7W^E@U7RNBtsh{_-7vVz3DtB*y#*~(L9+x9*wn8VjWw|Q~q zKFsj1Yl>;}%MG3=PY`$g$_mnyhuV&~O~u~)968$0b2!Jkd;2MtAP#ZDYw9hmK_+M$ zb3pxyYC&|CuAbtiG8HZjj?MZJBFbt`ryf+c1dXFuC z0*ZQhBzNBd*}s6K_G}(|Z_9NDV162#y%WSNe|FTDDhx)K!c(mMJh@h87@8(^YdK$&d*^WQe8Z53 z(|@MRJ$Lk-&ii74MPIs80WsOFZ(NX23oR-?As+*aq6b?~62@fSVmM-_*cb1RzZ)`5$agEiL`-E9s7{GM2?(KNPgK1(+c*|-FKoy}X(D_b#etO|YR z(BGZ)0Ntfv-7R4GHoXp?l5g#*={S1{u-QzxCGng*oWr~@X-5f~RA14b8~B+pLKvr4 zfgL|7I>jlak9>D4=(i(cqYf7#318!OSR=^`xxvI!bBlS??`xxWeg?+|>MxaIdH1U~#1tHu zB{QMR?EGRmQ_l4p6YXJ{o(hh-7Tdm>TAX380TZZZyVkqHNzjUn*_|cb?T? zt;d2s-?B#Mc>T-gvBmQZx(y_cfkXZO~{N zT6rP7SD6g~n9QJ)8F*8uHxTLCAZ{l1Y&?6v)BOJZ)=R-pY=Y=&1}jE7fQ>USS}xP#exo57uND0i*rEk@$;nLvRB@u~s^dwRf?G?_enN@$t* zbL%JO=rV(3Ju8#GqUpeE3l_Wu1lN9Y{D4uaUe`g>zlj$1ER$6S6@{m1!~V|bYkhZA z%CvrDRTkHuajMU8;&RZ&itnC~iYLW4DVkP<$}>#&(`UO>!n)Po;Mt(SY8Yb`AS9lt znbX^i?Oe9r_o=?})IHKHoQGKXsps_SE{hwrg?6dMI|^+$CeC&z@*LuF+P`7LfZ*yr+KN8B4{Nzv<`A(wyR@!|gw{zB6Ha ziwPAYh)oJ(nlqSknu(8g9N&1hu0$vFK$W#mp%>X~AU1ay+EKWcFdif{% z#4!4aoVVJ;ULmkQf!ke2}3hqxLK>eq|-d7Ly7-J9zMpT`?dxo6HdfJA|t)?qPEVBDv z{y_b?4^|YA4%WW0VZd8C(ZgQzRI5(I^)=Ub`Y#MHc@nv0w-DaJAqsbEHDWG8Ia6ju zo-iyr*sq((gEwCC&^TYBWt4_@|81?=B-?#P6NMff(*^re zYqvDuO`K@`mjm_Jd;mW_tP`3$cS?R$jR1ZN09$YO%_iBqh5ftzSpMQQtxKFU=FYmP zeY^jph+g<4>YO;U^O>-NFLn~-RqlHvnZl2yd2A{Yc1G@Ga$d+Q&(f^tnPf+Z7serIU};17+2DU_f4Z z@GaPFut27d?!YiD+QP@)T=77cR9~MK@bd~pY%X(h%L={{OIb8IQmf-!xmZkm8A0Ga zQSWONI17_ru5wpHg3jI@i9D+_Y|pCqVuHJNdHUauTD=R$JcD2K_liQisqG$(sm=k9;L* z!L?*4B~ql7uioSX$zWJ?;q-SWXRFhz2Jt4%fOHA=Bwf|RzhwqdXGr78y$J)LR7&3T zE1WWz*>GPWKZ0%|@%6=fyx)5rzUpI;bCj>3RKzNG_1w$fIFCZ&UR0(7S?g}`&Pg$M zf`SLsz8wK82Vyj7;RyKmY{a8G{2BHG%w!^T|Njr!h9TO2LaP^_f22Q1=l$QiU84ao zHe_#{S6;qrC6w~7{y(hs-?-j?lbOfgH^E=XcSgnwW*eEz{_Z<_Px$?ny*JR5%f>l)FnDQ543{x%ZCiu33$Wg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9 zHfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr z)C01LsCxk=72-vXmX}CQD#BD;Cthymh&~=f$Q8nn0J<}ZrusBy4PvRNE}+1ceuj8u z0mW5k8fmgeLnTbWHGwfKA3@PdZxhn|PypR&^p?weGftrtCbjF#+zk_5BJh7;0`#Wr zgDpM_;Ax{jO##IrT`Oz;MvfwGfV$zD#c2xckpcXC6oou4ML~ezCc2EtnsQTB4tWNg z?4bkf;hG7IMfhgNI(FV5Gs4|*GyMTIY0$B=_*mso9Ityq$m^S>15>-?0(zQ<8Qy<_TjHE33(?_M8oaM zyc;NxzRVK@DL6RJnX%U^xW0Gpg(lXp(!uK1v0YgHjs^ZXSQ|m#lV7ip7{`C_J2TxPmfw%h$|%acrYHt)Re^PB%O&&=~a zhS(%I#+V>J-vjIib^<+s%ludY7y^C(P8nmqn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i z!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^0;J00)_^G=au=8Yo;1b`CV&@#=jIBo zjN^JNVfYSs)+kDdGe7`1&8!?MQYKS?DuHZf3iogk_%#9E|5S zWeHrmAo>P;ejX7mwq#*}W25m^ZI+{(Z8fI?4jM_fffY0nok=+88^|*_DwcW>mR#e+ zX$F_KMdb6sRz!~7KkyN0G(3XQ+;z3X%PZ4gh;n-%62U<*VUKNv(D&Q->Na@Xb&u5Q3`3DGf+a8O5x7c#7+R+EAYl@R5us)CIw z7sT@_y~Ao@uL#&^LIh&QceqiT^+lb0YbFZt_SHOtWA%mgPEKVNvVgCsXy{5+zl*X8 zCJe)Q@y>wH^>l4;h1l^Y*9%-23TSmE>q5nI@?mt%n;Sj4Qq`Z+ib)a*a^cJc%E9^J zB;4s+K@rARbcBLT5P=@r;IVnBMKvT*)ew*R;&8vu%?Z&S>s?8?)3*YawM0P4!q$Kv zMmKh3lgE~&w&v%wVzH3Oe=jeNT=n@Y6J6TdHWTjXfX~-=1A1Bw`EW8rn}MqeI34nh zexFeA?&C3B2(E?0{drE@DA2pu(A#ElY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEU zghdWK)^71EWCP(@(=c4kfH1Y(4iugD4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ! z)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup8IOUx8D4uh&(=O zx-7$a;U><*5L^!%xRlw)vAbh;sdlR||& ze}8_8%)c2Fwy=F&H|LM+p{pZB5DKTx>Y?F1N%BlZkXf!}JeGuMZk~LPi7{cidvUGB zAJ4LVeNV%XO>LTrklB#^-;8nb;}6l;1oW&WS=Mz*Az!4cqqQzbOSFq`$Q%PfD7srM zpKgP-D_0XPTRX*hAqeq0TDkJ;5HB1%$3Np)99#16c{ zJImlNL(npL!W|Gr_kxl1GVmF5&^$^YherS7+~q$p zt}{a=*RiD2Ikv6o=IM1kgc7zqpaZ;OB)P!1zz*i3{U()Dq#jG)egvK}@uFLa`oyWZ zf~=MV)|yJn`M^$N%ul5);JuQvaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$ tNIIaX+dr)NRWXcxoR{>fqI{SF_dm1Ylv~=3YHI)h002ovPDHLkV1g(pWS;;4 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..f091b6b0bca859a3f474b03065bef75ba58a9e4c GIT binary patch literal 1588 zcmV-42Fv-0P)C1SqPt}wig>|5Crh^=oyX$BK<}M8eLU3e2hGT;=G|!_SP)7zNI6fqUMB=)y zRAZ>eDe#*r`yDAVgB_R*LB*MAc)8(b{g{9McCXW!lq7r(btRoB9!8B-#AI6JMb~YFBEvdsV)`mEQO^&#eRKx@b&x- z5lZm*!WfD8oCLzfHGz#u7sT0^VLMI1MqGxF^v+`4YYnVYgk*=kU?HsSz{v({E3lb9 z>+xILjBN)t6`=g~IBOelGQ(O990@BfXf(DRI5I$qN$0Gkz-FSc$3a+2fX$AedL4u{ z4V+5Ong(9LiGcIKW?_352sR;LtDPmPJXI{YtT=O8=76o9;*n%_m|xo!i>7$IrZ-{l z-x3`7M}qzHsPV@$v#>H-TpjDh2UE$9g6sysUREDy_R(a)>=eHw-WAyfIN z*qb!_hW>G)Tu8nSw9yn#3wFMiLcfc4pY0ek1}8(NqkBR@t4{~oC>ryc-h_ByH(Cg5 z>ao-}771+xE3um9lWAY1FeQFxowa1(!J(;Jg*wrg!=6FdRX+t_<%z&d&?|Bn){>zm zZQj(aA_HeBY&OC^jj*)N`8fa^ePOU72VpInJoI1?`ty#lvlNzs(&MZX+R%2xS~5Kh zX*|AU4QE#~SgPzOXe9>tRj>hjU@c1k5Y_mW*Jp3fI;)1&g3j|zDgC+}2Q_v%YfDax z!?umcN^n}KYQ|a$Lr+51Nf9dkkYFSjZZjkma$0KOj+;aQ&721~t7QUKx61J3(P4P1 zstI~7-wOACnWP4=8oGOwz%vNDqD8w&Q`qcNGGrbbf&0s9L0De{4{mRS?o0MU+nR_! zrvshUau0G^DeMhM_v{5BuLjb#Hh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG z;P%vktHcXwTj~+IE(~px)3*MY77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC z(zYC$g|@+I+kY;dg_dE>scBf&bP1Nc@Hz<3R)V`=AGkc;8CXqdi=B4l2k|g;2%#m& z*jfX^%b!A8#bI!j9-0Fi0bOXl(-c^AB9|nQaE`*)Hw+o&jS9@7&Gov#HbD~#d{twV zXd^Tr^mWLfFh$@Dr$e;PBEz4(-2q1FF0}c;~B5sA}+Q>TOoP+t>wf)V9Iy=5ruQa;z)y zI9C9*oUga6=hxw6QasLPnee@3^Rr*M{CdaL5=R41nLs(AHk_=Y+A9$2&H(B7!_pURs&8aNw7?`&Z&xY_Ye z)~D5Bog^td-^QbUtkTirdyK^mTHAOuptDflut!#^lnKqU md>ggs(5nOWAqO?umG&QVYK#ibz}*4>0000U6E9hRK9^#O7(mu>ETqrXGsduA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnbRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yI zC*%Wgg22K|8E#!~cTNYR~@Y9KepMPrrB8cABapAFa=`H+UGhkXUZV1GnwR1*lPyZ;*K(i~2gp|@bzp8}og7e*#% zEnr|^CWdVV!-4*Y_7rFvlww2Ze+>j*!Z!pQ?2l->4q#nqRu9`ELo6RMS5=br47g_X zRw}P9a7RRYQ%2Vsd0Me{_(EggTnuN6j=-?uFS6j^u69elMypu?t>op*wBx<=Wx8?( ztpe^(fwM6jJX7M-l*k3kEpWOl_Vk3@(_w4oc}4YF4|Rt=2V^XU?#Yz`8(e?aZ@#li0n*=g^qOcVpd-Wbok=@b#Yw zqn8u9a)z>l(1kEaPYZ6hwubN6i<8QHgsu0oE) ziJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+&KI9y^);#0qt}t-$C|Bo71lHi{_+lg#f%RFy z0um=e3$K3i6K{U_4K!EX?F&rExl^W|G8Z8;`5z-k}OGNZ0#WVb$WCpQu-_YsiqKP?BB# vzVHS-CTUF4Ozn5G+mq_~Qqto~ahA+K`|lyv3(-e}00000NkvXXu0mjfd`9t{ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d0ef06e7edb86cdfe0d15b4b0d98334a86163658 GIT binary patch literal 1716 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f9ed8f5cee1c98386d13b17e89f719e83555b2 GIT binary patch literal 1895 zcmV-t2blPYP)FQtfgmafE#=YDCq`qUBt#QpG%*H6QHY765~R=q zZ6iudfM}q!Pz#~9JgOi8QJ|DSu?1-*(kSi1K4#~5?#|rh?sS)(-JQqX*}ciXJ56_H zdw=^s_srbAdqxlvGyrgGet#6T7_|j;95sL%MtM;q86vOxKM$f#puR)Bjv9Zvz9-di zXOTSsZkM83)E9PYBXC<$6(|>lNLVBb&&6y{NByFCp%6+^ALR@NCTse_wqvNmSWI-m z!$%KlHFH2omF!>#%1l3LTZg(s7eof$7*xB)ZQ0h?ejh?Ta9fDv59+u#MokW+1t8Zb zgHv%K(u9G^Lv`lh#f3<6!JVTL3(dCpxHbnbA;kKqQyd1~^Xe0VIaYBSWm6nsr;dFj z4;G-RyL?cYgsN1{L4ZFFNa;8)Rv0fM0C(~Tkit94 zz#~A)59?QjD&pAPSEQ)p8gP|DS{ng)j=2ux)_EzzJ773GmQ_Cic%3JJhC0t2cx>|v zJcVusIB!%F90{+}8hG3QU4KNeKmK%T>mN57NnCZ^56=0?&3@!j>a>B43pi{!u z7JyDj7`6d)qVp^R=%j>UIY6f+3`+qzIc!Y_=+uN^3BYV|o+$vGo-j-Wm<10%A=(Yk^beI{t%ld@yhKjq0iNjqN4XMGgQtbKubPM$JWBz}YA65k%dm*awtC^+f;a-x4+ddbH^7iDWGg&N0n#MW{kA|=8iMUiFYvMoDY@sPC#t$55gn6ykUTPAr`a@!(;np824>2xJthS z*ZdmT`g5-`BuJs`0LVhz+D9NNa3<=6m;cQLaF?tCv8)zcRSh66*Z|vXhG@$I%U~2l z?`Q zykI#*+rQ=z6Jm=Bui-SfpDYLA=|vzGE(dYm=OC8XM&MDo7ux4UF1~0J1+i%aCUpRe zt3L_uNyQ*cE(38Uy03H%I*)*Bh=Lb^Xj3?I^Hnbeq72(EOK^Y93CNp*uAA{5Lc=ky zx=~RKa4{iTm{_>_vSCm?$Ej=i6@=m%@VvAITnigVg{&@!7CDgs908761meDK5azA} z4?=NOH|PdvabgJ&fW2{Mo$Q0CcD8Qc84%{JPYt5EiG{MdLIAeX%T=D7NIP4%Hw}p9 zg)==!2Lbp#j{u_}hMiao9=!VSyx0gHbeCS`;q&vzeq|fs`y&^X-lso(Ls@-706qmA z7u*T5PMo_w3{se1t2`zWeO^hOvTsohG_;>J0wVqVe+n)AbQCx)yh9;w+J6?NF5Lmo zecS@ieAKL8%bVd@+-KT{yI|S}O>pYckUFs;ry9Ow$CD@ztz5K-*D$^{i(_1llhSh^ zEkL$}tsQt5>QA^;QgjgIfBDmcOgi5YDyu?t6vSnbp=1+@6D& z5MJ}B8q;bRlVoxasyhcUF1+)o`&3r0colr}QJ3hcSdLu;9;td>kf@Tcn<@9sIx&=m z;AD;SCh95=&p;$r{Xz3iWCO^MX83AGJ(yH&eTXgv|0=34#-&WAmw{)U7OU9!Wz^!7 zZ%jZFi@JR;>Mhi7S>V7wQ176|FdW2m?&`qa(ScO^CFPR80HucLHOTy%5s*HR0^8)i h0WYBP*#0Ks^FNSabJA*5${_#%002ovPDHLkV1oKhTl@e3 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6d6b8609df07bf62e5100a53a01510388bd2b22 GIT binary patch literal 2665 zcmV-v3YPVWP)oFh3q0MFesq&64WThn3$;G69TfjsAv=f2G9}p zgSx99+!YV6qME!>9MD13x)k(+XE7W?_O4LoLb5ND8 zaV{9+P@>42xDfRiYBMSgD$0!vssptcb;&?u9u(LLBKmkZ>RMD=kvD3h`sk6!QYtBa ztlZI#nu$8lJ^q2Z79UTgZe>BU73(Aospiq+?SdMt8lDZ;*?@tyWVZVS_Q7S&*tJaiRlJ z+aSMOmbg3@h5}v;A*c8SbqM3icg-`Cnwl;7Ts%A1RkNIp+Txl-Ckkvg4oxrqGA5ewEgYqwtECD<_3Egu)xGllKt&J8g&+=ac@Jq4-?w6M3b*>w5 z69N3O%=I^6&UL5gZ!}trC7bUj*12xLdkNs~Bz4QdJJ*UDZox2UGR}SNg@lmOvhCc~ z*f_UeXv(=#I#*7>VZx2ObEN~UoGUTl=-@)E;YtCRZ>SVp$p9yG5hEFZ!`wI!spd)n zSk+vK0Vin7FL{7f&6OB%f;SH22dtbcF<|9fi2Fp%q4kxL!b1#l^)8dUwJ zwEf{(wJj@8iYDVnKB`eSU+;ml-t2`@%_)0jDM`+a46xhDbBj2+&Ih>1A>6aky#(-SYyE{R3f#y57wfLs z6w1p~$bp;6!9DX$M+J~S@D6vJAaElETnsX4h9a5tvPhC3L@qB~bOzkL@^z0k_hS{T4PF*TDrgdXp+dzsE? z>V|VR035Pl9n5&-RePFdS{7KAr2vPOqR9=M$vXA1Yy5>w;EsF`;OK{2pkn-kpp9Pw z)r;5JfJKKaT$4qCb{TaXHjb$QA{y0EYy*+b1XI;6Ah- zw13P)xT`>~eFoJC!>{2XL(a_#upp3gaR1#5+L(Jmzp4TBnx{~WHedpJ1ch8JFk~Sw z>F+gN+i+VD?gMXwcIhn8rz`>e>J^TI3E-MW>f}6R-pL}>WMOa0k#jN+`RyUVUC;#D zg|~oS^$6%wpF{^Qr+}X>0PKcr3Fc&>Z>uv@C);pwDs@2bZWhYP!rvGx?_|q{d`t<*XEb#=aOb=N+L@CVBGqImZf&+a zCQEa3$~@#kC);pasdG=f6tuIi0PO-y&tvX%>Mv=oY3U$nD zJ#gMegnQ46pq+3r=;zmgcG+zRc9D~c>z+jo9&D+`E6$LmyFqlmCYw;-Zooma{sR@~ z)_^|YL1&&@|GXo*pivH7k!msl+$Sew3%XJnxajt0K%3M6Bd&YFNy9}tWG^aovK2eX z1aL1%7;KRDrA@eG-Wr6w+;*H_VD~qLiVI`{_;>o)k`{8xa3EJT1O_>#iy_?va0eR? zDV=N%;Zjb%Z2s$@O>w@iqt!I}tLjGk!=p`D23I}N4Be@$(|iSA zf3Ih7b<{zqpDB4WF_5X1(peKe+rASze%u8eKLn#KKXt;UZ+Adf$_TO+vTqshLLJ5c z52HucO=lrNVae5XWOLm!V@n-ObU11!b+DN<$RuU+YsrBq*lYT;?AwJpmNKniF0Q1< zJCo>Q$=v$@&y=sj6{r!Y&y&`0$-I}S!H_~pI&2H8Z1C|BX4VgZ^-! zje3-;x0PBD!M`v*J_)rL^+$<1VJhH*2Fi~aA7s&@_rUHYJ9zD=M%4AFQ`}k8OC$9s XsPq=LnkwKG00000NkvXXu0mjfhAk5^ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..75b2d164a5a98e212cca15ea7bf2ab5de5108680 GIT binary patch literal 3831 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..c4df70d39da7941ef3f6dcb7f06a192d8dcb308d GIT binary patch literal 1888 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 iW8LDI5tB{+ Q0fiYnUHx3vIVCg!0BB+iu>b%7 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 000000000..00cabce83 --- /dev/null +++ b/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "filename" : "LaunchImage.png", + "idiom" : "universal", + "scale" : "1x" + }, + { + "filename" : "LaunchImage@2x.png", + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "LaunchImage@3x.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..67774cf3dacac0ad161013438381c330272b67f7 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}blZci7-kP61+L + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 000000000..fc9053c34 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + talawa + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + UIStatusBarHidden + + + \ No newline at end of file diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 000000000..308a2a560 --- /dev/null +++ b/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/issue-guidelines.md b/issue-guidelines.md new file mode 100644 index 000000000..06be31f47 --- /dev/null +++ b/issue-guidelines.md @@ -0,0 +1,15 @@ +# Issue Report Guidelines + +:+1::tada: First off, thanks for taking the time to contribute! :tada::+1: + +In order to give everyone a chance to submit a issues reports and contribute to the Talawa project, we have put restrictions in place. This section outlines the guidelines that should be imposed upon issue reports in the Talawa project. + +1. Use the [GitHub open issue search](https://github.com/PalisadoesFoundation/talawa/issues) — check if the issue has already been reported. +2. If the issue is already reported and not assigned to anyone, if you are interested to work on the issue then ask mentors to assign it to you in #talawa slack channel. +3. Check if the issue has been fixed — try to reproduce it using the latest master or development branch in the repository. +4. For newly found unfixed issues or features: + 1. Start discussing it in #gsoc-newissues channel with mentors + 2. Please do not derail or troll issues. + 3. Keep the discussion on topic and respect the opinions of others. +6. After mentor approval you can create a new issue by following [issue template](https://github.com/PalisadoesFoundation/talawa/blob/master/.github/ISSUE_TEMPLATE/issue-template.md) available here. +7. Feature requests are welcome. But take a moment to find out whether your idea fits with the scope and aims of the project. It's up to you to make a strong case to convince the mentors of the merits of this feature. Please provide as much detail and context as possible. diff --git a/lang/en.json b/lang/en.json new file mode 100644 index 000000000..1ba2c7382 --- /dev/null +++ b/lang/en.json @@ -0,0 +1,156 @@ +{ + "Hello": "Hello", + "User Name": "User Name", + "we've": "we've", + "got you covered": "got you covered", + "password": "password", + "Enter new password": "Enter new password", + "Re-Enter your password": "Re-Enter your password", + "Change Password": "Change Password", + "Email Hint": "test@test.org", + "Enter your registered Email": "Enter your registered Email", + "Enter your password": "Enter your password", + "Forgot password": "Forgot password", + "Login": "Login", + "Sit back relax, we'll": "Sit back relax, we'll", + "Recover": "Recover", + "your password": "your password", + "Recover Password": "Recover Password", + "Select Language": "Select Language", + "Default": "Default", + "Select": "Select", + "Selected Organization": "Selected Organization", + "Continue": "Continue", + "Enter Organization URL": "Enter Organization URL", + "Verify": "Verify", + "Sign Up": "Sign Up", + "Change language": "Change language", + "First Name Hint": "John", + "Enter your first name": "Enter your first name", + "Last Name Hint": "Carlos", + "Enter your last name": "Enter your last name", + "Confirm your password": "Confirm your password", + "Next": "Next", + "Request Sent to": "Request Sent to", + "Log out": "Log out", + + "Join": "Join", + "and": "and", + "Collaborate": "Collaborate", + "with your": "with your", + "Organizations": "Organizations", + + "Title from the viewMode GSoC branch": "Title from the viewMode GSoC branch", + "Please verify URL first": "Please verify URL first", + "Enter a valid URL": "Enter a valid URL", + "Firstname must not be left blank.": "Firstname must not be left blank.", + "Invalid Firstname": "Invalid Firstname", + "Lastname must not be left blank.": "Lastname must not be left blank.", + "Invalid Lastname": "Invalid Lastname", + "Email must not be left blank": "Email must not be left blank", + "Please enter a valid Email Address": "Please enter a valid Email Address", + "Password must not be left blank": "Password must not be left blank", + "Invalid Password": "Invalid Password", + "Password must not contain spaces": "Password must not contain spaces", + "Password does not match original": "Password does not match original", + "Join Organisation": "Join Organisation", + + "We're": "We're", + "Glad": "Glad", + "you're": "you're", + "Back": "Back", + + "Let's": "Let's", + "get": "get", + "you": "you", + "SignUp": "SignUp", + + "Add Event Title": "Add Event Title", + "Where is the event": "Where is the event", + "Add Location": "Add Location", + "Describe the event": "Describe the event", + "Add Description": "Add Description", + "Add Event": "Add Event", + "Add": "Add", + "Add Image": "Add Image", + "Select Start Date and Time": "Select Start Date and Time", + "Select End Date and Time": "Select End Date and Time", + "Does not repeat": "Does not repeat", + "Keep Public": "Keep Public", + "Keep Registerable": "Keep Registerable", + "Event Details": "Event Details", + "Register": "Register", + "Created by": "Created by", + "public": "public", + "private": "private", + "Description": "Description", + "Admins": "Admins", + "Attendees": "Attendees", + "See all": "See all", + "Start Date": "Start Date", + "End Date": "End Date", + "Cancel": "Cancel", + "Done": "Done", + "Explore Events": "Explore Events", + "Add Date": "Add Date", + "Event": "Event", + "My Events": "My Events", + "Public Events": "Public Events", + "Private Events": "Private Events", + "Liked by": "Liked by", + "Comments": "Comments", + "FirstName LastName": "FirstName LastName", + "Pinned Posts": "Pinned Posts", + "Profile": "Profile", + "Email": "Email", + "Update": "Update", + "App Settings": "App Settings", + "Language": "Language", + "dark mode": "dark mode", + "font size": "font size", + "Help": "Help", + "Reach out to us for help": "Reach out to us for help", + "Donate Us": "Donate Us", + "Help us to develop for you": "Help us to develop for you", + "Log out from Talawa": "Log out from Talawa", + "Share News": "Share News", + "Post": "Post", + "Organization Name": "Organization Name", + "Add hasthtag": "Add hasthtag", + "Write here what do you want to share": "Write here what do you want to share", + "Join selected organisation": "Join selected organisation", + "Home": "Home", + "Events": "Events", + "Chat": "Chat", + "Chat Screen": "Chat Screen", + "Confirm": "Confirm", + "Confirmation": "Confirmation", + "Close": "Close", + "Switch Organization": "Switch Organization", + "Join new Organization": "Join new Organization", + "Leave Current Organization": "Leave Current Organization", + "Creator": "Creator", + "Public": "Public", + "Private": "Private", + "No Internet": "No Internet", + "Subscribed": "Subscribed", + "from": "from", + "See all Pinned news": "See all Pinned news", + "show more": "show more", + "show less": "show less", + "Likes": "Likes", + "comments": "comments", + "Final": "Final", + "Enter Details": "Enter Details", + "Select\nOrganization": "Select\nOrganization", + "already selected": "already selected", + "Switched to": "Switched to", + "Organisation already joined": "Organisation already joined", + "Membership request already sent": "Membership request already sent", + "Select one organization to continue": "Select one organization to continue", + "SomeThing went wrong": "SomeThing went wrong", + "Join in request sent to": "Join in request sent to", + "successfully": "successfully", + "Are you sure you want to logout?": "Are you sure you want to logout?", + "Logout": "Logout" +} \ No newline at end of file diff --git a/lang/es.json b/lang/es.json new file mode 100644 index 000000000..c6ff442be --- /dev/null +++ b/lang/es.json @@ -0,0 +1,151 @@ +{ + "Hello": "hola", + "User Name": "Nombre de usuario", + "we've": "tenemos", + "got you covered": "te cubrió", + "password": "contraseña", + "Enter new password": "Introduzca nueva contraseña", + "Re-Enter your password": "Vuelva a ingresar su contraseña", + "Change Password": "Cambiar contraseña", + "Email Hint": "test@test.org", + "Enter your registered Email": "Ingrese su correo electrónico registrado", + "Enter your password": "Ingresa tu contraseña", + "Forgot password": "¿Olvidaste la contraseña?", + "Login": "Acceso", + "Sit back relax, we'll": "Siéntese, ", + "Recover": "", + "your password": "relájese, recuperaremos su contraseña", + "Recover Password": "Recupera tu contraseña", + "Select Language": "Seleccione el idioma", + "Default": "Valor por defecto", + "Select": "Seleccione", + "Selected Organization": "Organización seleccionada", + "Continue": "Continuar", + "Enter Organization URL": "Ingrese la URL de la organización", + "Verify": "Verificarlo", + "Sign Up": "Inscribirse", + "Change language": "Cambiar idioma", + "First Name Hint": "Isabela", + "Enter your first name": "Ponga su primer nombre", + "Last Name Hint": "Rossellini", + "Enter your last name": "Ingrese su apellido", + "Confirm your password": "Confirmar la contraseña", + "Next": "Próximo", + "Request Sent to": "Solicitud enviada a", + "Log out": "Cerrar sesión", + "Join": "Únase", + "and": "y", + "Collaborate": "colabore", + "with your": "con sus", + "Organizations": "organizaciones", + "Title from the viewMode GSoC branch": "Título de la rama viewMode GSoC", + "Please verify URL first": "Primero verifique la URL", + "Enter a valid URL": "Ingrese una URL válida", + "Firstname must not be left blank.": "El nombre no debe dejarse en blanco.", + "Invalid Firstname": "Nombre inválido", + "Lastname must not be left blank.": "El apellido no debe dejarse en blanco.", + "Invalid Lastname": "Apellido inválido", + "Email must not be left blank": "El correo electrónico no debe dejarse en blanco", + "Please enter a valid Email Address": "Por favor, introduce una dirección de correo electrónico válida", + "Password must not be left blank": "La contraseña no debe dejarse en blanco", + "Invalid Password": "Contraseña invalida", + "Password must not contain spaces": "La contraseña no debe contener espacios", + "Password does not match original": "La contraseña no coincide con la original", + "Join Organisation": "Unirse a la organización", + "We're": "Nos", + "Glad": "alegra que", + "you're": "hayas", + "Back": "vuelto", + "Let's": "Consigamos", + "get": "que", + "you": "te", + "SignUp": "registres", + "Add Event Title": "Agregar título de evento", + "Where is the event": "Donde es el evento", + "Add Location": "Añadir lugar", + "Describe the event": "Describe el evento", + "Add Description": "Agregar descripción", + "Add Event": "Añadir evento", + "Add": "Agregarlo", + "Add Image": "Añadir imagen", + "Select Start Date and Time": "Seleccione la fecha y hora de inicio", + "Select End Date and Time": "Seleccione la fecha y hora de finalización", + "Does not repeat": "No se repite", + "Keep Public": "Mantener pública", + "Keep Registerable": "Mantener registrable", + "Event Details": "Detalles del evento", + "Register": "Registrarse", + "Created by": "Creado por", + "public": "pública", + "private": "privada", + "Description": "Descripción", + "Admins": "Administradoras", + "Attendees": "Asistentes", + "See all": "Ver todo", + "Start Date": "Fecha de inicio", + "End Date": "Fecha final", + "Cancel": "Cancelar", + "Done": "Hecho", + "Explore Events": "Explorar eventos", + "Add Date": "Agregar fecha", + "Event": "Evento", + "My Events": "Mis Eventos", + "Public Events": "Eventos publicos", + "Private Events": "Eventos privados", + "Liked by": "Apreciado por", + "Comments": "Comentarios", + "FirstName LastName": "Nombre Apellido", + "Pinned Posts": "Puestos fijadas", + "Profile": "Perfil", + "Email": "Correo electrónico", + "Update": "Actualizar", + "App Settings": "Ajustes de Aplicacion", + "Language": "Idioma", + "dark mode": "modo oscuro", + "font size": "tamaño de fuente", + "Help": "Ayudar", + "Reach out to us for help": "Comuníquese con nosotros para obtener ayuda", + "Donate Us": "Donarnos", + "Help us to develop for you": "Ayúdanos a desarrollar para ti", + "Log out from Talawa": "Cerrar sesión en Talawa", + "Share News": "Compartir noticias", + "Post": "Correo", + "Organization Name": "Nombre de la Organización", + "Add hasthtag": "Agregar hashtag", + "Write here what do you want to share": "Escribe aquí lo que quieres compartir", + "Join selected organisation": "Unirse a la organización seleccionada", + "Home": "Casa", + "Events": "Eventos", + "Chat": "Chat", + "Chat Screen": "Pantalla de chat", + "Confirm": "Confirmar", + "Confirmation": "Confirmación", + "Close": "Cerca", + "Switch Organization": "Cambiar de organización", + "Join new Organization": "Unirse a una nueva organización", + "Leave Current Organization": "Dejar la organización actual", + "Creator": "Creadora", + "Public": "Pública", + "Private": "Privada", + "No Internet": "No Internet", + "Subscribed": "Suscrita", + "from": "de", + "See all Pinned news": "Ver todas las noticias fijadas", + "show more": "mostrar más", + "show less": "Muestra menos", + "Likes": "Gustos", + "comments": "comentarios", + "Final": "Final", + "Enter Details": "Ingrese detalles", + "Select\nOrganization": "Seleccione\nOrganización", + "already selected": "ya seleccionado", + "Switched to": "Cambiado a", + "Organisation already joined": "Organización ya unida", + "Membership request already sent": "Solicitud de membresía ya enviada", + "Select one organization to continue": "Seleccione una organización para continuar", + "SomeThing went wrong": "Algo salió mal", + "Join in request sent to": "Únase a la solicitud enviada a", + "successfully": "exitosamente", + "Are you sure you want to logout?": "¿Estás segura de que quieres cerrar sesión?", + "Logout": "Cerrar sesión" +} \ No newline at end of file diff --git a/lang/fr.json b/lang/fr.json new file mode 100644 index 000000000..457ade942 --- /dev/null +++ b/lang/fr.json @@ -0,0 +1,155 @@ +{ + "Hello": "Bonjour", + "User Name": "Nom d'utilisateur", + "we've": "on a", + "got you covered": "vous a couvert", + "password": "le mot de passe", + "Enter new password": "Entrez un nouveau mot de passe", + "Re-Enter your password": "Entrez à nouveau votre mot de passe", + "Change Password": "Changer le mot de passe", + + "Email Hint": "test@test.org", + "Enter your registered Email": "Entrez votre email enregistré", + "Enter your password": "Tapez votre mot de passe", + "Forgot password": "Mot de passe oublié", + "Login": "Connexion", + "Sit back relax, we'll": "Asseyez-vous, détendez-vous, nous récupérerons", + "Recover": "votre mot", + "your password": "de passe", + "Recover Password": "Récupérer mot de passe", + "Select Language": "Choisir la langue", + "Default": "Défaut", + "Select": "Sélectionner", + "Selected Organization": "Organisation sélectionnée", + "Continue": "Continuer", + "Enter Organization URL": "Saisissez l'URL de l'organisation", + "Verify": "Vérifier", + "Sign Up": "S'inscrire", + "Change language": "Changer de langue", + "First Name Hint": "John", + "Enter your first name": "Entrez votre prénom", + "Last Name Hint": "Carlos", + "Enter your last name": "Entrez votre nom de famille", + "Confirm your password": "Confirmer votre mot de passe", + "Next": "Suivante", + "Request Sent to": "Demande envoyée à", + "Log out": "Se déconnecter", + + "Join": "Rejoignez", + "and": "et", + "Collaborate": "collaborez", + "with your": "avec vos", + "Organizations": "organisations", + + "Title from the viewMode GSoC branch": "Titre de la branche viewMode GSoC", + "Please verify URL first": "Veuillez d'abord vérifier l'URL", + "Enter a valid URL": "Saisissez une URL valide", + "Firstname must not be left blank.": "Le prénom ne doit pas être laissé en blanc.", + "Invalid Firstname": "Prénom invalide", + "Lastname must not be left blank.": "Le nom de famille ne doit pas être laissé vide.", + "Invalid Lastname": "Nom de famille invalide", + "Email must not be left blank": "L'e-mail ne doit pas être laissé vide", + "Please enter a valid Email Address": "S'il vous plaît, mettez une adresse email valide", + "Password must not be left blank": "Le mot de passe ne doit pas être laissé vide", + "Invalid Password": "Mot de passe incorrect", + "Password must not contain spaces": "Le mot de passe ne doit pas contenir d'espaces", + "Password does not match original": "Le mot de passe ne correspond pas à l'original", + "Join Organisation": "Rejoindre l'organisation", + + "We're": "Nous sommes", + "Glad": "heureux que vous", + "you're": "soyez de", + "Back": "retour", + "Let's": "Laissez-nous vous inscrire", + "get": "", + "you": "vous", + "SignUp": "inscrire", + "Add Event Title": "Ajouter le titre de l'événement", + "Where is the event": "Où est l'événement", + "Add Location": "Ajouter un emplacement", + "Describe the event": "Décrivez l'événement", + "Add Description": "Ajouter une description", + "Add Event": "Ajouter un évènement", + "Add": "Ajoutez-le", + "Add Image": "Ajouter une image", + "Select Start Date and Time": "Sélectionnez la date et l'heure de début", + "Select End Date and Time": "Sélectionnez la date et l'heure de fin", + "Does not repeat": "ça ne se répète pas", + "Keep Public": "Garder public", + "Keep Registerable": "Garder enregistrable", + "Event Details": "Détails de l'évènement", + "Register": "S'inscrire", + "Created by": "Créé par", + "public": "publique", + "private": "privée", + "Description": "La description", + "Admins": "Administratrices", + "Attendees": "Participantes", + "See all": "Voir tout", + "Start Date": "Date de début", + "End Date": "Date de fin", + "Cancel": "Annuler", + "Done": "Fait", + "Explore Events": "Explorer les événements", + "Add Date": "Ajouter une date", + "Event": "Événement", + "My Events": "Mes événements", + "Public Events": "Événements publics", + "Private Events": "Événements privés", + "Liked by": "Aimé par", + "Comments": "commentaires", + "FirstName LastName": "Prénom nom de famille", + "Pinned Posts": "Messages épinglés", + "Profile": "Profil", + "Email": "E-mail", + "Update": "Mettre à jour", + "App Settings": "Paramètres de l'application", + "Language": "Langue", + "dark mode": "mode sombre", + "font size": "taille de police", + "Help": "Aider", + "Reach out to us for help": "Contactez-nous pour obtenir de l'aide", + "Donate Us": "Faites-nous un don", + "Help us to develop for you": "Aidez-nous à développer pour vous", + "Log out from Talawa": "Se déconnecter de Talawa", + "Share News": "Partager Nouvelles", + "Post": "Poster", + "Organization Name": "nom de l'organisation", + "Add hasthtag": "Ajouter un hashtag", + "Write here what do you want to share": "Écrivez ici ce que vous voulez partager", + "Join selected organisation": "Rejoindre l'organisation sélectionnée", + "Home": "Domicile", + "Events": "Événements", + "Chat": "Discuter", + "Chat Screen": "Écran de discussion", + "Confirm": "Confirmer", + "Confirmation": "Confirmation", + "Close": "Fermer", + "Switch Organization": "Changer d'organisation", + "Join new Organization": "Rejoindre une nouvelle organisation", + "Leave Current Organization": "Quitter l'organisation actuelle", + "Creator": "Créatrice", + "Public": "Publique", + "Private": "Privée", + "No Internet": "Sans Internet", + "Subscribed": "Abonnée", + "from": "de", + "See all Pinned news": "Voir toutes les actualités épinglées", + "show more": "montre plus", + "show less": "Montrer moins", + "Likes": "Aime", + "comments": "commentaires", + "Final": "Finale", + "Enter Details": "Entrez les détails", + "Select\nOrganization": "Sélectionner\nOrganisation", + "already selected": "déjà sélectionné", + "Switched to": "Basculé vers", + "Organisation already joined": "Organisation déjà adhérée", + "Membership request already sent": "Demande d'adhésion déjà envoyée", + "Select one organization to continue": "Sélectionnez une organisation pour continuer", + "SomeThing went wrong": "Quelque chose s'est mal passé", + "Join in request sent to": "Demande d'adhésion envoyée à", + "successfully": "avec succès", + "Are you sure you want to logout?": "Êtes-vous sûr de vouloir vous déconnecter?", + "Logout": "Se déconnecter" +} \ No newline at end of file diff --git a/lang/hi.json b/lang/hi.json new file mode 100644 index 000000000..efa38c813 --- /dev/null +++ b/lang/hi.json @@ -0,0 +1,151 @@ +{ + "Hello": "नमस्ते", + "User Name": "उपयोगकर्ता नाम", + "we've": "हमने", + "got you covered": "आपको कवर कर लिया है", + "password": "पास वर्ड दर्ज करें", + "Enter new password": "नया पासवर्ड दर्ज करें", + "Re-Enter your password": "दुबारापासवडृ िलखो", + "Change Password": "पासवर्ड बदलें", + "Email Hint": "test@test.org", + "Enter your registered Email": "अपना पंजीकृत ईमेल दर्ज करें", + "Enter your password": "अपना पासवर्ड डालें", + "Forgot password": "क्या आप पासवर्ड भूल गए", + "Login": "लॉग इन करें", + "Sit back relax, we'll": "आराम से बैठें, हम", + "Recover": "रिकवर कर लेंगे", + "your password": "आपका पासवर्ड", + "Recover Password": "पासवर्ड पुनः प्राप्त करना", + "Select Language": "भाषा का चयन करें", + "Default": "डिफ़ॉल्ट मान", + "Select": "चुनते हैं", + "Selected Organization": "चयनित संगठन", + "Continue": "जारी रखें", + "Enter Organization URL": "संगठन URL दर्ज करें", + "Verify": "सत्यापित करें", + "Sign Up": "साइन अप करें", + "Change language": "भाषा बदलें", + "First Name Hint": "राहुल", + "Enter your first name": "अपना पहला नाम दर्ज करें", + "Last Name Hint": "कुमार", + "Enter your last name": "अपना अंतिम नाम दर्ज करें", + "Confirm your password": "अपने पासवर्ड की पुष्टि करें", + "Next": "अगला", + "Request Sent to": "अनुरोध भेजा गया", + "Log out": "लॉग आउट", + "Join": "अपने संगठनों", + "and": "से", + "Collaborate": "जुड़ें", + "with your": "और सहयोग करें", + "Organizations": "", + "Title from the viewMode GSoC branch": "व्यूमोड जीएसओसी शाखा से शीर्षक", + "Please verify URL first": "कृपया पहले URL सत्यापित करें", + "Enter a valid URL": "एक मान्य यूआरएल दर्ज करें", + "Firstname must not be left blank.": "प्रथम नाम खाली नहीं छोड़ा जाना चाहिए।", + "Invalid Firstname": "अमान्य प्रथम नाम", + "Lastname must not be left blank.": "उपनाम खाली नहीं छोड़ा जाना चाहिए।", + "Invalid Lastname": "अमान्य अंतिम नाम", + "Email must not be left blank": "ईमेल खाली नहीं छोड़ना चाहिए", + "Please enter a valid Email Address": "कृपया एक वैध ई - मेल एड्रेस डालें", + "Password must not be left blank": "पासवर्ड खाली नहीं छोड़ना चाहिए", + "Invalid Password": "अवैध पासवर्ड", + "Password must not contain spaces": "पासवर्ड में रिक्त स्थान नहीं होना चाहिए", + "Password does not match original": "पासवर्ड मूल से मेल नहीं खाता", + "Join Organisation": "संगठन में शामिल हों", + "We're": "हमें", + "Glad": "खुशी है कि", + "you're": "आप", + "Back": "वापस आ गए हैं", + "Let's": "आइए", + "get": "आपको", + "you": "साइनअप", + "SignUp": "कराते हैं", + "Add Event Title": "घटना का शीर्षक जोड़ें", + "Where is the event": "घटना कहाँ है", + "Add Location": "स्थान जोड़ना", + "Describe the event": "घटना का वर्णन करें", + "Add Description": "विवरण जोड़ें", + "Add Event": "कार्यक्रम जोड़ें", + "Add": "इसे जोड़ें", + "Add Image": "छवि जोड़ें", + "Select Start Date and Time": "प्रारंभ दिनांक और समय चुनें", + "Select End Date and Time": "समाप्ति तिथि और समय चुनें", + "Does not repeat": "यह दोहराता नहीं है", + "Keep Public": "सार्वजनिक रखें", + "Keep Registerable": "पंजीकरण योग्य रखें", + "Event Details": "घटना की जानकारी", + "Register": "रजिस्टर करें", + "Created by": "के द्वारा बनाई गई", + "public": "सह लोक", + "private": "निजी", + "Description": "विवरण", + "Admins": "व्यवस्थापक", + "Attendees": "सहभागी", + "See all": "सभी देखें", + "Start Date": "आरंभ करने की तिथि", + "End Date": "समाप्ति तिथि", + "Cancel": "रद्द करना", + "Done": "किया हुआ", + "Explore Events": "घटनाओं का अन्वेषण करें", + "Add Date": "तिथि जोड़ें", + "Event": "प्रतिस्पर्धा", + "My Events": "मेरे कार्यक्रम", + "Public Events": "सार्वजनिक कार्यक्रम", + "Private Events": "निजी कार्यक्रम", + "Liked by": "द्वारा पसंद किया गया", + "Comments": "टिप्पणियाँ", + "FirstName LastName": "प्रथम नाम अंतिम नाम", + "Pinned Posts": "चिपके पत्र", + "Profile": "प्रोफ़ाइल", + "Email": "ईमेल", + "Update": "अपडेट करें", + "App Settings": "एप्लिकेशन सेटिंग", + "Language": "भाषा: हिन्दी", + "dark mode": "डार्क मोड", + "font size": "फ़ॉन्ट आकार", + "Help": "मदद", + "Reach out to us for help": "मदद के लिए हमसे संपर्क करें", + "Donate Us": "हमें दान करें", + "Help us to develop for you": "आपके लिए विकास करने में हमारी सहायता करें", + "Log out from Talawa": "तलवा से लॉग आउट करें", + "Share News": "समाचार साझा करें", + "Post": "पद", + "Organization Name": "संगठन का नाम", + "Add hasthtag": "हैशटैग जोड़ें", + "Write here what do you want to share": "यहां लिखें कि आप क्या साझा करना चाहते हैं", + "Join selected organisation": "चयनित संगठन से जुड़ें", + "Home": "घर", + "Events": "आयोजन", + "Chat": "चैट", + "Chat Screen": "चैट स्क्रीन", + "Confirm": "पुष्टि करें", + "Confirmation": "पुष्टीकरण", + "Close": "बंद करे", + "Switch Organization": "संगठन स्विच करें", + "Join new Organization": "नए संगठन में शामिल हों", + "Leave Current Organization": "वर्तमान संगठन छोड़ें", + "Creator": "निर्माता", + "Public": "सार्वजनिक", + "Private": "निजी", + "No Internet": "कोई इंटरनेट नहीं", + "Subscribed": "सदस्यता ली गई", + "from": "से", + "See all Pinned news": "सभी पिन किए गए समाचार देखें", + "show more": "अधिक दिखाएं", + "show less": "कम दिखाएं", + "Likes": "पसंद", + "comments": "टिप्पणियां", + "Final": "फाइनल", + "Enter Details": "विवरण दर्ज करें", + "Select\nOrganization": "चुनते हैं\nसंगठन", + "already selected": "पहले से चयनित", + "Switched to": "इस पर स्विच किया गया", + "Organisation already joined": "संगठन पहले ही शामिल हो चुका है", + "Membership request already sent": "सदस्यता अनुरोध पहले ही भेजा जा चुका है", + "Select one organization to continue": "जारी रखने के लिए एक संगठन चुनें", + "SomeThing went wrong": "कुछ गलत हो गया", + "Join in request sent to": "ज्वाइन इन रिक्वेस्ट इन को भेजा गया", + "successfully": "सफलतापूर्वक", + "Are you sure you want to logout?": "क्या आप वाकई लॉगआउट करना चाहते हैं?", + "Logout": "लॉगआउट" +} \ No newline at end of file diff --git a/lang/zh.json b/lang/zh.json new file mode 100644 index 000000000..28b569f75 --- /dev/null +++ b/lang/zh.json @@ -0,0 +1,151 @@ +{ + "Hello": "你好", + "User Name": "用户名", + "we've": "我们已经", + "got you covered": "为您服务", + "password": "输入您的密码", + "Enter new password": "输入新密码", + "Re-Enter your password": "重新输入您的密码", + "Change Password": "更改密码", + "Email Hint": "test@test.org", + "Enter your registered Email": "输入您的注册邮箱", + "Enter your password": "输入您的密码", + "Forgot password": "你忘记密码了吗", + "Login": "登录", + "Sit back relax, we'll": "高枕无忧, ", + "Recover": "", + "your password": "我们会找回您的密码", + "Recover Password": "恢复你的密码", + "Select Language": "选择语言", + "Default": "默认值", + "Select": "选择", + "Selected Organization": "选定组织", + "Continue": "继续", + "Enter Organization URL": "输入组织 URL", + "Verify": "验证一下", + "Sign Up": "报名", + "Change language": "改变语言", + "First Name Hint": "杰基", + "Enter your first name": "输入您的名字", + "Last Name Hint": "陈", + "Enter your last name": "输入您的姓氏", + "Confirm your password": "确认你的密码", + "Next": "下一个", + "Request Sent to": "请求发送至", + "Log out": "登出", + "Join": "加入您的组织并与之协作", + "and": "", + "Collaborate": "", + "with your": "", + "Organizations": "", + "Title from the viewMode GSoC branch": "来自 viewMode GSoC 分支的标题", + "Please verify URL first": "请先验证网址", + "Enter a valid URL": "输入有效的网址", + "Firstname must not be left blank.": "名字不能留空。", + "Invalid Firstname": "名字无效", + "Lastname must not be left blank.": "姓氏不能留空。", + "Invalid Lastname": "无效的姓氏", + "Email must not be left blank": "电子邮件不得留空", + "Please enter a valid Email Address": "请输入有效的电子邮件地址", + "Password must not be left blank": "密码不能为空", + "Invalid Password": "无效的密码", + "Password must not contain spaces": "密码不能包含空格", + "Password does not match original": "密码与原密码不符", + "Join Organisation": "加入组织", + "We're": "我们很高兴", + "Glad": "", + "you're": "你回来了", + "Back": "", + "Let's": "让我们", + "get": "帮", + "you": "", + "SignUp": "你注册", + "Add Event Title": "添加活动标题", + "Where is the event": "活动地点", + "Add Location": "添加位置", + "Describe the event": "描述事件", + "Add Description": "添加说明", + "Add Event": "添加事件", + "Add": "添加", + "Add Image": "添加图片", + "Select Start Date and Time": "选择开始日期和时间", + "Select End Date and Time": "选择结束日期和时间", + "Does not repeat": "不重复", + "Keep Public": "保持公开", + "Keep Registerable": "保持注册", + "Event Details": "活动详情", + "Register": "注册", + "Created by": "创建者", + "public": "公开", + "private": "私人", + "Description": "说明", + "Admins": "管理员", + "Attendees": "与会者", + "See all": "查看全部", + "Start Date": "开始日期", + "End Date": "结束日期", + "Cancel": "取消", + "Done": "完成", + "Explore Events": "探索事件", + "Add Date": "添加日期", + "Event": "事件", + "My Events": "我的活动", + "Public Events": "公共事件", + "Private Events": "私人活动", + "Liked by": "喜欢的人", + "Comments": "评论", + "FirstName LastName": "名字姓氏", + "Pinned Posts": "已标记的帖子", + "Profile": "简介", + "Email": "电子邮件", + "Update": "更新", + "App Settings": "应用设置", + "Language": "语言", + "dark mode": "黑暗模式", + "font size": "字体大小", + "Help": "帮助", + "Reach out to us for help": "联系我们寻求帮助", + "Donate Us": "捐赠我们", + "Help us to develop for you": "帮助我们为您开发", + "Log out from Talawa": "从 Talawa 注销", + "Share News": "分享新闻", + "Post": "邮政", + "Organization Name": "机构名称", + "Add hasthtag": "添加主题标签", + "Write here what do you want to share": "在这里写下您想分享的内容", + "Join selected organisation": "加入选定的组织", + "Home": "家", + "Events": "事件", + "Chat": "聊天", + "Chat Screen": "聊天画面", + "Confirm": "确认", + "Confirmation": "确认", + "Close": "关闭", + "Switch Organization": "切换组织", + "Join new Organization": "加入新组织", + "Leave Current Organization": "离开当前组织", + "Creator": "创造者", + "Public": "公共", + "Private": "私人", + "No Internet": "没有互联网", + "Subscribed": "订阅", + "from": "来自", + "See all Pinned news": "查看所有置顶新闻", + "show more": "显示更多", + "show less": "显示较少", + "Likes": "喜欢", + "comments": "评论", + "Final": "最终", + "Enter Details": "输入详细信息", + "Select\nOrganization": "Select\nOrganization", + "already selected": "已选", + "Switched to": "切换到", + "Organisation already joined": "组织已加入", + "Membership request already sent": "会员申请已发送", + "Select one organization to continue": "选择一个组织继续", + "SomeThing went wrong": "出问题了", + "Join in request sent to": "加入请求发送至", + "successfully": "成功", + "Are you sure you want to logout?": "您确定要退出吗?", + "Logout": "登出" +} \ No newline at end of file diff --git a/lib/constants/constants.dart b/lib/constants/constants.dart new file mode 100644 index 000000000..079d52fe4 --- /dev/null +++ b/lib/constants/constants.dart @@ -0,0 +1,34 @@ +import 'package:talawa/models/language/language_model.dart'; + +List languages = [ + Language( + countryCode: 'US', + langCode: 'en', + langName: 'English', + langSample: 'Welcome User', + ), + Language( + countryCode: 'IN', + langCode: 'hi', + langName: 'हिंदी', + langSample: 'स्वागत उपयोगकर्ता', + ), + Language( + countryCode: 'CN', + langCode: 'zh', + langName: '中国人', + langSample: '欢迎用户', + ), + Language( + countryCode: 'FR', + langCode: 'fr', + langName: 'français', + langSample: 'Bienvenue utilisateur', + ), + Language( + countryCode: 'ES', + langCode: 'es', + langName: 'Española', + langSample: 'Bienvenida usuario', + ), +]; diff --git a/lib/constants/custom_theme.dart b/lib/constants/custom_theme.dart new file mode 100644 index 000000000..b5e8c7287 --- /dev/null +++ b/lib/constants/custom_theme.dart @@ -0,0 +1,129 @@ +import 'package:flutter/material.dart'; + +class TalawaTheme { + static const Color _lightCursorColor = Color(0xff34AD64); + static const Color _lightAccentColor = Color(0xff34AD64); + static const Color _lightScaffoldColor = Colors.white; + static const Color _lightPrimaryColor = Colors.white; + static const Color _lightPrimaryVariantColor = Color(0xFFe5e5e5); + static const Color _lightIconColor = Color(0xff8C8E8D); + static const Color _lightInBlack = Color(0xff000000); + static const Color _lightColorSchemePrimary = Color(0xfffabc57); + + static const Color _darkCursorColor = Color(0xff34AD64); + static const Color _darkAccentColor = Color(0xff34AD64); + static const Color _darkScaffoldColor = Color(0xff18191A); + static const Color _darkPrimaryColor = Colors.black; + static const Color _darkPrimaryVariantColor = Colors.black; + static const Color _darkIconColor = Colors.white70; + static const Color _darkInWhite = Color(0xffffffff); + static const Color _darkColorSchemePrimary = Color(0xfffabc57); + + static final lightTheme = ThemeData( + scaffoldBackgroundColor: _lightScaffoldColor, + textSelectionTheme: const TextSelectionThemeData( + cursorColor: _lightCursorColor, + ), + primaryColor: _lightPrimaryColor, + colorScheme: const ColorScheme.light( + primaryVariant: _lightPrimaryVariantColor, + primary: _lightColorSchemePrimary, + secondary: Color(0xffF5F5F5), + secondaryVariant: _darkScaffoldColor), + accentColor: _lightAccentColor, + iconTheme: const IconThemeData( + color: _lightIconColor, + ), + fontFamily: 'product-sans', + textTheme: _lightTextTheme, + inputDecorationTheme: _lightInputDecor); + + static final darkTheme = ThemeData( + textSelectionTheme: const TextSelectionThemeData( + cursorColor: _darkCursorColor, + ), + scaffoldBackgroundColor: _darkScaffoldColor, + primaryColor: _darkPrimaryColor, + colorScheme: const ColorScheme.dark( + primaryVariant: _darkPrimaryVariantColor, + primary: _darkColorSchemePrimary, + secondary: Colors.black, + secondaryVariant: _lightScaffoldColor), + iconTheme: const IconThemeData( + color: _darkIconColor, + ), + accentColor: _darkAccentColor, + fontFamily: 'product-sans', + textTheme: _darkTextTheme, + inputDecorationTheme: _darkInputDecor); + + static const TextTheme _lightTextTheme = TextTheme( + headline4: TextStyle( + fontWeight: FontWeight.w700, + fontSize: 34, + ), + headline5: TextStyle( + color: _lightInBlack, + fontSize: 20, + ), + headline6: TextStyle( + fontSize: 16, + color: Color(0xFF737373), + ), + bodyText1: TextStyle( + fontSize: 14, + ), + bodyText2: TextStyle( + fontSize: 14, + ), + caption: TextStyle( + fontWeight: FontWeight.w400, color: Color(0xFF737373), fontSize: 12.0), + ); + + static const TextTheme _darkTextTheme = TextTheme( + headline4: TextStyle( + fontWeight: FontWeight.w700, + fontSize: 34, + ), + headline5: TextStyle(color: _darkInWhite, fontSize: 20), + headline6: TextStyle( + fontSize: 16, + color: Color(0xFF737373), + ), + bodyText1: TextStyle( + fontSize: 14, + color: Colors.white, + ), + bodyText2: TextStyle( + fontSize: 14, + color: Colors.white, + ), + caption: TextStyle( + fontWeight: FontWeight.w400, color: Color(0xFF737373), fontSize: 12.0), + ); + + static const InputDecorationTheme _lightInputDecor = InputDecorationTheme( + border: InputBorder.none, + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Color(0xFF008A37)), + ), + enabledBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.grey), + ), + errorBorder: InputBorder.none, + disabledBorder: InputBorder.none, + errorMaxLines: 3, + ); + static const InputDecorationTheme _darkInputDecor = InputDecorationTheme( + border: InputBorder.none, + focusedBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Color(0xFF008A37)), + ), + enabledBorder: UnderlineInputBorder( + borderSide: BorderSide(color: Colors.grey), + ), + errorBorder: InputBorder.none, + disabledBorder: InputBorder.none, + errorMaxLines: 3, + ); +} diff --git a/lib/constants/routing_constants.dart b/lib/constants/routing_constants.dart new file mode 100644 index 000000000..c36f87f25 --- /dev/null +++ b/lib/constants/routing_constants.dart @@ -0,0 +1,25 @@ +//routes + +class Routes { + static const String demoPageViewRoute = "/demoPageViewRoute"; + static const String splashScreen = "/"; + static const String languageSelectionRoute = "/selectLang"; + static const String setUrlScreen = "/setUrl"; + static const String loginScreen = "/login"; + static const String selectOrgScreen = "/selectOrg"; + static const String signupDetailScreen = "/signupDetails"; + static const String waitingScreen = "/waiting"; + static const String recoverScreen = "/recover"; + static const String updateScreen = "/update"; + static const String homeScreen = "/homeScreen"; + static const String mainScreen = "/mainScreen"; + static const String progressDialog = "/progress"; + static const String individualPost = "/individualPost"; + static const String pinnedPostPage = "/pinnedPostPage"; + static const String exploreEventsScreen = "/exploreEvents"; + static const String eventInfoPage = "/eventInfo"; + static const String createEventPage = "/createEventPage"; + static const String profilePage = "/profilePage"; + static const String editProfilePage = "/editProfilePage"; + static const String joinOrg = '/joinOrg'; +} diff --git a/lib/custom_painters/language_icon.dart b/lib/custom_painters/language_icon.dart new file mode 100644 index 000000000..488f1df82 --- /dev/null +++ b/lib/custom_painters/language_icon.dart @@ -0,0 +1,271 @@ +import 'package:flutter/material.dart'; + +class LanguageIcon extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final Path path_0 = Path(); + path_0.moveTo(size.width * 0.2376568, size.height * 0.4381250); + path_0.cubicTo( + size.width * 0.2321886, + size.height * 0.4003127, + size.width * 0.2254689, + size.height * 0.3343750, + size.width * 0.2254689, + size.height * 0.3343750); + path_0.lineTo(size.width * 0.2246875, size.height * 0.3343750); + path_0.cubicTo( + size.width * 0.2246875, + size.height * 0.3343750, + size.width * 0.2179686, + size.height * 0.4003127, + size.width * 0.2125000, + size.height * 0.4381250); + path_0.lineTo(size.width * 0.1951561, size.height * 0.5553136); + path_0.lineTo(size.width * 0.2546886, size.height * 0.5553136); + path_0.lineTo(size.width * 0.2376568, size.height * 0.4381250); + path_0.close(); + path_0.moveTo(size.width * 0.9625000, 0); + path_0.lineTo(size.width * 0.5250000, 0); + path_0.lineTo(size.width * 0.5250000, size.height); + path_0.lineTo(size.width * 0.9625000, size.height); + path_0.cubicTo(size.width * 0.9832818, size.height, size.width, + size.height * 0.9665636, size.width, size.height * 0.9250000); + path_0.lineTo(size.width, size.height * 0.07500000); + path_0.cubicTo(size.width, size.height * 0.03343750, size.width * 0.9832818, + 0, size.width * 0.9625000, 0); + path_0.close(); + path_0.moveTo(size.width * 0.9250000, size.height * 0.3750000); + path_0.cubicTo( + size.width * 0.9250000, + size.height * 0.3956250, + size.width * 0.9165636, + size.height * 0.4125000, + size.width * 0.9062500, + size.height * 0.4125000); + path_0.lineTo(size.width * 0.8884364, size.height * 0.4125000); + path_0.cubicTo( + size.width * 0.8776568, + size.height * 0.4862500, + size.width * 0.8545318, + size.height * 0.5606227, + size.width * 0.8217182, + size.height * 0.6309364); + path_0.cubicTo( + size.width * 0.8348432, + size.height * 0.6509364, + size.width * 0.8484364, + size.height * 0.6700000, + size.width * 0.8625000, + size.height * 0.6871864); + path_0.cubicTo( + size.width * 0.8710932, + size.height * 0.6978136, + size.width * 0.8739068, + size.height * 0.7200000, + size.width * 0.8689068, + size.height * 0.7378136); + path_0.lineTo(size.width * 0.8565636, size.height * 0.7812500); + path_0.cubicTo( + size.width * 0.8512500, + size.height * 0.7996864, + size.width * 0.8395318, + size.height * 0.8056227, + size.width * 0.8304682, + size.height * 0.7946864); + path_0.cubicTo( + size.width * 0.8107818, + size.height * 0.7703136, + size.width * 0.7921886, + size.height * 0.7443727, + size.width * 0.7751568, + size.height * 0.7168727); + path_0.cubicTo( + size.width * 0.7581250, + size.height * 0.7440636, + size.width * 0.7396886, + size.height * 0.7703136, + size.width * 0.7198432, + size.height * 0.7946864); + path_0.cubicTo( + size.width * 0.7107818, + size.height * 0.8056227, + size.width * 0.6990636, + size.height * 0.7996864, + size.width * 0.6937500, + size.height * 0.7812500); + path_0.lineTo(size.width * 0.6814068, size.height * 0.7378136); + path_0.cubicTo( + size.width * 0.6764068, + size.height * 0.7203136, + size.width * 0.6792182, + size.height * 0.6978136, + size.width * 0.6879682, + size.height * 0.6871864); + path_0.cubicTo( + size.width * 0.7025000, + size.height * 0.6693727, + size.width * 0.7160932, + size.height * 0.6506273, + size.width * 0.7287500, + size.height * 0.6309364); + path_0.cubicTo( + size.width * 0.7164068, + size.height * 0.6046864, + size.width * 0.7054682, + size.height * 0.5778136, + size.width * 0.6959386, + size.height * 0.5506273); + path_0.cubicTo( + size.width * 0.6896886, + size.height * 0.5328136, + size.width * 0.6925000, + size.height * 0.5081273, + size.width * 0.7017182, + size.height * 0.4971864); + path_0.lineTo(size.width * 0.7118750, size.height * 0.4850000); + path_0.lineTo(size.width * 0.7232818, size.height * 0.4715636); + path_0.cubicTo( + size.width * 0.7317182, + size.height * 0.4615636, + size.width * 0.7426568, + size.height * 0.4662500, + size.width * 0.7482818, + size.height * 0.4821864); + path_0.cubicTo( + size.width * 0.7560932, + size.height * 0.5040636, + size.width * 0.7651568, + size.height * 0.5259364, + size.width * 0.7754682, + size.height * 0.5475000); + path_0.cubicTo( + size.width * 0.7965614, + size.height * 0.5031273, + size.width * 0.8126568, + size.height * 0.4571864, + size.width * 0.8223432, + size.height * 0.4125000); + path_0.lineTo(size.width * 0.6437500, size.height * 0.4125000); + path_0.cubicTo( + size.width * 0.6334386, + size.height * 0.4125000, + size.width * 0.6250000, + size.height * 0.3956250, + size.width * 0.6250000, + size.height * 0.3750000); + path_0.lineTo(size.width * 0.6250000, size.height * 0.3250000); + path_0.cubicTo( + size.width * 0.6250000, + size.height * 0.3043750, + size.width * 0.6334386, + size.height * 0.2875000, + size.width * 0.6437500, + size.height * 0.2875000); + path_0.lineTo(size.width * 0.7437500, size.height * 0.2875000); + path_0.lineTo(size.width * 0.7437500, size.height * 0.2375000); + path_0.cubicTo( + size.width * 0.7437500, + size.height * 0.2168750, + size.width * 0.7521886, + size.height * 0.2000000, + size.width * 0.7625000, + size.height * 0.2000000); + path_0.lineTo(size.width * 0.7875000, size.height * 0.2000000); + path_0.cubicTo( + size.width * 0.7978136, + size.height * 0.2000000, + size.width * 0.8062500, + size.height * 0.2168750, + size.width * 0.8062500, + size.height * 0.2375000); + path_0.lineTo(size.width * 0.8062500, size.height * 0.2875000); + path_0.lineTo(size.width * 0.9062500, size.height * 0.2875000); + path_0.cubicTo( + size.width * 0.9165636, + size.height * 0.2875000, + size.width * 0.9250000, + size.height * 0.3043750, + size.width * 0.9250000, + size.height * 0.3250000); + path_0.lineTo(size.width * 0.9250000, size.height * 0.3750000); + path_0.close(); + path_0.moveTo(0, size.height * 0.07500000); + path_0.lineTo(0, size.height * 0.9250000); + path_0.cubicTo(0, size.height * 0.9665636, size.width * 0.01671875, + size.height, size.width * 0.03750000, size.height); + path_0.lineTo(size.width * 0.4750000, size.height); + path_0.lineTo(size.width * 0.4750000, 0); + path_0.lineTo(size.width * 0.03750000, 0); + path_0.cubicTo(size.width * 0.01671875, 0, 0, size.height * 0.03343750, 0, + size.height * 0.07500000); + path_0.close(); + path_0.moveTo(size.width * 0.09203136, size.height * 0.7503136); + path_0.lineTo(size.width * 0.1818750, size.height * 0.2218750); + path_0.cubicTo( + size.width * 0.1845314, + size.height * 0.2065623, + size.width * 0.1915625, + size.height * 0.1965623, + size.width * 0.1996875, + size.height * 0.1965623); + path_0.lineTo(size.width * 0.2504682, size.height * 0.1965623); + path_0.cubicTo( + size.width * 0.2584386, + size.height * 0.1965623, + size.width * 0.2656250, + size.height * 0.2068750, + size.width * 0.2682818, + size.height * 0.2218750); + path_0.lineTo(size.width * 0.3581250, size.height * 0.7503136); + path_0.cubicTo( + size.width * 0.3621864, + size.height * 0.7746864, + size.width * 0.3532818, + size.height * 0.8000000, + size.width * 0.3403136, + size.height * 0.8000000); + path_0.lineTo(size.width * 0.3045318, size.height * 0.8000000); + path_0.cubicTo( + size.width * 0.3004886, + size.height * 0.7999955, + size.width * 0.2965523, + size.height * 0.7973727, + size.width * 0.2933159, + size.height * 0.7925318); + path_0.cubicTo( + size.width * 0.2900773, + size.height * 0.7876864, + size.width * 0.2877091, + size.height * 0.7808818, + size.width * 0.2865614, + size.height * 0.7731227); + path_0.lineTo(size.width * 0.2718750, size.height * 0.6734364); + path_0.lineTo(size.width * 0.1778125, size.height * 0.6734364); + path_0.lineTo(size.width * 0.1635936, size.height * 0.7728136); + path_0.cubicTo( + size.width * 0.1612500, + size.height * 0.7887500, + size.width * 0.1539061, + size.height * 0.8000000, + size.width * 0.1456250, + size.height * 0.8000000); + path_0.lineTo(size.width * 0.1098439, size.height * 0.8000000); + path_0.cubicTo( + size.width * 0.09703136, + size.height * 0.8000000, + size.width * 0.08796886, + size.height * 0.7746864, + size.width * 0.09203136, + size.height * 0.7503136); + path_0.close(); + + final Paint paint0fill = Paint()..style = PaintingStyle.fill; + paint0fill.color = const Color(0xff737373).withOpacity(1.0); + canvas.drawPath(path_0, paint0fill); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) { + return true; + } +} diff --git a/lib/custom_painters/talawa_logo.dart b/lib/custom_painters/talawa_logo.dart new file mode 100644 index 000000000..d648c8c5d --- /dev/null +++ b/lib/custom_painters/talawa_logo.dart @@ -0,0 +1,379 @@ +import 'package:flutter/material.dart'; + +class AppLogo extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final Path path_0 = Path(); + path_0.moveTo(size.width * 0.6581984, size.height * 0.6200040); + path_0.cubicTo( + size.width * 0.6951984, + size.height * 0.6792024, + size.width * 0.7321984, + size.height * 0.7386032, + size.width * 0.7695992, + size.height * 0.7978016); + path_0.cubicTo( + size.width * 0.7737976, + size.height * 0.8044008, + size.width * 0.7730000, + size.height * 0.8070040, + size.width * 0.7664008, + size.height * 0.8112024); + path_0.cubicTo( + size.width * 0.7314008, + size.height * 0.8330040, + size.width * 0.6964008, + size.height * 0.8552024, + size.width * 0.6617976, + size.height * 0.8776032); + path_0.cubicTo( + size.width * 0.6560000, + size.height * 0.8814008, + size.width * 0.6534008, + size.height * 0.8820040, + size.width * 0.6491984, + size.height * 0.8750040); + path_0.cubicTo( + size.width * 0.5995992, + size.height * 0.7930040, + size.width * 0.5495992, + size.height * 0.7112024, + size.width * 0.4997976, + size.height * 0.6292024); + path_0.cubicTo( + size.width * 0.4941984, + size.height * 0.6198016, + size.width * 0.4940000, + size.height * 0.6200040, + size.width * 0.4884008, + size.height * 0.6292024); + path_0.cubicTo( + size.width * 0.4380000, + size.height * 0.7114008, + size.width * 0.3873992, + size.height * 0.7938016, + size.width * 0.3371992, + size.height * 0.8762024); + path_0.cubicTo( + size.width * 0.3337992, + size.height * 0.8818016, + size.width * 0.3317992, + size.height * 0.8816032, + size.width * 0.3267992, + size.height * 0.8784008); + path_0.cubicTo( + size.width * 0.2913992, + size.height * 0.8558016, + size.width * 0.2559992, + size.height * 0.8334008, + size.width * 0.2203992, + size.height * 0.8112024); + path_0.cubicTo( + size.width * 0.2165992, + size.height * 0.8088016, + size.width * 0.2131992, + size.height * 0.8076032, + size.width * 0.2167992, + size.height * 0.8018016); + path_0.cubicTo( + size.width * 0.2547992, + size.height * 0.7420040, + size.width * 0.2923992, + size.height * 0.6818016, + size.width * 0.3301992, + size.height * 0.6218016); + path_0.cubicTo( + size.width * 0.3575992, + size.height * 0.5766032, + size.width * 0.3853992, + size.height * 0.5320040, + size.width * 0.4130000, + size.height * 0.4870040); + path_0.cubicTo( + size.width * 0.4191984, + size.height * 0.4768016, + size.width * 0.4255992, + size.height * 0.4666032, + size.width * 0.4317976, + size.height * 0.4564008); + path_0.cubicTo( + size.width * 0.4347976, + size.height * 0.4516032, + size.width * 0.4377976, + size.height * 0.4468016, + size.width * 0.4441984, + size.height * 0.4458016); + path_0.cubicTo( + size.width * 0.4541984, + size.height * 0.4452024, + size.width * 0.4640000, + size.height * 0.4472024, + size.width * 0.4740000, + size.height * 0.4474008); + path_0.cubicTo( + size.width * 0.4960000, + size.height * 0.4482024, + size.width * 0.5167976, + size.height * 0.4438016, + size.width * 0.5377976, + size.height * 0.4382024); + path_0.cubicTo( + size.width * 0.5435992, + size.height * 0.4374008, + size.width * 0.5470000, + size.height * 0.4408016, + size.width * 0.5497976, + size.height * 0.4454008); + path_0.cubicTo( + size.width * 0.5830000, + size.height * 0.5002024, + size.width * 0.6170000, + size.height * 0.5546032, + size.width * 0.6497976, + size.height * 0.6096032); + path_0.cubicTo( + size.width * 0.6517976, + size.height * 0.6136032, + size.width * 0.6544008, + size.height * 0.6172024, + size.width * 0.6581984, + size.height * 0.6200040); + path_0.close(); + + final Paint paint0fill = Paint()..style = PaintingStyle.fill; + paint0fill.color = const Color(0xff31BB6B).withOpacity(1.0); + canvas.drawPath(path_0, paint0fill); + + final Path path_1 = Path(); + path_1.moveTo(size.width * 0.5405992, size.height * 0.4396032); + path_1.cubicTo( + size.width * 0.5084008, + size.height * 0.4512024, + size.width * 0.4754008, + size.height * 0.4532024, + size.width * 0.4418016, + size.height * 0.4472024); + path_1.cubicTo( + size.width * 0.4292024, + size.height * 0.4490000, + size.width * 0.4184008, + size.height * 0.4428016, + size.width * 0.4078016, + size.height * 0.4382024); + path_1.cubicTo( + size.width * 0.3772004, + size.height * 0.4248016, + size.width * 0.3516004, + size.height * 0.4048016, + size.width * 0.3326004, + size.height * 0.3768020); + path_1.cubicTo( + size.width * 0.3302004, + size.height * 0.3732020, + size.width * 0.3276004, + size.height * 0.3696020, + size.width * 0.3278004, + size.height * 0.3650020); + path_1.cubicTo( + size.width * 0.3124004, + size.height * 0.3368020, + size.width * 0.3032004, + size.height * 0.3070020, + size.width * 0.3040004, + size.height * 0.2746020); + path_1.cubicTo( + size.width * 0.3056004, + size.height * 0.2126020, + size.width * 0.3322004, + size.height * 0.1636020, + size.width * 0.3842004, + size.height * 0.1300020); + path_1.cubicTo( + size.width * 0.4872024, + size.height * 0.06320198, + size.width * 0.6244008, + size.height * 0.1212020, + size.width * 0.6494008, + size.height * 0.2418020); + path_1.cubicTo( + size.width * 0.6554008, + size.height * 0.2704020, + size.width * 0.6535992, + size.height * 0.2994020, + size.width * 0.6452024, + size.height * 0.3276020); + path_1.cubicTo( + size.width * 0.6444008, + size.height * 0.3302020, + size.width * 0.6440000, + size.height * 0.3328020, + size.width * 0.6434008, + size.height * 0.3354020); + path_1.cubicTo( + size.width * 0.6380000, + size.height * 0.3574020, + size.width * 0.6260000, + size.height * 0.3756020, + size.width * 0.6118016, + size.height * 0.3924020); + path_1.cubicTo( + size.width * 0.5960000, + size.height * 0.4108016, + size.width * 0.5770000, + size.height * 0.4252024, + size.width * 0.5548016, + size.height * 0.4354008); + path_1.cubicTo( + size.width * 0.5500000, + size.height * 0.4376032, + size.width * 0.5455992, + size.height * 0.4394008, + size.width * 0.5405992, + size.height * 0.4396032); + path_1.close(); + + final Paint paint1fill = Paint()..style = PaintingStyle.fill; + paint1fill.color = const Color(0xffFEBC59).withOpacity(1.0); + canvas.drawPath(path_1, paint1fill); + + final Path path_2 = Path(); + path_2.moveTo(size.width * 0.5405992, size.height * 0.4395992); + path_2.cubicTo( + size.width * 0.5880000, + size.height * 0.4200000, + size.width * 0.6224008, + size.height * 0.3870008, + size.width * 0.6410000, + size.height * 0.3386008); + path_2.cubicTo( + size.width * 0.6414008, + size.height * 0.3374008, + size.width * 0.6425992, + size.height * 0.3364008, + size.width * 0.6434008, + size.height * 0.3354008); + path_2.cubicTo( + size.width * 0.6850000, + size.height * 0.4020000, + size.width * 0.7265992, + size.height * 0.4688016, + size.width * 0.7685992, + size.height * 0.5352024); + path_2.cubicTo( + size.width * 0.7742024, + size.height * 0.5440000, + size.width * 0.7724008, + size.height * 0.5470000, + size.width * 0.7642024, + size.height * 0.5520000); + path_2.cubicTo( + size.width * 0.7285992, + size.height * 0.5740000, + size.width * 0.6924008, + size.height * 0.5954008, + size.width * 0.6584008, + size.height * 0.6200000); + path_2.cubicTo( + size.width * 0.6535992, + size.height * 0.6225992, + size.width * 0.6520000, + size.height * 0.6190000, + size.width * 0.6502024, + size.height * 0.6158016); + path_2.cubicTo( + size.width * 0.6158016, + size.height * 0.5590000, + size.width * 0.5814008, + size.height * 0.5022024, + size.width * 0.5470000, + size.height * 0.4455992); + path_2.cubicTo( + size.width * 0.5452024, + size.height * 0.4430000, + size.width * 0.5440000, + size.height * 0.4402024, + size.width * 0.5405992, + size.height * 0.4395992); + path_2.close(); + + final Paint paint2fill = Paint()..style = PaintingStyle.fill; + paint2fill.color = const Color(0xff737373).withOpacity(1.0); + canvas.drawPath(path_2, paint2fill); + + final Path path_3 = Path(); + path_3.moveTo(size.width * 0.3277992, size.height * 0.3651976); + path_3.cubicTo( + size.width * 0.3541992, + size.height * 0.4085992, + size.width * 0.3929992, + size.height * 0.4351984, + size.width * 0.4417976, + size.height * 0.4471984); + path_3.cubicTo( + size.width * 0.4287976, + size.height * 0.4623968, + size.width * 0.4197976, + size.height * 0.4803968, + size.width * 0.4094008, + size.height * 0.4973968); + path_3.cubicTo( + size.width * 0.3847992, + size.height * 0.5373968, + size.width * 0.3591992, + size.height * 0.5765992, + size.width * 0.3361992, + size.height * 0.6173968); + path_3.cubicTo( + size.width * 0.3347992, + size.height * 0.6197976, + size.width * 0.3333992, + size.height * 0.6219960, + size.width * 0.3301992, + size.height * 0.6215992); + path_3.cubicTo( + size.width * 0.3235992, + size.height * 0.6143968, + size.width * 0.3149992, + size.height * 0.6097976, + size.width * 0.3069992, + size.height * 0.6045992); + path_3.cubicTo( + size.width * 0.2783992, + size.height * 0.5863968, + size.width * 0.2493992, + size.height * 0.5685992, + size.width * 0.2205992, + size.height * 0.5507976); + path_3.cubicTo( + size.width * 0.2163992, + size.height * 0.5481984, + size.width * 0.2131992, + size.height * 0.5465992, + size.width * 0.2169992, + size.height * 0.5403968); + path_3.cubicTo( + size.width * 0.2535992, + size.height * 0.4825992, + size.width * 0.2899992, + size.height * 0.4243968, + size.width * 0.3263992, + size.height * 0.3663976); + path_3.cubicTo( + size.width * 0.3265992, + size.height * 0.3659976, + size.width * 0.3271992, + size.height * 0.3655976, + size.width * 0.3277992, + size.height * 0.3651976); + path_3.close(); + + final Paint paint3fill = Paint()..style = PaintingStyle.fill; + paint3fill.color = const Color(0xff737373).withOpacity(1.0); + canvas.drawPath(path_3, paint3fill); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) { + return true; + } +} diff --git a/lib/demo_server_data/events_demo_data.dart b/lib/demo_server_data/events_demo_data.dart new file mode 100644 index 000000000..f2e4ac0a6 --- /dev/null +++ b/lib/demo_server_data/events_demo_data.dart @@ -0,0 +1,193 @@ +const eventsDemoData = [ + { + "title": "Calculus", + "description": + "This course introduces calculus using analytic geometry functions. Topics include limits and continuity, derivatives, optimization, related rates, graphing and other applications of derivatives, definite and indefinite integrals, and numerical integration.", + "attendees": "50", + "location": "Lostilos", + "recurring": "false", + "allDay": "true", + "startDate": "1 Aug", + "endDate": "15 Aug", + "startTime": "11am", + "endTime": "3pm", + "recurrence": "MONTHLY", + "isPublic": "true", + "isSubscribed": "false", + "isRegisterable": "true", + "creator": { + "firstName": "Utkarsh", + "lastName": "Shendge", + "_id": "asdasdasd" + }, + "registrants": [ + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + {"firstName": "Warren", "lastName": "Buff", "_id": "asdasdasd"}, + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + {"firstName": "Warren", "lastName": "Buff", "_id": "asdasdasd"}, + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + {"firstName": "Warren", "lastName": "Buff", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + ], + "admins": [ + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + ], + "organization": { + "_id": '1', + "name": 'Mathematicians', + "image": ' ', + "creator": { + "firstName": "Utkarsh", + "lastName": "Shendge", + "_id": "asdasdasd" + } + }, + }, + { + "title": "UI/UX", + "description": + "UX design refers to the term “user experience design”, while UI stands for “user interface design”. Both elements are crucial to a product and work closely together.", + "attendees": "80", + "location": "Tokyo, Japan", + "recurring": "false", + "allDay": "true", + "startDate": "5 May", + "endDate": "13 May", + "startTime": "2am", + "endTime": "3pm", + "recurrence": "MONTHLY", + "isPublic": "true", + "isSubscribed": "true", + "isRegisterable": "true", + "creator": { + "firstName": "Rutvik", + "lastName": "Chandla", + "_id": "asdasdasd" + }, + "registrants": [ + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + {"firstName": "Warren", "lastName": "Buff", "_id": "asdasdasd"}, + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + {"firstName": "Warren", "lastName": "Buff", "_id": "asdasdasd"}, + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + {"firstName": "Warren", "lastName": "Buff", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + ], + "admins": [ + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + ], + "organization": { + "_id": '1', + "name": 'Courses', + "image": ' ', + "creator": { + "firstName": "Rutvik", + "lastName": "Chandla", + "_id": "asdasdasd" + } + }, + }, + { + "title": "System Design", + "description": + "Systems design is the process of defining the architecture, product design, modules, interfaces, and data for a system to satisfy specified requirements. Systems design could be seen as the application of systems theory to product development.", + "attendees": "29", + "location": "Shimla, India", + "recurring": "false", + "allDay": "true", + "startDate": "15 Dec", + "endDate": "18 Aug", + "startTime": "8am", + "endTime": "3pm", + "recurrence": "MONTHLY", + "isPublic": "false", + "isSubscribed": "false", + "isRegisterable": "true", + "creator": { + "firstName": "Ritik", + "lastName": "Srivastav", + "_id": "asdasdasd" + }, + "registrants": [ + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + {"firstName": "Warren", "lastName": "Buff", "_id": "asdasdasd"}, + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + {"firstName": "Warren", "lastName": "Buff", "_id": "asdasdasd"}, + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + {"firstName": "Warren", "lastName": "Buff", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + ], + "admins": [ + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + ], + "organization": { + "_id": '1', + "image": ' ', + "name": 'Computer Science', + "creator": { + "firstName": "Ritik", + "lastName": "Srivastav", + "_id": "asdasdasd" + } + }, + }, + { + "title": "Gaming", + // ignore: missing_whitespace_between_adjacent_strings + "description": + "Cyberpunk 2077 is a 2020 action role-playing v_ideo game developed and published by CD Projekt. The story takes place in Night City, an open world set in the Cyberpunk universe.", + + "attendees": "5k+", + "location": "Nagpur, India", + "recurring": "false", + "allDay": "true", + "startDate": "1 Aug", + "endDate": "15 Aug", + "startTime": "11am", + "endTime": "3pm", + "recurrence": "MONTHLY", + "isPublic": "true", + "isSubscribed": "true", + "isRegisterable": "true", + + "creator": { + "firstName": "Utkarsh", + "lastName": "Shendge", + "_id": "asdasdasd" + }, + "registrants": [ + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + {"firstName": "Warren", "lastName": "Buff", "_id": "asdasdasd"}, + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + {"firstName": "Warren", "lastName": "Buff", "_id": "asdasdasd"}, + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + {"firstName": "Warren", "lastName": "Buff", "_id": "asdasdasd"}, + {"firstName": "Bustin", "lastName": "Jiber", "_id": "asdasdasd"}, + ], + "admins": [ + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + ], + "organization": { + "_id": '1', + "image": ' ', + "name": 'Cyclone', + "creator": { + "firstName": "Utkarsh", + "lastName": "Shendge", + "_id": "asdasdasd" + } + }, + } +]; diff --git a/lib/demo_server_data/pinned_post_demo_data.dart b/lib/demo_server_data/pinned_post_demo_data.dart new file mode 100644 index 000000000..7ccd64aad --- /dev/null +++ b/lib/demo_server_data/pinned_post_demo_data.dart @@ -0,0 +1,154 @@ +const pinnedPostsDemoData = [ + { + "description": + "Flutter is Google’s mobile UI framework for crafting high-quality native interfaces on iOS and Android in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.", + "createdAt": "created at string", + "imageUrl": "image url string", + "creator": { + "firstName": "Rutvik", + "lastName": "Chandla", + "id": "asdasdasd" + }, + "likedBy": [ + {"firstName": "User", "lastName": "1", "id": "asdasdasdas"}, + {"firstName": "User", "lastName": "2", "id": "asdasdasdas"}, + {"firstName": "User", "lastName": "3", "id": "asdasdasdas"} + ], + "comments": [ + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + ] + }, + { + "description": + "Flutter is Google’s mobile UI framework for crafting high-quality native interfaces on iOS and Android in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.", + "createdAt": "created at string", + "imageUrl": "image url string", + "creator": { + "firstName": "Ranchhod Das", + "lastName": "Chanchad", + "id": "asdasdasd" + }, + "likedBy": [ + {"firstName": "User", "lastName": "1", "id": "asdasdasdas"}, + {"firstName": "User", "lastName": "2", "id": "asdasdasdas"}, + {"firstName": "User", "lastName": "3", "id": "asdasdasdas"} + ], + "comments": [ + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + ] + }, + { + "description": + "Flutter is Google’s mobile UI framework for crafting high-quality native interfaces on iOS and Android in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.", + "createdAt": "created at string", + "imageUrl": "image url string", + "creator": { + "firstName": "Ritik", + "lastName": "Srivastav", + "id": "asdasdasd" + }, + "likedBy": [ + {"firstName": "User", "lastName": "1", "id": "asdasdasdas"}, + {"firstName": "User", "lastName": "2", "id": "asdasdasdas"}, + {"firstName": "User", "lastName": "3", "id": "asdasdasdas"} + ], + "comments": [ + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + ] + }, + { + "description": + "Flutter is Google’s mobile UI framework for crafting high-quality native interfaces on iOS and Android in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.", + "createdAt": "created at string", + "imageUrl": "image url string", + "creator": { + "firstName": "Utkarsh", + "lastName": "Shendge", + "id": "asdasdasd" + }, + "likedBy": [ + {"firstName": "User", "lastName": "1", "id": "asdasdasdas"}, + {"firstName": "User", "lastName": "2", "id": "asdasdasdas"}, + {"firstName": "User", "lastName": "3", "id": "asdasdasdas"} + ], + "comments": [ + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + { + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "id": "asdasdasdas"} + }, + ] + }, +]; diff --git a/lib/demo_server_data/post_demo_data.dart b/lib/demo_server_data/post_demo_data.dart new file mode 100644 index 000000000..dab6e96f4 --- /dev/null +++ b/lib/demo_server_data/post_demo_data.dart @@ -0,0 +1,178 @@ +const postsDemoData = [ + { + "_id": "asdasdasd", + "text": + "Flutter is Google’s mobile UI framework for crafting high-quality native interfaces on iOS and Android in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.", + "createdAt": "created at string", + "imageUrl": "image url string", + "creator": { + "firstName": "Rutvik", + "lastName": "Chandla", + "_id": "asdasdasd" + }, + "likedBy": [ + {"firstName": "User", "lastName": "1", "_id": "asdasdasdas"}, + {"firstName": "User", "lastName": "2", "_id": "asdasdasdas"}, + {"firstName": "User", "lastName": "3", "_id": "asdasdasdas"} + ], + "comments": [ + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "1", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "2", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "3", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "5", "_id": "asdasdasdas"} + }, + ] + }, + { + "_id": "asdasdasd", + "text": + "Flutter is Google’s mobile UI framework for crafting high-quality native interfaces on iOS and Andro_id in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.", + "createdAt": "created at string", + "imageUrl": "image url string", + "creator": { + "firstName": "Ranchhod Das Chhanchad", + "lastName": "Chandla", + "_id": "asdasdasd" + }, + "likedBy": [ + {"firstName": "User", "lastName": "1", "_id": "asdasdasdas"}, + {"firstName": "User", "lastName": "2", "_id": "asdasdasdas"}, + {"firstName": "User", "lastName": "3", "_id": "asdasdasdas"} + ], + "comments": [ + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + ] + }, + { + "_id": "asdasdasd", + "text": + "Flutter is Google’s mobile UI framework for crafting high-quality native interfaces on iOS and Andro_id in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.", + "createdAt": "created at string", + "imageUrl": "image url string", + "creator": { + "firstName": "Ritik", + "lastName": "Srivastav", + "_id": "asdasdasd" + }, + "likedBy": [ + {"firstName": "User", "lastName": "1", "_id": "asdasdasdas"}, + {"firstName": "User", "lastName": "2", "_id": "asdasdasdas"}, + {"firstName": "User", "lastName": "3", "_id": "asdasdasdas"} + ], + "comments": [ + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + ] + }, + { + "_id": "asdasdasd", + "text": + "Flutter is Google’s mobile UI framework for crafting high-quality native interfaces on iOS and Andro_id in record time. Flutter works with existing code, is used by developers and organizations around the world, and is free and open source.", + "createdAt": "created at string", + "imageUrl": "image url string", + "creator": { + "firstName": "Utkarsh", + "lastName": "Shengde", + "_id": "asdasdasd" + }, + "likedBy": [ + {"firstName": "User", "lastName": "1", "_id": "asdasdasdas"}, + {"firstName": "User", "lastName": "2", "_id": "asdasdasdas"}, + {"firstName": "User", "lastName": "3", "_id": "asdasdasdas"} + ], + "comments": [ + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + { + "_id": "commentID", + "text": "This is the posted comment", + "creator": {"firstName": "User", "lastName": "4", "_id": "asdasdasdas"} + }, + ] + }, +]; diff --git a/lib/enums/enums.dart b/lib/enums/enums.dart new file mode 100644 index 000000000..a07ebc181 --- /dev/null +++ b/lib/enums/enums.dart @@ -0,0 +1,9 @@ +/// Represents the state of the view +enum ViewState { + idle, + busy, +} + +enum TileType { user, org, option } + +enum CallFor { login, signup, joinPublicOrg } diff --git a/lib/locator.dart b/lib/locator.dart new file mode 100644 index 000000000..3e686ff59 --- /dev/null +++ b/lib/locator.dart @@ -0,0 +1,83 @@ +import 'package:get_it/get_it.dart'; +import 'package:talawa/main.dart'; +import 'package:talawa/services/comment_service.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/services/event_service.dart'; +import 'package:talawa/services/graphql_config.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/services/post_service.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/utils/queries.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/explore_events_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/feed_view_models/organization_feed_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/profile_view_models/edit_profile_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/profile_view_models/profile_page_view_model.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/view_model/pre_auth_view_models/login_view_model.dart'; +import 'package:talawa/view_model/pre_auth_view_models/select_organization_view_model.dart'; +import 'package:talawa/view_model/pre_auth_view_models/set_url_view_model.dart'; +import 'package:talawa/view_model/pre_auth_view_models/signup_details_view_model.dart'; +import 'package:talawa/view_model/pre_auth_view_models/waiting_view_model.dart'; +import 'package:talawa/view_model/widgets_view_models/comments_view_model.dart'; +import 'package:talawa/view_model/widgets_view_models/custom_drawer_view_model.dart'; +import 'package:talawa/view_model/widgets_view_models/like_button_view_model.dart'; +import 'package:talawa/view_model/widgets_view_models/progress_dialog_view_model.dart'; + +GetIt locator = GetIt.instance; +final userConfig = locator(); +final navigationService = locator(); +final databaseFunctions = locator(); +final graphqlConfig = locator(); +final sizeConfig = locator(); +final queries = locator(); + +void setupLocator() { + //services + locator.registerSingleton(NavigationService()); + + //sizeConfig + locator.registerSingleton(SizeConfig()); + + //userConfig + locator.registerSingleton(UserConfig()); + + //Services + locator.registerLazySingleton(() => PostService()); + locator.registerLazySingleton(() => EventService()); + locator.registerLazySingleton(() => CommentService()); + + //graphql + locator.registerSingleton(GraphqlConfig()); + + //databaseMutationFunction + locator.registerSingleton(DataBaseMutationFunctions()); + + //queries + locator.registerSingleton(Queries()); + + //Page viewModels + locator.registerFactory(() => DemoViewModel()); + // locator.registerFactory(() => OrganizationFeedViewModel()); + locator.registerFactory(() => OrganizationFeedViewModel()); + locator.registerFactory(() => SetUrlViewModel()); + locator.registerFactory(() => LoginViewModel()); + + locator.registerFactory(() => SelectOrganizationViewModel()); + locator.registerFactory(() => SignupDetailsViewModel()); + locator.registerFactory(() => WaitingViewModel()); + locator.registerFactory(() => ExploreEventsViewModel()); + locator.registerFactory(() => MainScreenViewModel()); + locator.registerFactory(() => ProfilePageViewModel()); + locator.registerFactory(() => EditProfilePageViewModel()); + locator.registerFactory(() => CreateEventViewModel()); + + //Widgets viewModels + locator.registerFactory(() => ProgressDialogViewModel()); + locator.registerFactory(() => CustomDrawerViewModel()); + locator.registerFactory(() => LikeButtonViewModel()); + locator.registerFactory(() => AppLanguage()); + locator.registerFactory(() => CommentsViewModel()); +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 000000000..98f148fd6 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,108 @@ +import 'dart:io'; +import 'package:flutter_localizations/flutter_localizations.dart'; + +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:path_provider/path_provider.dart' as path; +import 'package:provider/provider.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/router.dart' as router; +import 'package:talawa/view_model/base_view_model.dart'; + +Future main() async { + WidgetsFlutterBinding.ensureInitialized(); + final Directory dir = await path.getApplicationDocumentsDirectory(); + Hive + ..init(dir.path) + ..registerAdapter(UserAdapter()) + ..registerAdapter(OrgInfoAdapter()); + await Hive.openBox('currentUser'); + await Hive.openBox('currentOrg'); + await Hive.openBox('url'); + setupLocator(); + runApp(MyApp()); +} + +class MyApp extends StatefulWidget { + // This widget is the root of your application. + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return MaterialApp( + locale: Provider.of(context).appLocal, + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + ], + localizationsDelegates: [ + AppLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + title: 'Talawa', + themeMode: ThemeMode.system, + theme: TalawaTheme.lightTheme, + darkTheme: TalawaTheme.darkTheme, + debugShowCheckedModeBanner: false, + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + localeResolutionCallback: + (Locale? locale, Iterable supportedLocales) { + if (locale == null) { + debugPrint("*language locale is null!!!"); + return supportedLocales.first; + } + for (final Locale supportedLocale in supportedLocales) { + if (supportedLocale.languageCode == locale.languageCode || + supportedLocale.countryCode == locale.countryCode) { + return supportedLocale; + } + } + return supportedLocales.first; + }, + initialRoute: '/', + ); + }, + ); + } +} + +class DemoPageView extends StatelessWidget { + const DemoPageView({required Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BaseView( + builder: (context, model, child) => Scaffold( + appBar: AppBar( + title: + Text(AppLocalizations.of(context)!.strictTranslate('Demo Page')), + ), + body: Container( + child: Text(model.title), + ), + ), + ); + } +} + +class DemoViewModel extends BaseModel { + final String _title = "Title from the viewMode GSoC branch"; + String get title => _title; +} diff --git a/lib/models/comment/comment_model.dart b/lib/models/comment/comment_model.dart new file mode 100644 index 000000000..46c06a8f3 --- /dev/null +++ b/lib/models/comment/comment_model.dart @@ -0,0 +1,24 @@ +import 'package:talawa/models/user/user_info.dart'; + +class Comment { + Comment({this.text, this.createdAt, this.creator, this.post, this.likeCount}); + + factory Comment.fromJson(Map json) { + return Comment( + text: json['text'] as String?, + createdAt: json['createdAt'] as String?, + creator: json['creator'] == null + ? null + : User.fromJson(json['creator'] as Map, + fromOrg: true), + post: json['post'] as String?, + likeCount: json['likeCount'] as String?, + ); + } + + String? text; + String? createdAt; + User? creator; + String? post; + String? likeCount; +} diff --git a/lib/models/events/event_model.dart b/lib/models/events/event_model.dart new file mode 100644 index 000000000..219a05f35 --- /dev/null +++ b/lib/models/events/event_model.dart @@ -0,0 +1,82 @@ +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; + +class Event { + Event( + {this.id, + this.title, + this.description, + this.attendees, + this.location, + this.recurring, + this.allDay, + this.startDate, + this.endDate, + this.startTime, + this.endTime, + this.recurrence, + this.isPublic, + this.isRegistered, + this.isRegisterable, + this.creator, + this.organization, + this.admins, + this.registrants}); + + factory Event.fromJson( + Map json, + ) { + return Event( + id: json['_id'] as String, + title: json['title'] as String?, + description: json['description'] as String?, + attendees: json['attendees'] as String?, + location: json['location'] as String?, + recurring: json['recurring'] as bool?, + allDay: json['allDay'] as bool?, + startDate: json['startDate'] as String?, + endDate: json['endDate'] as String?, + startTime: json['startTime'] as String?, + endTime: json['endTime'] as String?, + recurrence: json['recurrence'] as String?, + isPublic: json['isPublic'] as bool?, + isRegistered: json['isSubscribed'] as bool?, + isRegisterable: json['isRegisterable'] as bool?, + creator: json['creator'] == null + ? null + : User.fromJson(json['creator'] as Map, + fromOrg: true), + organization: json['organization'] == null + ? null + : OrgInfo.fromJson(json['organization'] as Map), + admins: json['admins'] == null + ? null + : (json['admins'] as List?) + ?.map((e) => + User.fromJson(e as Map, fromOrg: true)) + .toList(), + registrants: (json['registrants'] as List?) + ?.map((e) => User.fromJson(e as Map, fromOrg: true)) + .toList(), + ); + } + String? id; + String? title; + String? description; + String? attendees; + String? location; + bool? recurring; + bool? allDay; + String? startDate; + String? endDate; + String? startTime; + String? endTime; + String? recurrence; + bool? isPublic; + bool? isRegistered; + bool? isRegisterable; + User? creator; + OrgInfo? organization; + List? admins; + List? registrants; +} diff --git a/lib/models/language/language_model.dart b/lib/models/language/language_model.dart new file mode 100644 index 000000000..ad48609ab --- /dev/null +++ b/lib/models/language/language_model.dart @@ -0,0 +1,13 @@ +class Language { + Language({ + required this.countryCode, + required this.langCode, + required this.langName, + required this.langSample, + }); + + final String countryCode; + final String langCode; + final String langName; + final String langSample; +} diff --git a/lib/models/options/options.dart b/lib/models/options/options.dart new file mode 100644 index 000000000..c35d44a1a --- /dev/null +++ b/lib/models/options/options.dart @@ -0,0 +1,15 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class Options { + Options( + {required this.icon, + required this.title, + required this.subtitle, + this.trailingIconButton}); + + Widget icon; + String title; + String subtitle; + IconButton? trailingIconButton; +} diff --git a/lib/models/organization/org_info.dart b/lib/models/organization/org_info.dart new file mode 100644 index 000000000..7bd85bc9a --- /dev/null +++ b/lib/models/organization/org_info.dart @@ -0,0 +1,89 @@ +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:talawa/models/user/user_info.dart'; + +part 'org_info.g.dart'; + +@HiveType(typeId: 2) +class OrgInfo { + OrgInfo( + {this.admins, + this.members, + this.creatorInfo, + this.description, + this.id, + this.image, + this.isPublic, + this.name}); + + factory OrgInfo.fromJson(Map json1, + {bool memberRequest = false}) { + Map json; + if (memberRequest) { + json = json1['organization'] as Map; + } else { + json = json1; + } + return OrgInfo( + id: json['_id'] != null ? json['_id'] as String : null, + image: json['image'] != null ? json['image'] as String? : null, + name: json['name'] != null ? json['name'] as String? : null, + description: + json['description'] != null ? json['description'] as String? : null, + isPublic: json['isPublic'] != null ? json['isPublic'] as bool? : null, + creatorInfo: json['creator'] != null + ? User.fromJson(json['creator'] as Map, + fromOrg: true) + : null, + members: json['members'] != null + ? (json['members'] as List?) + ?.map((e) => + User.fromJson(e as Map, fromOrg: true)) + .toList() + : null, + admins: json['admins'] != null + ? (json['admins'] as List?) + ?.map((e) => + User.fromJson(e as Map, fromOrg: true)) + .toList() + : null, + ); + } + + List fromJsonToList(List json) { + final List _orgList = []; + json.forEach((element) { + final OrgInfo org = OrgInfo.fromJson(element as Map); + _orgList.add(org); + }); + return _orgList; + } + + @HiveField(0) + String? image; + @HiveField(1) + String? id; + @HiveField(2) + String? name; + @HiveField(3) + List? admins; + @HiveField(4) + List? members; + @HiveField(5) + String? description; + @HiveField(6) + bool? isPublic; + @HiveField(7) + User? creatorInfo; + + printOrgInfo() { + debugPrint('_id: ${this.id}'); + debugPrint('name: ${this.name}'); + debugPrint('image: ${this.image}'); + debugPrint('description: ${this.description}'); + debugPrint('isPublic: ${this.isPublic}'); + debugPrint('creatorInfo: ${this.creatorInfo}'); + debugPrint('admins: ${this.admins}'); + debugPrint('members: ${this.members}'); + } +} diff --git a/lib/models/organization/org_info.g.dart b/lib/models/organization/org_info.g.dart new file mode 100644 index 000000000..054dae8a6 --- /dev/null +++ b/lib/models/organization/org_info.g.dart @@ -0,0 +1,62 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'org_info.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class OrgInfoAdapter extends TypeAdapter { + @override + final int typeId = 2; + + @override + OrgInfo read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return OrgInfo( + admins: (fields[3] as List?)?.cast(), + members: (fields[4] as List?)?.cast(), + creatorInfo: fields[7] as User?, + description: fields[5] as String?, + id: fields[1] as String?, + image: fields[0] as String?, + isPublic: fields[6] as bool?, + name: fields[2] as String?, + ); + } + + @override + void write(BinaryWriter writer, OrgInfo obj) { + writer + ..writeByte(8) + ..writeByte(0) + ..write(obj.image) + ..writeByte(1) + ..write(obj.id) + ..writeByte(2) + ..write(obj.name) + ..writeByte(3) + ..write(obj.admins) + ..writeByte(4) + ..write(obj.members) + ..writeByte(5) + ..write(obj.description) + ..writeByte(6) + ..write(obj.isPublic) + ..writeByte(7) + ..write(obj.creatorInfo); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is OrgInfoAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/models/post/post_model.dart b/lib/models/post/post_model.dart new file mode 100644 index 000000000..995e92040 --- /dev/null +++ b/lib/models/post/post_model.dart @@ -0,0 +1,96 @@ +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; + +class Post { + Post( + {required this.sId, + this.description, + this.createdAt, + this.imageUrl, + this.videoUrl, + required this.creator, + this.organization, + this.likedBy, + this.comments}); + + Post.fromJson(Map json) { + sId = json['_id'] as String; + description = json['text'] as String?; + createdAt = DateTime.fromMillisecondsSinceEpoch( + int.parse(json['createdAt'] as String)); + imageUrl = json['imageUrl'] as String?; + videoUrl = json['videoUrl'] as String?; + creator = json['creator'] != null + ? User.fromJson(json['creator'] as Map, fromOrg: true) + : null; + organization = json['organization'] != null + ? OrgInfo.fromJson(json['organization'] as Map) + : null; + if (json['likedBy'] != null) { + likedBy = []; + json['likedBy'].forEach((v) { + likedBy?.add(LikedBy.fromJson(v as Map)); + }); + } + if (json['comments'] != null) { + comments = []; + json['comments'].forEach((v) { + comments?.add(Comments.fromJson(v as Map)); + }); + } + } + + late String sId; + String? description; + DateTime? createdAt; + String? imageUrl; + String? videoUrl; + User? creator; + OrgInfo? organization; + List? likedBy; + List? comments; + + String getPostCreatedDuration() { + if (DateTime.now().difference(this.createdAt!).inSeconds < 60) { + return '${DateTime.now().difference(this.createdAt!).inSeconds} Seconds Ago'; + } else if (DateTime.now().difference(this.createdAt!).inMinutes < 60) { + return '${DateTime.now().difference(this.createdAt!).inMinutes} Minutes Ago'; + } else if (DateTime.now().difference(this.createdAt!).inHours < 24) { + return '${DateTime.now().difference(this.createdAt!).inHours} Hours Ago'; + } else if (DateTime.now().difference(this.createdAt!).inDays < 30) { + return '${DateTime.now().difference(this.createdAt!).inDays} Days Ago'; + } else if (DateTime.now().difference(this.createdAt!).inDays < 365) { + return '${DateTime.now().difference(this.createdAt!).inDays ~/ 30} Months Ago'; + } else { + return '${DateTime.now().difference(this.createdAt!).inDays ~/ 365} Years Ago'; + } + } +} + +class LikedBy { + LikedBy({this.sId}); + LikedBy.fromJson(Map json) { + sId = json['_id'] as String?; + } + + String? sId; + Map toJson() { + final Map data = {}; + data['_id'] = this.sId; + return data; + } +} + +class Comments { + Comments({this.sId}); + Comments.fromJson(Map json) { + sId = json['_id'] as String?; + } + + String? sId; + Map toJson() { + final Map data = {}; + data['_id'] = this.sId; + return data; + } +} diff --git a/lib/models/user/user_info.dart b/lib/models/user/user_info.dart new file mode 100644 index 000000000..6996b9cc8 --- /dev/null +++ b/lib/models/user/user_info.dart @@ -0,0 +1,126 @@ +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:talawa/models/organization/org_info.dart'; + +part 'user_info.g.dart'; + +@HiveType(typeId: 1) +class User extends HiveObject { + User( + {this.adminFor, + this.createdOrganizations, + this.email, + this.firstName, + this.id, + this.image, + this.joinedOrganizations, + this.lastName, + this.authToken, + this.refreshToken, + this.membershipRequests}); + + factory User.fromJson(Map json1, {bool fromOrg = false}) { + Map json; + if (fromOrg) { + json = json1; + } else { + json = json1['user'] as Map; + } + return User( + authToken: fromOrg ? ' ' : json1['accessToken'] as String?, + refreshToken: fromOrg ? ' ' : json1['refreshToken'] as String?, + id: json['_id'] as String?, + firstName: + json['firstName'] != null ? json['firstName'] as String? : null, + lastName: json['lastName'] != null ? json['lastName'] as String? : null, + email: json['email'] != null ? json['email'] as String? : null, + image: json['image'] != null ? json['image'] as String? : null, + adminFor: json['adminFor'] != null + ? (json['adminFor'] as List?) + ?.map((e) => OrgInfo.fromJson(e as Map)) + .toList() + : null, + createdOrganizations: json['createdOrganizations'] != null + ? (json['createdOrganizations'] as List?) + ?.map((e) => OrgInfo.fromJson(e as Map)) + .toList() + : null, + joinedOrganizations: json['joinedOrganizations'] != null + ? (json['joinedOrganizations'] as List?) + ?.map((e) => OrgInfo.fromJson(e as Map)) + .toList() + : null, + membershipRequests: json['membershipRequests'] != null + ? (json['membershipRequests'] as List?) + ?.map((e) => OrgInfo.fromJson(e as Map, + memberRequest: true)) + .toList() + : null); + } + + print() { + debugPrint('authToken: ${this.authToken}'); + debugPrint('refreshToken: ${this.refreshToken}'); + debugPrint('_id: ${this.id}'); + debugPrint('firstName: ${this.firstName}'); + debugPrint('lastName: ${this.lastName}'); + debugPrint('image: ${this.image}'); + debugPrint('email: ${this.email}'); + debugPrint('joinedOrganizations: ${this.joinedOrganizations}'); + debugPrint('adminFor: ${this.adminFor}'); + debugPrint('createdOrganizations: ${this.createdOrganizations}'); + debugPrint('membershipRequests: ${this.membershipRequests}'); + } + + @HiveField(0) + String? authToken; + @HiveField(1) + String? refreshToken; + @HiveField(2) + String? id; + @HiveField(3) + String? firstName; + @HiveField(4) + String? lastName; + @HiveField(5) + String? email; + @HiveField(6) + String? image; + @HiveField(7) + List? joinedOrganizations = []; + @HiveField(8) + List? createdOrganizations = []; + @HiveField(9) + List? adminFor = []; + @HiveField(10) + List? membershipRequests = []; + + updateJoinedOrg(List orgList) { + this.joinedOrganizations = orgList; + } + + updateCreatedOrg(List orgList) { + this.createdOrganizations = orgList; + } + + updateMemberRequestOrg(List orgList) { + this.membershipRequests = [...membershipRequests!, ...orgList]; + } + + updateAdminFor(List orgList) { + this.adminFor = orgList; + } + + update(User details) { + this.firstName = details.firstName; + this.lastName = details.firstName; + this.email = details.firstName; + this.image = details.firstName; + this.authToken = details.authToken; + this.refreshToken = details.refreshToken; + this.joinedOrganizations = details.joinedOrganizations; + this.createdOrganizations = details.createdOrganizations; + this.membershipRequests = details.membershipRequests; + this.adminFor = details.adminFor; + } +} diff --git a/lib/models/user/user_info.g.dart b/lib/models/user/user_info.g.dart new file mode 100644 index 000000000..3b89a5ff1 --- /dev/null +++ b/lib/models/user/user_info.g.dart @@ -0,0 +1,71 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'user_info.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class UserAdapter extends TypeAdapter { + @override + final int typeId = 1; + + @override + User read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return User( + adminFor: (fields[9] as List?)?.cast(), + createdOrganizations: (fields[8] as List?)?.cast(), + email: fields[5] as String?, + firstName: fields[3] as String?, + id: fields[2] as String?, + image: fields[6] as String?, + joinedOrganizations: (fields[7] as List?)?.cast(), + lastName: fields[4] as String?, + authToken: fields[0] as String?, + refreshToken: fields[1] as String?, + membershipRequests: (fields[10] as List?)?.cast(), + ); + } + + @override + void write(BinaryWriter writer, User obj) { + writer + ..writeByte(11) + ..writeByte(0) + ..write(obj.authToken) + ..writeByte(1) + ..write(obj.refreshToken) + ..writeByte(2) + ..write(obj.id) + ..writeByte(3) + ..write(obj.firstName) + ..writeByte(4) + ..write(obj.lastName) + ..writeByte(5) + ..write(obj.email) + ..writeByte(6) + ..write(obj.image) + ..writeByte(7) + ..write(obj.joinedOrganizations) + ..writeByte(8) + ..write(obj.createdOrganizations) + ..writeByte(9) + ..write(obj.adminFor) + ..writeByte(10) + ..write(obj.membershipRequests); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is UserAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/router.dart b/lib/router.dart new file mode 100644 index 000000000..6f9881f65 --- /dev/null +++ b/lib/router.dart @@ -0,0 +1,118 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/main.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/splash_screen.dart'; +import 'package:talawa/views/after_auth_screens/events/create_event_page.dart'; +import 'package:talawa/views/after_auth_screens/events/event_info_page.dart'; +import 'package:talawa/views/after_auth_screens/events/explore_events.dart'; +import 'package:talawa/views/after_auth_screens/feed/individual_post.dart'; +import 'package:talawa/views/after_auth_screens/feed/organization_feed.dart'; +import 'package:talawa/views/after_auth_screens/feed/pinned_post_page.dart'; +import 'package:talawa/views/after_auth_screens/join_organisation_after_auth.dart'; +import 'package:talawa/views/after_auth_screens/profile/edit_profile_page.dart'; +import 'package:talawa/views/after_auth_screens/profile/profile_page.dart'; +import 'package:talawa/views/main_screen.dart'; +import 'package:talawa/views/pre_auth_screens/change_password.dart'; +import 'package:talawa/views/pre_auth_screens/login.dart'; +import 'package:talawa/views/pre_auth_screens/recover.dart'; +import 'package:talawa/views/pre_auth_screens/select_language.dart'; +import 'package:talawa/views/pre_auth_screens/select_organization.dart'; +import 'package:talawa/views/pre_auth_screens/set_url.dart'; +import 'package:talawa/views/pre_auth_screens/signup_details.dart'; +import 'package:talawa/views/pre_auth_screens/waiting_to_join_private_org.dart'; + +Route generateRoute(RouteSettings settings) { + switch (settings.name) { + case Routes.splashScreen: + return MaterialPageRoute( + builder: (context) => const SplashScreen(key: Key('SplashScreen'))); + case Routes.languageSelectionRoute: + return MaterialPageRoute( + builder: (context) => + const SelectLanguage(key: Key('SelectLanguage'))); + case Routes.setUrlScreen: + final String uri = settings.arguments!.toString(); + return MaterialPageRoute( + builder: (context) => SetUrl( + key: const Key('SetUrl'), + uri: uri, + ), + ); + case Routes.loginScreen: + return MaterialPageRoute( + builder: (context) => const Login(key: Key('Login'))); + case Routes.selectOrgScreen: + final String id = settings.arguments!.toString(); + return CupertinoPageRoute( + builder: (context) => SelectOrganization( + key: const Key('Signup'), + selectedOrgId: id, + ), + ); + case Routes.signupDetailScreen: + final OrgInfo org = settings.arguments! as OrgInfo; + return CupertinoPageRoute( + builder: (context) => SignUpDetails( + key: const Key('Signup'), + selectedOrg: org, + ), + ); + case Routes.waitingScreen: + return CupertinoPageRoute( + builder: (context) => const WaitingPage(key: Key('Waiting'))); + case Routes.recoverScreen: + return MaterialPageRoute( + builder: (context) => const Recover(key: Key('Recover'))); + case Routes.updateScreen: + return MaterialPageRoute( + builder: (context) => const ChangePass(key: Key('Update'))); + case Routes.homeScreen: + return MaterialPageRoute( + builder: (context) => const OrganizationFeed(key: Key('HomeScreen'))); + case Routes.mainScreen: + return MaterialPageRoute( + builder: (context) => const MainScreen(key: Key('MainScreen'))); + case Routes.individualPost: + final Post post = settings.arguments! as Post; + return MaterialPageRoute( + builder: (context) => IndividualPostView( + key: const Key('IndividualPost'), + post: post, + )); + case Routes.pinnedPostPage: + final List pinnedPosts = settings.arguments! as List; + return MaterialPageRoute( + builder: (context) => PinnedPostPage(pinnedPosts: pinnedPosts)); + case Routes.exploreEventsScreen: + return MaterialPageRoute( + builder: (context) => const ExploreEvents(key: Key('ExploreEvents'))); + case Routes.eventInfoPage: + final Event event = settings.arguments! as Event; + return MaterialPageRoute( + builder: (context) => + EventInfoPage(key: const Key('EventInfo'), event: event), + ); + case Routes.createEventPage: + return MaterialPageRoute( + builder: (context) => const CreateEventPage(key: Key('CreateEvent'))); + case Routes.profilePage: + return MaterialPageRoute( + builder: (context) => const ProfilePage(key: Key('Profile'))); + case Routes.editProfilePage: + return MaterialPageRoute( + builder: (context) => const EditProfilePage(key: Key('EditProfile'))); + case Routes.joinOrg: + return MaterialPageRoute( + builder: (context) => const JoinOrganisationAfterAuth( + key: Key('JoinOrganisationAfterAuth'))); + default: + return MaterialPageRoute( + builder: (context) => const DemoPageView( + key: Key("DemoPage"), + )); + } +} diff --git a/lib/services/comment_service.dart b/lib/services/comment_service.dart new file mode 100644 index 000000000..a868b262c --- /dev/null +++ b/lib/services/comment_service.dart @@ -0,0 +1,32 @@ +import 'package:talawa/locator.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/utils/comment_queries.dart'; + +class CommentService { + CommentService() { + _dbFunctions = locator(); + } + late DataBaseMutationFunctions _dbFunctions; + + Future createComments(String postId, String text) async { + print("comment service called"); + final String _createCommentQuery = CommentQueries().createComment(); + final result = + await _dbFunctions.gqlAuthMutation(_createCommentQuery, variables: { + 'postId': postId, //Add your variables here + 'text': text + }); + print("comment added"); + print(result); + return result; + } + + Future getCommentsForPost(String postId) async { + final String _getCommmentQuery = CommentQueries().getPostsComments(postId); + final result = await _dbFunctions.gqlAuthMutation(_getCommmentQuery); + if (result.data != null) { + return result.data["commentsByPost"] as List; + } + return []; + } +} diff --git a/lib/services/database_mutation_functions.dart b/lib/services/database_mutation_functions.dart new file mode 100644 index 000000000..bad26dba9 --- /dev/null +++ b/lib/services/database_mutation_functions.dart @@ -0,0 +1,183 @@ +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/utils/queries.dart'; + +class DataBaseMutationFunctions { + late GraphQLClient clientNonAuth; + late GraphQLClient clientAuth; + late Queries _query; + init() { + clientNonAuth = graphqlConfig.clientToQuery(); + clientAuth = graphqlConfig.authClient(); + _query = Queries(); + } + + GraphQLError userNotFound = const GraphQLError(message: 'User not found'); + GraphQLError userNotAuthenticated = + const GraphQLError(message: 'User is not authenticated'); + GraphQLError emailAccountPresent = + const GraphQLError(message: 'Email address already exists'); + GraphQLError wrongCredentials = + const GraphQLError(message: 'Invalid credentials'); + GraphQLError organizationNotFound = + const GraphQLError(message: 'Organization not found'); + GraphQLError refreshAccessTokenExpiredException = const GraphQLError( + message: + 'Access Token has expired. Please refresh session.: Undefined location'); + GraphQLError memberRequestExist = + const GraphQLError(message: 'Membership Request already exists'); + + bool? encounteredExceptionOrError(OperationException exception, + {bool showSnackBar = true}) { + if (exception.linkException != null) { + debugPrint(exception.linkException.toString()); + if (showSnackBar) { + navigationService.showSnackBar("Server not running/wrong url"); + } + return false; + } else { + debugPrint(exception.graphqlErrors.toString()); + for (int i = 0; i < exception.graphqlErrors.length; i++) { + if (exception.graphqlErrors[i].message == + refreshAccessTokenExpiredException.message) { + print('token refreshed'); + refreshAccessToken(userConfig.currentUser.refreshToken!).then( + (value) => graphqlConfig + .getToken() + .then((value) => databaseFunctions.init())); + print('client refreshed'); + return true; + } else if (exception.graphqlErrors[i].message == + userNotAuthenticated.message) { + print('client refreshed'); + graphqlConfig.getToken().then((value) => databaseFunctions.init()); + return true; + } else if (exception.graphqlErrors[i].message == userNotFound.message) { + if (showSnackBar) { + navigationService + .showSnackBar("No account registered with this email"); + } + return false; + } else if (exception.graphqlErrors[i].message == + memberRequestExist.message) { + if (showSnackBar) { + navigationService.showSnackBar("Membership request already exist"); + } + return false; + } else if (exception.graphqlErrors[i].message == + wrongCredentials.message) { + if (showSnackBar) { + navigationService.showSnackBar("Enter a valid password"); + } + return false; + } else if (exception.graphqlErrors[i].message == + organizationNotFound.message) { + if (showSnackBar) { + navigationService.showSnackBar("Organization Not Found"); + } + return false; + } else if (exception.graphqlErrors[i].message == + emailAccountPresent.message) { + if (showSnackBar) { + navigationService + .showSnackBar("Account with this email already registered"); + } + return false; + } + } + navigationService.showSnackBar("Something went wrong"); + return false; + } + } + + Future gqlAuthQuery(String query) async { + final QueryOptions options = QueryOptions( + document: gql(query), + variables: {}, + ); + final QueryResult result = await clientAuth.query(options); + if (result.hasException) { + final bool? exception = encounteredExceptionOrError(result.exception!); + if (exception!) { + gqlAuthQuery(query); + } + } else if (result.data != null && result.isConcrete) { + return result; + } + return null; + } + + Future gqlAuthMutation(String mutation, + {Map? variables}) async { + final QueryResult result = await clientAuth.mutate(MutationOptions( + document: gql(mutation), + variables: variables ?? {}, + )); + if (result.hasException) { + final bool? exception = encounteredExceptionOrError(result.exception!); + if (exception!) { + gqlAuthMutation(mutation, variables: variables); + } + } else if (result.data != null && result.isConcrete) { + return result; + } + return null; + } + + Future gqlNonAuthMutation(String mutation, + {Map? variables, bool reCall = true}) async { + final QueryResult result = await clientNonAuth.mutate(MutationOptions( + document: gql(mutation), variables: variables ?? {})); + + if (result.hasException) { + final bool? exception = encounteredExceptionOrError(result.exception!); + if (exception! && reCall) { + gqlNonAuthMutation(mutation, variables: variables); + } + } else if (result.data != null && result.isConcrete) { + return result; + } + return null; + } + + Future refreshAccessToken(String refreshToken) async { + final QueryResult result = await clientNonAuth.mutate(MutationOptions( + document: gql( + _query.refreshToken(refreshToken), + ), + )); + + if (result.hasException) { + final bool? exception = encounteredExceptionOrError(result.exception!); + if (exception!) { + refreshAccessToken(refreshToken); + } else { + navigationService.pop(); + } + } else if (result.data != null && result.isConcrete) { + userConfig.updateAccessToken( + refreshToken: result.data!['refreshToken']['refreshToken'].toString(), + accessToken: result.data!['refreshToken']['accessToken'].toString()); + databaseFunctions.init(); + return true; + } + return false; + } + + Future fetchOrgById(String id) async { + final QueryResult result = await clientNonAuth + .mutate(MutationOptions(document: gql(_query.fetchOrgById(id)))); + if (result.hasException) { + final bool? exception = encounteredExceptionOrError(result.exception!); + if (exception!) { + fetchOrgById(id); + } + } else if (result.data != null && result.isConcrete) { + return OrgInfo.fromJson( + result.data!['organizations'][0] as Map); + } + return false; + } +} diff --git a/lib/services/event_service.dart b/lib/services/event_service.dart new file mode 100644 index 000000000..0afec2b43 --- /dev/null +++ b/lib/services/event_service.dart @@ -0,0 +1,106 @@ +import 'dart:async'; + +import 'package:intl/intl.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/utils/event_queries.dart'; + +class EventService { + EventService() { + _eventStream = _eventStreamController.stream.asBroadcastStream(); + _currentOrg = _userConfig.currentOrg; + setOrgStreamSubscription(); + } + + final _userConfig = locator(); + final _dbFunctions = locator(); + + late OrgInfo _currentOrg; + late StreamSubscription _currentOrganizationStreamSubscription; + late Stream _eventStream; + + final List _events = []; + final StreamController _eventStreamController = + StreamController(); + Stream get eventStream => _eventStream; + // ignore: prefer_final_fields + Set _ids = {}; + + void setOrgStreamSubscription() { + _currentOrganizationStreamSubscription = + _userConfig.currentOrfInfoStream.listen((updatedOrganization) { + _currentOrg = updatedOrganization; + _events.clear(); + _ids.clear(); + getEvents(); + }); + } + + Future getEvents() async { + final String currentOrgID = _currentOrg.id!; + _dbFunctions.init(); + final String mutation = EventQueries().fetchOrgEvents(currentOrgID); + + final result = await _dbFunctions.gqlAuthMutation(mutation); + if (result.data!["events"] == null) return; + final List eventsJson = result.data!["events"] as List; + eventsJson.forEach((eventJsonData) { + final Event event = Event.fromJson(eventJsonData as Map); + if (!_ids.contains(event.id)) { + _ids.add(event.id!); + _events.add(event); + } + }); + + _events.removeWhere( + (element) => + int.tryParse(element.startTime!) == null || + int.tryParse(element.endTime!) == null || + element.organization!.id != _currentOrg.id, + ); + _events.sort((a, b) { + return DateTime.fromMicrosecondsSinceEpoch(int.parse(a.startTime!)) + .compareTo( + DateTime.fromMicrosecondsSinceEpoch(int.parse(b.startTime!))); + }); + _parseEventDateTime(); + + _events.forEach((element) { + _eventStreamController.add(element); + }); + } + + Future registerForAnEvent(String eventId) async { + final tokenResult = await _dbFunctions + .refreshAccessToken(userConfig.currentUser.refreshToken!); + print(tokenResult); + final Map variables = {'eventId': eventId}; + final result = await _dbFunctions.gqlAuthMutation( + EventQueries().registerForEvent(), + variables: variables, + ); + print(result); + } + + void _parseEventDateTime() { + _events.forEach((element) { + final DateTime _startDate = + DateTime.fromMicrosecondsSinceEpoch(int.parse(element.startTime!)) + .toLocal(); + final DateTime _endDate = + DateTime.fromMicrosecondsSinceEpoch(int.parse(element.endTime!)) + .toLocal(); + element.startDate = DateFormat('yMd').format(_startDate); + element.endDate = DateFormat('yMd').format(_endDate); + element.startTime = DateFormat.jm().format(_startDate); + element.endTime = DateFormat.jm().format(_endDate); + }); + } + + void dispose() { + _currentOrganizationStreamSubscription.cancel(); + } +} diff --git a/lib/services/graphql_config.dart b/lib/services/graphql_config.dart new file mode 100644 index 000000000..6755b69cb --- /dev/null +++ b/lib/services/graphql_config.dart @@ -0,0 +1,70 @@ +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:hive/hive.dart'; +import 'package:http/http.dart' as http; +import 'package:mockito/mockito.dart'; +import 'package:talawa/locator.dart'; + +class GraphqlConfig { + static const imageUrlKey = "imageUrl"; + static const urlKey = "url"; + static String? orgURI = ' '; + static String? token; + late HttpLink httpLink; + +//prefix route for showing images + String? displayImgRoute; + + Future getToken() async { + final _token = userConfig.currentUser.authToken; + token = _token; + getOrgUrl(); + return true; + } + + getOrgUrl() { + final box = Hive.box('url'); + final String? url = box.get(urlKey) as String?; + final String? imgUrl = box.get(imageUrlKey) as String?; + orgURI = url ?? ' '; + displayImgRoute = imgUrl ?? ' '; + httpLink = HttpLink(orgURI!); + clientToQuery(); + authClient(); + } + + GraphQLClient clientToQuery() { + return GraphQLClient( + cache: GraphQLCache(partialDataPolicy: PartialDataCachePolicy.accept), + link: httpLink, + ); + } + + GraphQLClient authClient() { + final AuthLink authLink = AuthLink(getToken: () async => 'Bearer $token'); + final Link finalAuthLink = authLink.concat(httpLink); + return GraphQLClient( + cache: GraphQLCache(partialDataPolicy: PartialDataCachePolicy.accept), + link: finalAuthLink, + ); + } + + test() { + httpLink = HttpLink('https://talawa-graphql-api.herokuapp.com/graphql', + httpClient: MockHttpClient()); + } +} + +class MockHttpClient extends Mock implements http.Client { + @override + Future send(http.BaseRequest? request) => + // ignore: invalid_use_of_visible_for_testing_member + super.noSuchMethod( + Invocation.method(#send, [request]), + returnValue: Future.value( + http.StreamedResponse( + Stream.fromIterable(const [[]]), + 500, + ), + ), + ) as Future; +} diff --git a/lib/services/navigation_service.dart b/lib/services/navigation_service.dart new file mode 100644 index 000000000..90b795382 --- /dev/null +++ b/lib/services/navigation_service.dart @@ -0,0 +1,56 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class NavigationService { + GlobalKey navigatorKey = GlobalKey(); + + Future pushScreen(String routeName, {dynamic arguments}) { + return navigatorKey.currentState! + .pushNamed(routeName, arguments: arguments); + } + + Future popAndPushScreen(String routeName, {dynamic arguments}) { + navigatorKey.currentState!.pop(); + return pushScreen(routeName, arguments: arguments); + } + + Future pushReplacementScreen(String routeName, {dynamic arguments}) { + return navigatorKey.currentState! + .pushReplacementNamed(routeName, arguments: arguments); + } + + void fromInviteLink(List routeNames, List arguments) { + int i = 0; + removeAllAndPush('/${routeNames[i]}', '/', arguments: arguments[i]); + for (i = 1; i < routeNames.length; i++) { + pushScreen('/${routeNames[i]}', arguments: arguments[i]); + } + } + + Future removeAllAndPush(String routeName, String tillRoute, + {dynamic arguments}) { + return navigatorKey.currentState!.pushNamedAndRemoveUntil( + routeName, ModalRoute.withName(tillRoute), + arguments: arguments); + } + + void pushDialog(Widget dialog) { + showDialog( + context: navigatorKey.currentContext!, + barrierColor: Colors.transparent, + barrierDismissible: false, + builder: (BuildContext context) { + return dialog; + }); + } + + void showSnackBar(String message, + {Duration duration = const Duration(seconds: 2)}) { + ScaffoldMessenger.of(navigatorKey.currentContext!) + .showSnackBar(SnackBar(duration: duration, content: Text(message))); + } + + void pop() { + return navigatorKey.currentState!.pop(); + } +} diff --git a/lib/services/post_service.dart b/lib/services/post_service.dart new file mode 100644 index 000000000..63d2e761a --- /dev/null +++ b/lib/services/post_service.dart @@ -0,0 +1,119 @@ +import 'dart:async'; + +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/utils/post_queries.dart'; + +class PostService { + PostService() { + _postStream = _postStreamController.stream.asBroadcastStream(); + _updatedPostStream = + _updatedPostStreamController.stream.asBroadcastStream(); + _currentOrg = _userConfig.currentOrg; + setOrgStreamSubscription(); + } + // Stream for entire posts + final StreamController> _postStreamController = + StreamController>(); + late Stream> _postStream; + + //Stream for individul post update + final StreamController _updatedPostStreamController = + StreamController(); + late Stream _updatedPostStream; + + final _userConfig = locator(); + final _dbFunctions = locator(); + late OrgInfo _currentOrg; + final Set _renderedPostID = {}; + // ignore: prefer_final_fields + List _posts = []; + + //Getters + Stream> get postStream => _postStream; + Stream get updatedPostStream => _updatedPostStream; + + //Setters + void setOrgStreamSubscription() { + _userConfig.currentOrfInfoStream.listen((updatedOrganization) { + _renderedPostID.clear(); + _currentOrg = updatedOrganization; + }); + } + + //Function to get all posts + Future getPosts() async { + final String currentOrgID = _currentOrg.id!; + final String query = PostQueries().getPostsById(currentOrgID); + final QueryResult result = + await _dbFunctions.gqlAuthQuery(query) as QueryResult; + + //Checking if the dbFunctions return the postJSON, if not return. + if (result.data!['postsByOrganization'] == null) return; + + final List postsJson = result.data!['postsByOrganization'] as List; + + final List _newPosts = []; + postsJson.forEach((postJson) { + final Post post = Post.fromJson(postJson as Map); + if (!_renderedPostID.contains(post.sId)) { + _newPosts.add(post); + _renderedPostID.add(post.sId); + } + }); + _postStreamController.add(_newPosts); + _posts = _newPosts; + } + + // --- Functions related to Likes --- // + Future addLike(String postID) async { + _localAddLike(postID); + final String mutation = PostQueries().addLike(); + final result = await _dbFunctions + .gqlAuthMutation(mutation, variables: {"postID": postID}); + print(result); + return result; + } + + void _localAddLike(String postID) { + _posts.forEach((post) { + if (post.sId == postID) { + post.likedBy!.add(LikedBy(sId: _userConfig.currentUser.id)); + _updatedPostStreamController.add(post); + } + }); + } + + Future removeLike(String postID) async { + _removeLocal(postID); + final String mutation = PostQueries().removeLike(); + final result = await _dbFunctions + .gqlAuthMutation(mutation, variables: {"postID": postID}); + print(result); + return result; + } + + void _removeLocal(String postID) { + _posts.forEach((post) { + if (post.sId == postID) { + post.likedBy!.removeWhere( + (likeUser) => likeUser.sId == _userConfig.currentUser.id); + _updatedPostStreamController.add(post); + } + }); + } + + // --- Functions related to comments --- // + void addCommentLocally(String postID) { + for (int i = 0; i < _posts.length; i++) { + if (_posts[i].sId == postID) { + _posts[i].comments!.add(Comments(sId: postID)); + _updatedPostStreamController.add(_posts[i]); + } + } + } +} diff --git a/lib/services/size_config.dart b/lib/services/size_config.dart new file mode 100644 index 000000000..baf236309 --- /dev/null +++ b/lib/services/size_config.dart @@ -0,0 +1,48 @@ +import 'package:flutter/widgets.dart'; + +class SizeConfig { + static late MediaQueryData _mediaQueryData; + static double? screenWidth; + static double? screenHeight; + static double? blockSizeHorizontal; + static double? blockSizeVertical; + static double? paddingTop; + + static late double _safeAreaHorizontal; + static late double _safeAreaVertical; + static double? safeBlockHorizontal; + static double? safeBlockVertical; + + void init(BuildContext context) { + _mediaQueryData = MediaQuery.of(context); + screenWidth = _mediaQueryData.size.width; + screenHeight = _mediaQueryData.size.height; + blockSizeHorizontal = screenWidth! / 100; + blockSizeVertical = screenHeight! / 100; + + _safeAreaHorizontal = + _mediaQueryData.padding.left + _mediaQueryData.padding.right; + _safeAreaVertical = + _mediaQueryData.padding.top + _mediaQueryData.padding.bottom; + safeBlockHorizontal = (screenWidth! - _safeAreaHorizontal) / 100; + safeBlockVertical = (screenHeight! - _safeAreaVertical) / 100; + debugPrint("safeBlockHorizontal: $safeBlockHorizontal"); + debugPrint("safeBlockVertical: $safeBlockVertical"); + } + + test() { + _mediaQueryData = + const MediaQueryData(size: Size(360, 684), padding: EdgeInsets.zero); + screenWidth = _mediaQueryData.size.width; + screenHeight = _mediaQueryData.size.height; + blockSizeHorizontal = screenWidth! / 100; + blockSizeVertical = screenHeight! / 100; + + _safeAreaHorizontal = + _mediaQueryData.padding.left + _mediaQueryData.padding.right; + _safeAreaVertical = + _mediaQueryData.padding.top + _mediaQueryData.padding.bottom; + safeBlockHorizontal = (screenWidth! - _safeAreaHorizontal) / 100; + safeBlockVertical = (screenHeight! - _safeAreaVertical) / 100; + } +} diff --git a/lib/services/user_config.dart b/lib/services/user_config.dart new file mode 100644 index 000000000..6e98bf0d6 --- /dev/null +++ b/lib/services/user_config.dart @@ -0,0 +1,126 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:hive/hive.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; + +class UserConfig { + late User? _currentUser = User(id: 'null', authToken: 'null'); + late OrgInfo? _currentOrg = OrgInfo(name: 'Organization Name', id: 'null'); + late Stream _currentOrgInfoStream; + final _currentOrgInfoController = StreamController(); + + Stream get currentOrfInfoStream => _currentOrgInfoStream; + StreamController get currentOrgInfoController => + _currentOrgInfoController; + + OrgInfo get currentOrg => _currentOrg!; + String get currentOrgName => _currentOrg!.name!; + set currentOrg(OrgInfo org) => _currentOrg = org; + User get currentUser => _currentUser!; + + void initialiseStream() { + _currentOrgInfoStream = + _currentOrgInfoController.stream.asBroadcastStream(); + } + + Future userLoggedIn() async { + initialiseStream(); + final boxUser = Hive.box('currentUser'); + final boxOrg = Hive.box('currentOrg'); + _currentOrg = + boxOrg.get('org') ?? OrgInfo(name: 'Organization Name', id: 'null'); + _currentOrgInfoController.add(_currentOrg!); + + _currentUser = boxUser.get('user'); + if (_currentUser == null) { + _currentUser = User(id: 'null', authToken: 'null'); + return false; + } + graphqlConfig.getToken().then((value) async { + databaseFunctions.init(); + try { + final QueryResult result = await databaseFunctions.gqlNonAuthMutation( + queries.fetchUserInfo, + variables: {'id': currentUser.id!}) as QueryResult; + final User userInfo = User.fromJson( + result.data!['users'][0] as Map, + fromOrg: true); + userInfo.authToken = userConfig.currentUser.authToken; + userInfo.refreshToken = userConfig.currentUser.refreshToken; + userConfig.updateUser(userInfo); + _currentOrg ??= _currentUser!.joinedOrganizations![0]; + _currentOrgInfoController.add(_currentOrg!); + + saveUserInHive(); + return true; + } on Exception catch (e) { + print(e); + navigationService.showSnackBar("Couldn't update User details"); + } + }); + return true; + } + + Future updateUserJoinedOrg(List orgDetails) async { + _currentUser!.updateJoinedOrg(orgDetails); + saveUserInHive(); + } + + Future updateUserCreatedOrg(List orgDetails) async { + _currentUser!.updateCreatedOrg(orgDetails); + saveUserInHive(); + } + + Future updateUserMemberRequestOrg(List orgDetails) async { + _currentUser!.updateMemberRequestOrg(orgDetails); + saveUserInHive(); + } + + Future updateUserAdminOrg(List orgDetails) async { + _currentUser!.updateAdminFor(orgDetails); + saveUserInHive(); + } + + Future updateAccessToken( + {required String accessToken, required String refreshToken}) async { + _currentUser!.refreshToken = refreshToken; + _currentUser!.authToken = accessToken; + saveUserInHive(); + } + + Future updateUser(User updatedUserDetails) async { + try { + _currentUser = updatedUserDetails; + saveUserInHive(); + databaseFunctions.init(); + return true; + } on Exception catch (e) { + debugPrint(e.toString()); + return false; + } + } + + saveUserInHive() { + final box = Hive.box('currentUser'); + if (box.get('user') == null) { + box.put('user', _currentUser!); + } else { + box.put('user', _currentUser!); + } + } + + saveCurrentOrgInHive(OrgInfo saveOrgAsCurrent) { + _currentOrg = saveOrgAsCurrent; + _currentOrgInfoController.add(_currentOrg!); + final box = Hive.box('currentOrg'); + if (box.get('org') == null) { + box.put('org', _currentOrg!); + } else { + box.put('org', _currentOrg!); + } + } +} diff --git a/lib/splash_screen.dart b/lib/splash_screen.dart new file mode 100644 index 000000000..8479c91bb --- /dev/null +++ b/lib/splash_screen.dart @@ -0,0 +1,156 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/custom_painters/talawa_logo.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:uni_links/uni_links.dart'; + +class SplashScreen extends StatefulWidget { + const SplashScreen({required Key key}) : super(key: key); + + @override + _SplashScreenState createState() => _SplashScreenState(); +} + +class _SplashScreenState extends State { + Uri? _initialUri; + Uri? _latestUri; + late StreamSubscription _sub; + + Future _handleInitialUri() async { + _sub = uriLinkStream.listen((Uri? uri) { + if (!mounted) return; + setState(() { + _latestUri = uri; + }); + }, onError: (Object err) { + if (!mounted) return; + setState(() { + _latestUri = null; + }); + }); + try { + final uri = await getInitialUri(); + if (!mounted) return; + setState(() => _initialUri = uri); + } on PlatformException { + if (!mounted) return; + setState(() => _initialUri = null); + } on FormatException catch (err) { + debugPrint(err.toString()); + if (!mounted) return; + setState(() => _initialUri = null); + } + if (_latestUri == null && _initialUri == null) { + final bool userLoggedIn = await userConfig.userLoggedIn(); + Future.delayed(const Duration(milliseconds: 750)).then((value) async { + if (userLoggedIn) { + if (userConfig.currentUser.joinedOrganizations!.isEmpty) { + if (userConfig.currentUser.membershipRequests!.isEmpty) { + navigationService.pushReplacementScreen(Routes.joinOrg, + arguments: '0'); + } else { + navigationService.pushReplacementScreen(Routes.waitingScreen, + arguments: '0'); + } + } else { + navigationService.pushReplacementScreen(Routes.mainScreen, + arguments: '0'); + } + } else { + navigationService.pushReplacementScreen(Routes.languageSelectionRoute, + arguments: '0'); + } + }); + } else { + if (_initialUri != null) { + if (_initialUri!.pathSegments[1] == 'invite') { + navigationService.fromInviteLink( + _initialUri!.queryParameters.keys.toList(growable: false), + _initialUri!.queryParameters.values.toList(growable: false)); + } + } + } + } + + @override + void initState() { + _handleInitialUri(); + super.initState(); + } + + @override + void dispose() { + _sub.cancel(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + sizeConfig.init(context); + return Scaffold( + key: const Key('SplashScreenScaffold'), + body: Stack( + children: [ + Center( + child: CustomPaint( + key: const Key('LogoPainter'), + size: Size(SizeConfig.screenWidth! * 0.6, + (SizeConfig.screenWidth! * 0.6).toDouble()), + painter: AppLogo(), + ), + ), + Positioned( + top: SizeConfig.screenHeight! / 1.5, + left: 0.0, + right: 0.0, + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'TALAWA', + style: Theme.of(context).textTheme.headline4, + ), + ], + )), + Positioned( + top: SizeConfig.screenHeight! / 1.08, + left: 0.0, + right: 0.0, + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + AppLocalizations.of(context)!.strictTranslate('from'), + style: Theme.of(context).textTheme.caption, + ), + ], + )), + Positioned( + top: SizeConfig.screenHeight! / 1.05, + left: 0.0, + right: 0.0, + child: Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'PALISADOES', + style: Theme.of(context) + .textTheme + .subtitle2! + .copyWith(fontWeight: FontWeight.w700), + ), + ], + )) + ], + ), + ); + } +} diff --git a/lib/utils/app_localization.dart b/lib/utils/app_localization.dart new file mode 100644 index 000000000..f257b98ea --- /dev/null +++ b/lib/utils/app_localization.dart @@ -0,0 +1,95 @@ +import 'dart:convert'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +class AppLocalizations { + AppLocalizations( + this.locale, { + this.isTest = false, + }); + + late Map _localizedStrings; + final Locale locale; + bool isTest; + + // Helper method to keep the code in the widgets concise + static AppLocalizations? of(BuildContext context) { + return Localizations.of(context, AppLocalizations); + } + + // Static member to have a simple access to the delegate from the MaterialApp + static const LocalizationsDelegate delegate = + AppLocalizationsDelegate(); + + Future loadTest(Locale locale) async { + return AppLocalizations(locale); + } + + Future load() async { + // Load the language JSON file from the "lang" folder + final String jsonString = + await rootBundle.loadString('lang/${locale.languageCode}.json'); + final Map jsonMap = + json.decode(jsonString) as Map; + + _localizedStrings = jsonMap.map((key, value) { + return MapEntry(key, value.toString()); + }); + + return true; + } + + // This method will be called from every widget which needs a localized text + String? translate(String? key) { + if (isTest) return key; + + // ignore: unnecessary_null_comparison + if (key == null) { + return '...'; + } + return _localizedStrings[key]; + } + + // This method will be called from every widget which needs a localized text + String strictTranslate(String key) { + if (isTest) return key; + + // ignore: unnecessary_null_comparison + if (key == null) { + return '...'; + } + + final String translate = _localizedStrings[key] ?? key; + return translate; + } +} + +class AppLocalizationsDelegate extends LocalizationsDelegate { + const AppLocalizationsDelegate({ + this.isTest = false, + }); + final bool isTest; + + @override + bool isSupported(Locale locale) { + // Include all of your supported language codes here + return ['en', 'es', 'fr', 'hi', 'zh'].contains(locale.languageCode); + } + + @override + Future load(Locale locale) async { + // AppLocalizations class is where the JSON loading actually runs + final AppLocalizations localizations = + AppLocalizations(locale, isTest: isTest); + if (isTest) { + await localizations.loadTest(locale); + } else { + await localizations.load(); + } + + return localizations; + } + + @override + bool shouldReload(AppLocalizationsDelegate old) => false; +} diff --git a/lib/utils/comment_queries.dart b/lib/utils/comment_queries.dart new file mode 100644 index 000000000..569629d39 --- /dev/null +++ b/lib/utils/comment_queries.dart @@ -0,0 +1,31 @@ +class CommentQueries { + String createComment() { + return """ + mutation createComment(\$postId: ID!, \$text: String!) { + createComment(postId: \$postId, + data:{ + text: \$text, + } + ){ + _id + } + } + """; + } + + String getPostsComments(String postId) { + return """ + query{ + commentsByPost(id: "$postId"){ + _id + text + createdAt + creator{ + firstName + lastName + } + } + } + """; + } +} diff --git a/lib/utils/event_queries.dart b/lib/utils/event_queries.dart new file mode 100644 index 000000000..50f99c24e --- /dev/null +++ b/lib/utils/event_queries.dart @@ -0,0 +1,83 @@ +class EventQueries { + String fetchOrgEvents(String orgId) { + return """ + query { + events(id: "$orgId"){ + _id + organization { + _id + image + } + title + description + isPublic + isRegisterable + recurring + recurrance + startTime + endTime + allDay + startTime + endTime + location + isRegistered + creator{ + _id + } + } + } + """; + } + + String addEvent() { + return """ + mutation createEvent( \$organizationId: ID!, + \$title:String!, + \$description: String!, + \$startTime: String, + \$endTime: String, + \$allDay: Boolean!, + \$recurring: Boolean!, + \$isPublic: Boolean!, + \$isRegisterable: Boolean!, + \$location: String, + \$startDate : String!, + \$endDate : String!, + ) { + createEvent( + data:{ + organizationId: \$organizationId, + title: \$title, + description: \$description, + isPublic: \$isPublic, + isRegisterable: \$isRegisterable, + recurring: \$recurring, + allDay: \$allDay, + startTime: \$startTime, + endTime: \$endTime, + startDate: \$startDate, + endDate: \$endDate, + location: \$location + } + ){ + _id + title + description + } + } + """; + } + + String registerForEvent() { + return """ + mutation registerForEvent(\$eventId: ID!) { + registerForEvent(id: \$eventId) + { + _id + title + description + } + } + """; + } +} diff --git a/lib/utils/post_queries.dart b/lib/utils/post_queries.dart new file mode 100644 index 000000000..199a5c1f3 --- /dev/null +++ b/lib/utils/post_queries.dart @@ -0,0 +1,59 @@ +class PostQueries { + String getPostsById(String orgId) { + return """ + query { + postsByOrganization(id: "$orgId",orderBy: createdAt_DESC ) + { + _id + text + createdAt + imageUrl + videoUrl + title + commentCount + likeCount + creator{ + _id + firstName + lastName + image + } + organization{ + _id + } + likedBy{ + _id + } + comments{ + _id + } + } + } +"""; + } + + String addLike() { + return """ + mutation likePost(\$postID: ID!) { + likePost( id: \$postID,) + { + _id + } + } + """; + } + + String removeLike() { + return """ + mutation unlikePost(\$postID: ID!) { + unlikePost( id: \$postID,) + { + _id + likedBy{ + _id + } + } + } + """; + } +} diff --git a/lib/utils/queries.dart b/lib/utils/queries.dart new file mode 100644 index 000000000..3f1eb9589 --- /dev/null +++ b/lib/utils/queries.dart @@ -0,0 +1,337 @@ +class Queries { + String registerUser( + String firstName, String lastName, String email, String password) { + return """ + mutation{ + signUp(data: {firstName: "$firstName", lastName: "$lastName", email: "$email", password: "$password"}) + { + accessToken + user{ + _id + firstName + lastName + email + image + joinedOrganizations{ + _id + name + image + description + isPublic + creator{ + _id + firstName + lastName + image + } + } + createdOrganizations{ + _id + name + image + description + isPublic + creator{ + _id + firstName + lastName + image + } + } + membershipRequests{ + organization{ + _id + name + image + description + isPublic + creator{ + _id + firstName + lastName + image + } + } + } + adminFor{ + _id + } + } + refreshToken + } + } + """; + } + + //login the user + String loginUser(String email, String password) { + return """ + mutation { + login(data: {email: "$email", password: "$password"}){ + accessToken + user{ + _id + firstName + lastName + email + image + joinedOrganizations{ + _id + name + image + description + isPublic + creator{ + _id + firstName + lastName + image + } + } + createdOrganizations{ + _id + name + image + description + isPublic + creator{ + _id + firstName + lastName + image + } + } + membershipRequests{ + organization{ + _id + name + image + description + isPublic + creator{ + _id + firstName + lastName + image + } + } + } + adminFor{ + _id + } + } + refreshToken + } + } + """; + } + + String get fetchJoinInOrg { + return """ + query organizationsConnection(\$first: Int, \$skip: Int){ + organizationsConnection( + first: \$first, + skip: \$skip, + orderBy: name_ASC + ){ + image + _id + name + image + isPublic + creator{ + firstName + lastName + } + } + } +"""; + } + + String get fetchJoinInOrgByName { + return """ + query organizationsConnection( + \$first: Int, + \$skip: Int, + \$nameStartsWith: String + ){ + organizationsConnection( + where:{ + name_starts_with: \$nameStartsWith, + visibleInSearch: true, + isPublic: true, + } + first: \$first, + skip: \$skip, + orderBy: name_ASC + ){ + image + _id + name + image + isPublic + creator{ + firstName + lastName + } + } + } +"""; + } + + String joinOrgById(String orgId) { + return ''' + mutation { + joinPublicOrganization(organizationId: "$orgId") { + joinedOrganizations{ + _id + name + image + description + isPublic + creator{ + _id + firstName + lastName + image + } + } + } + } + '''; + } + + String sendMembershipRequest(String orgId) { + return ''' + mutation { + sendMembershipRequest(organizationId: "$orgId"){ + organization{ + _id + name + image + description + isPublic + creator{ + _id + firstName + lastName + image + } + } + } + } + '''; + } + + String fetchUserInfo = ''' + query Users(\$id: ID!){ + users(id:\$id){ + _id + firstName + lastName + email + image + joinedOrganizations{ + _id + name + image + description + isPublic + creator{ + _id + firstName + lastName + image + } + } + createdOrganizations{ + _id + name + image + description + isPublic + creator{ + _id + firstName + lastName + image + } + } + membershipRequests{ + organization{ + _id + name + image + isPublic + creator{ + _id + firstName + lastName + image + } + } + } + adminFor{ + _id + } + } + } + '''; + + String refreshToken(String refreshToken) { + return ''' + mutation{ + refreshToken(refreshToken: "$refreshToken"){ + accessToken + refreshToken + } + } + '''; + } + + String fetchOrgById(String orgId) { + return ''' + query{ + organizations(id: "$orgId"){ + image + _id + name + image + isPublic + creator{ + firstName + lastName + } + } + } + '''; + } + + String fetchOrgDetailsById(String orgId) { + return ''' + query{ + organizations(id: "$orgId"){ + image + _id + name + admins{ + _id + } + description + isPublic + creator{ + _id + firstName + lastName + } + members{ + _id + firstName + lastName + image + } + } + } + '''; + } +} diff --git a/lib/utils/validators.dart b/lib/utils/validators.dart new file mode 100644 index 000000000..e4f2dd1df --- /dev/null +++ b/lib/utils/validators.dart @@ -0,0 +1,117 @@ +import 'package:flutter/cupertino.dart'; +import 'package:http/http.dart' as http; + +class Validator { + static String? validateURL( + String value, + ) { + if (value.isEmpty) { + return 'Please verify URL first'; + } + final bool validURL = Uri.parse(value).isAbsolute; + if (!validURL) { + return 'Enter a valid URL'; + } + return null; + } + + static String? validateFirstName(String value) { + if (value.isEmpty) { + return 'Firstname must not be left blank.'; + } + // ignore: unnecessary_raw_strings + const String pattern = r'(?=.*?[A-Za-z]).+'; + final RegExp regex = RegExp(pattern); + if (!regex.hasMatch(value)) { + return "Invalid Firstname"; + } + return null; + } + + static String? validateLastName(String value) { + if (value.isEmpty) { + return 'Lastname must not be left blank.'; + } + // ignore: unnecessary_raw_strings + const String pattern = r"(?=.*?[A-Za-z]).+"; + final RegExp regex = RegExp(pattern); + if (!regex.hasMatch(value)) { + return "Invalid Lastname"; + } + return null; + } + + static String? validateEmail( + String email, + ) { + // If email is empty return. + if (email.isEmpty) { + return "Email must not be left blank"; + } + const String pattern = + r"^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,253}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,253}[a-zA-Z0-9])?)*$"; + final RegExp regex = RegExp(pattern); + if (!regex.hasMatch(email)) { + return 'Please enter a valid Email Address'; + } + return null; + } + + static String? validatePassword( + String password, + ) { + // If password is empty return. + if (password.isEmpty) { + return "Password must not be left blank"; + } + const String pattern = + r'^(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[!@#\$&*%^~.]).{8,}$'; + final RegExp regExp = RegExp(pattern); + + //Regex for no spaces allowed + const String noSpaces = r'^\S+$'; + final RegExp noSpaceRegex = RegExp(noSpaces); + + if (!regExp.hasMatch(password)) { + return "Invalid Password"; + } + if (!noSpaceRegex.hasMatch(password)) { + return "Password must not contain spaces"; + } + + return null; + } + + static String? validatePasswordConfirm( + String value, + String comparator, + ) { + if (value != comparator) { + return 'Password does not match original'; + } + return null; + } + + static Future validateUrlExistence(String url) async { + try { + await http.get(Uri.parse(url)); + return true; + } on Exception catch (e) { + debugPrint(e.toString()); + return false; + } + } + + static String? validateEventForm(String value, String? label) { + if (value.isEmpty) { + return '$label must not be left blank.'; + } + // ignore: unnecessary_raw_strings + const String pattern = r'(?=.*?[A-Za-z]).+'; + final RegExp regex = RegExp(pattern); + if (!regex.hasMatch(value)) { + return "Invalid $label"; + } + return null; + } +} diff --git a/lib/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart b/lib/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart new file mode 100644 index 000000000..2e5cec45b --- /dev/null +++ b/lib/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart @@ -0,0 +1,86 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/services/event_service.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/utils/event_queries.dart'; +import 'package:talawa/view_model/base_view_model.dart'; +import 'package:talawa/widgets/custom_progress_dialog.dart'; + +class CreateEventViewModel extends BaseModel { + TextEditingController eventTitleTextController = TextEditingController(); + TextEditingController eventLocationTextController = TextEditingController(); + TextEditingController eventDescriptionTextController = + TextEditingController(); + TimeOfDay eventStartTime = TimeOfDay.now(); + TimeOfDay eventEndTime = TimeOfDay.now(); + DateTime eventStartDate = DateTime.now(); + DateTime eventEndDate = DateTime.now(); + bool isPublicSwitch = true; + bool isRegisterableSwitch = false; + FocusNode titleFocus = FocusNode(); + FocusNode locationFocus = FocusNode(); + FocusNode descriptionFocus = FocusNode(); + + final formKey = GlobalKey(); + + final _eventService = locator(); + final _dbFunctions = locator(); + AutovalidateMode validate = AutovalidateMode.disabled; + + late OrgInfo _currentOrg; + final _userConfig = locator(); + + initialize() { + _currentOrg = _userConfig.currentOrg; + } + + Future createEvent() async { + titleFocus.unfocus(); + locationFocus.unfocus(); + descriptionFocus.unfocus(); + validate = AutovalidateMode.always; + if (formKey.currentState!.validate()) { + validate = AutovalidateMode.disabled; + + final DateTime startDate = eventStartDate; + final DateTime endDate = eventStartDate; + final DateTime startTime = DateTime(startDate.year, startDate.month, + startDate.day, eventStartTime.hour, eventStartTime.minute); + final DateTime endTime = DateTime(endDate.year, endDate.month, + endDate.day, eventEndTime.hour, eventEndTime.minute); + final Map variables = { + 'startDate': startDate.toString(), + 'endDate': endDate.toString(), + 'organizationId': _currentOrg.id!, + 'title': eventTitleTextController.text, + 'description': eventDescriptionTextController.text, + 'location': eventLocationTextController.text, + 'isPublic': isPublicSwitch, + 'isRegisterable': isRegisterableSwitch, + 'recurring': false, + 'allDay': false, + 'startTime': startTime.microsecondsSinceEpoch.toString(), + 'endTime': endTime.microsecondsSinceEpoch.toString(), + }; + + navigationService.pushDialog( + const CustomProgressDialog(key: Key('EventCreationProgress'))); + final tokenResult = await _dbFunctions + .refreshAccessToken(userConfig.currentUser.refreshToken!); + print(tokenResult); + final result = await _dbFunctions.gqlAuthMutation( + EventQueries().addEvent(), + variables: variables, + ); + navigationService.pop(); + print('Result is : $result'); + if (result != null) { + navigationService.pop(); + + _eventService.getEvents(); + } + } + } +} diff --git a/lib/view_model/after_auth_view_models/event_view_models/explore_events_view_model.dart b/lib/view_model/after_auth_view_models/event_view_models/explore_events_view_model.dart new file mode 100644 index 000000000..feff64891 --- /dev/null +++ b/lib/view_model/after_auth_view_models/event_view_models/explore_events_view_model.dart @@ -0,0 +1,76 @@ +import 'dart:async'; + +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/services/event_service.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +class ExploreEventsViewModel extends BaseModel { + final _eventService = locator(); + late StreamSubscription _eventStreamSubscription; + + String _chosenValue = 'My Events'; + List _events = []; + + late StreamSubscription _currentOrganizationStreamSubscription; + late final List _bufferEvents; + + String get chosenValue => _chosenValue; + choseValue(String value) { + _chosenValue = value; + notifyListeners(); + + if (chosenValue == 'Private Events') { + print(_events.length); + + _events = + _bufferEvents.where((element) => element.isPublic == false).toList(); + print(_events.length); + } else if (chosenValue == 'Public Events') { + print(_events.length); + + _events = + _bufferEvents.where((element) => element.isPublic == true).toList(); + print(_events.length); + } else if (chosenValue == 'My Events') { + _events = _bufferEvents; + } + } + + List get events => _events; + + void fetchNewEvents() { + _eventService.getEvents(); + } + + void refreshEvents() { + _events.clear(); + notifyListeners(); + } + + void initialise() { + setState(ViewState.busy); + + _currentOrganizationStreamSubscription = userConfig.currentOrfInfoStream + .listen((updatedOrganization) => refreshEvents()); + _eventStreamSubscription = + _eventService.eventStream.listen((newEvent) => addNewEvent(newEvent)); + _eventService.getEvents(); + _bufferEvents = _events; + setState(ViewState.idle); + } + + @override + void dispose() { + // Canceling the subscription so that there will be no rebuild after the widget is disposed. + _eventStreamSubscription.cancel(); + _currentOrganizationStreamSubscription.cancel(); + super.dispose(); + } + + addNewEvent(Event newEvent) { + _events.insert(0, newEvent); + notifyListeners(); + } +} diff --git a/lib/view_model/after_auth_view_models/feed_view_models/organization_feed_view_model.dart b/lib/view_model/after_auth_view_models/feed_view_models/organization_feed_view_model.dart new file mode 100644 index 000000000..5422be695 --- /dev/null +++ b/lib/view_model/after_auth_view_models/feed_view_models/organization_feed_view_model.dart @@ -0,0 +1,114 @@ +import 'dart:async'; + +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/services/post_service.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +class OrganizationFeedViewModel extends BaseModel { + // Local caching variables for a session. + // ignore: prefer_final_fields + List _posts = [], _pinnedPosts = []; + final Set _renderedPostID = {}; + late String _currentOrgname = ""; + + // Importing services. + final NavigationService _navigationService = locator(); + final UserConfig _userConfig = locator(); + final PostService _postService = locator(); + + // Stream variables + late StreamSubscription _currentOrganizationStreamSubscription; + late StreamSubscription _postsSubscription; + late StreamSubscription _updatePostSubscription; + + // Getters + List get posts => _posts; + List get pinnedPosts => _pinnedPosts; + String get currentOrgName => _currentOrgname; + + // Setters + void setCurrentOrganizationName(String updatedOrganization) { + _posts.clear(); + _renderedPostID.clear(); + _currentOrgname = updatedOrganization; + notifyListeners(); + _postService.getPosts(); + } + + void fetchNewPosts() { + _postService.getPosts(); + } + + void initialise() { + // For caching/initalizing the current organization after the stream subsciption has canceled and the stream is updated + _currentOrgname = _userConfig.currentOrg.name!; + _postService.getPosts(); + // ------ + // Attasching the stream subscription to rebuild the widgets automatically + _currentOrganizationStreamSubscription = _userConfig.currentOrfInfoStream + .listen((updatedOrganization) => + setCurrentOrganizationName(updatedOrganization.name!)); + + _postsSubscription = + _postService.postStream.listen((newPosts) => buildNewPosts(newPosts)); + + _updatePostSubscription = + _postService.updatedPostStream.listen((post) => updatedPost(post)); + } + + void initializeWithDemoData() { + // final postJsonResult = postsDemoData; + + // ------ + // Calling function to ge the post for the only 1st time. + // _postService.getPosts(); + + // //fetching pinnedPosts + // final pinnedPostJsonResult = pinnedPostsDemoData; + // pinnedPostJsonResult.forEach((pinnedPostJsonData) { + // _pinnedPosts.add(Post.fromJson(pinnedPostJsonData)); + // }); + } + + void buildNewPosts(List newPosts) { + _posts = newPosts; + notifyListeners(); + } + + void navigateToIndividualPage(Post post) { + _navigationService.pushScreen(Routes.individualPost, arguments: post); + } + + void navigateToPinnedPostPage() { + _navigationService.pushScreen(Routes.pinnedPostPage, + arguments: _pinnedPosts); + } + + @override + void dispose() { + // Canceling the subscription so that there will be no rebuild after the widget is disposed. + _currentOrganizationStreamSubscription.cancel(); + _postsSubscription.cancel(); + _updatePostSubscription.cancel(); + super.dispose(); + } + + addNewPost(Post newPost) { + _posts.insert(0, newPost); + notifyListeners(); + } + + updatedPost(Post post) { + for (int i = 0; i < _posts.length; i++) { + if (_posts[i].sId == post.sId) { + _posts[i] = post; + notifyListeners(); + break; + } + } + } +} diff --git a/lib/view_model/after_auth_view_models/profile_view_models/edit_profile_view_model.dart b/lib/view_model/after_auth_view_models/profile_view_models/edit_profile_view_model.dart new file mode 100644 index 000000000..3ec4714e5 --- /dev/null +++ b/lib/view_model/after_auth_view_models/profile_view_models/edit_profile_view_model.dart @@ -0,0 +1,18 @@ +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +class EditProfilePageViewModel extends BaseModel { + final user = Hive.box('currentUser'); + final org = Hive.box('currentOrg'); + TextEditingController firstNameTextController = TextEditingController(); + TextEditingController lastNameTextController = TextEditingController(); + FocusNode firstNameFocus = FocusNode(); + FocusNode lastNameFocus = FocusNode(); + final databaseService = databaseFunctions; + + initialize() {} +} diff --git a/lib/view_model/after_auth_view_models/profile_view_models/profile_page_view_model.dart b/lib/view_model/after_auth_view_models/profile_view_models/profile_page_view_model.dart new file mode 100644 index 000000000..1f0d30190 --- /dev/null +++ b/lib/view_model/after_auth_view_models/profile_view_models/profile_page_view_model.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/view_model/base_view_model.dart'; +import 'package:talawa/widgets/custom_alert_dialog.dart'; +import 'package:talawa/widgets/custom_progress_dialog.dart'; + +class ProfilePageViewModel extends BaseModel { + // Services + final _userConfig = locator(); + + late final Box user; + late final Box url; + late final Box organisation; + late OrgInfo currentOrg; + late User currentUser; + + initialize() { + setState(ViewState.busy); + currentOrg = _userConfig.currentOrg; + currentUser = _userConfig.currentUser; + setState(ViewState.idle); + } + + Future logout(BuildContext context) async { + navigationService.pushDialog(CustomAlertDialog( + reverse: true, + dialogSubTitle: 'Are you sure you want to logout?', + successText: 'Logout', + success: () { + navigationService.pop(); + navigationService.pushDialog(const CustomProgressDialog( + key: Key('LogoutProgress'), + )); + Future.delayed(const Duration(seconds: 1)).then((value) { + user = Hive.box('currentUser'); + url = Hive.box('url'); + organisation = Hive.box('currentOrg'); + user.clear(); + url.clear(); + organisation.clear(); + navigationService.removeAllAndPush('/selectLang', '/', + arguments: '0'); + }); + }, + )); + } +} diff --git a/lib/view_model/base_view_model.dart b/lib/view_model/base_view_model.dart new file mode 100644 index 000000000..335462fce --- /dev/null +++ b/lib/view_model/base_view_model.dart @@ -0,0 +1,14 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/enums/enums.dart'; + +class BaseModel extends ChangeNotifier { + ViewState _state = ViewState.idle; + + ViewState get state => _state; + bool get isBusy => _state == ViewState.busy; + + void setState(ViewState viewState) { + _state = viewState; + notifyListeners(); + } +} diff --git a/lib/view_model/lang_view_model.dart b/lib/view_model/lang_view_model.dart new file mode 100644 index 000000000..d51fc8035 --- /dev/null +++ b/lib/view_model/lang_view_model.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +class AppLanguage extends BaseModel { + AppLanguage({this.isTest = false}); + final bool isTest; + + Locale _appLocale = const Locale('en'); + Locale get appLocal => _appLocale; + + initialize() { + fetchLocale(); + } + + fetchLocale() async { + final prefs = await SharedPreferences.getInstance(); + final String langCode = prefs.getString('language_code') ?? 'en'; + _appLocale = Locale(langCode); + notifyListeners(); + return Null; + } + + Future changeLanguage(Locale type) async { + if (_appLocale == type) { + return; + } + + if (isTest) { + _appLocale = type; + } else { + final prefs = await SharedPreferences.getInstance(); + if (type == const Locale("es")) { + //If selected language is spanish + _appLocale = const Locale("es"); + await prefs.setString('language_code', 'es'); + await prefs.setString('countryCode', 'ES'); + } else if (type == const Locale("fr")) { + //If selected language is french + _appLocale = const Locale("fr"); + await prefs.setString('language_code', 'fr'); + await prefs.setString('countryCode', 'FR'); + } else if (type == const Locale("hi")) { + //If selected language is hindi + _appLocale = const Locale("hi"); + await prefs.setString('language_code', 'hi'); + await prefs.setString('countryCode', 'IN'); + } else if (type == const Locale("zh")) { + //If selected language is Chinese + _appLocale = const Locale("zh"); + await prefs.setString('language_code', 'zh'); + await prefs.setString('countryCode', 'CN'); + } else { + //If selected language is english + _appLocale = const Locale("en"); + await prefs.setString('language_code', 'en'); + await prefs.setString('countryCode', 'US'); + } + } + + notifyListeners(); + } +} diff --git a/lib/view_model/main_screen_view_model.dart b/lib/view_model/main_screen_view_model.dart new file mode 100644 index 000000000..7af6e9abc --- /dev/null +++ b/lib/view_model/main_screen_view_model.dart @@ -0,0 +1,10 @@ +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +class MainScreenViewModel extends BaseModel { + int currentIndex = 0; + onTabTapped(int index) { + currentIndex = index; + setState(ViewState.idle); + } +} diff --git a/lib/view_model/pre_auth_view_models/login_view_model.dart b/lib/view_model/pre_auth_view_models/login_view_model.dart new file mode 100644 index 000000000..af0b584b2 --- /dev/null +++ b/lib/view_model/pre_auth_view_models/login_view_model.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/view_model/base_view_model.dart'; +import 'package:talawa/widgets/custom_progress_dialog.dart'; + +class LoginViewModel extends BaseModel { + final formKey = GlobalKey(); + late List> greeting; + TextEditingController password = TextEditingController(); + TextEditingController email = TextEditingController(); + FocusNode passwordFocus = FocusNode(); + FocusNode emailFocus = FocusNode(); + AutovalidateMode validate = AutovalidateMode.disabled; + bool hidePassword = true; + + initialize() { + greeting = [ + { + 'text': "We're ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5 + }, + { + 'text': 'Glad ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline6! + .copyWith(fontSize: 24) + }, + { + 'text': "you're ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5 + }, + { + 'text': 'Back ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline6! + .copyWith(fontSize: 24) + }, + ]; + } + + login() async { + emailFocus.unfocus(); + passwordFocus.unfocus(); + validate = AutovalidateMode.always; + if (formKey.currentState!.validate()) { + validate = AutovalidateMode.disabled; + navigationService + .pushDialog(const CustomProgressDialog(key: Key('LoginProgress'))); + databaseFunctions.init(); + try { + final QueryResult result = await databaseFunctions.gqlNonAuthMutation( + queries.loginUser(email.text, password.text)) as QueryResult; + navigationService.pop(); + final User loggedInUser = + User.fromJson(result.data!['login'] as Map); + userConfig.updateUser(loggedInUser); + if (userConfig.currentUser.joinedOrganizations!.isEmpty) { + navigationService.removeAllAndPush('/waiting', '/'); + } else { + userConfig.saveCurrentOrgInHive( + userConfig.currentUser.joinedOrganizations![0]); + navigationService.removeAllAndPush('/mainScreen', '/'); + } + } on Exception catch (e) { + print(e); + } + } + } +} diff --git a/lib/view_model/pre_auth_view_models/select_organization_view_model.dart b/lib/view_model/pre_auth_view_models/select_organization_view_model.dart new file mode 100644 index 000000000..ed19f478e --- /dev/null +++ b/lib/view_model/pre_auth_view_models/select_organization_view_model.dart @@ -0,0 +1,333 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/queries.dart'; +import 'package:talawa/view_model/base_view_model.dart'; +import 'package:talawa/widgets/custom_list_tile.dart'; +import 'package:visibility_detector/visibility_detector.dart'; + +class SelectOrganizationViewModel extends BaseModel { + final ScrollController allOrgController = ScrollController(); + final ScrollController controller = ScrollController(); + final FocusNode searchFocus = FocusNode(); + final TextEditingController searchController = TextEditingController(); + late OrgInfo selectedOrganization = OrgInfo(id: '-1'); + late List organizations = []; + bool searching = false; + late Widget showSearchOrgList = Container(); + + searchActive() { + if (searchFocus.hasFocus) { + organizations = []; + searching = true; + setState(ViewState.idle); + } + } + + initialise(String initialData) async { + searchFocus.addListener(searchActive); + if (!initialData.contains('-1')) { + final fetch = await databaseFunctions.fetchOrgById(initialData); + if (fetch.runtimeType == OrgInfo) { + selectedOrganization = fetch as OrgInfo; + setState(ViewState.idle); + navigationService.pushScreen('/signupDetails', + arguments: selectedOrganization); + } + } + } + + selectOrg(OrgInfo item) async { + bool orgAlreadyJoined = false; + bool orgRequestAlreadyPresent = false; + final bool userLoggedIn = await userConfig.userLoggedIn(); + if (userLoggedIn) { + userConfig.currentUser.joinedOrganizations!.forEach((element) { + if (element.id! == item.id) { + orgAlreadyJoined = true; + } + }); + userConfig.currentUser.membershipRequests!.forEach((element) { + if (element.id! == item.id) { + orgRequestAlreadyPresent = true; + } + }); + if (!orgAlreadyJoined && !orgRequestAlreadyPresent) { + selectedOrganization = item; + setState(ViewState.idle); + } else if (orgAlreadyJoined) { + navigationService.showSnackBar('Organisation already joined'); + } else { + navigationService.showSnackBar('Membership request already sent'); + } + } else { + selectedOrganization = item; + setState(ViewState.idle); + } + } + + onTapContinue() { + if (selectedOrganization.id != '-1') { + navigationService.pushScreen('/signupDetails', + arguments: selectedOrganization); + } else { + navigationService.showSnackBar('Select one organization to continue', + duration: const Duration(milliseconds: 750)); + } + } + + onTapJoin() async { + if (selectedOrganization.isPublic == true) { + try { + final QueryResult result = await databaseFunctions.gqlAuthMutation( + queries.joinOrgById(selectedOrganization.id!)) as QueryResult; + + final List? joinedOrg = (result.data!['joinPublicOrganization'] + ['joinedOrganizations'] as List?) + ?.map((e) => OrgInfo.fromJson(e as Map)) + .toList(); + userConfig.updateUserJoinedOrg(joinedOrg!); + if (userConfig.currentUser.joinedOrganizations!.length == 1) { + userConfig.saveCurrentOrgInHive( + userConfig.currentUser.joinedOrganizations![0]); + navigationService.removeAllAndPush( + Routes.mainScreen, Routes.splashScreen); + } else { + navigationService.pop(); + navigationService + .showSnackBar('Joined ${selectedOrganization.name} successfully'); + } + } on Exception catch (e) { + print(e); + navigationService.showSnackBar('SomeThing went wrong'); + } + } else { + try { + final QueryResult result = await databaseFunctions.gqlAuthMutation( + queries.sendMembershipRequest(selectedOrganization.id!)) + as QueryResult; + final OrgInfo membershipRequest = OrgInfo.fromJson( + result.data!['sendMembershipRequest']['organization'] + as Map); + userConfig.updateUserMemberRequestOrg([membershipRequest]); + if (userConfig.currentUser.joinedOrganizations!.isEmpty) { + navigationService.removeAllAndPush( + Routes.waitingScreen, Routes.splashScreen); + } else { + navigationService.pop(); + navigationService.showSnackBar( + 'Join in request sent to ${selectedOrganization.name} successfully'); + } + } on Exception catch (e) { + print(e); + navigationService.showSnackBar('SomeThing went wrong'); + } + } + } + + Widget showOrganizationList() { + organizations = []; + return GraphQLProvider( + client: ValueNotifier(graphqlConfig.clientToQuery()), + child: Query( + options: + QueryOptions(document: gql(Queries().fetchJoinInOrg), variables: { + 'first': 15, + 'skip': 0, + }), + builder: (QueryResult result, + {Future Function(FetchMoreOptions)? fetchMore, + Future Function()? refetch}) { + if (result.hasException) { + final bool? isException = + databaseFunctions.encounteredExceptionOrError(result.exception!, + showSnackBar: false); + if (isException!) { + refetch!(); + } else { + refetch!(); + } + } else { + if (!result.isLoading) { + organizations = OrgInfo().fromJsonToList( + result.data!['organizationsConnection'] as List); + } + return Scrollbar( + isAlwaysShown: true, + interactive: true, + controller: allOrgController, + child: ListView.separated( + controller: allOrgController, + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: result.isLoading + ? organizations.length + 1 + : organizations.length, + itemBuilder: (BuildContext context, int index) { + if (index == organizations.length) { + return ListTile( + title: Center( + child: CupertinoActivityIndicator( + radius: SizeConfig.screenWidth! * 0.065, + ))); + } + if (index == organizations.length - 3) { + return VisibilityDetector( + key: const Key('OrgSelItem'), + onVisibilityChanged: (VisibilityInfo info) { + if (info.visibleFraction > 0) { + fetchMoreHelper(fetchMore!, organizations); + } + }, + child: CustomListTile( + index: index, + type: TileType.org, + orgInfo: organizations[index], + onTapOrgInfo: (item) => selectOrg(item), + key: Key('OrgSelItem$index'), + )); + } + return CustomListTile( + index: index, + type: TileType.org, + orgInfo: organizations[index], + onTapOrgInfo: (item) => selectOrg(item), + key: Key('OrgSelItem$index'), + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Padding( + padding: EdgeInsets.only( + left: SizeConfig.screenWidth! * 0.2, right: 12), + child: const Divider( + color: Color(0xFFE5E5E5), + thickness: 0.5, + ), + ); + }, + ), + ); + } + return Container(); + }, + ), + ); + } + + Widget showSearchList(String searchOrgWithName) { + print(searchOrgWithName); + return GraphQLProvider( + client: ValueNotifier(graphqlConfig.authClient()), + child: Query( + options: QueryOptions( + document: gql(Queries().fetchJoinInOrgByName), + variables: { + 'nameStartsWith': searchOrgWithName, + 'first': 30, + 'skip': 0, + }), + builder: (QueryResult result, + {Future Function(FetchMoreOptions)? fetchMore, + Future Function()? refetch}) { + if (result.hasException) { + final bool? isException = + databaseFunctions.encounteredExceptionOrError(result.exception!, + showSnackBar: false); + if (isException!) { + refetch!(); + } else { + refetch!(); + } + } else { + if (!result.isLoading) { + organizations = OrgInfo().fromJsonToList( + result.data!['organizationsConnection'] as List); + } + return Scrollbar( + isAlwaysShown: true, + interactive: true, + controller: controller, + child: ListView.separated( + controller: controller, + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: result.isLoading + ? organizations.length + 1 + : organizations.length, + itemBuilder: (BuildContext context, int index) { + if (index == organizations.length) { + return ListTile( + title: Center( + child: CupertinoActivityIndicator( + radius: SizeConfig.screenWidth! * 0.065, + ))); + } + if (index == organizations.length - 3) { + return VisibilityDetector( + key: const Key('OrgSelItem'), + onVisibilityChanged: (VisibilityInfo info) { + if (info.visibleFraction > 0) { + print(organizations.length); + fetchMoreHelper(fetchMore!, organizations); + print(organizations.length); + } + }, + child: CustomListTile( + index: index, + type: TileType.org, + orgInfo: organizations[index], + onTapOrgInfo: (item) => selectOrg(item), + key: Key('OrgSelItem$index'), + )); + } + return CustomListTile( + index: index, + type: TileType.org, + orgInfo: organizations[index], + onTapOrgInfo: (item) => selectOrg(item), + key: Key('OrgSelItem$index'), + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Padding( + padding: EdgeInsets.only( + left: SizeConfig.screenWidth! * 0.2, right: 12), + child: const Divider( + color: Color(0xFFE5E5E5), + thickness: 0.5, + ), + ); + }, + ), + ); + } + return Container(); + }, + ), + ); + } + + void fetchMoreHelper(FetchMore fetchMore, List organizations) { + fetchMore( + FetchMoreOptions( + variables: { + "first": organizations.length + 15, + "skip": organizations.length, + }, + updateQuery: (existingOrganizations, newOrganizations) { + return { + 'organizationsConnection': [ + ...existingOrganizations!["organizationsConnection"], + ...newOrganizations!['organizationsConnection'], + ], + }; + }, + ), + ); + } +} diff --git a/lib/view_model/pre_auth_view_models/set_url_view_model.dart b/lib/view_model/pre_auth_view_models/set_url_view_model.dart new file mode 100644 index 000000000..2518c3d43 --- /dev/null +++ b/lib/view_model/pre_auth_view_models/set_url_view_model.dart @@ -0,0 +1,85 @@ +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/utils/validators.dart'; +import 'package:talawa/view_model/base_view_model.dart'; +import 'package:talawa/widgets/custom_progress_dialog.dart'; + +class SetUrlViewModel extends BaseModel { + final formKey = GlobalKey(); + static const imageUrlKey = "imageUrl"; + static const urlKey = "url"; + TextEditingController url = TextEditingController(); + FocusNode urlFocus = FocusNode(); + late List> greeting; + AutovalidateMode validate = AutovalidateMode.disabled; + + initialise({String inviteUrl = ''}) { + final uri = inviteUrl; + if (uri.isNotEmpty) { + final box = Hive.box('url'); + box.put(urlKey, uri); + box.put(imageUrlKey, "$uri/talawa/"); + graphqlConfig.getOrgUrl(); + } + greeting = [ + { + 'text': 'Join ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline6! + .copyWith(fontSize: 24, fontWeight: FontWeight.w700) + }, + { + 'text': 'and ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5 + }, + { + 'text': 'Collaborate ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline6! + .copyWith(fontSize: 24, fontWeight: FontWeight.w700) + }, + { + 'text': 'with your ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5 + }, + { + 'text': 'Organizations', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5! + .copyWith(fontSize: 24, color: const Color(0xFF4285F4)) + }, + ]; + } + + checkURLandNavigate(String navigateTo, String argument) async { + urlFocus.unfocus(); + validate = AutovalidateMode.always; + if (formKey.currentState!.validate()) { + navigationService + .pushDialog(const CustomProgressDialog(key: Key('UrlCheckProgress'))); + validate = AutovalidateMode.disabled; + final String uri = url.text.trim(); + final bool? urlPresent = await Validator.validateUrlExistence(uri); + if (urlPresent! == true) { + final box = Hive.box('url'); + await box.put(urlKey, uri); + await box.put(imageUrlKey, "$uri/talawa/"); + + navigationService.pop(); + graphqlConfig.getOrgUrl(); + navigationService.pushScreen(navigateTo, arguments: argument); + } else { + navigationService + .showSnackBar("URL doesn't exist/no connection please check"); + } + } + } +} diff --git a/lib/view_model/pre_auth_view_models/signup_details_view_model.dart b/lib/view_model/pre_auth_view_models/signup_details_view_model.dart new file mode 100644 index 000000000..868a0d62a --- /dev/null +++ b/lib/view_model/pre_auth_view_models/signup_details_view_model.dart @@ -0,0 +1,119 @@ +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/view_model/base_view_model.dart'; +import 'package:talawa/widgets/custom_progress_dialog.dart'; + +class SignupDetailsViewModel extends BaseModel { + final formKey = GlobalKey(); + late List> greeting; + late OrgInfo selectedOrganization; + TextEditingController confirmPassword = TextEditingController(); + TextEditingController firstName = TextEditingController(); + TextEditingController lastName = TextEditingController(); + TextEditingController password = TextEditingController(); + TextEditingController email = TextEditingController(); + AutovalidateMode validate = AutovalidateMode.disabled; + FocusNode confirmFocus = FocusNode(); + bool hidePassword = true; + + initialise(OrgInfo org) { + selectedOrganization = org; + greeting = [ + { + 'text': "Let's ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5 + }, + { + 'text': 'get ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5 + }, + { + 'text': "you ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5 + }, + { + 'text': 'SignUp ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline6! + .copyWith(fontSize: 24) + }, + ]; + } + + signUp() async { + FocusScope.of(navigationService.navigatorKey.currentContext!).unfocus(); + setState(ViewState.busy); + validate = AutovalidateMode.always; + setState(ViewState.idle); + if (formKey.currentState!.validate()) { + validate = AutovalidateMode.disabled; + navigationService + .pushDialog(const CustomProgressDialog(key: Key('SignUpProgress'))); + databaseFunctions.init(); + try { + final QueryResult result = await databaseFunctions.gqlNonAuthMutation( + queries.registerUser( + firstName.text, lastName.text, email.text, password.text)) + as QueryResult; + final User signedInUser = + User.fromJson(result.data!['signUp'] as Map); + final bool userSaved = await userConfig.updateUser(signedInUser); + final bool tokenRefreshed = await graphqlConfig.getToken() as bool; + if (userSaved && tokenRefreshed) { + if (selectedOrganization.isPublic!) { + try { + final QueryResult result = + await databaseFunctions.gqlAuthMutation( + queries.joinOrgById(selectedOrganization.id!)) + as QueryResult; + + final List? joinedOrg = + (result.data!['joinPublicOrganization']['joinedOrganizations'] + as List?) + ?.map((e) => OrgInfo.fromJson(e as Map)) + .toList(); + userConfig.updateUserJoinedOrg(joinedOrg!); + userConfig.saveCurrentOrgInHive( + userConfig.currentUser.joinedOrganizations![0]); + navigationService.removeAllAndPush('/mainScreen', '/'); + } on Exception catch (e) { + print(e); + navigationService.showSnackBar('SomeThing went wrong'); + } + } else { + try { + final QueryResult result = + await databaseFunctions.gqlAuthMutation(queries + .sendMembershipRequest(selectedOrganization.id!)) + as QueryResult; + + final OrgInfo membershipRequest = OrgInfo.fromJson( + result.data!['sendMembershipRequest']['organization'] + as Map); + userConfig.updateUserMemberRequestOrg([membershipRequest]); + navigationService.pop(); + navigationService.removeAllAndPush('/waiting', '/'); + } on Exception catch (e) { + print(e); + navigationService.showSnackBar('SomeThing went wrong'); + } + } + } + } on Exception catch (e) { + print(e); + navigationService.showSnackBar('SomeThing went wrong'); + } + } + } +} diff --git a/lib/view_model/pre_auth_view_models/waiting_view_model.dart b/lib/view_model/pre_auth_view_models/waiting_view_model.dart new file mode 100644 index 000000000..d6d18da25 --- /dev/null +++ b/lib/view_model/pre_auth_view_models/waiting_view_model.dart @@ -0,0 +1,52 @@ +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +class WaitingViewModel extends BaseModel { + late List> greeting; + late List pendingRequestOrg; + late User currentUser; + + initialise() { + currentUser = userConfig.currentUser; + pendingRequestOrg = currentUser.membershipRequests!; + print(pendingRequestOrg.length); + greeting = [ + { + 'text': "Please wait ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5 + }, + { + 'text': currentUser.firstName, + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline6! + .copyWith(fontSize: 24) + }, + { + 'text': " for organisation(s) to accept your invitation. ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5 + }, + ]; + } + + logout() { + final user = Hive.box('currentUser'); + final url = Hive.box('url'); + user.clear(); + url.clear(); + navigationService.removeAllAndPush('/selectLang', '/', arguments: '0'); + } + + joinOrg() { + navigationService.pushScreen(Routes.joinOrg); + } +} diff --git a/lib/view_model/widgets_view_models/comments_view_model.dart b/lib/view_model/widgets_view_models/comments_view_model.dart new file mode 100644 index 000000000..974c46487 --- /dev/null +++ b/lib/view_model/widgets_view_models/comments_view_model.dart @@ -0,0 +1,54 @@ +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/comment/comment_model.dart'; +import 'package:talawa/services/comment_service.dart'; +import 'package:talawa/services/post_service.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +class CommentsViewModel extends BaseModel { + late CommentService _commentService; + late PostService _postService; + late String _postID; + late List _commentlist; + late UserConfig _userConfig; + + // Getters + List get commentList => _commentlist; + + void initialise(String postID) { + _commentlist = []; + _postID = postID; + _commentService = locator(); + _userConfig = locator(); + _postService = locator(); + notifyListeners(); + getComments(); + } + + Future getComments() async { + setState(ViewState.busy); + final List _commentsJSON = + await _commentService.getCommentsForPost(_postID) as List; + print(_commentsJSON); + _commentsJSON.forEach((commentJson) { + _commentlist.add(Comment.fromJson(commentJson as Map)); + }); + setState(ViewState.idle); + } + + Future createComment(String msg) async { + print("comment viewModel called"); + await _commentService.createComments(_postID, msg); + addCommentLocally(msg); + } + + void addCommentLocally(String msg) { + _postService.addCommentLocally(_postID); + final _creator = _userConfig.currentUser; + final Comment _localComment = Comment( + text: msg, createdAt: DateTime.now().toString(), creator: _creator); + _commentlist.insert(0, _localComment); + notifyListeners(); + } +} diff --git a/lib/view_model/widgets_view_models/custom_drawer_view_model.dart b/lib/view_model/widgets_view_models/custom_drawer_view_model.dart new file mode 100644 index 000000000..ccc1325c8 --- /dev/null +++ b/lib/view_model/widgets_view_models/custom_drawer_view_model.dart @@ -0,0 +1,48 @@ +import 'dart:async'; + +import 'package:flutter/cupertino.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +class CustomDrawerViewModel extends BaseModel { + final ScrollController controller = ScrollController(); + late User _currentUser; + late List _switchAbleOrg; + late OrgInfo _selectedOrg; + late StreamSubscription _currentOrganizationStreamSubscription; + OrgInfo get selectedOrg => _selectedOrg; + List get switchAbleOrg => _switchAbleOrg; + + initialize() { + _currentOrganizationStreamSubscription = userConfig.currentOrfInfoStream + .listen((updatedOrganization) => + setSelectedOrganizationName(updatedOrganization)); + _currentUser = userConfig.currentUser; + _selectedOrg = userConfig.currentOrg; + _switchAbleOrg = _currentUser.joinedOrganizations!; + } + + switchOrg(OrgInfo switchToOrg) { + if (selectedOrg == switchToOrg) { + // _navigationService.pop(); + navigationService.showSnackBar('${switchToOrg.name} already selected'); + } else { + userConfig.saveCurrentOrgInHive(switchToOrg); + navigationService.showSnackBar('Switched to ${switchToOrg.name}'); + } + navigationService.pop(); + } + + setSelectedOrganizationName(OrgInfo updatedOrganization) { + _selectedOrg = updatedOrganization; + notifyListeners(); + } + + @override + void dispose() { + _currentOrganizationStreamSubscription.cancel(); + super.dispose(); + } +} diff --git a/lib/view_model/widgets_view_models/like_button_view_model.dart b/lib/view_model/widgets_view_models/like_button_view_model.dart new file mode 100644 index 000000000..07490c2a8 --- /dev/null +++ b/lib/view_model/widgets_view_models/like_button_view_model.dart @@ -0,0 +1,76 @@ +import 'dart:async'; + +import 'package:talawa/locator.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/post_service.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +class LikeButtonViewModel extends BaseModel { + // Services + final _userConfig = locator(); + final _postService = locator(); + + // Local Variables for session caching + bool _isLiked = false; + late User _user; + List _likedBy = []; + late String _postID; + + // ignore: unused_field + late StreamSubscription _updatePostSubscription; + + // Getters + bool get isLiked => _isLiked; + List get likedBy => _likedBy; + int get likesCount => _likedBy.length; + // initialize + void initialize(List likedBy, String postID) { + _postID = postID; + _user = _userConfig.currentUser; + _likedBy = likedBy; + notifyListeners(); + checkAndSetTheIsLiked(); + _updatePostSubscription = + _postService.updatedPostStream.listen((post) => updatePost(post)); + } + + void toggleIsLiked() { + if (!_isLiked) { + _postService.addLike(_postID); + } else { + _postService.removeLike(_postID); + } + } + + void setIsLiked({bool val = true}) { + _isLiked = val; + notifyListeners(); + } + + /*TODO: This function must be removed bec the checking, that the user + has liked the post or not must be send from the backend and not + the processing should be done in front end.*/ + void checkAndSetTheIsLiked() { + setIsLiked(val: false); + for (var i = 0; i < _likedBy.length; i++) { + if (_likedBy[i].sId == _user.id) { + setIsLiked(); + } + } + } + + updatePost(Post post) { + if (_postID == post.sId) { + _likedBy = post.likedBy!; + checkAndSetTheIsLiked(); + } + } + + @override + // ignore: must_call_super + void dispose() { + _updatePostSubscription.cancel(); + } +} diff --git a/lib/view_model/widgets_view_models/progress_dialog_view_model.dart b/lib/view_model/widgets_view_models/progress_dialog_view_model.dart new file mode 100644 index 000000000..b60b347e6 --- /dev/null +++ b/lib/view_model/widgets_view_models/progress_dialog_view_model.dart @@ -0,0 +1,21 @@ +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +class ProgressDialogViewModel extends BaseModel { + late ConnectivityResult connectivityResult; + bool connectivityPresent = false; + initialise() async { + setState(ViewState.busy); + connectivityResult = await Connectivity().checkConnectivity(); + if (connectivityResult == ConnectivityResult.none) { + connectivityPresent = false; + Future.delayed(const Duration(seconds: 2)) + .then((value) => navigationService.pop()); + } else { + connectivityPresent = true; + } + setState(ViewState.idle); + } +} diff --git a/lib/views/after_auth_screens/add_post_page.dart b/lib/views/after_auth_screens/add_post_page.dart new file mode 100644 index 000000000..99ced46fd --- /dev/null +++ b/lib/views/after_auth_screens/add_post_page.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/utils/app_localization.dart'; + +class AddPost extends StatelessWidget { + const AddPost({Key? key, this.drawerKey}) : super(key: key); + final GlobalKey? drawerKey; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + elevation: 0.9, + centerTitle: true, + title: Text( + AppLocalizations.of(context)!.strictTranslate('Share News'), + style: Theme.of(context).textTheme.headline6!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + leading: IconButton( + icon: const Icon(Icons.menu), + onPressed: () => drawerKey!.currentState!.openDrawer(), + ), + actions: [ + TextButton( + onPressed: () {}, + child: Text( + AppLocalizations.of(context)!.strictTranslate("Post"), + style: Theme.of(context).textTheme.headline5!.copyWith( + fontWeight: FontWeight.w600, + color: Theme.of(context).accentColor), + ), + ), + ], + ), + body: Column( + children: [ + ListTile( + leading: const CircleAvatar(radius: 25), + title: const Text('Rutvik Chandla'), + subtitle: Text(AppLocalizations.of(context)! + .strictTranslate('Organization Name')), + ), + Row( + children: [ + IconButton(onPressed: () {}, icon: const Icon(Icons.photo)), + IconButton( + onPressed: () {}, icon: const Icon(Icons.camera_alt)), + IconButton( + onPressed: () {}, icon: const Icon(Icons.file_upload)), + TextButton( + onPressed: () {}, + child: Text( + '# ${AppLocalizations.of(context)!.strictTranslate("Add hasthtag")}', + style: Theme.of(context).textTheme.headline6, + )), + ], + ), + const Divider(), + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: TextField( + maxLines: null, + decoration: InputDecoration( + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + errorBorder: InputBorder.none, + disabledBorder: InputBorder.none, + hintText: AppLocalizations.of(context)!.strictTranslate( + "Write here what do you want to share")), + ), + )) + ], + )); + } +} diff --git a/lib/views/after_auth_screens/events/create_event_form.dart b/lib/views/after_auth_screens/events/create_event_form.dart new file mode 100644 index 000000000..474fb6879 --- /dev/null +++ b/lib/views/after_auth_screens/events/create_event_form.dart @@ -0,0 +1,117 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/utils/validators.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart'; + +class CreateEventForm extends StatelessWidget { + const CreateEventForm({Key? key, required this.model}) : super(key: key); + final CreateEventViewModel model; + @override + Widget build(BuildContext context) { + return Form( + key: model.formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + TextFormField( + textInputAction: TextInputAction.next, + controller: model.eventTitleTextController, + keyboardType: TextInputType.name, + maxLength: 20, + focusNode: model.titleFocus, + validator: (value) { + final String? val = Validator.validateEventForm(value!, 'Title'); + if (val != null) { + return AppLocalizations.of(context)!.translate(val); + } + + return null; + }, + decoration: InputDecoration( + labelText: + AppLocalizations.of(context)!.translate('Add Event Title'), + isDense: true, + labelStyle: Theme.of(context).textTheme.subtitle1, + focusedBorder: InputBorder.none, + counterText: "", + enabledBorder: InputBorder.none, + prefixIcon: Container( + transform: Matrix4.translationValues( + -SizeConfig.screenWidth! * 0.027, 0.0, 0.0), + child: const Icon(Icons.title, size: 25), + ), + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + TextFormField( + textInputAction: TextInputAction.next, + keyboardType: TextInputType.streetAddress, + controller: model.eventLocationTextController, + focusNode: model.locationFocus, + validator: (value) { + final String? val = + Validator.validateEventForm(value!, 'Location'); + if (val != null) { + return AppLocalizations.of(context)!.translate(val); + } + + return null; + }, + decoration: InputDecoration( + hintText: + '${AppLocalizations.of(context)!.translate("Where is the event")}?', + labelText: + AppLocalizations.of(context)!.translate('Add Location'), + labelStyle: Theme.of(context).textTheme.subtitle1, + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + prefixIcon: Container( + transform: Matrix4.translationValues( + -SizeConfig.screenWidth! * 0.027, 0.0, 0.0), + child: const Icon(Icons.place, size: 25), + ), + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + TextFormField( + keyboardType: TextInputType.multiline, + controller: model.eventDescriptionTextController, + focusNode: model.descriptionFocus, + validator: (value) { + final String? val = + Validator.validateEventForm(value!, 'Description'); + if (val != null) { + return AppLocalizations.of(context)!.translate(val); + } + + return null; + }, + maxLines: 10, + minLines: 1, + decoration: InputDecoration( + hintText: + AppLocalizations.of(context)!.translate('Describe the event'), + labelText: + AppLocalizations.of(context)!.translate('Add Description'), + labelStyle: Theme.of(context).textTheme.subtitle1, + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + prefixIcon: Container( + transform: Matrix4.translationValues( + -SizeConfig.screenWidth! * 0.027, 0.0, 0.0), + child: const Icon(Icons.view_headline, size: 25), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/views/after_auth_screens/events/create_event_page.dart b/lib/views/after_auth_screens/events/create_event_page.dart new file mode 100644 index 000000000..39b51f9e3 --- /dev/null +++ b/lib/views/after_auth_screens/events/create_event_page.dart @@ -0,0 +1,270 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/create_event_form.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/date_time_picker.dart'; +import 'package:talawa/widgets/event_date_time_tile.dart'; + +class CreateEventPage extends StatefulWidget { + const CreateEventPage({Key? key}) : super(key: key); + + @override + _CreateEventPageState createState() => _CreateEventPageState(); +} + +class _CreateEventPageState extends State { + @override + Widget build(BuildContext context) { + final TextStyle _subtitleTextStyle = + Theme.of(context).textTheme.headline5!.copyWith(fontSize: 16); + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return Scaffold( + appBar: AppBar( + elevation: 1, + centerTitle: true, + leading: GestureDetector( + onTap: () { + navigationService.pop(); + }, + child: const Icon(Icons.close)), + title: Text( + AppLocalizations.of(context)!.strictTranslate('Add Event'), + style: Theme.of(context).textTheme.headline6!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + actions: [ + TextButton( + onPressed: () { + model.createEvent(); + }, + child: Text( + AppLocalizations.of(context)!.strictTranslate('Add'), + style: Theme.of(context).textTheme.bodyText1!.copyWith( + fontSize: 16, color: Theme.of(context).accentColor), + ), + ), + ], + ), + body: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.all(15), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + const Icon( + Icons.image, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.036, + ), + TextButton( + onPressed: () {}, + child: Text( + AppLocalizations.of(context)! + .strictTranslate("Add Image"), + style: _subtitleTextStyle, + ), + ) + ], + ), + const Divider(), + CreateEventForm( + model: model, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + const Divider(), + Text( + AppLocalizations.of(context)! + .strictTranslate('Select Start Date and Time'), + style: _subtitleTextStyle, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + DateTimeTile( + child: Row( + children: [ + const Icon( + Icons.calendar_today, + color: Color(0xff524F4F), + size: 19, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.045, + ), + GestureDetector( + onTap: () async { + final _date = await customDatePicker( + initialDate: model.eventStartDate); + setState(() { + model.eventStartDate = _date; + }); + }, + child: Text( + "${model.eventStartDate.toLocal()}".split(' ')[0], + style: const TextStyle(fontSize: 16), + ), + ), + const Spacer(), + const Icon( + Icons.schedule, + color: Color(0xff524F4F), + size: 19, + ), + SizedBox(width: SizeConfig.screenWidth! * 0.045), + GestureDetector( + onTap: () async { + final _time = await customTimePicker( + initialTime: model.eventStartTime); + + setState(() { + model.eventStartTime = _time; + }); + }, + child: Text( + model.eventStartTime.format(context), + style: const TextStyle(fontSize: 16), + ), + ), + ], + )), + SizedBox( + height: SizeConfig.screenHeight! * 0.026, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate('Select End Date and Time'), + style: Theme.of(context) + .textTheme + .headline5! + .copyWith(fontSize: 16), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + DateTimeTile( + child: Row( + children: [ + const Icon( + Icons.calendar_today, + color: Color(0xff524F4F), + size: 19, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.045, + ), + GestureDetector( + onTap: () async { + final _date = await customDatePicker( + initialDate: model.eventEndDate); + setState(() { + model.eventEndDate = _date; + }); + }, + child: Text( + "${model.eventEndDate.toLocal()}".split(' ')[0], + style: const TextStyle(fontSize: 16), + ), + ), + const Spacer(), + const Icon( + Icons.schedule, + color: Color(0xff524F4F), + size: 19, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.045, + ), + GestureDetector( + onTap: () async { + final _time = await customTimePicker( + initialTime: model.eventEndTime); + + setState(() { + model.eventEndTime = _time; + }); + }, + child: Text( + model.eventEndTime.format(context), + style: const TextStyle(fontSize: 16), + ), + ), + ], + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.026, + ), + Row( + children: [ + const Icon(Icons.restore), + SizedBox( + width: SizeConfig.screenWidth! * 0.045, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate('Does not repeat'), + style: _subtitleTextStyle, + ) + ], + ), + SizedBox(height: SizeConfig.screenHeight! * 0.026), + const Divider(), + Row( + children: [ + Text( + AppLocalizations.of(context)! + .strictTranslate('Keep Public'), + style: _subtitleTextStyle), + SizedBox( + width: SizeConfig.screenWidth! * 0.005, + ), + Switch( + value: model.isPublicSwitch, + onChanged: (value) { + setState(() { + model.isPublicSwitch = value; + print(model.isPublicSwitch); + }); + }, + activeColor: Theme.of(context).colorScheme.primary, + ), + const Spacer(), + Text( + AppLocalizations.of(context)! + .strictTranslate('Keep Registerable'), + style: _subtitleTextStyle), + SizedBox( + width: SizeConfig.screenWidth! * 0.005, + ), + Switch( + value: model.isRegisterableSwitch, + onChanged: (value) { + setState(() { + model.isRegisterableSwitch = value; + print(model.isRegisterableSwitch); + }); + }, + activeColor: Theme.of(context).colorScheme.primary, + ), + ], + ), + ], + ), + ), + ), + ); + }); + } +} diff --git a/lib/views/after_auth_screens/events/event_info_page.dart b/lib/views/after_auth_screens/events/event_info_page.dart new file mode 100644 index 000000000..7d05b80e7 --- /dev/null +++ b/lib/views/after_auth_screens/events/event_info_page.dart @@ -0,0 +1,257 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/widgets/custom_list_tile.dart'; + +class EventInfoPage extends StatefulWidget { + const EventInfoPage({Key? key, required this.event}) : super(key: key); + final Event event; + + @override + _EventInfoPageState createState() => _EventInfoPageState(); +} + +class _EventInfoPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: CustomScrollView( + slivers: [ + SliverAppBar( + title: Text( + AppLocalizations.of(context)!.strictTranslate('Event Details')), + pinned: true, + expandedHeight: SizeConfig.screenWidth, + flexibleSpace: FlexibleSpaceBar( + background: Image.network( + 'https://picsum.photos/id/26/200/300', + fit: BoxFit.fill, + ), + ), + ), + _eventInfoBody() + ], + ), + floatingActionButton: FloatingActionButton.extended( + onPressed: () { + //EventService().registerForAnEvent(widget.event.id!); + }, + label: Text( + AppLocalizations.of(context)!.strictTranslate("Register"), + style: Theme.of(context) + .textTheme + .bodyText2! + .copyWith(color: Theme.of(context).accentColor), + )), + ); + } + + Widget _eventInfoBody() { + return SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + widget.event.title!, + style: Theme.of(context) + .textTheme + .headline4! + .copyWith(fontSize: 26), + ), + const Icon(Icons.chat_bubble_outline) + ], + ), + Row( + children: [ + widget.event.creator!.firstName != null + ? Text( + "${AppLocalizations.of(context)!.strictTranslate("Created by")}: ${widget.event.creator!.firstName} ${widget.event.creator!.lastName}", + style: Theme.of(context) + .textTheme + .bodyText2! + .copyWith(fontWeight: FontWeight.w600), + ) + : Text( + "${AppLocalizations.of(context)!.strictTranslate("Created by")}: Luke Skywalker", + style: Theme.of(context) + .textTheme + .bodyText2! + .copyWith(fontWeight: FontWeight.w600), + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.011, + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Icon( + Icons.calendar_today, + size: 13, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.027, + ), + Text( + "${widget.event.startDate!} - ${widget.event.endDate!}", + style: Theme.of(context).textTheme.caption, + ), + const Spacer(), + widget.event.isPublic! + ? Icon( + Icons.lock_open, + size: 13, + color: Theme.of(context).accentColor, + ) + : Icon( + Icons.lock, + size: 13, + color: Theme.of(context).colorScheme.primary, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.027, + ), + widget.event.isPublic! + ? Text( + AppLocalizations.of(context)!.strictTranslate('public'), + style: Theme.of(context).textTheme.caption, + ) + : Text( + AppLocalizations.of(context)! + .strictTranslate('private'), + style: Theme.of(context).textTheme.caption, + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.011, + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Icon( + Icons.schedule, + size: 12, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.025, + ), + Text( + "${widget.event.startTime!} - ${widget.event.endTime!}", + style: Theme.of(context).textTheme.caption, + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.011, + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Icon( + Icons.place, + size: 12, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.027, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.88, + child: Text( + widget.event.location!, + style: Theme.of(context).textTheme.caption, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + maxLines: 3, + ), + ), + ], + ), + + const Divider(), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + Text( + AppLocalizations.of(context)!.strictTranslate("Description"), + style: + Theme.of(context).textTheme.headline5!.copyWith(fontSize: 16), + ), + SizedBox(width: SizeConfig.screenWidth! * 0.013), + Text( + widget.event.description!, + style: Theme.of(context).textTheme.caption, + ), + SizedBox(height: SizeConfig.screenHeight! * 0.013), + Text( + AppLocalizations.of(context)!.strictTranslate("Admins"), + style: + Theme.of(context).textTheme.headline5!.copyWith(fontSize: 16), + ), + Divider( + color: Theme.of(context).colorScheme.onBackground, + thickness: 2, + ), + CustomListTile( + index: 0, + key: const Key('Admins'), + type: TileType.user, + userInfo: userConfig.currentUser, + onTapUserInfo: () {}), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + AppLocalizations.of(context)!.strictTranslate("Attendees"), + style: Theme.of(context) + .textTheme + .headline5! + .copyWith(fontSize: 16), + ), + Text( + AppLocalizations.of(context)!.strictTranslate('See all'), + style: Theme.of(context) + .textTheme + .caption! + .copyWith(color: const Color(0xff4285F4)), + ), + ], + ), + Divider( + color: Theme.of(context).colorScheme.onBackground, + thickness: 2, + ), + + // Needs to be replaced with actual event attendees + ListView.builder( + padding: const EdgeInsets.all(0.0), + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: 10, + itemBuilder: (BuildContext context, int index) { + return CustomListTile( + key: Key( + '${AppLocalizations.of(context)!.strictTranslate("Attendee")}$index'), + index: index, + type: TileType.user, + userInfo: userConfig.currentUser, + onTapUserInfo: () {}); + }) + ], + ), + ), + ); + } +} diff --git a/lib/views/after_auth_screens/events/explore_event_dialogue.dart b/lib/views/after_auth_screens/events/explore_event_dialogue.dart new file mode 100644 index 000000000..cf7384968 --- /dev/null +++ b/lib/views/after_auth_screens/events/explore_event_dialogue.dart @@ -0,0 +1,142 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/widgets/date_time_picker.dart'; + +class ExploreEventDialog extends StatefulWidget { + const ExploreEventDialog({required Key key}) : super(key: key); + @override + _ExploreEventDialogState createState() => _ExploreEventDialogState(); +} + +class _ExploreEventDialogState extends State { + DateTime _startDate = DateTime.now(); + DateTime _endDate = DateTime.now().add(const Duration(days: 1)); + + @override + Widget build(BuildContext context) { + return AlertDialog( + insetPadding: EdgeInsets.all( + SizeConfig.screenWidth! * 0.027, + ), + actions: [ + Padding( + padding: const EdgeInsets.all(26), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(AppLocalizations.of(context)! + .strictTranslate('Start Date')), + const SizedBox( + height: 5, + ), + GestureDetector( + onTap: () async { + final _date = + await customDatePicker(initialDate: _startDate); + setState(() { + _startDate = _date; + }); + }, + child: SizedBox( + height: SizeConfig.screenHeight! * 0.07, + width: SizeConfig.screenWidth! * 0.36, + child: Card( + color: Theme.of(context).colorScheme.primaryVariant, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + const Icon( + Icons.calendar_today, + size: 19, + ), + Text( + "${_startDate.toLocal()}".split(' ')[0], + ), + ], + ), + ), + ), + ) + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(AppLocalizations.of(context)! + .strictTranslate('End Date')), + const SizedBox( + height: 5, + ), + GestureDetector( + onTap: () async { + final _date = + await customDatePicker(initialDate: _endDate); + setState(() { + _endDate = _date; + }); + }, + child: SizedBox( + height: SizeConfig.screenHeight! * 0.07, + width: SizeConfig.screenWidth! * 0.36, + child: Card( + color: Theme.of(context).colorScheme.primaryVariant, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + const Icon( + Icons.calendar_today, + size: 20, + ), + Text( + "${_endDate.toLocal()}".split(' ')[0], + ), + ], + ), + ), + ), + ), + ], + ) + ], + ), + ), + Padding( + padding: EdgeInsets.only( + right: SizeConfig.screenWidth! * 0.072, + ), + child: SizedBox( + width: SizeConfig.screenWidth! * 0.36, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TextButton( + onPressed: () { + navigationService.pop(); + }, + child: Text( + AppLocalizations.of(context)!.strictTranslate('Cancel'), + style: Theme.of(context).textTheme.bodyText2, + )), + TextButton( + onPressed: () { + navigationService.pop(); + }, + child: Text( + AppLocalizations.of(context)!.strictTranslate('Done'), + style: + const TextStyle(fontSize: 14, color: Color(0xff4285F4)), + ), + ) + ], + ), + ), + ) + ], + ); + } +} diff --git a/lib/views/after_auth_screens/events/explore_events.dart b/lib/views/after_auth_screens/events/explore_events.dart new file mode 100644 index 000000000..f63feefc5 --- /dev/null +++ b/lib/views/after_auth_screens/events/explore_events.dart @@ -0,0 +1,195 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/explore_events_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/explore_event_dialogue.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/event_card.dart'; + +class ExploreEvents extends StatelessWidget { + const ExploreEvents({required Key key, this.drawerKey}) : super(key: key); + final GlobalKey? drawerKey; + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(), + builder: (context, model, child) { + return Scaffold( + appBar: AppBar( + key: const Key("ExploreEventsAppBar"), + elevation: 0.0, + automaticallyImplyLeading: false, + centerTitle: true, + title: Text( + AppLocalizations.of(context)!.strictTranslate('Explore Events'), + style: Theme.of(context).textTheme.headline6!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + leading: IconButton( + icon: const Icon(Icons.menu), + onPressed: () => drawerKey!.currentState!.openDrawer(), + ), + actions: [ + Padding( + padding: EdgeInsets.only( + right: SizeConfig.screenWidth! * 0.027, + ), + child: const Icon(Icons.search, size: 20), + ) + ], + ), + body: model.isBusy + ? const CircularProgressIndicator() + : RefreshIndicator( + onRefresh: () async => model.fetchNewEvents(), + child: Stack( + children: [ + ListView(), + SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.screenWidth! * 0.027), + child: Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Card( + color: Theme.of(context) + .colorScheme + .secondary, + elevation: 2, + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 20), + width: SizeConfig.screenWidth! * 0.55, + child: DropdownButtonHideUnderline( + child: + dropDownList(model, context)), + ), + ), + GestureDetector( + onTap: () { + showDialog( + context: context, + builder: (_) { + return const ExploreEventDialog( + key: Key('ExploreEvents')); + }); + }, + child: Card( + color: Theme.of(context) + .colorScheme + .secondary, + child: SizedBox( + height: + SizeConfig.screenHeight! * 0.068, + width: SizeConfig.screenWidth! * 0.27, + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + const Icon( + Icons.calendar_today, + color: Color(0xff524F4F), + size: 19, + ), + SizedBox( + width: SizeConfig.screenWidth! * + 0.17, + child: Text( + AppLocalizations.of(context)! + .strictTranslate( + "Add Date"), + style: const TextStyle( + fontSize: 16), + ), + ), + ], + ), + ), + ), + ) + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.027), + ListView.builder( + physics: + const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: model.events.length, + itemBuilder: + (BuildContext context, int index) { + return GestureDetector( + onTap: () { + navigationService.pushScreen( + "/eventInfo", + arguments: model.events[index]); + }, + child: EventCard( + event: model.events[index], + ), + ); + }), + ], + ), + ), + ), + ], + ), + ), + floatingActionButton: FloatingActionButton.extended( + backgroundColor: Theme.of(context).primaryColor, + onPressed: () { + navigationService.pushScreen( + "/createEventPage", + ); + }, + icon: Icon( + Icons.add, + color: Theme.of(context).accentColor, + ), + label: Text( + AppLocalizations.of(context)!.strictTranslate("Event"), + style: Theme.of(context) + .textTheme + .headline5! + .copyWith(color: Theme.of(context).accentColor), + ), + ), + ); + }); + } + + Widget dropDownList(ExploreEventsViewModel model, BuildContext context) { + return DropdownButton( + value: model.chosenValue, + isExpanded: true, + items: [ + 'My Events', + 'Public Events', + 'Private Events', + ].map>((String value) { + return DropdownMenuItem( + value: value, + child: Text( + AppLocalizations.of(context)!.strictTranslate(value), + style: Theme.of(context) + .textTheme + .headline6! + .copyWith(color: Theme.of(context).accentColor), + ), + ); + }).toList(), + onChanged: (value) { + model.choseValue(value!); + }, + ); + } +} diff --git a/lib/views/after_auth_screens/feed/individual_post.dart b/lib/views/after_auth_screens/feed/individual_post.dart new file mode 100644 index 000000000..76f2e7fa8 --- /dev/null +++ b/lib/views/after_auth_screens/feed/individual_post.dart @@ -0,0 +1,218 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/models/comment/comment_model.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/widgets_view_models/comments_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/post_widget.dart'; + +//Global Stete, should be removed in next few iterations +late CommentsViewModel _commentViewModel; + +class IndividualPostView extends StatefulWidget { + const IndividualPostView({Key? key, required this.post}) : super(key: key); + final Post post; + + @override + _IndividualPostViewState createState() => _IndividualPostViewState(); +} + +class _IndividualPostViewState extends State { + final TextEditingController _controller = TextEditingController(); + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + elevation: 0.0, + ), + bottomSheet: Container( + height: 60, + padding: const EdgeInsets.symmetric(horizontal: 10), + child: Row( + children: [ + Expanded( + child: TextField( + controller: _controller, + textInputAction: TextInputAction.send, + onSubmitted: (msg) { + _commentViewModel.createComment(msg); + _controller.text = ""; + }, + textAlign: TextAlign.start, + decoration: const InputDecoration( + hintText: "Write your comment here..", + contentPadding: EdgeInsets.all(8.0), + focusColor: Colors.black, + border: InputBorder.none, + ), + keyboardType: TextInputType.text, + ), + ), + TextButton( + onPressed: () { + _commentViewModel.createComment(_controller.text); + _controller.text = ""; + }, + child: const Text("Send")) + ], + ), + ), + body: ListView( + children: [ + NewsPost( + post: widget.post, + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + IndividualPageLikeSection( + usersLiked: widget.post.likedBy!, + ), + IndividualPostCommentSection( + comments: widget.post.comments!, + postID: widget.post.sId, + ) + ], + ), + ) + ], + ), + ); + } +} + +Padding buildPadding(BuildContext context, String text) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 8.0), + child: Text( + AppLocalizations.of(context)!.strictTranslate(text), + style: Theme.of(context).textTheme.headline6, + ), + ); +} + +class IndividualPageLikeSection extends StatelessWidget { + const IndividualPageLikeSection({ + Key? key, + required this.usersLiked, + }) : super(key: key); + + final List usersLiked; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildPadding(context, "Liked by"), + Row( + children: [ + for (int i = 0; i < usersLiked.length; i++) + likedUserCircleAvatar(usersLiked[i]) + ], + ), + ], + ); + } +} + +class IndividualPostCommentSection extends StatelessWidget { + const IndividualPostCommentSection( + {Key? key, required this.comments, required this.postID}) + : super(key: key); + final List comments; + final String postID; + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) { + model.initialise(postID); + _commentViewModel = model; + }, + builder: (context, model, child) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildPadding(context, "Comments"), + for (int i = 0; i < model.commentList.length; i++) + CommentTemplate(comment: model.commentList[i]) + ], + ), + ); + } +} + +class CommentTemplate extends StatelessWidget { + const CommentTemplate({ + Key? key, + required this.comment, + }) : super(key: key); + + final Comment comment; + + @override + Widget build(BuildContext context) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const CircleAvatar(), + Expanded( + child: Container( + decoration: BoxDecoration( + color: Theme.of(context).iconTheme.color!.withOpacity(0.2), + borderRadius: const BorderRadius.all(Radius.circular(8))), + padding: const EdgeInsets.all(16.0), + margin: const EdgeInsets.only(left: 8.0, bottom: 8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: Text( + "${comment.creator!.firstName!} ${comment.creator!.lastName!}", + style: Theme.of(context).textTheme.bodyText2, + ), + ), + Text( + comment.text!, + style: Theme.of(context) + .textTheme + .bodyText1! + .copyWith(fontSize: 16.0), + ), + ], + ), + )) + ], + ); + } +} + +Widget likedUserCircleAvatar(LikedBy user) { + return Padding( + padding: const EdgeInsets.only(right: 10.0, bottom: 16.0), + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.center, + children: [ + const CircleAvatar( + backgroundColor: Color(0xfff2f2f2), + radius: 20, + ), + const Positioned( + top: 30, + right: 0, + bottom: 20, + left: 20, + child: Icon( + Icons.thumb_up, + color: Colors.blue, + size: 20, + ), + ), + ], + ), + ); +} diff --git a/lib/views/after_auth_screens/feed/organization_feed.dart b/lib/views/after_auth_screens/feed/organization_feed.dart new file mode 100644 index 000000000..7fb1874c5 --- /dev/null +++ b/lib/views/after_auth_screens/feed/organization_feed.dart @@ -0,0 +1,60 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/view_model/after_auth_view_models/feed_view_models/organization_feed_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/pinned_carousel_widget.dart'; +import 'package:talawa/widgets/post_list_widget.dart'; + +class OrganizationFeed extends StatelessWidget { + const OrganizationFeed({required Key key, this.drawerKey}) : super(key: key); + final GlobalKey? drawerKey; + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(), + builder: (context, model, child) { + return Scaffold( + appBar: AppBar( + elevation: 0.0, + centerTitle: true, + title: Text( + model.currentOrgName, + // "hii", + style: Theme.of(context).textTheme.headline6!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + leading: IconButton( + icon: const Icon(Icons.menu), + onPressed: () => drawerKey!.currentState!.openDrawer(), + ), + ), + body: model.isBusy + ? const CircularProgressIndicator() + : RefreshIndicator( + onRefresh: () async => model.fetchNewPosts(), + child: ListView( + children: [ + model.pinnedPosts.isNotEmpty + ? PinnedPostCarousel( + pinnedPosts: model.pinnedPosts, + navigateToPinnedPostPage: + model.navigateToPinnedPostPage, + navigateToIndividualPostPage: + model.navigateToIndividualPage, + ) + : Container(), + model.posts.isNotEmpty + ? PostListWidget( + posts: model.posts, + function: model.navigateToIndividualPage, + ) + : Container(), + ], + ), + )); + }, + ); + } +} diff --git a/lib/views/after_auth_screens/feed/pinned_post_page.dart b/lib/views/after_auth_screens/feed/pinned_post_page.dart new file mode 100644 index 000000000..6048ae89f --- /dev/null +++ b/lib/views/after_auth_screens/feed/pinned_post_page.dart @@ -0,0 +1,23 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/widgets/post_list_widget.dart'; + +class PinnedPostPage extends StatelessWidget { + const PinnedPostPage({Key? key, required this.pinnedPosts}) : super(key: key); + final List pinnedPosts; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + elevation: 0.0, + title: + Text(AppLocalizations.of(context)!.strictTranslate('Pinned Posts')), + ), + body: ListView( + children: [PostListWidget(posts: pinnedPosts)], + ), + ); + } +} diff --git a/lib/views/after_auth_screens/join_organisation_after_auth.dart b/lib/views/after_auth_screens/join_organisation_after_auth.dart new file mode 100644 index 000000000..5f3e1e2d7 --- /dev/null +++ b/lib/views/after_auth_screens/join_organisation_after_auth.dart @@ -0,0 +1,107 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/pre_auth_view_models/select_organization_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/custom_list_tile.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; + +class JoinOrganisationAfterAuth extends StatelessWidget { + const JoinOrganisationAfterAuth({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise('-1'), + builder: (context, model, child) { + return Scaffold( + appBar: AppBar( + centerTitle: true, + title: Text( + AppLocalizations.of(context)! + .strictTranslate('Join Organisation'), + style: Theme.of(context).textTheme.headline6!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + ), + body: Column( + children: [ + Padding( + padding: const EdgeInsets.fromLTRB(12, 12, 12, 8), + child: CupertinoSearchTextField( + focusNode: model.searchFocus, + controller: model.searchController, + onChanged: (value) => model.setState(ViewState.idle), + suffixMode: OverlayVisibilityMode.always, + style: Theme.of(context).textTheme.headline5, + suffixIcon: const Icon( + CupertinoIcons.xmark_circle_fill, + size: 25, + ), + onSuffixTap: () { + model.searchController.clear(); + model.organizations = []; + model.searchFocus.unfocus(); + model.searching = false; + model.setState(ViewState.idle); + }, + ), + ), + model.selectedOrganization.id != '-1' + ? Container( + color: Theme.of(context) + .colorScheme + .secondaryVariant + .withOpacity(0.2), + child: CustomListTile( + index: model.organizations + .indexOf(model.selectedOrganization), + type: TileType.org, + orgInfo: model.selectedOrganization, + onTapOrgInfo: (item) => model.selectOrg(item), + key: const Key('OrgSelItem'), + showIcon: true, + ), + ) + : const SizedBox(), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 12.0), + child: Divider( + color: Colors.grey, + thickness: 2.0, + ), + ), + Expanded( + child: model.searching + ? model.showSearchList(model.searchController.text) + : model.showOrganizationList()), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + model.selectedOrganization.id != '-1' + ? Column( + children: [ + RaisedRoundedButton( + buttonLabel: AppLocalizations.of(context)! + .strictTranslate('Join selected organisation'), + onTap: model.onTapJoin, + textColor: const Color(0xFF008A37), + key: const Key('JoinSelectedOrgButton'), + backgroundColor: Colors.white, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + ], + ) + : const SizedBox(), + ], + ), + ); + }); + } +} diff --git a/lib/views/after_auth_screens/profile/edit_profile_page.dart b/lib/views/after_auth_screens/profile/edit_profile_page.dart new file mode 100644 index 000000000..ce9415a03 --- /dev/null +++ b/lib/views/after_auth_screens/profile/edit_profile_page.dart @@ -0,0 +1,187 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/after_auth_view_models/profile_view_models/edit_profile_view_model.dart'; +import 'package:talawa/views/base_view.dart'; + +class EditProfilePage extends StatefulWidget { + const EditProfilePage({Key? key}) : super(key: key); + + @override + _EditProfilePageState createState() => _EditProfilePageState(); +} + +class _EditProfilePageState extends State { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return Scaffold( + appBar: AppBar( + elevation: 0.0, + title: Text( + AppLocalizations.of(context)!.strictTranslate('Profile'), + style: Theme.of(context).textTheme.headline6!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + )), + body: SingleChildScrollView( + child: Column( + children: [ + SizedBox( + height: SizeConfig.screenHeight! * 0.068, + ), + Center( + child: Stack( + children: [ + model.user.values.first.image != null + ? CircleAvatar( + radius: SizeConfig.screenHeight! * 0.082, + backgroundImage: NetworkImage( + model.user.values.first.image!), + ) + : CircleAvatar( + radius: SizeConfig.screenHeight! * 0.082, + backgroundColor: Colors.grey.withOpacity(0.2), + child: Text( + model.user.values.first.firstName! + .toString() + .substring(0, 1) + .toUpperCase() + + model.user.values.first.lastName! + .toString() + .substring(0, 1) + .toUpperCase(), + style: Theme.of(context).textTheme.headline4, + ), + ), + Positioned( + bottom: 0, + right: 0, + child: CircleAvatar( + radius: SizeConfig.screenHeight! * 0.034, + backgroundColor: Theme.of(context).accentColor, + child: const Icon( + Icons.photo_camera, + color: Colors.white, + ), + ), + ), + ], + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.068, + ), + const Divider(), + Padding( + padding: const EdgeInsets.all(10), + child: Column( + children: [ + Row( + children: [ + Flexible( + child: TextFormField( + controller: model.firstNameTextController + ..text = model.user.values.first.firstName!, + focusNode: model.firstNameFocus, + keyboardType: TextInputType.name, + decoration: InputDecoration( + labelText: AppLocalizations.of(context)! + .strictTranslate('First Name'), + labelStyle: + Theme.of(context).textTheme.subtitle1, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + prefixIcon: const Icon(Icons.person), + suffixIcon: IconButton( + onPressed: () { + FocusScope.of(context).requestFocus( + model.firstNameFocus); + }, + icon: const Icon(Icons.edit)), + )), + ), + ], + ), + Row( + children: [ + Flexible( + child: TextFormField( + controller: model.lastNameTextController + ..text = model.user.values.first.lastName!, + focusNode: model.lastNameFocus, + keyboardType: TextInputType.name, + decoration: InputDecoration( + labelText: AppLocalizations.of(context)! + .strictTranslate('Last Name'), + labelStyle: + Theme.of(context).textTheme.subtitle1, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + prefixIcon: const Icon(Icons.person), + suffixIcon: IconButton( + onPressed: () { + FocusScope.of(context).requestFocus( + model.lastNameFocus); + }, + icon: const Icon(Icons.edit)), + )), + ), + ], + ), + ], + ), + ), + const Divider(), + Padding( + padding: const EdgeInsets.all(20), + child: Row( + children: [ + SizedBox( + height: SizeConfig.screenHeight! * 0.027, + width: SizeConfig.screenWidth! * 0.055, + child: const Icon(Icons.email), + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.045, + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + AppLocalizations.of(context)! + .strictTranslate('Email'), + style: Theme.of(context) + .textTheme + .caption! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground), + ), + Text( + model.user.values.first.email!, + style: Theme.of(context) + .textTheme + .bodyText2! + .copyWith(fontSize: 18), + ) + ], + ), + ], + )), + const Divider(), + TextButton( + onPressed: () async {}, + child: Text(AppLocalizations.of(context)! + .strictTranslate('Update'))) + ], + ), + ), + ); + }); + } +} diff --git a/lib/views/after_auth_screens/profile/profile_page.dart b/lib/views/after_auth_screens/profile/profile_page.dart new file mode 100644 index 000000000..6ae03feb0 --- /dev/null +++ b/lib/views/after_auth_screens/profile/profile_page.dart @@ -0,0 +1,161 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/options/options.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/after_auth_view_models/profile_view_models/profile_page_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/custom_avatar.dart'; +import 'package:talawa/widgets/custom_list_tile.dart'; +import 'package:talawa/widgets/from_palisadoes.dart'; + +class ProfilePage extends StatefulWidget { + const ProfilePage({Key? key, this.drawerKey}) : super(key: key); + final GlobalKey? drawerKey; + @override + _ProfilePageState createState() => _ProfilePageState(); +} + +class _ProfilePageState extends State { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return Scaffold( + appBar: AppBar( + elevation: 0.0, + centerTitle: true, + leading: IconButton( + icon: const Icon(Icons.menu), + onPressed: () => widget.drawerKey!.currentState!.openDrawer(), + ), + key: const Key("ProfilePageAppBar"), + title: Text( + AppLocalizations.of(context)!.strictTranslate('Profile'), + style: Theme.of(context).textTheme.headline6!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + ), + body: model.isBusy + ? const CircularProgressIndicator() + : SingleChildScrollView( + child: Column( + children: [ + SizedBox( + height: SizeConfig.screenHeight! * 0.01, + ), + CustomListTile( + key: const Key('OptionEditProfile'), + index: 0, + type: TileType.option, + option: Options( + icon: CustomAvatar( + isImageNull: model.currentUser.image == null, + firstAlphabet: model.currentUser.firstName! + .substring(0, 1), + imageUrl: model.currentUser.image, + fontSize: Theme.of(context) + .textTheme + .headline6! + .fontSize, + ), + title: + '${model.currentUser.firstName!} ${model.currentUser.lastName!}', + subtitle: model.currentUser.email!, + trailingIconButton: IconButton( + icon: Icon( + Icons.drive_file_rename_outline, + color: Theme.of(context).accentColor, + ), + onPressed: () { + navigationService + .pushScreen("/editProfilePage"); + }, + )), + onTapOption: () {}), + const Divider(), + SizedBox( + height: SizeConfig.screenHeight! * 0.63, + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + CustomListTile( + key: const Key('Option0'), + index: 0, + type: TileType.option, + option: Options( + icon: const Icon( + Icons.phonelink_setup, + size: 30, + ), + title: AppLocalizations.of(context)! + .strictTranslate('App Settings'), + subtitle: + '${AppLocalizations.of(context)!.strictTranslate("Language")}, ${AppLocalizations.of(context)!.strictTranslate("dark mode")}, ${AppLocalizations.of(context)!.strictTranslate("font size")}', + ), + onTapOption: () {}), + CustomListTile( + key: const Key('Option1'), + index: 1, + type: TileType.option, + option: Options( + icon: const Icon( + Icons.help_outline, + size: 30, + ), + title: AppLocalizations.of(context)! + .strictTranslate('Help'), + subtitle: AppLocalizations.of(context)! + .strictTranslate( + 'Reach out to us for help'), + ), + onTapOption: () {}), + CustomListTile( + key: const Key('Option2'), + index: 2, + type: TileType.option, + option: Options( + icon: Icon( + Icons.monetization_on, + color: + Theme.of(context).colorScheme.primary, + size: 30, + ), + title: AppLocalizations.of(context)! + .strictTranslate('Donate Us'), + subtitle: AppLocalizations.of(context)! + .strictTranslate( + 'Help us to develop for you'), + ), + onTapOption: () {}), + CustomListTile( + key: const Key('Option3'), + index: 3, + type: TileType.option, + option: Options( + icon: Icon( + Icons.logout, + color: Theme.of(context).accentColor, + size: 30, + ), + title: AppLocalizations.of(context)! + .strictTranslate('Log out'), + subtitle: AppLocalizations.of(context)! + .strictTranslate('Log out from Talawa'), + ), + onTapOption: () => model.logout(context)), + const FromPalisadoes(), + ], + ), + ) + ], + ), + ), + ); + }); + } +} diff --git a/lib/views/base_view.dart b/lib/views/base_view.dart new file mode 100644 index 000000000..2c483b6fc --- /dev/null +++ b/lib/views/base_view.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:talawa/locator.dart'; + +class BaseView extends StatefulWidget { + const BaseView({ + required this.builder, + this.onModelReady, + }); + final Function(T)? onModelReady; + final Widget Function(BuildContext, T, Widget?) builder; + + @override + _BaseViewState createState() => _BaseViewState(); +} + +class _BaseViewState extends State> { + T model = locator(); + + @override + void initState() { + if (widget.onModelReady != null) { + widget.onModelReady!( + model, + ); + } + super.initState(); + } + + @override + Widget build( + BuildContext context, + ) { + return ChangeNotifierProvider( + create: (context) => model, + child: Consumer( + builder: widget.builder, + ), + ); + } +} diff --git a/lib/views/main_screen.dart b/lib/views/main_screen.dart new file mode 100644 index 000000000..668a0c749 --- /dev/null +++ b/lib/views/main_screen.dart @@ -0,0 +1,68 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/after_auth_screens/add_post_page.dart'; +import 'package:talawa/views/after_auth_screens/events/explore_events.dart'; +import 'package:talawa/views/after_auth_screens/feed/organization_feed.dart'; +import 'package:talawa/views/after_auth_screens/profile/profile_page.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/custom_drawer.dart'; + +class MainScreen extends StatelessWidget { + const MainScreen({Key? key}) : super(key: key); + @override + Widget build(BuildContext context) { + final GlobalKey scaffoldKey = GlobalKey(); + final List childrenPage = [ + OrganizationFeed(key: const Key("HomeView"), drawerKey: scaffoldKey), + ExploreEvents(key: const Key('ExploreEvents'), drawerKey: scaffoldKey), + AddPost(key: const Key('AddPost'), drawerKey: scaffoldKey), + Container( + child: Center( + child: Text( + AppLocalizations.of(context)!.strictTranslate('Chat Screen')), + ), + ), + ProfilePage(key: const Key('Profile'), drawerKey: scaffoldKey), + ]; + + return BaseView(builder: (context, model, child) { + return Scaffold( + key: scaffoldKey, + drawer: const CustomDrawer(), + body: IndexedStack( + index: model.currentIndex, + children: childrenPage, + ), + bottomNavigationBar: BottomNavigationBar( + type: BottomNavigationBarType.fixed, + currentIndex: model.currentIndex, + onTap: model.onTabTapped, + selectedItemColor: const Color(0xff34AD64), + items: [ + BottomNavigationBarItem( + icon: const Icon(Icons.home), + label: AppLocalizations.of(context)!.strictTranslate('Home'), + ), + BottomNavigationBarItem( + icon: const Icon(Icons.event_note), + label: AppLocalizations.of(context)!.strictTranslate('Events'), + ), + BottomNavigationBarItem( + icon: const Icon(Icons.add_box), + label: AppLocalizations.of(context)!.strictTranslate('Post'), + ), + BottomNavigationBarItem( + icon: const Icon(Icons.chat_bubble_outline), + label: AppLocalizations.of(context)!.strictTranslate('Chat'), + ), + BottomNavigationBarItem( + icon: const Icon(Icons.account_circle), + label: AppLocalizations.of(context)!.strictTranslate('Profile'), + ) + ], + ), + ); + }); + } +} diff --git a/lib/views/pre_auth_screens/change_password.dart b/lib/views/pre_auth_screens/change_password.dart new file mode 100644 index 000000000..ad7286dbd --- /dev/null +++ b/lib/views/pre_auth_screens/change_password.dart @@ -0,0 +1,132 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; +import 'package:talawa/widgets/rich_text.dart'; + +class ChangePass extends StatefulWidget { + const ChangePass({required Key key}) : super(key: key); + + @override + _ChangePassState createState() => _ChangePassState(); +} + +class _ChangePassState extends State { + TextEditingController newPassword = TextEditingController(); + TextEditingController reNewPassword = TextEditingController(); + FocusNode newPasswordFocus = FocusNode(); + FocusNode reNewPasswordFocus = FocusNode(); + + @override + Widget build(BuildContext context) { + final text = [ + { + 'text': "${AppLocalizations.of(context)!.translate("Hello")}, ", + 'textStyle': Theme.of(context).textTheme.headline5 + }, + { + 'text': '${AppLocalizations.of(context)!.translate("User Name")} ', + 'textStyle': + Theme.of(context).textTheme.headline6!.copyWith(fontSize: 24) + }, + { + 'text': "${AppLocalizations.of(context)!.translate("we've")} ", + 'textStyle': Theme.of(context).textTheme.headline5 + }, + { + 'text': + '${AppLocalizations.of(context)!.translate("got you covered")} ', + 'textStyle': Theme.of(context).textTheme.headline5 + }, + ]; + return Scaffold( + appBar: AppBar( + elevation: 0.0, + backgroundColor: Colors.transparent, + leading: IconButton( + icon: const Icon( + Icons.arrow_back, + color: Colors.black, + ), + onPressed: () { + navigationService.pop(); + }, + ), + ), + body: SingleChildScrollView( + physics: const NeverScrollableScrollPhysics(), + child: Container( + margin: EdgeInsets.fromLTRB( + SizeConfig.screenWidth! * 0.06, + SizeConfig.screenHeight! * 0.2, + SizeConfig.screenWidth! * 0.06, + 0.0), + width: SizeConfig.screenWidth, + height: SizeConfig.screenHeight, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomRichText( + key: const Key('UrlPageText'), + words: text, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.05, + ), + TextFormField( + controller: newPassword, + focusNode: newPasswordFocus, + textInputAction: TextInputAction.done, + keyboardType: TextInputType.text, + enableSuggestions: true, + autofillHints: const [AutofillHints.password], + obscureText: true, + decoration: InputDecoration( + hintText: + AppLocalizations.of(context)!.translate('password'), + labelText: + '${AppLocalizations.of(context)!.translate("Enter new password")} *', + )), + SizedBox( + height: SizeConfig.screenHeight! * 0.025, + ), + TextFormField( + controller: reNewPassword, + focusNode: reNewPasswordFocus, + textInputAction: TextInputAction.done, + keyboardType: TextInputType.text, + enableSuggestions: true, + autofillHints: const [AutofillHints.password], + obscureText: true, + decoration: InputDecoration( + hintText: + AppLocalizations.of(context)!.translate('password'), + labelText: + '${AppLocalizations.of(context)!.translate("Re-Enter your password")} *', + )), + SizedBox( + height: SizeConfig.screenHeight! * 0.086, + ), + RaisedRoundedButton( + buttonLabel: + '${AppLocalizations.of(context)!.translate("Change Password")} ', + onTap: () { + newPasswordFocus.unfocus(); + reNewPasswordFocus.unfocus(); + }, + textColor: const Color(0xFF008A37), + key: const Key('Change Password Button'), + backgroundColor: Colors.white, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/views/pre_auth_screens/login.dart b/lib/views/pre_auth_screens/login.dart new file mode 100644 index 000000000..dbff05cf9 --- /dev/null +++ b/lib/views/pre_auth_screens/login.dart @@ -0,0 +1,162 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/validators.dart'; +import 'package:talawa/view_model/pre_auth_view_models/login_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; +import 'package:talawa/widgets/rich_text.dart'; + +class Login extends StatefulWidget { + const Login({required Key key}) : super(key: key); + + @override + _LoginState createState() => _LoginState(); +} + +class _LoginState extends State { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return Scaffold( + appBar: AppBar( + elevation: 0.0, + backgroundColor: Colors.transparent, + leading: IconButton( + icon: const Icon( + Icons.arrow_back, + ), + onPressed: () { + navigationService.pop(); + }, + ), + ), + body: SingleChildScrollView( + physics: const NeverScrollableScrollPhysics(), + child: Container( + margin: EdgeInsets.fromLTRB( + SizeConfig.screenWidth! * 0.06, + SizeConfig.screenHeight! * 0.2, + SizeConfig.screenWidth! * 0.06, + 0.0), + width: SizeConfig.screenWidth, + height: SizeConfig.screenHeight, + child: Form( + key: model.formKey, + autovalidateMode: model.validate, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomRichText( + key: const Key('UrlPageText'), + words: model.greeting, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.05, + ), + TextFormField( + controller: model.email, + focusNode: model.emailFocus, + textInputAction: TextInputAction.next, + keyboardType: TextInputType.emailAddress, + autofillHints: const [AutofillHints.email], + enableSuggestions: true, + validator: (value) { + final String? err = Validator.validateEmail(value!); + if (err != null) { + return AppLocalizations.of(context)! + .translate(err); + } + + return null; + }, + decoration: InputDecoration( + hintText: AppLocalizations.of(context)! + .translate("Email Hint"), + labelText: + '${AppLocalizations.of(context)!.translate("Enter your registered Email")} *', + labelStyle: Theme.of(context).textTheme.subtitle1, + )), + SizedBox( + height: SizeConfig.screenHeight! * 0.025, + ), + TextFormField( + controller: model.password, + focusNode: model.passwordFocus, + textInputAction: TextInputAction.done, + keyboardType: TextInputType.text, + enableSuggestions: true, + autofillHints: const [AutofillHints.password], + obscureText: model.hidePassword, + validator: (value) { + final String? err = + Validator.validatePassword(value!); + if (err != null) { + return AppLocalizations.of(context)!.translate(err); + } + + return null; + }, + decoration: InputDecoration( + suffixIcon: IconButton( + onPressed: () { + setState(() { + model.hidePassword = !model.hidePassword; + }); + }, + icon: Icon(model.hidePassword + ? Icons.visibility_off + : Icons.visibility)), + hintText: AppLocalizations.of(context)! + .translate('password'), + labelText: + '${AppLocalizations.of(context)!.translate("Enter your password")} *', + labelStyle: Theme.of(context).textTheme.subtitle1, + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () { + model.emailFocus.unfocus(); + model.passwordFocus.unfocus(); + navigationService.pushScreen('/recover'); + }, + child: Text( + '${AppLocalizations.of(context)!.translate("Forgot password")}?', + style: Theme.of(context) + .textTheme + .bodyText2! + .copyWith( + fontSize: 14, + color: const Color(0xFF4285F4)), + ), + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.086, + ), + RaisedRoundedButton( + buttonLabel: AppLocalizations.of(context)! + .strictTranslate('Login'), + onTap: () => model.login(), + textColor: const Color(0xFF008A37), + key: const Key('LoginButton'), + backgroundColor: Colors.white, + ), + SizedBox(height: SizeConfig.screenHeight! * 0.0215), + ], + ), + ), + ), + ), + ); + }); + } +} diff --git a/lib/views/pre_auth_screens/recover.dart b/lib/views/pre_auth_screens/recover.dart new file mode 100644 index 000000000..df63f0176 --- /dev/null +++ b/lib/views/pre_auth_screens/recover.dart @@ -0,0 +1,103 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; +import 'package:talawa/widgets/rich_text.dart'; + +class Recover extends StatefulWidget { + const Recover({required Key key}) : super(key: key); + + @override + _RecoverState createState() => _RecoverState(); +} + +class _RecoverState extends State { + TextEditingController email = TextEditingController(); + + @override + Widget build(BuildContext context) { + final text = [ + { + 'text': + "${AppLocalizations.of(context)!.translate("Sit back relax, we'll")} ", + 'textStyle': Theme.of(context).textTheme.headline5 + }, + { + 'text': '${AppLocalizations.of(context)!.translate("Recover")} ', + 'textStyle': + Theme.of(context).textTheme.headline6!.copyWith(fontSize: 24) + }, + { + 'text': AppLocalizations.of(context)!.translate("your password"), + 'textStyle': Theme.of(context).textTheme.headline5 + }, + ]; + return Scaffold( + appBar: AppBar( + elevation: 0.0, + backgroundColor: Colors.transparent, + leading: IconButton( + icon: const Icon( + Icons.arrow_back, + ), + onPressed: () { + navigationService.pop(); + }, + ), + ), + body: SingleChildScrollView( + physics: const NeverScrollableScrollPhysics(), + child: Container( + margin: EdgeInsets.fromLTRB( + SizeConfig.screenWidth! * 0.06, + SizeConfig.screenHeight! * 0.2, + SizeConfig.screenWidth! * 0.06, + 0.0), + width: SizeConfig.screenWidth, + height: SizeConfig.screenHeight, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomRichText( + key: const Key('UrlPageText'), + words: text, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.05, + ), + TextFormField( + controller: email, + textInputAction: TextInputAction.next, + keyboardType: TextInputType.emailAddress, + autofillHints: const [AutofillHints.email], + enableSuggestions: true, + decoration: InputDecoration( + hintText: + AppLocalizations.of(context)!.translate("Email Hint"), + labelText: + '${AppLocalizations.of(context)!.translate("Enter your registered Email")} *', + labelStyle: Theme.of(context).textTheme.subtitle1, + )), + SizedBox( + height: SizeConfig.screenHeight! * 0.086, + ), + RaisedRoundedButton( + buttonLabel: AppLocalizations.of(context)! + .strictTranslate('Recover Password'), + onTap: () {}, + textColor: const Color(0xFF008A37), + key: const Key('RecoverButton'), + backgroundColor: Colors.white, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + ], + ), + ), + ), + ); + } +} diff --git a/lib/views/pre_auth_screens/select_language.dart b/lib/views/pre_auth_screens/select_language.dart new file mode 100644 index 000000000..43ba546ff --- /dev/null +++ b/lib/views/pre_auth_screens/select_language.dart @@ -0,0 +1,146 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:talawa/constants/constants.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; + +class SelectLanguage extends StatefulWidget { + const SelectLanguage({required Key key}) : super(key: key); + + @override + _SelectLanguageState createState() => _SelectLanguageState(); +} + +class _SelectLanguageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + key: const Key('SelectLanguageScreenScaffold'), + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + body: Padding( + padding: EdgeInsets.fromLTRB( + SizeConfig.screenWidth! * 0.06, + SizeConfig.safeBlockVertical! * 4, + SizeConfig.screenWidth! * 0.06, + 0.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.only(top: SizeConfig.screenWidth! * 0.06), + child: Text( + AppLocalizations.of(context)! + .strictTranslate('Select Language'), + style: Theme.of(context).textTheme.headline5, + key: const Key('Select Language'), + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.018, + ), + // const CupertinoSearchTextField( + // key: Key('SearchField'), + // ), + SizedBox( + height: SizeConfig.screenHeight! * 0.016, + ), + Expanded( + child: ListView.builder( + key: const Key('LanguagesList'), + itemCount: languages.length, + itemBuilder: (BuildContext context, int index) { + return InkWell( + key: Key(Provider.of(context) + .appLocal + .languageCode == + languages[index].langCode + ? 'Selected' + : 'NotSelected'), + onTap: () async { + await Provider.of( + context, + listen: false, + ).changeLanguage( + Locale(languages[index].langCode), + ); + }, + child: Consumer( + builder: (context, appLang, _) { + return Container( + key: Key('LanguageItem$index'), + alignment: Alignment.centerLeft, + height: SizeConfig.screenHeight! * 0.063, + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.screenWidth! * 0.06, + ), + decoration: BoxDecoration( + color: languages[index].langCode == + appLang.appLocal.languageCode + ? const Color(0xFFC4C4C4) + .withOpacity(0.15) + : Colors.transparent), + child: index == 0 + ? Row( + key: const Key('LanguageItem'), + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Text( + languages[index].langName, + style: Theme.of(context) + .textTheme + .headline6, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate('Default'), + style: Theme.of(context) + .textTheme + .bodyText2! + .copyWith( + color: + const Color(0xFF4285F4)), + ), + ], + ) + : Text( + languages[index].langName, + style: + Theme.of(context).textTheme.headline6, + key: const Key('LanguageItem'), + ), + ); + }, + ), + ); + })), + const Divider( + color: Color(0xffe5e5e5), + ), + Container( + height: SizeConfig.screenHeight! * 0.08, + alignment: Alignment.centerRight, + child: TextButton( + key: const Key('NavigateToUrlPage'), + onPressed: () async { + navigationService.pushScreen('/setUrl', arguments: ''); + }, + child: Text( + AppLocalizations.of(context)!.strictTranslate('Select'), + style: Theme.of(context).textTheme.headline5!.copyWith( + fontSize: 18, + color: const Color(0xFF008A37), + ), + key: const Key('SelectLangTextButton'), + ), + ), + ) + ], + ), + ), + ); + } +} diff --git a/lib/views/pre_auth_screens/select_organization.dart b/lib/views/pre_auth_screens/select_organization.dart new file mode 100644 index 000000000..b090e2d3b --- /dev/null +++ b/lib/views/pre_auth_screens/select_organization.dart @@ -0,0 +1,96 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/view_model/pre_auth_view_models/select_organization_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/custom_list_tile.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; +import 'package:talawa/widgets/signup_progress_indicator.dart'; + +class SelectOrganization extends StatefulWidget { + const SelectOrganization({required Key key, required this.selectedOrgId}) + : super(key: key); + final String selectedOrgId; + + @override + _SelectOrganizationState createState() => _SelectOrganizationState(); +} + +class _SelectOrganizationState extends State { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(widget.selectedOrgId), + builder: (context, model, child) { + return Scaffold( + extendBodyBehindAppBar: true, + appBar: AppBar( + elevation: 0.0, + backgroundColor: Colors.transparent, + leading: IconButton( + icon: const Icon( + Icons.arrow_back, + ), + onPressed: () { + navigationService.pop(); + }, + ), + ), + body: Padding( + padding: + EdgeInsets.only(top: SizeConfig.safeBlockVertical! * 6), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SignupProgressIndicator( + key: const Key('SelectOrg'), currentPageIndex: 0), + model.selectedOrganization.id != '-1' + ? Padding( + padding: const EdgeInsets.all(15), + child: Text( + AppLocalizations.of(context)! + .strictTranslate('Selected Organization'), + style: Theme.of(context).textTheme.headline5, + ), + ) + : const SizedBox(), + model.selectedOrganization.id != '-1' + ? CustomListTile( + index: model.organizations + .indexOf(model.selectedOrganization), + type: TileType.org, + orgInfo: model.selectedOrganization, + onTapOrgInfo: (item) => model.selectOrg(item), + key: const Key('OrgSelItem'), + showIcon: false, + ) + : const SizedBox(), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 12.0), + child: Divider( + color: Colors.grey, + thickness: 2.0, + ), + ), + Expanded(child: model.showOrganizationList()), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + RaisedRoundedButton( + buttonLabel: AppLocalizations.of(context)! + .strictTranslate('Continue'), + onTap: model.onTapContinue, + textColor: const Color(0xFF008A37), + key: const Key('SignUpLoginDetailsButton'), + backgroundColor: Colors.white, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + ]))); + }); + } +} diff --git a/lib/views/pre_auth_screens/set_url.dart b/lib/views/pre_auth_screens/set_url.dart new file mode 100644 index 000000000..ebd7751ee --- /dev/null +++ b/lib/views/pre_auth_screens/set_url.dart @@ -0,0 +1,188 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/custom_painters/language_icon.dart'; +import 'package:talawa/custom_painters/talawa_logo.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/utils/validators.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; +import 'package:talawa/widgets/rich_text.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/view_model/pre_auth_view_models/set_url_view_model.dart'; +import 'package:talawa/views/base_view.dart'; + +class SetUrl extends StatefulWidget { + const SetUrl({required Key key, required this.uri}) : super(key: key); + final String uri; + + @override + _SetUrlState createState() => _SetUrlState(); +} + +class _SetUrlState extends State { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(inviteUrl: widget.uri), + builder: (context, model, child) { + return Scaffold( + key: const Key('SetUrlScreenScaffold'), + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + body: Container( + margin: EdgeInsets.fromLTRB( + SizeConfig.screenWidth! * 0.06, + SizeConfig.safeBlockVertical! * 4, + SizeConfig.screenWidth! * 0.06, + 0.0), + width: SizeConfig.screenWidth, + height: SizeConfig.screenHeight, + alignment: Alignment.center, + child: SingleChildScrollView( + child: Form( + key: model.formKey, + autovalidateMode: model.validate, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only( + top: SizeConfig.screenHeight! * 0.08), + child: CustomPaint( + key: const Key('LogoPainter'), + size: Size(SizeConfig.screenWidth! * 0.6, + (SizeConfig.screenWidth! * 0.6).toDouble()), + painter: AppLogo(), + ), + ), + CustomRichText( + key: const Key('UrlPageText'), + words: model.greeting, + ), + TextFormField( + key: const Key('UrlInputField'), + controller: model.url, + focusNode: model.urlFocus, + textInputAction: TextInputAction.done, + keyboardType: TextInputType.text, + enableSuggestions: true, + validator: (value) { + final String? msg = Validator.validateURL(value!); + if (msg == null) { + return null; + } + + return AppLocalizations.of(context)!.translate(msg); + }, + onFieldSubmitted: (value) => + AppLocalizations.of(context)! + .translate(Validator.validateURL(value)), + decoration: InputDecoration( + hintText: + 'https://talawa-api-graphql.herokuapp.com/graphql', + labelText: + '${AppLocalizations.of(context)!.translate("Enter Organization URL")} *', + labelStyle: Theme.of(context).textTheme.subtitle1, + suffixIcon: InkWell( + key: const Key('VerifyButton'), + onTap: () { + model.urlFocus.unfocus(); + model.validate = AutovalidateMode.always; + model.formKey.currentState!.validate(); + }, + child: Container( + height: 48, + width: 48, + alignment: Alignment.center, + child: Text( + AppLocalizations.of(context)! + .strictTranslate("Verify"), + style: Theme.of(context).textTheme.bodyText1, + textAlign: TextAlign.center, + ), + ), + )), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.086, + ), + RaisedRoundedButton( + key: const Key('LoginButton'), + buttonLabel: AppLocalizations.of(context)! + .strictTranslate('Login'), + onTap: () async { + print("login"); + await model.checkURLandNavigate('/login', ''); + }, + showArrow: true, + textColor: Theme.of(context) + .inputDecorationTheme + .focusedBorder! + .borderSide + .color, + backgroundColor: + Theme.of(context).colorScheme.secondaryVariant, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + RaisedRoundedButton( + key: const Key('SignUpButton'), + buttonLabel: AppLocalizations.of(context)! + .strictTranslate('Sign Up'), + onTap: () => + model.checkURLandNavigate('/selectOrg', '-1'), + showArrow: true, + textColor: + Theme.of(context).colorScheme.secondaryVariant, + backgroundColor: Theme.of(context) + .inputDecorationTheme + .focusedBorder! + .borderSide + .color, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.08, + ), + GestureDetector( + key: const Key('ChangeLanguage'), + onTap: () { + navigationService.pushReplacementScreen('/selectLang', + arguments: '0'); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CustomPaint( + size: Size( + SizeConfig.screenWidth! * 0.125, + (SizeConfig.screenWidth! * 0.125 * 0.5) + .toDouble()), //You can Replace [WIDTH] with your desired width for Custom Paint and height will be calculated automatically + painter: LanguageIcon(), + ), + const SizedBox( + width: 10, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate('Change language'), + style: Theme.of(context) + .textTheme + .headline6! + .copyWith( + color: Theme.of(context) + .colorScheme + .onBackground + .withOpacity(0.8)), + ) + ], + ), + ) + ], + ), + ), + ), + ), + ); + }); + } +} diff --git a/lib/views/pre_auth_screens/signup_details.dart b/lib/views/pre_auth_screens/signup_details.dart new file mode 100644 index 000000000..4472c60d2 --- /dev/null +++ b/lib/views/pre_auth_screens/signup_details.dart @@ -0,0 +1,278 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/validators.dart'; +import 'package:talawa/view_model/pre_auth_view_models/signup_details_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; +import 'package:talawa/widgets/rich_text.dart'; +import 'package:talawa/widgets/signup_progress_indicator.dart'; + +class SignUpDetails extends StatefulWidget { + const SignUpDetails({required Key key, required this.selectedOrg}) + : super(key: key); + final OrgInfo selectedOrg; + @override + _SignUpDetailsState createState() => _SignUpDetailsState(); +} + +class _SignUpDetailsState extends State { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(widget.selectedOrg), + builder: (context, model, child) { + return Scaffold( + extendBodyBehindAppBar: true, + appBar: AppBar( + elevation: 0.0, + backgroundColor: Colors.transparent, + automaticallyImplyLeading: false, + ), + body: Padding( + padding: + EdgeInsets.only(top: SizeConfig.safeBlockVertical! * 6), + child: SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SignupProgressIndicator( + key: const Key('SelectOrg'), currentPageIndex: 1), + Form( + key: model.formKey, + autovalidateMode: model.validate, + child: Column( + children: [ + Container( + margin: EdgeInsets.fromLTRB( + SizeConfig.screenWidth! * 0.06, + SizeConfig.screenWidth! * 0.05, + SizeConfig.screenWidth! * 0.06, + 0.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: + CrossAxisAlignment.start, + children: [ + CustomRichText( + key: const Key('UrlPageText'), + words: model.greeting, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.05, + ), + TextFormField( + controller: model.firstName, + textInputAction: TextInputAction.next, + keyboardType: TextInputType.text, + autofillHints: const [ + AutofillHints.givenName + ], + enableSuggestions: true, + validator: (value) { + final String? msg = + Validator.validateFirstName( + value!); + if (msg == null) { + return null; + } + + return AppLocalizations.of(context)! + .translate( + Validator.validateFirstName( + value, + ), + ); + }, + decoration: InputDecoration( + hintText: AppLocalizations.of( + context)! + .translate('First Name Hint'), + labelText: + '${AppLocalizations.of(context)!.translate("Enter your first name")}*', + labelStyle: Theme.of(context) + .textTheme + .subtitle1, + )), + SizedBox( + height: + SizeConfig.screenHeight! * 0.015, + ), + TextFormField( + controller: model.lastName, + textInputAction: TextInputAction.next, + keyboardType: TextInputType.text, + autofillHints: const [ + AutofillHints.familyName + ], + enableSuggestions: true, + validator: (value) { + final String? msg = + Validator.validateLastName( + value!); + if (msg == null) { + return null; + } + + return AppLocalizations.of(context)! + .translate( + Validator.validateLastName(value), + ); + }, + decoration: InputDecoration( + hintText: AppLocalizations.of( + context)! + .translate('Last Name Hint'), + labelText: + '${AppLocalizations.of(context)!.translate("Enter your last name")}*', + labelStyle: Theme.of(context) + .textTheme + .subtitle1, + )), + SizedBox( + height: + SizeConfig.screenHeight! * 0.015, + ), + TextFormField( + controller: model.email, + textInputAction: TextInputAction.next, + keyboardType: + TextInputType.emailAddress, + autofillHints: const [ + AutofillHints.email + ], + enableSuggestions: true, + validator: (value) { + final String? msg = + Validator.validateEmail(value!); + if (msg == null) { + return null; + } + + return AppLocalizations.of(context)! + .translate( + Validator.validateEmail(value), + ); + }, + decoration: InputDecoration( + hintText: 'test@test.org', + labelText: + '${AppLocalizations.of(context)!.translate("Enter your registered Email")}*', + labelStyle: Theme.of(context) + .textTheme + .subtitle1, + )), + SizedBox( + height: + SizeConfig.screenHeight! * 0.015, + ), + TextFormField( + controller: model.password, + textInputAction: TextInputAction.next, + keyboardType: + TextInputType.visiblePassword, + obscureText: model.hidePassword, + autofillHints: const [ + AutofillHints.password + ], + enableSuggestions: true, + validator: (value) { + final String? msg = + Validator.validatePassword( + value!); + if (msg == null) { + return null; + } + + return AppLocalizations.of(context)! + .translate( + Validator.validatePassword(value), + ); + }, + onFieldSubmitted: (done) { + FocusScope.of(context).requestFocus( + model.confirmFocus); + }, + decoration: InputDecoration( + suffixIcon: IconButton( + onPressed: () { + setState(() { + model.hidePassword = + !model.hidePassword; + }); + }, + icon: Icon(model.hidePassword + ? Icons.visibility_off + : Icons.visibility)), + hintText: + AppLocalizations.of(context)! + .translate('password'), + labelText: + '${AppLocalizations.of(context)!.translate("Enter your password")}*', + labelStyle: Theme.of(context) + .textTheme + .subtitle1, + )), + SizedBox( + height: + SizeConfig.screenHeight! * 0.015, + ), + TextFormField( + controller: model.confirmPassword, + focusNode: model.confirmFocus, + textInputAction: TextInputAction.done, + keyboardType: TextInputType.text, + enableSuggestions: true, + autofillHints: const [ + AutofillHints.password + ], + obscureText: model.hidePassword, + validator: (value) { + final String? msg = Validator + .validatePasswordConfirm( + model.password.text, + value!); + if (msg == null) { + return null; + } + + return AppLocalizations.of(context)! + .translate(Validator + .validatePasswordConfirm( + model.password.text, + value)); + }, + decoration: InputDecoration( + hintText: + AppLocalizations.of(context)! + .translate('password'), + labelText: + '${AppLocalizations.of(context)!.translate("Confirm your password")}*', + labelStyle: Theme.of(context) + .textTheme + .subtitle1, + )), + SizedBox( + height: + SizeConfig.screenHeight! * 0.086, + ), + ], + ), + ), + RaisedRoundedButton( + buttonLabel: AppLocalizations.of(context)! + .strictTranslate('Next'), + onTap: model.signUp, + textColor: const Color(0xFF008A37), + key: const Key('SignUpLoginDetailsButton'), + backgroundColor: Colors.white, + ), + ], + ), + ) + ]), + ))); + }); + } +} diff --git a/lib/views/pre_auth_screens/waiting_to_join_private_org.dart b/lib/views/pre_auth_screens/waiting_to_join_private_org.dart new file mode 100644 index 000000000..6fb99fcaf --- /dev/null +++ b/lib/views/pre_auth_screens/waiting_to_join_private_org.dart @@ -0,0 +1,125 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/pre_auth_view_models/waiting_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/custom_list_tile.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; +import 'package:talawa/widgets/rich_text.dart'; +import 'package:talawa/widgets/signup_progress_indicator.dart'; + +class WaitingPage extends StatelessWidget { + const WaitingPage({required Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(), + builder: (context, model, child) { + return Scaffold( + extendBodyBehindAppBar: true, + appBar: AppBar( + elevation: 0.0, + backgroundColor: Colors.transparent, + automaticallyImplyLeading: false, + ), + body: Container( + padding: EdgeInsets.only(top: SizeConfig.safeBlockVertical! * 6), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SignupProgressIndicator( + key: const Key('Waiting'), currentPageIndex: 2), + Container( + margin: EdgeInsets.fromLTRB( + SizeConfig.screenWidth! * 0.06, + SizeConfig.screenHeight! * 0.01, + SizeConfig.screenWidth! * 0.06, + SizeConfig.screenHeight! * 0.01), + width: SizeConfig.screenWidth, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomRichText( + key: const Key('UrlPageText'), + words: model.greeting, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.03, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate('Request Sent to'), + style: Theme.of(context).textTheme.headline6, + ), + ], + ), + ), + Expanded( + child: ListView.builder( + padding: EdgeInsets.zero, + itemCount: model.pendingRequestOrg.length, + itemBuilder: (BuildContext context, int index) { + return CustomListTile( + key: const Key('WaitingJoin'), + index: index, + type: TileType.org, + orgInfo: model.pendingRequestOrg[index], + onTapOrgInfo: (item) {}); + }, + )), + Expanded( + child: Container( + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.screenWidth! * 0.06, + ), + child: Column( + children: [ + const Spacer(), + RaisedRoundedButton( + key: const Key('JoinOrg'), + buttonLabel: AppLocalizations.of(context)! + .strictTranslate('Join Organisation'), + onTap: model.joinOrg, + showArrow: true, + textColor: + Theme.of(context).colorScheme.secondaryVariant, + backgroundColor: Theme.of(context) + .inputDecorationTheme + .focusedBorder! + .borderSide + .color, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + RaisedRoundedButton( + key: const Key('Logout'), + buttonLabel: AppLocalizations.of(context)! + .strictTranslate('Log out'), + onTap: model.logout, + textColor: Theme.of(context) + .inputDecorationTheme + .focusedBorder! + .borderSide + .color, + backgroundColor: + Theme.of(context).colorScheme.secondaryVariant, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + ], + ), + ), + ), + ], + ), + ), + ); + }); + } +} diff --git a/lib/widgets/custom_alert_dialog.dart b/lib/widgets/custom_alert_dialog.dart new file mode 100644 index 000000000..3362d3d61 --- /dev/null +++ b/lib/widgets/custom_alert_dialog.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; + +class CustomAlertDialog extends StatelessWidget { + const CustomAlertDialog( + {Key? key, + this.successText, + this.dialogTitle, + this.reverse = false, + required this.success, + required this.dialogSubTitle}) + : super(key: key); + final bool reverse; + final Function success; + final String? successText; + final String? dialogTitle; + final String dialogSubTitle; + + @override + Widget build(BuildContext context) { + final List actions = [ + RaisedRoundedButton( + key: const Key('Close'), + onTap: () => navigationService.pop(), + buttonLabel: AppLocalizations.of(context)!.strictTranslate('Close'), + textColor: Colors.white, + backgroundColor: const Color(0xFF008A37), + width: SizeConfig.screenWidth! * 0.2, + height: SizeConfig.screenHeight! * 0.06, + ), + RaisedRoundedButton( + key: Key(successText ?? 'Confirm'), + onTap: () => success(), + buttonLabel: successText ?? + AppLocalizations.of(context)!.strictTranslate('Confirm'), + textColor: const Color(0xFF008A37), + backgroundColor: Colors.white, + width: SizeConfig.screenWidth! * 0.2, + height: SizeConfig.screenHeight! * 0.06, + ) + ]; + return AlertDialog( + title: Text( + dialogTitle ?? + AppLocalizations.of(context)!.strictTranslate('Confirmation'), + style: Theme.of(context) + .textTheme + .headline5! + .copyWith(fontWeight: FontWeight.w800), + ), + content: Text(dialogSubTitle), + buttonPadding: EdgeInsets.symmetric( + horizontal: SizeConfig.screenWidth! * 0.05, + vertical: SizeConfig.screenHeight! * 0.05), + actions: reverse ? actions.reversed.toList() : actions, + ); + } +} diff --git a/lib/widgets/custom_avatar.dart b/lib/widgets/custom_avatar.dart new file mode 100644 index 000000000..5603543a0 --- /dev/null +++ b/lib/widgets/custom_avatar.dart @@ -0,0 +1,54 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:shimmer/shimmer.dart'; + +class CustomAvatar extends StatelessWidget { + const CustomAvatar( + {Key? key, + required this.isImageNull, + this.firstAlphabet, + this.imageUrl, + this.fontSize = 40}) + : super(key: key); + final bool isImageNull; + final String? firstAlphabet; + final String? imageUrl; + final double? fontSize; + + @override + Widget build(BuildContext context) { + return isImageNull + ? CircleAvatar( + backgroundColor: + Theme.of(context).iconTheme.color!.withOpacity(0.2), + child: Center( + child: Text( + firstAlphabet!, + style: Theme.of(context) + .textTheme + .bodyText2! + .copyWith(fontSize: fontSize), + ), + ), + ) + : CachedNetworkImage( + imageBuilder: (context, imageProvider) { + return CircleAvatar( + backgroundColor: + Theme.of(context).iconTheme.color!.withOpacity(0.2), + backgroundImage: imageProvider, + ); + }, + imageUrl: imageUrl!, + placeholder: (context, url) => CircleAvatar( + child: Shimmer.fromColors( + baseColor: Colors.transparent, + highlightColor: Colors.white30, + child: const CircleAvatar(), + ), + ), + errorWidget: (context, url, error) => + const CircleAvatar(child: Icon(Icons.error)), + ); + } +} diff --git a/lib/widgets/custom_drawer.dart b/lib/widgets/custom_drawer.dart new file mode 100644 index 000000000..a1bb398b3 --- /dev/null +++ b/lib/widgets/custom_drawer.dart @@ -0,0 +1,108 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/widgets_view_models/custom_drawer_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/custom_avatar.dart'; +import 'package:talawa/widgets/from_palisadoes.dart'; + +class CustomDrawer extends StatelessWidget { + const CustomDrawer({ + Key? key, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return Container( + width: SizeConfig.screenWidth! * 0.6, + alignment: Alignment.centerLeft, + child: Drawer( + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + UserAccountsDrawerHeader( + currentAccountPicture: CustomAvatar( + isImageNull: model.selectedOrg.image == null, + imageUrl: model.selectedOrg.image, + firstAlphabet: + model.selectedOrg.name!.substring(0, 1), + ), + accountName: Text(model.selectedOrg.name!), + accountEmail: Text(AppLocalizations.of(context)! + .strictTranslate("Selected Organization")), + ), + Padding( + padding: const EdgeInsets.symmetric( + vertical: 5, horizontal: 8.0), + child: Text( + AppLocalizations.of(context)! + .strictTranslate("Switch Organization"), + style: Theme.of(context).textTheme.headline6, + ), + ), + SizedBox( + height: 270, + child: Scrollbar( + controller: model.controller, + isAlwaysShown: true, + child: ListView.builder( + controller: model.controller, + padding: EdgeInsets.zero, + itemCount: model.switchAbleOrg.length, + // itemCount: 3, + itemBuilder: (BuildContext context, int index) { + return ListTile( + onTap: () => + model.switchOrg(model.switchAbleOrg[index]), + leading: CustomAvatar( + isImageNull: + model.switchAbleOrg[index].image == null, + imageUrl: model.switchAbleOrg[index].image, + firstAlphabet: model + .switchAbleOrg[index].name! + .substring(0, 1), + fontSize: 18, + ), + title: Text( + model.switchAbleOrg[index].name!, + ), + ); + }, + ), + ), + ), + const Divider(), + ListTile( + onTap: () => + navigationService.popAndPushScreen(Routes.joinOrg), + leading: const Icon( + Icons.add, + size: 30, + ), + title: Text(AppLocalizations.of(context)! + .strictTranslate("Join new Organization")), + ), + ListTile( + leading: const Icon(Icons.logout, size: 30), + title: Text(AppLocalizations.of(context)! + .strictTranslate("Leave Current Organization")), + ), + ], + ), + const FromPalisadoes(), + ], + ), + ), + ); + }); + } +} diff --git a/lib/widgets/custom_list_tile.dart b/lib/widgets/custom_list_tile.dart new file mode 100644 index 000000000..9d21d1b3b --- /dev/null +++ b/lib/widgets/custom_list_tile.dart @@ -0,0 +1,136 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/models/options/options.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/widgets/custom_avatar.dart'; + +class CustomListTile extends StatelessWidget { + const CustomListTile( + {required Key key, + required this.index, + required this.type, + this.showIcon = false, + this.orgInfo, + this.onTapOrgInfo, + this.userInfo, + this.onTapUserInfo, + this.onTapOption, + this.option}) + : super(key: key); + final int index; + final TileType type; + final OrgInfo? orgInfo; + final User? userInfo; + final Options? option; + final Function? onTapOption; + final Function()? onTapUserInfo; + final Function(OrgInfo)? onTapOrgInfo; + final bool showIcon; + + @override + Widget build(BuildContext context) { + return InkWell( + onTap: () => type == TileType.org + ? onTapOrgInfo!(orgInfo!) + : type == TileType.user + ? onTapUserInfo!() + : onTapOption!(), + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 5), + child: Row( + children: [ + Expanded( + flex: 1, + child: type == TileType.option + ? option!.icon + : CustomAvatar( + isImageNull: type == TileType.org + ? orgInfo!.image == null + : userInfo!.image == null, + imageUrl: type == TileType.org + ? orgInfo!.image + : userInfo!.image, + firstAlphabet: type == TileType.org + ? orgInfo!.name!.substring(0, 1) + : userInfo!.firstName!.substring(0, 1), + fontSize: 18, + )), + Expanded( + flex: 3, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + type == TileType.org + ? orgInfo!.name! + : type == TileType.user + ? '${userInfo!.firstName!} ${userInfo!.lastName!}' + : option!.title, + style: type == TileType.org + ? Theme.of(context).textTheme.headline5 + : type == TileType.user + ? Theme.of(context).textTheme.headline6 + : option!.trailingIconButton == null + ? Theme.of(context).textTheme.bodyText2 + : Theme.of(context) + .textTheme + .headline5! + .copyWith(fontSize: 18), + ), + type != TileType.user + ? Text( + type == TileType.org + ? '${AppLocalizations.of(context)!.strictTranslate("Creator")}: ${orgInfo!.creatorInfo!.firstName!} ${orgInfo!.creatorInfo!.lastName!}' + : option!.subtitle, + style: type == TileType.org + ? Theme.of(context).textTheme.headline6 + : option!.trailingIconButton == null + ? Theme.of(context).textTheme.caption + : Theme.of(context).textTheme.headline6, + ) + : const SizedBox(), + ], + )), + Expanded( + flex: 1, + child: type != TileType.user + ? type == TileType.org + ? Column( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Row( + children: [ + Icon( + orgInfo!.isPublic! + ? Icons.lock_open + : Icons.lock, + color: orgInfo!.isPublic! + ? const Color(0xFF34AD64) + : const Color(0xffFABC57), + ), + Text(orgInfo!.isPublic! + ? AppLocalizations.of(context)! + .strictTranslate('Public') + : AppLocalizations.of(context)! + .strictTranslate('Private')), + ], + ), + showIcon + ? const Icon( + Icons.arrow_drop_down, + size: 25, + ) + : const SizedBox(), + ], + ) + : option!.trailingIconButton ?? const SizedBox() + : const SizedBox(), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/custom_progress_dialog.dart b/lib/widgets/custom_progress_dialog.dart new file mode 100644 index 000000000..bdb652d63 --- /dev/null +++ b/lib/widgets/custom_progress_dialog.dart @@ -0,0 +1,52 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/widgets_view_models/progress_dialog_view_model.dart'; +import 'package:talawa/views/base_view.dart'; + +class CustomProgressDialog extends StatelessWidget { + const CustomProgressDialog({required Key key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(), + builder: (context, model, child) { + return Container( + margin: EdgeInsets.symmetric( + horizontal: SizeConfig.screenWidth! * 0.25, + vertical: SizeConfig.screenHeight! * 0.35), + decoration: BoxDecoration( + color: Theme.of(context).textTheme.headline6!.color, + borderRadius: BorderRadius.circular(15), + ), + child: model.connectivityPresent + ? Center( + child: CupertinoActivityIndicator( + radius: SizeConfig.screenWidth! * 0.065, + )) + : Column( + children: [ + Container( + alignment: Alignment.bottomCenter, + height: SizeConfig.screenWidth! * 0.4, + width: SizeConfig.screenWidth! * 0.4, + padding: const EdgeInsets.only(bottom: 10), + decoration: const BoxDecoration( + image: DecorationImage( + image: + AssetImage('assets/images/no_internet.png'), + fit: BoxFit.scaleDown)), + ), + Text( + '${AppLocalizations.of(context)!.strictTranslate("No Internet")}!', + style: Theme.of(context).textTheme.headline5, + ), + ], + ), + ); + }); + } +} diff --git a/lib/widgets/date_time_picker.dart b/lib/widgets/date_time_picker.dart new file mode 100644 index 000000000..20987ec55 --- /dev/null +++ b/lib/widgets/date_time_picker.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/locator.dart'; + +Future customDatePicker({required DateTime initialDate}) async { + final DateTime? _picked = await showDatePicker( + context: navigationService.navigatorKey.currentContext!, + initialDate: initialDate, + firstDate: DateTime(2015, 8), + lastDate: DateTime(2101)); + if (_picked != null && _picked != initialDate) { + return _picked; + } + return initialDate; +} + +Future customTimePicker({required TimeOfDay initialTime}) async { + final TimeOfDay? _pickedTime = await showTimePicker( + context: navigationService.navigatorKey.currentContext!, + initialTime: initialTime); + + if (_pickedTime != null && _pickedTime != initialTime) { + return _pickedTime; + } + return initialTime; +} diff --git a/lib/widgets/event_card.dart b/lib/widgets/event_card.dart new file mode 100644 index 000000000..26061d98c --- /dev/null +++ b/lib/widgets/event_card.dart @@ -0,0 +1,203 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; + +class EventCard extends StatelessWidget { + const EventCard({Key? key, required this.event}) : super(key: key); + final Event event; + @override + Widget build(BuildContext context) { + final bool isSubscribed = event.isRegistered ?? false; + + return Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Stack( + children: [ + Card( + shape: RoundedRectangleBorder( + side: isSubscribed + ? BorderSide( + color: Theme.of(context).accentColor, + width: SizeConfig.screenWidth! * 0.008, + ) + : BorderSide.none, + ), + elevation: 3, + color: Theme.of(context).primaryColor, + child: Column( + children: [ + Container( + height: SizeConfig.screenHeight! * 0.11, + width: double.infinity, + color: Colors.grey.withOpacity(0.3), + ), + Padding( + padding: const EdgeInsets.all(10), + child: Column( + children: [ + Row( + children: [ + SizedBox( + width: SizeConfig.screenWidth! * 0.50, + child: Text( + event.title!, + style: Theme.of(context).textTheme.headline5, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + ), + ), + const Spacer(), + const Icon( + Icons.calendar_today, + size: 13, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.027, + ), + Text( + "${event.startDate!} - ${event.endDate!}", + style: Theme.of(context).textTheme.caption, + ) + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.006, + ), + Row( + children: [ + const Icon( + Icons.schedule, + size: 12, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.015, + ), + Text( + "${event.startTime!} - ${event.endTime!}", + style: Theme.of(context).textTheme.caption, + ), + const Spacer(), + const Icon( + Icons.place, + size: 12, + ), + SizedBox( + child: Text( + event.location!.substring( + 0, min(event.location!.length, 20)), + style: Theme.of(context).textTheme.caption, + ), + ) + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + width: SizeConfig.screenWidth! * 0.55, + child: Text( + event.description!, + style: Theme.of(context).textTheme.caption, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + maxLines: 3, + ), + ), + const Icon( + Icons.chevron_right, + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.007, + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + event.isPublic! + ? Icon( + Icons.lock_open, + size: 13, + color: Theme.of(context).colorScheme.primary, + ) + : Icon( + Icons.lock, + size: 13, + color: Theme.of(context).colorScheme.primary, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.013, + ), + event.isPublic! + ? Text( + AppLocalizations.of(context)! + .strictTranslate('public'), + style: Theme.of(context).textTheme.caption, + ) + : Text( + AppLocalizations.of(context)! + .strictTranslate('private'), + style: Theme.of(context).textTheme.caption, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.027, + ), + const Icon( + Icons.people_outline, + size: 13, + color: Color(0xff4285F4), + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.013, + ), + event.attendees != null + ? Text( + event.attendees!, + style: Theme.of(context).textTheme.caption, + ) + : Text( + '10', + style: Theme.of(context).textTheme.caption, + ) + ], + ), + ], + ), + ) + ], + ), + ), + Positioned( + top: SizeConfig.screenHeight! * 0.007, + right: SizeConfig.screenWidth! * 0.013, + child: isSubscribed + ? Container( + height: SizeConfig.screenHeight! * 0.041, + width: SizeConfig.screenWidth! * 0.277, + decoration: BoxDecoration( + color: Theme.of(context).accentColor, + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(15))), + child: Center( + child: Text( + AppLocalizations.of(context)! + .strictTranslate('Subscribed'), + style: Theme.of(context).textTheme.headline6!.copyWith( + color: Colors.white, fontWeight: FontWeight.w700), + ), + ), + ) + : const SizedBox(), + ) + ], + ), + ); + } +} diff --git a/lib/widgets/event_date_time_tile.dart b/lib/widgets/event_date_time_tile.dart new file mode 100644 index 000000000..80771f31b --- /dev/null +++ b/lib/widgets/event_date_time_tile.dart @@ -0,0 +1,20 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/services/size_config.dart'; + +class DateTimeTile extends StatelessWidget { + const DateTimeTile({Key? key, required this.child}) : super(key: key); + final Widget child; + + @override + Widget build(BuildContext context) { + return Container( + color: Theme.of(context).colorScheme.secondary, + height: SizeConfig.screenHeight! * 0.068, + width: double.infinity, + child: Padding( + padding: + EdgeInsets.symmetric(horizontal: SizeConfig.screenWidth! * 0.083), + child: child), + ); + } +} diff --git a/lib/widgets/from_palisadoes.dart b/lib/widgets/from_palisadoes.dart new file mode 100644 index 000000000..707ee07a3 --- /dev/null +++ b/lib/widgets/from_palisadoes.dart @@ -0,0 +1,44 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; + +class FromPalisadoes extends StatelessWidget { + const FromPalisadoes({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + AppLocalizations.of(context)!.strictTranslate('from'), + style: Theme.of(context).textTheme.caption, + ), + ], + ), + SizedBox( + height: SizeConfig.blockSizeHorizontal, + ), + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'PALISADOES', + style: Theme.of(context) + .textTheme + .subtitle2! + .copyWith(fontWeight: FontWeight.w700), + ), + ], + ), + SizedBox( + height: SizeConfig.blockSizeHorizontal! * 5, + ), + ], + ); + } +} diff --git a/lib/widgets/pinned_carousel_widget.dart b/lib/widgets/pinned_carousel_widget.dart new file mode 100644 index 000000000..47102fdb0 --- /dev/null +++ b/lib/widgets/pinned_carousel_widget.dart @@ -0,0 +1,153 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; + +class PinnedPostCarousel extends StatelessWidget { + const PinnedPostCarousel({ + Key? key, + required this.pinnedPosts, + required this.navigateToPinnedPostPage, + required this.navigateToIndividualPostPage, + }) : super(key: key); + + final List pinnedPosts; + final Function navigateToPinnedPostPage; + final Function navigateToIndividualPostPage; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + height: 220, + color: Theme.of(context).colorScheme.primaryVariant.withOpacity(0.5), + child: CustomCarouselScroller( + pinnedPosts: pinnedPosts, + key: const Key('Carousel'), + navigateToIndividualPostPage: navigateToIndividualPostPage, + ), + ), + GestureDetector( + onTap: () => navigateToPinnedPostPage(), + child: Container( + height: 50, + width: SizeConfig.screenWidth, + padding: const EdgeInsets.symmetric(horizontal: 16.0), + color: Theme.of(context).colorScheme.primaryVariant, + child: Row( + children: [ + Expanded( + flex: 1, + child: Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Icon( + Icons.article, + color: Theme.of(context).accentColor, + ), + ), + ), + Expanded( + flex: 8, + child: Text( + AppLocalizations.of(context)! + .strictTranslate("See all Pinned news"), + style: Theme.of(context).textTheme.headline6, + ), + ), + const Expanded(flex: 1, child: Icon(Icons.arrow_forward_ios)) + ], + ), + ), + ) + ], + ); + } +} + +class CustomCarouselScroller extends StatefulWidget { + const CustomCarouselScroller( + {Key? key, + required this.pinnedPosts, + required this.navigateToIndividualPostPage}) + : super(key: key); + final List pinnedPosts; + final Function navigateToIndividualPostPage; + + @override + _CustomCarouselScrollerState createState() => _CustomCarouselScrollerState(); +} + +class _CustomCarouselScrollerState extends State { + final PageController controller = PageController(initialPage: 0); + int pindex = 0; + + @override + Widget build(BuildContext context) { + return Stack(children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.end, + children: [ + ListTile( + leading: const CircleAvatar( + radius: 15.0, + backgroundColor: Color(0xff737373), + ), + title: Text( + "${widget.pinnedPosts[pindex].creator!.firstName} ${widget.pinnedPosts[pindex].creator!.lastName}"), + ), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Text( + widget.pinnedPosts[pindex].description!.length > 90 + ? "${widget.pinnedPosts[pindex].description!.substring(0, 90)}..." + : widget.pinnedPosts[pindex].description!, + style: Theme.of(context) + .textTheme + .bodyText1! + .copyWith(color: const Color(0xFF737373)), + ), + ), + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16.0, vertical: 10.0), + child: Row( + children: [ + for (int i = 0; i < 4; i++) + Expanded( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 5.0), + child: Divider( + thickness: 3.0, + color: pindex == i + ? Theme.of(context).colorScheme.primary + : Colors.grey, + ), + ), + ) + ], + ), + ) + ], + ), + ), + PageView( + scrollDirection: Axis.horizontal, + controller: controller, + onPageChanged: (index) { + setState(() { + pindex = index; + }); + }, + children: List.generate( + widget.pinnedPosts.length, + (index) => Container(), + ), + ), + ]); + } +} diff --git a/lib/widgets/post_detailed_page.dart b/lib/widgets/post_detailed_page.dart new file mode 100644 index 000000000..9f17ca530 --- /dev/null +++ b/lib/widgets/post_detailed_page.dart @@ -0,0 +1,76 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/utils/app_localization.dart'; + +class DescriptionTextWidget extends StatefulWidget { + const DescriptionTextWidget({required this.text}); + final String text; + + @override + _DescriptionTextWidgetState createState() => _DescriptionTextWidgetState(); +} + +class _DescriptionTextWidgetState extends State { + late String firstHalf; + late String secondHalf; + + bool flag = true; + + @override + void initState() { + super.initState(); + + if (widget.text.length > 150) { + firstHalf = widget.text.substring(0, 150); + secondHalf = widget.text.substring(150, widget.text.length); + } else { + firstHalf = widget.text; + secondHalf = ""; + } + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 5.0), + child: secondHalf.isEmpty + ? Text( + firstHalf, + style: Theme.of(context) + .textTheme + .bodyText2! + .copyWith(fontFamily: 'open-sans'), + ) + : Column( + children: [ + Text( + flag ? ("$firstHalf...") : (firstHalf + secondHalf), + style: Theme.of(context) + .textTheme + .bodyText2! + .copyWith(fontFamily: 'open-sans'), + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + InkWell( + onTap: () { + setState(() { + flag = !flag; + }); + }, + child: Text( + flag + ? AppLocalizations.of(context)! + .strictTranslate("show more") + : AppLocalizations.of(context)! + .strictTranslate("show less"), + style: const TextStyle(color: Colors.blue), + ), + ), + ], + ), + ], + ), + ); + } +} diff --git a/lib/widgets/post_list_widget.dart b/lib/widgets/post_list_widget.dart new file mode 100644 index 000000000..597f70f1d --- /dev/null +++ b/lib/widgets/post_list_widget.dart @@ -0,0 +1,37 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/widgets/post_widget.dart'; + +class PostListWidget extends StatelessWidget { + const PostListWidget({ + Key? key, + required this.posts, + this.function, + }) : super(key: key); + final List posts; + final Function? function; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + for (int i = 0; i < posts.length; i++) + Column( + children: [ + NewsPost( + post: posts[i], + function: function, + ), + const Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: Divider( + height: 8, + thickness: 8, + ), + ) + ], + ) + ], + ); + } +} diff --git a/lib/widgets/post_widget.dart b/lib/widgets/post_widget.dart new file mode 100644 index 000000000..fd7a8750a --- /dev/null +++ b/lib/widgets/post_widget.dart @@ -0,0 +1,109 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/widgets_view_models/like_button_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/custom_avatar.dart'; +import 'package:talawa/widgets/post_detailed_page.dart'; + +class NewsPost extends StatelessWidget { + const NewsPost({ + Key? key, + required this.post, + this.function, + }) : super(key: key); + + final Post post; + final Function? function; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // const PinnedPostCarousel(), + ListTile( + leading: CustomAvatar( + isImageNull: post.creator!.image == null, + firstAlphabet: + post.creator!.firstName!.substring(0, 1).toUpperCase(), + imageUrl: post.creator!.image, + fontSize: 24, + ), + title: Text( + "${post.creator!.firstName} ${post.creator!.lastName}", + style: const TextStyle(fontSize: 20, fontWeight: FontWeight.w400), + ), + subtitle: Text(post.getPostCreatedDuration()), + ), + DescriptionTextWidget(text: post.description!), + Container( + height: 400, + color: Theme.of(context).colorScheme.primaryVariant.withOpacity(0.5), + ), + BaseView( + onModelReady: (model) => + model.initialize(post.likedBy ?? [], post.sId), + builder: (context, model, child) => Column( + children: [ + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () => function != null ? function!(post) : {}, + child: Text( + "${model.likedBy.length} ${AppLocalizations.of(context)!.strictTranslate("Likes")}", + style: const TextStyle( + fontFamily: 'open-sans', + fontWeight: FontWeight.w800), + ), + ), + GestureDetector( + onTap: () => function != null ? function!(post) : {}, + child: Text( + "${post.comments!.length} ${AppLocalizations.of(context)!.strictTranslate("comments")}")) + ], + ), + ), + const Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0), + child: Divider(), + ), + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 5), + child: Row( + children: [ + GestureDetector( + onTap: () { + model.toggleIsLiked(); + }, + child: Icon( + Icons.thumb_up, + color: model.isLiked + ? Theme.of(context).accentColor + : const Color(0xff737373), + ), + ), + GestureDetector( + onTap: () => function != null ? function!(post) : {}, + child: const Padding( + padding: EdgeInsets.only(left: 18.0), + child: Icon( + Icons.comment, + color: Color(0xff737373), + ), + )), + ], + ), + ), + ], + ), + ), + ], + ); + } +} diff --git a/lib/widgets/raised_round_edge_button.dart b/lib/widgets/raised_round_edge_button.dart new file mode 100644 index 000000000..cd50f278e --- /dev/null +++ b/lib/widgets/raised_round_edge_button.dart @@ -0,0 +1,88 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/services/size_config.dart'; + +class RaisedRoundedButton extends StatefulWidget { + const RaisedRoundedButton( + {required Key key, + required this.buttonLabel, + required this.backgroundColor, + required this.textColor, + required this.onTap, + this.height, + this.width, + this.showArrow = false}) + : super(key: key); + final Color backgroundColor; + final Color textColor; + final bool showArrow; + final String buttonLabel; + final Function onTap; + final double? height; + final double? width; + + @override + _RaisedRoundedButtonState createState() => _RaisedRoundedButtonState(); +} + +class _RaisedRoundedButtonState extends State { + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () { + widget.onTap(); + }, + child: Container( + width: widget.width ?? SizeConfig.screenWidth! * 0.94, + height: widget.height ?? SizeConfig.screenHeight! * 0.07, + alignment: Alignment.center, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: widget.backgroundColor, + boxShadow: [ + BoxShadow( + color: Theme.of(context).dividerColor, + offset: const Offset(0, 1), + blurRadius: 4.0, + spreadRadius: 0, + ) + ]), + child: widget.showArrow + ? Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + width: SizeConfig.screenWidth! * 0.06, + ), + //Unused + const Icon( + Icons.arrow_forward, + color: Colors.transparent, + ), + const Spacer(), + Text( + widget.buttonLabel, + style: TextStyle( + fontWeight: FontWeight.w400, + fontSize: 18, + color: widget.textColor), + ), + const Spacer(), + Icon( + Icons.arrow_forward, + color: widget.textColor, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.06, + ) + ], + ) + : Text( + widget.buttonLabel, + style: TextStyle( + fontWeight: FontWeight.w400, + fontSize: 18, + color: widget.textColor), + ), + )); + } +} diff --git a/lib/widgets/rich_text.dart b/lib/widgets/rich_text.dart new file mode 100644 index 000000000..0623492bd --- /dev/null +++ b/lib/widgets/rich_text.dart @@ -0,0 +1,27 @@ +import 'package:flutter/cupertino.dart'; +import 'package:talawa/utils/app_localization.dart'; + +class CustomRichText extends StatelessWidget { + const CustomRichText({required Key key, required this.words}) + : super(key: key); + final List> words; + @override + Widget build(BuildContext context) { + return RichText( + textAlign: TextAlign.start, + text: TextSpan( + text: + "${AppLocalizations.of(context)!.translate(words[0]['text'].toString().trim())} ", + style: words[0]['textStyle'] as TextStyle, + children: List.generate( + words.length - 1, + (index) => TextSpan( + text: + "${AppLocalizations.of(context)!.translate(words[index + 1]['text'].toString().trim())} ", + style: words[index + 1]['textStyle'] as TextStyle, + ), + ), + ), + ); + } +} diff --git a/lib/widgets/signup_progress_indicator.dart b/lib/widgets/signup_progress_indicator.dart new file mode 100644 index 000000000..005a35311 --- /dev/null +++ b/lib/widgets/signup_progress_indicator.dart @@ -0,0 +1,63 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:timelines/timelines.dart'; + +class SignupProgressIndicator extends StatelessWidget { + SignupProgressIndicator({required Key key, required this.currentPageIndex}) + : super(key: key); + + final int currentPageIndex; + final List progressLabel = [ + 'Select\nOrganization', + 'Enter Details', + 'Final', + ]; + + @override + Widget build(BuildContext context) { + return Container( + alignment: Alignment.center, + height: SizeConfig.screenHeight! * 0.15, + child: Timeline.tileBuilder( + scrollDirection: Axis.horizontal, + physics: const NeverScrollableScrollPhysics(), + padding: EdgeInsets.zero, + builder: TimelineTileBuilder.connected( + contentsBuilder: (_, index) => Text( + AppLocalizations.of(context)!.strictTranslate(progressLabel[index]), + style: Theme.of(context).textTheme.bodyText2!.copyWith( + color: index <= currentPageIndex + ? const Color(0xFF008A37) + : const Color(0xFF737373)), + textAlign: TextAlign.center, + ), + connectorBuilder: (_, index, __) { + return SolidLineConnector( + space: 30, + color: index < currentPageIndex + ? const Color(0xFF008A37) + : const Color(0xFF737373)); + }, + indicatorBuilder: (_, index) { + return DotIndicator( + size: 25, + color: index <= currentPageIndex + ? const Color(0xFF008A37) + : const Color(0xFF737373), + child: index < currentPageIndex + ? const Icon( + Icons.done, + color: Colors.white, + size: 20, + ) + : const SizedBox(), + ); + }, + itemExtentBuilder: (_, __) => MediaQuery.of(context).size.width / 3, + itemCount: 3, + ), + ), + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 000000000..1440ca164 --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,93 @@ +name: talawa +description: Welcome to the Talawa Project for the Palisadoes Foundation + Community Organization Management Software. + +publish_to: "none" # Remove this line if you wish to publish to pub.dev + +version: 1.0.0+1 + +homepage: https://github.com/PalisadoesFoundation/talawa + +repository: https://github.com/PalisadoesFoundation/talawa + +environment: + sdk: ">=2.12.0 <3.0.0" + +dependencies: + cached_network_image: ^3.0.0 + connectivity_plus: ^1.0.3 + cupertino_icons: ^1.0.3 + flutter: + sdk: flutter + flutter_localizations: + sdk: flutter + get_it: ^7.1.3 + graphql_flutter: ^5.0.0 + hive: ^2.0.4 + http: ^0.13.3 + intl: ^0.17.0 + json_annotation: ^4.0.1 + mockito: ^5.0.10 + path_provider: ^2.0.2 + provider: ^5.0.0 + shared_preferences: ^2.0.6 + shimmer: ^2.0.0 + timelines: ^0.1.0 + uni_links: ^0.5.1 + visibility_detector: ^0.2.0 + +dev_dependencies: + build_runner: ^2.0.4 + flutter_test: + sdk: flutter + hive_generator: ^1.1.0 + json_serializable: ^4.1.3 + lint: ^1.5.3 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec +# The following section is specific to Flutter. +flutter: + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + # To add assets to your application, add an assets section, like this: + assets: + - assets/images/ + - lang/ + # - images/a_dot_ham.jpeg + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/assets-and-images/#resolution-aware. + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/assets-and-images/#from-packages + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + fonts: + - family: product-sans + fonts: + - asset: assets/fonts/ProductSans-Regular.ttf + - asset: assets/fonts/ProductSans-Medium.ttf + weight: 600 + - asset: assets/fonts/ProductSans-Bold.ttf + weight: 800 + - family: open-sans + fonts: + - asset: assets/fonts/OpenSans-Regular.ttf + - asset: assets/fonts/OpenSans-SemiBold.ttf + weight: 600 + - asset: assets/fonts/OpenSans-Bold.ttf + weight: 800 + # - asset: + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: assets\fonts\OpenSans-Bold.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/custom-fonts/#from-packages diff --git a/test/helpers/test_helpers.dart b/test/helpers/test_helpers.dart new file mode 100644 index 000000000..398876fc4 --- /dev/null +++ b/test/helpers/test_helpers.dart @@ -0,0 +1,143 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/event_service.dart'; +import 'package:talawa/services/graphql_config.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/services/post_service.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/explore_events_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/feed_view_models/organization_feed_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/profile_view_models/profile_page_view_model.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/view_model/widgets_view_models/like_button_view_model.dart'; + +import 'test_helpers.mocks.dart'; + +@GenerateMocks([], customMocks: [ + MockSpec(returnNullOnMissingStub: true), + MockSpec(returnNullOnMissingStub: true), + MockSpec(returnNullOnMissingStub: true), + MockSpec(returnNullOnMissingStub: true), + MockSpec(returnNullOnMissingStub: true), +]) +void _removeRegistrationIfExists() { + if (locator.isRegistered()) { + locator.unregister(); + } +} + +NavigationService getAndRegisterNavigationService() { + _removeRegistrationIfExists(); + final service = MockNavigationService(); + when(service.navigatorKey).thenReturn(GlobalKey()); + locator.registerSingleton(service); + return service; +} + +GraphqlConfig getAndRegisterGraphqlConfig() { + _removeRegistrationIfExists(); + final service = MockGraphqlConfig(); + locator.registerSingleton(service); + return service; +} + +UserConfig getAndRegisterUserConfig() { + _removeRegistrationIfExists(); + final service = MockUserConfig(); + + //Mock Data for current organizaiton. + when(service.currentOrg).thenReturn(OrgInfo( + id: "XYZ", + name: "Organization Name", + )); + + //Mock Stream for currentOrgStream + final StreamController _streamController = StreamController(); + final Stream _stream = _streamController.stream.asBroadcastStream(); + when(service.currentOrfInfoStream).thenAnswer((invocation) => _stream); + + //Mkock current user + when(service.currentUser).thenReturn(User( + id: "xzy1", + firstName: "Test", + lastName: "User", + email: "testuser@gmail.com")); + + locator.registerSingleton(service); + return service; +} + +PostService getAndRegisterPostService() { + _removeRegistrationIfExists(); + final service = MockPostService(); + + //Mock Stream for currentOrgStream + final StreamController> _streamController = StreamController(); + final Stream> _stream = + _streamController.stream.asBroadcastStream(); + when(service.postStream).thenAnswer((invocation) => _stream); + + final StreamController _updateStreamController = StreamController(); + final Stream _updateStream = + _updateStreamController.stream.asBroadcastStream(); + when(service.updatedPostStream).thenAnswer((invocation) => _updateStream); + + locator.registerSingleton(service); + return service; +} + +EventService getAndRegisterEventService() { + _removeRegistrationIfExists(); + final service = MockEventService(); + + //Mock Stream for currentOrgStream + final StreamController _streamController = StreamController(); + final Stream _stream = _streamController.stream.asBroadcastStream(); + when(service.eventStream).thenAnswer((invocation) => _stream); + + locator.registerSingleton(service); + return service; +} + +void registerServices() { + getAndRegisterNavigationService(); + getAndRegisterGraphqlConfig(); + getAndRegisterUserConfig(); + getAndRegisterPostService(); + getAndRegisterEventService(); +} + +void unregisterServices() { + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); +} + +void registerViewModels() { + locator.registerFactory(() => MainScreenViewModel()); + locator.registerFactory(() => OrganizationFeedViewModel()); + locator.registerFactory(() => ExploreEventsViewModel()); + locator.registerFactory(() => ProfilePageViewModel()); + locator.registerFactory(() => LikeButtonViewModel()); + locator.registerFactory(() => SizeConfig()); +} + +void unregisterViewModels() { + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); +} diff --git a/test/helpers/test_helpers.mocks.dart b/test/helpers/test_helpers.mocks.dart new file mode 100644 index 000000000..19bed8cc1 --- /dev/null +++ b/test/helpers/test_helpers.mocks.dart @@ -0,0 +1,267 @@ +// Mocks generated by Mockito 5.0.10 from annotations +// in talawa/test/helpers/test_helpers.dart. +// Do not manually edit this file. + +import 'dart:async' as _i5; + +import 'package:flutter/src/widgets/framework.dart' as _i1; +import 'package:flutter/src/widgets/navigator.dart' as _i9; +import 'package:gql_http_link/src/link.dart' as _i3; +import 'package:graphql/src/graphql_client.dart' as _i4; +import 'package:mockito/mockito.dart' as _i2; +import 'package:talawa/models/events/event_model.dart' as _i14; +import 'package:talawa/models/organization/org_info.dart' as _i6; +import 'package:talawa/models/post/post_model.dart' as _i12; +import 'package:talawa/models/user/user_info.dart' as _i7; +import 'package:talawa/services/event_service.dart' as _i13; +import 'package:talawa/services/graphql_config.dart' as _i10; +import 'package:talawa/services/navigation_service.dart' as _i8; +import 'package:talawa/services/post_service.dart' as _i11; +import 'package:talawa/services/user_config.dart' as _i15; + +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: comment_references +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis + +class _FakeGlobalKey> extends _i2.Fake + implements _i1.GlobalKey {} + +class _FakeHttpLink extends _i2.Fake implements _i3.HttpLink {} + +class _FakeGraphQLClient extends _i2.Fake implements _i4.GraphQLClient {} + +class _FakeStreamController extends _i2.Fake + implements _i5.StreamController {} + +class _FakeOrgInfo extends _i2.Fake implements _i6.OrgInfo {} + +class _FakeUser extends _i2.Fake implements _i7.User {} + +/// A class which mocks [NavigationService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockNavigationService extends _i2.Mock implements _i8.NavigationService { + @override + _i1.GlobalKey<_i9.NavigatorState> get navigatorKey => + (super.noSuchMethod(Invocation.getter(#navigatorKey), + returnValue: _FakeGlobalKey<_i9.NavigatorState>()) + as _i1.GlobalKey<_i9.NavigatorState>); + @override + set navigatorKey(_i1.GlobalKey<_i9.NavigatorState>? _navigatorKey) => + super.noSuchMethod(Invocation.setter(#navigatorKey, _navigatorKey), + returnValueForMissingStub: null); + @override + _i5.Future pushScreen(String? routeName, {dynamic arguments}) => + (super.noSuchMethod( + Invocation.method(#pushScreen, [routeName], {#arguments: arguments}), + returnValue: Future.value()) as _i5.Future); + @override + _i5.Future popAndPushScreen(String? routeName, + {dynamic arguments}) => + (super.noSuchMethod( + Invocation.method( + #popAndPushScreen, [routeName], {#arguments: arguments}), + returnValue: Future.value()) as _i5.Future); + @override + _i5.Future pushReplacementScreen(String? routeName, + {dynamic arguments}) => + (super.noSuchMethod( + Invocation.method( + #pushReplacementScreen, [routeName], {#arguments: arguments}), + returnValue: Future.value()) as _i5.Future); + @override + void fromInviteLink(List? routeNames, List? arguments) => + super.noSuchMethod( + Invocation.method(#fromInviteLink, [routeNames, arguments]), + returnValueForMissingStub: null); + @override + _i5.Future removeAllAndPush(String? routeName, String? tillRoute, + {dynamic arguments}) => + (super.noSuchMethod( + Invocation.method(#removeAllAndPush, [routeName, tillRoute], + {#arguments: arguments}), + returnValue: Future.value()) as _i5.Future); + @override + void pushDialog(_i1.Widget? dialog) => + super.noSuchMethod(Invocation.method(#pushDialog, [dialog]), + returnValueForMissingStub: null); + @override + void showSnackBar(String? message, + {Duration? duration = const Duration(seconds: 2)}) => + super.noSuchMethod( + Invocation.method(#showSnackBar, [message], {#duration: duration}), + returnValueForMissingStub: null); + @override + void pop() => super.noSuchMethod(Invocation.method(#pop, []), + returnValueForMissingStub: null); +} + +/// A class which mocks [GraphqlConfig]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockGraphqlConfig extends _i2.Mock implements _i10.GraphqlConfig { + @override + _i3.HttpLink get httpLink => (super.noSuchMethod(Invocation.getter(#httpLink), + returnValue: _FakeHttpLink()) as _i3.HttpLink); + @override + set httpLink(_i3.HttpLink? _httpLink) => + super.noSuchMethod(Invocation.setter(#httpLink, _httpLink), + returnValueForMissingStub: null); + @override + // ignore: avoid_setters_without_getters + set displayImgRoute(String? _displayImgRoute) => + super.noSuchMethod(Invocation.setter(#displayImgRoute, _displayImgRoute), + returnValueForMissingStub: null); + @override + _i5.Future getToken() => + (super.noSuchMethod(Invocation.method(#getToken, []), + returnValue: Future.value()) as _i5.Future); + @override + _i4.GraphQLClient clientToQuery() => + (super.noSuchMethod(Invocation.method(#clientToQuery, []), + returnValue: _FakeGraphQLClient()) as _i4.GraphQLClient); + @override + _i4.GraphQLClient authClient() => + (super.noSuchMethod(Invocation.method(#authClient, []), + returnValue: _FakeGraphQLClient()) as _i4.GraphQLClient); +} + +/// A class which mocks [PostService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockPostService extends _i2.Mock implements _i11.PostService { + @override + _i5.Stream> get postStream => + (super.noSuchMethod(Invocation.getter(#postStream), + returnValue: Stream>.empty()) + as _i5.Stream>); + @override + _i5.Stream<_i12.Post> get updatedPostStream => + (super.noSuchMethod(Invocation.getter(#updatedPostStream), + returnValue: Stream<_i12.Post>.empty()) as _i5.Stream<_i12.Post>); + @override + void setOrgStreamSubscription() => + super.noSuchMethod(Invocation.method(#setOrgStreamSubscription, []), + returnValueForMissingStub: null); + @override + _i5.Future getPosts() => + (super.noSuchMethod(Invocation.method(#getPosts, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i5.Future); + @override + _i5.Future addLike(String? postID) => + (super.noSuchMethod(Invocation.method(#addLike, [postID]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i5.Future); + @override + _i5.Future removeLike(String? postID) => + (super.noSuchMethod(Invocation.method(#removeLike, [postID]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i5.Future); + @override + void addCommentLocally(String? postID) => + super.noSuchMethod(Invocation.method(#addCommentLocally, [postID]), + returnValueForMissingStub: null); +} + +/// A class which mocks [EventService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockEventService extends _i2.Mock implements _i13.EventService { + @override + _i5.Stream<_i14.Event> get eventStream => + (super.noSuchMethod(Invocation.getter(#eventStream), + returnValue: Stream<_i14.Event>.empty()) as _i5.Stream<_i14.Event>); + @override + void setOrgStreamSubscription() => + super.noSuchMethod(Invocation.method(#setOrgStreamSubscription, []), + returnValueForMissingStub: null); + @override + _i5.Future getEvents() => + (super.noSuchMethod(Invocation.method(#getEvents, []), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i5.Future); + @override + _i5.Future registerForAnEvent(String? eventId) => + (super.noSuchMethod(Invocation.method(#registerForAnEvent, [eventId]), + returnValue: Future.value(), + returnValueForMissingStub: Future.value()) as _i5.Future); + @override + void dispose() => super.noSuchMethod(Invocation.method(#dispose, []), + returnValueForMissingStub: null); +} + +/// A class which mocks [UserConfig]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserConfig extends _i2.Mock implements _i15.UserConfig { + @override + _i5.Stream<_i6.OrgInfo> get currentOrfInfoStream => + (super.noSuchMethod(Invocation.getter(#currentOrfInfoStream), + returnValue: Stream<_i6.OrgInfo>.empty()) as _i5.Stream<_i6.OrgInfo>); + @override + _i5.StreamController<_i6.OrgInfo> get currentOrgInfoController => + (super.noSuchMethod(Invocation.getter(#currentOrgInfoController), + returnValue: _FakeStreamController<_i6.OrgInfo>()) + as _i5.StreamController<_i6.OrgInfo>); + @override + _i6.OrgInfo get currentOrg => + (super.noSuchMethod(Invocation.getter(#currentOrg), + returnValue: _FakeOrgInfo()) as _i6.OrgInfo); + @override + String get currentOrgName => + (super.noSuchMethod(Invocation.getter(#currentOrgName), returnValue: '') + as String); + @override + set currentOrg(_i6.OrgInfo? org) => + super.noSuchMethod(Invocation.setter(#currentOrg, org), + returnValueForMissingStub: null); + @override + _i7.User get currentUser => + (super.noSuchMethod(Invocation.getter(#currentUser), + returnValue: _FakeUser()) as _i7.User); + @override + void initialiseStream() => + super.noSuchMethod(Invocation.method(#initialiseStream, []), + returnValueForMissingStub: null); + @override + _i5.Future userLoggedIn() => + (super.noSuchMethod(Invocation.method(#userLoggedIn, []), + returnValue: Future.value(false)) as _i5.Future); + @override + _i5.Future updateUserJoinedOrg(List<_i6.OrgInfo>? orgDetails) => + (super.noSuchMethod(Invocation.method(#updateUserJoinedOrg, [orgDetails]), + returnValue: Future.value()) as _i5.Future); + @override + _i5.Future updateUserCreatedOrg(List<_i6.OrgInfo>? orgDetails) => + (super.noSuchMethod( + Invocation.method(#updateUserCreatedOrg, [orgDetails]), + returnValue: Future.value()) as _i5.Future); + @override + _i5.Future updateUserMemberRequestOrg( + List<_i6.OrgInfo>? orgDetails) => + (super.noSuchMethod( + Invocation.method(#updateUserMemberRequestOrg, [orgDetails]), + returnValue: Future.value()) as _i5.Future); + @override + _i5.Future updateUserAdminOrg(List<_i6.OrgInfo>? orgDetails) => + (super.noSuchMethod(Invocation.method(#updateUserAdminOrg, [orgDetails]), + returnValue: Future.value()) as _i5.Future); + @override + _i5.Future updateAccessToken( + {String? accessToken, String? refreshToken}) => + (super.noSuchMethod( + Invocation.method(#updateAccessToken, [], + {#accessToken: accessToken, #refreshToken: refreshToken}), + returnValue: Future.value()) as _i5.Future); + @override + _i5.Future updateUser(_i7.User? updatedUserDetails) => + (super.noSuchMethod(Invocation.method(#updateUser, [updatedUserDetails]), + returnValue: Future.value(false)) as _i5.Future); + @override + dynamic saveCurrentOrgInHive(_i6.OrgInfo? saveOrgAsCurrent) => + super.noSuchMethod( + Invocation.method(#saveCurrentOrgInHive, [saveOrgAsCurrent])); +} diff --git a/test/splash_screen_test.dart b/test/splash_screen_test.dart new file mode 100644 index 000000000..739ad09d9 --- /dev/null +++ b/test/splash_screen_test.dart @@ -0,0 +1,193 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/router.dart' as router; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/splash_screen.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/views/base_view.dart'; + +Widget createSplashScreenLight({ThemeMode themeMode = ThemeMode.light}) => + BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + themeMode: themeMode, + theme: TalawaTheme.lightTheme, + home: const SplashScreen( + key: Key('SplashScreen'), + ), + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + +Widget createSplashScreenDark({ThemeMode themeMode = ThemeMode.dark}) => + BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + themeMode: themeMode, + darkTheme: TalawaTheme.darkTheme, + home: const SplashScreen( + key: Key('SplashScreen'), + ), + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }); + +void main() { + setupLocator(); + graphqlConfig.test(); + group('Splash Screen Widget Test in light mode', () { + testWidgets("Testing if Splash Screen shows up", (tester) async { + await tester.pumpWidget(createSplashScreenLight()); + await tester.pumpAndSettle(); + final screenScaffoldWidget = + find.byKey(const Key('SplashScreenScaffold')); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.lightTheme.scaffoldBackgroundColor, + ); + }); + testWidgets("Testing if app logo shows up", (tester) async { + await tester.pumpWidget(createSplashScreenLight()); + await tester.pumpAndSettle(); + final logoWidget = find.byKey(const Key('LogoPainter')); + expect(logoWidget, findsOneWidget); + expect( + (tester.firstWidget(logoWidget) as CustomPaint).size, + Size(SizeConfig.screenWidth! * 0.6, + (SizeConfig.screenWidth! * 0.6).toDouble())); + }); + testWidgets("Testing if app name shows up", (tester) async { + await tester.pumpWidget(createSplashScreenLight()); + await tester.pumpAndSettle(); + final findAppNameWidget = find.text('TALAWA'); + expect(findAppNameWidget, findsOneWidget); + expect((tester.firstWidget(findAppNameWidget) as Text).style!.color, + TalawaTheme.lightTheme.textTheme.headline4!.color); + expect((tester.firstWidget(findAppNameWidget) as Text).style!.fontFamily, + TalawaTheme.lightTheme.textTheme.headline4!.fontFamily); + expect((tester.firstWidget(findAppNameWidget) as Text).style!.fontSize, + TalawaTheme.lightTheme.textTheme.headline4!.fontSize); + }); + testWidgets("Testing if provider text shows up", (tester) async { + await tester.pumpWidget(createSplashScreenLight()); + await tester.pumpAndSettle(); + final findProviderTextWidget = find.text('from'); + expect(findProviderTextWidget, findsOneWidget); + expect((tester.firstWidget(findProviderTextWidget) as Text).style!.color, + TalawaTheme.lightTheme.textTheme.caption!.color); + expect( + (tester.firstWidget(findProviderTextWidget) as Text) + .style! + .fontFamily, + TalawaTheme.lightTheme.textTheme.caption!.fontFamily); + expect( + (tester.firstWidget(findProviderTextWidget) as Text).style!.fontSize, + TalawaTheme.lightTheme.textTheme.caption!.fontSize); + }); + testWidgets("Testing if provider name shows up", (tester) async { + await tester.pumpWidget(createSplashScreenLight()); + await tester.pumpAndSettle(); + final findProviderNameWidget = find.text('PALISADOES'); + expect(findProviderNameWidget, findsOneWidget); + expect((tester.firstWidget(findProviderNameWidget) as Text).style!.color, + TalawaTheme.lightTheme.textTheme.subtitle2!.color); + expect( + (tester.firstWidget(findProviderNameWidget) as Text) + .style! + .fontFamily, + TalawaTheme.lightTheme.textTheme.subtitle2!.fontFamily); + }); + }); + group('Splash Screen Widget Test in dark mode', () { + testWidgets("Testing if Splash Screen shows up", (tester) async { + await tester.pumpWidget(createSplashScreenDark()); + await tester.pumpAndSettle(); + final screenScaffoldWidget = + find.byKey(const Key('SplashScreenScaffold')); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .darkTheme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + }); + testWidgets("Testing if app logo shows up", (tester) async { + await tester.pumpWidget(createSplashScreenDark()); + await tester.pumpAndSettle(); + final logoWidget = find.byKey(const Key('LogoPainter')); + expect(logoWidget, findsOneWidget); + expect( + (tester.firstWidget(logoWidget) as CustomPaint).size, + Size(SizeConfig.screenWidth! * 0.6, + (SizeConfig.screenWidth! * 0.6).toDouble())); + }); + testWidgets("Testing if app name shows up", (tester) async { + await tester.pumpWidget(createSplashScreenDark()); + await tester.pumpAndSettle(); + final findAppNameWidget = find.text('TALAWA'); + expect(findAppNameWidget, findsOneWidget); + expect((tester.firstWidget(findAppNameWidget) as Text).style!.color, + TalawaTheme.darkTheme.textTheme.headline4!.color); + expect((tester.firstWidget(findAppNameWidget) as Text).style!.fontFamily, + TalawaTheme.darkTheme.textTheme.headline4!.fontFamily); + expect((tester.firstWidget(findAppNameWidget) as Text).style!.fontSize, + TalawaTheme.darkTheme.textTheme.headline4!.fontSize); + }); + testWidgets("Testing if provider text shows up", (tester) async { + await tester.pumpWidget(createSplashScreenDark()); + await tester.pumpAndSettle(); + final findProviderTextWidget = find.text('from'); + expect(findProviderTextWidget, findsOneWidget); + expect((tester.firstWidget(findProviderTextWidget) as Text).style!.color, + TalawaTheme.darkTheme.textTheme.caption!.color); + expect( + (tester.firstWidget(findProviderTextWidget) as Text) + .style! + .fontFamily, + TalawaTheme.darkTheme.textTheme.caption!.fontFamily); + expect( + (tester.firstWidget(findProviderTextWidget) as Text).style!.fontSize, + TalawaTheme.darkTheme.textTheme.caption!.fontSize); + }); + testWidgets("Testing if provider name shows up", (tester) async { + await tester.pumpWidget(createSplashScreenDark()); + await tester.pumpAndSettle(); + final findProviderNameWidget = find.text('PALISADOES'); + expect(findProviderNameWidget, findsOneWidget); + expect((tester.firstWidget(findProviderNameWidget) as Text).style!.color, + TalawaTheme.darkTheme.textTheme.subtitle2!.color); + expect( + (tester.firstWidget(findProviderNameWidget) as Text) + .style! + .fontFamily, + TalawaTheme.darkTheme.textTheme.subtitle2!.fontFamily); + }); + }); +} diff --git a/test/widget_tests/home_page_test.dart b/test/widget_tests/home_page_test.dart new file mode 100644 index 000000000..796bcf9a0 --- /dev/null +++ b/test/widget_tests/home_page_test.dart @@ -0,0 +1,125 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/router.dart' as router; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/views/main_screen.dart'; + +import '../helpers/test_helpers.dart'; + +Widget createHomePageScreen() => BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + themeMode: ThemeMode.light, + theme: TalawaTheme.lightTheme, + home: const MainScreen( + key: Key('MainScreen'), + ), + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + +void main() { + locator.registerFactory(() => AppLanguage(isTest: true)); + setUp(() { + registerServices(); + registerViewModels(); + locator().test(); + }); + tearDown(() { + unregisterServices(); + unregisterViewModels(); + }); + group('HomePage Widget Test', () { + testWidgets("Testing if HomePage shows up", (tester) async { + await tester.pumpWidget(createHomePageScreen()); + await tester.pumpAndSettle(); + + expect(find.byType(BottomNavigationBar), findsOneWidget); + }); + + testWidgets('Verifying presence of icons in HomePage', (tester) async { + await tester.pumpWidget(createHomePageScreen()); + await tester.pumpAndSettle(); + //detecting icons by find.byIcon(Icons.home) + expect(find.byIcon(Icons.home), findsOneWidget); + expect(find.byIcon(Icons.event_note), findsOneWidget); + expect(find.byIcon(Icons.add_box), findsOneWidget); + expect(find.byIcon(Icons.chat_bubble_outline), findsOneWidget); + expect(find.byIcon(Icons.account_circle), findsOneWidget); + }); + + testWidgets('Verifying if the first index points to newsfeed', + (tester) async { + await tester.pumpWidget(createHomePageScreen()); + await tester.pumpAndSettle(); + expect(find.text('Organization Name'), findsWidgets); + }); + + testWidgets('Testing if Events Screen Shows up', (tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createHomePageScreen()); + await tester.pumpAndSettle(); + + final eventIcon = find.byIcon(Icons.event_note); + //tapping the eventIcon + await tester.tap(eventIcon); + await tester.pump(); + await tester.pumpAndSettle(); + // Event Screen should be present + expect(find.byKey(const Key("ExploreEventsAppBar")), findsOneWidget); + }); + }); + testWidgets('Testing if Post Screen Shows up', (tester) async { + await tester.pumpWidget(createHomePageScreen()); + await tester.pumpAndSettle(); + + expect(find.text('Post Screen'), findsNothing); + final postIcon = find.byIcon(Icons.add_box); + //tapping on postIcon + await tester.tap(postIcon); + await tester.pump(); + await tester.pumpAndSettle(); + //Post Screen should show up + expect(find.text('Share News'), findsOneWidget); + }); + + testWidgets('Testing if Chat Screen up', (tester) async { + await tester.pumpWidget(createHomePageScreen()); + await tester.pumpAndSettle(); + + final Finder chatIcon = find.byIcon(Icons.chat_bubble_outline); + await tester.tap(chatIcon); + await tester.pump(); + await tester.pumpAndSettle(); + expect(find.text('Chat Screen'), findsWidgets); + }); + + testWidgets('Testing if Profile Screen Shows up', (tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createHomePageScreen()); + await tester.pumpAndSettle(); + + final profileIcon = find.byIcon(Icons.account_circle); + await tester.tap(profileIcon); + await tester.pump(); + await tester.pumpAndSettle(); + expect(find.byKey(const Key('ProfilePageAppBar')), findsOneWidget); + }); + }); + }); +} diff --git a/test/widget_tests/select_language_page_test.dart b/test/widget_tests/select_language_page_test.dart new file mode 100644 index 000000000..4dc1b2ccd --- /dev/null +++ b/test/widget_tests/select_language_page_test.dart @@ -0,0 +1,270 @@ +import 'dart:math'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/constants/constants.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/router.dart' as router; +import 'package:talawa/services/graphql_config.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/view_model/pre_auth_view_models/set_url_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/views/pre_auth_screens/select_language.dart'; + +Widget createSelectLanguageScreenLight( + {ThemeMode themeMode = ThemeMode.light}) => + BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + themeMode: themeMode, + theme: TalawaTheme.lightTheme, + home: const SelectLanguage(key: Key('SelectLanguage')), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + +Widget createSelectLanguageScreenDark({ThemeMode themeMode = ThemeMode.dark}) => + BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return MaterialApp( + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + themeMode: themeMode, + darkTheme: TalawaTheme.darkTheme, + home: const SelectLanguage(key: Key('SelectLanguage')), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + +void main() { + locator.registerSingleton(NavigationService()); + locator.registerFactory(() => SetUrlViewModel()); + locator.registerSingleton(GraphqlConfig()); + locator.registerSingleton(SizeConfig()); + locator.registerFactory(() => AppLanguage(isTest: true)); + locator().test(); + locator().test(); + group('Select Language Screen Widget Test in light mode', () { + testWidgets("Testing if Select Language Screen shows up", (tester) async { + await tester.pumpWidget(createSelectLanguageScreenLight()); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('SelectLanguageScreenScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.lightTheme.scaffoldBackgroundColor, + ); + }); + testWidgets("Testing if screen title shows up", (tester) async { + await tester.pumpWidget(createSelectLanguageScreenLight()); + await tester.pumpAndSettle(); + final findAppNameWidget = find.byKey(const Key('Select Language')); + expect(findAppNameWidget, findsOneWidget); + + expect( + (tester.firstWidget(findAppNameWidget) as Text).style!.color, + TalawaTheme.lightTheme.textTheme.headline5!.color, + ); + + expect( + (tester.firstWidget(findAppNameWidget) as Text).style!.fontFamily, + TalawaTheme.lightTheme.textTheme.headline5!.fontFamily, + ); + + expect( + (tester.firstWidget(findAppNameWidget) as Text).style!.fontSize, + TalawaTheme.lightTheme.textTheme.headline5!.fontSize, + ); + }); + //This will be added once we implement the search box + // testWidgets("Testing if search box shows up", (tester) async { + // await tester.pumpWidget(createSelectLanguageScreenLight()); + // await tester.pumpAndSettle(); + // final findAppNameWidget = find.byKey(const Key('SearchField')); + // expect(findAppNameWidget, findsOneWidget); + // }); + testWidgets("Testing if languages list shows up", (tester) async { + await tester.pumpWidget(createSelectLanguageScreenLight()); + await tester.pumpAndSettle(); + final findAppNameWidget = find.byKey(const Key('LanguagesList')); + expect(findAppNameWidget, findsOneWidget); + }); + testWidgets("Testing if all languages are shown", (tester) async { + await tester.pumpWidget(createSelectLanguageScreenLight()); + await tester.pumpAndSettle(); + final findAppNameWidget = find.byKey(const Key('LanguageItem')); + expect(findAppNameWidget, findsNWidgets(languages.length)); + }); + testWidgets("Testing if only one language is selected", (tester) async { + await tester.pumpWidget(createSelectLanguageScreenLight()); + await tester.pumpAndSettle(); + final findAppNameWidget = find.byKey(const Key('Selected')); + expect(findAppNameWidget, findsOneWidget); + }); + testWidgets("Testing unselected language items", (tester) async { + await tester.pumpWidget(createSelectLanguageScreenLight()); + await tester.pumpAndSettle(); + final findAppNameWidget = find.byKey(const Key('NotSelected')); + expect(findAppNameWidget, findsNWidgets(languages.length - 1)); + }); + testWidgets("Testing to change language items", (tester) async { + final int randomNumber = Random().nextInt(languages.length); + print(randomNumber); + await tester.pumpWidget(createSelectLanguageScreenLight()); + await tester.pumpAndSettle(); + + final findAppNameWidget = find.byKey(Key('LanguageItem$randomNumber')); + print("Before Tap"); + await tester.tap(findAppNameWidget); + print("After Tap"); + await tester.pumpAndSettle(); + + expect( + (tester.firstWidget(findAppNameWidget) as Container).decoration, + BoxDecoration(color: const Color(0xFFC4C4C4).withOpacity(0.15)), + ); + }); + testWidgets("Testing to navigate to url page", (tester) async { + await tester.pumpWidget(createSelectLanguageScreenLight()); + await tester.pumpAndSettle(); + + final findAppNameWidget = find.byKey(const Key('NavigateToUrlPage')); + + await tester.tap(findAppNameWidget); + await tester.pumpAndSettle(const Duration(seconds: 3)); + + expect(findAppNameWidget, findsNothing); + }); + testWidgets("Testing to select and navigate button appears", + (tester) async { + await tester.pumpWidget(createSelectLanguageScreenLight()); + await tester.pumpAndSettle(); + final findAppNameWidget = find.byKey(const Key('SelectLangTextButton')); + expect(findAppNameWidget, findsOneWidget); + expect( + (tester.firstWidget(findAppNameWidget) as Text).style!.fontSize, 18); + expect( + (tester.firstWidget(findAppNameWidget) as Text).style!.color, + const Color(0xFF008A37), + ); + }); + }); + group('Select Language Screen Widget Test in dark mode', () { + testWidgets("Testing if Select Language Screen shows up", (tester) async { + await tester.pumpWidget(createSelectLanguageScreenDark()); + await tester.pumpAndSettle(); + final screenScaffoldWidget = + find.byKey(const Key('SelectLanguageScreenScaffold')); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .darkTheme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + }); + testWidgets("Testing if screen title shows up", (tester) async { + await tester.pumpWidget(createSelectLanguageScreenDark()); + await tester.pumpAndSettle(); + final findAppNameWidget = find.text('Select Language'); + expect(findAppNameWidget, findsOneWidget); + expect((tester.firstWidget(findAppNameWidget) as Text).style!.color, + TalawaTheme.darkTheme.textTheme.headline5!.color); + expect((tester.firstWidget(findAppNameWidget) as Text).style!.fontFamily, + TalawaTheme.darkTheme.textTheme.headline5!.fontFamily); + expect((tester.firstWidget(findAppNameWidget) as Text).style!.fontSize, + TalawaTheme.darkTheme.textTheme.headline5!.fontSize); + }); + // This is not needed now will be added when required + // testWidgets("Testing if search box shows up", (tester) async { + // await tester.pumpWidget(createSelectLanguageScreenDark()); + // await tester.pumpAndSettle(); + // final findAppNameWidget = find.byKey(const Key('SearchField')); + // expect(findAppNameWidget, findsOneWidget); + // }); + testWidgets("Testing if languages list shows up", (tester) async { + await tester.pumpWidget(createSelectLanguageScreenDark()); + await tester.pumpAndSettle(); + final findAppNameWidget = find.byKey(const Key('LanguagesList')); + expect(findAppNameWidget, findsOneWidget); + }); + testWidgets("Testing if all languages are shown", (tester) async { + await tester.pumpWidget(createSelectLanguageScreenDark()); + await tester.pumpAndSettle(); + final findAppNameWidget = find.byKey(const Key('LanguageItem')); + expect(findAppNameWidget, findsNWidgets(languages.length)); + }); + testWidgets("Testing if only one language is selected", (tester) async { + await tester.pumpWidget(createSelectLanguageScreenDark()); + await tester.pumpAndSettle(); + final findAppNameWidget = find.byKey(const Key('Selected')); + expect(findAppNameWidget, findsOneWidget); + }); + testWidgets("Testing unselected language items", (tester) async { + await tester.pumpWidget(createSelectLanguageScreenDark()); + await tester.pumpAndSettle(); + final findAppNameWidget = find.byKey(const Key('NotSelected')); + expect(findAppNameWidget, findsNWidgets(languages.length - 1)); + }); + testWidgets("Testing to change language items", (tester) async { + final int randomNumber = Random().nextInt(languages.length); + await tester.pumpWidget(createSelectLanguageScreenDark()); + await tester.pumpAndSettle(); + + final findAppNameWidget = find.byKey(Key('LanguageItem$randomNumber')); + await tester.tap(findAppNameWidget); + await tester.pumpAndSettle(); + + expect( + (tester.firstWidget(findAppNameWidget) as Container).decoration, + BoxDecoration(color: const Color(0xFFC4C4C4).withOpacity(0.15)), + ); + }); + testWidgets("Testing to select and navigate button appears", + (tester) async { + await tester.pumpWidget(createSelectLanguageScreenDark()); + await tester.pumpAndSettle(); + final findAppNameWidget = find.byKey(const Key('SelectLangTextButton')); + expect(findAppNameWidget, findsOneWidget); + expect( + (tester.firstWidget(findAppNameWidget) as Text).style!.fontSize, 18); + expect( + (tester.firstWidget(findAppNameWidget) as Text).style!.color, + const Color(0xFF008A37), + ); + }); + testWidgets("Testing to navigate to url page", (tester) async { + await tester.pumpWidget(createSelectLanguageScreenDark()); + await tester.pumpAndSettle(); + final findAppNameWidget = find.byKey(const Key('NavigateToUrlPage')); + await tester.tap(findAppNameWidget); + await tester.pumpAndSettle(); + expect(findAppNameWidget, findsNothing); + }); + }); +} diff --git a/test/widget_tests/set_url_page_test.dart b/test/widget_tests/set_url_page_test.dart new file mode 100644 index 000000000..33626da0a --- /dev/null +++ b/test/widget_tests/set_url_page_test.dart @@ -0,0 +1,509 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:hive/hive.dart'; +import 'package:path_provider/path_provider.dart' as path; +import 'package:provider/provider.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/router.dart' as router; +import 'package:talawa/services/graphql_config.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/views/pre_auth_screens/set_url.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; +import 'package:talawa/widgets/rich_text.dart'; + +Widget createSetUrlScreenLight({ThemeMode themeMode = ThemeMode.light}) => + MultiProvider( + providers: [ + ChangeNotifierProvider( + create: (_) => AppLanguage(isTest: true)), + ], + child: MaterialApp( + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + themeMode: themeMode, + theme: TalawaTheme.lightTheme, + home: const SetUrl( + key: Key('SetUrl'), + uri: 'null', + ), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ), + ); + +Widget createSetUrlScreenDark({ThemeMode themeMode = ThemeMode.dark}) => + MultiProvider( + providers: [ + ChangeNotifierProvider( + create: (_) => AppLanguage(isTest: true)), + ], + child: MaterialApp( + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + themeMode: themeMode, + darkTheme: TalawaTheme.darkTheme, + home: const SetUrl( + key: Key('SetUrl'), + uri: 'null', + ), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ), + ); + +Future main() async { + TestWidgetsFlutterBinding.ensureInitialized(); //initializing Hive + final Directory dir = await path.getApplicationDocumentsDirectory(); + Hive + ..init(dir.path) + ..registerAdapter(UserAdapter()) + ..registerAdapter(OrgInfoAdapter()); + //opening Hive Boxes + await Hive.openBox('currentUser'); + await Hive.openBox('currentOrg'); + await Hive.openBox('url'); + //setting up MVVM + setupLocator(); + //initializing test functions + locator().test(); + locator().test(); + + //Testing in light mode/normal mode + group('Select Language Screen Widget Test in light mode', () { + testWidgets("Testing if Select Language Screen shows up", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenLight()); + await tester.pumpAndSettle(); + + //initializing the screenScaffold Finder + final screenScaffoldWidget = + find.byKey(const Key('SetUrlScreenScaffold')); + + //finding the scaffold + expect(screenScaffoldWidget, findsOneWidget); + //testing scaffold color + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.lightTheme.scaffoldBackgroundColor, + ); + }); + testWidgets("Testing if app logo shows up", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenLight()); + await tester.pumpAndSettle(); + + //initializing the logo Finder + final logoWidget = find.byKey(const Key('LogoPainter')); + + //finding the logo + expect(logoWidget, findsOneWidget); + //testing logo size + expect( + (tester.firstWidget(logoWidget) as CustomPaint).size, + Size(SizeConfig.screenWidth! * 0.6, + (SizeConfig.screenWidth! * 0.6).toDouble())); + }); + testWidgets("Testing if custom rich text shows up", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenLight()); + await tester.pumpAndSettle(); + + //initializing the custom rich text widget Finder + final customRichTextWidget = find.byKey(const Key('UrlPageText')); + //initializing the greeting text + final greeting = [ + { + 'text': 'Join ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline6! + .copyWith(fontSize: 24, fontWeight: FontWeight.w700) + }, + { + 'text': 'and ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5 + }, + { + 'text': 'Collaborate ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline6! + .copyWith(fontSize: 24, fontWeight: FontWeight.w700) + }, + { + 'text': 'with your ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5 + }, + { + 'text': 'Organizations', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5! + .copyWith(fontSize: 24, color: const Color(0xFF4285F4)) + }, + ]; + + //finding the custom rich text widget + expect(customRichTextWidget, findsOneWidget); + + //testing greeting text + expect((tester.firstWidget(customRichTextWidget) as CustomRichText).words, + greeting); + }); + testWidgets("Testing the Url Input text form field", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenLight()); + await tester.pumpAndSettle(); + + //initializing the url input field widget Finder + final urlInputFieldWidget = find.byKey(const Key('UrlInputField')); + //initializing the text field suffix button widget Finder + final findVerifyButton = find.byKey(const Key('VerifyButton')); + //initializing the nullUrlSubmission widget Finder + final nullErrorUrlSubmission = find.text('Please verify URL first'); + //initializing the invalidUrlSubmission widget Finder + final invalidUrlSubmission = find.text('Enter a valid URL'); + + //finding the url input text field + expect(urlInputFieldWidget, findsOneWidget); + //finding the verify suffix button in text form field + expect(findVerifyButton, findsOneWidget); + + //submitting the field with null url + await tester.tap(findVerifyButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the nullErrorUrlSubmission widget appears + expect(nullErrorUrlSubmission, findsOneWidget); + + //inputting a non url text in the field + await tester.enterText(urlInputFieldWidget, 'non-url text'); + //submitting the field with non url input + await tester.tap(findVerifyButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the invalidUrlSubmission widget appears + expect(invalidUrlSubmission, findsOneWidget); + + //inputting an existing url text in the field + await tester.enterText(urlInputFieldWidget, + 'https://talawa-graphql-api.herokuapp.com/graphql'); + //submitting the field with a existing url + await tester.tap(findVerifyButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing nullErrorUrlSubmission is not found + expect(nullErrorUrlSubmission, findsNothing); + //testing invalidUrlSubmission is not found + expect(invalidUrlSubmission, findsNothing); + }); + testWidgets("Testing change language button", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenLight()); + await tester.pumpAndSettle(); + + //initializing the change language widget Finder + final changeLanguageWidget = find.byKey(const Key('ChangeLanguage')); + //initializing the screen scaffold + final screenScaffoldWidget = + find.byKey(const Key('SelectLanguageScreenScaffold')); + //initializing the center offset of changeLanguageWidget + final offset = tester.getCenter(changeLanguageWidget); + //finding the change language widget appears + expect(changeLanguageWidget, findsOneWidget); + + //taping the change language button + await tester.tapAt(offset); + await tester.pumpAndSettle(); + //testing that the scaffold is no more visible + expect(screenScaffoldWidget, findsNothing); + }); + testWidgets("Testing if login button works", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenLight()); + await tester.pumpAndSettle(); + + //initializing the login button Finder + final loginButtonWidget = find.byKey(const Key('LoginButton')); + + //finding the login button + expect(loginButtonWidget, findsOneWidget); + //testing the login button widget + expect( + (tester.firstWidget(loginButtonWidget) as RaisedRoundedButton) + .backgroundColor, + TalawaTheme.lightTheme.colorScheme.secondaryVariant, + ); + expect( + (tester.firstWidget(loginButtonWidget) as RaisedRoundedButton) + .textColor, + TalawaTheme + .lightTheme.inputDecorationTheme.focusedBorder!.borderSide.color, + ); + expect( + (tester.firstWidget(loginButtonWidget) as RaisedRoundedButton) + .buttonLabel, + 'Login', + ); + }); + testWidgets("Testing if login button works", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenLight()); + await tester.pumpAndSettle(); + + //initializing the signup button Finder + final signupButtonWidget = find.byKey(const Key('SignUpButton')); + + //finding the signup button + expect(signupButtonWidget, findsOneWidget); + //testing the signup button widget + expect( + (tester.firstWidget(signupButtonWidget) as RaisedRoundedButton) + .backgroundColor, + TalawaTheme + .lightTheme.inputDecorationTheme.focusedBorder!.borderSide.color, + ); + expect( + (tester.firstWidget(signupButtonWidget) as RaisedRoundedButton) + .textColor, + TalawaTheme.lightTheme.colorScheme.secondaryVariant, + ); + expect( + (tester.firstWidget(signupButtonWidget) as RaisedRoundedButton) + .buttonLabel, + 'Sign Up', + ); + }); + }); + + //Testing in dark mode + group('Select Language Screen Widget Test in dark mode', () { + testWidgets("Testing if Select Language Screen shows up", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenDark()); + await tester.pumpAndSettle(); + + //initializing the screenScaffold Finder + final screenScaffoldWidget = + find.byKey(const Key('SetUrlScreenScaffold')); + + //finding the scaffold + expect(screenScaffoldWidget, findsOneWidget); + //testing scaffold color + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .darkTheme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + }); + testWidgets("Testing if app logo shows up", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenDark()); + await tester.pumpAndSettle(); + + //initializing the logo Finder + final logoWidget = find.byKey(const Key('LogoPainter')); + + //finding the logo + expect(logoWidget, findsOneWidget); + //testing logo size + expect( + (tester.firstWidget(logoWidget) as CustomPaint).size, + Size(SizeConfig.screenWidth! * 0.6, + (SizeConfig.screenWidth! * 0.6).toDouble())); + }); + testWidgets("Testing if custom rich text shows up", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenDark()); + await tester.pumpAndSettle(); + + //initializing the custom rich text widget Finder + final customRichTextWidget = find.byKey(const Key('UrlPageText')); + //initializing the greeting text + final greeting = [ + { + 'text': 'Join ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline6! + .copyWith(fontSize: 24, fontWeight: FontWeight.w700) + }, + { + 'text': 'and ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5 + }, + { + 'text': 'Collaborate ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline6! + .copyWith(fontSize: 24, fontWeight: FontWeight.w700) + }, + { + 'text': 'with your ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5 + }, + { + 'text': 'Organizations', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headline5! + .copyWith(fontSize: 24, color: const Color(0xFF4285F4)) + }, + ]; + + //finding the custom rich text widget + expect(customRichTextWidget, findsOneWidget); + + //testing greeting text + expect((tester.firstWidget(customRichTextWidget) as CustomRichText).words, + greeting); + }); + testWidgets("Testing the Url Input text form field", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenDark()); + await tester.pumpAndSettle(); + + //initializing the url input field widget Finder + final urlInputFieldWidget = find.byKey(const Key('UrlInputField')); + //initializing the text field suffix button widget Finder + final findVerifyButton = find.byKey(const Key('VerifyButton')); + //initializing the nullUrlSubmission widget Finder + final nullErrorUrlSubmission = find.text('Please verify URL first'); + //initializing the invalidUrlSubmission widget Finder + final invalidUrlSubmission = find.text('Enter a valid URL'); + + //finding the url input text field + expect(urlInputFieldWidget, findsOneWidget); + //finding the verify suffix button in text form field + expect(findVerifyButton, findsOneWidget); + + //submitting the field with null url + await tester.tap(findVerifyButton); + await tester.pumpAndSettle(); + //testing the nullErrorUrlSubmission widget appears + expect(nullErrorUrlSubmission, findsOneWidget); + + //inputting a non url text in the field + await tester.enterText(urlInputFieldWidget, 'non-url text'); + //submitting the field with non url input + await tester.tap(findVerifyButton); + await tester.pumpAndSettle(); + //testing the invalidUrlSubmission widget appears + expect(invalidUrlSubmission, findsOneWidget); + + //inputting an existing url text in the field + await tester.enterText(urlInputFieldWidget, + 'https://talawa-graphql-api.herokuapp.com/graphql'); + //submitting the field with a existing url + await tester.tap(findVerifyButton); + await tester.pumpAndSettle(); + //testing nullErrorUrlSubmission is not found + expect(nullErrorUrlSubmission, findsNothing); + //testing invalidUrlSubmission is not found + expect(invalidUrlSubmission, findsNothing); + }); + testWidgets("Testing change language button", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenDark()); + await tester.pumpAndSettle(); + + //initializing the change language widget Finder + final changeLanguageWidget = find.byKey(const Key('ChangeLanguage')); + //initializing the screen scaffold + final screenScaffoldWidget = + find.byKey(const Key('SelectLanguageScreenScaffold')); + //initializing the center offset of changeLanguageWidget + final offset = tester.getCenter(changeLanguageWidget); + //finding the change language widget appears + expect(changeLanguageWidget, findsOneWidget); + + //taping the change language button + await tester.tapAt(offset); + await tester.pumpAndSettle(); + //testing that the scaffold is no more visible + expect(screenScaffoldWidget, findsNothing); + }); + testWidgets("Testing if login button works", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenDark()); + await tester.pumpAndSettle(); + + //initializing the login button Finder + final loginButtonWidget = find.byKey(const Key('LoginButton')); + + //finding the login button + expect(loginButtonWidget, findsOneWidget); + //testing the login button widget + expect( + (tester.firstWidget(loginButtonWidget) as RaisedRoundedButton) + .backgroundColor, + TalawaTheme.darkTheme.colorScheme.secondaryVariant, + ); + expect( + (tester.firstWidget(loginButtonWidget) as RaisedRoundedButton) + .textColor, + TalawaTheme + .darkTheme.inputDecorationTheme.focusedBorder!.borderSide.color, + ); + expect( + (tester.firstWidget(loginButtonWidget) as RaisedRoundedButton) + .buttonLabel, + 'Login', + ); + }); + testWidgets("Testing if login button works", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenDark()); + await tester.pumpAndSettle(); + + //initializing the signup button Finder + final signupButtonWidget = find.byKey(const Key('SignUpButton')); + + //finding the signup button + expect(signupButtonWidget, findsOneWidget); + //testing the signup button widget + expect( + (tester.firstWidget(signupButtonWidget) as RaisedRoundedButton) + .backgroundColor, + TalawaTheme + .darkTheme.inputDecorationTheme.focusedBorder!.borderSide.color, + ); + expect( + (tester.firstWidget(signupButtonWidget) as RaisedRoundedButton) + .textColor, + TalawaTheme.darkTheme.colorScheme.secondaryVariant, + ); + expect( + (tester.firstWidget(signupButtonWidget) as RaisedRoundedButton) + .buttonLabel, + 'Sign Up', + ); + }); + }); +}