From e0d8cd443013601118dd1e2a985eb88201fe47b7 Mon Sep 17 00:00:00 2001 From: Peter Harrison <16875803+palisadoes@users.noreply.github.com> Date: Sat, 4 May 2024 11:30:05 -0700 Subject: [PATCH] Merge develop into main --- .github/FUNDING.yml | 12 + .github/ISSUE_TEMPLATE/bug-report.md | 34 + .github/ISSUE_TEMPLATE/feature-request.md | 26 + .github/PR_TEMPLATE/pr-template.md | 8 + .github/dependabot.yaml | 15 + .github/pull_request_template.md | 53 + .github/workflows/README.md | 47 + .../authorized-changes-detection.yml | 31 + .github/workflows/check_ignore.py | 192 + .github/workflows/compare_translations.py | 168 + .github/workflows/countline.py | 297 ++ .github/workflows/documentationcheck.py | 186 + .github/workflows/issues.yml | 34 + .github/workflows/pull-request-target.yml | 64 + .github/workflows/pull-request.yml | 248 + .github/workflows/push.yaml | 262 + .github/workflows/stale.yml | 43 + .gitignore | 255 + .readthedocs.yml | 22 + .travis.yml | 39 + CODEOWNERS | 2 + CODE_OF_CONDUCT.md | 133 + CONTRIBUTING.md | 295 ++ DOCUMENTATION.md | 21 + INSTALLATION.md | 68 + ISSUE_GUIDELINES.md | 59 + LICENSE | 674 +++ PR_GUIDELINES.md | 36 + README.md | 50 + analysis_options.yaml | 88 + android/.gitignore | 11 + android/app/build.gradle | 70 + android/app/src/debug/AndroidManifest.xml | 9 + android/app/src/main/AndroidManifest.xml | 88 + .../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 + .../res/drawable-v21/launch_background.xml | 12 + .../app/src/main/res/drawable/chat_icon.png | Bin 0 -> 124 bytes .../app/src/main/res/drawable/event_icon.png | Bin 0 -> 144 bytes .../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/drawable/newsfeed_icon.png | Bin 0 -> 182 bytes .../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 .../app/src/main/res/values-night/styles.xml | 18 + android/app/src/main/res/values/colors.xml | 4 + android/app/src/main/res/values/styles.xml | 18 + android/app/src/main/res/xml/filepaths.xml | 4 + android/app/src/profile/AndroidManifest.xml | 7 + android/build.gradle | 17 + android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 6 + android/settings.gradle | 28 + android/settings_aar.gradle | 1 + 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/icons/Info.svg | 3 + assets/icons/angel.svg | 15 + assets/icons/angry.svg | 20 + assets/icons/happy.svg | 16 + assets/icons/laugh.svg | 21 + assets/icons/love.svg | 30 + assets/icons/tear.svg | 22 + assets/images/Group 8948.png | Bin 0 -> 2994 bytes assets/images/Organisation_Default_Image.jpeg | Bin 0 -> 18906 bytes assets/images/Vector.svg | 3 + assets/images/comment.svg | 7 + assets/images/launcher_icon.png | Bin 0 -> 6438 bytes assets/images/no_internet.png | Bin 0 -> 96758 bytes assets/images/pfp2.png | Bin 0 -> 96758 bytes assets/images/repost.svg | 19 + assets/images/talawa-logo-lite-200x200.png | Bin 0 -> 5133 bytes .../images/\360\237\246\206 icon _like_.svg" | 3 + ios/.gitignore | 33 + ios/Flutter/AppFrameworkInfo.plist | 26 + ios/Flutter/Debug.xcconfig | 2 + ios/Flutter/Release.xcconfig | 2 + ios/Podfile | 41 + ios/Podfile.lock | 115 + ios/Runner.xcodeproj/project.pbxproj | 565 +++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 91 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + ios/Runner/AppDelegate.swift | 13 + .../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 .../LaunchImage.imageset/README.md | 5 + ios/Runner/Base.lproj/LaunchScreen.storyboard | 44 + ios/Runner/Base.lproj/Main.storyboard | 26 + ios/Runner/Info.plist | 68 + ios/Runner/Runner-Bridging-Header.h | 1 + lang/de.json | 280 ++ lang/en.json | 280 ++ lang/es.json | 280 ++ lang/fr.json | 280 ++ lang/hi.json | 280 ++ lang/ja.json | 280 ++ lang/pt.json | 280 ++ lang/zh.json | 280 ++ lib/apptheme.dart | 165 + lib/constants/constants.dart | 152 + lib/constants/custom_theme.dart | 143 + lib/constants/quick_actions.dart | 32 + lib/constants/recurrence_values.dart | 53 + lib/constants/routing_constants.dart | 117 + lib/constants/timeout.dart | 11 + lib/custom_painters/language_icon.dart | 330 ++ lib/custom_painters/talawa_logo.dart | 433 ++ lib/custom_painters/telegram_logo.dart | 123 + lib/custom_painters/whatsapp_logo.dart | 433 ++ .../direct_chat_demo_data.dart | 167 + lib/demo_server_data/events_demo_data.dart | 223 + .../pinned_post_demo_data.dart | 160 + lib/demo_server_data/post_demo_data.dart | 183 + lib/enums/enums.dart | 71 + lib/locator.dart | 153 + lib/main.dart | 216 + lib/models/app_tour.dart | 187 + lib/models/asymetric_keys/asymetric_keys.dart | 15 + .../asymetric_keys/asymetric_keys.g.dart | 41 + .../chats/chat_list_tile_data_model.dart | 25 + .../chats/chat_list_tile_data_model.g.dart | 28 + lib/models/chats/chat_message.dart | 31 + lib/models/chats/chat_message.g.dart | 29 + lib/models/chats/chat_user.dart | 24 + lib/models/chats/chat_user.g.dart | 22 + lib/models/comment/comment_model.dart | 31 + lib/models/events/event_model.dart | 177 + lib/models/language/language_model.dart | 17 + lib/models/mainscreen_navigation_args.dart | 42 + lib/models/options/options.dart | 19 + lib/models/organization/org_info.dart | 133 + lib/models/organization/org_info.g.dart | 65 + lib/models/organization/org_info_address.dart | 52 + lib/models/post/post_model.dart | 168 + lib/models/user/user_info.dart | 203 + lib/models/user/user_info.g.dart | 74 + lib/plugins/fetch_plugin_list.dart | 32 + lib/plugins/talawa_plugin_provider.dart | 57 + lib/router.dart | 320 ++ lib/services/chat_service.dart | 147 + lib/services/comment_service.dart | 77 + lib/services/database_mutation_functions.dart | 405 ++ lib/services/event_service.dart | 182 + lib/services/graphql_config.dart | 82 + lib/services/image_service.dart | 80 + lib/services/navigation_service.dart | 193 + lib/services/org_service.dart | 44 + lib/services/post_service.dart | 263 + lib/services/session_manager.dart | 52 + lib/services/size_config.dart | 54 + .../multi_media_pick_service.dart | 114 + lib/services/user_config.dart | 288 ++ lib/splash_screen.dart | 314 ++ lib/utils/app_localization.dart | 102 + lib/utils/chat_queries.dart | 87 + lib/utils/comment_queries.dart | 49 + lib/utils/encryptor.dart | 162 + lib/utils/event_queries.dart | 193 + lib/utils/post_queries.dart | 225 + lib/utils/queries.dart | 592 +++ lib/utils/validators.dart | 194 + lib/view_model/access_request_view_model.dart | 66 + .../add_post_view_model.dart | 219 + .../direct_chat_view_model.dart | 121 + .../select_contact_view_model.dart | 43 + .../create_event_view_model.dart | 375 ++ .../edit_event_view_model.dart | 98 + .../event_calendar_view_model.dart | 104 + .../event_info_view_model.dart | 97 + .../explore_events_view_model.dart | 296 ++ .../organization_feed_view_model.dart | 304 ++ .../edit_profile_view_model.dart | 174 + .../profile_page_view_model.dart | 295 ++ .../app_setting_view_model.dart | 33 + lib/view_model/base_view_model.dart | 17 + lib/view_model/lang_view_model.dart | 207 + lib/view_model/main_screen_view_model.dart | 761 +++ .../login_view_model.dart | 159 + .../select_organization_view_model.dart | 269 + .../set_url_view_model.dart | 312 ++ .../signup_details_view_model.dart | 218 + .../waiting_view_model.dart | 60 + lib/view_model/theme_view_model.dart | 48 + .../comments_view_model.dart | 102 + .../custom_drawer_view_model.dart | 161 + .../event_card_view_model.dart | 38 + .../like_button_view_model.dart | 115 + .../progress_dialog_view_model.dart | 28 + .../after_auth_screens/add_post_page.dart | 248 + .../app_settings/app_settings_page.dart | 356 ++ .../chat/chat_list_screen.dart | 54 + .../chat/chat_message_screen.dart | 79 + .../after_auth_screens/chat/direct_chats.dart | 53 + .../chat/select_contact.dart | 71 + .../chat/widgets/chat_input_field.dart | 114 + .../chat/widgets/chat_message_bubble.dart | 65 + .../events/create_custom_recurring_event.dart | 232 + .../events/create_event_form.dart | 125 + .../events/create_event_page.dart | 425 ++ .../events/edit_event_page.dart | 238 + .../events/edit_events_form.dart | 135 + .../events/event_calendar.dart | 190 + .../events/event_filter_bottomsheet.dart | 150 + .../events/event_info_body.dart | 258 + .../events/event_info_page.dart | 88 + .../events/explore_event_dialogue.dart | 157 + .../events/explore_events.dart | 309 ++ .../feed/individual_post.dart | 309 ++ .../feed/organization_feed.dart | 184 + .../feed/pinned_post_page.dart | 34 + .../feed/pinned_post_screen.dart | 79 + .../access_request_screen.dart | 103 + .../join_organisation_after_auth.dart | 185 + .../after_auth_screens/org_info_screen.dart | 445 ++ .../profile/edit_profile_page.dart | 303 ++ .../profile/profile_page.dart | 475 ++ .../profile/user_event.dart | 91 + .../after_auth_screens/profile/user_feed.dart | 76 + lib/views/base_view.dart | 40 + .../demo_screens/explore_events_demo.dart | 266 + .../demo_screens/organization_feed_demo.dart | 142 + lib/views/demo_screens/profile_page_demo.dart | 251 + lib/views/main_screen.dart | 106 + .../pre_auth_screens/change_password.dart | 160 + lib/views/pre_auth_screens/login.dart | 198 + lib/views/pre_auth_screens/recover.dart | 123 + .../pre_auth_screens/select_language.dart | 160 + .../pre_auth_screens/select_organization.dart | 61 + lib/views/pre_auth_screens/set_url.dart | 237 + .../pre_auth_screens/signup_details.dart | 303 ++ .../pre_auth_screens/waiting_screen.dart | 128 + lib/widgets/add_members_bottom_sheet.dart | 126 + ...create_recurring_event_helper_widgets.dart | 321 ++ lib/widgets/custom_alert_dialog.dart | 100 + lib/widgets/custom_avatar.dart | 80 + lib/widgets/custom_drawer.dart | 188 + lib/widgets/custom_list_tile.dart | 195 + lib/widgets/custom_progress_dialog.dart | 64 + lib/widgets/custom_weekday_selector.dart | 93 + lib/widgets/date_time_picker.dart | 41 + lib/widgets/event_card.dart | 295 ++ lib/widgets/event_date_time_tile.dart | 79 + lib/widgets/event_search_delegate.dart | 101 + lib/widgets/from_palisadoes.dart | 51 + lib/widgets/invite_child.dart | 126 + lib/widgets/lang_switch.dart | 46 + lib/widgets/member_name_tile.dart | 80 + lib/widgets/multi_reaction.dart | 120 + lib/widgets/organization_list.dart | 152 + lib/widgets/organization_search_list.dart | 135 + lib/widgets/pinned_carousel_widget.dart | 185 + lib/widgets/pinned_post.dart | 141 + lib/widgets/post_container.dart | 65 + lib/widgets/post_detailed_page.dart | 126 + lib/widgets/post_list_widget.dart | 48 + lib/widgets/post_modal.dart | 131 + lib/widgets/post_widget.dart | 233 + lib/widgets/raised_round_edge_button.dart | 99 + lib/widgets/recurrence_dialog.dart | 86 + lib/widgets/rich_text.dart | 32 + lib/widgets/signup_progress_indicator.dart | 74 + lib/widgets/talawa_error_dialog.dart | 127 + lib/widgets/talawa_error_snackbar.dart | 88 + lib/widgets/theme_switch.dart | 32 + lib/widgets/video_widget.dart | 114 + pubspec.lock | 1718 +++++++ pubspec.yaml | 116 + talawa-mobile-docs/TalawaAdmin.md | 1 + talawa-mobile-docs/__404error.md | 6 + talawa-mobile-docs/apptheme/AppTheme-class.md | 347 ++ .../apptheme/AppTheme/AppTheme.md | 24 + .../AppTheme/blackPrimary-constant.md | 32 + .../AppTheme/blackSecondary-constant.md | 32 + .../AppTheme/blackTertiary-constant.md | 32 + .../apptheme/AppTheme/blue-constant.md | 32 + .../apptheme/AppTheme/bodyText1.md | 37 + .../apptheme/AppTheme/bodyText2.md | 37 + .../apptheme/AppTheme/bodyText3.md | 37 + .../apptheme/AppTheme/button.md | 37 + .../apptheme/AppTheme/green-constant.md | 32 + .../apptheme/AppTheme/grey-constant.md | 32 + .../apptheme/AppTheme/headline1.md | 37 + .../apptheme/AppTheme/headline2.md | 37 + .../apptheme/AppTheme/headline3.md | 37 + .../apptheme/AppTheme/headline4.md | 37 + .../apptheme/AppTheme/headline5.md | 37 + .../apptheme/AppTheme/headline6.md | 37 + .../apptheme/AppTheme/lightGrey-constant.md | 32 + .../apptheme/AppTheme/overline.md | 37 + .../apptheme/AppTheme/primary-constant.md | 32 + .../apptheme/AppTheme/red-constant.md | 32 + .../apptheme/AppTheme/secondary-constant.md | 32 + .../apptheme/AppTheme/shadow-constant.md | 32 + .../apptheme/AppTheme/subtitle1.md | 37 + .../apptheme/AppTheme/subtitle2.md | 37 + .../apptheme/AppTheme/tertiary-constant.md | 32 + talawa-mobile-docs/apptheme/AppTheme/title.md | 37 + .../apptheme/AppTheme/white-constant.md | 32 + .../apptheme/AppTheme/yellow-constant.md | 32 + .../apptheme/apptheme-library.md | 38 + talawa-mobile-docs/categories.json | 1 + .../constants_constants-library.md | 49 + .../constants_constants/languages.md | 85 + .../supportedCurrencies.md | 129 + .../TalawaTheme-class.md | 114 + .../TalawaTheme/TalawaTheme.md | 24 + .../TalawaTheme/darkTheme.md | 50 + .../TalawaTheme/lightTheme.md | 50 + .../constants_custom_theme-library.md | 40 + .../ShortCutMenu-class.md | 133 + .../ShortCutMenu/ShortCutMenu.md | 24 + .../ShortCutMenu/chatAction-constant.md | 36 + .../ShortCutMenu/eventAction-constant.md | 36 + .../ShortCutMenu/feedAction-constant.md | 36 + .../ShortCutMenu/quickActionsList.md | 36 + .../constants_quick_actions-library.md | 39 + .../Routes-class.md | 382 ++ .../Routes/Routes.md | 24 + .../Routes/addTask-constant.md | 33 + .../Routes/appSettings-constant.md | 33 + .../Routes/calendar-constant.md | 33 + .../Routes/chatMessageScreen-constant.md | 33 + .../Routes/createEventPage-constant.md | 33 + .../Routes/demoPageViewRoute-constant.md | 33 + .../Routes/editEventPage-constant.md | 33 + .../Routes/editProfilePage-constant.md | 33 + .../Routes/editTask-constant.md | 33 + .../Routes/eventInfoPage-constant.md | 33 + .../Routes/eventTasks-constant.md | 33 + .../Routes/exploreEventsScreen-constant.md | 33 + .../Routes/homeScreen-constant.md | 33 + .../Routes/individualPost-constant.md | 33 + .../Routes/joinOrg-constant.md | 33 + .../Routes/languageSelectionRoute-constant.md | 33 + .../Routes/loginScreen-constant.md | 33 + .../Routes/mainScreen-constant.md | 33 + .../Routes/mapScreen-constant.md | 33 + .../Routes/pinnedPostPage-constant.md | 33 + .../Routes/profilePage-constant.md | 33 + .../Routes/progressDialog-constant.md | 33 + .../Routes/recoverScreen-constant.md | 33 + .../Routes/requestAccess-constant.md | 33 + .../Routes/selectContact-constant.md | 33 + .../Routes/selectOrgScreen-constant.md | 33 + .../Routes/setUrlScreen-constant.md | 33 + .../Routes/signupDetailScreen-constant.md | 33 + .../Routes/splashScreen-constant.md | 33 + .../Routes/updateScreen-constant.md | 33 + .../Routes/userTasks-constant.md | 33 + .../Routes/waitingScreen-constant.md | 33 + .../constants_routing_constants-library.md | 38 + .../constants_timeout/TimeOuts-class.md | 121 + .../constants_timeout/TimeOuts/TimeOuts.md | 24 + .../TimeOuts/large-constant.md | 33 + .../TimeOuts/mediums-constant.md | 33 + .../TimeOuts/small-constant.md | 33 + .../constants_timeout-library.md | 38 + .../LanguageIcon-class.md | 183 + .../LanguageIcon/LanguageIcon.md | 24 + .../LanguageIcon/paint.md | 382 ++ .../LanguageIcon/shouldRepaint.md | 58 + .../custom_painters_language_icon-library.md | 40 + .../AppLogo-class.md | 183 + .../AppLogo/AppLogo.md | 24 + .../AppLogo/paint.md | 485 ++ .../AppLogo/shouldRepaint.md | 58 + .../custom_painters_talawa_logo-library.md | 40 + .../TelegramLogo-class.md | 183 + .../TelegramLogo/TelegramLogo.md | 24 + .../TelegramLogo/paint.md | 171 + .../TelegramLogo/shouldRepaint.md | 58 + .../custom_painters_telegram_logo-library.md | 40 + .../WhatsappLogo-class.md | 183 + .../WhatsappLogo/WhatsappLogo.md | 24 + .../WhatsappLogo/paint.md | 485 ++ .../WhatsappLogo/shouldRepaint.md | 58 + .../custom_painters_whatsapp_logo-library.md | 40 + ...rver_data_direct_chat_demo_data-library.md | 40 + .../directChatDemoData-constant.md | 200 + ...mo_server_data_events_demo_data-library.md | 41 + .../eventsDemoData-constant.md | 229 + ...rver_data_pinned_post_demo_data-library.md | 40 + .../pinnedPostsDemoData-constant.md | 193 + ...demo_server_data_post_demo_data-library.md | 41 + .../postsDemoData-constant.md | 214 + talawa-mobile-docs/enums_enums/CallFor.md | 149 + .../enums_enums/CallFor/CallFor.md | 24 + .../enums_enums/CallFor/values-constant.md | 28 + talawa-mobile-docs/enums_enums/ChatState.md | 150 + .../enums_enums/ChatState/ChatState.md | 24 + .../enums_enums/ChatState/values-constant.md | 28 + talawa-mobile-docs/enums_enums/MessageType.md | 159 + .../enums_enums/MessageType/MessageType.md | 24 + .../MessageType/values-constant.md | 28 + talawa-mobile-docs/enums_enums/ModalSheet.md | 140 + .../enums_enums/ModalSheet/ModalSheet.md | 24 + .../enums_enums/ModalSheet/values-constant.md | 28 + talawa-mobile-docs/enums_enums/TileType.md | 150 + .../enums_enums/TileType/TileType.md | 24 + .../enums_enums/TileType/values-constant.md | 28 + talawa-mobile-docs/enums_enums/ViewState.md | 144 + .../enums_enums/ViewState/ViewState.md | 24 + .../enums_enums/ViewState/values-constant.md | 28 + .../enums_enums/enums_enums-library.md | 76 + .../DefaultFirebaseOptions-class.md | 128 + .../DefaultFirebaseOptions.md | 24 + .../DefaultFirebaseOptions/android.md | 51 + .../DefaultFirebaseOptions/currentPlatform.md | 72 + .../DefaultFirebaseOptions/ios.md | 53 + .../firebase_options-library.md | 38 + .../generated_plugin_registrant-library.md | 40 + .../registerPlugins.md | 42 + talawa-mobile-docs/index.json | 1 + talawa-mobile-docs/index.md | 654 +++ talawa-mobile-docs/locator/connectivity.md | 36 + .../locator/databaseFunctions.md | 36 + talawa-mobile-docs/locator/graphqlConfig.md | 36 + talawa-mobile-docs/locator/imageCropper.md | 36 + talawa-mobile-docs/locator/imagePicker.md | 36 + talawa-mobile-docs/locator/locator-library.md | 141 + talawa-mobile-docs/locator/locator.md | 36 + .../locator/navigationService.md | 36 + .../locator/organizationService.md | 36 + talawa-mobile-docs/locator/queries.md | 36 + talawa-mobile-docs/locator/setupLocator.md | 104 + talawa-mobile-docs/locator/sizeConfig.md | 36 + talawa-mobile-docs/locator/userConfig.md | 36 + talawa-mobile-docs/main/DemoPageView-class.md | 190 + .../main/DemoPageView/DemoPageView.md | 29 + talawa-mobile-docs/main/DemoPageView/build.md | 82 + .../main/DemoViewModel-class.md | 191 + .../main/DemoViewModel/DemoViewModel.md | 24 + .../main/DemoViewModel/title.md | 42 + talawa-mobile-docs/main/MyApp-class.md | 189 + talawa-mobile-docs/main/MyApp/MyApp.md | 24 + talawa-mobile-docs/main/MyApp/createState.md | 49 + .../main/androidFirebaseOptions.md | 36 + talawa-mobile-docs/main/channel.md | 36 + .../main/flutterLocalNotificationsPlugin.md | 36 + talawa-mobile-docs/main/iosFirebaseOptions.md | 36 + talawa-mobile-docs/main/main-library.md | 128 + talawa-mobile-docs/main/main.md | 95 + talawa-mobile-docs/main/setUpFirebase.md | 50 + talawa-mobile-docs/main/setUpFirebaseKeys.md | 62 + .../main/setUpFirebaseMessaging.md | 79 + .../ChatListTileDataModel-class.md | 133 + .../ChatListTileDataModel.fromJson.md | 30 + .../ChatListTileDataModel.md | 29 + .../ChatListTileDataModel/id.md | 32 + .../ChatListTileDataModel/toJson.md | 34 + .../ChatListTileDataModel/users.md | 32 + ...chats_chat_list_tile_data_model-library.md | 38 + .../ChatMessage-class.md | 151 + .../ChatMessage/ChatMessage.fromJson.md | 30 + .../ChatMessage/ChatMessage.md | 34 + .../ChatMessage/id.md | 32 + .../ChatMessage/messageContent.md | 32 + .../ChatMessage/receiver.md | 32 + .../ChatMessage/sender.md | 32 + .../ChatMessage/toJson.md | 34 + .../models_chats_chat_message-library.md | 38 + .../models_chats_chat_user/ChatUser-class.md | 142 + .../ChatUser/ChatUser.fromJson.md | 30 + .../ChatUser/ChatUser.md | 29 + .../ChatUser/firstName.md | 32 + .../models_chats_chat_user/ChatUser/id.md | 32 + .../models_chats_chat_user/ChatUser/image.md | 32 + .../models_chats_chat_user/ChatUser/toJson.md | 34 + .../models_chats_chat_user-library.md | 38 + .../Comment-class.md | 141 + .../Comment/Comment.fromJson.md | 43 + .../Comment/Comment.md | 29 + .../Comment/createdAt.md | 32 + .../Comment/creator.md | 32 + .../Comment/likeCount.md | 32 + .../Comment/post.md | 32 + .../Comment/text.md | 32 + .../models_comment_comment_model-library.md | 38 + .../models_events_event_model/Event-class.md | 285 ++ .../Event/Event.fromJson.md | 72 + .../models_events_event_model/Event/Event.md | 51 + .../models_events_event_model/Event/admins.md | 32 + .../models_events_event_model/Event/allDay.md | 32 + .../Event/attendees.md | 32 + .../Event/creator.md | 32 + .../Event/description.md | 32 + .../Event/endDate.md | 32 + .../Event/endTime.md | 32 + .../models_events_event_model/Event/id.md | 32 + .../Event/isPublic.md | 32 + .../Event/isRegisterable.md | 32 + .../Event/isRegistered.md | 32 + .../Event/latitude.md | 32 + .../Event/location.md | 32 + .../Event/longitude.md | 32 + .../Event/organization.md | 32 + .../Event/recurrence.md | 32 + .../Event/recurring.md | 32 + .../Event/registrants.md | 32 + .../Event/startDate.md | 32 + .../Event/startTime.md | 32 + .../models_events_event_model/Event/title.md | 32 + .../models_events_event_model-library.md | 38 + .../Language-class.md | 128 + .../Language/Language.md | 34 + .../Language/countryCode.md | 32 + .../Language/langCode.md | 32 + .../Language/langName.md | 32 + .../Language/langSample.md | 32 + .../models_language_language_model-library.md | 38 + .../MainScreenArgs-class.md | 109 + .../MainScreenArgs/MainScreenArgs.md | 29 + .../MainScreenArgs/fromSignUp.md | 32 + .../MainScreenArgs/mainScreenIndex.md | 32 + ...dels_mainscreen_navigation_args-library.md | 38 + .../models_options_options/Options-class.md | 128 + .../models_options_options/Options/Options.md | 34 + .../models_options_options/Options/icon.md | 32 + .../Options/subtitle.md | 32 + .../models_options_options/Options/title.md | 32 + .../Options/trailingIconButton.md | 32 + .../models_options_options-library.md | 38 + .../OrgInfo-class.md | 187 + .../OrgInfo/OrgInfo.fromJson.md | 67 + .../OrgInfo/OrgInfo.md | 38 + .../OrgInfo/admins.md | 36 + .../OrgInfo/creatorInfo.md | 36 + .../OrgInfo/description.md | 36 + .../OrgInfo/fromJsonToList.md | 41 + .../OrgInfo/id.md | 36 + .../OrgInfo/image.md | 36 + .../OrgInfo/isPublic.md | 36 + .../OrgInfo/members.md | 36 + .../OrgInfo/name.md | 36 + .../OrgInfoAdapter-class.md | 130 + .../OrgInfoAdapter/OrgInfoAdapter.md | 24 + .../OrgInfoAdapter/hashCode.md | 65 + .../OrgInfoAdapter/operator_equals.md | 67 + .../OrgInfoAdapter/read.md | 52 + .../OrgInfoAdapter/typeId.md | 37 + .../OrgInfoAdapter/write.md | 56 + .../models_organization_org_info-library.md | 45 + .../models_post_post_model/Comments-class.md | 114 + .../Comments/Comments.fromJson.md | 38 + .../Comments/Comments.md | 29 + .../models_post_post_model/Comments/sId.md | 37 + .../models_post_post_model/Comments/toJson.md | 45 + .../models_post_post_model/LikedBy-class.md | 114 + .../LikedBy/LikedBy.fromJson.md | 32 + .../models_post_post_model/LikedBy/LikedBy.md | 29 + .../models_post_post_model/LikedBy/sId.md | 37 + .../models_post_post_model/LikedBy/toJson.md | 45 + .../models_post_post_model/Post-class.md | 186 + .../Post/Post.fromJson.md | 65 + .../models_post_post_model/Post/Post.md | 39 + .../models_post_post_model/Post/comments.md | 33 + .../models_post_post_model/Post/createdAt.md | 33 + .../models_post_post_model/Post/creator.md | 33 + .../Post/description.md | 33 + .../Post/getPostCreatedDuration.md | 55 + .../models_post_post_model/Post/imageUrl.md | 33 + .../models_post_post_model/Post/likedBy.md | 33 + .../Post/organization.md | 33 + .../models_post_post_model/Post/sId.md | 33 + .../models_post_post_model/Post/videoUrl.md | 33 + .../models_post_post_model-library.md | 52 + .../models_task_task_model/Task-class.md | 158 + .../Task/Task.fromJson.md | 47 + .../models_task_task_model/Task/Task.md | 37 + .../models_task_task_model/Task/createdAt.md | 32 + .../models_task_task_model/Task/creator.md | 32 + .../models_task_task_model/Task/deadline.md | 32 + .../Task/description.md | 32 + .../models_task_task_model/Task/event.md | 32 + .../models_task_task_model/Task/id.md | 32 + .../models_task_task_model/Task/title.md | 32 + .../models_task_task_model-library.md | 38 + .../models_user_user_info/User-class.md | 311 ++ .../User/User.fromJson.md | 71 + .../models_user_user_info/User/User.md | 41 + .../models_user_user_info/User/adminFor.md | 36 + .../models_user_user_info/User/authToken.md | 36 + .../User/createdOrganizations.md | 36 + .../models_user_user_info/User/email.md | 36 + .../models_user_user_info/User/firstName.md | 36 + .../models_user_user_info/User/id.md | 36 + .../models_user_user_info/User/image.md | 36 + .../User/joinedOrganizations.md | 36 + .../models_user_user_info/User/lastName.md | 36 + .../User/membershipRequests.md | 36 + .../models_user_user_info/User/print.md | 46 + .../User/refreshToken.md | 36 + .../models_user_user_info/User/update.md | 45 + .../User/updateAdminFor.md | 36 + .../User/updateCreatedOrg.md | 36 + .../User/updateJoinedOrg.md | 36 + .../User/updateMemberRequestOrg.md | 36 + .../UserAdapter-class.md | 130 + .../UserAdapter/UserAdapter.md | 24 + .../UserAdapter/hashCode.md | 65 + .../UserAdapter/operator_equals.md | 67 + .../models_user_user_info/UserAdapter/read.md | 55 + .../UserAdapter/typeId.md | 37 + .../UserAdapter/write.md | 62 + .../models_user_user_info-library.md | 45 + .../FetchPluginList-class.md | 110 + .../FetchPluginList/FetchPluginList.md | 32 + .../FetchPluginList/box.md | 33 + .../FetchPluginList/fetchList.md | 50 + .../plugins_fetch_plugin_list-library.md | 38 + .../TalawaPluginProvider-class.md | 225 + .../TalawaPluginProvider.md | 34 + .../TalawaPluginProvider/build.md | 41 + .../checkFromPluginList.md | 60 + .../TalawaPluginProvider/child.md | 33 + .../TalawaPluginProvider/pluginName.md | 33 + .../TalawaPluginProvider/visible.md | 33 + .../plugins_talawa_plugin_provider-library.md | 38 + talawa-mobile-docs/router/generateRoute.md | 294 ++ talawa-mobile-docs/router/router-library.md | 41 + talawa-mobile-docs/search.md | 6 + .../ChatService-class.md | 152 + .../ChatService/ChatService.md | 33 + .../ChatService/chatListStream.md | 35 + .../ChatService/chatMessagesStream.md | 35 + .../ChatService/chatStream.md | 32 + .../getDirectChatMessagesByChatId.md | 52 + .../ChatService/getDirectChatsByUserId.md | 58 + .../ChatService/sendMessageToDirectChat.md | 57 + .../services_chat_service-library.md | 38 + .../CommentService-class.md | 115 + .../CommentService/CommentService.md | 31 + .../CommentService/createComments.md | 53 + .../CommentService/getCommentsForPost.md | 46 + .../services_comment_service-library.md | 38 + .../DataBaseMutationFunctions-class.md | 264 + .../DataBaseMutationFunctions.md | 24 + .../DataBaseMutationFunctions/clientAuth.md | 33 + .../clientNonAuth.md | 33 + .../emailAccountPresent.md | 34 + .../encounteredExceptionOrError.md | 175 + .../DataBaseMutationFunctions/fetchOrgById.md | 60 + .../gqlAuthMutation.md | 64 + .../DataBaseMutationFunctions/gqlAuthQuery.md | 63 + .../gqlNonAuthMutation.md | 66 + .../gqlNonAuthQuery.md | 64 + .../DataBaseMutationFunctions/init.md | 43 + .../memberRequestExist.md | 34 + .../notifFeatureNotInstalled.md | 36 + .../organizationNotFound.md | 34 + .../refreshAccessToken.md | 73 + .../refreshAccessTokenExpiredException.md | 36 + .../userNotAuthenticated.md | 34 + .../DataBaseMutationFunctions/userNotFound.md | 33 + .../wrongCredentials.md | 34 + ...ces_database_mutation_functions-library.md | 38 + .../EventService-class.md | 174 + .../EventService/EventService.md | 34 + .../EventService/deleteEvent.md | 55 + .../EventService/dispose.md | 41 + .../EventService/editEvent.md | 68 + .../EventService/eventStream.md | 42 + .../EventService/fetchRegistrantsByEvent.md | 49 + .../EventService/getEvents.md | 62 + .../EventService/registerForAnEvent.md | 53 + .../EventService/setOrgStreamSubscription.md | 44 + .../services_event_service-library.md | 38 + .../GraphqlConfig-class.md | 207 + .../GraphqlConfig/GraphqlConfig.md | 24 + .../GraphqlConfig/authClient.md | 41 + .../GraphqlConfig/clientToQuery.md | 42 + .../GraphqlConfig/displayImgRoute.md | 32 + .../GraphqlConfig/getOrgUrl.md | 44 + .../GraphqlConfig/getToken.md | 40 + .../GraphqlConfig/httpLink.md | 32 + .../GraphqlConfig/imageUrlKey-constant.md | 32 + .../GraphqlConfig/orgURI.md | 32 + .../GraphqlConfig/test.md | 39 + .../GraphqlConfig/token.md | 32 + .../GraphqlConfig/urlKey-constant.md | 32 + .../GraphqlConfig/webSocketLink.md | 32 + .../MockHttpClient-class.md | 203 + .../MockHttpClient/MockHttpClient.md | 24 + .../MockHttpClient/send.md | 47 + .../services_graphql_config-library.md | 48 + .../NavigationService-class.md | 203 + .../NavigationService/NavigationService.md | 24 + .../NavigationService/fromInviteLink.md | 40 + .../NavigationService/navigatorKey.md | 32 + .../NavigationService/pop.md | 37 + .../NavigationService/popAndPushScreen.md | 43 + .../NavigationService/pushDialog.md | 44 + .../pushReplacementScreen.md | 43 + .../NavigationService/pushScreen.md | 43 + .../NavigationService/removeAllAndPush.md | 51 + .../NavigationService/showSnackBar.md | 46 + .../showTalawaErrorDialog.md | 46 + .../showTalawaErrorSnackBar.md | 49 + .../services_navigation_service-library.md | 38 + .../OrganizationService-class.md | 105 + .../OrganizationService.md | 31 + .../OrganizationService/getOrgMembersList.md | 54 + .../services_org_service-library.md | 38 + .../PostService-class.md | 162 + .../PostService/PostService.md | 36 + .../PostService/addCommentLocally.md | 41 + .../PostService/addLike.md | 48 + .../PostService/getPosts.md | 55 + .../PostService/postStream.md | 35 + .../PostService/removeLike.md | 46 + .../PostService/setOrgStreamSubscription.md | 43 + .../PostService/updatedPostStream.md | 35 + .../services_post_service-library.md | 38 + .../services_size_config/SizeConfig-class.md | 175 + .../SizeConfig/SizeConfig.md | 24 + .../SizeConfig/blockSizeHorizontal.md | 32 + .../SizeConfig/blockSizeVertical.md | 32 + .../services_size_config/SizeConfig/init.md | 49 + .../SizeConfig/paddingTop.md | 32 + .../SizeConfig/safeBlockHorizontal.md | 32 + .../SizeConfig/safeBlockVertical.md | 32 + .../SizeConfig/screenHeight.md | 32 + .../SizeConfig/screenWidth.md | 32 + .../services_size_config/SizeConfig/test.md | 48 + .../services_size_config-library.md | 38 + .../TaskService-class.md | 163 + .../TaskService/TaskService.md | 24 + .../TaskService/callbackNotifyListeners.md | 32 + .../TaskService/createTask.md | 66 + .../TaskService/deleteTask.md | 48 + .../TaskService/editTask.md | 72 + .../TaskService/getTasksByUser.md | 48 + .../TaskService/getTasksForEvent.md | 52 + .../TaskService/tasks.md | 35 + .../services_task_service-library.md | 38 + .../MultiMediaPickerService-class.md | 125 + .../MultiMediaPickerService.md | 32 + .../MultiMediaPickerService/cropImage.md | 77 + .../MultiMediaPickerService/fileStream.md | 42 + .../getPhotoFromGallery.md | 78 + ...ervice_multi_media_pick_service-library.md | 38 + .../services_user_config/UserConfig-class.md | 237 + .../UserConfig/UserConfig.md | 24 + .../UserConfig/currentOrg.md | 53 + .../UserConfig/currentOrgInfoController.md | 36 + .../UserConfig/currentOrgInfoStream.md | 35 + .../UserConfig/currentOrgName.md | 35 + .../UserConfig/currentUser.md | 55 + .../UserConfig/initialiseStream.md | 37 + .../UserConfig/saveCurrentOrgInHive.md | 43 + .../UserConfig/saveUserInHive.md | 41 + .../UserConfig/updateAccessToken.md | 47 + .../UserConfig/updateUser.md | 50 + .../UserConfig/updateUserAdminOrg.md | 42 + .../UserConfig/updateUserCreatedOrg.md | 42 + .../UserConfig/updateUserJoinedOrg.md | 42 + .../UserConfig/updateUserMemberRequestOrg.md | 42 + .../UserConfig/userLoggedIn.md | 78 + .../services_user_config-library.md | 38 + .../splash_screen/SplashScreen-class.md | 199 + .../SplashScreen/SplashScreen.md | 30 + .../splash_screen/SplashScreen/createState.md | 49 + .../SplashScreen/mainScreenIndex.md | 32 + .../splash_screen/splash_screen-library.md | 39 + .../AppLocalizations-class.md | 169 + .../AppLocalizations/AppLocalizations.md | 32 + .../AppLocalizations/delegate-constant.md | 33 + .../AppLocalizations/isTest.md | 32 + .../AppLocalizations/load.md | 46 + .../AppLocalizations/loadTest.md | 36 + .../AppLocalizations/locale.md | 32 + .../AppLocalizations/of.md | 36 + .../AppLocalizations/strictTranslate.md | 44 + .../AppLocalizations/translate.md | 42 + .../AppLocalizationsDelegate-class.md | 150 + .../AppLocalizationsDelegate.md | 31 + .../AppLocalizationsDelegate/isSupported.md | 43 + .../AppLocalizationsDelegate/isTest.md | 32 + .../AppLocalizationsDelegate/load.md | 52 + .../AppLocalizationsDelegate/shouldReload.md | 41 + .../utils_app_localization-library.md | 46 + .../utils_chat_queries/ChatQueries-class.md | 128 + .../ChatQueries/ChatQueries.md | 24 + .../fetchDirectChatMessagesByChatId.md | 53 + .../ChatQueries/fetchDirectChatsByUserId.md | 47 + .../messageSentToDirectChatsubscription.md | 52 + .../ChatQueries/sendMessageToDirectChat.md | 54 + .../utils_chat_queries-library.md | 38 + .../CommentQueries-class.md | 110 + .../CommentQueries/CommentQueries.md | 24 + .../CommentQueries/createComment.md | 46 + .../CommentQueries/getPostsComments.md | 48 + .../utils_comment_queries-library.md | 38 + .../utils_event_queries/EventQueries-class.md | 146 + .../EventQueries/EventQueries.md | 24 + .../EventQueries/addEvent.md | 71 + .../EventQueries/deleteEvent.md | 44 + .../EventQueries/fetchOrgEvents.md | 72 + .../EventQueries/registerForEvent.md | 45 + .../EventQueries/registrantsByEvent.md | 45 + .../EventQueries/updateEvent.md | 67 + .../utils_event_queries-library.md | 38 + .../utils_post_queries/PostQueries-class.md | 128 + .../PostQueries/PostQueries.md | 24 + .../utils_post_queries/PostQueries/addLike.md | 50 + .../PostQueries/getPostsById.md | 74 + .../PostQueries/removeLike.md | 53 + .../PostQueries/uploadPost.md | 63 + .../utils_post_queries-library.md | 38 + .../utils_queries/Queries-class.md | 245 + .../utils_queries/Queries/Queries.md | 24 + .../utils_queries/Queries/createDonation.md | 61 + .../utils_queries/Queries/fetchJoinInOrg.md | 55 + .../Queries/fetchJoinInOrgByName.md | 64 + .../utils_queries/Queries/fetchOrgById.md | 50 + .../Queries/fetchOrgDetailsById.md | 60 + .../utils_queries/Queries/fetchUserInfo.md | 86 + .../utils_queries/Queries/getPluginsList.md | 48 + .../utils_queries/Queries/joinOrgById.md | 55 + .../utils_queries/Queries/loginUser.md | 110 + .../utils_queries/Queries/logout.md | 40 + .../utils_queries/Queries/newUserLanguage.md | 40 + .../utils_queries/Queries/refreshToken.md | 43 + .../utils_queries/Queries/registerUser.md | 100 + .../utils_queries/Queries/saveFcmToken.md | 40 + .../Queries/sendMembershipRequest.md | 54 + .../utils_queries/Queries/updateLanguage.md | 44 + .../utils_queries/Queries/userLanguage.md | 40 + .../utils_queries/utils_queries-library.md | 38 + .../utils_task_queries/TaskQueries-class.md | 139 + .../TaskQueries/TaskQueries.md | 24 + .../utils_task_queries/TaskQueries/addTask.md | 61 + .../TaskQueries/deleteTask.md | 40 + .../TaskQueries/editTask.md | 59 + .../TaskQueries/eventTasks.md | 52 + .../TaskQueries/userTasks.md | 52 + .../utils_task_queries-library.md | 38 + .../utils_validators/Validator-class.md | 167 + .../utils_validators/Validator/Validator.md | 24 + .../Validator/validateEmail.md | 48 + .../Validator/validateEventForm.md | 45 + .../Validator/validateFirstName.md | 45 + .../Validator/validateLastName.md | 45 + .../Validator/validatePassword.md | 57 + .../Validator/validatePasswordConfirm.md | 42 + .../utils_validators/Validator/validateURL.md | 45 + .../Validator/validateUrlExistence.md | 42 + .../utils_validators-library.md | 39 + .../AccessScreenViewModel-class.md | 233 + .../AccessScreenViewModel.md | 24 + .../AccessScreenViewModel/initialise.md | 36 + .../optionalMessageController.md | 32 + .../AccessScreenViewModel/orgId.md | 32 + .../AccessScreenViewModel/organizations.md | 32 + .../selectedOrganization.md | 32 + .../sendMembershipRequest.md | 58 + ...model_access_request_view_model-library.md | 38 + .../AddPostViewModel-class.md | 262 + .../AddPostViewModel/AddPostViewModel.md | 24 + .../AddPostViewModel/controller.md | 42 + .../AddPostViewModel/getImageFromGallery.md | 55 + .../AddPostViewModel/imageFile.md | 42 + .../AddPostViewModel/initialise.md | 46 + .../AddPostViewModel/orgName.md | 42 + .../AddPostViewModel/removeImage.md | 42 + .../AddPostViewModel/titleController.md | 42 + .../AddPostViewModel/uploadPost.md | 68 + .../AddPostViewModel/userName.md | 42 + ...view_models_add_post_view_model-library.md | 38 + .../DirectChatViewModel-class.md | 276 ++ .../DirectChatViewModel.md | 24 + .../DirectChatViewModel/chatMessagesByUser.md | 35 + .../DirectChatViewModel/chatName.md | 43 + .../DirectChatViewModel/chatState.md | 32 + .../DirectChatViewModel/chats.md | 35 + .../DirectChatViewModel/dispose.md | 47 + .../DirectChatViewModel/getChatMessages.md | 54 + .../DirectChatViewModel/initialise.md | 47 + .../DirectChatViewModel/listKey.md | 32 + .../DirectChatViewModel/name.md | 32 + .../DirectChatViewModel/refreshChats.md | 40 + .../sendMessageToDirectChat.md | 50 + ...w_models_direct_chat_view_model-library.md | 38 + .../SelectContactViewModel-class.md | 211 + .../SelectContactViewModel.md | 24 + .../getCurrentOrgUsersList.md | 42 + .../SelectContactViewModel/initialise.md | 36 + .../SelectContactViewModel/orgMembersList.md | 32 + ...odels_select_contact_view_model-library.md | 38 + .../CreateEventViewModel-class.md | 432 ++ .../CreateEventViewModel.md | 24 + .../CreateEventViewModel/buildUserList.md | 50 + .../CreateEventViewModel/createEvent.md | 106 + .../CreateEventViewModel/descriptionFocus.md | 33 + .../eventDescriptionTextController.md | 34 + .../CreateEventViewModel/eventEndDate.md | 33 + .../CreateEventViewModel/eventEndTime.md | 33 + .../eventLocationTextController.md | 33 + .../CreateEventViewModel/eventStartDate.md | 33 + .../CreateEventViewModel/eventStartTime.md | 33 + .../eventTitleTextController.md | 33 + .../CreateEventViewModel/formKey.md | 33 + .../getCurrentOrgUsersList.md | 54 + .../getImageFromGallery.md | 51 + .../CreateEventViewModel/imageFile.md | 42 + .../CreateEventViewModel/initialize.md | 45 + .../CreateEventViewModel/isPublicSwitch.md | 33 + .../isRegisterableSwitch.md | 33 + .../CreateEventViewModel/latitude.md | 33 + .../CreateEventViewModel/locationFocus.md | 33 + .../CreateEventViewModel/longitude.md | 33 + .../CreateEventViewModel/memberCheckedMap.md | 43 + .../CreateEventViewModel/orgMembersList.md | 33 + .../CreateEventViewModel/removeImage.md | 42 + .../removeUserFromList.md | 46 + .../CreateEventViewModel/selectedMembers.md | 42 + .../CreateEventViewModel/titleFocus.md | 33 + .../CreateEventViewModel/validate.md | 33 + ..._models_create_event_view_model-library.md | 38 + .../EditEventViewModel-class.md | 330 ++ .../EditEventViewModel/EditEventViewModel.md | 24 + .../EditEventViewModel/descriptionFocus.md | 32 + .../eventDescriptionTextController.md | 33 + .../EditEventViewModel/eventEndDate.md | 32 + .../EditEventViewModel/eventEndTime.md | 32 + .../eventLocationTextController.md | 32 + .../EditEventViewModel/eventStartDate.md | 32 + .../EditEventViewModel/eventStartTime.md | 32 + .../eventTitleTextController.md | 32 + .../EditEventViewModel/formKey.md | 32 + .../EditEventViewModel/initialize.md | 37 + .../EditEventViewModel/isPublicSwitch.md | 32 + .../isRegisterableSwitch.md | 32 + .../EditEventViewModel/locationFocus.md | 32 + .../EditEventViewModel/titleFocus.md | 32 + .../EditEventViewModel/updateEvent.md | 73 + .../EditEventViewModel/validate.md | 32 + ...ew_models_edit_event_view_model-library.md | 39 + .../EventInfoViewModel-class.md | 248 + .../EventInfoViewModel/EventInfoViewModel.md | 24 + .../EventInfoViewModel/event.md | 32 + .../exploreEventsInstance.md | 32 + .../EventInfoViewModel/fabTitle.md | 32 + .../EventInfoViewModel/getFabTitle.md | 43 + .../EventInfoViewModel/initialize.md | 54 + .../EventInfoViewModel/registerForEvent.md | 58 + .../EventInfoViewModel/registrants.md | 32 + ...ew_models_event_info_view_model-library.md | 38 + .../ExploreEventsViewModel-class.md | 281 ++ .../ExploreEventsViewModel.md | 24 + .../checkIfExistsAndAddNewEvent.md | 47 + .../choseValueFromDropdown.md | 117 + .../ExploreEventsViewModel/chosenValue.md | 35 + .../ExploreEventsViewModel/deleteEvent.md | 64 + .../ExploreEventsViewModel/dispose.md | 47 + .../emptyListMessage.md | 35 + .../ExploreEventsViewModel/eventService.md | 35 + .../ExploreEventsViewModel/events.md | 35 + .../ExploreEventsViewModel/fetchNewEvents.md | 41 + .../ExploreEventsViewModel/initialise.md | 45 + .../ExploreEventsViewModel/refreshEvents.md | 42 + ...odels_explore_events_view_model-library.md | 38 + .../OrganizationFeedViewModel-class.md | 306 ++ .../OrganizationFeedViewModel.md | 24 + .../OrganizationFeedViewModel/addNewPost.md | 42 + .../buildNewPosts.md | 42 + .../currentOrgName.md | 35 + .../OrganizationFeedViewModel/dispose.md | 49 + .../fetchNewPosts.md | 37 + .../OrganizationFeedViewModel/initialise.md | 58 + .../initializeWithDemoData.md | 46 + .../OrganizationFeedViewModel/istest.md | 32 + .../navigateToIndividualPage.md | 38 + .../navigateToPinnedPostPage.md | 41 + .../OrganizationFeedViewModel/pinnedPosts.md | 41 + .../OrganizationFeedViewModel/posts.md | 41 + .../setCurrentOrganizationName.md | 48 + .../OrganizationFeedViewModel/updatedPost.md | 47 + ...ls_organization_feed_view_model-library.md | 38 + .../EditProfilePageViewModel-class.md | 275 ++ .../EditProfilePageViewModel.md | 24 + .../databaseService.md | 32 + .../firstNameFocus.md | 32 + .../firstNameTextController.md | 32 + .../getImageFromGallery.md | 47 + .../EditProfilePageViewModel/imageFile.md | 32 + .../EditProfilePageViewModel/initialize.md | 37 + .../EditProfilePageViewModel/lastNameFocus.md | 32 + .../lastNameTextController.md | 32 + .../EditProfilePageViewModel/removeImage.md | 38 + .../EditProfilePageViewModel/user.md | 32 + ..._models_edit_profile_view_model-library.md | 38 + .../ProfilePageViewModel-class.md | 385 ++ .../ProfilePageViewModel.md | 24 + .../ProfilePageViewModel/attachListener.md | 50 + .../ProfilePageViewModel/bottomSheetHeight.md | 32 + .../ProfilePageViewModel/changeCurrency.md | 46 + .../ProfilePageViewModel/currentOrg.md | 32 + .../ProfilePageViewModel/currentUser.md | 32 + .../ProfilePageViewModel/denomination.md | 32 + .../ProfilePageViewModel/dominationButton.md | 68 + .../ProfilePageViewModel/donationAmount.md | 32 + .../ProfilePageViewModel/donationCurrency.md | 32 + .../donationCurrencySymbol.md | 32 + .../ProfilePageViewModel/donationField.md | 32 + .../ProfilePageViewModel/iconButton.md | 52 + .../ProfilePageViewModel/initialize.md | 39 + .../ProfilePageViewModel/invite.md | 134 + .../ProfilePageViewModel/logout.md | 86 + .../ProfilePageViewModel/organisation.md | 32 + .../ProfilePageViewModel/popBottomSheet.md | 36 + .../ProfilePageViewModel/scaffoldKey.md | 32 + .../ProfilePageViewModel/showSnackBar.md | 36 + .../ProfilePageViewModel/updateSheetHeight.md | 37 + .../ProfilePageViewModel/url.md | 32 + .../ProfilePageViewModel/user.md | 32 + ..._models_profile_page_view_model-library.md | 39 + .../CreateTaskViewModel-class.md | 252 + .../CreateTaskViewModel.md | 24 + .../CreateTaskViewModel/createTask.md | 54 + .../CreateTaskViewModel/dispose.md | 47 + .../CreateTaskViewModel/editTask.md | 54 + .../CreateTaskViewModel/fillTask.md | 47 + .../taskDescriptionTextController.md | 32 + .../CreateTaskViewModel/taskEndDate.md | 32 + .../CreateTaskViewModel/taskEndTime.md | 32 + .../taskTitleTextController.md | 32 + ...w_models_create_task_view_model-library.md | 39 + .../ExploreTasksViewModel-class.md | 226 + .../ExploreTasksViewModel.md | 31 + .../ExploreTasksViewModel/deleteTask.md | 44 + .../ExploreTasksViewModel/fetchTasks.md | 44 + .../ExploreTasksViewModel/fetchTasksByUser.md | 40 + .../ExploreTasksViewModel/tasks.md | 35 + ...models_explore_tasks_view_model-library.md | 39 + .../BaseModel-class.md | 206 + .../BaseModel/BaseModel.md | 24 + .../BaseModel/isBusy.md | 35 + .../BaseModel/setState.md | 37 + .../BaseModel/state.md | 35 + .../view_model_base_view_model-library.md | 38 + .../AppLanguage-class.md | 292 ++ .../AppLanguage/AppLanguage.md | 29 + .../AppLanguage/appLanguageQuery.md | 42 + .../AppLanguage/appLocal.md | 35 + .../AppLanguage/changeLanguage.md | 94 + .../AppLanguage/databaseFunctions.md | 32 + .../AppLanguage/dbLanguageUpdate.md | 43 + .../AppLanguage/fetchLocale.md | 41 + .../AppLanguage/initialize.md | 37 + .../AppLanguage/isTest.md | 32 + .../AppLanguage/navigationService.md | 32 + .../AppLanguage/selectLanguagePress.md | 44 + .../AppLanguage/userLanguageQuery.md | 46 + .../view_model_lang_view_model-library.md | 39 + .../MainScreenViewModel-class.md | 616 +++ .../MainScreenViewModel.md | 24 + .../MainScreenViewModel/context.md | 33 + .../MainScreenViewModel/currentPageIndex.md | 33 + .../MainScreenViewModel/fetchAndAddPlugins.md | 142 + .../MainScreenViewModel/focusTarget.md | 124 + .../MainScreenViewModel/initialise.md | 85 + .../MainScreenViewModel/keyBNChat.md | 33 + .../MainScreenViewModel/keyBNEvents.md | 33 + .../MainScreenViewModel/keyBNHome.md | 33 + .../MainScreenViewModel/keyBNPost.md | 33 + .../MainScreenViewModel/keyBNProfile.md | 33 + .../MainScreenViewModel/keyDrawerCurOrg.md | 34 + .../MainScreenViewModel/keyDrawerJoinOrg.md | 34 + .../keyDrawerLeaveCurrentOrg.md | 34 + .../keyDrawerSwitchableOrg.md | 34 + .../MainScreenViewModel/keySEAdd.md | 33 + .../MainScreenViewModel/keySECard.md | 33 + .../MainScreenViewModel/keySECategoryMenu.md | 34 + .../MainScreenViewModel/keySEDateFilter.md | 34 + .../MainScreenViewModel/keySHMenuIcon.md | 33 + .../MainScreenViewModel/keySHOrgName.md | 33 + .../MainScreenViewModel/keySHPinnedPost.md | 34 + .../MainScreenViewModel/keySHPost.md | 33 + .../MainScreenViewModel/keySPAppSetting.md | 34 + .../MainScreenViewModel/keySPDonateUs.md | 34 + .../MainScreenViewModel/keySPEditProfile.md | 33 + .../MainScreenViewModel/keySPHelp.md | 33 + .../MainScreenViewModel/keySPInvite.md | 33 + .../MainScreenViewModel/keySPLogout.md | 33 + .../MainScreenViewModel/keySPPalisadoes.md | 34 + .../MainScreenViewModel/navBarItems.md | 33 + .../MainScreenViewModel/onTabTapped.md | 44 + .../MainScreenViewModel/pages.md | 34 + .../MainScreenViewModel/pluginList.md | 33 + .../pluginPrototypeData.md | 37 + .../MainScreenViewModel/scaffoldKey.md | 34 + .../MainScreenViewModel/showAppTour.md | 33 + .../MainScreenViewModel/showHome.md | 49 + .../MainScreenViewModel/showTutorial.md | 69 + .../MainScreenViewModel/targets.md | 33 + .../MainScreenViewModel/tourAddPost.md | 59 + .../MainScreenViewModel/tourChat.md | 59 + .../MainScreenViewModel/tourComplete.md | 33 + .../MainScreenViewModel/tourEventTargets.md | 88 + .../MainScreenViewModel/tourHomeTargets.md | 122 + .../MainScreenViewModel/tourProfile.md | 96 + .../MainScreenViewModel/tourSkipped.md | 33 + .../MainScreenViewModel/tutorialCoachMark.md | 33 + ...ew_model_main_screen_view_model-library.md | 38 + .../LoginViewModel-class.md | 275 ++ .../LoginViewModel/LoginViewModel.md | 24 + .../LoginViewModel/email.md | 32 + .../LoginViewModel/emailFocus.md | 32 + .../LoginViewModel/formKey.md | 32 + .../LoginViewModel/greeting.md | 32 + .../LoginViewModel/hidePassword.md | 32 + .../LoginViewModel/initialize.md | 64 + .../LoginViewModel/login.md | 107 + .../LoginViewModel/password.md | 32 + .../LoginViewModel/passwordFocus.md | 32 + .../LoginViewModel/validate.md | 32 + ...th_view_models_login_view_model-library.md | 39 + .../SelectOrganizationViewModel-class.md | 340 ++ .../SelectOrganizationViewModel.md | 24 + .../allOrgController.md | 32 + .../SelectOrganizationViewModel/controller.md | 32 + .../fetchMoreHelper.md | 52 + .../SelectOrganizationViewModel/initialise.md | 52 + .../onTapContinue.md | 48 + .../SelectOrganizationViewModel/onTapJoin.md | 88 + .../SelectOrganizationViewModel/orgId.md | 32 + .../organizations.md | 32 + .../SelectOrganizationViewModel/qrKey.md | 32 + .../SelectOrganizationViewModel/result.md | 32 + .../searchActive.md | 40 + .../searchController.md | 32 + .../searchFocus.md | 32 + .../SelectOrganizationViewModel/searching.md | 32 + .../SelectOrganizationViewModel/selectOrg.md | 91 + .../selectedOrganization.md | 32 + .../showSearchOrgList.md | 32 + ..._select_organization_view_model-library.md | 39 + .../SetUrlViewModel-class.md | 319 ++ .../SetUrlViewModel/SetUrlViewModel.md | 24 + .../SetUrlViewModel/checkURLandNavigate.md | 72 + .../SetUrlViewModel/checkURLandShowPopUp.md | 73 + .../SetUrlViewModel/formKey.md | 33 + .../SetUrlViewModel/greeting.md | 33 + .../SetUrlViewModel/imageUrlKey-constant.md | 33 + .../SetUrlViewModel/initialise.md | 89 + .../SetUrlViewModel/orgId.md | 33 + .../SetUrlViewModel/qrKey.md | 33 + .../SetUrlViewModel/result.md | 33 + .../SetUrlViewModel/scanQR.md | 93 + .../SetUrlViewModel/url.md | 33 + .../SetUrlViewModel/urlFocus.md | 33 + .../SetUrlViewModel/urlKey-constant.md | 33 + .../SetUrlViewModel/validate.md | 33 + ..._view_models_set_url_view_model-library.md | 38 + .../SignupDetailsViewModel-class.md | 303 ++ .../SignupDetailsViewModel.md | 24 + .../SignupDetailsViewModel/confirmFocus.md | 32 + .../SignupDetailsViewModel/confirmPassword.md | 32 + .../SignupDetailsViewModel/email.md | 32 + .../SignupDetailsViewModel/firstName.md | 32 + .../SignupDetailsViewModel/formKey.md | 32 + .../SignupDetailsViewModel/greeting.md | 32 + .../SignupDetailsViewModel/hidePassword.md | 32 + .../SignupDetailsViewModel/initialise.md | 64 + .../SignupDetailsViewModel/lastName.md | 32 + .../SignupDetailsViewModel/password.md | 32 + .../selectedOrganization.md | 32 + .../SignupDetailsViewModel/signUp.md | 128 + .../SignupDetailsViewModel/validate.md | 32 + ...odels_signup_details_view_model-library.md | 39 + .../WaitingViewModel-class.md | 239 + .../WaitingViewModel/WaitingViewModel.md | 24 + .../WaitingViewModel/currentUser.md | 32 + .../WaitingViewModel/greeting.md | 32 + .../WaitingViewModel/initialise.md | 53 + .../WaitingViewModel/joinOrg.md | 36 + .../WaitingViewModel/logout.md | 45 + .../WaitingViewModel/pendingRequestOrg.md | 32 + ..._view_models_waiting_view_model-library.md | 39 + .../AppTheme-class.md | 220 + .../AppTheme/AppTheme.md | 24 + .../AppTheme/initialize.md | 37 + .../AppTheme/isdarkTheme.md | 35 + .../AppTheme/key.md | 32 + .../AppTheme/switchTheme.md | 43 + .../view_model_theme_view_model-library.md | 38 + .../CommentsViewModel-class.md | 242 + .../CommentsViewModel/CommentsViewModel.md | 24 + .../CommentsViewModel/addCommentLocally.md | 44 + .../CommentsViewModel/commentList.md | 35 + .../CommentsViewModel/createComment.md | 44 + .../CommentsViewModel/getComments.md | 45 + .../CommentsViewModel/initialise.md | 42 + .../CommentsViewModel/postId.md | 35 + ...view_models_comments_view_model-library.md | 39 + .../CustomDrawerViewModel-class.md | 269 + .../CustomDrawerViewModel.md | 24 + .../CustomDrawerViewModel/controller.md | 32 + .../CustomDrawerViewModel/dispose.md | 47 + .../CustomDrawerViewModel/initialize.md | 44 + .../isPresentinSwitchableOrg.md | 47 + .../CustomDrawerViewModel/notifyListeners.md | 51 + .../CustomDrawerViewModel/selectedOrg.md | 35 + .../setSelectedOrganizationName.md | 47 + .../CustomDrawerViewModel/switchAbleOrg.md | 54 + .../CustomDrawerViewModel/switchOrg.md | 53 + .../CustomDrawerViewModel/targets.md | 32 + .../tutorialCoachMark.md | 32 + ...models_custom_drawer_view_model-library.md | 39 + ...ew_models_event_card_view_model-library.md | 29 + .../LikeButtonViewModel-class.md | 260 + .../LikeButtonViewModel.md | 24 + .../checkAndSetTheIsLiked.md | 41 + .../LikeButtonViewModel/dispose.md | 46 + .../LikeButtonViewModel/initialize.md | 42 + .../LikeButtonViewModel/isLiked.md | 35 + .../LikeButtonViewModel/likedBy.md | 35 + .../LikeButtonViewModel/likesCount.md | 35 + .../LikeButtonViewModel/setIsLiked.md | 38 + .../LikeButtonViewModel/toggleIsLiked.md | 42 + .../LikeButtonViewModel/updatePost.md | 42 + ...w_models_like_button_view_model-library.md | 39 + .../ProgressDialogViewModel-class.md | 208 + .../ProgressDialogViewModel.md | 24 + .../connectivityPresent.md | 32 + .../connectivityResult.md | 32 + .../ProgressDialogViewModel/initialise.md | 45 + ...dels_progress_dialog_view_model-library.md | 39 + .../AddPost-class.md | 198 + .../AddPost/AddPost.md | 29 + .../AddPost/build.md | 229 + .../AddPost/drawerKey.md | 33 + .../model.md | 36 + ...fter_auth_screens_add_post_page-library.md | 49 + .../AppSettingsPage-class.md | 189 + .../AppSettingsPage/AppSettingsPage.md | 29 + .../AppSettingsPage/createState.md | 49 + ..._app_settings_app_settings_page-library.md | 38 + .../ChatPage-class.md | 190 + .../ChatPage/ChatPage.md | 29 + .../ChatPage/build.md | 114 + ...h_screens_chat_chat_list_screen-library.md | 39 + .../ChatMessageScreen-class.md | 207 + .../ChatMessageScreen/ChatMessageScreen.md | 30 + .../ChatMessageScreen/build.md | 122 + .../ChatMessageScreen/chatId.md | 32 + .../ChatMessageScreen/model.md | 32 + ...creens_chat_chat_message_screen-library.md | 38 + .../ChatTile-class.md | 207 + .../ChatTile/ChatTile.md | 30 + .../ChatTile/build.md | 78 + .../ChatTile/chat.md | 32 + .../ChatTile/model.md | 32 + .../DirectChats-class.md | 190 + .../DirectChats/DirectChats.md | 29 + .../DirectChats/build.md | 85 + ..._auth_screens_chat_direct_chats-library.md | 46 + .../EventChats-class.md | 190 + .../EventChats/EventChats.md | 29 + .../EventChats/build.md | 73 + ...r_auth_screens_chat_event_chats-library.md | 39 + .../SelectContact-class.md | 189 + .../SelectContact/SelectContact.md | 29 + .../SelectContact/createState.md | 49 + ...uth_screens_chat_select_contact-library.md | 38 + .../ChatInputField-class.md | 207 + .../ChatInputField/ChatInputField.md | 33 + .../ChatInputField/chatId.md | 33 + .../ChatInputField/createState.md | 49 + .../ChatInputField/model.md | 33 + ...s_chat_widgets_chat_input_field-library.md | 38 + .../Message-class.md | 189 + .../Message/Message.md | 29 + .../Message/build.md | 117 + ...hat_widgets_chat_message_bubble-library.md | 38 + .../CreateEventForm-class.md | 199 + .../CreateEventForm/CreateEventForm.md | 29 + .../CreateEventForm/build.md | 194 + .../CreateEventForm/model.md | 32 + ...creens_events_create_event_form-library.md | 39 + .../CreateEventPage-class.md | 189 + .../CreateEventPage/CreateEventPage.md | 29 + .../CreateEventPage/createState.md | 49 + ...creens_events_create_event_page-library.md | 38 + .../EditEventPage-class.md | 198 + .../EditEventPage/EditEventPage.md | 29 + .../EditEventPage/createState.md | 49 + .../EditEventPage/event.md | 32 + ..._screens_events_edit_event_page-library.md | 38 + .../EditEventForm-class.md | 199 + .../EditEventForm/EditEventForm.md | 29 + .../EditEventForm/build.md | 188 + .../EditEventForm/model.md | 32 + ...screens_events_edit_events_form-library.md | 39 + .../EventCalendar-class.md | 198 + .../EventCalendar/EventCalendar.md | 29 + .../EventCalendar/createState.md | 49 + .../EventCalendar/eventList.md | 32 + ...h_screens_events_event_calendar-library.md | 38 + .../EventInfoBody-class.md | 189 + .../EventInfoBody/EventInfoBody.md | 29 + .../EventInfoBody/build.md | 332 ++ ..._screens_events_event_info_body-library.md | 38 + .../EventInfoPage-class.md | 198 + .../EventInfoPage/EventInfoPage.md | 29 + .../EventInfoPage/args.md | 32 + .../EventInfoPage/createState.md | 49 + ..._screens_events_event_info_page-library.md | 38 + .../ExploreEventDialog-class.md | 189 + .../ExploreEventDialog/ExploreEventDialog.md | 29 + .../ExploreEventDialog/createState.md | 49 + ...s_events_explore_event_dialogue-library.md | 38 + .../ExploreEvents-class.md | 207 + .../ExploreEvents/ExploreEvents.md | 32 + .../ExploreEvents/build.md | 291 ++ .../ExploreEvents/dropDownList.md | 71 + .../ExploreEvents/homeModel.md | 33 + ...h_screens_events_explore_events-library.md | 38 + .../CommentTemplate-class.md | 198 + .../CommentTemplate/CommentTemplate.md | 32 + .../CommentTemplate/build.md | 105 + .../CommentTemplate/comment.md | 32 + .../IndividualPageLikeSection-class.md | 198 + .../IndividualPageLikeSection.md | 32 + .../IndividualPageLikeSection/build.md | 84 + .../IndividualPageLikeSection/usersLiked.md | 32 + .../IndividualPostCommentSection-class.md | 207 + .../IndividualPostCommentSection.md | 33 + .../IndividualPostCommentSection/build.md | 87 + .../IndividualPostCommentSection/comments.md | 32 + .../IndividualPostCommentSection/postID.md | 32 + .../IndividualPostView-class.md | 198 + .../IndividualPostView/IndividualPostView.md | 29 + .../IndividualPostView/createState.md | 49 + .../IndividualPostView/post.md | 32 + .../buildPadding.md | 44 + .../likedUserCircleAvatar.md | 62 + ...th_screens_feed_individual_post-library.md | 79 + .../OrganizationFeed-class.md | 207 + .../OrganizationFeed/OrganizationFeed.md | 33 + .../OrganizationFeed/build.md | 130 + .../OrganizationFeed/forTest.md | 32 + .../OrganizationFeed/homeModel.md | 32 + ..._screens_feed_organization_feed-library.md | 38 + .../PinnedPostPage-class.md | 198 + .../PinnedPostPage/PinnedPostPage.md | 29 + .../PinnedPostPage/build.md | 87 + .../PinnedPostPage/pinnedPosts.md | 32 + ...h_screens_feed_pinned_post_page-library.md | 38 + .../SendAccessRequest-class.md | 198 + .../SendAccessRequest/SendAccessRequest.md | 33 + .../SendAccessRequest/build.md | 152 + .../SendAccessRequest/org.md | 32 + ...fter_auth_access_request_screen-library.md | 38 + .../JoinOrganisationAfterAuth-class.md | 207 + .../JoinOrganisationAfterAuth.md | 30 + .../JoinOrganisationAfterAuth/build.md | 123 + .../JoinOrganisationAfterAuth/orgId.md | 32 + .../JoinOrganisationAfterAuth/scanQR.md | 89 + ...th_join_organisation_after_auth-library.md | 38 + .../EditProfilePage-class.md | 189 + .../EditProfilePage/EditProfilePage.md | 29 + .../EditProfilePage/createState.md | 49 + ...reens_profile_edit_profile_page-library.md | 38 + .../ProfilePage-class.md | 207 + .../ProfilePage/ProfilePage.md | 32 + .../ProfilePage/build.md | 322 ++ .../ProfilePage/donate.md | 302 ++ .../ProfilePage/homeModel.md | 32 + ...th_screens_profile_profile_page-library.md | 38 + .../CreateTaskPage-class.md | 198 + .../CreateTaskPage/CreateTaskPage.md | 29 + .../CreateTaskPage/build.md | 80 + .../CreateTaskPage/eventId.md | 32 + ..._screens_tasks_create_task_page-library.md | 38 + .../EditTaskPage-class.md | 198 + .../EditTaskPage/EditTaskPage.md | 29 + .../EditTaskPage/build.md | 81 + .../EditTaskPage/task.md | 32 + ...th_screens_tasks_edit_task_page-library.md | 38 + .../EventTasksPage-class.md | 198 + .../EventTasksPage/EventTasksPage.md | 29 + .../EventTasksPage/build.md | 95 + .../EventTasksPage/eventId.md | 32 + ..._screens_tasks_event_tasks_page-library.md | 38 + .../UserTasksPage-class.md | 189 + .../UserTasksPage/UserTasksPage.md | 29 + .../UserTasksPage/build.md | 86 + ...h_screens_tasks_user_tasks_page-library.md | 38 + .../MapScreen-class.md | 216 + .../MapScreen/MapScreen.md | 30 + .../MapScreen/createState.md | 49 + .../MapScreen/latitude.md | 32 + .../MapScreen/longitude.md | 32 + .../MapScreen/model.md | 32 + ...r_auth_screens_venue_map_screen-library.md | 38 + .../views_base_view/BaseView-class.md | 206 + .../views_base_view/BaseView/BaseView.md | 32 + .../views_base_view/BaseView/builder.md | 32 + .../views_base_view/BaseView/createState.md | 49 + .../views_base_view/BaseView/onModelReady.md | 32 + .../views_base_view-library.md | 38 + .../views_main_screen/MainScreen-class.md | 197 + .../MainScreen/MainScreen.md | 29 + .../MainScreen/createState.md | 49 + .../MainScreen/mainScreenArgs.md | 32 + .../views_main_screen-library.md | 38 + .../ChangePass-class.md | 192 + .../ChangePass/ChangePass.md | 29 + .../ChangePass/createState.md | 49 + ...re_auth_screens_change_password-library.md | 41 + .../Login-class.md | 194 + .../Login/Login.md | 29 + .../Login/createState.md | 49 + .../views_pre_auth_screens_login-library.md | 43 + .../Recover-class.md | 190 + .../Recover/Recover.md | 29 + .../Recover/createState.md | 49 + .../views_pre_auth_screens_recover-library.md | 39 + .../SelectLanguage-class.md | 192 + .../SelectLanguage/SelectLanguage.md | 29 + .../SelectLanguage/createState.md | 49 + ...re_auth_screens_select_language-library.md | 41 + .../SelectOrganization-class.md | 200 + .../SelectOrganization/SelectOrganization.md | 30 + .../SelectOrganization/createState.md | 49 + .../SelectOrganization/selectedOrgId.md | 33 + ...uth_screens_select_organization-library.md | 38 + .../SetUrl-class.md | 203 + .../SetUrl/SetUrl.md | 29 + .../SetUrl/createState.md | 49 + .../SetUrl/uri.md | 33 + .../views_pre_auth_screens_set_url-library.md | 38 + .../SignUpDetails-class.md | 198 + .../SignUpDetails/SignUpDetails.md | 30 + .../SignUpDetails/createState.md | 49 + .../SignUpDetails/selectedOrg.md | 32 + ...pre_auth_screens_signup_details-library.md | 38 + .../WaitingPage-class.md | 189 + .../WaitingPage/WaitingPage.md | 29 + .../WaitingPage/build.md | 179 + ...ens_waiting_to_join_private_org-library.md | 38 + .../EventBottomSheet-class.md | 101 + .../EventBottomSheet/EventBottomSheet.md | 24 + .../EventBottomSheet/addUserBottomSheet.md | 148 + ...idgets_add_members_bottom_sheet-library.md | 38 + .../CustomAlertDialog-class.md | 255 + .../CustomAlertDialog/CustomAlertDialog.md | 38 + .../CustomAlertDialog/build.md | 108 + .../CustomAlertDialog/dialogSubTitle.md | 32 + .../CustomAlertDialog/dialogTitle.md | 32 + .../CustomAlertDialog/reverse.md | 32 + .../CustomAlertDialog/secondaryButtonTap.md | 32 + .../CustomAlertDialog/secondaryButtonText.md | 32 + .../CustomAlertDialog/success.md | 32 + .../CustomAlertDialog/successText.md | 32 + .../widgets_custom_alert_dialog-library.md | 41 + .../CustomAvatar-class.md | 236 + .../CustomAvatar/CustomAvatar.md | 36 + .../CustomAvatar/build.md | 106 + .../CustomAvatar/cacheManager.md | 32 + .../CustomAvatar/firstAlphabet.md | 32 + .../CustomAvatar/fontSize.md | 32 + .../CustomAvatar/imageUrl.md | 32 + .../CustomAvatar/isImageNull.md | 32 + .../widgets_custom_avatar-library.md | 40 + .../CustomDrawer-class.md | 208 + .../CustomDrawer/CustomDrawer.md | 32 + .../CustomDrawer/build.md | 198 + .../CustomDrawer/exitButton.md | 51 + .../CustomDrawer/homeModel.md | 33 + .../widgets_custom_drawer-library.md | 38 + .../CustomListTile-class.md | 271 ++ .../CustomListTile/CustomListTile.md | 40 + .../CustomListTile/build.md | 143 + .../CustomListTile/index.md | 32 + .../CustomListTile/onTapOption.md | 32 + .../CustomListTile/onTapOrgInfo.md | 32 + .../CustomListTile/onTapUserInfo.md | 32 + .../CustomListTile/option.md | 32 + .../CustomListTile/orgInfo.md | 32 + .../CustomListTile/showIcon.md | 32 + .../CustomListTile/type.md | 32 + .../CustomListTile/userInfo.md | 32 + .../widgets_custom_list_tile-library.md | 39 + .../CustomProgressDialog-class.md | 191 + .../CustomProgressDialog.md | 29 + .../CustomProgressDialog/build.md | 114 + .../widgets_custom_progress_dialog-library.md | 40 + .../customDatePicker.md | 51 + .../customTimePicker.md | 51 + .../widgets_date_time_picker-library.md | 49 + .../widgets_event_card/EventCard-class.md | 225 + .../widgets_event_card/EventCard/EventCard.md | 35 + .../widgets_event_card/EventCard/build.md | 336 ++ .../widgets_event_card/EventCard/event.md | 32 + .../EventCard/eventTitleHighlightedText.md | 32 + .../EventCard/eventTitleNormalText.md | 32 + .../EventCard/isSearchItem.md | 32 + .../widgets_event_card-library.md | 38 + .../DateTimeTile-class.md | 225 + .../DateTimeTile/DateTimeTile.md | 35 + .../DateTimeTile/build.md | 120 + .../DateTimeTile/date.md | 32 + .../DateTimeTile/setDate.md | 32 + .../DateTimeTile/setTime.md | 32 + .../DateTimeTile/time.md | 32 + .../widgets_event_date_time_tile-library.md | 38 + .../EventSearch-class.md | 279 ++ .../EventSearch/EventSearch.md | 29 + .../EventSearch/buildActions.md | 57 + .../EventSearch/buildLeading.md | 55 + .../EventSearch/buildResults.md | 48 + .../EventSearch/buildSuggestions.md | 57 + .../EventSearch/buildSuggestionsSucess.md | 71 + .../EventSearch/eventList.md | 32 + .../EventSearch/exploreEventsViewModel.md | 32 + .../widgets_event_search_delegate-library.md | 38 + .../FromPalisadoes-class.md | 189 + .../FromPalisadoes/FromPalisadoes.md | 29 + .../FromPalisadoes/build.md | 106 + .../widgets_from_palisadoes-library.md | 38 + .../widgets_invite_child/iconButton.md | 51 + .../widgets_invite_child/invite.md | 122 + .../widgets_invite_child-library.md | 51 + .../widgets_lang_switch/LanguageTile-class.md | 189 + .../LanguageTile/LanguageTile.md | 29 + .../widgets_lang_switch/LanguageTile/build.md | 97 + .../widgets_lang_switch-library.md | 38 + .../MemberNameTile-class.md | 219 + .../MemberNameTile/MemberNameTile.md | 34 + .../MemberNameTile/build.md | 119 + .../MemberNameTile/onDelete.md | 32 + .../MemberNameTile/userImage.md | 32 + .../MemberNameTile/userName.md | 32 + .../widgets_member_name_tile-library.md | 41 + .../OrganizationList-class.md | 200 + .../OrganizationList/OrganizationList.md | 29 + .../OrganizationList/build.md | 185 + .../OrganizationList/model.md | 33 + .../widgets_organization_list-library.md | 38 + .../OrganizationSearchList-class.md | 199 + .../OrganizationSearchList.md | 30 + .../OrganizationSearchList/build.md | 182 + .../OrganizationSearchList/model.md | 32 + ...idgets_organization_search_list-library.md | 39 + .../CustomCarouselScroller-class.md | 209 + .../CustomCarouselScroller.md | 33 + .../CustomCarouselScroller/createState.md | 49 + .../navigateToIndividualPostPage.md | 32 + .../CustomCarouselScroller/pinnedPosts.md | 32 + .../CustomCarouselScrollerState-class.md | 268 + .../CustomCarouselScrollerState.md | 24 + .../CustomCarouselScrollerState/controller.md | 32 + .../CustomCarouselScrollerState/pindex.md | 32 + .../PinnedPostCarousel-class.md | 218 + .../PinnedPostCarousel/PinnedPostCarousel.md | 34 + .../PinnedPostCarousel/build.md | 119 + .../navigateToIndividualPostPage.md | 32 + .../navigateToPinnedPostPage.md | 32 + .../PinnedPostCarousel/pinnedPosts.md | 32 + .../widgets_pinned_carousel_widget-library.md | 55 + .../DescriptionTextWidget-class.md | 201 + .../DescriptionTextWidget.md | 29 + .../DescriptionTextWidget/createState.md | 49 + .../DescriptionTextWidget/text.md | 32 + .../widgets_post_detailed_page-library.md | 41 + .../PostListWidget-class.md | 207 + .../PostListWidget/PostListWidget.md | 33 + .../PostListWidget/build.md | 93 + .../PostListWidget/function.md | 32 + .../PostListWidget/posts.md | 32 + .../widgets_post_list_widget-library.md | 38 + .../widgets_post_widget/NewsPost-class.md | 206 + .../widgets_post_widget/NewsPost/NewsPost.md | 33 + .../widgets_post_widget/NewsPost/build.md | 164 + .../widgets_post_widget/NewsPost/function.md | 32 + .../widgets_post_widget/NewsPost/post.md | 32 + .../PostContainer-class.md | 197 + .../PostContainer/PostContainer.md | 32 + .../PostContainer/createState.md | 49 + .../widgets_post_widget/PostContainer/id.md | 32 + .../PostContainerState-class.md | 281 ++ .../PostContainerState/PostContainerState.md | 24 + .../PostContainerState/controller.md | 32 + .../PostContainerState/dispose.md | 65 + .../PostContainerState/inView.md | 32 + .../PostContainerState/initState.md | 62 + .../PostContainerState/pindex.md | 32 + .../PostContainerState/startedPlaying.md | 32 + .../widgets_post_widget-library.md | 52 + .../RaisedRoundedButton-class.md | 253 + .../RaisedRoundedButton.md | 38 + .../RaisedRoundedButton/backgroundColor.md | 32 + .../RaisedRoundedButton/buttonLabel.md | 32 + .../RaisedRoundedButton/createState.md | 49 + .../RaisedRoundedButton/height.md | 32 + .../RaisedRoundedButton/onTap.md | 32 + .../RaisedRoundedButton/showArrow.md | 32 + .../RaisedRoundedButton/textColor.md | 32 + .../RaisedRoundedButton/width.md | 32 + ...idgets_raised_round_edge_button-library.md | 39 + .../widgets_rich_text/CustomRichText-class.md | 199 + .../CustomRichText/CustomRichText.md | 30 + .../widgets_rich_text/CustomRichText/build.md | 86 + .../widgets_rich_text/CustomRichText/words.md | 32 + .../widgets_rich_text-library.md | 39 + .../SignupProgressIndicator-class.md | 208 + .../SignupProgressIndicator.md | 30 + .../SignupProgressIndicator/build.md | 119 + .../currentPageIndex.md | 32 + .../SignupProgressIndicator/progressLabel.md | 36 + ...dgets_signup_progress_indicator-library.md | 39 + .../TalawaErrorDialog-class.md | 206 + .../TalawaErrorDialog/TalawaErrorDialog.md | 33 + .../TalawaErrorDialog/build.md | 168 + .../TalawaErrorDialog/errorMessage.md | 32 + .../TalawaErrorDialog/messageType.md | 32 + .../widgets_talawa_error_dialog-library.md | 38 + .../TalawaErrorSnackBar-class.md | 206 + .../TalawaErrorSnackBar.md | 33 + .../TalawaErrorSnackBar/build.md | 121 + .../TalawaErrorSnackBar/errorMessage.md | 32 + .../TalawaErrorSnackBar/messageType.md | 32 + .../widgets_talawa_error_snackbar-library.md | 38 + .../DescriptionField-class.md | 188 + .../DescriptionField/DescriptionField.md | 29 + .../DescriptionField/build.md | 100 + .../widgets_task_form/TaskForm-class.md | 215 + .../widgets_task_form/TaskForm/TaskForm.md | 34 + .../widgets_task_form/TaskForm/actionText.md | 32 + .../widgets_task_form/TaskForm/createState.md | 49 + .../widgets_task_form/TaskForm/onSave.md | 32 + .../widgets_task_form/TaskForm/title.md | 32 + .../widgets_task_form/TitleField-class.md | 188 + .../TitleField/TitleField.md | 29 + .../widgets_task_form/TitleField/build.md | 98 + .../widgets_task_form-library.md | 52 + .../widgets_task_schedule/TaskCard-class.md | 215 + .../TaskCard/TaskCard.md | 34 + .../TaskCard/appointment.md | 32 + .../widgets_task_schedule/TaskCard/build.md | 153 + .../TaskCard/showMoreOptions.md | 32 + .../widgets_task_schedule/TaskCard/task.md | 32 + .../TaskSchedule-class.md | 215 + .../TaskSchedule/TaskSchedule.md | 33 + .../TaskSchedule/build.md | 91 + .../TaskSchedule/calendarTapped.md | 75 + .../TaskSchedule/showMoreOptions.md | 32 + .../TaskSchedule/tasks.md | 32 + .../widgets_task_schedule-library.md | 45 + .../ChangeThemeTile-class.md | 190 + .../ChangeThemeTile/ChangeThemeTile.md | 29 + .../ChangeThemeTile/build.md | 86 + .../widgets_theme_switch-library.md | 39 + .../widgets_video_widget/VideoWidget-class.md | 207 + .../VideoWidget/VideoWidget.md | 30 + .../VideoWidget/createState.md | 49 + .../widgets_video_widget/VideoWidget/play.md | 32 + .../widgets_video_widget/VideoWidget/url.md | 32 + .../widgets_video_widget-library.md | 38 + talawa_lint/bin/talawa_lint.dart | 51 + talawa_lint/lib/helpers.dart | 166 + .../lib/talawa_api_doc/talawa_api_doc.dart | 85 + .../talawa_api_doc/talawa_api_doc_fixer.dart | 185 + .../talawa_api_doc_visitor.dart | 168 + .../lib/talawa_good_doc/talawa_good_doc.dart | 80 + .../talawa_good_doc_visitor.dart | 413 ++ talawa_lint/lib/talawa_lint.dart | 16 + talawa_lint/lib/talawa_lint_rules.dart | 120 + talawa_lint/pubspec.lock | 357 ++ talawa_lint/pubspec.yaml | 21 + test/flutter_test_config.dart | 8 + test/helpers/setup_firebase_mocks.dart | 208 + test/helpers/setup_hive.dart | 44 + test/helpers/setup_hive.mocks.dart | 837 ++++ test/helpers/talawa_plugin_provider_test.dart | 18 + test/helpers/test_helpers.dart | 945 ++++ test/helpers/test_helpers.mocks.dart | 4321 +++++++++++++++++ test/helpers/test_locator.dart | 123 + test/model_tests/app_tour_test.dart | 255 + .../chat/chat_list_tile_data_model_test.dart | 72 + test/model_tests/chat/chat_message_test.dart | 28 + test/model_tests/chat/chat_user_test.dart | 30 + test/model_tests/chats/chat_message_test.dart | 28 + .../comment/comment_model_test.dart | 46 + test/model_tests/events/event_model_test.dart | 135 + .../mainscreen_navigation_args_test.dart | 33 + .../organization/org_info_address_test.dart | 31 + .../organization/org_info_test.dart | 213 + test/model_tests/post/post_model_test.dart | 274 ++ test/model_tests/user/user_info_test.dart | 248 + test/plugins/fetch_plugin_list_test.dart | 86 + test/plugins/talawa_plugin_provider_test.dart | 246 + test/router_test.dart | 408 ++ test/service_tests/chat_service_test.dart | 105 + test/service_tests/comment_service_test.dart | 373 ++ .../database_mutations_function_test.dart | 1080 ++++ test/service_tests/event_service_test.dart | 184 + test/service_tests/graphql_config_test.dart | 33 + test/service_tests/image_service_test.dart | 101 + .../multi_media_pick_service_test.dart | 151 + .../navigation_service_test.dart | 608 +++ test/service_tests/org_service_test.dart | 95 + test/service_tests/post_service_test.dart | 491 ++ test/service_tests/session_manager_test.dart | 41 + test/service_tests/size_config_test.dart | 79 + test/service_tests/user_config_test.dart | 307 ++ test/utils/app_localization_test.dart | 95 + test/utils/comment_queries_test.dart | 43 + test/utils/encryptor_test.dart | 139 + test/utils/event_queries_test.dart | 151 + test/utils/post_queries_test.dart | 188 + test/utils_tests/chat_queries_test.dart | 141 + test/utils_tests/queries_test.dart | 225 + test/utils_tests/validators_test.dart | 244 + .../access_request_view_model_test.dart | 139 + .../add_post_view_model_test.dart | 261 + .../direct_chat_view_model_test.dart | 149 + .../select_contact_view_model_test.dart | 52 + .../create_event_view_model_test.dart | 324 ++ .../edit_event_view_model_test.dart | 76 + .../event_info_view_model_test.dart | 90 + .../explore_events_view_model_test.dart | 239 + .../organization_feed_view_model_test.dart | 159 + .../edit_profile_view_model_test.dart | 333 ++ .../profile_page_view_model_test.dart | 279 ++ .../app_setting_view_model_test.dart | 79 + .../base_view_model_test.dart | 48 + .../custom_drawer_view_model_test.dart | 284 ++ .../lang_view_model_test.dart | 193 + .../main_screen_view_model_test.dart | 751 +++ .../login_view_model_test.dart | 173 + .../select_organization_view_model_test.dart | 779 +++ .../set_url_view_model_test.dart | 366 ++ .../signup_details_view_model_test.dart | 561 +++ .../waiting_view_model_test.dart | 107 + .../progress_dialog_view_model_test.dart | 45 + .../signup_details_view_model_test.dart | 167 + .../theme_view_model_test.dart | 45 + .../comments_view_model_test.dart | 111 + .../like_button_view_model_test.dart | 97 + .../add_post_page_test.dart | 524 ++ .../chat_message_screen_test.dart | 81 + .../chat/select_contact_test.dart | 138 + .../chat/widgets/chat_input_field_test.dart | 92 + .../chat/widgets/chat_message_bubble.dart | 152 + .../create_custom_recurring_event_test.dart | 303 ++ .../events/create_event_page_test.dart | 755 +++ .../events/event_filter_bottomsheet_test.dart | 97 + .../events/event_info_body_test.dart | 245 + .../feed/individual_post_test.dart | 332 ++ .../feed/pinned_post_screen.dart | 144 + .../access_request_screen_test.dart | 61 + .../join_organisation_after_auth_test.dart | 286 ++ .../org_info_screen_test.dart | 292 ++ .../profile/profile_page_test.dart | 193 + .../profile/user_event_test.dart | 180 + .../profile/user_feed_test.dart | 198 + .../explore_events_demo_test.dart | 226 + .../organization_feed_demo_test.dart | 64 + .../demo_screens/profile_page_demo_test.dart | 88 + test/views/helpers/test_locator.dart | 4 + test/views/main_screen_test.dart | 272 ++ .../app_settings/app_setting_page_test.dart | 330 ++ .../chat/direct_chats_test.dart | 76 + .../events/create_event_form_test.dart | 164 + .../events/create_event_page_test.dart | 452 ++ .../events/edit_event_page_test.dart | 542 +++ .../events/edit_events_form_test.dart | 60 + .../events/event_calendar_test.dart | 185 + .../events/event_info_page_test.dart | 117 + .../events/explore_event_dialogue_test.dart | 277 ++ .../events/explore_events_test.dart | 205 + .../feed/individual_post_test.dart | 427 ++ .../feed/organization_feed_test.dart | 288 ++ .../feed/pinned_post_page_test.dart | 62 + .../feed/pinned_post_screen_test.dart | 71 + .../profile/edit_profile_page_test.dart | 478 ++ .../change_password_page_test.dart | 310 ++ .../pre_auth_screens/login_test.dart | 253 + .../pre_auth_screens/recover_page_test.dart | 186 + .../select_language_page_test.dart | 300 ++ .../select_organization_test.dart | 84 + .../pre_auth_screens/set_url_page_test.dart | 743 +++ .../pre_auth_screens/signup_details_test.dart | 278 ++ .../signup_progress_indicator_test.dart | 73 + .../pre_auth_screens/splash_screen_test.dart | 321 ++ .../pre_auth_screens/waiting_page_test.dart | 202 + .../widgets/custom_alert_dialog_test.dart | 135 + .../widgets/custom_avatar_test.dart | 330 ++ .../widgets/custom_drawer_test.dart | 317 ++ .../widgets/custom_list_tile_test.dart | 384 ++ .../widgets/custom_progress_dialog_test.dart | 88 + .../widgets/date_time_picker_test.dart | 117 + .../widget_tests/widgets/event_card_test.dart | 198 + .../widgets/event_date_time_tile_test.dart | 154 + .../widgets/event_search_delegate_test.dart | 191 + .../widgets/from_palisadoes_test.dart | 43 + .../widgets/lang_switch_test.dart | 58 + .../widgets/member_name_tile_test.dart | 157 + .../widgets/pinned_carousel_widget_test.dart | 152 + .../widgets/pinned_post_test.dart | 244 + .../widgets/post_container_test.dart | 155 + .../widgets/post_detailed_page_test.dart | 238 + .../widgets/post_list_widget_test.dart | 81 + .../widget_tests/widgets/post_modal_test.dart | 202 + .../widgets/post_widget_test.dart | 884 ++++ .../raised_round_edge_button_test.dart | 156 + test/widget_tests/widgets/rich_text_test.dart | 94 + .../widgets/talawa_error_dialog_test.dart | 351 ++ .../widgets/talawa_error_snackbar_test.dart | 243 + .../widgets/theme_switch_test.dart | 93 + 1860 files changed, 162188 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/dependabot.yaml create mode 100644 .github/pull_request_template.md create mode 100644 .github/workflows/README.md create mode 100644 .github/workflows/authorized-changes-detection.yml create mode 100755 .github/workflows/check_ignore.py create mode 100644 .github/workflows/compare_translations.py create mode 100755 .github/workflows/countline.py create mode 100755 .github/workflows/documentationcheck.py create mode 100644 .github/workflows/issues.yml create mode 100644 .github/workflows/pull-request-target.yml create mode 100644 .github/workflows/pull-request.yml create mode 100644 .github/workflows/push.yaml create mode 100644 .github/workflows/stale.yml create mode 100644 .gitignore create mode 100644 .readthedocs.yml create mode 100644 .travis.yml create mode 100644 CODEOWNERS create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 DOCUMENTATION.md create mode 100644 INSTALLATION.md create mode 100644 ISSUE_GUIDELINES.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-v21/launch_background.xml create mode 100644 android/app/src/main/res/drawable/chat_icon.png create mode 100644 android/app/src/main/res/drawable/event_icon.png 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/drawable/newsfeed_icon.png 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-night/styles.xml 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/app/src/main/res/xml/filepaths.xml create mode 100644 android/app/src/profile/AndroidManifest.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 android/settings_aar.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/icons/Info.svg create mode 100644 assets/icons/angel.svg create mode 100644 assets/icons/angry.svg create mode 100644 assets/icons/happy.svg create mode 100644 assets/icons/laugh.svg create mode 100644 assets/icons/love.svg create mode 100644 assets/icons/tear.svg create mode 100644 assets/images/Group 8948.png create mode 100644 assets/images/Organisation_Default_Image.jpeg create mode 100644 assets/images/Vector.svg create mode 100644 assets/images/comment.svg create mode 100644 assets/images/launcher_icon.png create mode 100644 assets/images/no_internet.png create mode 100644 assets/images/pfp2.png create mode 100644 assets/images/repost.svg create mode 100644 assets/images/talawa-logo-lite-200x200.png create mode 100644 "assets/images/\360\237\246\206 icon _like_.svg" 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/Podfile create mode 100644 ios/Podfile.lock 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.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 ios/Runner/AppDelegate.swift 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/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 ios/Runner/Base.lproj/Main.storyboard create mode 100644 ios/Runner/Info.plist create mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 lang/de.json 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/ja.json create mode 100644 lang/pt.json create mode 100644 lang/zh.json create mode 100644 lib/apptheme.dart create mode 100644 lib/constants/constants.dart create mode 100644 lib/constants/custom_theme.dart create mode 100644 lib/constants/quick_actions.dart create mode 100644 lib/constants/recurrence_values.dart create mode 100644 lib/constants/routing_constants.dart create mode 100644 lib/constants/timeout.dart create mode 100644 lib/custom_painters/language_icon.dart create mode 100644 lib/custom_painters/talawa_logo.dart create mode 100644 lib/custom_painters/telegram_logo.dart create mode 100644 lib/custom_painters/whatsapp_logo.dart create mode 100644 lib/demo_server_data/direct_chat_demo_data.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/app_tour.dart create mode 100644 lib/models/asymetric_keys/asymetric_keys.dart create mode 100644 lib/models/asymetric_keys/asymetric_keys.g.dart create mode 100644 lib/models/chats/chat_list_tile_data_model.dart create mode 100644 lib/models/chats/chat_list_tile_data_model.g.dart create mode 100644 lib/models/chats/chat_message.dart create mode 100644 lib/models/chats/chat_message.g.dart create mode 100644 lib/models/chats/chat_user.dart create mode 100644 lib/models/chats/chat_user.g.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/mainscreen_navigation_args.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/organization/org_info_address.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/plugins/fetch_plugin_list.dart create mode 100644 lib/plugins/talawa_plugin_provider.dart create mode 100644 lib/router.dart create mode 100644 lib/services/chat_service.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/image_service.dart create mode 100644 lib/services/navigation_service.dart create mode 100644 lib/services/org_service.dart create mode 100644 lib/services/post_service.dart create mode 100644 lib/services/session_manager.dart create mode 100644 lib/services/size_config.dart create mode 100644 lib/services/third_party_service/multi_media_pick_service.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/chat_queries.dart create mode 100644 lib/utils/comment_queries.dart create mode 100644 lib/utils/encryptor.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/access_request_view_model.dart create mode 100644 lib/view_model/after_auth_view_models/add_post_view_models/add_post_view_model.dart create mode 100644 lib/view_model/after_auth_view_models/chat_view_models/direct_chat_view_model.dart create mode 100644 lib/view_model/after_auth_view_models/chat_view_models/select_contact_view_model.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/edit_event_view_model.dart create mode 100644 lib/view_model/after_auth_view_models/event_view_models/event_calendar_view_model.dart create mode 100644 lib/view_model/after_auth_view_models/event_view_models/event_info_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/after_auth_view_models/settings_view_models/app_setting_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/theme_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/event_card_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/app_settings/app_settings_page.dart create mode 100644 lib/views/after_auth_screens/chat/chat_list_screen.dart create mode 100644 lib/views/after_auth_screens/chat/chat_message_screen.dart create mode 100644 lib/views/after_auth_screens/chat/direct_chats.dart create mode 100644 lib/views/after_auth_screens/chat/select_contact.dart create mode 100644 lib/views/after_auth_screens/chat/widgets/chat_input_field.dart create mode 100644 lib/views/after_auth_screens/chat/widgets/chat_message_bubble.dart create mode 100644 lib/views/after_auth_screens/events/create_custom_recurring_event.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/edit_event_page.dart create mode 100644 lib/views/after_auth_screens/events/edit_events_form.dart create mode 100644 lib/views/after_auth_screens/events/event_calendar.dart create mode 100644 lib/views/after_auth_screens/events/event_filter_bottomsheet.dart create mode 100644 lib/views/after_auth_screens/events/event_info_body.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/feed/pinned_post_screen.dart create mode 100644 lib/views/after_auth_screens/join_org_after_auth/access_request_screen.dart create mode 100644 lib/views/after_auth_screens/join_org_after_auth/join_organisation_after_auth.dart create mode 100644 lib/views/after_auth_screens/org_info_screen.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/after_auth_screens/profile/user_event.dart create mode 100644 lib/views/after_auth_screens/profile/user_feed.dart create mode 100644 lib/views/base_view.dart create mode 100644 lib/views/demo_screens/explore_events_demo.dart create mode 100644 lib/views/demo_screens/organization_feed_demo.dart create mode 100644 lib/views/demo_screens/profile_page_demo.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_screen.dart create mode 100644 lib/widgets/add_members_bottom_sheet.dart create mode 100644 lib/widgets/create_recurring_event_helper_widgets.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/custom_weekday_selector.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/event_search_delegate.dart create mode 100644 lib/widgets/from_palisadoes.dart create mode 100644 lib/widgets/invite_child.dart create mode 100644 lib/widgets/lang_switch.dart create mode 100644 lib/widgets/member_name_tile.dart create mode 100644 lib/widgets/multi_reaction.dart create mode 100644 lib/widgets/organization_list.dart create mode 100644 lib/widgets/organization_search_list.dart create mode 100644 lib/widgets/pinned_carousel_widget.dart create mode 100644 lib/widgets/pinned_post.dart create mode 100644 lib/widgets/post_container.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_modal.dart create mode 100644 lib/widgets/post_widget.dart create mode 100644 lib/widgets/raised_round_edge_button.dart create mode 100644 lib/widgets/recurrence_dialog.dart create mode 100644 lib/widgets/rich_text.dart create mode 100644 lib/widgets/signup_progress_indicator.dart create mode 100644 lib/widgets/talawa_error_dialog.dart create mode 100644 lib/widgets/talawa_error_snackbar.dart create mode 100644 lib/widgets/theme_switch.dart create mode 100644 lib/widgets/video_widget.dart create mode 100644 pubspec.lock create mode 100644 pubspec.yaml create mode 100644 talawa-mobile-docs/TalawaAdmin.md create mode 100644 talawa-mobile-docs/__404error.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme-class.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/AppTheme.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/blackPrimary-constant.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/blackSecondary-constant.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/blackTertiary-constant.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/blue-constant.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/bodyText1.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/bodyText2.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/bodyText3.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/button.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/green-constant.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/grey-constant.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/headline1.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/headline2.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/headline3.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/headline4.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/headline5.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/headline6.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/lightGrey-constant.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/overline.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/primary-constant.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/red-constant.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/secondary-constant.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/shadow-constant.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/subtitle1.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/subtitle2.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/tertiary-constant.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/title.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/white-constant.md create mode 100644 talawa-mobile-docs/apptheme/AppTheme/yellow-constant.md create mode 100644 talawa-mobile-docs/apptheme/apptheme-library.md create mode 100644 talawa-mobile-docs/categories.json create mode 100644 talawa-mobile-docs/constants_constants/constants_constants-library.md create mode 100644 talawa-mobile-docs/constants_constants/languages.md create mode 100644 talawa-mobile-docs/constants_constants/supportedCurrencies.md create mode 100644 talawa-mobile-docs/constants_custom_theme/TalawaTheme-class.md create mode 100644 talawa-mobile-docs/constants_custom_theme/TalawaTheme/TalawaTheme.md create mode 100644 talawa-mobile-docs/constants_custom_theme/TalawaTheme/darkTheme.md create mode 100644 talawa-mobile-docs/constants_custom_theme/TalawaTheme/lightTheme.md create mode 100644 talawa-mobile-docs/constants_custom_theme/constants_custom_theme-library.md create mode 100644 talawa-mobile-docs/constants_quick_actions/ShortCutMenu-class.md create mode 100644 talawa-mobile-docs/constants_quick_actions/ShortCutMenu/ShortCutMenu.md create mode 100644 talawa-mobile-docs/constants_quick_actions/ShortCutMenu/chatAction-constant.md create mode 100644 talawa-mobile-docs/constants_quick_actions/ShortCutMenu/eventAction-constant.md create mode 100644 talawa-mobile-docs/constants_quick_actions/ShortCutMenu/feedAction-constant.md create mode 100644 talawa-mobile-docs/constants_quick_actions/ShortCutMenu/quickActionsList.md create mode 100644 talawa-mobile-docs/constants_quick_actions/constants_quick_actions-library.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes-class.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/Routes.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/addTask-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/appSettings-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/calendar-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/chatMessageScreen-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/createEventPage-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/demoPageViewRoute-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/editEventPage-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/editProfilePage-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/editTask-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/eventInfoPage-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/eventTasks-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/exploreEventsScreen-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/homeScreen-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/individualPost-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/joinOrg-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/languageSelectionRoute-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/loginScreen-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/mainScreen-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/mapScreen-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/pinnedPostPage-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/profilePage-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/progressDialog-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/recoverScreen-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/requestAccess-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/selectContact-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/selectOrgScreen-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/setUrlScreen-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/signupDetailScreen-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/splashScreen-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/updateScreen-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/userTasks-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/Routes/waitingScreen-constant.md create mode 100644 talawa-mobile-docs/constants_routing_constants/constants_routing_constants-library.md create mode 100644 talawa-mobile-docs/constants_timeout/TimeOuts-class.md create mode 100644 talawa-mobile-docs/constants_timeout/TimeOuts/TimeOuts.md create mode 100644 talawa-mobile-docs/constants_timeout/TimeOuts/large-constant.md create mode 100644 talawa-mobile-docs/constants_timeout/TimeOuts/mediums-constant.md create mode 100644 talawa-mobile-docs/constants_timeout/TimeOuts/small-constant.md create mode 100644 talawa-mobile-docs/constants_timeout/constants_timeout-library.md create mode 100644 talawa-mobile-docs/custom_painters_language_icon/LanguageIcon-class.md create mode 100644 talawa-mobile-docs/custom_painters_language_icon/LanguageIcon/LanguageIcon.md create mode 100644 talawa-mobile-docs/custom_painters_language_icon/LanguageIcon/paint.md create mode 100644 talawa-mobile-docs/custom_painters_language_icon/LanguageIcon/shouldRepaint.md create mode 100644 talawa-mobile-docs/custom_painters_language_icon/custom_painters_language_icon-library.md create mode 100644 talawa-mobile-docs/custom_painters_talawa_logo/AppLogo-class.md create mode 100644 talawa-mobile-docs/custom_painters_talawa_logo/AppLogo/AppLogo.md create mode 100644 talawa-mobile-docs/custom_painters_talawa_logo/AppLogo/paint.md create mode 100644 talawa-mobile-docs/custom_painters_talawa_logo/AppLogo/shouldRepaint.md create mode 100644 talawa-mobile-docs/custom_painters_talawa_logo/custom_painters_talawa_logo-library.md create mode 100644 talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo-class.md create mode 100644 talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo/TelegramLogo.md create mode 100644 talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo/paint.md create mode 100644 talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo/shouldRepaint.md create mode 100644 talawa-mobile-docs/custom_painters_telegram_logo/custom_painters_telegram_logo-library.md create mode 100644 talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo-class.md create mode 100644 talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo/WhatsappLogo.md create mode 100644 talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo/paint.md create mode 100644 talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo/shouldRepaint.md create mode 100644 talawa-mobile-docs/custom_painters_whatsapp_logo/custom_painters_whatsapp_logo-library.md create mode 100644 talawa-mobile-docs/demo_server_data_direct_chat_demo_data/demo_server_data_direct_chat_demo_data-library.md create mode 100644 talawa-mobile-docs/demo_server_data_direct_chat_demo_data/directChatDemoData-constant.md create mode 100644 talawa-mobile-docs/demo_server_data_events_demo_data/demo_server_data_events_demo_data-library.md create mode 100644 talawa-mobile-docs/demo_server_data_events_demo_data/eventsDemoData-constant.md create mode 100644 talawa-mobile-docs/demo_server_data_pinned_post_demo_data/demo_server_data_pinned_post_demo_data-library.md create mode 100644 talawa-mobile-docs/demo_server_data_pinned_post_demo_data/pinnedPostsDemoData-constant.md create mode 100644 talawa-mobile-docs/demo_server_data_post_demo_data/demo_server_data_post_demo_data-library.md create mode 100644 talawa-mobile-docs/demo_server_data_post_demo_data/postsDemoData-constant.md create mode 100644 talawa-mobile-docs/enums_enums/CallFor.md create mode 100644 talawa-mobile-docs/enums_enums/CallFor/CallFor.md create mode 100644 talawa-mobile-docs/enums_enums/CallFor/values-constant.md create mode 100644 talawa-mobile-docs/enums_enums/ChatState.md create mode 100644 talawa-mobile-docs/enums_enums/ChatState/ChatState.md create mode 100644 talawa-mobile-docs/enums_enums/ChatState/values-constant.md create mode 100644 talawa-mobile-docs/enums_enums/MessageType.md create mode 100644 talawa-mobile-docs/enums_enums/MessageType/MessageType.md create mode 100644 talawa-mobile-docs/enums_enums/MessageType/values-constant.md create mode 100644 talawa-mobile-docs/enums_enums/ModalSheet.md create mode 100644 talawa-mobile-docs/enums_enums/ModalSheet/ModalSheet.md create mode 100644 talawa-mobile-docs/enums_enums/ModalSheet/values-constant.md create mode 100644 talawa-mobile-docs/enums_enums/TileType.md create mode 100644 talawa-mobile-docs/enums_enums/TileType/TileType.md create mode 100644 talawa-mobile-docs/enums_enums/TileType/values-constant.md create mode 100644 talawa-mobile-docs/enums_enums/ViewState.md create mode 100644 talawa-mobile-docs/enums_enums/ViewState/ViewState.md create mode 100644 talawa-mobile-docs/enums_enums/ViewState/values-constant.md create mode 100644 talawa-mobile-docs/enums_enums/enums_enums-library.md create mode 100644 talawa-mobile-docs/firebase_options/DefaultFirebaseOptions-class.md create mode 100644 talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/DefaultFirebaseOptions.md create mode 100644 talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/android.md create mode 100644 talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/currentPlatform.md create mode 100644 talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/ios.md create mode 100644 talawa-mobile-docs/firebase_options/firebase_options-library.md create mode 100644 talawa-mobile-docs/generated_plugin_registrant/generated_plugin_registrant-library.md create mode 100644 talawa-mobile-docs/generated_plugin_registrant/registerPlugins.md create mode 100644 talawa-mobile-docs/index.json create mode 100644 talawa-mobile-docs/index.md create mode 100644 talawa-mobile-docs/locator/connectivity.md create mode 100644 talawa-mobile-docs/locator/databaseFunctions.md create mode 100644 talawa-mobile-docs/locator/graphqlConfig.md create mode 100644 talawa-mobile-docs/locator/imageCropper.md create mode 100644 talawa-mobile-docs/locator/imagePicker.md create mode 100644 talawa-mobile-docs/locator/locator-library.md create mode 100644 talawa-mobile-docs/locator/locator.md create mode 100644 talawa-mobile-docs/locator/navigationService.md create mode 100644 talawa-mobile-docs/locator/organizationService.md create mode 100644 talawa-mobile-docs/locator/queries.md create mode 100644 talawa-mobile-docs/locator/setupLocator.md create mode 100644 talawa-mobile-docs/locator/sizeConfig.md create mode 100644 talawa-mobile-docs/locator/userConfig.md create mode 100644 talawa-mobile-docs/main/DemoPageView-class.md create mode 100644 talawa-mobile-docs/main/DemoPageView/DemoPageView.md create mode 100644 talawa-mobile-docs/main/DemoPageView/build.md create mode 100644 talawa-mobile-docs/main/DemoViewModel-class.md create mode 100644 talawa-mobile-docs/main/DemoViewModel/DemoViewModel.md create mode 100644 talawa-mobile-docs/main/DemoViewModel/title.md create mode 100644 talawa-mobile-docs/main/MyApp-class.md create mode 100644 talawa-mobile-docs/main/MyApp/MyApp.md create mode 100644 talawa-mobile-docs/main/MyApp/createState.md create mode 100644 talawa-mobile-docs/main/androidFirebaseOptions.md create mode 100644 talawa-mobile-docs/main/channel.md create mode 100644 talawa-mobile-docs/main/flutterLocalNotificationsPlugin.md create mode 100644 talawa-mobile-docs/main/iosFirebaseOptions.md create mode 100644 talawa-mobile-docs/main/main-library.md create mode 100644 talawa-mobile-docs/main/main.md create mode 100644 talawa-mobile-docs/main/setUpFirebase.md create mode 100644 talawa-mobile-docs/main/setUpFirebaseKeys.md create mode 100644 talawa-mobile-docs/main/setUpFirebaseMessaging.md create mode 100644 talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md create mode 100644 talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/ChatListTileDataModel.fromJson.md create mode 100644 talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/ChatListTileDataModel.md create mode 100644 talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/id.md create mode 100644 talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/toJson.md create mode 100644 talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/users.md create mode 100644 talawa-mobile-docs/models_chats_chat_list_tile_data_model/models_chats_chat_list_tile_data_model-library.md create mode 100644 talawa-mobile-docs/models_chats_chat_message/ChatMessage-class.md create mode 100644 talawa-mobile-docs/models_chats_chat_message/ChatMessage/ChatMessage.fromJson.md create mode 100644 talawa-mobile-docs/models_chats_chat_message/ChatMessage/ChatMessage.md create mode 100644 talawa-mobile-docs/models_chats_chat_message/ChatMessage/id.md create mode 100644 talawa-mobile-docs/models_chats_chat_message/ChatMessage/messageContent.md create mode 100644 talawa-mobile-docs/models_chats_chat_message/ChatMessage/receiver.md create mode 100644 talawa-mobile-docs/models_chats_chat_message/ChatMessage/sender.md create mode 100644 talawa-mobile-docs/models_chats_chat_message/ChatMessage/toJson.md create mode 100644 talawa-mobile-docs/models_chats_chat_message/models_chats_chat_message-library.md create mode 100644 talawa-mobile-docs/models_chats_chat_user/ChatUser-class.md create mode 100644 talawa-mobile-docs/models_chats_chat_user/ChatUser/ChatUser.fromJson.md create mode 100644 talawa-mobile-docs/models_chats_chat_user/ChatUser/ChatUser.md create mode 100644 talawa-mobile-docs/models_chats_chat_user/ChatUser/firstName.md create mode 100644 talawa-mobile-docs/models_chats_chat_user/ChatUser/id.md create mode 100644 talawa-mobile-docs/models_chats_chat_user/ChatUser/image.md create mode 100644 talawa-mobile-docs/models_chats_chat_user/ChatUser/toJson.md create mode 100644 talawa-mobile-docs/models_chats_chat_user/models_chats_chat_user-library.md create mode 100644 talawa-mobile-docs/models_comment_comment_model/Comment-class.md create mode 100644 talawa-mobile-docs/models_comment_comment_model/Comment/Comment.fromJson.md create mode 100644 talawa-mobile-docs/models_comment_comment_model/Comment/Comment.md create mode 100644 talawa-mobile-docs/models_comment_comment_model/Comment/createdAt.md create mode 100644 talawa-mobile-docs/models_comment_comment_model/Comment/creator.md create mode 100644 talawa-mobile-docs/models_comment_comment_model/Comment/likeCount.md create mode 100644 talawa-mobile-docs/models_comment_comment_model/Comment/post.md create mode 100644 talawa-mobile-docs/models_comment_comment_model/Comment/text.md create mode 100644 talawa-mobile-docs/models_comment_comment_model/models_comment_comment_model-library.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event-class.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/Event.fromJson.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/Event.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/admins.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/allDay.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/attendees.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/creator.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/description.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/endDate.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/endTime.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/id.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/isPublic.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/isRegisterable.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/isRegistered.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/latitude.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/location.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/longitude.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/organization.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/recurrence.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/recurring.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/registrants.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/startDate.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/startTime.md create mode 100644 talawa-mobile-docs/models_events_event_model/Event/title.md create mode 100644 talawa-mobile-docs/models_events_event_model/models_events_event_model-library.md create mode 100644 talawa-mobile-docs/models_language_language_model/Language-class.md create mode 100644 talawa-mobile-docs/models_language_language_model/Language/Language.md create mode 100644 talawa-mobile-docs/models_language_language_model/Language/countryCode.md create mode 100644 talawa-mobile-docs/models_language_language_model/Language/langCode.md create mode 100644 talawa-mobile-docs/models_language_language_model/Language/langName.md create mode 100644 talawa-mobile-docs/models_language_language_model/Language/langSample.md create mode 100644 talawa-mobile-docs/models_language_language_model/models_language_language_model-library.md create mode 100644 talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs-class.md create mode 100644 talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs/MainScreenArgs.md create mode 100644 talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs/fromSignUp.md create mode 100644 talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs/mainScreenIndex.md create mode 100644 talawa-mobile-docs/models_mainscreen_navigation_args/models_mainscreen_navigation_args-library.md create mode 100644 talawa-mobile-docs/models_options_options/Options-class.md create mode 100644 talawa-mobile-docs/models_options_options/Options/Options.md create mode 100644 talawa-mobile-docs/models_options_options/Options/icon.md create mode 100644 talawa-mobile-docs/models_options_options/Options/subtitle.md create mode 100644 talawa-mobile-docs/models_options_options/Options/title.md create mode 100644 talawa-mobile-docs/models_options_options/Options/trailingIconButton.md create mode 100644 talawa-mobile-docs/models_options_options/models_options_options-library.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfo-class.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfo/OrgInfo.fromJson.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfo/OrgInfo.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfo/admins.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfo/creatorInfo.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfo/description.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfo/fromJsonToList.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfo/id.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfo/image.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfo/isPublic.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfo/members.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfo/name.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter-class.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/OrgInfoAdapter.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/hashCode.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/operator_equals.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/read.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/typeId.md create mode 100644 talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/write.md create mode 100644 talawa-mobile-docs/models_organization_org_info/models_organization_org_info-library.md create mode 100644 talawa-mobile-docs/models_post_post_model/Comments-class.md create mode 100644 talawa-mobile-docs/models_post_post_model/Comments/Comments.fromJson.md create mode 100644 talawa-mobile-docs/models_post_post_model/Comments/Comments.md create mode 100644 talawa-mobile-docs/models_post_post_model/Comments/sId.md create mode 100644 talawa-mobile-docs/models_post_post_model/Comments/toJson.md create mode 100644 talawa-mobile-docs/models_post_post_model/LikedBy-class.md create mode 100644 talawa-mobile-docs/models_post_post_model/LikedBy/LikedBy.fromJson.md create mode 100644 talawa-mobile-docs/models_post_post_model/LikedBy/LikedBy.md create mode 100644 talawa-mobile-docs/models_post_post_model/LikedBy/sId.md create mode 100644 talawa-mobile-docs/models_post_post_model/LikedBy/toJson.md create mode 100644 talawa-mobile-docs/models_post_post_model/Post-class.md create mode 100644 talawa-mobile-docs/models_post_post_model/Post/Post.fromJson.md create mode 100644 talawa-mobile-docs/models_post_post_model/Post/Post.md create mode 100644 talawa-mobile-docs/models_post_post_model/Post/comments.md create mode 100644 talawa-mobile-docs/models_post_post_model/Post/createdAt.md create mode 100644 talawa-mobile-docs/models_post_post_model/Post/creator.md create mode 100644 talawa-mobile-docs/models_post_post_model/Post/description.md create mode 100644 talawa-mobile-docs/models_post_post_model/Post/getPostCreatedDuration.md create mode 100644 talawa-mobile-docs/models_post_post_model/Post/imageUrl.md create mode 100644 talawa-mobile-docs/models_post_post_model/Post/likedBy.md create mode 100644 talawa-mobile-docs/models_post_post_model/Post/organization.md create mode 100644 talawa-mobile-docs/models_post_post_model/Post/sId.md create mode 100644 talawa-mobile-docs/models_post_post_model/Post/videoUrl.md create mode 100644 talawa-mobile-docs/models_post_post_model/models_post_post_model-library.md create mode 100644 talawa-mobile-docs/models_task_task_model/Task-class.md create mode 100644 talawa-mobile-docs/models_task_task_model/Task/Task.fromJson.md create mode 100644 talawa-mobile-docs/models_task_task_model/Task/Task.md create mode 100644 talawa-mobile-docs/models_task_task_model/Task/createdAt.md create mode 100644 talawa-mobile-docs/models_task_task_model/Task/creator.md create mode 100644 talawa-mobile-docs/models_task_task_model/Task/deadline.md create mode 100644 talawa-mobile-docs/models_task_task_model/Task/description.md create mode 100644 talawa-mobile-docs/models_task_task_model/Task/event.md create mode 100644 talawa-mobile-docs/models_task_task_model/Task/id.md create mode 100644 talawa-mobile-docs/models_task_task_model/Task/title.md create mode 100644 talawa-mobile-docs/models_task_task_model/models_task_task_model-library.md create mode 100644 talawa-mobile-docs/models_user_user_info/User-class.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/User.fromJson.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/User.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/adminFor.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/authToken.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/createdOrganizations.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/email.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/firstName.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/id.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/image.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/joinedOrganizations.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/lastName.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/membershipRequests.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/print.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/refreshToken.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/update.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/updateAdminFor.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/updateCreatedOrg.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/updateJoinedOrg.md create mode 100644 talawa-mobile-docs/models_user_user_info/User/updateMemberRequestOrg.md create mode 100644 talawa-mobile-docs/models_user_user_info/UserAdapter-class.md create mode 100644 talawa-mobile-docs/models_user_user_info/UserAdapter/UserAdapter.md create mode 100644 talawa-mobile-docs/models_user_user_info/UserAdapter/hashCode.md create mode 100644 talawa-mobile-docs/models_user_user_info/UserAdapter/operator_equals.md create mode 100644 talawa-mobile-docs/models_user_user_info/UserAdapter/read.md create mode 100644 talawa-mobile-docs/models_user_user_info/UserAdapter/typeId.md create mode 100644 talawa-mobile-docs/models_user_user_info/UserAdapter/write.md create mode 100644 talawa-mobile-docs/models_user_user_info/models_user_user_info-library.md create mode 100644 talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList-class.md create mode 100644 talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList/FetchPluginList.md create mode 100644 talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList/box.md create mode 100644 talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList/fetchList.md create mode 100644 talawa-mobile-docs/plugins_fetch_plugin_list/plugins_fetch_plugin_list-library.md create mode 100644 talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider-class.md create mode 100644 talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/TalawaPluginProvider.md create mode 100644 talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/build.md create mode 100644 talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/checkFromPluginList.md create mode 100644 talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/child.md create mode 100644 talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/pluginName.md create mode 100644 talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/visible.md create mode 100644 talawa-mobile-docs/plugins_talawa_plugin_provider/plugins_talawa_plugin_provider-library.md create mode 100644 talawa-mobile-docs/router/generateRoute.md create mode 100644 talawa-mobile-docs/router/router-library.md create mode 100644 talawa-mobile-docs/search.md create mode 100644 talawa-mobile-docs/services_chat_service/ChatService-class.md create mode 100644 talawa-mobile-docs/services_chat_service/ChatService/ChatService.md create mode 100644 talawa-mobile-docs/services_chat_service/ChatService/chatListStream.md create mode 100644 talawa-mobile-docs/services_chat_service/ChatService/chatMessagesStream.md create mode 100644 talawa-mobile-docs/services_chat_service/ChatService/chatStream.md create mode 100644 talawa-mobile-docs/services_chat_service/ChatService/getDirectChatMessagesByChatId.md create mode 100644 talawa-mobile-docs/services_chat_service/ChatService/getDirectChatsByUserId.md create mode 100644 talawa-mobile-docs/services_chat_service/ChatService/sendMessageToDirectChat.md create mode 100644 talawa-mobile-docs/services_chat_service/services_chat_service-library.md create mode 100644 talawa-mobile-docs/services_comment_service/CommentService-class.md create mode 100644 talawa-mobile-docs/services_comment_service/CommentService/CommentService.md create mode 100644 talawa-mobile-docs/services_comment_service/CommentService/createComments.md create mode 100644 talawa-mobile-docs/services_comment_service/CommentService/getCommentsForPost.md create mode 100644 talawa-mobile-docs/services_comment_service/services_comment_service-library.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions-class.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/DataBaseMutationFunctions.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/clientAuth.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/clientNonAuth.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/emailAccountPresent.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/encounteredExceptionOrError.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/fetchOrgById.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlAuthMutation.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlAuthQuery.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlNonAuthMutation.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlNonAuthQuery.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/init.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/memberRequestExist.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/notifFeatureNotInstalled.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/organizationNotFound.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/refreshAccessToken.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/refreshAccessTokenExpiredException.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/userNotAuthenticated.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/userNotFound.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/wrongCredentials.md create mode 100644 talawa-mobile-docs/services_database_mutation_functions/services_database_mutation_functions-library.md create mode 100644 talawa-mobile-docs/services_event_service/EventService-class.md create mode 100644 talawa-mobile-docs/services_event_service/EventService/EventService.md create mode 100644 talawa-mobile-docs/services_event_service/EventService/deleteEvent.md create mode 100644 talawa-mobile-docs/services_event_service/EventService/dispose.md create mode 100644 talawa-mobile-docs/services_event_service/EventService/editEvent.md create mode 100644 talawa-mobile-docs/services_event_service/EventService/eventStream.md create mode 100644 talawa-mobile-docs/services_event_service/EventService/fetchRegistrantsByEvent.md create mode 100644 talawa-mobile-docs/services_event_service/EventService/getEvents.md create mode 100644 talawa-mobile-docs/services_event_service/EventService/registerForAnEvent.md create mode 100644 talawa-mobile-docs/services_event_service/EventService/setOrgStreamSubscription.md create mode 100644 talawa-mobile-docs/services_event_service/services_event_service-library.md create mode 100644 talawa-mobile-docs/services_graphql_config/GraphqlConfig-class.md create mode 100644 talawa-mobile-docs/services_graphql_config/GraphqlConfig/GraphqlConfig.md create mode 100644 talawa-mobile-docs/services_graphql_config/GraphqlConfig/authClient.md create mode 100644 talawa-mobile-docs/services_graphql_config/GraphqlConfig/clientToQuery.md create mode 100644 talawa-mobile-docs/services_graphql_config/GraphqlConfig/displayImgRoute.md create mode 100644 talawa-mobile-docs/services_graphql_config/GraphqlConfig/getOrgUrl.md create mode 100644 talawa-mobile-docs/services_graphql_config/GraphqlConfig/getToken.md create mode 100644 talawa-mobile-docs/services_graphql_config/GraphqlConfig/httpLink.md create mode 100644 talawa-mobile-docs/services_graphql_config/GraphqlConfig/imageUrlKey-constant.md create mode 100644 talawa-mobile-docs/services_graphql_config/GraphqlConfig/orgURI.md create mode 100644 talawa-mobile-docs/services_graphql_config/GraphqlConfig/test.md create mode 100644 talawa-mobile-docs/services_graphql_config/GraphqlConfig/token.md create mode 100644 talawa-mobile-docs/services_graphql_config/GraphqlConfig/urlKey-constant.md create mode 100644 talawa-mobile-docs/services_graphql_config/GraphqlConfig/webSocketLink.md create mode 100644 talawa-mobile-docs/services_graphql_config/MockHttpClient-class.md create mode 100644 talawa-mobile-docs/services_graphql_config/MockHttpClient/MockHttpClient.md create mode 100644 talawa-mobile-docs/services_graphql_config/MockHttpClient/send.md create mode 100644 talawa-mobile-docs/services_graphql_config/services_graphql_config-library.md create mode 100644 talawa-mobile-docs/services_navigation_service/NavigationService-class.md create mode 100644 talawa-mobile-docs/services_navigation_service/NavigationService/NavigationService.md create mode 100644 talawa-mobile-docs/services_navigation_service/NavigationService/fromInviteLink.md create mode 100644 talawa-mobile-docs/services_navigation_service/NavigationService/navigatorKey.md create mode 100644 talawa-mobile-docs/services_navigation_service/NavigationService/pop.md create mode 100644 talawa-mobile-docs/services_navigation_service/NavigationService/popAndPushScreen.md create mode 100644 talawa-mobile-docs/services_navigation_service/NavigationService/pushDialog.md create mode 100644 talawa-mobile-docs/services_navigation_service/NavigationService/pushReplacementScreen.md create mode 100644 talawa-mobile-docs/services_navigation_service/NavigationService/pushScreen.md create mode 100644 talawa-mobile-docs/services_navigation_service/NavigationService/removeAllAndPush.md create mode 100644 talawa-mobile-docs/services_navigation_service/NavigationService/showSnackBar.md create mode 100644 talawa-mobile-docs/services_navigation_service/NavigationService/showTalawaErrorDialog.md create mode 100644 talawa-mobile-docs/services_navigation_service/NavigationService/showTalawaErrorSnackBar.md create mode 100644 talawa-mobile-docs/services_navigation_service/services_navigation_service-library.md create mode 100644 talawa-mobile-docs/services_org_service/OrganizationService-class.md create mode 100644 talawa-mobile-docs/services_org_service/OrganizationService/OrganizationService.md create mode 100644 talawa-mobile-docs/services_org_service/OrganizationService/getOrgMembersList.md create mode 100644 talawa-mobile-docs/services_org_service/services_org_service-library.md create mode 100644 talawa-mobile-docs/services_post_service/PostService-class.md create mode 100644 talawa-mobile-docs/services_post_service/PostService/PostService.md create mode 100644 talawa-mobile-docs/services_post_service/PostService/addCommentLocally.md create mode 100644 talawa-mobile-docs/services_post_service/PostService/addLike.md create mode 100644 talawa-mobile-docs/services_post_service/PostService/getPosts.md create mode 100644 talawa-mobile-docs/services_post_service/PostService/postStream.md create mode 100644 talawa-mobile-docs/services_post_service/PostService/removeLike.md create mode 100644 talawa-mobile-docs/services_post_service/PostService/setOrgStreamSubscription.md create mode 100644 talawa-mobile-docs/services_post_service/PostService/updatedPostStream.md create mode 100644 talawa-mobile-docs/services_post_service/services_post_service-library.md create mode 100644 talawa-mobile-docs/services_size_config/SizeConfig-class.md create mode 100644 talawa-mobile-docs/services_size_config/SizeConfig/SizeConfig.md create mode 100644 talawa-mobile-docs/services_size_config/SizeConfig/blockSizeHorizontal.md create mode 100644 talawa-mobile-docs/services_size_config/SizeConfig/blockSizeVertical.md create mode 100644 talawa-mobile-docs/services_size_config/SizeConfig/init.md create mode 100644 talawa-mobile-docs/services_size_config/SizeConfig/paddingTop.md create mode 100644 talawa-mobile-docs/services_size_config/SizeConfig/safeBlockHorizontal.md create mode 100644 talawa-mobile-docs/services_size_config/SizeConfig/safeBlockVertical.md create mode 100644 talawa-mobile-docs/services_size_config/SizeConfig/screenHeight.md create mode 100644 talawa-mobile-docs/services_size_config/SizeConfig/screenWidth.md create mode 100644 talawa-mobile-docs/services_size_config/SizeConfig/test.md create mode 100644 talawa-mobile-docs/services_size_config/services_size_config-library.md create mode 100644 talawa-mobile-docs/services_task_service/TaskService-class.md create mode 100644 talawa-mobile-docs/services_task_service/TaskService/TaskService.md create mode 100644 talawa-mobile-docs/services_task_service/TaskService/callbackNotifyListeners.md create mode 100644 talawa-mobile-docs/services_task_service/TaskService/createTask.md create mode 100644 talawa-mobile-docs/services_task_service/TaskService/deleteTask.md create mode 100644 talawa-mobile-docs/services_task_service/TaskService/editTask.md create mode 100644 talawa-mobile-docs/services_task_service/TaskService/getTasksByUser.md create mode 100644 talawa-mobile-docs/services_task_service/TaskService/getTasksForEvent.md create mode 100644 talawa-mobile-docs/services_task_service/TaskService/tasks.md create mode 100644 talawa-mobile-docs/services_task_service/services_task_service-library.md create mode 100644 talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService-class.md create mode 100644 talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/MultiMediaPickerService.md create mode 100644 talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/cropImage.md create mode 100644 talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/fileStream.md create mode 100644 talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/getPhotoFromGallery.md create mode 100644 talawa-mobile-docs/services_third_party_service_multi_media_pick_service/services_third_party_service_multi_media_pick_service-library.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig-class.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/UserConfig.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/currentOrg.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/currentOrgInfoController.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/currentOrgInfoStream.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/currentOrgName.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/currentUser.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/initialiseStream.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/saveCurrentOrgInHive.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/saveUserInHive.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/updateAccessToken.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/updateUser.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/updateUserAdminOrg.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/updateUserCreatedOrg.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/updateUserJoinedOrg.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/updateUserMemberRequestOrg.md create mode 100644 talawa-mobile-docs/services_user_config/UserConfig/userLoggedIn.md create mode 100644 talawa-mobile-docs/services_user_config/services_user_config-library.md create mode 100644 talawa-mobile-docs/splash_screen/SplashScreen-class.md create mode 100644 talawa-mobile-docs/splash_screen/SplashScreen/SplashScreen.md create mode 100644 talawa-mobile-docs/splash_screen/SplashScreen/createState.md create mode 100644 talawa-mobile-docs/splash_screen/SplashScreen/mainScreenIndex.md create mode 100644 talawa-mobile-docs/splash_screen/splash_screen-library.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizations-class.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizations/AppLocalizations.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizations/delegate-constant.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizations/isTest.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizations/load.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizations/loadTest.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizations/locale.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizations/of.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizations/strictTranslate.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizations/translate.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate-class.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/AppLocalizationsDelegate.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/isSupported.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/isTest.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/load.md create mode 100644 talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/shouldReload.md create mode 100644 talawa-mobile-docs/utils_app_localization/utils_app_localization-library.md create mode 100644 talawa-mobile-docs/utils_chat_queries/ChatQueries-class.md create mode 100644 talawa-mobile-docs/utils_chat_queries/ChatQueries/ChatQueries.md create mode 100644 talawa-mobile-docs/utils_chat_queries/ChatQueries/fetchDirectChatMessagesByChatId.md create mode 100644 talawa-mobile-docs/utils_chat_queries/ChatQueries/fetchDirectChatsByUserId.md create mode 100644 talawa-mobile-docs/utils_chat_queries/ChatQueries/messageSentToDirectChatsubscription.md create mode 100644 talawa-mobile-docs/utils_chat_queries/ChatQueries/sendMessageToDirectChat.md create mode 100644 talawa-mobile-docs/utils_chat_queries/utils_chat_queries-library.md create mode 100644 talawa-mobile-docs/utils_comment_queries/CommentQueries-class.md create mode 100644 talawa-mobile-docs/utils_comment_queries/CommentQueries/CommentQueries.md create mode 100644 talawa-mobile-docs/utils_comment_queries/CommentQueries/createComment.md create mode 100644 talawa-mobile-docs/utils_comment_queries/CommentQueries/getPostsComments.md create mode 100644 talawa-mobile-docs/utils_comment_queries/utils_comment_queries-library.md create mode 100644 talawa-mobile-docs/utils_event_queries/EventQueries-class.md create mode 100644 talawa-mobile-docs/utils_event_queries/EventQueries/EventQueries.md create mode 100644 talawa-mobile-docs/utils_event_queries/EventQueries/addEvent.md create mode 100644 talawa-mobile-docs/utils_event_queries/EventQueries/deleteEvent.md create mode 100644 talawa-mobile-docs/utils_event_queries/EventQueries/fetchOrgEvents.md create mode 100644 talawa-mobile-docs/utils_event_queries/EventQueries/registerForEvent.md create mode 100644 talawa-mobile-docs/utils_event_queries/EventQueries/registrantsByEvent.md create mode 100644 talawa-mobile-docs/utils_event_queries/EventQueries/updateEvent.md create mode 100644 talawa-mobile-docs/utils_event_queries/utils_event_queries-library.md create mode 100644 talawa-mobile-docs/utils_post_queries/PostQueries-class.md create mode 100644 talawa-mobile-docs/utils_post_queries/PostQueries/PostQueries.md create mode 100644 talawa-mobile-docs/utils_post_queries/PostQueries/addLike.md create mode 100644 talawa-mobile-docs/utils_post_queries/PostQueries/getPostsById.md create mode 100644 talawa-mobile-docs/utils_post_queries/PostQueries/removeLike.md create mode 100644 talawa-mobile-docs/utils_post_queries/PostQueries/uploadPost.md create mode 100644 talawa-mobile-docs/utils_post_queries/utils_post_queries-library.md create mode 100644 talawa-mobile-docs/utils_queries/Queries-class.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/Queries.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/createDonation.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/fetchJoinInOrg.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/fetchJoinInOrgByName.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/fetchOrgById.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/fetchOrgDetailsById.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/fetchUserInfo.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/getPluginsList.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/joinOrgById.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/loginUser.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/logout.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/newUserLanguage.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/refreshToken.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/registerUser.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/saveFcmToken.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/sendMembershipRequest.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/updateLanguage.md create mode 100644 talawa-mobile-docs/utils_queries/Queries/userLanguage.md create mode 100644 talawa-mobile-docs/utils_queries/utils_queries-library.md create mode 100644 talawa-mobile-docs/utils_task_queries/TaskQueries-class.md create mode 100644 talawa-mobile-docs/utils_task_queries/TaskQueries/TaskQueries.md create mode 100644 talawa-mobile-docs/utils_task_queries/TaskQueries/addTask.md create mode 100644 talawa-mobile-docs/utils_task_queries/TaskQueries/deleteTask.md create mode 100644 talawa-mobile-docs/utils_task_queries/TaskQueries/editTask.md create mode 100644 talawa-mobile-docs/utils_task_queries/TaskQueries/eventTasks.md create mode 100644 talawa-mobile-docs/utils_task_queries/TaskQueries/userTasks.md create mode 100644 talawa-mobile-docs/utils_task_queries/utils_task_queries-library.md create mode 100644 talawa-mobile-docs/utils_validators/Validator-class.md create mode 100644 talawa-mobile-docs/utils_validators/Validator/Validator.md create mode 100644 talawa-mobile-docs/utils_validators/Validator/validateEmail.md create mode 100644 talawa-mobile-docs/utils_validators/Validator/validateEventForm.md create mode 100644 talawa-mobile-docs/utils_validators/Validator/validateFirstName.md create mode 100644 talawa-mobile-docs/utils_validators/Validator/validateLastName.md create mode 100644 talawa-mobile-docs/utils_validators/Validator/validatePassword.md create mode 100644 talawa-mobile-docs/utils_validators/Validator/validatePasswordConfirm.md create mode 100644 talawa-mobile-docs/utils_validators/Validator/validateURL.md create mode 100644 talawa-mobile-docs/utils_validators/Validator/validateUrlExistence.md create mode 100644 talawa-mobile-docs/utils_validators/utils_validators-library.md create mode 100644 talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/AccessScreenViewModel.md create mode 100644 talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/initialise.md create mode 100644 talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/optionalMessageController.md create mode 100644 talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/orgId.md create mode 100644 talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/organizations.md create mode 100644 talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/selectedOrganization.md create mode 100644 talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/sendMembershipRequest.md create mode 100644 talawa-mobile-docs/view_model_access_request_view_model/view_model_access_request_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/AddPostViewModel.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/controller.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/getImageFromGallery.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/imageFile.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/initialise.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/orgName.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/removeImage.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/titleController.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/uploadPost.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/userName.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/view_model_after_auth_view_models_add_post_view_models_add_post_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/DirectChatViewModel.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatMessagesByUser.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatName.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatState.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chats.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/dispose.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/getChatMessages.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/initialise.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/listKey.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/name.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/refreshChats.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/sendMessageToDirectChat.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/SelectContactViewModel.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/getCurrentOrgUsersList.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/initialise.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/orgMembersList.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/view_model_after_auth_view_models_chat_view_models_select_contact_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/CreateEventViewModel.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/buildUserList.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/createEvent.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/descriptionFocus.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventDescriptionTextController.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventEndDate.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventEndTime.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventLocationTextController.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventStartDate.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventStartTime.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventTitleTextController.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/formKey.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/getCurrentOrgUsersList.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/getImageFromGallery.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/imageFile.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/initialize.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/isPublicSwitch.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/isRegisterableSwitch.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/latitude.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/locationFocus.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/longitude.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/memberCheckedMap.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/orgMembersList.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/removeImage.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/removeUserFromList.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/selectedMembers.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/titleFocus.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/validate.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/view_model_after_auth_view_models_event_view_models_create_event_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/EditEventViewModel.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/descriptionFocus.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventDescriptionTextController.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventEndDate.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventEndTime.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventLocationTextController.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventStartDate.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventStartTime.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventTitleTextController.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/formKey.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/initialize.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/isPublicSwitch.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/isRegisterableSwitch.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/locationFocus.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/titleFocus.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/updateEvent.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/validate.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/view_model_after_auth_view_models_event_view_models_edit_event_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/EventInfoViewModel.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/event.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/exploreEventsInstance.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/fabTitle.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/getFabTitle.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/initialize.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/registerForEvent.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/registrants.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/view_model_after_auth_view_models_event_view_models_event_info_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/ExploreEventsViewModel.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/checkIfExistsAndAddNewEvent.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/choseValueFromDropdown.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/chosenValue.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/deleteEvent.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/dispose.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/emptyListMessage.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/eventService.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/events.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/fetchNewEvents.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/initialise.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/refreshEvents.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/view_model_after_auth_view_models_event_view_models_explore_events_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/OrganizationFeedViewModel.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/addNewPost.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/buildNewPosts.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/currentOrgName.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/dispose.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/fetchNewPosts.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/initialise.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/initializeWithDemoData.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/istest.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/navigateToIndividualPage.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/navigateToPinnedPostPage.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/pinnedPosts.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/posts.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/setCurrentOrganizationName.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/updatedPost.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/EditProfilePageViewModel.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/databaseService.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/firstNameFocus.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/firstNameTextController.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/getImageFromGallery.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/imageFile.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/initialize.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/lastNameFocus.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/lastNameTextController.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/removeImage.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/user.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/ProfilePageViewModel.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/attachListener.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/bottomSheetHeight.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/changeCurrency.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/currentOrg.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/currentUser.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/denomination.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/dominationButton.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationAmount.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationCurrency.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationCurrencySymbol.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationField.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/iconButton.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/initialize.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/invite.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/logout.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/organisation.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/popBottomSheet.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/scaffoldKey.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/showSnackBar.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/updateSheetHeight.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/url.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/user.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/view_model_after_auth_view_models_profile_view_models_profile_page_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/CreateTaskViewModel.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/createTask.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/dispose.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/editTask.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/fillTask.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskDescriptionTextController.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskEndDate.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskEndTime.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskTitleTextController.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/view_model_after_auth_view_models_task_view_models_create_task_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/ExploreTasksViewModel.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/deleteTask.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/fetchTasks.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/fetchTasksByUser.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/tasks.md create mode 100644 talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_base_view_model/BaseModel-class.md create mode 100644 talawa-mobile-docs/view_model_base_view_model/BaseModel/BaseModel.md create mode 100644 talawa-mobile-docs/view_model_base_view_model/BaseModel/isBusy.md create mode 100644 talawa-mobile-docs/view_model_base_view_model/BaseModel/setState.md create mode 100644 talawa-mobile-docs/view_model_base_view_model/BaseModel/state.md create mode 100644 talawa-mobile-docs/view_model_base_view_model/view_model_base_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_lang_view_model/AppLanguage-class.md create mode 100644 talawa-mobile-docs/view_model_lang_view_model/AppLanguage/AppLanguage.md create mode 100644 talawa-mobile-docs/view_model_lang_view_model/AppLanguage/appLanguageQuery.md create mode 100644 talawa-mobile-docs/view_model_lang_view_model/AppLanguage/appLocal.md create mode 100644 talawa-mobile-docs/view_model_lang_view_model/AppLanguage/changeLanguage.md create mode 100644 talawa-mobile-docs/view_model_lang_view_model/AppLanguage/databaseFunctions.md create mode 100644 talawa-mobile-docs/view_model_lang_view_model/AppLanguage/dbLanguageUpdate.md create mode 100644 talawa-mobile-docs/view_model_lang_view_model/AppLanguage/fetchLocale.md create mode 100644 talawa-mobile-docs/view_model_lang_view_model/AppLanguage/initialize.md create mode 100644 talawa-mobile-docs/view_model_lang_view_model/AppLanguage/isTest.md create mode 100644 talawa-mobile-docs/view_model_lang_view_model/AppLanguage/navigationService.md create mode 100644 talawa-mobile-docs/view_model_lang_view_model/AppLanguage/selectLanguagePress.md create mode 100644 talawa-mobile-docs/view_model_lang_view_model/AppLanguage/userLanguageQuery.md create mode 100644 talawa-mobile-docs/view_model_lang_view_model/view_model_lang_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/MainScreenViewModel.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/context.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/currentPageIndex.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/fetchAndAddPlugins.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/focusTarget.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/initialise.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNChat.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNEvents.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNHome.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNPost.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNProfile.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerCurOrg.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerJoinOrg.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerLeaveCurrentOrg.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerSwitchableOrg.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySEAdd.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySECard.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySECategoryMenu.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySEDateFilter.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHMenuIcon.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHOrgName.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHPinnedPost.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHPost.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPAppSetting.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPDonateUs.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPEditProfile.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPHelp.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPInvite.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPLogout.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPPalisadoes.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/navBarItems.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/onTabTapped.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/pages.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/pluginList.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/pluginPrototypeData.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/scaffoldKey.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/showAppTour.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/showHome.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/showTutorial.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/targets.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourAddPost.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourChat.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourComplete.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourEventTargets.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourHomeTargets.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourProfile.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourSkipped.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tutorialCoachMark.md create mode 100644 talawa-mobile-docs/view_model_main_screen_view_model/view_model_main_screen_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/LoginViewModel.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/email.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/emailFocus.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/formKey.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/greeting.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/hidePassword.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/initialize.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/login.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/password.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/passwordFocus.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/validate.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/view_model_pre_auth_view_models_login_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/SelectOrganizationViewModel.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/allOrgController.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/controller.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/fetchMoreHelper.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/initialise.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/onTapContinue.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/onTapJoin.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/orgId.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/organizations.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/qrKey.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/result.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchActive.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchController.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchFocus.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searching.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/selectOrg.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/selectedOrganization.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/showSearchOrgList.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/view_model_pre_auth_view_models_select_organization_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/SetUrlViewModel.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/checkURLandNavigate.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/checkURLandShowPopUp.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/formKey.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/greeting.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/imageUrlKey-constant.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/initialise.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/orgId.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/qrKey.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/result.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/scanQR.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/url.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/urlFocus.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/urlKey-constant.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/validate.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/view_model_pre_auth_view_models_set_url_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/SignupDetailsViewModel.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/confirmFocus.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/confirmPassword.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/email.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/firstName.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/formKey.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/greeting.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/hidePassword.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/initialise.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/lastName.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/password.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/selectedOrganization.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/signUp.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/validate.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/view_model_pre_auth_view_models_signup_details_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/WaitingViewModel.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/currentUser.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/greeting.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/initialise.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/joinOrg.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/logout.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/pendingRequestOrg.md create mode 100644 talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/view_model_pre_auth_view_models_waiting_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_theme_view_model/AppTheme-class.md create mode 100644 talawa-mobile-docs/view_model_theme_view_model/AppTheme/AppTheme.md create mode 100644 talawa-mobile-docs/view_model_theme_view_model/AppTheme/initialize.md create mode 100644 talawa-mobile-docs/view_model_theme_view_model/AppTheme/isdarkTheme.md create mode 100644 talawa-mobile-docs/view_model_theme_view_model/AppTheme/key.md create mode 100644 talawa-mobile-docs/view_model_theme_view_model/AppTheme/switchTheme.md create mode 100644 talawa-mobile-docs/view_model_theme_view_model/view_model_theme_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/CommentsViewModel.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/addCommentLocally.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/commentList.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/createComment.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/getComments.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/initialise.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/postId.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/view_model_widgets_view_models_comments_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/CustomDrawerViewModel.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/controller.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/dispose.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/initialize.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/isPresentinSwitchableOrg.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/notifyListeners.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/selectedOrg.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/setSelectedOrganizationName.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/switchAbleOrg.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/switchOrg.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/targets.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/tutorialCoachMark.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/view_model_widgets_view_models_custom_drawer_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_event_card_view_model/view_model_widgets_view_models_event_card_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/LikeButtonViewModel.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/checkAndSetTheIsLiked.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/dispose.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/initialize.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/isLiked.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/likedBy.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/likesCount.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/setIsLiked.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/toggleIsLiked.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/updatePost.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/view_model_widgets_view_models_like_button_view_model-library.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel-class.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/ProgressDialogViewModel.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/connectivityPresent.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/connectivityResult.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/initialise.md create mode 100644 talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/view_model_widgets_view_models_progress_dialog_view_model-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost/AddPost.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost/drawerKey.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_add_post_page/model.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_add_post_page/views_after_auth_screens_add_post_page-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage/AppSettingsPage.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage/createState.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/views_after_auth_screens_app_settings_app_settings_page-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/ChatPage-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/ChatPage/ChatPage.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/ChatPage/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/views_after_auth_screens_chat_chat_list_screen-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/ChatMessageScreen.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/chatId.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/model.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/views_after_auth_screens_chat_chat_message_screen-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/ChatTile.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/chat.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/model.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/DirectChats-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/DirectChats/DirectChats.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/DirectChats/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/views_after_auth_screens_chat_direct_chats-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_event_chats/EventChats-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_event_chats/EventChats/EventChats.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_event_chats/EventChats/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_event_chats/views_after_auth_screens_chat_event_chats-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_select_contact/SelectContact-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_select_contact/SelectContact/SelectContact.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_select_contact/SelectContact/createState.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_select_contact/views_after_auth_screens_chat_select_contact-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/ChatInputField.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/chatId.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/createState.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/model.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/views_after_auth_screens_chat_widgets_chat_input_field-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/Message-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/Message/Message.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/Message/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/views_after_auth_screens_chat_widgets_chat_message_bubble-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm/CreateEventForm.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm/model.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_create_event_form/views_after_auth_screens_events_create_event_form-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_create_event_page/CreateEventPage-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_create_event_page/CreateEventPage/CreateEventPage.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_create_event_page/CreateEventPage/createState.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_create_event_page/views_after_auth_screens_events_create_event_page-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage/EditEventPage.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage/createState.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage/event.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/views_after_auth_screens_events_edit_event_page-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm/EditEventForm.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm/model.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/views_after_auth_screens_events_edit_events_form-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar/EventCalendar.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar/createState.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar/eventList.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_event_calendar/views_after_auth_screens_events_event_calendar-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_event_info_body/EventInfoBody-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_event_info_body/EventInfoBody/EventInfoBody.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_event_info_body/EventInfoBody/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_event_info_body/views_after_auth_screens_events_event_info_body-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage/EventInfoPage.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage/args.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage/createState.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_event_info_page/views_after_auth_screens_events_event_info_page-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog/ExploreEventDialog.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog/createState.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/views_after_auth_screens_events_explore_event_dialogue-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/ExploreEvents.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/dropDownList.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/homeModel.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_events_explore_events/views_after_auth_screens_events_explore_events-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate/CommentTemplate.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate/comment.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/IndividualPageLikeSection.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/usersLiked.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/IndividualPostCommentSection.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/comments.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/postID.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView/IndividualPostView.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView/createState.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView/post.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/buildPadding.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/likedUserCircleAvatar.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_individual_post/views_after_auth_screens_feed_individual_post-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/OrganizationFeed.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/forTest.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/homeModel.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/views_after_auth_screens_feed_organization_feed-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/PinnedPostPage.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/pinnedPosts.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/views_after_auth_screens_feed_pinned_post_page-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/SendAccessRequest.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/org.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/views_after_auth_screens_join_org_after_auth_access_request_screen-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/JoinOrganisationAfterAuth.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/orgId.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/scanQR.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/EditProfilePage-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/EditProfilePage/EditProfilePage.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/EditProfilePage/createState.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/views_after_auth_screens_profile_edit_profile_page-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/ProfilePage.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/donate.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/homeModel.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_profile_profile_page/views_after_auth_screens_profile_profile_page-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage/CreateTaskPage.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage/eventId.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/views_after_auth_screens_tasks_create_task_page-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage/EditTaskPage.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage/task.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/views_after_auth_screens_tasks_edit_task_page-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/EventTasksPage.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/eventId.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/views_after_auth_screens_tasks_event_tasks_page-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/UserTasksPage-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/UserTasksPage/UserTasksPage.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/UserTasksPage/build.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/views_after_auth_screens_tasks_user_tasks_page-library.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen-class.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/MapScreen.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/createState.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/latitude.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/longitude.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/model.md create mode 100644 talawa-mobile-docs/views_after_auth_screens_venue_map_screen/views_after_auth_screens_venue_map_screen-library.md create mode 100644 talawa-mobile-docs/views_base_view/BaseView-class.md create mode 100644 talawa-mobile-docs/views_base_view/BaseView/BaseView.md create mode 100644 talawa-mobile-docs/views_base_view/BaseView/builder.md create mode 100644 talawa-mobile-docs/views_base_view/BaseView/createState.md create mode 100644 talawa-mobile-docs/views_base_view/BaseView/onModelReady.md create mode 100644 talawa-mobile-docs/views_base_view/views_base_view-library.md create mode 100644 talawa-mobile-docs/views_main_screen/MainScreen-class.md create mode 100644 talawa-mobile-docs/views_main_screen/MainScreen/MainScreen.md create mode 100644 talawa-mobile-docs/views_main_screen/MainScreen/createState.md create mode 100644 talawa-mobile-docs/views_main_screen/MainScreen/mainScreenArgs.md create mode 100644 talawa-mobile-docs/views_main_screen/views_main_screen-library.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_change_password/ChangePass-class.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_change_password/ChangePass/ChangePass.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_change_password/ChangePass/createState.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_change_password/views_pre_auth_screens_change_password-library.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_login/Login-class.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_login/Login/Login.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_login/Login/createState.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_login/views_pre_auth_screens_login-library.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_recover/Recover-class.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_recover/Recover/Recover.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_recover/Recover/createState.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_recover/views_pre_auth_screens_recover-library.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_select_language/SelectLanguage-class.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_select_language/SelectLanguage/SelectLanguage.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_select_language/SelectLanguage/createState.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_select_language/views_pre_auth_screens_select_language-library.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization-class.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization/SelectOrganization.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization/createState.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization/selectedOrgId.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_select_organization/views_pre_auth_screens_select_organization-library.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl-class.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl/SetUrl.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl/createState.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl/uri.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_set_url/views_pre_auth_screens_set_url-library.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails-class.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails/SignUpDetails.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails/createState.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails/selectedOrg.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_signup_details/views_pre_auth_screens_signup_details-library.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/WaitingPage-class.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/WaitingPage/WaitingPage.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/WaitingPage/build.md create mode 100644 talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/views_pre_auth_screens_waiting_to_join_private_org-library.md create mode 100644 talawa-mobile-docs/widgets_add_members_bottom_sheet/EventBottomSheet-class.md create mode 100644 talawa-mobile-docs/widgets_add_members_bottom_sheet/EventBottomSheet/EventBottomSheet.md create mode 100644 talawa-mobile-docs/widgets_add_members_bottom_sheet/EventBottomSheet/addUserBottomSheet.md create mode 100644 talawa-mobile-docs/widgets_add_members_bottom_sheet/widgets_add_members_bottom_sheet-library.md create mode 100644 talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog-class.md create mode 100644 talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/CustomAlertDialog.md create mode 100644 talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/build.md create mode 100644 talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/dialogSubTitle.md create mode 100644 talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/dialogTitle.md create mode 100644 talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/reverse.md create mode 100644 talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/secondaryButtonTap.md create mode 100644 talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/secondaryButtonText.md create mode 100644 talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/success.md create mode 100644 talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/successText.md create mode 100644 talawa-mobile-docs/widgets_custom_alert_dialog/widgets_custom_alert_dialog-library.md create mode 100644 talawa-mobile-docs/widgets_custom_avatar/CustomAvatar-class.md create mode 100644 talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/CustomAvatar.md create mode 100644 talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/build.md create mode 100644 talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/cacheManager.md create mode 100644 talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/firstAlphabet.md create mode 100644 talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/fontSize.md create mode 100644 talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/imageUrl.md create mode 100644 talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/isImageNull.md create mode 100644 talawa-mobile-docs/widgets_custom_avatar/widgets_custom_avatar-library.md create mode 100644 talawa-mobile-docs/widgets_custom_drawer/CustomDrawer-class.md create mode 100644 talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/CustomDrawer.md create mode 100644 talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/build.md create mode 100644 talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/exitButton.md create mode 100644 talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/homeModel.md create mode 100644 talawa-mobile-docs/widgets_custom_drawer/widgets_custom_drawer-library.md create mode 100644 talawa-mobile-docs/widgets_custom_list_tile/CustomListTile-class.md create mode 100644 talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/CustomListTile.md create mode 100644 talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/build.md create mode 100644 talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/index.md create mode 100644 talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/onTapOption.md create mode 100644 talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/onTapOrgInfo.md create mode 100644 talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/onTapUserInfo.md create mode 100644 talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/option.md create mode 100644 talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/orgInfo.md create mode 100644 talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/showIcon.md create mode 100644 talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/type.md create mode 100644 talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/userInfo.md create mode 100644 talawa-mobile-docs/widgets_custom_list_tile/widgets_custom_list_tile-library.md create mode 100644 talawa-mobile-docs/widgets_custom_progress_dialog/CustomProgressDialog-class.md create mode 100644 talawa-mobile-docs/widgets_custom_progress_dialog/CustomProgressDialog/CustomProgressDialog.md create mode 100644 talawa-mobile-docs/widgets_custom_progress_dialog/CustomProgressDialog/build.md create mode 100644 talawa-mobile-docs/widgets_custom_progress_dialog/widgets_custom_progress_dialog-library.md create mode 100644 talawa-mobile-docs/widgets_date_time_picker/customDatePicker.md create mode 100644 talawa-mobile-docs/widgets_date_time_picker/customTimePicker.md create mode 100644 talawa-mobile-docs/widgets_date_time_picker/widgets_date_time_picker-library.md create mode 100644 talawa-mobile-docs/widgets_event_card/EventCard-class.md create mode 100644 talawa-mobile-docs/widgets_event_card/EventCard/EventCard.md create mode 100644 talawa-mobile-docs/widgets_event_card/EventCard/build.md create mode 100644 talawa-mobile-docs/widgets_event_card/EventCard/event.md create mode 100644 talawa-mobile-docs/widgets_event_card/EventCard/eventTitleHighlightedText.md create mode 100644 talawa-mobile-docs/widgets_event_card/EventCard/eventTitleNormalText.md create mode 100644 talawa-mobile-docs/widgets_event_card/EventCard/isSearchItem.md create mode 100644 talawa-mobile-docs/widgets_event_card/widgets_event_card-library.md create mode 100644 talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile-class.md create mode 100644 talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/DateTimeTile.md create mode 100644 talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/build.md create mode 100644 talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/date.md create mode 100644 talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/setDate.md create mode 100644 talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/setTime.md create mode 100644 talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/time.md create mode 100644 talawa-mobile-docs/widgets_event_date_time_tile/widgets_event_date_time_tile-library.md create mode 100644 talawa-mobile-docs/widgets_event_search_delegate/EventSearch-class.md create mode 100644 talawa-mobile-docs/widgets_event_search_delegate/EventSearch/EventSearch.md create mode 100644 talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildActions.md create mode 100644 talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildLeading.md create mode 100644 talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildResults.md create mode 100644 talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildSuggestions.md create mode 100644 talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildSuggestionsSucess.md create mode 100644 talawa-mobile-docs/widgets_event_search_delegate/EventSearch/eventList.md create mode 100644 talawa-mobile-docs/widgets_event_search_delegate/EventSearch/exploreEventsViewModel.md create mode 100644 talawa-mobile-docs/widgets_event_search_delegate/widgets_event_search_delegate-library.md create mode 100644 talawa-mobile-docs/widgets_from_palisadoes/FromPalisadoes-class.md create mode 100644 talawa-mobile-docs/widgets_from_palisadoes/FromPalisadoes/FromPalisadoes.md create mode 100644 talawa-mobile-docs/widgets_from_palisadoes/FromPalisadoes/build.md create mode 100644 talawa-mobile-docs/widgets_from_palisadoes/widgets_from_palisadoes-library.md create mode 100644 talawa-mobile-docs/widgets_invite_child/iconButton.md create mode 100644 talawa-mobile-docs/widgets_invite_child/invite.md create mode 100644 talawa-mobile-docs/widgets_invite_child/widgets_invite_child-library.md create mode 100644 talawa-mobile-docs/widgets_lang_switch/LanguageTile-class.md create mode 100644 talawa-mobile-docs/widgets_lang_switch/LanguageTile/LanguageTile.md create mode 100644 talawa-mobile-docs/widgets_lang_switch/LanguageTile/build.md create mode 100644 talawa-mobile-docs/widgets_lang_switch/widgets_lang_switch-library.md create mode 100644 talawa-mobile-docs/widgets_member_name_tile/MemberNameTile-class.md create mode 100644 talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/MemberNameTile.md create mode 100644 talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/build.md create mode 100644 talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/onDelete.md create mode 100644 talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/userImage.md create mode 100644 talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/userName.md create mode 100644 talawa-mobile-docs/widgets_member_name_tile/widgets_member_name_tile-library.md create mode 100644 talawa-mobile-docs/widgets_organization_list/OrganizationList-class.md create mode 100644 talawa-mobile-docs/widgets_organization_list/OrganizationList/OrganizationList.md create mode 100644 talawa-mobile-docs/widgets_organization_list/OrganizationList/build.md create mode 100644 talawa-mobile-docs/widgets_organization_list/OrganizationList/model.md create mode 100644 talawa-mobile-docs/widgets_organization_list/widgets_organization_list-library.md create mode 100644 talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList-class.md create mode 100644 talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList/OrganizationSearchList.md create mode 100644 talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList/build.md create mode 100644 talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList/model.md create mode 100644 talawa-mobile-docs/widgets_organization_search_list/widgets_organization_search_list-library.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller-class.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/CustomCarouselScroller.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/createState.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/navigateToIndividualPostPage.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/pinnedPosts.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState-class.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState/CustomCarouselScrollerState.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState/controller.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState/pindex.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel-class.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/PinnedPostCarousel.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/build.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/navigateToIndividualPostPage.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/navigateToPinnedPostPage.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/pinnedPosts.md create mode 100644 talawa-mobile-docs/widgets_pinned_carousel_widget/widgets_pinned_carousel_widget-library.md create mode 100644 talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget-class.md create mode 100644 talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget/DescriptionTextWidget.md create mode 100644 talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget/createState.md create mode 100644 talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget/text.md create mode 100644 talawa-mobile-docs/widgets_post_detailed_page/widgets_post_detailed_page-library.md create mode 100644 talawa-mobile-docs/widgets_post_list_widget/PostListWidget-class.md create mode 100644 talawa-mobile-docs/widgets_post_list_widget/PostListWidget/PostListWidget.md create mode 100644 talawa-mobile-docs/widgets_post_list_widget/PostListWidget/build.md create mode 100644 talawa-mobile-docs/widgets_post_list_widget/PostListWidget/function.md create mode 100644 talawa-mobile-docs/widgets_post_list_widget/PostListWidget/posts.md create mode 100644 talawa-mobile-docs/widgets_post_list_widget/widgets_post_list_widget-library.md create mode 100644 talawa-mobile-docs/widgets_post_widget/NewsPost-class.md create mode 100644 talawa-mobile-docs/widgets_post_widget/NewsPost/NewsPost.md create mode 100644 talawa-mobile-docs/widgets_post_widget/NewsPost/build.md create mode 100644 talawa-mobile-docs/widgets_post_widget/NewsPost/function.md create mode 100644 talawa-mobile-docs/widgets_post_widget/NewsPost/post.md create mode 100644 talawa-mobile-docs/widgets_post_widget/PostContainer-class.md create mode 100644 talawa-mobile-docs/widgets_post_widget/PostContainer/PostContainer.md create mode 100644 talawa-mobile-docs/widgets_post_widget/PostContainer/createState.md create mode 100644 talawa-mobile-docs/widgets_post_widget/PostContainer/id.md create mode 100644 talawa-mobile-docs/widgets_post_widget/PostContainerState-class.md create mode 100644 talawa-mobile-docs/widgets_post_widget/PostContainerState/PostContainerState.md create mode 100644 talawa-mobile-docs/widgets_post_widget/PostContainerState/controller.md create mode 100644 talawa-mobile-docs/widgets_post_widget/PostContainerState/dispose.md create mode 100644 talawa-mobile-docs/widgets_post_widget/PostContainerState/inView.md create mode 100644 talawa-mobile-docs/widgets_post_widget/PostContainerState/initState.md create mode 100644 talawa-mobile-docs/widgets_post_widget/PostContainerState/pindex.md create mode 100644 talawa-mobile-docs/widgets_post_widget/PostContainerState/startedPlaying.md create mode 100644 talawa-mobile-docs/widgets_post_widget/widgets_post_widget-library.md create mode 100644 talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton-class.md create mode 100644 talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/RaisedRoundedButton.md create mode 100644 talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/backgroundColor.md create mode 100644 talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/buttonLabel.md create mode 100644 talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/createState.md create mode 100644 talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/height.md create mode 100644 talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/onTap.md create mode 100644 talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/showArrow.md create mode 100644 talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/textColor.md create mode 100644 talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/width.md create mode 100644 talawa-mobile-docs/widgets_raised_round_edge_button/widgets_raised_round_edge_button-library.md create mode 100644 talawa-mobile-docs/widgets_rich_text/CustomRichText-class.md create mode 100644 talawa-mobile-docs/widgets_rich_text/CustomRichText/CustomRichText.md create mode 100644 talawa-mobile-docs/widgets_rich_text/CustomRichText/build.md create mode 100644 talawa-mobile-docs/widgets_rich_text/CustomRichText/words.md create mode 100644 talawa-mobile-docs/widgets_rich_text/widgets_rich_text-library.md create mode 100644 talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator-class.md create mode 100644 talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/SignupProgressIndicator.md create mode 100644 talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/build.md create mode 100644 talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/currentPageIndex.md create mode 100644 talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/progressLabel.md create mode 100644 talawa-mobile-docs/widgets_signup_progress_indicator/widgets_signup_progress_indicator-library.md create mode 100644 talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog-class.md create mode 100644 talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/TalawaErrorDialog.md create mode 100644 talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/build.md create mode 100644 talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/errorMessage.md create mode 100644 talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/messageType.md create mode 100644 talawa-mobile-docs/widgets_talawa_error_dialog/widgets_talawa_error_dialog-library.md create mode 100644 talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar-class.md create mode 100644 talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/TalawaErrorSnackBar.md create mode 100644 talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/build.md create mode 100644 talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/errorMessage.md create mode 100644 talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/messageType.md create mode 100644 talawa-mobile-docs/widgets_talawa_error_snackbar/widgets_talawa_error_snackbar-library.md create mode 100644 talawa-mobile-docs/widgets_task_form/DescriptionField-class.md create mode 100644 talawa-mobile-docs/widgets_task_form/DescriptionField/DescriptionField.md create mode 100644 talawa-mobile-docs/widgets_task_form/DescriptionField/build.md create mode 100644 talawa-mobile-docs/widgets_task_form/TaskForm-class.md create mode 100644 talawa-mobile-docs/widgets_task_form/TaskForm/TaskForm.md create mode 100644 talawa-mobile-docs/widgets_task_form/TaskForm/actionText.md create mode 100644 talawa-mobile-docs/widgets_task_form/TaskForm/createState.md create mode 100644 talawa-mobile-docs/widgets_task_form/TaskForm/onSave.md create mode 100644 talawa-mobile-docs/widgets_task_form/TaskForm/title.md create mode 100644 talawa-mobile-docs/widgets_task_form/TitleField-class.md create mode 100644 talawa-mobile-docs/widgets_task_form/TitleField/TitleField.md create mode 100644 talawa-mobile-docs/widgets_task_form/TitleField/build.md create mode 100644 talawa-mobile-docs/widgets_task_form/widgets_task_form-library.md create mode 100644 talawa-mobile-docs/widgets_task_schedule/TaskCard-class.md create mode 100644 talawa-mobile-docs/widgets_task_schedule/TaskCard/TaskCard.md create mode 100644 talawa-mobile-docs/widgets_task_schedule/TaskCard/appointment.md create mode 100644 talawa-mobile-docs/widgets_task_schedule/TaskCard/build.md create mode 100644 talawa-mobile-docs/widgets_task_schedule/TaskCard/showMoreOptions.md create mode 100644 talawa-mobile-docs/widgets_task_schedule/TaskCard/task.md create mode 100644 talawa-mobile-docs/widgets_task_schedule/TaskSchedule-class.md create mode 100644 talawa-mobile-docs/widgets_task_schedule/TaskSchedule/TaskSchedule.md create mode 100644 talawa-mobile-docs/widgets_task_schedule/TaskSchedule/build.md create mode 100644 talawa-mobile-docs/widgets_task_schedule/TaskSchedule/calendarTapped.md create mode 100644 talawa-mobile-docs/widgets_task_schedule/TaskSchedule/showMoreOptions.md create mode 100644 talawa-mobile-docs/widgets_task_schedule/TaskSchedule/tasks.md create mode 100644 talawa-mobile-docs/widgets_task_schedule/widgets_task_schedule-library.md create mode 100644 talawa-mobile-docs/widgets_theme_switch/ChangeThemeTile-class.md create mode 100644 talawa-mobile-docs/widgets_theme_switch/ChangeThemeTile/ChangeThemeTile.md create mode 100644 talawa-mobile-docs/widgets_theme_switch/ChangeThemeTile/build.md create mode 100644 talawa-mobile-docs/widgets_theme_switch/widgets_theme_switch-library.md create mode 100644 talawa-mobile-docs/widgets_video_widget/VideoWidget-class.md create mode 100644 talawa-mobile-docs/widgets_video_widget/VideoWidget/VideoWidget.md create mode 100644 talawa-mobile-docs/widgets_video_widget/VideoWidget/createState.md create mode 100644 talawa-mobile-docs/widgets_video_widget/VideoWidget/play.md create mode 100644 talawa-mobile-docs/widgets_video_widget/VideoWidget/url.md create mode 100644 talawa-mobile-docs/widgets_video_widget/widgets_video_widget-library.md create mode 100644 talawa_lint/bin/talawa_lint.dart create mode 100644 talawa_lint/lib/helpers.dart create mode 100644 talawa_lint/lib/talawa_api_doc/talawa_api_doc.dart create mode 100644 talawa_lint/lib/talawa_api_doc/talawa_api_doc_fixer.dart create mode 100644 talawa_lint/lib/talawa_api_doc/talawa_api_doc_visitor.dart create mode 100644 talawa_lint/lib/talawa_good_doc/talawa_good_doc.dart create mode 100644 talawa_lint/lib/talawa_good_doc/talawa_good_doc_visitor.dart create mode 100644 talawa_lint/lib/talawa_lint.dart create mode 100644 talawa_lint/lib/talawa_lint_rules.dart create mode 100644 talawa_lint/pubspec.lock create mode 100644 talawa_lint/pubspec.yaml create mode 100644 test/flutter_test_config.dart create mode 100644 test/helpers/setup_firebase_mocks.dart create mode 100644 test/helpers/setup_hive.dart create mode 100644 test/helpers/setup_hive.mocks.dart create mode 100644 test/helpers/talawa_plugin_provider_test.dart create mode 100644 test/helpers/test_helpers.dart create mode 100644 test/helpers/test_helpers.mocks.dart create mode 100644 test/helpers/test_locator.dart create mode 100644 test/model_tests/app_tour_test.dart create mode 100644 test/model_tests/chat/chat_list_tile_data_model_test.dart create mode 100644 test/model_tests/chat/chat_message_test.dart create mode 100644 test/model_tests/chat/chat_user_test.dart create mode 100644 test/model_tests/chats/chat_message_test.dart create mode 100644 test/model_tests/comment/comment_model_test.dart create mode 100644 test/model_tests/events/event_model_test.dart create mode 100644 test/model_tests/mainscreen_navigation_args_test.dart create mode 100644 test/model_tests/organization/org_info_address_test.dart create mode 100644 test/model_tests/organization/org_info_test.dart create mode 100644 test/model_tests/post/post_model_test.dart create mode 100644 test/model_tests/user/user_info_test.dart create mode 100644 test/plugins/fetch_plugin_list_test.dart create mode 100644 test/plugins/talawa_plugin_provider_test.dart create mode 100644 test/router_test.dart create mode 100644 test/service_tests/chat_service_test.dart create mode 100644 test/service_tests/comment_service_test.dart create mode 100644 test/service_tests/database_mutations_function_test.dart create mode 100644 test/service_tests/event_service_test.dart create mode 100644 test/service_tests/graphql_config_test.dart create mode 100644 test/service_tests/image_service_test.dart create mode 100644 test/service_tests/multi_media_pick_service_test.dart create mode 100644 test/service_tests/navigation_service_test.dart create mode 100644 test/service_tests/org_service_test.dart create mode 100644 test/service_tests/post_service_test.dart create mode 100644 test/service_tests/session_manager_test.dart create mode 100644 test/service_tests/size_config_test.dart create mode 100644 test/service_tests/user_config_test.dart create mode 100644 test/utils/app_localization_test.dart create mode 100644 test/utils/comment_queries_test.dart create mode 100644 test/utils/encryptor_test.dart create mode 100644 test/utils/event_queries_test.dart create mode 100644 test/utils/post_queries_test.dart create mode 100644 test/utils_tests/chat_queries_test.dart create mode 100644 test/utils_tests/queries_test.dart create mode 100644 test/utils_tests/validators_test.dart create mode 100644 test/view_model_tests/access_request_view_model_test.dart create mode 100644 test/view_model_tests/after_auth_view_model_tests/add_post_view_model_test.dart create mode 100644 test/view_model_tests/after_auth_view_model_tests/chat_view_models_test/direct_chat_view_model_test.dart create mode 100644 test/view_model_tests/after_auth_view_model_tests/chat_view_models_test/select_contact_view_model_test.dart create mode 100644 test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/create_event_view_model_test.dart create mode 100644 test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/edit_event_view_model_test.dart create mode 100644 test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/event_info_view_model_test.dart create mode 100644 test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/explore_events_view_model_test.dart create mode 100644 test/view_model_tests/after_auth_view_model_tests/feed_view_models_test/organization_feed_view_model_test.dart create mode 100644 test/view_model_tests/after_auth_view_model_tests/profile_view_model_tests/edit_profile_view_model_test.dart create mode 100644 test/view_model_tests/after_auth_view_model_tests/profile_view_model_tests/profile_page_view_model_test.dart create mode 100644 test/view_model_tests/after_auth_view_model_tests/settings_view_models_test/app_setting_view_model_test.dart create mode 100644 test/view_model_tests/base_view_model_test.dart create mode 100644 test/view_model_tests/custom_drawer_view_model_test.dart create mode 100644 test/view_model_tests/lang_view_model_test.dart create mode 100644 test/view_model_tests/main_screen_view_model_test.dart create mode 100644 test/view_model_tests/pre_auth_view_models/login_view_model_test.dart create mode 100644 test/view_model_tests/pre_auth_view_models/select_organization_view_model_test.dart create mode 100644 test/view_model_tests/pre_auth_view_models/set_url_view_model_test.dart create mode 100644 test/view_model_tests/pre_auth_view_models/signup_details_view_model_test.dart create mode 100644 test/view_model_tests/pre_auth_view_models/waiting_view_model_test.dart create mode 100644 test/view_model_tests/progress_dialog_view_model_test.dart create mode 100644 test/view_model_tests/signup_details_view_model_test.dart create mode 100644 test/view_model_tests/theme_view_model_test.dart create mode 100644 test/view_model_tests/widgets_view_model_test/comments_view_model_test.dart create mode 100644 test/view_model_tests/widgets_view_model_test/like_button_view_model_test.dart create mode 100644 test/views/after_auth_screens/add_post_page_test.dart create mode 100644 test/views/after_auth_screens/chat/chat_message_screen_test/chat_message_screen_test.dart create mode 100644 test/views/after_auth_screens/chat/select_contact_test.dart create mode 100644 test/views/after_auth_screens/chat/widgets/chat_input_field_test.dart create mode 100644 test/views/after_auth_screens/chat/widgets/chat_message_bubble.dart create mode 100644 test/views/after_auth_screens/events/create_custom_recurring_event_test.dart create mode 100644 test/views/after_auth_screens/events/create_event_page_test.dart create mode 100644 test/views/after_auth_screens/events/event_filter_bottomsheet_test.dart create mode 100644 test/views/after_auth_screens/events/event_info_body_test.dart create mode 100644 test/views/after_auth_screens/feed/individual_post_test.dart create mode 100644 test/views/after_auth_screens/feed/pinned_post_screen.dart create mode 100644 test/views/after_auth_screens/join_org_after_auth_test/access_request_screen_test.dart create mode 100644 test/views/after_auth_screens/join_org_after_auth_test/join_organisation_after_auth_test.dart create mode 100644 test/views/after_auth_screens/org_info_screen_test.dart create mode 100644 test/views/after_auth_screens/profile/profile_page_test.dart create mode 100644 test/views/after_auth_screens/profile/user_event_test.dart create mode 100644 test/views/after_auth_screens/profile/user_feed_test.dart create mode 100644 test/views/demo_screens/explore_events_demo_test.dart create mode 100644 test/views/demo_screens/organization_feed_demo_test.dart create mode 100644 test/views/demo_screens/profile_page_demo_test.dart create mode 100644 test/views/helpers/test_locator.dart create mode 100644 test/views/main_screen_test.dart create mode 100644 test/widget_tests/after_auth_screens/app_settings/app_setting_page_test.dart create mode 100644 test/widget_tests/after_auth_screens/chat/direct_chats_test.dart create mode 100644 test/widget_tests/after_auth_screens/events/create_event_form_test.dart create mode 100644 test/widget_tests/after_auth_screens/events/create_event_page_test.dart create mode 100644 test/widget_tests/after_auth_screens/events/edit_event_page_test.dart create mode 100644 test/widget_tests/after_auth_screens/events/edit_events_form_test.dart create mode 100644 test/widget_tests/after_auth_screens/events/event_calendar_test.dart create mode 100644 test/widget_tests/after_auth_screens/events/event_info_page_test.dart create mode 100644 test/widget_tests/after_auth_screens/events/explore_event_dialogue_test.dart create mode 100644 test/widget_tests/after_auth_screens/events/explore_events_test.dart create mode 100644 test/widget_tests/after_auth_screens/feed/individual_post_test.dart create mode 100644 test/widget_tests/after_auth_screens/feed/organization_feed_test.dart create mode 100644 test/widget_tests/after_auth_screens/feed/pinned_post_page_test.dart create mode 100644 test/widget_tests/after_auth_screens/feed/pinned_post_screen_test.dart create mode 100644 test/widget_tests/after_auth_screens/profile/edit_profile_page_test.dart create mode 100644 test/widget_tests/pre_auth_screens/change_password_page_test.dart create mode 100644 test/widget_tests/pre_auth_screens/login_test.dart create mode 100644 test/widget_tests/pre_auth_screens/recover_page_test.dart create mode 100644 test/widget_tests/pre_auth_screens/select_language_page_test.dart create mode 100644 test/widget_tests/pre_auth_screens/select_organization_test.dart create mode 100644 test/widget_tests/pre_auth_screens/set_url_page_test.dart create mode 100644 test/widget_tests/pre_auth_screens/signup_details_test.dart create mode 100644 test/widget_tests/pre_auth_screens/signup_progress_indicator_test.dart create mode 100644 test/widget_tests/pre_auth_screens/splash_screen_test.dart create mode 100644 test/widget_tests/pre_auth_screens/waiting_page_test.dart create mode 100644 test/widget_tests/widgets/custom_alert_dialog_test.dart create mode 100644 test/widget_tests/widgets/custom_avatar_test.dart create mode 100644 test/widget_tests/widgets/custom_drawer_test.dart create mode 100644 test/widget_tests/widgets/custom_list_tile_test.dart create mode 100644 test/widget_tests/widgets/custom_progress_dialog_test.dart create mode 100644 test/widget_tests/widgets/date_time_picker_test.dart create mode 100644 test/widget_tests/widgets/event_card_test.dart create mode 100644 test/widget_tests/widgets/event_date_time_tile_test.dart create mode 100644 test/widget_tests/widgets/event_search_delegate_test.dart create mode 100644 test/widget_tests/widgets/from_palisadoes_test.dart create mode 100644 test/widget_tests/widgets/lang_switch_test.dart create mode 100644 test/widget_tests/widgets/member_name_tile_test.dart create mode 100644 test/widget_tests/widgets/pinned_carousel_widget_test.dart create mode 100644 test/widget_tests/widgets/pinned_post_test.dart create mode 100644 test/widget_tests/widgets/post_container_test.dart create mode 100644 test/widget_tests/widgets/post_detailed_page_test.dart create mode 100644 test/widget_tests/widgets/post_list_widget_test.dart create mode 100644 test/widget_tests/widgets/post_modal_test.dart create mode 100644 test/widget_tests/widgets/post_widget_test.dart create mode 100644 test/widget_tests/widgets/raised_round_edge_button_test.dart create mode 100644 test/widget_tests/widgets/rich_text_test.dart create mode 100644 test/widget_tests/widgets/talawa_error_dialog_test.dart create mode 100644 test/widget_tests/widgets/talawa_error_snackbar_test.dart create mode 100644 test/widget_tests/widgets/theme_switch_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..493322305 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,34 @@ +--- +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** +Add any other context or screenshots about the feature request here. + +**Potential internship candidates** +Please read this if you are planning to apply for a Palisadoes Foundation internship https://github.com/PalisadoesFoundation/talawa/issues/359 diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 000000000..60d6401dc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,26 @@ +--- +name: Feature Request +about: Suggest an idea for this project +title: Feature Request +labels: feature request +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. + +**Potential internship candidates** +Please read this if you are planning to apply for a Palisadoes Foundation internship https://github.com/PalisadoesFoundation/talawa/issues/359 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/dependabot.yaml b/.github/dependabot.yaml new file mode 100644 index 000000000..b9789c2a3 --- /dev/null +++ b/.github/dependabot.yaml @@ -0,0 +1,15 @@ +version: 2 +updates: + # Enable version updates for flutter's pub package manager + - package-ecosystem: "pub" + # Look for `pubspec.yaml` and `pubspec.lock` files in the `root` directory + directory: "/" + # Check the pub.dev registry for updates every day (weekdays) + schedule: + interval: "weekly" + target-branch: "develop" + # # Add default reviewers + # reviewers: + # - "palisadoes" + # - "randomUserName" + diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..2672715df --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,53 @@ + + + + +**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..1e9a81eaf --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,47 @@ +# Talawa GitHub Workflows Guidelines + +Follow these guidelines when contributing to this directory. + +## General + +Any changes to files in this directory are flagged when pull requests are run. Make changes only on the advice of a contributor. + +## YAML Workflow Files + +The YAML files in this directory have very specific roles depending on the type of workflow. + +Whenever possible you must ensure that: +1. The file roles below are maintained +1. The sequence of the jobs in the workflows are maintained using [GitHub Action dependencies](https://docs.github.com/en/actions/learn-github-actions/managing-complex-workflows). + +### File Roles +Follow these guidelines when creating new YAML defined GitHub actions. This is done to make troubleshooting easier. + +1. `Issue` Workflows: + 1. Place all actions related to issues in the `issues.yml` file. +1. `Pull Request` workflows to be run by: + 1. Workflows to run **First Time** repo contributors: + 1. Place all actions related to to this in the `pull-request-target.yml` file. + 1. Workflows to be run by **ALL** repo contributors: + 1. Place all actions related to pull requests in the `pull-request.yml` file. +1. `Push` workflows: + 1. Place all actions related to pushes in the `push.yml` file. + +#### File Role Exceptions + +There are some exceptions to these rules in which jobs can be placed in dedicated separate files: +1. Jobs that require unique `cron:` schedules +1. Jobs that require unique `paths:` statements that operate only when files in a specific path are updated. +1. Jobs only work correctly if they have a dedicated file (eg. `CodeQL`) + +## 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/authorized-changes-detection.yml b/.github/workflows/authorized-changes-detection.yml new file mode 100644 index 000000000..1ccac228e --- /dev/null +++ b/.github/workflows/authorized-changes-detection.yml @@ -0,0 +1,31 @@ +############################################################################## +############################################################################## +# +# NOTE! +# +# Please read the README.md file in this directory that defines what should +# be placed in this file +# +############################################################################## +############################################################################## + +name: Checking workflow files +on: + pull_request: + paths: + - '.github/**' + - 'analysis_options.yaml' + - 'pubspec.yaml' + - 'pubspec.lock' + - 'lib/main.dart' + - 'CODEOWNERS' + - 'LICENSE' + +jobs: + Checking-for-unauthorized-file-changes: + name: Checking for unauthorized file changes + runs-on: ubuntu-latest + + steps: + - name: Unauthorized file modification in PR + run: exit 1 diff --git a/.github/workflows/check_ignore.py b/.github/workflows/check_ignore.py new file mode 100755 index 000000000..a8679b601 --- /dev/null +++ b/.github/workflows/check_ignore.py @@ -0,0 +1,192 @@ +#! /usr/bin/python3.10 + +import argparse +import os +import subprocess +import sys + +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() + + # Getting merge branch name + parser.add_argument( + '--merge_branch_name', type=str, required=True, + help='Name of the merging to branch') + + # Github repository + parser.add_argument( + '--repository', type=str, required=True, + help='Name of the GitHub repository in the format "/"') + + # Getting root directory of repository + parser.add_argument( + '--directory', type=str, required=False, + default=os.getcwd(), + help='The parent directory of files to analyze.') + + # Return parser + return parser.parse_args() + + +def _filepaths_in_directories(directories): + """Create a list of full file paths based on input directories. + + Args: + directories: A list of directories + + Returns: + result: A list of full file paths + + """ + # Initialize key variables + result = [] + + # 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 + result.append(os.path.join(root, name)) + # Return + return result + + +def _check_for_ignore_directive(filePath): + """Analyzes a given file and checks for presence of ignore directive corresponding + to any of the custom lint rules. + + A valid ignore directive consists of exactly 3 parts. + + - `//...`: where `...` represents that `/` can occur any number of times > 2. + - `ignore:` or `ignore_for_file:`: The part that distinguishes a normal comment from a + ignore directive. + - `name_of_lint_rule`: The rule that it is ignoring. + + These 3 parts may or may not have whitespace between them, but should strictly not have + any extra character. So + + - `//ignore:my_lint`, `/////ignore:my_lint`, `//ignore: my_lint` etc are all valid + ignore directives. + - `// / ignore: my_lint`, `// sdf ignore: my_lint` etc are all invalid ones. + + Args: + Path of the file to analyze + + Returns: + boolean: Whether the file contains ignore directive or not. + + """ + + # Either it is a non-code file, or the file does not exist. This can happen when + # `develop` gets ahead of your branch and has some files which you don't have + + if (not filePath.startswith('lib') or not filePath.endswith('.dart') or not os.path.exists(filePath)): + return False + + with open(filePath, "r") as file: + lines = file.readlines() + + for index, line in enumerate(lines): + # Remove any leading or trailing whitespace + content = line.strip() + + # If the line is empty or is a documentation (`///`) + if (content.endswith('/') or content == ''): + continue + + # Points to the character just after '/' ends. + # This is required because '/' can occur many times. + non_comment_pos = 0 + + while content[non_comment_pos] == '/': + non_comment_pos += 1 + + # Remove whitespace from non '/' part and split to whitespace + content = (content[non_comment_pos:].strip()).split(' ') + + # filter out empty strings, which happen because of 'sdf sdf' + # .split(' ') adds these whitespaces to the token list too. + content = [token for token in content if token != ''] + + # if somehow we still ended up with whitespaces. + if (len(content) == 0): + break + + # After removing the '/'s, only two possibilities remain + # 1. The `ignore...:` and `lint_rule_name` have no whitespace between them + # 2. They have some whitespace(s) between them + + if ((len(content) == 1 and + (content[0] == 'ignore_for_file:talawa_api_doc' + or content[0] == 'ignore:talawa_api_doc' + or content[0] == 'ignore_for_file:talawa_good_doc_comments' + or content[0] == 'ignore:talawa_good_doc_comments')) + or (len(content) == 2 and + ((content[0] == 'ignore_for_file:' and content[1] == 'talawa_api_doc') + or (content[0] == 'ignore:' and content[1] == 'talawa_api_doc') + or (content[0] == 'ignore_for_file:' and content[1] == 'talawa_good_doc_comments') + or (content[0] == 'ignore:' and content[1] == 'talawa_good_doc_comments')))): + + print(("Ignore directive found at line {}, which suppresses a custom lint rule.\n" + "Please remove this suppression and add valid documentation for the respective field(s).").format(index)) + + return True + + return False + + +def main(): + """Analyze dart files for custom lint rule suppression. + + Analyzes and prints the files that contain suppression for any custom + lint rule + + Returns: + None + + """ + + print(subprocess.check_output(['git', 'branch']).decode('utf-8').strip('\n')) + + current_branch = subprocess.check_output(['git', 'branch', '--show-current']).decode('utf-8').strip('\n') + print(current_branch) + changed_files = subprocess.check_output(['git', 'diff', '--name-only', 'develop', current_branch]).decode('utf-8').splitlines() + print(changed_files) + + + args = _arg_parser_resolver() + + # List of files where ignore directive is found + err = [] + + # Iterate and analyze each directory + for filepath in changed_files: + if _check_for_ignore_directive(filepath): + err.append(filepath) + + # If no changed/modified contains ignore directive for any custom lint rule + if len(err) == 0: + print( + '''🚀 {} Hurrah! No ignore directive found in any modified/added file(s)'''.format('\033[92m')) + sys.exit(0) + else: + print( + '''🔍 {}Ignore directive for custom lint rule found. Please remove them and add valid documentation.'''.format( + '\033[91m')) + for failing_file in err: + print('''>>> File name: {}\n'''.format(failing_file)) + sys.exit(1) + + +if __name__ == '__main__': + main() diff --git a/.github/workflows/compare_translations.py b/.github/workflows/compare_translations.py new file mode 100644 index 000000000..d8c0aff79 --- /dev/null +++ b/.github/workflows/compare_translations.py @@ -0,0 +1,168 @@ +""" +Script to encourage more efficient coding practices. + +Methodology: + + Utility for comparing translations between default and other languages. + + This module defines a function to compare two translations + and print any missing keys in the other language's translation. +Attributes: + + FileTranslation : Named tuple to represent a combination of file and missing translations. + + Fields: + - file (str): The file name. + - missing_translations (list): List of missing translations. + +Functions: + compare_translations(default_translation, other_translation): + Compare two translations and print missing keys. + + load_translation(filepath): + Load translation from a file. + + check_translations(): + Load the default translation and compare it with other translations. + + main(): + The main function to run the script. + Parses command-line arguments, checks for the existence of the specified directory, + and then calls check_translations with the provided or default directory. + + +Usage: + This script can be executed to check and print missing + translations in other languages based on the default English translation. + +Example: + python compare_translations.py +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 + +""" +# standard imports +import argparse +import json +import os +import sys +from collections import namedtuple + +# Named tuple for file and missing translations combination +FileTranslation = namedtuple("FileTranslation", ["file", "missing_translations"]) + + +def compare_translations(default_translation, other_translation, default_file, other_file): + """Compare two translations and return detailed info about missing/mismatched keys. + + Args: + default_translation (dict): The default translation (en.json). + other_translation (dict): The other language translation. + default_file (str): The name of the default translation file. + other_file (str): The name of the other translation file. + + Returns: + list: A list of detailed error messages for each missing/mismatched key. + """ + errors = [] + + # Check for missing keys in other_translation + for key in default_translation: + if key not in other_translation: + error_msg = f"Missing Key: '{key}' - This key from '{default_file}' is missing in '{other_file}'." + errors.append(error_msg) + + # Check for keys in other_translation that don't match any in default_translation + for key in other_translation: + if key not in default_translation: + error_msg = f"Error Key: '{key}' - This key in '{other_file}' does not match any key in '{default_file}'." + errors.append(error_msg) + + return errors + + + + +def load_translation(filepath): + """Load translation from a file. + + Args: + filepath: Path to the translation file + + Returns: + translation: Loaded translation + """ + with open(filepath, "r", encoding="utf-8") as file: + translation = json.load(file) + return translation + + + +def check_translations(directory): + """Load default translation and compare with other translations. + + Args: + directory (str): The directory containing translation files. + + Returns: + None + """ + default_file = "en.json" + default_translation = load_translation(os.path.join(directory, default_file)) + translations = os.listdir(directory) + translations.remove(default_file) # Exclude default translation + + error_found = False + + for translation_file in translations: + other_file = os.path.join(directory, translation_file) + other_translation = load_translation(other_file) + + # Compare translations and get detailed error messages + errors = compare_translations(default_translation, other_translation, default_file, translation_file) + if errors: + error_found = True + print(f"File {translation_file} has missing translations for:") + for error in errors: + print(f" - {error}") + + if error_found: + sys.exit(1) # Exit with an error status code + else: + print("All translations are present") + sys.exit(0) + + +def main(): + """ + Parse command-line arguments, check for the existence of the specified directory, + and call check_translations with the provided or default directory. + + """ + parser = argparse.ArgumentParser( + description="Check and print missing translations for all non-default languages." + ) + parser.add_argument( + "--directory", + type=str, + nargs="?", + default=os.path.join(os.getcwd(), "lang"), + help="Directory containing translation files(relative to the root directory).", + ) + args = parser.parse_args() + + if not os.path.exists(args.directory): + print(f"Error: The specified directory '{args.directory}' does not exist.") + sys.exit(1) + + check_translations(args.directory) + + +if __name__ == "__main__": + main() diff --git a/.github/workflows/countline.py b/.github/workflows/countline.py new file mode 100755 index 000000000..d0b03c503 --- /dev/null +++ b/.github/workflows/countline.py @@ -0,0 +1,297 @@ +#!/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 +from collections import namedtuple + + +def _valid_filename(filepath): + """Determine whether filepath has the correct filename. + + Args: + filepath: Filepath to check + + Returns: + result: True if valid + + """ + # Initialize key variables + invalid_filenames = [".test.", ".spec."] + result = True + + # Test + for invalid_filename in invalid_filenames: + if invalid_filename.lower() not in filepath.lower(): + continue + result = False + + return result + + +def _valid_extension(filepath): + """Determine whether filepath has the correct extension. + + Args: + filepath: Filepath to check + + Returns: + result: True if valid + + """ + # Initialize key variables + invalid_extensions = [".css", ".jpg", ".png", ".jpeg"] + result = True + + # Test + for invalid_extension in invalid_extensions: + if filepath.lower().endswith(invalid_extension.lower()) is False: + continue + result = False + + return result + + +def _valid_exclusions(excludes): + """Create a list of full file paths to exclude from the analysis. + + Args: + excludes: Excludes object + + Returns: + result: A list of full file paths + + """ + # Initialize key variables + result = [] + filenames = [] + more_filenames = [] + + # Create a list of files to ignore + if bool(excludes.files): + filenames = excludes.files + if bool(excludes.directories): + more_filenames = _filepaths_in_directories(excludes.directories) + filenames.extend(more_filenames) + + # Remove duplicates + filenames = list(set(filenames)) + + # Process files + for filename in filenames: + # 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): + 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 _filepaths_in_directories(directories): + """Create a list of full file paths based on input directories. + + Args: + directories: A list of directories + + Returns: + result: A list of full file paths + + """ + # Initialize key variables + result = [] + + # 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 + result.append(os.path.join(root, name)) + # 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_files", + type=str, + required=False, + nargs="*", + default=None, + const=None, + help="""An optional space separated list of \ +files to exclude from the analysis.""", + ) + parser.add_argument( + "--exclude_directories", + type=str, + required=False, + nargs="*", + default=None, + const=None, + help="""An optional space separated list of \ +directories to exclude from the analysis.""", + ) + + # Return parser + result = parser.parse_args() + 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 + Excludes = namedtuple("Excludes", "files directories") + + # 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, "src")), + os.path.expanduser(os.path.join(args.directory, "test")), + ] + + # Get a corrected list of filenames to exclude + exclude_list = _valid_exclusions( + Excludes( + files=args.exclude_files, directories=args.exclude_directories + ) + ) + + # Get interesting filepaths + repo_filepath_list = _filepaths_in_directories(directories) + + # Iterate and analyze each directory + for filepath in repo_filepath_list: + # Skip excluded files + if filepath in exclude_list: + continue + + # Skip /node_modules/ sub directories + if "{0}node_modules{0}".format(os.sep) in filepath: + continue + + # Ignore invalid file extensions + if _valid_extension(filepath) is False: + continue + + # Ignore invalid file filenames + if _valid_filename(filepath) is False: + continue + + # Process the rest + with open(filepath, encoding="latin-1") as code: + line_count = sum( + 1 + for line in code + if line.strip() + and not ( + line.strip().startswith("#") + or line.strip().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/documentationcheck.py b/.github/workflows/documentationcheck.py new file mode 100755 index 000000000..7bac9592d --- /dev/null +++ b/.github/workflows/documentationcheck.py @@ -0,0 +1,186 @@ +"""Script to encourage documentation addition of changes incurred + +Methodology: + + Getting latest commit from merging branch and feature branch + Getting all differences in files under lib directory + Checking if documentation status is missing, not_updated or updated + + This script is to help better document the functionality + +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 argparse +import os +import sys + +import git +import enum + + +class DocumentationStatus(enum.Enum): + unknown = 0 + updated = 1 + not_updated = 2 + missing = 3 + + +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() + # getting merge branch name + parser.add_argument( + '--merge_branch_name', type=str, required=True, + help='Name of the merging to branch') + # Github repository + parser.add_argument( + '--repository', type=str, required=True, + help='Name of the GitHub repository in the format "/"') + # getting root directory of repository + parser.add_argument( + '--directory', type=str, required=False, + default=os.getcwd(), + help='The parent directory of files to analyze.') + # Return parser + result = parser.parse_args() + return result + + +def check_for_documentation(diff_item): + """Determine the documentation status + + Args: + diff_item: Diff to check + + Returns: + doc_status: DocumentationStatus + + """ + # Extracting the changes made + file_diffs = diff_item.diff.decode("utf-8") + # Setting documentation status flag to unknown + doc_status = DocumentationStatus.unknown + # Splitting the changes for line by line iteration + lines = file_diffs.split('\n') + # Setting updated doc line count + edited_doc_line_count = 0 + # Looping over differences + for line in lines: + # checking if the line was updated and contains documentation + if line.strip() and line.startswith('+') and line.__contains__('///'): + # updating the flag by one + edited_doc_line_count += 1 + # Checking if no doc was changed + if edited_doc_line_count == 0: + # Setting the flag to not_updated + doc_status = DocumentationStatus.not_updated + + # Reading complete file to check if not documentation exist + # Reading the complete file + file = diff_item.b_blob.data_stream.read().decode('utf-8') + # Splitting the line to check if documentation is present or not + lines = file.split('\n') + # Setting the documentation line count flag + doc_lines = 0 + # Looping over the file lines + for line in lines: + # Checking if the line contains any documentation or not + if line.strip() and line.__contains__('///'): + # updating the flag by 1 + doc_lines += 1 + # Checking if the documentation lines were present or not + if doc_lines == 0: + # Updating the flag to missing + doc_status = DocumentationStatus.missing + # Checking if the doc was updated + elif edited_doc_line_count > 0: + # Setting the flag to documentation updated + doc_status = DocumentationStatus.updated + # return the file documentation status + return doc_status + + +def main(): + """Analyze dart files. + + This function finds, and prints the files that exceed the CLI + defined defaults. + + Returns: + None + + """ + # Parsing the command line arguments + args = _arg_parser_resolver() + # Getting the git repo + repo_feature = git.Repo(args.directory) + (_, repository_directory) = args.repository.split("/") + repo_merge = git.Repo.clone_from("https://github.com/{}.git".format(args.repository), "{}/{}".format(args.directory, repository_directory)) + + # Do nothing if the branch has a "/" in it + if '/' in args.merge_branch_name: + return + + # Getting latest commit on latest branch + commit_dev = repo_merge.commit(args.merge_branch_name) + # Getting latest commit on feature branch + feature_commit = repo_feature.commit() + # Loading differences between the two commits + diff_index = commit_dev.diff(feature_commit, create_patch=True) + # Setting a flag to keep record of files and their documentation + lookup = {} + # Lopping over differences in modified files + for diff_item in diff_index.iter_change_type('M'): + # Getting file path of difference + file_path = diff_item.b_path + # Checking if a file under codebase(lib) directory was modified + if file_path.startswith('lib'): + # Getting file documentation status + lookup[file_path] = check_for_documentation(diff_item) + # Lopping over differences in added files + for diff_item in diff_index.iter_change_type('A'): + # Getting file path of difference + file_path = diff_item.b_path + # Checking if a file under codebase(lib) directory was added + if file_path.startswith('lib'): + # Getting file documentation status + lookup[file_path] = check_for_documentation(diff_item) + # Filtering files whose documentation status != updated + filtered_lookup = {k: v for (k, v) in lookup.items() if DocumentationStatus.updated != v} + # Checking if documentation was updated for all changed files + if len(filtered_lookup) == 0: + print('''🚀 {} Hurrah! documentation was updated in all modified/added files'''.format('\033[92m')) + sys.exit(0) + else: + print( + '''🔍 {}DOCUMENTATION NOT UPDATED: Files with missing or not updated DartDoc documentation found'''.format( + '\033[91m')) + for failing_file in filtered_lookup: + print('''>>> File name: {}\n\t{}\n'''.format(failing_file, filtered_lookup[failing_file])) + sys.exit(1) + + +if __name__ == '__main__': + main() diff --git a/.github/workflows/issues.yml b/.github/workflows/issues.yml new file mode 100644 index 000000000..ed8521f23 --- /dev/null +++ b/.github/workflows/issues.yml @@ -0,0 +1,34 @@ +############################################################################## +############################################################################## +# +# NOTE! +# +# Please read the README.md file in this directory that defines what should +# be placed in this file +# +############################################################################## +############################################################################## + +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.3.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/develop/CONTRIBUTING.md) and [Issue Reporting Guidelines](https://github.com/PalisadoesFoundation/talawa/blob/develop/ISSUE_GUIDELINES.md) to ensure that you are following our guidelines for contributing and making issues." diff --git a/.github/workflows/pull-request-target.yml b/.github/workflows/pull-request-target.yml new file mode 100644 index 000000000..f8077e44d --- /dev/null +++ b/.github/workflows/pull-request-target.yml @@ -0,0 +1,64 @@ +############################################################################## +############################################################################## +# +# NOTE! +# +# Please read the README.md file in this directory that defines what should +# be placed in this file +# +############################################################################## +############################################################################## + +name: PR Target Workflow +on: + pull_request_target: + +jobs: + PR-Greeting: + name: Pull Request Target + runs-on: ubuntu-latest + steps: + - name: Add the PR Review Policy + uses: thollander/actions-comment-pull-request@v2 + with: + comment_tag: pr_review_policy + message: | + ## Our Pull Request Approval Process + + We have these basic policies to make the approval process smoother for our volunteer team. + + ### Testing Your Code + + Please make sure your code passes all tests. Our test code coverage system will fail if either of these two conditions occur: + + 1. The overall code coverage drops below the target threshold of the repository + 2. Any file in the pull request has code coverage levels below the repository threshold + + The process helps maintain the overall reliability of the code base and is a prerequisite for getting your PR approved. Assigned reviewers regularly review the PR queue and tend to focus on PRs that are passing. + + ### Reviewers + + Do not assign reviewers. Our Queue Monitors will review your PR and assign them. + When your PR has been assigned reviewers contact them to get your code reviewed and approved via: + + 1. comments in this PR or + 1. our slack channel + + #### Reviewing Your Code + + Your reviewer(s) will have the following roles: + + 1. arbitrators of future discussions with other contributors about the validity of your changes + 2. point of contact for evaluating the validity of your work + 3. person who verifies matching issues by others that should be closed. + 4. person who gives general guidance in fixing your tests + + ## Other + + :dart: Please be considerate of our volunteers' time. Contacting the person who assigned the reviewers is not advised unless they ask for your input. Do not @ the person who did the assignment otherwise. + + - name: Greeting Message to User + 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/develop/CONTRIBUTING.md) and [PR Reporting Guidelines](https://github.com/PalisadoesFoundation/talawa/blob/develop/PR_GUIDELINES.md) to ensure that you are following our guidelines for contributing and creating PR." diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 000000000..bd8dd1ace --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,248 @@ +############################################################################## +############################################################################## +# +# NOTE! +# +# Please read the README.md file in this directory that defines what should +# be placed in this file +# +############################################################################## +############################################################################## + +name: PR Workflow +on: + pull_request: + branches-ignore: + - 'master' + +env: + CODECOV_UNIQUE_NAME: CODECOV_UNIQUE_NAME-${{ github.run_id }}-${{ github.run_number }} + +jobs: + Flutter-Codebase-Check: + name: Checking codebase + runs-on: ubuntu-latest + #needs: PR-Greeting + steps: + - uses: actions/checkout@v4 + with: + # ref: ${{ github.event.pull_request.head.sha }} + fetch-depth: 0 + - uses: actions/setup-java@v3 + with: + distribution: 'zulu' # See 'Supported distributions' for available options + java-version: '12.0' + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.19.0' + channel: 'stable' # or: 'beta', 'dev' or 'master' + - name: Set default branch. + run: git remote set-head origin --auto + shell: bash + - name: Running pub get in talawa_lint + run: cd talawa_lint && flutter pub get && cd .. + - name: Running pub get to fetch dependencies + run: flutter pub get + - name: Checking for correct formatting of code + run: dart format --set-exit-if-changed . + - name: Count lines of code in each file + run: chmod +x ./.github/workflows/countline.py + - name: Running count lines + run: ./.github/workflows/countline.py --exclude_directories test/ --exclude_files lib/custom_painters/talawa_logo.dart lib/custom_painters/language_icon.dart lib/custom_painters/whatsapp_logo.dart lib/utils/queries.dart lib/view_model/after_auth_view_models/profile_view_models/profile_page_view_model.dart lib/view_model/pre_auth_view_models/select_organization_view_model.dart lib/views/after_auth_screens/profile/profile_page.dart lib/view_model/main_screen_view_model.dart lib/views/after_auth_screens/events/create_event_page.dart lib/views/after_auth_screens/org_info_screen.dart + - name: setup python + uses: actions/setup-python@v5 + - name: Check for presence of ignore directives corresponding to custom lints + run: chmod +x ./.github/workflows/check_ignore.py + - name: Run check_ignore + run: | + git branch + git checkout -b temp_branch + git branch + git stash push -m lock_file pubspec.lock + git checkout develop + git pull + git branch + git diff --name-only develop..HEAD + git checkout temp_branch + pip install GitPython + python ./.github/workflows/check_ignore.py --repository ${{github.repository}} --merge_branch_name ${{github.head_ref}} + - name: Compare translation files + run: | + chmod +x .github/workflows/compare_translations.py + python .github/workflows/compare_translations.py --directory lang + + - name: Analysing codebase for default linting + run: flutter analyze --no-pub + - name: Analysing codebase for custom linting + run: dart run custom_lint + - name: Changed Files + id: changed-files + uses: tj-actions/changed-files@v41 + - name: List all changed files + run: | + for file in ${{ steps.changed-files.outputs.all_changed_files }}; do + echo "$file was changed" + done + + - name: Check if the source and target branches are different + if: ${{ github.event.pull_request.base.ref == github.event.pull_request.head.ref }} + run: | + echo "Source Branch ${{ github.event.pull_request.head.ref }}" + echo "Target Branch ${{ github.event.pull_request.base.ref }}" + echo "Error: Source and Target Branches are the same. Please ensure they are different." + exit 1 + +# - name: Echo the GitHub environment for troubleshooting +# run: echo "$GITHUB_CONTEXT" +# - name: Echo the GitHub context for troubleshooting +# run: echo "${{ toJSON(github) }}" +# - name: setup python +# uses: actions/setup-python@v5 +# - name: Granting permission to documentationcheck.py +# run: chmod +x ./.github/workflows/documentationcheck.py +# - name: execute py script +# # For more information on the GitHub context used for the "--repository" flag used by this script visit: +# # https://docs.github.com/en/actions/learn-github-actions/contexts +# run: | +# git branch +# pip install GitPython +# python ./.github/workflows/documentationcheck.py --repository ${{github.repository}} --merge_branch_name ${{github.ref_name}} + + Flutter-Testing: + name: Testing codebase + runs-on: ubuntu-latest + needs: Flutter-Codebase-Check + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v3 + with: + distribution: 'zulu' # See 'Supported distributions' for available options + java-version: '12.0' + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.19.0' + channel: 'stable' # or: 'beta', 'dev' or 'master' + - name: Running pub get to fetch dependencies + run: flutter pub get + - name: Codebase testing + run: flutter test --coverage + - name: Present and upload coverage to Codecov as ${{env.CODECOV_UNIQUE_NAME}} + uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} + verbose: true + fail_ci_if_error: false + name: '${{env.CODECOV_UNIQUE_NAME}}' + - name: Test acceptable level of code coverage + uses: VeryGoodOpenSource/very_good_coverage@v2 + with: + path: './coverage/lcov.info' + min_coverage: 92.0 + + Android-Build: + name: Testing build for android + runs-on: ubuntu-latest + needs: Flutter-Codebase-Check + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v3 + with: + distribution: 'zulu' # See 'Supported distributions' for available options + java-version: '12.0' + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.19.0' + channel: 'stable' # or: 'beta', 'dev' or 'master' + - name: Running pub get to fetch dependencies + run: flutter pub get + - name: Building for android + run: flutter build apk + + iOS-Build: + name: Testing build for iOS + runs-on: macos-latest + needs: Flutter-Codebase-Check + steps: + - uses: actions/checkout@v4 + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.19.0' + channel: 'stable' # or: 'beta', 'dev' or 'master' + architecture: x64 + - name: Building for ios + run: flutter build ios --release --no-codesign + + Branch-check: + name: "Base branch check" + runs-on: ubuntu-latest + steps: + - name: "Check if base branch is develop" + if: github.event.pull_request.base.ref != 'develop' + run: | + echo "PR is not against develop branch. Please refer PR_GUIDELINES.md" + exit 1 + + Check-Unauthorized-Changes: + name: Checks if no unauthorized files are changed + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Get Changed Unauthorized files + id: changed-unauth-files + uses: tj-actions/changed-files@v40 + with: + files: | + .github/** + env.example + .node-version + .husky/** + scripts/** + package.json + tsconfig.json + .gitignore + .eslintrc.json + .eslintignore + vite.config.ts + docker-compose.yaml + Dockerfile + CODEOWNERS + LICENSE + setup.ts + - name: List all changed unauthorized files + if: steps.changed-unauth-files.outputs.any_changed == 'true' || steps.changed-unauth-files.outputs.any_deleted == 'true' + env: + CHANGED_UNAUTH_FILES: ${{ steps.changed-unauth-files.outputs.all_changed_files }} + run: | + for file in ${CHANGED_UNAUTH_FILES}; do + echo "$file is unauthorized to change/delete" + done + exit 1 + + Count-Changed-Files: + name: Checks if number of files changed is acceptable + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v40 + + - name: Echo number of changed files + env: + CHANGED_FILES_COUNT: ${{ steps.changed-files.outputs.all_changed_files_count }} + run: | + echo "Number of files changed: $CHANGED_FILES_COUNT" + - name: Check if the number of changed files is less than 100 + if: steps.changed-files.outputs.all_changed_files_count > 100 + env: + CHANGED_FILES_COUNT: ${{ steps.changed-files.outputs.all_changed_files_count }} + run: | + echo "Error: Too many files (greater than 100) changed in the pull request." + echo "Possible issues:" + echo "- Contributor may be merging into an incorrect branch." + echo "- Source branch may be incorrect please use develop as source branch." + exit 1 \ No newline at end of file diff --git a/.github/workflows/push.yaml b/.github/workflows/push.yaml new file mode 100644 index 000000000..96894e62b --- /dev/null +++ b/.github/workflows/push.yaml @@ -0,0 +1,262 @@ +############################################################################## +############################################################################## +# +# NOTE! +# +# Please read the README.md file in this directory that defines what should +# be placed in this file +# +############################################################################## +############################################################################## + +name: PUSH Workflow +on: + push: + # branches: + # - develop + + branches-ignore: + - 'master' + + tags: + - "*" + +env: + CODECOV_UNIQUE_NAME: CODECOV_UNIQUE_NAME-${{ github.run_id }}-${{ github.run_number }} + +jobs: + + Flutter-Codebase-Check: + name: Checking codebase + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + # This is important to fetch all history for all branches and tags. + # This could be important for our documentation generation process. + # See: https://github.com/actions/checkout + fetch-depth: 0 + - uses: actions/setup-java@v3 + with: + distribution: 'zulu' # See 'Supported distributions' for available options + java-version: '12.0' + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.19.0' + channel: 'stable' # or: 'beta', 'dev' or 'master' + - name: Running pub get in talawa_lint + run: cd talawa_lint && flutter pub get && cd .. + - name: Running pub get to fetch dependencies + run: flutter pub get + - name: Checking for correct formatting of code + run: dart format --set-exit-if-changed . + - name: setup python + uses: actions/setup-python@v5 + - name: Check for presence of ignore directives corresponding to custom lints + run: chmod +x ./.github/workflows/check_ignore.py + - name: Run check_ignore + run: | + git branch + git checkout develop + git pull + git branch + git checkout - + pip install GitPython + python ./.github/workflows/check_ignore.py --repository ${{github.repository}} --merge_branch_name ${{github.ref_name}} + - name: Analysing codebase for default linting + run: flutter analyze --no-pub + - name: Analysing codebase for custom linting + run: dart run custom_lint +# - name: Echo the GitHub environment for troubleshooting +# run: echo "$GITHUB_CONTEXT" +# - name: Echo the GitHub context for troubleshooting +# run: echo "${{ toJSON(github) }}" + + Update-Documentation: + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/automated-docs' + environment: TALAWA_ENVIRONMENT + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v3 + with: + distribution: 'zulu' # See 'Supported distributions' for available options + java-version: '12.0' + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.19.0' + channel: 'stable' + - uses: dart-lang/setup-dart@v1 + with: + sdk: '3.3.0' + - run: | + cd talawa_lint && flutter pub get && cd .. + flutter pub get + flutter analyze + dart analyze + flutter pub global activate dartdoc + flutter pub global run dartdoc . --output talawa-mobile-docs --format md --exclude=test/widget_tests/widgets/pinned_carousel_widget_test.dart, lib/widgets/pinned_carousel_widget.dart, lib/widgets/post_widget.dart, test/widget_tests/widgets/post_widget_test.dart + rm -rf talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState/build.md + rm -rf talawa-mobile-docs/widgets_post_widget/PostContainerState/build.md + - uses: actions/upload-artifact@v1 + with: + name: talawa-mobile-docs + path: talawa-mobile-docs + - name: Checking doc updated + id: DocUpdated + run: | + if [ -n "$(git status --porcelain)" ]; then + echo "updateDoc=true" >> $GITHUB_OUTPUT + echo -e "Documentation has been updated!!" + else + Green='0;32' + NoColor='\033[0m' + echo -e "${Green}No documentation updated${NoColor}" + fi + - name: Set env variables + if: steps.DocUpdated.outputs.updateDoc + run: | + echo "commit_id=$(echo $(git rev-parse HEAD))" >> $GITHUB_ENV + echo "email=$(echo $(git log --pretty=format:"%ae" $commit_id))" >> $GITHUB_ENV + - name: Handle untracked files + if: steps.DocUpdated.outputs.updateDoc + run: | + git config --global user.name "${{github.actor}}" + git config --global user.email "${{env.email}}" + git add . + - name: Update Doc + if: steps.DocUpdated.outputs.updateDoc + run: | + Green='0;32' + NoColor='\033[0m' + git config --global user.name "${{github.actor}}" + git config --global user.email "${{env.email}}" + git commit -a -m "Updated docs" + git push + echo -e "🚀${Green} Hurrah! doc updated${NoColor}" + + Documentation-to-talawa-docs: + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/automated-docs' + needs: Update-Documentation + steps: + - uses: actions/checkout@v4 + - uses: dmnemec/copy_file_to_another_repo_action@v1.1.1 + env: + API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB_NEW }} + with: + source_file: 'talawa-mobile-docs/' + destination_repo: 'PalisadoesFoundation/talawa-docs' + destination_branch: 'develop' + destination_folder: 'docs' + user_email: '${{env.email}}' + user_name: '${{github.actor}}' + commit_message: 'Overwriting talawa-mobile-docs from talawa-repo' + + + + Flutter-Testing: + name: Testing codebase + runs-on: ubuntu-latest + needs: Flutter-Codebase-Check + # needs: Update-Documentation + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v3 + with: + distribution: 'zulu' # See 'Supported distributions' for available options + java-version: '12.0' + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.19.0' + channel: 'stable' # or: 'beta', 'dev' or 'master' + - name: Running pub get in talawa_lint + run: cd talawa_lint && flutter pub get && cd .. + - name: Running pub get to fetch dependencies + run: flutter pub get + - name: Codebase testing + run: flutter test --coverage + - name: Present and upload coverage to Codecov as ${{env.CODECOV_UNIQUE_NAME}} + uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} + verbose: true + fail_ci_if_error: false + name: '${{env.CODECOV_UNIQUE_NAME}}' + + Android-Build-and-Release: + name: Testing build for android + permissions: + contents: write + environment: TALAWA_ENVIRONMENT + runs-on: ubuntu-latest + needs: Flutter-Testing + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-java@v3 + with: + distribution: 'zulu' # See 'Supported distributions' for available options + java-version: '12.0' + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.19.0' + channel: 'stable' # or: 'beta', 'dev' or 'master' + - name: Running pub get in talawa_lint + run: cd talawa_lint && flutter pub get && cd .. + - name: Running pub get to fetch dependencies + run: flutter pub get + - name: Building for android + run: flutter build apk + + ################################################### + ## Release the built apk as an automated release ## + ################################################### + + - uses: ncipollo/release-action@v1 + with: + name: "Automated Android Release" + artifacts: "./build/app/outputs/flutter-apk/app-release.apk" + allowUpdates: "true" + generateReleaseNotes: false + tag: "automated" + body: | + This is an automated release, triggered by a recent push. + This may or may not be stable, so please have a look at the stable release(s). + + iOS-Build: + name: iOS Build and Relaese + runs-on: macos-latest + needs: Flutter-Testing + steps: + - uses: actions/checkout@v4 + - uses: subosito/flutter-action@v2 + with: + flutter-version: '3.19.0' + channel: 'stable' # or: 'beta', 'dev' or 'master' + architecture: x64 + - name: Building for ios + run: flutter build ios --release --no-codesign + # '--no-codesign' is used for building without code signing. + # For actual distribution, proper code signing is required. + + ######################################################## + ## Package the app as an .ipa and create a release ## + ######################################################## + + - name: Releasing for iOS + run: | + mkdir Payload + cp -r build/ios/iphoneos/Runner.app Payload/Runner.app + zip -r app.ipa Payload + # This packages the Runner.app into an .ipa file + + - uses: ncipollo/release-action@v1 + with: + name: "Automated iOS Release" + artifacts: "app-release.ipa" + allowUpdates: "true" + generateReleaseNotes: false + tag: "automated" + body: | + This is an automated release, triggered by a recent push. + This may or may not be stable, so please have a look at the stable release(s). diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 000000000..24667f8e0 --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,43 @@ +############################################################################## +############################################################################## +# +# NOTE! +# +# Please read the README.md file in this directory that defines what should +# be placed in this file +# +############################################################################## +############################################################################## + +name: Mark stale issues and pull requests + +on: + schedule: + - cron: "0 0 * * *" + +permissions: + issues: write + pull-requests: write + +jobs: + stale: + + runs-on: ubuntu-latest + + steps: + - uses: actions/stale@v8 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + stale-issue-message: 'This issue did not get any activity in the past 10 days and will be closed in 180 days if no update occurs. Please check if the develop branch has fixed it and report again or close the issue.' + stale-pr-message: 'This pull request did not get any activity in the past 10 days and will be closed in 180 days if no update occurs. Please verify it has no conflicts with the develop branch and rebase if needed. Mention it now if you need help or give permission to other people to finish your work.' + close-issue-message: 'This issue did not get any activity in the past 180 days and thus has been closed. Please check if the newest release or develop branch has it fixed. Please, create a new issue if the issue is not fixed.' + close-pr-message: 'This pull request did not get any activity in the past 180 days and thus has been closed.' + stale-issue-label: 'no-issue-activity' + stale-pr-label: 'no-pr-activity' + days-before-stale: 10 + days-before-close: 180 + remove-stale-when-updated: true + exempt-all-milestones: true + exempt-pr-labels: 'wip' + exempt-issue-labels: 'wip' + operations-per-run: 30 diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..b14badeec --- /dev/null +++ b/.gitignore @@ -0,0 +1,255 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ + +# Ignore Google services configuration files +google-services.json +GoogleService-Info.plist +firebase_app_id_file.json + +# Sphinx documentation +docs/_build/ + +# 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/ + +############################################################################### +# Generic JetBrains Exclusions (Provided by GitHub) +# +# Created by https://www.gitignore.io/api/intellij which redirects to: +# Created by https://www.toptal.com/developers/gitignore/api/intellij +# Edit at https://www.toptal.com/developers/gitignore?templates=intellij +############################################################################### + +### Intellij ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# All idea files +.idea/ + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +*.iml +*.ipr + +# CMake +cmake-build-*/ + +# File-based project format +*.iws + +# IntelliJ +out/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +############################################################################### +# Generic Flutter Exclusions (Provided by GitHub) +# +# Created by https://www.gitignore.io/api/flutter which redirects to: +# Created by https://www.toptal.com/developers/gitignore/api/flutter +# Edit at https://www.toptal.com/developers/gitignore?templates=flutter +############################################################################### + +# Flutter/Dart/Pub related +.dart_tool/ +.flutter-plugins +.flutter-plugins-dependencies +.fvm/ +.packages +.pub-cache/ +.pub/ +temporaryPath/ +build/ +coverage/ +lib/generated_plugin_registrant.dart + +# 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 + + +############################################################################### +# 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 + +# 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/ + +# Hive database files +test/fixtures/core + +# End of https://www.gitignore.io/api/python + +# Ignoring file that are generated during talawa testing and firebase initialization +genhtml.perl +test_img.png + + +# Ignoring Node files that are generated if user uses any node command which is not required for the project +node_modules/ +package.json +package-lock.json +yarn.lock +npm-debug.log +yarn-error.log \ No newline at end of file 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/CODEOWNERS b/CODEOWNERS new file mode 100644 index 000000000..6cbc8ddd2 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,2 @@ +* @palisadoes @noman2002 +CODEOWNERS @palisadoes @noman2002 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..224b932bf --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,295 @@ +# 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/). + +## Table of Contents + +* [Code of Conduct](#code-of-conduct) +* [Ways to Contribute](#ways-to-contribute) +* [Our Development Process](#our-development-process) + * [Issues](#issues) + * [Pull Requests](#pull-requests) + * [Branching Strategy](#branching-strategy) + * [Conflict Resolution](#conflict-resolution) +* [Contributing Code](#contributing-code) +* [General Guidelines](#general-guidelines) + * [Folder Definition](#folder-definition) + * [File Definition](#file-definition) + * [PR Preparation](#pr-preparation) + * [Project Structure](#project-structure) + * [Commit Guidelines](#commit-guidelines) +* [Internships](#internships) +* [Community](#community) + +## Code of Conduct + +A safe environment is required for everyone to contribute. Read our [Code of Conduct Guide](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 to help them. + +## Ways to Contribute + +If you are ready to start contributing code right away, get ready! + +1. Join our Slack and introduce yourself. See details on how to join below in the Community section. + 1. This repository has its own dedicated channel. + 1. There are many persons on the various channels, willing to assist you in getting started. +1. Take a look at our issues (**_after reading our guidelines below_**): + 1. We have a list of [good first issues](https://github.com/PalisadoesFoundation/talawa/labels/good%20first%20issue) that contain challenges with limited scope for beginners. + 1. There are issues for creating tests for our codebase. We need to increase reliability. Try those issues, or create your own files that don't already have tests. This is another good strategy for beginners. + 1. There are [dormant issues on which nobody has worked for some time](https://github.com/PalisadoesFoundation/talawa/issues?q=is%3Aopen+is%3Aissue+label%3Ano-issue-activity). These are another place to start. + 1. There may also be [dormant PRs on which nobody has worked for some time](https://github.com/PalisadoesFoundation/talawa/issues?q=is%3Aopen+is%3Aissue+label%3Ano-issue-activity+label%3Ano-pr-activity)! +1. Create an issue based on a bug you have found or a feature you would like to add. We value meaningful suggestions and will prioritize them. + +**Welcome aboard!** + +### 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](ISSUE_GUIDELINES.md) available here before creating any new issues on Talawa project. + +#### Pull Requests + +[Pull Request guidelines](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 `main` branch: + +- `develop`: For unstable code and bug fixing +- `main`: Where the stable production ready code lies. This is our default branch. + +#### Conflict Resolution + +When multiple developers are working on issues there is bound to be a conflict of interest (not to be confused with git conflicts) among issues, PRs or even ideas. Usually these conflicts are resolved in a **First Come First Serve** basis however there are certain exceptions to it. + +- In the cases where you feel your potential issues could be an extension or in conflict with other PRs it is important to ask the author of the PR in the slack channel or in their PRs or issues themselves why he/she did not write code for something that would require minimal effort on their part. +- Based on basic courtesy, it is good practice to let the person who created a function apply and test that function when needed. +- Last but not the least, communication is important make sure to talk to other contributors, in these cases, in slack channel or in a issue/PR thread. +- As a last resort the Admins would be responsible for deciding how to resolve this conflict. + +### 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 `develop`. +1. Your newly forked repository can be cloned locally using `git clone `. +1. Make the Palisadoes Foundation's repo your `git upstream` for your local repo. +1. Make the desired changes to the Talawa source. +1. Setup a local instance of Talawa-API on your local machine using the steps outlined in our [INSTALLATION.md](INSTALLATION.md) file. +1. Run the app: + 1. Enter Talawa-API URL for your local instance oulined in the [INSTALLATION.md](INSTALLATION.md) file. This is also the URL you should use for your Talawa-Admin configuration. +1. Test your changes. +1. If you've added code, then test suites must be added. + 1. **_General_:** + 1. We need to get to 100% test coverage for the app. We periodically increase the desired test coverage for our pull requests to meet this goal. + 1. Pull requests that don't meet the minimum test coverage levels will not be accepted. This may mean that you will have to create tests for code you did not write. You can decide which part of the code base needs additional tests if this happens to you. + 1. **_Testing_:** + 1. Test using the `flutter test` command. + 1. Review [Flutter's official introduction to unit testing](https://docs.flutter.dev/cookbook/testing/unit/introduction) + 1. Here are some useful flutter test videos + 1. [State Management With Provider](https://www.raywenderlich.com/6373413-state-management-with-provider) + 1. [Unit Testing With Flutter: Getting Started](https://www.raywenderlich.com/6926998-unit-testing-with-flutter-getting-started) + 1. [How to Unit Test in Flutter - Guide](https://www.youtube.com/watch?v=5BFlo9k3KNU) + 1. **_Test Code Coverage_:** + 1. _General Information_ + 1. The current code coverage of the repo is: [![codecov](https://codecov.io/gh/PalisadoesFoundation/talawa/branch/develop/graph/badge.svg?token=3PJXIKRS1S)](https://codecov.io/gh/PalisadoesFoundation/talawa) + 1. You can determine the percentage test coverage of your code by running these two commands in sequence: + ``` + flutter test --coverage + genhtml coverage/lcov.info -o coverage + ``` + 1. The coverage rate will be visible on the penultimate line of the `genhtml` command's output. + 1. The `genhtml` command is part of the linux `lcov` package. Similar packages can be found for Windows and MacOS. + 1. The currently acceptable coverage rate can be found in the [GitHub Pull Request file](.github/workflows/pull-request.yml). Search for the value below the line containing `min_coverage`. + 1. _Creating your code coverage account_ + 1. You can also see your code coverage online for your fork of the repo. This is provided by `codecov.io` + 1. Go to this link: `https://app.codecov.io/gh/XXXX/YYYY` where XXXX is your GitHub account username and YYYY is the name of the repository + 1. Login to `codecov.io` using your GitHub account, and add your **repo** and **branches** to the `codecov.io` dashboard. + 1. Remember to add the `Repository Upload Token` for your forked repo. This can be found under `Settings` of your `codecov.io` account. + 1. Use the value of this token to create a secret named CODE_COV for your forked repo. + 1. You will see your code coverage reports with every push to your repo after following these steps + +1. Author is required to write complete documentation for any file(s) changed in the respective PR + + 1. **General:** + + 1. Every field, i.e., `class`, `method`, `attribute`, `variable` should be documentation with some logical exceptions being `A class that extends State`, `class methods that override the respective base method`, etc as they don't necessarily need their own documentation. + 1. The documentation written should follow [Dart's official documentation guidelines](https://dart.dev/guides/language/effective-dart/documentation). + 1. For now, the non-documented files are marked with `// ignore_for_file: talawa_api_doc` and` + // ignore_for_file: talawa_good_doc_comments` directives to suppress these lint warning. It is expected from the author to remove these two lines from the files they have modified and add corresponding documentation in the expected format. + + 1. **In your IDE:** + + 1. If you followed [INSTALLATION.md](INSTALLATION.md) carefully, you should see lint errors/warnings in your IDE itself, after removing the ignore directives on the top of the file. + 1. Use the lint warnings your IDE states and write documentation accordingly. It will make the process easier. + + 1. **On the command line:** + + 1. Run `.github/workflows/check_ignore.py` and it will report if you have removed the ignore directives from changed files or not. + ```bash + python .github/workflows/check_ignore.py + ``` + + 1. If it states any error, remove ignore directives from the files it states, and write proper documentation. + + 1. When done writing documentation, run + ``` + flutter pub run custom_lint + ``` + + to check whether you documentation follows the format we expect, though you will get warnings in your IDE itself if it doesn't. + +1. Ensure that your code is appropriately formatted before making your submission. Submissions that 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 that 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. + ``` + dart format --set-exit-if-changed . + ``` + +1. Ensure that your code should not be 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 committed your changes, you need to push the changes to the forked repo on GitHub using: `git push origin `.(Here, the branch name must be the 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 + +Please also follow these general rules. + +### Folder Definition + +- `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 enumerators used in the entire project. + ``` + 1. File contains an enum that is either used with controllers or widgets. + 2. Before creating new enum files, check if the existing enum can be modified to fulfill your requirements. + ``` +- `model`: The folder contains all the data models files. + ``` + 1. Files contain a data model that is used in the 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 Definition + +- Filename should be created with lowercase and underscore letters +- The business logic & UI-based files 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. + +### PR Preparation: + + - 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 + +If you are participating in any of the various internship programs we ar members of then please read the [introduction guides on our documentation website](https://docs.talawa.io/docs/). + +## Community +There are many ways to communicate with the community. + +1. The Palisadoes Foundation has a Slack channel where members can assist with support and clarification. Visit the [Talawa GitHub repository home page](https://github.com/PalisadoesFoundation/talawa) for the link to join our slack channel. +1. We also have a technical email list run by [freelists.org](https://www.freelists.org/). Search for "palisadoes" and join. Members on this list are also periodically added to our marketing email list that focuses on less technical aspects of our work. diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md new file mode 100644 index 000000000..aecf8cc13 --- /dev/null +++ b/DOCUMENTATION.md @@ -0,0 +1,21 @@ +# Documentation +Welcome to our documentation guide. Here are some useful tips you need to know! +## Where to find our documentation + +Our documentation can be found in ONLY TWO PLACES: + +1. ***Inline within the repository's code files***: We have automated processes to extract this information and place it in our Talawa documentation site [docs.talawa.io](https://docs.talawa.io/). +1. ***In our `talawa-docs` repository***: Our [Talawa-Docs](https://github.com/PalisadoesFoundation/talawa-docs) repository contains user edited markdown files that are automatically integrated into our Talawa documentation site [docs.talawa.io](https://docs.talawa.io/) using the [Docusaurus](https://docusaurus.io/) package. + +## How to use Docusaurus +The process in easy: +1. Install `talawa-docs` on your system +1. Launch docusaurus on your system according to the `talawa-docs`documentation. + - A local version of `docs.talawa.io` should automatically launched in your browser at http://localhost:3000/ +1. Add/modify the markdown documents to the `docs/` directory of the `talawa-docs` repository +1. If adding a file, then you will also need to edit the `sidebars.js` which is used to generate the [docs.talawa.io](https://docs.talawa.io/) menus. +1. Always monitor the local website in your brower to make sure the changes are acceptable. + - You'll be able to see errors that you can use for troubleshooting in the CLI window you used to launch the local website. + +## Other information +***PLEASE*** do not add markdown files in this repository. Add them to `talawa-docs`! diff --git a/INSTALLATION.md b/INSTALLATION.md new file mode 100644 index 000000000..227e549f2 --- /dev/null +++ b/INSTALLATION.md @@ -0,0 +1,68 @@ +# Installation for Developers +Welcome to our installation guide for developers. Jump in and contribute! + +# Table of Contents + +1. [Pre-Requisites For Developers](#prerequisites-for-developers) + - [Talawa-API and Talawa-Admin](#talawa-api-and-talawa-admin) + - [Talawa Mobile App](#talawa-mobile-app) +1. [Installation](#installation) +1. [Operation](#operation) + +# Prerequisites for Developers +We recommend that you follow these steps before beginning development work on the Talawa mobile app. +## Talawa-API and Talawa-Admin + +For best results you should setup your own **_local instances_** of: +1. [Talawa-API](https://github.com/PalisadoesFoundation/talawa-api): The API system that the mobile app uses for accessing data. +1. [Talawa-admin](https://github.com/PalisadoesFoundation/talawa-admin): The system used by Administrators to manage user information. This is important as you will occasionally need to do administrative functions that cannot be done in the mobile app. + +The INSTALLATION.md files in both repositories show you how. The Talawa-API INSTALLATION.md will also show you the Organization URL to use when you first login to Talawa mobile. + +### Talawa Mobile App +**Note:** If you are an Android user, you may choose to directly use the `apk` file provided in this repo, and skip the manual setup part. For more information about this, see the [Installation section](#Installation). But if you want to setup the development environment for yourself, read along. + +You'll need to set up 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**: This part is very important. + 1. Make sure Talawa-API is up and running. + 1. 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. The Talawa-API INSTALLATION.md will provide that information. + +# Installation + +You can start using Talawa by any of the two methods: + +1. Install the `apk` provided in the release section of this repo. It is built against the latest codebase. Please note that the release is provided only for Android. For iOS, you will still need to build the app yourself. + - Head over to the [release section](https://github.com/PalisadoesFoundation/talawa/releases) of Talawa repository. + - You will find a release with the name of `Automated Android Release`. Scroll a bit and you will find a file named `app-release.apk`. Click on it and have it downloaded. + - Head over to the downloads of your browser and then click on `app-release.apk` there. That will ask you to install the app. Click on `Install`. + - Once done, you can find `Talawa` in your apps list. Start using it from right there :) +2. Manually build the app by below described steps. + +## Manual Build and Installation + +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 + $ cd talawa_lint + $ flutter pub get + $ cd .. + $ flutter pub get + ``` +1. Start developing! + +# Operation + +The Talawa Mobile app communicates with a Talawa-API server to get all its data. This access is provided via a URL. +When you first run the Talawa Mobile App you'll be prompted for the organization URL of a Talawa-API server. The URL to use will vary depending on the way you are using the Talawa Mobile app. + +For a list of organization URLs for each scenario, please refer to the Talawa-API [INSTALLATION.md](https://github.com/PalisadoesFoundation/talawa-api/blob/-/INSTALLATION.md) file diff --git a/ISSUE_GUIDELINES.md b/ISSUE_GUIDELINES.md new file mode 100644 index 000000000..6c8bfe8cf --- /dev/null +++ b/ISSUE_GUIDELINES.md @@ -0,0 +1,59 @@ +# 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. + +___ +## Table of Contents + + +- [Issue Report Guidelines](#issue-report-guidelines) + - [Table of Contents](#table-of-contents) + - [Issue Management](#issue-management) + - [New Issues](#new-issues) + - [Existing Issues](#existing-issues) + - [Feature Request Issues](#feature-request-issues) + - [Monitoring the Creation of New Issues](#monitoring-the-creation-of-new-issues) + - [General Guidelines](#general-guidelines) + + +___ +## Issue Management + +In all cases please use the [GitHub open issue search](https://github.com/PalisadoesFoundation/talawa/issues) to check whether the issue has already been reported. + +### New Issues +To create new issues follow these steps: + +1. Your issue may have already been created. Search for duplicate open issues before submitting yours.for similar deficiencies in the code.duplicate issues are created. +1. Verify whether the issue has been fixed by trying to reproduce it using the latest master or development branch in the repository. +1. Click on the [`New Issue`](https://github.com/PalisadoesFoundation/talawa/issues/new/choose) button +1. Use the templates to create a standardized report of what needs to be done and why. +1. If you want to be assigned the issue that you have created, then add a comment immediately after submitting it. + +We welcome contributors who find new ways to make the code better. + +### Existing Issues + +You can also be a valuable contributor by searching for dormant issues. Here's how you can do that: + +1. **Previously Assigned Issues**: We regularly review issues and add a [`no-issue-activity`](https://github.com/PalisadoesFoundation/talawa/issues?q=is%3Aissue+is%3Aopen+label%3Ano-issue-activity) label to them. Use the issue comments to ask whether the assignee is still working on the issue, and if not, ask for the issue to be assigned to you. +1. **Unassigned Issues**: If the issue is already reported and [not assigned to anyone](https://github.com/PalisadoesFoundation/talawa/issues?q=is%3Aissue+is%3Aopen+no%3Aassignee) and you are interested in working on the issue then: + 1. Ask for the issue to be assigned to you in the issue comments + 2. Ask our contributors to assign it to you in `#talawa` slack channel. + +Working on these types of existing issues is a good way of getting started with the community. + +### Feature Request Issues + +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. + +### Monitoring the Creation of New Issues +1. Join our `#talawa-github` slack channel for automatic issue and pull request updates + +## General Guidelines + +1. Discuss issues in our various slack channels when necessary +2. Please do not derail or troll issues. +3. Keep the discussion on topic and respect the opinions of others. 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..d7742a8c8 --- /dev/null +++ b/PR_GUIDELINES.md @@ -0,0 +1,36 @@ +# 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. + +## Pull Requests and Issues +1. Do not start working on any open issue and raise a PR unless the issue is assigned to you. PRs that don't meet these guidelines will be closed. +1. Pull requests must be based on [open issues](https://github.com/PalisadoesFoundation/talawa/issues) available. +1. [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) + +## Testing +1. All pull requests 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. +1. Please read our [CONTRIBUTING.md](CONTRIBUTING.md) document for details on our testing policy. + +## Pull Request Processing +These are key guidelines for the procedure: + +### Only submit PRs against our `develop` branch, not the default `main` branch + +1. Only submit PRs against our `develop` branch. The default is `main`, so you will have to modify this before submitting your PR for review. PRs made against `main` will be closed. +1. We do not accept draft Pull Requests. They will be closed if submitted. We focus on work that is ready for immediate review. +1. Removing assigned reviewers from your Pull Request will cause it to be closed. The quality of our code is very important to us. Therefore we make experienced maintainers of our code base review your code. Removing these assigned persons is not in the best interest of this goal. +1. If you have not done so already, please read the `Pull Requests and Issues` and `Testing` sections above. +1. 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 would 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. +1. Upon successful push to the fork, check if all tests are passing; if not, fix the issues and then create a pull request. +1. 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. +1. Please follow the PR template provided. Ensure the PR title clearly describes the problem it is solving. In the description, include the relevant issue number, snapshots, and videos after changes are added. +1. If you are borrowing a 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. +1. No Work In Progress. ONLY completed and working pull requests and with respective test units will be accepted. A WIP would fall under rule 4 and be closed immediately. +1. 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. +1. 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. +1. PR should be small, easy to review and should follow standard coding styles. +1. If PR has conflicts because of recently added changes to the same file, resolve issues, test new changes, and submit PR again for review. +1. PRs should be atomic. That is, they should address one item (issue or feature) +1. After submitting PR, if you are not replying within 48 hours, then in that case, we may need to assign the issue to other contributors based on the priority of the issue. diff --git a/README.md b/README.md new file mode 100644 index 000000000..351e606e3 --- /dev/null +++ b/README.md @@ -0,0 +1,50 @@ +# Talawa + +[💬 Join the community on Slack](https://github.com/PalisadoesFoundation/) + +![talawa-logo-lite-200x200](https://github.com/PalisadoesFoundation/talawa-admin/assets/16875803/26291ec5-d3c1-4135-8bc7-80885dff613d) + + +[![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) +[![codecov](https://codecov.io/gh/PalisadoesFoundation/talawa/graph/badge.svg?token=3PJXIKRS1S)](https://codecov.io/gh/PalisadoesFoundation/talawa) + +**Talawa** is a comprehensive platform that aims to revolutionize the way organizations manage and interact with their data and content. Talawa empowers administrators to access and manage content with ease through the Talawa Admin interface, ensuring that information remains up-to-date and accessible to the platform's members. + +With the Talawa API facilitating smooth communication between all parts of the platform, Talawa offers a cohesive and exceptional user experience for both administrators and members, making it a powerful tool for data management and content delivery seamlessly. 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 + +1. You can install the software for this repository using the steps in our [INSTALLATION.md](INSTALLATION.md) file. +1. Do you want to contribute to our code base? Look at our [CONTRIBUTING.md](CONTRIBUTING.md) file to get started. There you'll also find links to: + 1. Our code of conduct documentation in the [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md) file. + 1. How we handle the processing of new and existing issues in our [ISSUE_GUIDELINES.md](ISSUE_GUIDELINES.md) file. + 1. The methodologies we use to manage our pull requests in our [PR_GUIDELINES.md](PR_GUIDELINES.md) file. +1. The `talawa` documentation can be found at our [docs.talawa.io](https://docs.talawa.io) site. + 1. It is automatically generated from the markdown files stored in our [Talawa-Docs GitHub repository](https://github.com/PalisadoesFoundation/talawa-docs). This makes it easy for you to update our documenation. + +# Videos + +1. Visit our [YouTube Channel playlists](https://www.youtube.com/@PalisadoesOrganization/playlists) for more insights + 1. The "Getting Started - Developers" videos are extremely helpful for new open source contributors. + diff --git a/analysis_options.yaml b/analysis_options.yaml new file mode 100644 index 000000000..2aef38bdb --- /dev/null +++ b/analysis_options.yaml @@ -0,0 +1,88 @@ +include: package:lint/analysis_options.yaml + +analyzer: + exclude: + - lib/generated_plugin_registrant.dart + - test/helpers/test_helpers.mocks.dart + + plugins: + - custom_lint + +custom_lint: + rules: + - talawa_lint + + exclude: + - test + +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 + file_names: true + + leading_newlines_in_multiline_strings: false + + # Forces explicit return type declaration + always_declare_return_types: true + + type_annotate_public_apis: false + + # 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 + + depend_on_referenced_packages: true + + # This new lint rule advises to use methods on dynamic objects + # only after properly type casting. It's quite good and will avoid + # null errors. + # For now, it affects the whole code base; wherever we have done + # something like + # + # ``` + # var obj = json_data['obj']; + # obj.fun_call(param); + # ``` + # + # To fix: Turn on this lint and type cast the object of your file as + # + # ``` + # MyObj obj = json_data['obj'] as MyObj; + # ``` + + avoid_dynamic_calls: true + + ############################################# + ################### REMOVE ################## + ############################################# + unreachable_from_main: false + implicit_call_tearoffs: false + dangling_library_doc_comments: false 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..410706e21 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,70 @@ +plugins { + id "com.android.application" + id "kotlin-android" + id "dev.flutter.flutter-gradle-plugin" +} + +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' +} + + +android { + packagingOptions { + exclude 'META-INF/services/javax.annotation.processing.Processor' + } + + compileSdkVersion 34 + + 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 21 + + targetSdkVersion 34 + multiDexEnabled true + versionCode flutterVersionCode.toInteger() + versionName flutterVersionName + multiDexEnabled true + } + + 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 'com.android.support:multidex:1.0.3' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.10" +} 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..e33bf89ba --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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-v21/launch_background.xml b/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 000000000..f74085f3f --- /dev/null +++ b/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/android/app/src/main/res/drawable/chat_icon.png b/android/app/src/main/res/drawable/chat_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..068a4df643faf99a956b6505eb42a7318ff49eb0 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1XHOT$5R22v2@Ci?BvhRFFrT4@ zCxn%~pF@lNpgRYzf}Uc-qO_31E7=67iOWU#uHY}X$*O~g_R-W XN7D+Hh^VhX;}|?${an^LB{Ts59||W~ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable/event_icon.png b/android/app/src/main/res/drawable/event_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..07d77b642a4d8f472e376228a74f969360a96c62 GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+ia8DP<5R22v2@5#>usbCkIdSp9 z!4DETt=x8Os~i~lKWMQZbYCI$PvAi_@% literal 0 HcmV?d00001 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/drawable/newsfeed_icon.png b/android/app/src/main/res/drawable/newsfeed_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ee35b8464af52d3816c3fef2394ebfa2a3a78c54 GIT binary patch literal 182 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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Øt%&g6{oexC;}nV>r~nga%cwlf-%oTLM6HE(<2NCf-+gGF(xggS zFBKZ29zMr<2Qz-3#@?jM&1P+S4YI7W#>#XpGWk zlW_ZKMnDJ?YMw<(hR|Wk`z2Q-Ns!d|Ec$@=1V9DGI0#iDejfko@PoCN?41EocpqLp zU%=_RAk0R-wzoNu1Xwf>8y3yb4~uDbx_aRlAQlZU&S)?`D83BZR@$Jg| zXW4cmmOypfWdl6_Y7v#pT3rAN6uskRL_TW_h7E%50b92SP`_IVLy`Uv4jy7y-fB>k z2coZ>MeKv`M3R~3=TB~`GQrHYCkdzL>J!| zvtv7ntbv3EyPmuh;GhP(!))&e1cS7aoqRog5lr;T3Fa1(CjEO zfQE0@-+)KOUgg=tbj$R^d$dr7VP|Kji0YXfPTm&C0u|j#PQO@<__K)ghqN3`7%f9| zp%0!gqU>>?Gsd^Nj^Yd*6N2dM8knmERs&%G*=F)loI*v}_HH^_-1|0|kpo|6& zcZ~}V>#`bjYrUhRsmB4VLnZ)<#*KttM`syLmsA#_ROUWG+WO=wP#Vm}CaBBK%lq}; zr3vsmva19Du&$xe$JMo6-$&B9lGCza)UB~*i83+nAje{%g~@D|=vdSROVW)4RYdOZ zS42l*V|RH0DmXJUGsr1*zWy4+#t8Cfgaao4vizl=pEx<6DQ@jNj$unrEr4&>zl1X~ z$u^7A&*G&<=+^#do{bZ-nAKA%t#~WH*`P||D@nifenN^;$UX@`d8b^RsI)QlIQzy- z(ZYgBkYM2mj5x?lB3>U{QngW0KbHNcwttzw`6*ipJ3(K({_eNujIXtrP4myQcMk=n z=+xBIleK0tO94ln%%bLAfZNt;i!+U>-)6efma7mAxTuG%*e;CVy~mH_jKATlEV74a zSo%}i4XIhHp_wOB?j_^+nVmLUt}fVPdEz9QCf?bb%`h8bpb+b=nc0L!;mC;E!httA z8^J?T9~)umz>T}HxA?f~DfHihf%RV}u>Q`uf%RY+65&o^I`&e&Svj(rY?z^gULgG0 zRRgzRlo$(3?^GMg4^)`?BZ2f4U>1DMN=!nsb{Qp20?U?{#&X9;pO63A2M=zB6;f7N zX)@cMEa*XBCx<}j8OSRT2d&Kx7ZC#Uz6L^qf+Vf0!R=+uFjf=<-D=S7#ai2TLHP8J zr2I*tg^W7vWis*{l!`H9xp>Uk*MC#&?_3kVpt1_%m#(6X3d?yx#c-rDFpz=<-^a%J zdE#aV?!pQ!YH7*X#2ARDu`?tzAP2w)g+UjFX=!PU&!0!~L*WFcA*^-Qx`}9f<@nVD z5nW!~DCmXp{3WL4L|pbD#%V!1Y`ww=P1b(~je=M<&EDkO+gsZ3OZ;=60vZ)HweMl* zINZ53b+iC{=d_=~%zXBNY5cS(HDhu91q_X#2rBJSu?)-?dD!1FeAO@9$Q=A9&iH(U~t50vmaKLu~*=c6U(` zP}_My{bzlh<;jo#Hv39+2fpeg-pwb*=5>Jyjwc?*hS6&$aaXBC#8OsPMn&i*X@5~; z{}AV)QW=3q4|oIh+SxNcaMq2Q_un^@;Q~MN$9%K<;;01Ot~WD{)o=_@0m+t^Is^hi zpR23o2ky?1+zu>mexXML0q*87f(GNTHz`QGENG8EOnh`>U7-98)%x_~do$RBY)bc| zG!+XD-SGpe`me0<_ub8aWHT01H z_Jx$aP+Eu~97H=pw^%+3>CyK6d1naLTlxbAh;GMd_*voo zUw!}1Rm7&|qnt@PA|WAl-X}j0SCVYsG8b_{D6V-s(-j0;W4U&_OE3-;M7E5K3bGJb*z0T{zi;Ugp*yk@?E41SG}6tI7X&UqJ{5zTc~4gC%JC92LBgw2ps@l zR~P2}NX}zPmYBBeWV*ddpW9t^h8awG(A&jiDkhb3SpM?#a)#EDZ2Q2?d?;~1yzlI7 z2^GrP!|joBBE6JGHqC!h&O)~HeU8UOS1F(0XY1~QIA7^Ibxk^}=#?ubshQ_Iw+kov zCoGa=Xsw_Zy^W!iKpP`*)G?iAgwO+!quuYfwK|T!<3xUt6t`L=H9tkC&l^4NJrp** z5p|EI?h?!>Ws5L{EzqH z_gBGjm8RMzF|D%)Rgor*@1t!f)4-Ea4tY2&H0bniw%`wWPDWP5^cr2f zODU42_nJeGndl7{lTRm3TGXV(*<$4ms^ABE#G%)`i5(}8IW};dC8HX&d*V>lDoQKg zym{2IQeodg5p{dJHp##KJ7XI&Bx)N2;~)jLn~?kjU=L6D)3~OZJ{$j^ds8Oj=~EE z(BakLi`6KTUWw;ht8<#R3u{S5E71_1{*W$u&Y`_;E6BS~Nf!RIj++MQ2_l(qUnEOsUQE6y z4Yd%G@w_?PsiBX~O|zA-8~slUNCL63@jCC%reDf_NlGJn9#2@6I+|*VE>2H-WTR1U ztQW`NNyL{;U-xDp+BsRG&w6T-fL}U0VTM}u6G_{}Mu_WCfOpHDCKjNzflMX(7#n+> z7;*k+BjSX}5q4a# zwhwk9^hs%34iV7o$-t3HdQrdO+BJN)%ppJeZ7@vk)6&_eN!z29&L_*A^p-12q8Rby z#3DRWxHvhpQak)kZMP^Ui{8=;u$HrJ$z*@6^X?l@Im70gtqjmmEDZOyCKt=bQqBpD z5*e;9%NXSP3NQJIyJ2ey56C?@%0Pp%H`?D`99;eVl<2m-h=X2_ZfntanCc zOTQ{AQ=DxN6`QP-x0!OvQ)|PmHIbG7LcUnq%a4IiYj0TP%E2a<*M~h$r~Ucy(=0%VxYhlCXcbxZ-_AL(eldp1NnjSJAqsyYA)<7xTYdCMC-5&(>i4d|j$&ebnz6`fpER^k zsMo?|=R&+hqwSx?7~LkjN#stWdxxg)l;@Qww==46MT?ovLcOxjkuT9BCyzo3DNZ*E z$vd0j$kYPet3CK?!}hY#G51tn%yIQiz@lfC?w5@oznGwZb6K~9c0T-D+gop<-oIrF zC<377@}%inkxgsi@~g@IC@-7e$s5svXlULG z+J{vGOYbYzTjhg$3S=2c8Qe8E*HK*j)7q=~t=35@FJ`GMGaVxzP??)bt%s0#JOF2j#pXx_DG zT1eFIR_Q1-ag5mUadv(x)!!K1n4tB5Kb`wgL{>f`!PZ9_6w`UH=IGv~;T{p}ql!K`W57)3Oq&As7=TQ|iSo=~vlB+bAN9 z()uTyyS|ax>v6KtG4TBA$3hz%Y}HgIYpx2^=^AF0X1b~O5IenSBZ;{%kO%YH_;GAK z-mZzRl?P|Gj5xi;>F_q^DY*M*l0gHJV{s2DHGAt*GwK%+sw=TR>R+DpgzTvfmgV=3 z|0a;Bcu`v25Pq7yS)xo8c;;$5W~Y-mM;U($)?@xxeOCcpj3IubbOlBmC0WshJ5EmU zyAI+0a6tKi0%Mj0Zzl-rnJcZx&0JGM*Hk-y5DvL8#q7TB@O}S1Fiw+diPFV+tbDDU z>Rp*Jb_VnKmJpb;e>HTpv9*z*FS_)>*0iFt9rkO6ztbRgQpT=rR%8RenYmnRv9HvgG=>39V_1z9wjnkUzc#S0 z2yb)~C#I{9%%bR1G3}4?d?WB$GcZlj6Ru?c5wUI*Yg2w&0HkYC>hLdS(Hzep{}DZY zpt&_ACer@hkTL#1_XB{XOX+?eJ{qX$VEd;VL}h6m#RMQNCdxh?A(~9Zb@<6J_X48k z){^PCvdAGN28W~U`Z?abFvSrtHwYNlp4h)37xq(9|n@hNG(Ns97qa0UR_Jsjv`9zSjQTAI!4^m3oLd~Un3 zz~tlL!(K7bE}!<;ak%{3x6KTqE~aP|r6Ci59c`?3{>j`LpViSo+47)5S#yca_eQ_` z9TY-tRo9ghTx?EnmY%w-Zag;03b&&qGvr~6d(rb)IVVje!S1E8DFj3c-6TYF8ikuR07Qe zIHvg|3}bG?L+3`tBs(hns&OjtuH`RluUxAnu&aN66>tHfOc#Pu@RV1SPu-e6fn>Y9 zfRCoA{E7AGw#`?HM>uu%Ghe<5$gH}ZU{=14{;b%|%Oz4{nHCsoWF|FGhTB6!awr<) zf@pg3?~m8@U*L|v3zMC++nESh2I?(a2XVRhxA6ZR=CHtnrx|cH_3Oc=R`*jjk${n_ zD*eH|1{OenTEV^Tm0N(84Yf|C`T6&Ij)tVLGpF}Q?^LZ!9{bLY8L5lAg4xJxLF!7f z47O{?CI4B1u&WCq4M0vkCQ7XKR%6bU=!ONjSD zE2(1IK1;{eD-!{>R)$-&(>JK)AefoHA>Dn;NGJT=sU_Sx>Z>vsUESSu|6(ozz2;A9 zF2_Oo*%y17qvKCk$;={&#=mU*~(}YMzP&jZeeryDO%LRqW(C_2UVouL6t@N7Z1zx?DM%-idE!tLL*o2INN=FFCjQbPgZIbe#q|;{nFRL zZLo;zA7XM(g7hz4F`fnpSb60O@4^)n<&7{tmyP7-`Ox8Q`|Gdxm0#_C<9AZJS*d~d zAo^XJtYbilHJ3}&oD)bIDR^^7EG^~WH2M@>Q&c1ld|cmZm>X&2H;c;j)qb73o7+_@ zZEtW%nQJdA_~9F#&A7DqI$ha8+#G5-0AxlM(vJ0p{dtqL9~brJ=jvJU7&3La($v;X z;^XpSd)pGzxJ(;KV=K2}-f~tl?^yw<60g@ANXT{z%9{eRFY~7U*>hN1amN*%g|J{1 z%j8}q+vI{T2{SJYiP*i{9gmx|deCU^5)XYrM-OMshc+uUd{A^63RN$?ZYoK-?p+@& z5_H>1)bdFn$9hi0TD{+ed$|)km&>~$R;gm_t2zr7KPp)}Uc%9bOHXcZ$6CGVK!&1G zlQCM$&ToT5`D}>!8yW-agI!bctbjw|zcjf_8buc_IXd&Fp|xPL)$1L{xhuKZR6PvY z!V8TzNN)(A_g-{Xi1Ci+w*V(8`s+h4PseR1U5}HU0<>}>)q9BRUkwc{2C|~HU;q3T z)jq0p+fm~Yz7-nCpXxo|G-$bH2{g)?@ON0Zw$m${l-#wlt~V~Fp}4!>TDCIg^j1uN zoXq*dDxx4du+_JZBGa1}s{3n+(KOBuqp?C&KzDPHxy26i#aeTZ;IWKMS2~Ktd{u7^ zbJ_^mVvdwEw|C>9x&EP5e8o3U5hWyb%(oSn(GY6yT-u*s35TkZy9ZWbIJ!|!@3qOp zparSXzyjEg5L9=#60e)JN@@45|GseTh}Ep;lW($lq7~z_ZLlLry5sTH@wklen&;)h zt*^~vjtDDi6-gYLTzV_{&R6i=Wzjo${c0I^nerveqL)aWa>PEwOhg#CS`243u-G(} zY}^Bh;3pfg(22AuvSnu#{#g~8*&V~ed2z21M1NYcvXbqG%eceJ2KxI?NtnZQ+*#Jt1pl_m4mDYZx0SG`n6-V`6)?Lc|D2Xa-QSisvR>HeeAQ__Rb{2{M zsVHe@aSD~3H$K@U9&bCa;Wy8{MArgO%6Y^Mui1Lumx=Yg6HD-~mxWSFd(0Ar8ih3D z*>S6R68WJKA9SkI@YQQYH>f<3Y`3@md07XBu8$%h|rc1#Qk7 zPqHl}z*zAZ8MsTIN-fNAEvNTQQ_Dqb7ox5fq^=OU$gG$>OyZVORqgnzK;OX69;ALd zf3xiC(KiNv$ou%snlu6w`15P})!u_}je8`uw+o#c`XQ~SmsQy0zLtxabX^U`v*#Lh zB3JYOoUfKIT}ym4I9JB~lCrU1A&=wS`t~(KwpC>~EwV0-RvU?qJ(W + + + + + + diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml new file mode 100644 index 000000000..c88cf94be --- /dev/null +++ b/android/app/src/main/res/values/colors.xml @@ -0,0 +1,4 @@ + + #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/app/src/main/res/xml/filepaths.xml b/android/app/src/main/res/xml/filepaths.xml new file mode 100644 index 000000000..c0f3b318d --- /dev/null +++ b/android/app/src/main/res/xml/filepaths.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 000000000..debef2160 --- /dev/null +++ b/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 000000000..3d4dae489 --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,17 @@ + +allprojects { + repositories { + google() + mavenCentral() + } +} + +rootProject.buildDir = '../build' +subprojects { + project.buildDir = "${rootProject.buildDir}/${project.name}" + project.evaluationDependsOn(':app') +} + +tasks.register("clean", Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 000000000..4d3226abc --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx1536M +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..cfe88f690 --- /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-7.6.1-all.zip diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 000000000..61f635fea --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1,28 @@ +pluginManagement { + def flutterSdkPath = { + def properties = new Properties() + file("local.properties").withInputStream { properties.load(it) } + def flutterSdkPath = properties.getProperty("flutter.sdk") + assert flutterSdkPath != null, "flutter.sdk not set in local.properties" + return flutterSdkPath + } + settings.ext.flutterSdkPath = flutterSdkPath() + + includeBuild("${settings.ext.flutterSdkPath}/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id "dev.flutter.flutter-plugin-loader" version "1.0.2" + id "com.android.application" version "7.3.0" apply false + id "org.jetbrains.kotlin.android" version "1.8.10" apply false + id("com.google.gms.google-services") version "4.4.1" apply false + +} + +include ":app" \ No newline at end of file diff --git a/android/settings_aar.gradle b/android/settings_aar.gradle new file mode 100644 index 000000000..e7b4def49 --- /dev/null +++ b/android/settings_aar.gradle @@ -0,0 +1 @@ +include ':app' 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 zcmb5X2Vj&{xJ(#LzMz1`J6cAs~amB29V`0TCl0BBCN7ii)g@ z2#74Jh%BOu1r!h)i(D_)i>$heiUrG}B1zu-f6sYmlE9YxeS{>FnKS1+=Q&R=X9Ok) zf(t)n!8vfiHI^dht^(>b8{Yr3=kxdD?>7ZOJU?Vu zQSp|UPXq-vVJKc7H(}-tbDsIj&rSGyw;)J&Pgrnsrl&CZL4nP2;`N=A=iE5+FY~s} z7ubzg34-C18*i95M=%O0nC~{cZoP5FqRDAX-nt+NELC8G-2_b&*^am0;|Exh7mJwxMhw~B4!Az z`V%~nIqQa*lSYnjECf6U0N+byT|c_MVKh4{ow)R2!-$dfL#~g}8Y`sjQvW!tDN&1T z5G2W{iUtXjN8T-VF--eTarbUa!p!()oAM9mi!bAcvajU_(MjJlPa*cKDSL4)8A4-p zfH5`0CwomMv&@7fIjAVA+hMoJW{=0~Pfs(*Y9J5{dR4QW88XTiODeNx2o6V*&uzz- zIpC30vl{?ZMBL@&MMc;gz@Y#9mzxC$eeQqt6ObB0K0xXT(|1Xz4BwuJ6rpdQ5-AHy zUluV@J5}>h?V;*ZRp*(nsF{UoPS+f%JyrWdOWGSnZ%EZ&y{AoM8|eGJuTHRswW;)d z;;XMf0K&-DRq_DUEo2J0LKoq#=r!2^DJ{)wQ#*GK<)`Nfc}7Rr6$&K@E}^h%=d?UQ zuw}bKuDpWeypSnJwWbDAhs3-A)jBk$sFE7MSD{Z3D&jkJzDq}1;BpK4_R7n#Q;>^J zGyHLJF@FX)&=CSUVqVqY3zy{Px%~csD=#;cal(eja!Ak!_#7z3S|XV>fMmeOrxoa=?JQwOM@zEMv$1aM1JaF{O?f3;L_9 zG`aSLmFxcEee@x7{nt^u_Tk`Jciz~!XU1;<@s%#+>ECz+MW|>!ul}OEEtmwa5EQaN z4^`1@e;}YJW~bl``g}=A`Qh}iGu*W(vmiA$DX0d5lFi^Y;FRAeuBf1&@jW_UD|U1C zh(Dm+`6I<8J;GV4!l}B%87lVYurLEP{qqZ~S7GtEam9t~FMD=v+sk54|5@DK{J{@W z!HO%NmxU#b&6gH8e(~jZpRi-!{m-Q;WnZ(XKX>-a?>@$JbmH}`->L%kmWC7WF3gRV z7uv#RmgX1Cew)XWmz12GXOj#NhmmxHp*Rpq_M5Y_i;A4d$+FYgxhCe6*ug0z*D;ptMvKw3YK-{qchK_eJXm4>wBicel$b+BQ?@5emy(x28XJRH-$nZJLf);eMNh{=6eRhMz%T_t^@ zy+%&!Hb!71GuS3BGu#kzk}Q(2c$e=%7ZhAb=<)$_R;bqwh>I}ZCS*qK7PDEBWx-%@ zShDGT75sfVdqW;N-DMF~^m*NZaIRSY*aMeVuU&ul#q}G-?##sAd*+~4eBo!U?8Tkz z2+iCFGfzy+jA=1BX0~I6>?>zxPSFr9b(i!I^CEt?IPtLuF0OoV?dnT3wf39VbH{#m z?3WAdy@Stc-7#~8I6_WSy@FjRi3Uv;iy}!jW-vG%ve|4fFq=&^+QGDM6cZP6as`7D zL%PfHpU{vKP&^Q$d7hjyMG|-Cv-u%y*TzRg*~qZCPy=lc36yP=rND0_e+ONh}sB34wYb_grCi zT5Dv>PqXD(<7si?X?B-(>uGHX?MS=G-WJXas^EJ8szXr>k|Gox;pjgE37?}%VRu=G zz1`!skNRb^;HkH?Zwm1W0uLYtz7> zi%^!}a=Jss0&{|uN?lIkBY9Ah*3_c4USe_!lUho~%$hOohUqiMil?<@+FEuSo5z;3 z+1gU=e(fLUzGY@+`{o;9U=iT21vF-%bJSy!1;NOe#cBk}$g)XgL2QG#o75LSK=3~? zxT~y8H5l?(M5@)^mXw2W|7T) za$=Vo>V|K=ZpV!KcT8FJ{>=j)I&eU2JjLccwQN?ekt1pc9UWbrKXLEPlb(BN*K;^9 zzy{3s2W+{*_0giN0HmTpN==11Wi#Y;3Z-YK1NXr|FfcS`4KkY)44ShIHmBJ+Bxa@~ zfx-(y{}ugi>=+Js!l)rM>0ca8T*(ozawv-w9nOlj5ia2maAtvSuCzu@yIP(mK2c$A?aZI9$Is1iR`Yyf&& zAZb9vPH5MWt^*IFzy;KUQ9~rj!zxH(?r!bB`r!L}480>dSMC`A|%Er2==NJ(C=-DsDLQfivlWAa#`W{1R*1VQ!rg0(T9 zs#=G{)OLa=g~QDXZhGq01P72b5XlfS8HG4vGfR4e2%Th}N@b00y z7Wzd)s@rPK$`VrDf;%VIkufypaQGx&(vX-hNiu>&U<`Cnk06COmjaI@Q$0>0R2=XT zcdCX+DOZC6j9gLC34xTKe-N9^W;G6sUH6A$6HT@W|NF+@w2NPF`Ej}EoG@*|#IY+H z#hGjm+u``tJMO@rcK-6=*V^|RSmvuM7EfP%Yu&=FM9pQK)AmAmbdCBU#YDywQ85@H z#wD>fCPAoxjX9+zK%|rI-YtUD4f)t-VopnuoYZnk-p%AgO(fDdCaRQUkW5)ZS7BH* z->v$(NK()g%=P&k>FFkisi>Rkc85aw`BuT2QWvu(3E{dJT!?m@khwr)rK5!&lO@QF z2s%I+Y;55C(ZO2CmdHLJM#)n>97C`V@RwNiK4Z7tvvrO3#TP$l=U1$6oW*3%EmP** zG0VNE zb+M6Hk96@#tfvZYXey7*VDLz?3LDO2b~eP!PFaO!28GdT&O^l{OrW3xTtiD87Gnn- zTw50<7CRr%wYGRVu^8xir0}*}4$-9wc~PgrNPioQvIII7nIiPz1_f3~&=oDkN|=u^ zxx6_;`n07%-1Roww}$=jgZ8@iCE;r%+X4%P=-MD;M_n*;pz4guP?M}O`uw0d*JxD)q1t*@+6;|ElsF)om6@Cj(Fi=dZSLGWhrmpdAcVtd4Y9Dt zVIC55$O$%sDk43UKnAfF$37#W%{eEW1w9kD!Bt4x%lvI`{miLXj~lV!wV5AZdhZ_- z?;97)DZx!w5H(!w zOX>=VTc^s*$ z-K*`@cAi|a=8R<%oh$w+E0hDEJDYHIG$h(2BNJ4`V!?UBr+^P&w~5s;n@xhrE=Y+W z0;Ee^C+kRnAT8%=IfST22*xB6As;2VY+B1V)3iOJ%odAki?%+;7}~@}Yg?5Amj;OA z*oU`eFVzsmkp!3t@&)K)2XsLubaEGi*DK4(=@v^C{62>xWOODulWJmCC+r=k(;+yL zt78tg5Uh^j-R&Zs6PvC|+5qHIo-4diCYR|xU8sk^PP)b8g5<}e(0+E5m9eD7lkZ)u zeSERy3@hDx``pDVo_uTRty;6P@417^ceuJQj9P| zu9WlaYi#z$(|iA>9n_xL&dN@FaB5=xcKMk0+c#REMr$4ni+S4T?7A0jY|iV6vjh&6 z`M{wOScJW9LQK(y0GDE|jwzCCgUgKL(+z?Si-R(uWiw%{hr+H%rZQifq}`^CXK%B~ z>^|)kZQQmM>^0aR4{J-6ecD~xHg>9c5Oz!_CSo;<`TVFR(n;`R+4nXs*;9P zO+t@ovQd&OuqPNZ)1n>LBkzV20ja_ERk&xs7x0DHIqkSq+42p8jH3lsw&DW)NzjVVy?Hj42#oRTA ztza|Qcy`~Yi$k@aK0n{&W#muOSx@HJFN>y{7#v!gQI-|OYLu#D)kbDCDrQw;N*lw% z6KF>SsXsdP#FsKzd%NXj?JZU+Ud>9xg)OTPZFpVmLm2N5F>#u&R2&T$1p)B}g)vF8 z+Dx*nN@hu-qs3n7n?z)M-(1SWIVyAIK~Wi80r7OpjeGWpkM7yCyI$H;zk7Fmb8S6V zXq}?fv-4QNCS)LNLkAlU^t zz~T@}qe*7L#8jINl0{PBG&n7i0T^Y51euYm2E^$! zz;y!0T^k@GPEI+dEoixu1F=$EY;drET(6yOY{6kQy~xrQhsnimgl5jh*b0Z9HNE_K?@(Fgk!{N0- zs@rT1r_)#+b4t)c|3=!h=@$hqHuqOEWp;k@n)??nSuGyWKGc3#0U|nyV24jq=gycp z<*jcowOmy8ou$VIHm$ZZ8X;t2*_r{ zYR!IM66A%&67-m?f~f|Q(_*y(X;#T^;Uv>0q!GZ4!|V(qa!mw8oCvtvbu>s>*WW?_ z2FCe`>+f5$VJr~1lXYh4_us*)CTcshC#AyiQ>TnGOaEHK2 zZeCY}fwE!AlJoaj>xKmv!Ex!!WlKo>R(ngEClAH;lv@f(bS;^hMe*`L{xpvEiJ6Nbm zdZu~V(~tjQr__j*$ij?ZB@0FHB++D2ps;NqW~%^1$1Tb>dZm-6QzsiT#DKrjGU*cH zxeo0a&B@A{C(vEBMD-A5^TwKYJB|KAU&C+!Yot+h$!v0XJqi2}j1P2T+ujdGI^_Kpmw0;fSR~R=e2_ zLlxZ1y8orSUoG%_z;ZsYcea?jxL;!3B_W@&E~Vc`T3{tL|NYFC^6&dgk>+>H{$5vm zZjh8tCrY>(!ErMnnrTs>`V1z6YBH;4Qs|OwwHQT3L7-D&WV>-u4-ngAeS$CvX(aK% z7K#7L2<>rg7ryqgvszC!g7t!fSF4qX`7Ni!pTsv>eiH31$kGxF$TX6agM3F|Re{we zkSSp@!-NBX41sMDaeA;MuHq3=Aj04riZwwMEF>;r-LXW9_KudqhDxKwQO(O+j*3MR zx7@&jJO*eIdPUQWGLsAjtZud#u#`*|s>oor#0^EB(9un}cCSm{B8B|m{D$PYO|OYB zw~UaJTLy^7k4fJ#;mu|@VRa3%81t|r$`;#HFo`UfkTO;ok{D#Akc!e}3(W+hSDdG% zvd=&HL_45fI(caq&4GADJdcaGIZw(UXqAYYCk!djDaW@M(!Oc=I371=LImpv`1;7t zAP8Z?R*ixo8=RT|K#x3i?-q!-kWY1mA|HRuKG#y`Dh(%pBa2oriblDQ@(N-Mg;6iU z3W_Qt!eGQ}I2(f^s+fraq%3|6Tv~zzJW%#wY?5IIsf`w`cbgrwT$XC!2p?!#zSEq^GjRzskT)Tl);L}5Fb%*s-v z-ILGgre5+}6k5v7g^lMA_{7&ME(~BJDt5^qb~)VNH|fn3(qtnbcYDe6c^UTS0X*~=0b3{RUXBH z7fspBco+c*eS{IX_bpBCWvqE}`4cbx)^zBZyZ$`s;5VQCpq*H-;*JNWEqUaI!TWda zdD^6Q-&yzGq&MDd35dY)$WhB~odlRS1LnQRSGkdY?;j1NNm9tt@;vQr?H}4V+F#c!MuKa@HIHn+aPQ{O-c5hnwrv~e zWOVDd(iud)e2}g_3Va3Nu=o|rz?k9`9DvN9fGke5ggFI<5ruxansPazVc~nK;^dZJ zknu1b+Bj;^ZGF$5AGu+0)x%z~4@+Z()!(M&KmzYCD%P5cvVkA0E6%#CkGr2tASVvxcpeu_fo2Fx zZdp!pxzgNbb867%mfTe_iL5B0DrR#Ue3danM>u&1waqLc&A>xFIJOX+b8crwiUpr9 z#4{&|?Wp4H8)g~VF7c*P?I-Q8Ea~ER%-B+-ti5B>-tj~CNgEf>ox8ZX9@dHr!L^9? z)A8pH~s)j?SR6(46u0}7U#g2MUXge!1U#Q zr>;54R*J{fAWa}sfIP(1aKeN^)Nh!zi`wxWI}RLwd~xmQ+I~HmQCifzQd+dWzW&wS zMW3YA^saZ>+!_aeZ%#?|897Ar8e6cE)pP!psF*ug%^cGgdyeSC+q(~qPRHW&P0_Eh@AqD`r zi7vS&Ax;4~=#O>z>@)DXo4h>YXC5L%s*2ZQ=oJ}>^nHL=H0ZIMER|O=;12}eWEp7(q8+d7Kd8N^z4!I6x8GV+Syegm#`9;2mbtaOMKia)G;7}D4RdD?8$M#__8s!r z#|j6J*?UYi1|PE9$xx{QhskO*noNF&>~_loV{WGzAyS-MB$4OPxsf}YTyeXo8iRXl z5DxKVjJ!iTzIW+O+Huw$nexehJN%Bg`ln}JZ}|y=;PsqUqqhFn5zzR05YNY0+X$V7 z*fG2mnA|pt!|W3c*TzI7)yXSpD+_>%=n*OA)l8&F*KglGY}j_zmljc$JoM1OAx!~! zETnd8qvqxF+8{!TqCq#<8}>=S>AN=O6ig0s(IH;wba}cFzxYYw__&|W6Aj#2RHej% zmGc`audNx#y1zGvFROWze(;QFkasra?>T6gPOB3q5H^3oj_ks<(Xb5NiO998C{DZC zW-}ViW`{+fXN`6{%9?zVqs=w}(dhdGDe0&slF~_u9C!TJy?6sVyaLALNNoVJ!ke{M zmecl~;<%lxK}%^_$qrA|wyNHiDzcOT4Lbp7B*F6nRHBTKIx%2eWl|J{ouId4h(6lT z9~=}GYNEMbj|a~&b82czN{$WHTjp$!&F0EfTtHpG<+M0b8QeMY;dN%_Koc5u==mme z__2;I4Z+=!K%|tIoB#9^(daM9tF+^F*Ug`%9Y2@vD%?4%DV9?B?5tN_*WRnUZq96R z^`b?)4!8Uyk6lx9-PYO>ub*nkqvtk1lfd~7!0n~@B`Da>!S&e`7r{!P>X3G%UmZv? zJO2qbzmJG_#8{$U026usrq|!1#r}AN15h{YPPR zV}7SY8W?l531ppNxV@Q3z=30+jV=H(Nh*@vYNmEWUMyq-dXLtxx=NCrf7% zeu>?;?|k~H?c29KrG2lxvzi%qGdJsYpLU6$*bJ$+7f^Vh>#vSx1!49hs%1!X8l0Js zoPy2f9S8+sbQn^Ely;RGM@6EPjKmjxkvhu@^JAfdia_&wMO8{@d!R~E56^Krwc{5H z?9<;r^2yXgXSlY1canF_eSWQ%TD5LFvh6=SuU))HTF;d|tB0~Dd;!wA9ABAamH4GJ z35l4bEE59c$teLxy5H({8%W+*g@G|^8}j~1>*_h`oP?5vOBaaiV1FP&1(dEHlp_>p z-#kN^z4+90`N$_{k4}5Mw=o6&<9jw+_bsPaY|q)dNqc6;_U~c!JAuv~LmSrowvT<# zXL?=;XjGaeROV-aWtU=k)3^fVPypWgS_2vpzZ-zC)oEAu{j0K#M zxiThQh6{dD35w!*3)DhT0;hy@IqVMIm)A8YfP$SCNEfAD-=DvA*WlqF)NSuFW7M)m zWncc+Td$68c%XXab?cYk+LKl9+8fGj?o>K1yRbaBbo9dO9(r=*N7-Gk&F|f-Wb`cr zZxP@vQ>vjSP;+86IvgI4*(kblYUeopaOn7oK`x$H>>=G9SJ6;Q8A&+fYzG%j{6=I{l21KxW7;B_awWK1O zAw$xHKmb8%LrO|&Y6cvG^Z*609gY;$At)q!A$_qHl!R_caTHT}4-e=+Adpa}+Xe>3 z0n#Osy#$e5HsWT(JKBEj5bL%qBU6<#ocFMy%Vn3-##B>R^Ifb!dxfoJ=bP`9$7-$> zUsrD%E(Tk^@{hP-OzNPfF6?^%4lfwE*}!pA9nDq|AThz!gl{G*OtHWxw;_gRMHB#d zG+KNzgUag|3(zs9Z$j66Ze-)Qcj_UuVFw|$0`bpLAD%|_@`J2V+xE@3+IF#*7}hqi zi7jVZ4znfNGCCzl7&;|CG9Wn?uh)tAm5gkH$rN;wVS}gKvft-K-WM`4g;Gs8Hr)i! zwHCJmI7D1O=*;b+Ac}s7*rNU` zakd;sq_Gf1pcHyY+S$BXRJA0jzh)H8d&Pt2j3HAFPQh4S~c;h zSLzn8Xk1=6=cbasivtF-0?UZ$E^F2SR!})W`m|);EbWlFq2c@b8|W-Yig|K5B7{Dn zEE-e=mqoBh4o5)pJM4DUWl9#83(=3FNO2>IAL25Bi|ja^W4q9)C6LhwvXTqSC1PGK z>tEJbdgG(lE*rdTe97&llOF4T%c$kz=BrD;oSB(f7A^mBW^&F|(53UWHK-XG3tV>S z27q6zcLO-2tat=MM=l_MSsMX2=@rwwXk^EQh_;=LO%#iWW1G7xIf+6M#GxQ*orpK5 zpkgBIGA1W0DJfzgU>41(X-S?TF{6D*Oi+wT_)=4nR8%JEMeEog5{VtElCU@xlxD+8 zP86X-DXBj0x%;S6U5sd>Pn_JdeFeGhi*Ej|{?3U@?%A`u7rVq1mYT8saZ|r<(z2iW zqxND(q1MNAfT#m9XBwbO6Gle6INTP|WV0pv{bJA=bi1AD8P;G@ur6jwN)kL!O%4=9 z1_cEGUsgb+7s2T*6C^_U*#O+Q{AqVUp`yG7*cC)gC8#h2L5T-me|^mF=hZf_h1#lz z#rK-Ny0K=@p0mo^^*jz!AL-J1GGY>v;mecAn zDS>3sh@?zbs*sx6DL>$GCW}^+Vl?=C8HOBC&k@9mAkBG9oGO2Kyus6>EUzp;+Py45 z9;P8+po;K3Lta^KnXcBjMSY-j+4?2dPn&xEk`2pBN*W(n^1Dg%8XDIvDLp=OXx;3& zLuzM>Cnx`I$@(QFWy{tqi_Mxox^Z1&B(iv2XNj7RYMZNs;nB`!SHPtxU9*I|)YM1-%^5wV(o#=S_wJoNo$WapIfG*vexrSG z4CN^8bp!Fe5ux#14Bsi24y5ipRM4M@dvFGUtff*9Uc{%X9Y_jp-sRFk2Pk5IDF32C zeO7$DZ|A}K0jq24swUj@S6m4|Xh4SnIBkMFp-cG8NR5-DfM@=gs8 zEq}b>mCQ)jZr!U2qfgI#Zdj+ORS!NpbC#z#8HHNhl;CYaZHT1@Iwf&2n~*emw3Ww|7^;{esABSYMP$LU#WL6h zk>YG>2*{?2CuzwI)7~z>v;3Aj-}&Us(T6rw&24UclZ}0gz7J_z{(4;7^7{Q-S?ZRp zEal0q+UHxgYGo`oN0nqi2%#!AJ!oKoK)Ta_oR1+rE9|h@GAtGkOF=AJ_GF->ItNb80dsx406-J&2sXJEQh>|`P)efVh1!kKS%@9^e zMVTK%@rKpvun~))%mNmm1xYeRVRjTtgAL-8f}lTVZ*HFAoOH{>`QPYah#chE0Ovty z3l9r0W?(t`uX;A`w04dKPHU^75^nm49)G0WkKpc62t-!#m~*zV9tqcuvOid#;@DOrqe8tr40u7beDD)ANU&yQG;+h=7k3YjYq zG}$vmRE1^&GwyO=r%m+hYm~vFAZ^`VL~00$ue2=sWO8}8PIVI&uYY;f<71aiW#h!E z9j7P8igP=Sd}P^*`NKEN{~gxsC6Bj^o^!@Eh5YvAydt?I8}?9ntvAxd3-{QQxJo{V&VKNpcjW zSZD`bO1Zdq2_RP_`55KmO3=mzf5U)qLDJT?leh#eFox zg50Dj*^O))Ku(9J73IaC*f~c1Ygty1#Fc}4KcKT>2YgrJ&>H|<~?tvqGEIL zWWtmWLm&9guQ;(xC0N2UDs>URrvSZ->F&cUaQKKEX+JUZcSiR9VCOpJbGD zcI1PQ5pmFYNlEEeJChZ@Dps*q=KLY z4<3H%=|hLNPn>{GehUMR-U-8<8oow<|rFD?6s3yBW%l#dsYG4?jT=sFX(iuA={vH)^X-Gr#urY1DeD?T-=j=(UiIW}_Es<;m?2Nq2Qc z{OAE-J6BlzK0=9NK!o6B2C=uaspSR1^gR0Jz&Ir(iLrbCd8}}=^b5us_J~dzN+U;M z*4>aXxx)MmKC1-H$Y*^iK5L;qD=^hZTO^$Vf0B<=8O_c@>VOKd(VNuCo{ze(6cI$0 zl9Q9s5X*76P-*W9C+y=yr9Dh=P7ojp9V?(|1itiKb6KFxx*<=jqceqC(H z-f@%1|2plXrW@A$u7q`J_in4k-(OQZvZB1IXXi6lU32j18IMne`Pqw&Nbm^uihs%q z!#pt;9ZJ}va5d^4>jmTU$Vul41ttGt!~)^Oe;&aG3nTOqDVNVNF0l$;jgN3&K4L^- zgfNYdFz=PbFdxzmi8($-WkctWHsmxvtob%*hs8DWhL(3x!Sj@j7X!x>};U zg^=~ANyq+jX(Pg|VwynDQ(dFTrMy)S!{4#F>dsmKFAdJ3Z#Iu;g+dc;y-1@UV zBI)uu=mhjtrnUZt5eTudP}>P~29i(nS-R+uXn(t6o&IoXx^@_`p!JE%N3?!~5&han z0FtaLASuTxUm6G!eU)i^LExM?xJ;8TeF}3I7xjjS&N%107Eb^*voLvqX1TOgDD6%hF6)&&nrS_|2`LFLk z`Q3NR*&(T3oQN9xKT);4*s%Jm@3oDZwo5-V<(Ppeo=O=F*x|{`@t{}Cay*ctC(fJC zM~LZ(6X7+r9Y!o*mH&AJIPZ0Rgw8ZXQ&gAB;oz&_)%b|y%U2<6>u^ltBZ%_~^mB(+ zTgI%iQ{D*OlNLo8wqP=$nw-MhNkzr&z1Sqs%b4!KK&0=|K6r!`vhI(yu56sL{E&9nt2c`m3V-`~@B9{5 z9`MWSGWi)@6+guSegdpb_FXw*0ki+-5je$-`iRWL8R>J-8R@G`<0FV8I_YNwNbpbA zI3&F}BnxnAB*~eJ4*}1Rl%V=(^6W~ZsV<}kY$jByseaj36Epd0VzLRfiw246)b-FN z;+i~$%e6Xb>_lO-53z(cFHPQwirGt#Qi1&*jagd;Ok8*WlDlt{#IqMQv?826ul1gK z>+~rAi|VwLDX5w$5gMWeh%kooP)yS`*={fET2xeOPYxM`ygWm)6zm-7JTMj!ihQnM zRm>GnuW|b}-piG+aN{l{X-|UBj*cNp{^^Ec!hA!5P_ICVJ0HAsqX)Hh$)9$PRz*9P z^nYM#NV%F3F)OD5iY2go;vi5FO|{9*Kl>Ym*?`%`*!x_!Q=TmksUOyKd^ZCgjMEefAv5ZeB~LhH!ENuzgjy`bn6C z&x-}FxOTnr^#wEk)$5sw_p`yjw$l5%UH*Q1+w1j+THy7(%U_ohuM5*)NfU2h#Rrg9 z)gjoE7{P|3u!%Lb9N7@=yY2kZn1ah0$ldQC~G6wJ&l_S$U4#ir8I+>DH#g(g#Z zPG-0yvnp0nLJi?5DUqsJiqn=q7^U}q)$giAiGUEUjG@k~sFLdNxNdE$fakSFasS1w zx5Hjh%LN&YL#8knI9-AJ(qbMQ zseWQSr-nf~H9XBvD?4#oSH8XgS#zA`zk8hxHuBf=FMmIswm$zfQi3?k?upZGeGKb< z#3A?x9zpA9DB-~x%$k^E9klQJ9Y!o@z2@=}t#@I>H|-t`6T4&jDe zL0@GWA3^deNrwc|h}V*+VQx7ui1reakZMU)jFLqXMOSL7#gd=pa&<})f+C(oIx{Hx z{iqc{xhafm(VkNov->4+a157&v$)%R|kvPOI8EA1=oD06>vj=9FmTNd8Gsb$KHJ61h#-~C&OJ~l%V z?@)xd3meT1KZjvS&NsP z13|!7VD6foSC#XX(4X+a=6~)gF_dp3}&;xxG^1*>K>>PFb&1l?~QG1;xq$Z)X z71EvpUGV++0TA+aD+{qDr9-5=WA`}vqg$3&_3wXeRlk0NtNLF(h<@W5m($-@53aqo zvc6W52iMdMtgNfWx}#h7q8e!(w;IBiTMapJtAXl(q|m@C%SrzKS`Ede@*`BBbo-2} zHx77&YLxE0x$Kdi_cu3rSf7H5TW7F$t=ikUrMFJUWjZKWDx5TR;wDsqqGqW_{fvgk zw5G9x*y+Hwr|NoZ#g3sQddM>%Z+%v0vd4i= zsw|h_OtJb*k|}Lq%;cB+!12E+s^%hF_iRZxCkm_e;FAj#&>c#x*oopTQ;&S|@zD>a z*bN2>Lm3R`;?-8tyLH2PaWxRUs_$5>mr>9b-7=`Qz2d5EPqb@&Pt)LT(5}0*@0vVb zRl^AG@v<6p^K*|^x05gj*NDn4jNm$()#y4^SBSI*_n8~pW~fbgvzO1H7PQS!t8-WT z44Rj^xb+zX1FMr3bNw&^9$>XRUwbemESSyDvW=gwm;pBCPJM>#4l~I1_8HjV@A(Yj1V!pIOa^Qm1~!C!sL#;muMiAp zR4+yl3~Yg7wU_za@2!whN; zhhiY!YY?xJfC`)%$e%n$7rH9Y3ou5P$viI*wboT!*bQB7`12@(a6 zf#h2LQ|Uar_}WKDKAG`!i8-JhMh{T&V~<^oTBlUcnkr9PF?-lVFUw>iOJ=r)q01*l zjz00k(WVAe(J$VRx_j9@Pd~JQc1m_WYGiN@oj8taT7T8C?C5|ac|50ZZYQvsCOT_T z=lsMB2BL6%hT7Jz|J4kf!u1(y`8i!V!?kTQ3}HpAgrtk-G8p(d(F{Z_75W@)6t^GT zfL<(p4$ch-@&LNgS|=G@0(c(p(127F1_UrrB-7KuZEABacR$&CBF64{xd8zjD83=Rw47I{5`V4JcqR&9G zL7$=a?|g;s_UYiyr>+Y9<`(Z3Yu__n<*GDRLA_3ni8x5e3{&6AvYyD=Gt$(Y_CzLK%1Vr zf|Ey_g9sbGs4@l7wvrGftdz+wzNq)b@2B=`bjH(P@`a;KC#gkVE(5TMi@>=Y>L@(zUn@Ohk65 z<3jwBWPwPxOyGHvo2pno9}{q|;1>Yv z5c)+ksAEE;HVPN-p+G@DJ%bYD|IkB0ERtxIyu5$Hz>cqGJ=rzdAa)Y<14q`7X@!b~ z%AIVMCbVo}J4b1|QSo~EiF(2bX^;xOcW6zrH(FoSac@t^pv^d)3kI^0hQvqQ$nGUM zV6{S~aydZrV4t{E0i!Sv?X!wzpP==k4h{Xigq2o>V}-A(yr7RpzU3-5zx7FEX6Uja zJu`z;@TEl$e=GG@+kUK((f&{Q?NEJ$E7F_tBD1!~Om9Pbq3ur;iYJ0%&OOHtz!`tKgOieGX397uzTs zeJT1ob;{Q1spE>U+Rp1MwpnePxjas+sIqD>2G&bXNFNoNX$wv)4-j1fEWp}#gvEhLSuz>V#fA>L;fojW-wTM~f$* zUgDRQl(pZ-k;nTSy{dHareR~Qow>l&thL>TVMO`TkNSls*AJ6x<2Pe8uXuRoTK46o zs^cFMXG6wNw@xZJJ0uzm$;s(%x|srXhROCf;6zk|zMzXL?Pq-ivt`+PQpB@$Q>nf9n8m+uAAqa5~=2Gi3P5qs`Ae{~FN( zSv+5I%}`7y4R0u(A86C~JW{|lgB~fUvC_$iZIr-g;Cexyp;kD|&sMyA2Cf(M8RFj1 z6*Cac=rass{V@YY8``7W912d6`W(aHFwuy(Uk8o`9EPE|f5VSnu1V2Sm(OQonVANU zLlAP34Tfx&7x_LH@_o2I!DhqNKsL#Y>p0A^oJKb-F<*Puj|V0BT_rqMblKfUAR3+V zNyES+*7HTEY34~kp7?{_=Q;N>S8lFhX!FCl_ZQ+usNHNB>)Yqfur#qP5x9T*u3cOE z-I^O-VY0A$kd2tmmfKDGvrwOhgM(Oa&ZMi z6VjYF2d@480&}+b4G*oD{?f#{mzyTHHGh3Q_BIncB+mCf_Sk*Q_#E@G!XY)AsNdGO zWHlOY5n{b2-Vb(Y-lEx!afvdB%P<(6B*TPtI@Pu1OdwID^_*gcV+1^6h!9AWwip{p zFjQ)Q>M#SBV0*a)gLa}mC_In%U9O#!4l6>2Mf4TZ5>j&*R@~pdBCCFsujo(6Fn*s2 zhq*Kkb1k2NbxX`Z9`r6g!w4N_*wlcz>%W-+xzo5!QqpmTL+vxL!93ppWfjjijD;k^ zohsNJV4xf`8_#!55o>g2;d!jgpNG{0JYNAbt4^#~*m1>oI;>dzCk}I4h9e&~0B%9S z%&?M3BjnS(MZhvTtMKe~`m^uRvq(M2i#UdKi>kWy3mrqY#A?)$^@iF>e;>CI?C6Yw zjgW*eFp)yrtt$@RL2kzd9SoP*pl}66N*03=jt6eZL;l}NeKPtrEL5(dJMbMoOaLsP zD^}R@a5JD<=?kt0-Oh6HqJBTiufK{78gBc-B`vtV1FI8!)G?MWjENSxOkQs=HPvKE zcK97Oljt}3GcxS~Z=f=k!d;7?6=ggwuR}!(8PAANm-xXe!6CbYvt!$Xct;s8@`)FT z$J@%llyEe7Ygvznu6=3ek|l}mGODbh4zr}>eFq*qa*+3!9X#@2zrMh`o?j#%<0_&| z;Cz#g_do*gdNh&Z#UqI_Sv^dLj@-m&;Ce)#p(c^TY^x*TGjKhk&rk!C5Hkc5l&Ql& zp0hqf?Z2LZ>k)m1S{;VVXF!=!VuqpId#C814g_Vp^nFmaOP^yX>!|Ojn9J^A8zc?=iyNbL@Njaa3K2mbO`wK z7y0wVb_Y1^_vCX9W^?s3(9`gEC-0WytHN!^s)M;H2^_ZZ8s_Mj14jJ9tIyGP3RlE@ zh2}?v-|ONXK9VWG_Gm zobJR~>obsV$7g_D9?;=zi`3{dkdHt!z;YM%0W{2!$T3|B1timt`Wy+LmgG%b9&;!X z^4P(lAgc_oS0EQ{6|$mEvmJM5+AL_x9~d(VvR+IHaiAxU$n4^c+t7Ttq(L0IL_2=q z-N$bkI9e%O)ihe(%`auZoQH9`MGAH4TpP_s4MQ@#3aer^qdzAt8Qrb+iCgnJl%?o4emtbmUWiCW-(@#N_$Y=bo;$D`MqjVS9Xp;qv|-Mm`ihyK zf4=CsLul3CDb2-w5ijq-eG#iF&r-|-a&U!VCn~+E_P$V9813a!i&04ywxsZjvxMtuR+N<)t&d#@FSd(uq(@qygB88)6F#?3>@qS>1KDVO_xPE|e zd$c02Q@Bew94RbB33Ek7TCnXFoJ!n+b4{1h(!Ac?`g^1QpRdCal7r5VivRWwC9!py zqDT=(4aZJ9mS9-s{hv4GplmpSsSXWphB(&9Ec;J)>1c0ry!o~+J%0b3Id`v|J8SLZ zguw3II+y;3dv=r}j=x+4H6kQnM< z;lSQ#BG^X5-e|XP@a&s-v+$Dqp^R(;;sD5B(tUj}6yW-cc86$Mil9VMaWXywD9(u3)DX(D-IW z549qrZNzC3mhyVpf3*VDgQHdvA*t24C6(q=4tdwqSw1~rt@@KkZp^2I4* zhFup!@pTGreLAS@f|uag2bCZzc%&EjJCA|aU=gqsaeK=sW!FjU`7@0EMJ>RdbE7U? z2_3~JAJ`o#KF~>6id%$>BFXQLiSLhrj1k z3pVcGx2dQ!NH@o=m(Rs-Hu3C(tTCAp*=UEO?HZHy{4Npw@)C4gHOQx=Ds>O9YtD>1 za0h%6ZhbRlKm?h5{Nq08CT)HOBsjRu!?VYi5qnifIxg)7I#!NeNuuc6Mx=2wD9(j` zT-D-1)Y(WC;Joe|VktmwTf9>ry=f7&dK8Asde>LYT~$5h`O4bQI(KsK2`sts>IF6Z zXVU2&mrtSF!wzZMBbtQf^(f?JFv;o>3?6*Vb}n&>&ZX%0NPcIGo+bhX@tq_)-z3b! zQwmc~lu*mp3uko|*|Cgr+e4N$3-X85RAuwW>u#pUO8=75bz4JunLYTg5W+~pCQxt^ zDAkJqLwh5OKfgwb#CQ8D!#w2RqDqWfS|-`ViGGC!~S_TH;l zVbZY~=t3C&Y`(AL&C-?_OgkKuiv%IRRyyrkMyqq5N9{7tR z&&brCOYcz{2S%d<2lVSVU?u-m+xxk^LF=Mm9ETU=1xlwmvM_UJzZy zxKTyvD-S>+gs*a<%3jo|)XhdZe_DamANoAGYAUTJ*B z-Yg?N<8wNc)?(c8X>1#L1S4nAjBLTEjx)0C;_Pgft8Lsdcsc=fub9j3;`0q}MWjWr z{#g>^H3%hSE8-u|bgP6{{JkI8!oA_h!sg&5{odUM#P1YTmfF#^hAWB{++U9Suc-zx zQGE!a;@+3s(6Ui`OWD^dG*#hEm=CqWxUBntsEVE1=BJ#YiqoLixuwbf?vr?(?qSC3 z$Z&xgdGrcVBfW}cU^EAJSRx`M;xbfossu=^5<*7&)-hg!N_V#!+OD$w=kQQmMIa?b zSKa8rp-g_cEqZUbc9tV87o`LLbj9uQS6_Phz=6N~ql%XpPu#kKIxB1FL60YDcy2&AsJ4egBrps!9h9|M|h zZO~9$SS8E@tBBU|NIQK}f(5trgjK}3Z3cXnA8u&`b_HM;o|9}wq}}Y6;hoc^iyf*0 z+k$Ug`x5&@pGlZQuRvCRA^?Yj;PGf8A#N$_ z2ZQWF2|nxrJI+G44BDn#wYUVUMEXptitJ`bwD1pw?Dz%I%-;S^vuJ% za2VkS;cxt-dqV*;JUg5WVomA_cq&F%y#@5CI{0XotO9&yp+lBaQw#GPjxIuhrJyDj zvKX^H*)_3%$AT}DPo@vFN@OJXbvNzB^l{kr2q}>i^cwH1VGgMSYdZSra;9#6?6=i>_pbi!vCZ10<)6ysTUV{6>U;d7ds?yAUU&Bih#yl((N|SsV6bFn`7~8(CO7rG2UWqE)lK_!u`o`%DY{{yxdr zd~w}_>@&cJ6H?ufLYcyK=rJ|~k`2kWbbP>3mJuII5K2+K>FKziUot`I(B~5b&}my8 zOE!`RreEa}FFhd;@x^mf^oVCTbg(&+dA}c`xYP>{_`M=s@!+CQg~O*8{P~SL?`m1b z<~_3QkF56zR>2l+e~c|?X}tH&!}8l7z4>;_Aao(iV_3f<`&nRvwnzK&i1x-ft(gS| zG4ai#r-AqXvvVUshrGKZ5n-Sh1;tLRMr4tf}BHJ6tfm}969{; zJM`C~Ob{E;ixaU1&$sZ`@6=yk$X{>EIG_q0x{K!5byq{H4RnGT+G4e9TF=V|xORJh z&oF#IT(`x`=St!gM2Lhyu60HxFE`&ONm)s0XcjMC?>1wZ>j6t!Se8Jjw z#TPMsq+P_dU4e&uB2Pg5n`^$ffrumzH&Mw9hL?Q3lh7PxE(kiEE>~w)ikcM;XAO*n!;oLNSIve#R1`uX+uOdE zc;9FHmbh-=L`iPH{t->Q@0MT1jVg)k0LpxM9)ZgV{joJ$-+= zw#(TVYi`P4e>jl8z%o_qHH3D<@HdO>hQofpGmT2SJ1I_Qo;O#-r*Op_xwu_CH`kVwX3jJuWmd+LoHhe)R*ScM#J5K+ z0o)V-@3fy0wnsbVoAmLmB|f!>e_CkCKW#iB4chU*dS<=xqu4HdO4~2mmrK`vpnW~> z+{m#D@2QzPYsDII_sM>P8VmC;)NI>2{jOAV_Y6&|{TSjqde~4*x_-ZR8+~^5e zJv5qU_qlx*f$qD6p_P?nv4kv1NxqB>qcP;OdvH5UWy~W;`qf0F>f6qx!yfoa;S~z> z8A7~4B`@36L&$;Ojmjn;KBmg&O&4)y(ogqj?_M)x$Yhjp;NwnH*F?0xNh6MF7gyw6 zdt<-tkLNseaLi*xnfaa?cKZpoz1d*?c;8b{Nnft78dZ{N3pEn_iCi?@Cx@iTzq&ax zh4+&GtE(f?)ToD;NaqnVko)z|S4V>F7F~XMB)2!@4Tw8f;Hlzc`J$Nt2ONeJq`uL+ z=Xat##E&w6Pi4%+B#`=L7XVUOe;Z@sz;!j;W?jQ~Ml1%O?nXfqc?0fWKCk_%oo80a zJE+^1Pv=ipv@&_>q8YPH?1*uyWYwl?^VwtgsFsJ>-P+XVl5^+3`Bq->!7pE&B@B^v zfYh)FA;cpvht+DgIZP-BGsTHg2Zoa!zg91CyB|AoZST4{GdI4n2REV#{rd9z{3Noz zHpBWtZ4WGxOWYzcLW6w@zdeh10}h6PvGnw;ge0?E=AQL`{_FGjC4XM7Bt;xbHp2@HJYarrs<*y5 zHN|SEZw9=F@J@>WHRu*Et%t&%pmip;2K^#lK2$#eaiNN)D29S9-mXe(((t^g!6*eMQ7YqbX~E-*dgm(H9Tr$gQLaM_x`(ES|*RPp0azV z&11cmRIVAw(?uUK?Z7HPA937b9Le^WBgPR-0zh8_?+9fuf#eiP8YZMU0f|maz(`0d zv=wlDSXW+8*bS9AY-F{6?PH!ZkyVa(WgS0*QT^Sg4}rs_7_2cX`19+M_G1S`{mb(U z3W|y%su9GLc4I0Mc0qF1F#}$ZaB*>|k_Oa-2COqj0l=s%4hvwUb%Cn!Zwgr>wy3_? zbV({ijCh?ID4^9KIBSdmi~t_JuDddekE z3Y^UXqEa~5u(c`T31>etpYTMJe(tZ|b>jH+= z-O6&Nydf}yWqTa984mb>ej5zkD%^}6y2OP+iL^ZL7?<1wvgK)=#$$QM0d-`6m@ zHZyYjl-2M2Wo%xtzulL*?&wy>K*ofKU%_q(2AzJuY)ToZdq}r~7ZZZerF!&)4Slb- z3PEjq)3_0A3<<(83`9&8cD4Y?!m3m^Ej|AvZ{Z)y^W<*)(;Y2m=G}1pja_<|ufLO> zxbKsjQJZU)>ptAGe(i>b?w$Gka3#T2w5c%N%au?m$@)5WyONM6t+cE!@stH?an)y$KJ@-i>sIRxAW zQS&5`1#I%DM@NsWjV;?0-@#Aw&t}~C!N>;Y{LAi-nY4<3w_R>r`{dxU@pJZfTE?=E zvRLHDhgtT0_uhQ?CjM2WtiE`R|Ly$K{QScno`aFRa2R{=fI1!83AA`5!kG<*EF;i> za#Mh@l@$({4XL1>Pj}iq_WEY1^sX!*@zraD2nk$pVsQ{XNFHvATWNjr(HRnilL-27 z!d)I!@LbUknQup4H>9WmA>9gIyDy_}x3bDBW-R!9Ufe~%yIC;8v` z-&o|f$Bo`|Z+f11?jzO}hWk0_6My#b0`^x6bz828?|ni>w_Up7)ni9b+ti!T2$k4`gWrhmD@FfaS-^&iJprcE$wO zff?2?^)WR4$c8P~-^rr<_|iE~Jr1@J<9f~?2IKqtI8p4v4o1d=W(P}C_`h(nkS(qi zVUPz`vxMmyVF^o9qS_T&(g9r|&Ly&@>0Bafy{E9&TPxADPatbsv!#c@T?SjbwKhqN zp|Hju!2gF28HUk*MD;Yp=rMq&)u?UqZNztTv!7CJ@rODBV>;S<6 z{g)0%{Tu2pD$UjD*AE}xzq&l_@~c6~b&#)ANAdeGK8@)j_uIJB#l{k6)4z5X9Vq8o!(GD0)qW2TA(y+{)=6{DZa#U;N_?P zIpxsJVCMSWb~flAw|_8g=J31K1Fvl6+g}5RWnqL!EI(nxchz)k$?u9j=qz2(N{~^8 z=a~G9{L}w|Pbk4Ch|eg&%*&Gd!dE8B_6SG?bGAb=8xdt*ZIhyAilgC39LD zcq-Er7ZN*NK6CoOW^#yKlDpYD3JFz*&dds;B~y{t6*kGTF{;BGd%d9hPWUU;b8~>x z5aoYG+2^(V19$hUcRoBU*14jpd(D+O%81b`7B7ChURm?GoTkJz0)C*lGo3Mu*m7QYijk4~q_>abX`=B)7RlNa*W z_7CkKxYEgJY~3;h@E7o?hx-lzb#-E|Ec(-DvYfm}j_i(quI&)R7_mc;ohfpS&T2cP zwT?`}4yiS*#2)%1T_IOXqqQrv+%@!P7jF`Ne;X{`RM_eU^u>XL(GJE<12I?`yb9zu z#51MewT?3la$6XHh8UrMVf-lAFRSGcii?^UVgTm{syon5e6_{7w0T$eVBT%;sA1|zz1kD1thFjtO~OkArG@+0#pqR;YB{Qwy732CaqT}cw&|l3zVI?8Fk2=;v0Aq zz^>Lze&oL2?HEi8lGjjttOY9&lc|khTf|L&j)z77K5z^aIv?^q`$orSu-T`-ST_HQ z_m?br_tm8fSnAW?uuOH#id|_&|IYi~{%SB&ODc|yo&5cXi36JF9lm_fTeNSmra!2ddjC zuQ@)FWA5VJ|9DJo0&nS_6)bRmoxV;DABcUtUEjxg-D7LL7qw>$+G9nwMJf>Pu@dZ7 zaIdR26JlExI9@ZqL7xOEA(N3mm6%%V1!`H>nkXV%MtRen2O&A&_rVux$^G8Sw zAJ|pW6t5RN$v_UX`n?DidKELGcV-{Mrqy?Cs|l147?&O^6hq`|E;&RV{)K}>TkSuK zsJ2F|@%}|oP3?MWEB5mYasHA{(Hfi7t{13cMyx{`=ZoTkw3|qNVpM%p3nfEBp*X^g zbIJr8C;)7CKftdIKGbL8ux(|U6g#}N+nNC+_7H6!CzYe)* zOdGNI@`<_J2+Me~)yq0SeEzs^^W|C0nm6cbHPmvXT#i#4_1Gl(G)J_Vq-%0K4-(x- zjD0rByMZ(Z8KInz=#rUax-QZa23kU(YBD`Pk=7LOZ?H~GR(G6h(2gsim+&U@UfjurT+r^ZEO6$4*2Cg48I8E3 z+bL6akKKZ^$>KH9*+>IPg1&+wqf6UVWVQ&`4c#zlM45JH4C_z1+RYW{y$GJi+D7+W z15O^ARSm-}Ky^{Tvq#VzNb6D%#K9=Xu~<;@2=xeAAs3OM>(a4x`OyH7U=$i1wIxXj z0zLX+9NA5LrMzLjI511;sC;e+sXwHTw<$i5XV^Q&r5F_}<~&GNCp^@)fZv}+1%fIl z=tTO5Nlih13Qq5YmL`?}1b6Ex*g7B+^kHFfT#i}QuaG@&Rc-cdDFWb^f zeTW|f>nB^Ln)XgdkRuG zfV^k417*+d6FDXTDNoX8T2na0O4U?CvPPoS6`Bh_AuSN?K;lW!_*bqP_r(R)hmGg= z^G&Ds{qyNp4p`!M$~PKcRS$HEo}0vH^GEmte8B*w4%)q&Z+=CL&xKRwG{n%oh_781 zEA{~r(2^=i*@D<-4O!r4~`XwiIuAj17F^@eNM_Qf@U! znFq1%8ecmJM}8w;{lib}^bhCGN%DmsA-mULx{1RLx)}5q!Zd^;2DuDYX3!1u$LNl@2!cH~#iR zH{NmE9V_Ls_+fc*`H{O19LGUjCNFK8Fm@J6XMv9bloBK1qhMu{{r{*jANkV}2{7Z>==IG22u@xdn$x{)z)5LzOZnCLKBK`Yqh!9C zVoYNA4dos;T5UA>Q$_)kt>!`2K5{#M{?=Q%nOs#{CmjBae{exUWZ+}D?D*@|Q=0>~ z%a5`}?4GJnA^*`;<{$FA`9nv zKmN2jdR2T?&o2CIf7vkcgHCj2pykR2wEUtBI-=ImYZ$bV#q3jUqDR@lOZZ`R^vRZ` z_&>6g$!8kM#Q*kTcjp`E@Rud8?6u)22!O^29Ixc|HQ6Fw0}cdurK!*QX@CcbiA&hm z;z-E%AT;_)uQ6n{U4_elJ_eXUely z;i$@MS)^$I0^`FdFg_U8nPhB1J3X+Xqei5Uxq#(NEJ9#g@_7L1?8JF&G}@7KREdD0ebu(l4s~V*Mm?2O%=WZb)F4!}YHr9BN5cRcz-oE2rE%Xy1^L^FI3Rk(Lja z&AsE?Q~ZkunhuRw^}Ds}Z;-cj>IS^N@X?a!x@CW?wdO9kX5ynweOd}TfW^EAWrt%m z86p^G2kHDaVv;f%5dd{6R=etOnd~&EZH3dC=0R48#}5xMMz0bopNG8}lvOs9ANR*O zzYnkief#on75Dk|Y|p&oEnqYxDI)GKw~38GS(?SkUR- zA-f|@M#`Nd=yaKwLtoC?J`+79!7iB3gvx0$n!tNj5RGCMM5;=6*%vm3`6uq`;x~>T zC@%ByPuYf7vnnj%{PxeXb;|7S?@i-&c6P>_y<6_VBt-_j)$f7DGZ>j)LLP2Gt87w5 zEDb}B>`_LsJiB1)VphfG0+*-07%tL(g)T;I(7)LcwwaY-B$`O>z);Ttz=!Mm z9B7$1ONL_hwfnBdTOvmjTyqw{lbTH`=ybtlBktEa>~t#Y_W(NEy9nvy^Utp*o?Pv- zDboQwk@)P(g%yEwN}w_trM}``rI7jE#Jvi^bWaJJlErA2jV5eNQ$lgQbBzhv@ZeU`=-A3Wlk?(-$MHG1=9?WbuB1?stzy%Mu%x0j;fZxq) zx97N}j1*T2f&)MT2w1>pY_tTZAR&>}rziI%)|sZ|CuEk2@R1(M0Bm8t2TWHfK{$2| zh=U>6p&Wtw(H$X|PZ88O$@j8KR>0EZ``6sL==aKq2bL~btxgE?_rL!)KNci5^$;sP z6KDB8wyh<7#j{>{ooCn5JD&H&CwRBhJfV_+81K+KxHV~>aBfV%*!_Y9<{~=<2T(wX zwC|x~}(ovv}CaPoHWj^k@4tMdA1qN*w7tXSj=JCUMh|Jfk^iuIK|l5}gIDZGK7{^?BHt=A=uDK!8L zhMMg)QS{VDwiiYfOugWBH^9rm+zriO<+Itq!)bGwJq^uf>T|MZDoOHb`@JFuIvRDq zDxuuS4;*9izqv2|HD9Y%O`80t_n}|$AsaUGwb(FmxkqPyR@c0YC1{Bivz&qq@h~hc zvmaEvsemy6fw4azxf;mbAF#O0Xj!5yzhHDFtYB&k3Wd;`L}Lu}_{jZC`tiqq@iL6f zh{=!vTxhhtx1msh|pCW<@nUS0ymlU?bkxVKB0#<|)g2X7Ysf1flx3<{&Ki|3ap&2(? z`AD|WJaxjn6-@*FI2vI)iGSzsb7shGw;h~+OWl!32_(m-{BQgyjRvBegkR!CbPYBj z*;Zz#$2r2b%60<}&+WD&X^+e*7pk@h4N`BP7@J?UsgM*N)v&xO$ZdI1p@eZ0|LVsN z_`fp_&?FtoWS+mAW@+*KakFQR8$WC2I6!Tl=I@^Ul8zES^e?CR0sgNipL*)aC!g3z zRtdh;Y|J3pQs8!W$gT-a(?AYK(hhK`8oJ@2PF5;VPv2(Tm(@l&J$9C(H(S1vk!%ysZ-&!<@o9NYJoQJvNn*J z(M>M#-&(hEnh$Ps;>8Gwc+fL==%+sLhExTs

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 zcmafc2Vhji*8iQ`w)d7z-z-T80Yb7VgkqK!AhZYpSwy5u5$PcE5CJ0~AkvF~fEY3I z5HS>ahy@i96%iYv@+sD*A5VS0r$To4|7PxP3hMtO#w2@Z&&-@TbNV?e5J3#X+t(YKxjdyRpewi%i z@3soLVYg&3h_Y<66Ji$4>VSyZD@sCHS+2t=lqTdkoTStd3ON9i1f`Hv7%K33+-fi* zi)CfFVJ{t>^&F~C9w zIEckzaVS2QWK@K_P+7=XTAG)4+iloxu0vpZj{W3I^@SXGjukt7rTm-!R#2e50_;cu z4|d_=-$eme0N){re|rf2l-}=3lIUAi%d6jNX>X85wO`8r#{`f{)KpYeRaRD2 zRgg1V)<3jm!`g=)rL_M2byBV@*4C0LGH`G0m)~8vbouKm^%tLd@`=Ac_4wmYUH@F{ zJK5B}n{RLT*Y#L1w9mpp{YH(vwtXwv+dVSA%k1S>7r#FK_R*6{ zH|~96!{kG^(RnvLF@}Dzo_>08((w1d))>biWt?NUj|h?^DhuM(#DR~j-Tm;I^(%I++bZT0 z19^M@OSIsZA8GOPwd6GhwKJfa<4|QI;0jioQIfNpLnU@m7c6!b6^hv*uTwNXvUcZ+ z^=ls9&A`&%X@|YX$(bL2A#cC*G|dOpA>u;Ws=5WM&@P-LDKgPnj0TgzW|xh`BAU$> zBlwrzDhOq-6g1E#J3O}YOrPQc-^_MpmMD_ACYL;vNSFM!@4(IjKhvctWNEJIrn9FW zPNT<0kV$mo2vVMQcq&=Jb~8b^Ea%84K~XKkEFZbbx<3LgFg2jgDPG$CIrqB;SK{2&sLL>;v2~`Wu-dToLqwA_b79@4CT=9*izs{II3WnpoRpf$LCQb*vI}VA0BIBhzb|*{mURP1T zQ$@Zf7dCIk%Un_kKV$U?VUsEdW{W`@5HWZ`=5e|x;g?mDNSiyCcIeWzG}LWUw;nyZ zbt#7=B7z$tW6-g4E@uLKCaht`9(MvUqlK3?gh4I&aklXNE=mXZ=PQk1S zsz1Tt=@T*NBwL?|@V%jA$x7L|c$TN_z8NGJ5TVP+ znc$v&$b4S{(YXYdmB@)nc4ME2T}Kl7Mi^kmJ{q|O00)Z5O<)d;3+l2NU-Y=a8$1Cy zv%ZWhIxwyML-*eL*w~?OTzUJS+diN#ia)LK&=glXX4w4J(O;S$a zJe)$OaH>-=h@wd+36dhY+(dCIeIo{&&gqnNs?=~k@teh#%p|F%MDe>t@J9e=76iYQ zCtY|nS}GnsaDgr}>f5!VC8UxbAeC#RPwR8Y*Q@JBmPO|Pf7QTW3TPrx=nzh`Nq)E9 z?UUr>Bmu}01l8lg8G2OJ+$W;`0dkfFkY&8G;fQ#wui%cQzS7dQI=rZ_M|=!Zngq)_bcYi7?7$#h zL9SX96@puOo!TaFZ<%J2C1*w_%<5h_{>T5A%q53sy!_?$cQ#zQo4QwTdwAWgTZRr? zCzaRNxK}6Ql7k+eIy=i$dI?kk^oa6DT%mmKm~u1SH1+i@)f!RxcS z21Km(1|bq-cICm}RUW)%>)0Atn{AbAW3!qm|*dPlEkwLDI zyUa#oib5tSA|O&Zr@l;jss3ll`ZK8+O)hPqtLRaNley$2*)LrN)#`*+VUJFf@uER5 zE0qx#PL&ZGA&|tk;c_x&+hCqCkxcMCSK3`aLfS12TfUs$v3&U-R-_P!SDjv!8du~Z zd`S}|Tm4U1QW;rJ%E{~vG%%VDV=GF!epxC7eI>z?DGjFtz{_+lmym3gvtf$2u(wDZ z5NYAH8+%9WG1Zn|6mFHqwIoOaW{Sks+PIK{FjT=3o7$^^UZa=wTrz*a#!(%gfBS{^ zvisgUuFJs&`?YxXrmC5<29BSanZI<*@uzxE9dp-^8Mg=MhcTm86y{woSC1-n(9FwV zd1M6J7F#>&+)09vX{!d(*Dx0gHX9VUF`rWHt8xs668j4Uny;@1I$z=eUE--GP< zbzt1iCwbglhKVhL8M5eM+_1!>2Ga#77cBw>vXkJs%f%$JdUWW{2}9+i&s?I1_mi$9@7*t6{Dp3yQ$HXpiSQvAaOB#5Po8yJdktQ^PQ38Y z4~r+7L1%pJ7Sj8U_vLrxvk(# z=|b;tmP<}C+Wda2QPx?Z59n{)&jzDflWPc;6pbZWI2*MNc3d(h+)v z>~PCL810(O2|66H-%gY5P#EPkD@Z^3>lG^2l7zY)2VT5N@}GJ3$Ul_B`;RYv(r+xK z7hm~A>OTE}`BS26qMt5byX-!8TNZ$up5?M43tkti+hCP^2~MGR#3`Fp;LFvpJ}#|6 z*cmu;ArwFULT8Im0nBZw<4^QEV)=c`E1NIT=jpB|N!dqV@9R~ggy;+OJNh|2RkER! zEF%-YAXP`J*7j#N4H#2~0%OqEnNDk!4REbFU5ce5qDZo}BEn87uKYDPW3~7!($#b_d65hz_tasouYNsC+K~eBJGzlBQV!Dx=o2KBWL%pDr4xI`ywY!& z*Ti%d)o3KLpeOLhsD|DVh%Zr8dPhWw;D(dN1;o_72Azd10yYW%mVT>0C*?)wizA}D z#cJj7CYrM``gN0;3_?LT5w-%6^h7e6ZkULv{xKfHh%v5AVt26_$jsU}cmR)nw<&gV zN@vceunV`|FN)SAy_}pPB=v^orI^i*-Vw8`_Pvo__2Uj&M;|&uhJN$UH@d!dg#L%VM*<{a^BVe`NTa2hS!4wn`z5*M(2$K)^kw=r z{fNFDBrj`wSJF6^Lt(!GTwE{9ilA7`dZ~9ruUCw!1Ra&TL0~vExrLkyvCTs%4dMSG zC9Sre*49d5t#}|>30r%uco)M!6^LjEpP?k2tPrCFjb0)W3^G}jDe(f z)lDc)f&OTPAeN!a!y>?PW2DTM%h$`;eZX_NmJ#gLFSly%Rk2XP1!_&u!($0884f$Q zhZr4_3d_POz{6J-VqQrQXVk1C;UJo-Pu)+|2!i*qNCAI6V+lfHV>dARpYt>V; zV&D2+{RrjowF()wt+apliK{=ysD*i2>_XeH#{fY|Y&I}*htnkKYRJu0%|FHx&Cv#efx`2ie9vekIH90s;hqq6Lv@#(BW?loNkuP4|u%WXaY$ zA~jx_2AzX|;V^;6{@>J^R!-3E^cBYR$Vk#1*7E3UGowHK`?p_z{&y5s^)7lB?#Ki( zjx49s=uY|}eTx*3R025Xlo@>)a6*OQL?iGHJPR(j5j1QxsydysBBGNR=9_W} zjUQ?PTgGhx=F>^c&J4;E=sEiJzFIP0Y!NkW`QnWer%%Y{&;At!9->KWcddDdV}b7B zSg=9YDGbBt_JUp{BY22p(OLYxBNkcb0{ehjUiMmpdDL)$APeAcg6PrxIaa=Sn+*Sz zUM~4d%zQ&vcBLChh4_Es=PdAJhX1iwIMYIiXf`->CZkb@7=hPku;6M|L@XBg<~%q# z$;5mqp(eO$Vxluz>(7j%4SbfYA((-FOjezyJLuW(>h?bM{HNl`=uYME z+h^%#k!x44UUMI4mRTYqIB*Mwy;K*J`2?3DXJ(mGC9fA;*egqrC{0L7z@f$2 z4|5jC!SuMv3nL?&TT)z_LXBburO)e?Mf&ZJw0`BV_a@Zt>%4mHn@`hoA0H_?^wiSL z?W>o6{dZFR(nsC)WVK#2v+t;Zg}q-)~SqwlDj^9RCVLqJu6JPi2L!E56b zh(aVu50{Y)o*+w1z%^xyjMFeLni~BloLh*%$}Ex1N1{LNjs8+cDm!Gf z=%9Jb>ia*ob@whngC?x&3uu1kv+^605;Z+r>* z&9pl5HSKtuOeS|7q8-I0(FJ0?cr5z7*e%+Z!Dm>T5BPc^J#2%YTG2@cNEM=!n2e2K zj%gOa9e{%T;g#!59ym%9_EG;a@uGOKeo^$am?td-w1I%exUqrx<)E_Y1f5J|qe+p$ z4kV&)rWrLVEbz;5pF}_|t9MEIs9k!Y{x>PLTHd^+`r1Umt$`nVD&Xp{N~;RJ3y3km zsjd=uvLROZDa6Pprdx?q;d(kvFOdK}u3lYrHNbYuoIIZbjwHB_0DU+3PhG&>F)>&Z z{hyfo6z>SpXO6CrB%N(?M=uRv*n=j z64-M>*ns${y|ulK^r z9fz2;Oz`dy&VnBdrp3_F(hmCS5`mEA@&(DM25<_l!-8xws`tSZPKWR}tc7QyUsI*bk+9u};61$TJ_8bjlnLEi~Y z;w&*rDsXbQcUE>#$23Z}E>!H}3|8a&;{K2R_0tEFpXp={&aKhwXT4dwack|CjT_}* z^aA}EU+)hXxC+sX2NsUov*P48-<-O1?t^z3HOvHtSIEN!uK?T02I*sv5`3x!E3*qu ztc-;Onz*j>+bJ>IiNz+Po#|iv&4F^(GpJ25*R7ZNi>9Jv1#EjrM&||PmuJVY~ zxCkbFnxTgiU1kt|JS|4x3uR{mKS6$$+`G32y&DVV1b?-}D=zeDd~>QH%22-e>+k zbo;jZw_C-|E8V0eK~#dYr$2o*@uk-*)@KEzul8-;{scR<6c`CsH4QNscz4`pvr9z$ zUy(dsBd!7xAQYWa9&zbx61xrDTdqYP81}Fv+;p%|W}5_yO5mwx#xE1skeEB@cQvoP zLPp&(J9lLF5yOa2I#pjPo$Ax6Gg%+3PFwIGbWcghrfxYOm}w=H2wjA`!Z+pm+h>~7 zIxG1u;!?y`8Odpxeq+~e$+jX}QF%n)v1i1Xp>Ji=+w|U6t;C*@R<@R9JtHmc-nKm> z-lQ0f#cwUV*Koa+mgaJUvO(KmH-WPlPuz8z&8}*Q$4*$Vg1M`-_<39lX^b^vdpsOn zREXc?{4>d|KY1}fcT&Z$mk+)`KcU}#_}zW8T9t--44(YaYeRZa$HtZCPT#fp)bx9Y zEuQu7|IWTw?lmzXIKAht7xnE2x5?eO`tS=o*N$DA=&CI0G^|x{@11og-PeT3@CB12 zJ?@k`&7AYYulM4d4nPKV2c3Hb*pF7T9_-p{@cI(02B%Xlk2vk{`WkRX2%^XL$^|() zBS=t(M!+~H?Zz`Vmd7FOxM%U-AFZj;8}kp%I(=Gv^@013e-J&1+nqDG{eW9vcqdxK zG~?YMl<~?XoR$sp+QIzGgxDPxU9X5mv=K%bZ*z+^=A?zvge(+3g_edgq^72>eXEuo zI<#!nUhYM5N{foyw=XFH?CWc&o5ME4pWiy{b(u^Sz22YbwfBm6!v>oG>Vww8IY(l% zNnA|~OncMWa&Pb0qg(&pjWbfWf2n)$Epq)eJ3X$uEk3!1(-h#;E)+xGw;GKmlU|h- zz3gy8d$rs3dP!&UNH$Gl$OFZ*pf%J6{KnBrxJCp4r&*(J9jVG4N=Cm*yOWEj>4F7& z_UOg@&SS`2+9tX}RPUtYRd@ZV667JV^CUwsw3sYigDz>GPhNM92Vr{;|2oo)b?mS#t2X=r;EA zAMZzBl6!5e9CmET*caYq6ceLXtk*5%hZ6)hBUiV<>oFVbb`Y!GZnXUsu{NjGhP5zC z-M5o1BXo57Yp*j(J@x^g_vQ$nRFedwF(;!W_|IH|1$tVd-{=J&vrG17%)hA>i@1$g z#C&){;~mGv9!-C~vhK^j5%ZO=iLL(my^lTiHqD1@B$?@q^Fj84{M% zm@G5r9z37<^&6MZp1rUFP5=|E&9=20e}9v_Keqe{jgF*jtkaHYh}&W?7>y!)AU2C& z^l;7)({`MtO|wZzTnI64$B-xP>D|HCy|DWEn&mEi=Y8^U^H$qOyP|b+uQQWpVHQ}f z(oD?K0(>A@vs@KdgXLNt@!D0%&_F+V8iQ?ayFzPdv|Y1fxjHdfsF|+P%rD>m_?`iW zsur)Dx@*g#vX4(Z^JK@zADDA@o3Rg_L~72KnjTwQwjDG$eCti6gYWF~z$3kucCYBt z`lj|pJs-vz)2{y@?p4ac|Cw*X?M7ybQ<4*WMwi{yGhz+fZ8{v3E_P6fZ#8r7A@GFr zfvx~8iwWwIkcatF-CohzdSF7*#8&j>?c2*olAGwuBW7E43oQ;ZKwMeb_+c_o>eOM!i_Er`-w|uHXB_=kJoIm*!6DY$lz9cO-vFn9gpe%jn)g7v|PL6-oRj7 zYj%*nxYUoBXmb> zTsaTL?O%A=V4jAGoi5mjJL$-SKU7-vrrB>Eq$2@z&X?VbNI$XNHD*u4R#Jn2mJDg* zHYBB_`n*;Ptae$S=!Ce@Gu8>_sae4+B_L)ABm99x02T^yIvGusxU?yYF{PY$+Eu7; znR@m``u_e&Q}udNzVme5EA8ESIrzdpdQM!@@!Zq5M;F3>Fost4DLqsq&W^6wH@n3~ z@e?cxtIEb6^?Z*RVTVppp?9%F8lpFOWNel#iLFR8hhvs7v#WySC|&YA36S)E&?RKe zarzd0r+Rk=f>(cVd+1m3Z`abFd&E&~esLSy z5o~5@3TFJH&D=Ah*oeMogh{)m1_2j(4K}khrT#1UpwEimL=TF$O_zo&T2y}wa9Qpb z+;;r@JpRN)6Asj-b4!raQc9|;Aqh+i8-O=y@-7o0cn@?rrUw-v5b1z=;!!=Yemq_e zxj1|JiFfY3d-1G~4u5^=l6m}aaiv(hmE=u`tP+QhBn6M`TcN&0FMOD7&i)Xx`U3+kFHy9iGdKL}plIHaqCU%yXIT5<&+W z`8CUB1`!5bZk|=amT-}!GSBPOsjM_qF7CT_N$I<^XSl3a7`r+F{(X_her^hqOZz;OpI<#?-|k1BSoP44#p>&CrxV9jQh(FFJyO88GIajJduKXgRY+}b=5Q2`+=hlIV4aCa+6LO*1F>6Z%ICem_#Y?0qAy1VKT9Q1gV7W~oUU6*o#Yux}Ox z#g8I*8jw;2f);B})OOywdj0}ZLx**#kdm%ld+W8={zo}oRo(AzE9r%WpN?JDdh4pZ zUoI^qoeqMxio$%N%077~H0*5npe)Hk2Ewr|bJ9GXOdUKi$W!P1Pn+FUSdv}h!&&%B zd^%*j=zO|t#vOFoC0QkLtpxZwTCsG*(g}+fj$eNJ0~HlZhA$t#@PV;QhgVlD+CFR6 zj-4}RZ5PkqGkN9k>fXJphd(%d&XPOuuqS?BHu-PUc0M|N#%>f1K;i*^EdJsZhJ@QX ztvZv*ZbnX*K{C6o9-S}2XtnBWD)PAmm&fKxbBQ*W&1EJY)yy)37{5fOIE+7@|IKVw z&OX^zVyDgcD8nPZpeexH#J=DM>_z79rz434a~Ajyot`5^&m}u$>qa6~I24 zEBUUt70Yfg^RaMR#$9Hlqopi0DlJ*iT5yU!AJZ+fRdvOX{uNbcUmfx2sG`wJ`_7s* zf9tW011q-t^SzJn>;Lk=2UfMabLK-2bX|M@6Zy;6J=cA(lrv;`X3MFA=dDP|UXq>E zG2E%Dr2D4H!&c?oymsZ5F6%Sf^zGTULx-?ljIElTf-}JnkAndu*t`s(iBXB1XlBD|24+!FW>!f_R%Q`dP?VWjQj(cjq)abt z+qSSEKffUMlX)A)B0s&m7T*_&VM}Fa`y^XlTAJHn^C>0mk%8p2nbXXo;It!Q*lBhq zBXGy&0JpPFPO#LM*B^gy!F==6J$Kp=^d#hHe!zIWRzxIX;uH;7S?ExYX8GXhON zh?GQ*e@7-#UAV7PbSDg7dHd9@kI!B|c0%rq>cz`x<+RhIr`;h1sz!|&KYpSrXIF6c21+$h-27_!-kt%Lh^epqZ$x>phi1-M6 zTAA99fn>;B<`SPvYY{seI-7n@(q_}WVm8^-gYKrgdXh~^jlXg^Nc50{K2$6uh0P-T z&Zq^377k_m z1lZ`Z0hDDin4Lbgq`ldW(N>q$sdw3&X-*M*-z7R-PS;;j7(0MQp2ha9F%NG11%oJr z(7A#V4|Spx;{PBv@%){YqlVlzi5wi<@59VYHekz?! zM$;YA{KfRu|BK+r^{XoMO?4e^+@JgPW%b%GD3Eb41O+UVhKpBlCz;(I2wN@SddTHY zv>RXaO6=k#zS*=A2|P`^_KX;tN}Yv=7B4xa3I*z zd?cN7fCl~w+CZ+vjakmuv+lcQqAgs+E;>Ra5s zM^?emsf(voZhG)>%oz|%`J6#`Uo&jTZMzuwz^ETHMm)O@uOs*uC=yK^318EjL zyb7ERp#bW(IAvfZO_@3FVqx%)8P?*=f!z-r-Me|#y7}k7nLYQ8F_qoAPHW$zY~_e$ z+vRU6@9^dAzHfE=`Q3M~nLMC-=kB?|VQq@%Lep&;b1@*|CEo|0+!%9VWhh{Jx*%EJ zZfg1)t@nqg%0J(9po^!=i9+m-`9r$H2Ji|+;Y7t~)Y}CVg6Z7|3wUhqB#X#A3(RTB zMOc$~SDe=EJWvX83EK;bM$8{VhR~-Ttyz|6och(qp+;j(4Ou|1KK~v!8=n|nwUfT6 zve~E8dU+(YbeoWk7^4D1QZY$(2XbvBn}SR@t(;8D%#7VFcA0_>&gSgJp@2Mc#``mG zs`}{6$KQ%=XuW#i_ev?`yn2nu6!15TeaUiZ7?WFJBjRBeL>dM}kXjjYg~E)A(<(@H z^G)rw!Uyqu*B(8(#ws5&;r*-w6*`&b;INv&B3QP%)qzN|UC4X0peYyTM;)`qxR5Rh z>Aa+F%f?WfHXR4tJYdSuyGrWlrBRa%lk_c%bBi1YXJ%uaeZ>m$xxymIh%$<(+cBEK zU!`0fw9X7W zS&%DyhwBA@0noA6(?eQ`)X2SWj!?;Og>9|Er>?^T$WtKyR-+2O2gPC z{wa3dOz_qgYo1dmg8o_2u4Dm8PMx-!32xn?Tw61@+HOvfDIqS{Dt|%VG zZE&eb02%3yB#V{F?>N z)J0KelwLj{9+OT-kBceM%VPIyRpi7Ro>m)6o+R&zhZq$t07pfBD%P9@RO^I$L{VU` z^Bhi&cO+$VydU8hA(lAKZX7X3DAPuG{$d2_bN!k&BC+`hhE;8rNrIDORV0B1tagIB zIfSpIwYC!a>BW<9=WpFg4w9S6-ws7jeS@l|>J#E< zEe%&(zERvnm(x9BI9k7v8nrW2%5;pX^BLx_pLI9vn&;_pycB4-73T2~qCb8@H;$M? zjM@n8fEWd_T)##bxLtMHh^*!?*gE(uc)ImZVKD4#>zE|Gj}h#4wbAGRQm2~OWwX2) za>5@r=-|pU5VJ)u_~X)sb0)6D6OB*r8%cMP5hIaiwr3m}L3fTNqvXwF@aN7kisAj-%U|6}RB}No4B%7xyy>5i#6RZ<;SvM)9-}PA;cS(K8jwn;P(20=*+Pr(TgI zyG53e!l$zIGoHNn8g3;Ilr}M%dBQt8Qq8BqavL>Yhh)ztUS2imBU#7~&~hBVUq9~d zI}c)A-Op_wb@!wf>+Xt@i<~><@z`124de@ z-*+HOd!$#lN>BGj;v-ImXO!`iX&*b?a*lU|!DGDh#u0Obv)YKHzZikjU7(FfZ$5&Z zoi@uPVKYBFkz{LU$8I0Yn)!SsxM$!dbA)^iijxn)-2yj}=kdGcVKEa6YF1ST6alZ# zf;3G7u8+lFF~DEW^EA0DhK1l`VK+_JKvf{qw!j$E<;GOac}Ug#{Ag|Mhs003^;h>I zS@VrICHv(o6kgx!!rACQSMS;IAeO~5W40l4p&gTvIjxkGpx`r`g%n3CCBMMwY}K}H zR(YhY(8|N(Zn3~f6F+0z+sY}?ttIO)M<;hFXnqmq3DMF3AS~fIPG>2-T&a`&tB1Bv z>e+wg_?MqOKDlgLuMY>^wQyvQo_)g07SbPTKKbnJ&*h(&&Mfa1NN-gdx_$e&olo`H znw@vJ&*buf^Q+1x6_pMvsvLajT3`9#!GCNA&Ut>48o;@9$L3U_8*)-1H?thEv%m5A z9GES5-u5q^lRh8u=V$|<$zA?_<vsZDm9@`yiQ&hHs% z-y+)~%hrr+Z;{@rFORsb2vP^-S~V? zfBwA1Upyy$a2}wDoMzAYiE8jCA#a26=yuw9UB7<)W6V2-ui)SK4cZ#L87tI3OO!Z_ zCn0AGnv9rpJzX1NiH*4aEJh4&906I4v?2z>86WWjMx^m|XtPYBM=-)zClbH567Umr zRggy`w~tksRfKZ`syR6s`NMv%)#0+MhU}JxwDO2a@;dxh8+0&(iymD z5k0nzztZ>Y=EwKeZKF>=z5D51Vu*f2-zAnWz9#BC`GXf8xwHDF{Mo(xJUDsoYC3~{ zyRMdQe&Wb!cD4t=AG`D028TrNXtW~^ zOIS?B>U3o zu6po6`faDqWgSYxW#TWfU$BCi*N@Ai<)txs-v<@EX~}N45fsu)*!z)Q5fk=yDS&i3 zmhJb~!k#5KL)gax7`%#$Q-nIK!IRm~W&2+1H@XI0G}wXpvAB663emit(;s_M%M0l-yZ@5SDDXgPNZ+}At2h7t)OhiMq7UBNGd8*)bdga8kE8RG zAF7@FE1WXC@sqpp`JCzec?0F#@SOB<^5?;3@8>70!Jib+?piB8fbnr23+5{r&Q~x; zgOJ7t;4bnk7WhrPLWXctI4xaGa@+05sB95*3XUYR*B}{Ekx%KBe7Jwj(oLHtn{pCB zpAzt6o^F~Q^zniimVTBQOJhk#G?onQT07~(AAkDbvwO_49_db`*WS%YV<(hIb0;jpBmr*pnJMGky;F1{PSUu`#&z(pBv$!*v#n2lmr>u}e& zO-lO3EFV$RW&lHzjiWJw%U;s&Km4|6f(_3(1YJo3g#JP<*M~$~T&vO`eANJ<|Cby> zX8cqH+EsBV$2ADBHE))7av3m!c125+VcPrH>*8wuI<$28EZ4wb=P?Zo-6fbEO&at# za1dz)KSf9raF97zI(r_U@dgOc1ovqWGUIE$0Rrj6c@Sw>vj!m_YvXG`Mo7}1twFhj z5o`@Q)caQgRsX+L^c7yxU}Q91#jeJEkiHNSfY89{plK>YIVO-JfjRmLLpcPo!5e^m zD2r4#R?(A<5Zg;g-ebO(AYxqim$1U@SV2rR&fYCPnkogzzCJ}d4sK4 zs*LYjgTQ!%2BANs0LOiDGYA}W8if9Da|m6VLtyt!gD^lGt3hbEv3w2uzA*?4b7>rN zQlADGv?Hs6)nFjDQA%)YfT0^!FLvPELMo5HkKM8~zJHh%fZRvesLkEr`{5dmt`?Bt zALS#`$Z~eB%#_S!6&CoXd;^=%1%FFbxHST+Ho@+e&1RiRZ?Ze#bn(GS<~1Vd#VYt* zK70|g-H8&cSX_gJ$zu)On6Vgho3UHOEk+k|G6MMK_lDQQ28&1$E80XY?CYe3I-OOUZd1lF*Xf`K$B?FWzEwvgdW*$o__*0|ghCFLHh1h!W#VRZy2V?ox`*+|{ z*N~TJSv>1{2Xa~8kA5RxTzKr*!dI$T;`O`H;n2@vf{AZ%j}Z5Ak%1`0<1`h&OV=O9 zh`YI-2eye*8Az9Lia^`EnB50j5*Krxpuy-zqZ*7jPheJnSipIL2BRPSy9PrShmndA z4|1-c!RSwa*I>lC!u2;XqCKZ=4MzXC6(Gl9RMD=iIvK zUbVAV!4Kd=WH&*ZZ-7wQbl=SO$8LupvJ}srR^(V7I`c7bPiriDTJFW*(S@=dl&Q_F z6WWM-`K{Ou%j{0%wPy)zcAd}<5(4wH8fS4FzYT3PTBk8@YWyyy7m_5N(fVkx_D++IkM%Mk<53;Qi56~ zCR!9#)(Zxk97|0E4K}#A;1?pP7dqQjuvE*T*!c2jMYbzqM{3Mhu9JNJOJD+;j_G;y(P-v}24v0|wheK0CDt z?MQCnJHz|fj_J32$9zWRNPI@IJxRI#800fS;kYKBahl@J_&bRzwg*n|To;$$8U%(* zHXrz&C`a$WjO=}TA;&0qP-*Lt`DK%QYf8Kf8 z3Dx4)>#>$>ti{CgD`H*TM2p@mAYn-luLJ5siGmVD7VT`9ixs-DR9QY7K~@#qOMFT) zWO=W1HFuTQ)kq^pOj{K#6RUbnpDU#^JOdl>6SEV{*UpEC+6gx2)m&C_>rl5dvpq^2Kz-bf7U<{w2&F);j;(hE~hy2NWkghe_eDT|$S-Xw%k-iX1n6E(>Md(## z`H$Jc&B9Ww8NKH~8aUx(P60Tv({v$Q5vudrhm-9Vi&gJ-`+TBRN=$MZtsa|%{vb`7 z3^ZoLGWQ|-f+-iT2O&WxbJMW`c&+(>bb54g&p{I>)xQ|4gSS5V67NHB&s6yg{cT4* zB6!#OZ}=an^VOjz-(Sj6S>k3a6P-%|w<={0Dd}|6%2-K*v9Rv0GpAPaGL?POyoSn#fkR(-w|>>u zTAU2iE>3VRUck;An%yaW24aKfmuXd_ITs(uFiiS!t4?h2CUFRyhiee}$24)VA?~I@ zV49r}6JGH@7*C3axILx->FgPV>Fb1KA5F62&ivgx3U>)i= z=r!O*CeomA+XU6-a-|3sM~bSX2W(FG>urL`1VzCl8Bo8DG&+=yOHKhnxA;}%`EKzF zFRc+$+?UHjY)EqFZ3zl|JjTXiZ6sD{SmMZ1zljRthtuciqhvSxBF|?Uq~I=z=r}O$r|HX}wG2?dY|0f%Pf~$g@)+b>OekrJY&w-po9YCpl9u7ld+Knp(p9jM@`Xv6|YpRU9UJLWTnKK|p0`Qy-_3d99i`IAh*T zC7t^&wf-`!fmn0bX47I7W>CYYscfVd7u!uDb-h28=G+R$9M(ny} z=;mvI%}+eG<&np0Hpo2}t}%=0_q)HJH5bLXdPHYh&z&)C9{u%;iF7W!nc3-L>G_NA zpZoOvk3QP7W5*txE%;8%CN0wVPCWXQ7T0jWkELvW`hyt_3UfZ;e4xRr1-^smCF47Q z!1&7o#$QH4nxMu5ui{-?Zu~1QH=51|zN6WnXagCOLyMcu2ix%a96$i)X`p)ElYrA~ zacs>oO`>fa2Cx0#Yle%Bt@)oELW5uZ1_+3X{!`0sF%m zpk>?>)5-BVt2)8!n3=sUywCT2UDX0 zMiPxCW6y}sWKtbrmrX^549cXryia^9zJexq537JA$>e3Va1Qgl>c(;zuFH$Q!JX14 zwW6=DS`{yuA#LdS+3tl_I~h(F!6(YfX08j1e)*K)SBu%PXey7l0k=~%{5EiI?$P5q zJongpaL8icqNp!pOz@7Eyo^K%FZaot;61G7yv2>pc>8iWQ9 zn6?JS`!xvtaj3XQp5_ofY=BTHYy$-5XVVtJc)#YEtZsl&3I7Wlp)G@rxFLQ?1___X zplBv;BNXNt*H$uUf(9iPWnxg^OGD=kZ7tjj02e2lAHKA4axd+j{Pkb>>u_!B`f>{I zz<2=Z!&*JF-L;J0Cm$|Jkn;eDD>j04Z)YPkCn8|uU(<*vxWNBtFd94zH+WS^9~e=9 z(BRY1ATVRO6Pp7yXFtXEp30ZO_70gTYnokWK4y;4Rhy;ZE@Ff;feX^`)Jy=*E3tk3ZwvNaOQ*RqJOZEo}!FcQf z<;J`#KVeDP&@5f7MIU1Bu77FrT7bG3@=ULks zp4pr~-ghQ_Z`Y~kyM{ttJCzoNm5tTyuVs@pbgKMe;j(cvX4e;!10B}1Tbe+tXA?M zEU9{D+_}^7jvb_S{`hh8=8YTow<%pXx(dVU1$(QzQPVTA`|sI}4Lug$Q<%OmH`KhN zhthfU+*xBr&zw7=edo^Y@eR(UWt?#iwT#_KVGc4&8HZ~0ar4MJzxR8!5d>{?Fhc4P zzxg~ThQrtz8{y|LBrPQe+=WNcIE-T$0p0<%0}$H8AxwhS(5R26j8P#)fsnx2^Gw zU#JEuW-jjN@4o()oO>A>NgJ%OS{V&(9XaTzug5REj)31C$a2y~92(uLj9!khnHal9 z`AXZ5S>pTAvrp@YC!aIEk(C`v6YhBnyIXHUm?9ok$j|iFYz#+s4?G4qn0?IB7 z$dMLV@mGxNdO1gA9JEYg$-FsXaVVUAQUcR)b>lB7_J=XoB z@+myPEy6Z~C&BMP>qW=`vxg^+zsW11G>*oPA)_r?vg0_JanpcX$(=iJK<|u#kae_W z=B;gq^zW6P-_AD1GF`ry*(S47=XuNVqvK8UmP5=4-(beWT2~-e%VAYq2HEYg$oIJ# z$&r_|HZaA^hTpzvaaY>0%%?hxBIEMMC9>Z}%0IU|*27cwN;`k|XF9N-Y*+P|!>-N* zcXJ(<1(WeFv*7EKip)oyQ}V~k|Lt{ops(V8`w9|CLVeQ`wGO?g+>l}TG#4NyDG6Q2 z&}byVtjCv>>SU)HLr$F8vnv!!ug`80MsHg8Bnn;9o)63mRen{Nm6Kl*%qk>x@!yo{ zCm(Qkd$zM&*tW2(RtCj?YT67UqDDyg7T6w|R?zh8n^?rm8TYuwa@*k#h3g0$>OE*C zvsI&jsLlfZj_61H9f+T6K0G!;IfN0}=)=BIgZhUtUqXB7&d0RI=MrdezP$m?m+%jW ze5L{vE@N#`ZG@QIbf#(!r4unWpUDy*gPGJ2gF@z%HHAXrF~RHK!Kzuuv}yw71@jE1 zZ{rr24@n}4B|$Ka4F6aUUEl$j!r#mWMps+>ory<{y;BvY=}59HppFP;4*IpSHe<{s z#G0_+B;kb!I;7vC^J|sETdrP)xddp4&B#+2G_hqII`^xpEOv(HT$|&wK@-zvXFWtQ zI~=57XWXX)Uy7EafsPZRWJfDzugsbj@-CMG(li=67qZ5M@mfJ-w8mGbsT5cvcw#0} z9yRYtdb6gEsX-8V4vqM{;7dxoJm1R)? zm3j8H9dR$Y%Dv|33;F($ki;<&~sf~n*6u7-Z^7+H`@Gagz zPkQvQXn#i9SwC#WY1U6ugU$MPVlG_b81|UgQ)PZr;H($s%EVl(*R}~=4N{CcNmTXd zL#Lt6h`?vT}|X z_9pNhg*e;_>}WV1nNe>86&dVYG^wajRV-GWUPhZbYy)k48~kW2KRwQE7?p;K&|hq$%b+qZ1OCQ8)^iWLgoOjF z!jGZ+2EE-6eK=RB4CiFK6Ge+9*KbYL>F{|2t=pLGiLLCdDk2#z5?WM5!~{FOSj`o# zj>Zd_?#}i1#&z;oAiq)w1QxJtO;lF~@v%paCkI23ZRs-eQHTuD=XL*m7K;d$fi|7k~cw{Y2iiIYu>#gnqM0qio>+D44-I6Cg7N9jKUIi{-PwRBTLIQrqUh^@sPLeJ`mt<^0(L z57X$=ZODmxe%(VZ)4=i5(%AZKul)nRr#=4bd`4T9Sl2J$32CS(OP4Gut^}9YuQQ^l zQhLCSM%H#Y(W@Ht=)~#g*NUMx#G3)fDS@dv{G)h4)B)ZaCjgd!j}!rA6cw}bRVi@g z>fh_4hsm9rc9PMg18efSV-uMiJ$&TJ-<2YIJ^DF)_WtV4bI6D@q?nAPkJD3UY0cf6 zs~;f!KdUDq@Ch3E|7Y;WDT-(L$8F|+L8oOtg+`m1d7MwFuvW>v*uF}tQkYgN7RI&O zVaStN%Adnq$ezE>ZPmQ^bMEWs&+pfs<9K0FH+Wz6ayh}^YjUEBzJl||hz7qn^LtF^ zl4LE1Fc=WH9MRT*LLn{V;&7B7ltj<6&~U##N}Yl6a5G<1rH>1?cRi7Hk;xpDK8^xV4Y z53c<3`Mh1l=7gL@p5&^OK-(@iN1T?9Ps}~}vF)oJCL4{H~C9C3Nt{6D;>SUeqYA`{Z|eip-q^y84e6VJH z%#GW(?|Eq5^7*VYv=KY8B7*Eh&8gic6GcXgVS|BK(VPTP9iCCDaUCo!Scp$b;{9H3 z64CEP6-9SlIG2{~`*DOzujJ(Zb03}Du86uvlB^kWr|8k|??`=UkvQer`M=RmfHjug zIue=iELzYpoSvC%m(sjmgd~%d+}3s>L-MPBL<{_0-Yu~Swwi=`Ig(<{=x!|LM-F2P zd{77Bb^BU>C^4{d*2{bDc>dmA(;mHf@Tkd8y!#CO@rTRw$1lWD^H;t7!ohXB_e*>G zKRRad<~C(ZZ)!cDYtN~-&irZ5_w={l-hGBBbmo0WDvB=beE2D5EDHPSdzc0%~s7Hj0$uT7_9A3R6(5AXo^6q_X?KA0A3DITf-tEE(I)AFmWkoA+KeTU0FcrN| zaowPJaJO{RJH`;sQdm`ieFB?S7yv^hUJ`%;IyG=W{P9EjKM!_Xuy4b%g*6MNu0C_T zKQOIIzbL#yXYHKXVB&PxMnMCb#dL*y7^LGu}D*)yEJgjd4adqW(>~ zq-ibE%myP21?1kAv4C-dE*ZNnP5Swh$XTvY1eu~Dl>jrq2_`U zIU$*QhqJwQyNaHourCvnyy%i<^Sc|sBn^1tJQ#P?CZLNuvFfZ2yA2)(&R;lZY1Ff|gl?Ytk6r~1 z(!cjDnd6euCKl{mBloJmI$<2|ZngJG$praw05Tm}7m(>!nM}X_GjLN5TQURr&PjUW zk)ZSk6M%#SZ)#c^!jdYcB)s*MM#x-lY88I@?ScdyG|(5Jh@FPlhxQ5$EEtYC);!8e zE_6sO=$7B1w0qgD^M)3a$*xwxq(HmQ6@yZ?Re24`L#bS{dvJLROSPlZ;?4Eu{E%^8 zLf=88?#Gd{&PBP-r^TjwVa;>79)kbz?pRg~bKlJF;<3=;|5^CN z)3xHy2Op{&-MNJ`<*s2}HjL@HuCS!DKjZZSE8opFhcC?DQD9!Rr1Ih0XWohP=Fw?H z+*D>+VV8cK_b;F;R>PEHH0fOE5o@w2UZ2xov7wzJh|HsaJ+O!^lUW*%Xu`gDq$rqC z6iY^fA2J96low>R%dNUdgEgP7mixXRn(bVY5EakWmrKVgx<3@{R8az%P=o8qx)s{d z$qL;kJ?L$h2(u?8Rh3Y13L$DYCh-jG#<{f*S7Qccj0y1Mb*(6#f1Dk{z#a#vjv-ba zeO>tO*}L`nz1RMEv7QEYY`W*jqnjT_n)*-lgAtwIqZj2g6bGi!bGy%;qx;9d^VtV5 z;Wci#8|z9J+J=2re0Hrzmn3BbWT!L1lz_bN1iMK)X||e1wH(JAXOi5VgB4`4(ka$g zG1f+jq;*`qbNvz=WpTIAU8CMSN!-5;*il@xc*cQR(YW;f%8c~M!@6$1y?lK^%e*XS zCO$DLl@tdOR)s!}X;6o8Ru*urc40q0rctLe3nn=!(d;uI6CDXsz?vMxmPUxNdYXo}K1 zA|PT!L_`EcqzH&8h!JB{7HJ})*pWq4*0msutYTTqy6U<}GKc?p&z(s@cfUU&Bs00W z_tf{i^?A;3!J#J)Wk2%^dm3M=+y2N?&-D7+TdeWnf8EK_x!mKvC-{F}dGGc8%yH;l z8X?c6uatFYiC1bHL6Rdf6(*B6`m#oi;g+~?veK}h7yDLW|^{% z4?R(MLvrS<4*Tl(hwIgf`=T4q+Kn|%4+t$559&+L6Z)lCr9hguc~Qa$EdvISuwL;15S6|m|+x*1#l#JS}6wZAYnFapO-7mlTL&Ke)-E;q6 zSAnktD?ngFYJ;%?D2~x9l4()X6B29^YCeE^u4ZPrfL)0r!#aw)mO2}wHx++a?gdw*}~f< z4y=6c4ZtIOVuhjaWO>n%^FF%`l~(ff7mo1L7x(an`%OGY&3*p#EjL9UaD4~){T=qy zP_+_kw>%Pt$*cJj(u^6wu$Ex*gL*jGjRw1u4Nd{S2?43^X>4rD`$AAknDivOy+DS7 zylj@=Xo5ocNf7RPI#u>)yO#CX%d3ub7}m30yKY_QuI{>#Z`{M)tyz=Tt2gr&mc% zNs^2{Cj%NMR47-#Db!I~(TIY?Q_GvoM}`3;Ia=buBx}%{G2CMIgKlNy;p0i!wLLl1 zzMbG1__cQLL4)Vw6z5lezUA9p{KsGTcl;d}&tadKSq8`}LebN&eqz@)lN5mMei&;m z7p+UPC^=p)ph44JijtR~<916a24?{9f&Hs9B`kG8PAotl0g)S@em%mcWxysUZdV;d zO}A@x2_;Bbu@nf`!@z#of4r=3ec$q1rj4Dled?HLx0Lm(?^S+$|EGP;y?|fMw=%YQ z>!pW}ezc~BmGNVDtorEagG_z+0sh;=jr_0s$=_opON}Z)bW0793oK`0E$Sr=@#yj# zagDImq^afl70uNm;*21Bkj@CQ7sJAyY^q1ltv#{_b!)E*PCQtHdi9Kc#%PCyJsI~sSKo3Sf+R5uXm5rJ(dFd*? zw2tpq4)8u~)rm8&`2rigx6NL9$DC*~@m}z;FYQ@#

b_0lXN<=8}p{?D=dGm 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 literal 0 HcmV?d00001 diff --git a/assets/images/pfp2.png b/assets/images/pfp2.png new file mode 100644 index 0000000000000000000000000000000000000000..c267a80f5463b4668ca5525b1a10cecc806d865b GIT binary patch literal 96758 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

b_0lXN<=8}p{?D=dGm zt53S})?0Y*dtZC+onQaC#ZnMIZMDL~VV@NN`J{4Itsis2Fw;p3a)k??nT^^Si& z@;l@suww+WbSM#7vE)IoV!@ZOPPqK{}ZH-4^Iimz^01_!H43l4n{xs8`L?*6w=KKXsWb#CR; z1cwa8BcrY{eC^{SH@@KYZXvmzw~*jw1Nuanw$#n?0e()9BIOuI5gG?I=i)<$9$ zm61wZ5+Jo8DbFP$<{;-P_(5uW`O4bn&yEq-p&g^pR|+_B?%GGTB(lebxTnjHJ{`}Hfz3@8N(B~Z+?^R8G%dymQ5go2Ky(W zWEZUa5Dc2`Hd)Kw5zRGC_Z-)ZI??qPbwj6gZl00Wf#C6-a;|zSJk*`*yAil;*DuOt zap)BYXryQ?F1yOw?awa-_dY)uIp>Pupc}#O+Z>kdjhpe-^v&}6V|TGsbj3>_oDPNu z-i}Jo{Ydu^K##|eW~Lv$7x^{6RfG?ylulMP-*ppIo#Zbt6sloS3LPGo21<=-^VsIN z%t6jo@PNf@;6}rJ8$=Bygs4>__*EB>T4;2`sr9C%RrponV7{27EJQCrjifcMr2;CZ zbp(MFq9hQvtRr#1j*p`uXg~5k26r^q%&*cLBj6Rr%*vD)uK3sCW)8Mo7#3kK^(6|U z(DMF$cU>_|3C2oT5rr*ezPlH-alkdTSyQB--zy}L#Yr_jmk=hkg2n{ zqkl-JF#)%7DF&~SosGAfdfKS{DHEqv6#qfm0bOR+Lu&xF}E1RcEhu8uvWfVa>00j3dxodMI-vb}k0UK@!pngQ^X3^=J+U zD;kJLgX>8E4_;6m>`}9RgZ;rJn#JH@flqu73e~!+MtEKAbSJ!Hd#@76&{z%|P zZasSA$5)H-W?vYF8{4HDzjXci4}vLl?$)yc2|nom9@^8G#99cWBtwKCXhfP=$MWy| zF152f%1mQ8wol>V;?`^0r)7A^@D(1e%zf8$eM<^0hk`2shMFxubTp)4;0%SfvI;{3 zpOW-6^0mIiwddnyM|0DIT_ukp9c;YL;L$2%G`+%_`>CRc9$j3=sJkf3na%yUY6YEV zRr?A3?rZ>3EBHYKt1=I~6LPQc{H1u>71rN$o0E^hvp(U5AdHoVX;t%D4557WmTMG8 zVKv?8hxqKP#^Jqzu=rYSvwm%T=JA!S#hI5b6kh*g@VsyEeoukX*G7KZH?Q9P;h!0P z{wsg3Q^~6*D>Wc?bP>YncUVDC4fZQgL9`6&SxlBAOqvWliLCgdjB<=cWE4Q4=b0vz z9+yUCTFw=BABBKsl?zBg2vDJ`l6CGyolc5{#{Yl%)9N1u3Rp=k>NhLGvUvd+C0pwI|U7VOeo!Zj7xEu=X9N+=YUQUX`NfR+leO|2jLsOhcM$P2R|kOT|&T!WDA z!|a3kt=(fyd}(5y#im3^2|`YE!9+MVH~&jB$+aCuxLD$S5j2K5kev&Ghg7V3{j$hXqVWZ$BJ*Ksi ziGYJ_EsDOx^<^SUzaQ7RwyqT)2qDWPe7Gf}{#&ki;hd{QOe=y?Dapb(s(`%LXcdU= z0l4*`e1_E!ot`(T%07I2KiuBDf2mw7Z}y*i?mt#bR~Lf_e!qxC0t-uk>fH+}FaN~g zwa;Gc%(>U6>N$ZlGkrgVYwBy%8nJ{=HFq@uR4ZMP=;%H>$^p>p>h-On1FfDqawya? z@|ofIrf$O2g0iytQj?2$QrQX&Uij$Z(d1Vv3#3*bg%+z!5H1RMC~`Q|9y_Q%{P;*U z)ml5}nU3#m^D7_y2w+Xn@+bK)r!KI1cMweC2~eaS*F(gdrA%%icXnc%3K4`>YmWj6 z&)xu%uu;0^U;yEb-t8?vwFK*%tFAczvvA2T#6i6Tz5j7#n zhR$wTtH$;pWFIXOf+R>tnyg0)MnD8Yc`Bwiy?`_JQqqwII?HwQU;9S8ep~hA|kmG ze<4DTF7snJ!gDHFM)?12B)$%=20ysMUb8THFNM2bMjPo*io$+Q?E=NVbc*DgT z3vP4nv71=@b=Nn9ZoBn0S6y3k8=KV+75Xp!vHqa=YN>wvtNYhJ3Sh+O?^+3NecO|% z*JsaPd3Q&<=vs-l=L8Zghpz)2mRc(*s5atbH;l)4fk9)rm{<}%G1Xg9I#^HNr)`K! z3Y?&D5Of+)S?;$OI(EpR9^w=22VBsZOO;J zu0 zHSlhrX2TNJnACEUTtiv0SuD6;Tb;PiLJA@%?U}u+($Yg>dRLI_T3LC`_1EEjqe4A= z%@z8_oLgUaTk~_SGBp2rL+5VxmBuPyKG?s2af$x(-{~8<^ouKxfA#+ux%Sx~>lS+G zDS-rc9Uv&RFQy5vrRy!fNYOaj1WSF+k+cft5pa|EhRmcVYw!RD5SWdyh6>N*t6 z#fNTq<5O-JmA$LyKg%_SE&(`<_pd&2C?SN=sIX*MHK^SDzFIU=+HTCgZ?N&!2g~!X zeQ*nPmu6<}e*L9O&$Dh=$8SA`vWwpbvV1|x|9Ep<<2e@0RA!!3=@!9a0aOJTC?G*Z znVe^dwAuFM+2bSyLWBfw;)ASeAIUW=j-$cUbhtGWU1LZhv~XW0!WC*Dvh@e9yz!PR z*WN}Gy(KBKs4fX9ETq}$@`l>XOW@oH_=XTl24PQIj(0o_<`0;Uz#b!DYeof}XtO z%0n1~^B;D#fe!%uZ~^ZRpcW1cLRdyYVXINT`XklR4}X32{0IMLu@Y^?+jGusPJd3R z{^a>?A+esakiek7Mj5i9)HK*nxnS^XDPix0gSo=Aeu4@WNnj56w}2t< zj;&_|((KH`VHmVuB2BI&ZbRWfx1GA{$m~T}fDqNJN6AJe$qFHQA;cU8kTrvep(kn{ zSI2b-8JE6Ea*W1^3V@$VQB<*VScXW!1scC1G*vrRvcRcYH7bW#k-O1IV@r|kLSc$Ng+mpRn^rpt+(0RvkMZ zbFE3cSZxPH*SzHZiHfGZku+|b=I@F3qp7k#>5}VQA=XmJRo3rGo$HagSkp|}4~yV3 zjWM9LVf_qTlrUO7><2$UuPCnc!a7iPEV=+5P+bI%InSEkiOn_euD||GYma{RdtG60 zYvk&OVPxn!!X8vq`XOzn*^(>p>e7hl8ZSNTo`%{ zY}-pXXWP}wrL^0YrzNqhl7f1qMJB+qTcpyVSX&~PI?_h+Z^0n7cU|UjrS9Moo${1z zs(t91)@GWv5n!bIRq>Ry%-%}k^JvcxL~-=jP&A(TO%x=d<(H5DT#0`}f#uV02In9n zaZkj_MDTdWN@5F^AT-Bd{3ySp2HVuwZ0PzIztbsGx8LXJ9f1@#{zY)WIu{+;QdcUyOoM*A-K3rNN#MNV79{ zZ-F^~kp(t6rBaze-d2O58gtQrs3n+M9zX&BkeHBKQ)>ShkU-HpiiqQ4&?>`<)H5sD zSJ;;0co7|H$vF~1<#nt~>`8$Td_-@q!&)ko&;y0_^%$(wz?KRa5i;hl<4N9iNI-)m z2C6%-UD=e*WjvXvZs$H^{$w3D0$wSUwWG8jh+>BP9Kw3Ujgiupw3JB{wq5vvX9fxC z&aX{XQlG+0j_6!_WEDTmtzs1!|E_{GWDQLMI3QpP? zFMW7jz4e4Zg8B0ML3Cs0uG*J%Ko_2OiY@g&ue{%r^9BFw_=%js#m`}vesTP0a zzgo(NG(bV8iEN7OGxJ{CScs4!Ny&XFT>OF&EsqwCeo(YZ$Umf@DYNvvqVp(>6!FJz zimc;e+#h17t7$ZU_|iXd#>gsl2;fam(PzlwNKxmH>U`|6SqbbUZC|bsQ+$Y1QJwSvq17hBrm$tk452=ZX`YWo9TDv-%L7HcK|CcSR*`%MiCIf zR^c8nA!fAypP+p-*d(R#YfNs#cecJDDlSF>YuH%Fk61u#p69l3*KJp9EV#zTERNrD z)k4{AuTdy6w+P2U`ztt>1OhZ1<*AB|Ww@4+9Ei4M1zuOddWox!-}5aWfnFN{6Gpp=u3s0T&YCch{7N?tKlYsklnMcEX`y8xs_QKg_b#&cDbrGiVo zL;nn7VG_$y*P*R$GM?L~ABcSdqYGtT+?P|sIiRB}? zdxDb9B#iH}_LXB~Eu!Y{d-08*Dwh&Vh4RS0N$f65Ye!w`eyt{z8aOUmRfP-2@(tD7p+F}M-)dzC`JViJeCHC8 z>x0U;t=>~DCZ7wLc^0+yEG!WHPFPic7$^U|ZlCe4ckIM*{j1gV=Hw`NKq1%4oXty@ zb>pd}qb9yWR#d-H07Pn9@Gr5Hq)4ekxn;BPkN5XxugzGIe)mWj{416l_7z#=BiMF* z;ezW!!dqCJM=h>-{Jr2R;SvPR5)xwpyjOE3jcd zJmRR&6{h4LIb~h~Y4WAcjF+hLYp7x*C%O2`;4SK!1lZjKXIEQDvom*wk<0TrlDW;f z^iWVm#A(v1LaN0{>;;rZulW&C6WD7SO3_~CC{&cD2{kFvzI;Zt_B2xKN#Uhh*+Kp* z4a2zLDUkHJYH>;9O@r6rIzZe9!l<^3RD!5kOQTu#|JjGM6&TJx2t<(T1?IAoxDtDckX)@9p9(6v;uzo* zQRIV|+74ppW(8Y$FAad&x!wxOWO|!05c=`fN<4VQ)dw%YtAONLG}>a<%M@1v2LnM3 z^G~qrqj-zA(F$_d)y{n-EGJZNVBQ;qVm-pSby!UdYKCQGYa?@;3#$$R%mP?mAPH8( zyY8B-L$844`!dQXhbkYJt{wx`0;!d1RTk=%vKqj}t=fWCZ=fswaQr|)4JUK16n&P? zxEjaS{3il4w8e(Khk`BGB^o$z=WgW!=@i8-+W!7QyS=sVrfZExiu5)ShRmsB`49f3 zeTpoDo0G1>NL_rQ4FOS;w1<#mpXFQ?5F{*aRX2b|&qQ19B{Y@V8!I&stk7_S*uR2% zR!V4L35Yn)5JDaf2il0rb6M=eFrSj5TPHfd~Vx4fQbIal3d z<{#F;sX|r>h_G_``V57_7UW6nssJt2Hkpyc40Kjy(31Nlz{9nkSE@NBIZesyW&#Aq zL^!>1S^7H2#5kN7(+phrS>LbKB`S)p+$VJrKkGg6^D`qL%S)NF{Qt4F0~>g+O?LrzL$i_-Uwo zD+uekZl{T^6-YDF_ilh_-j%lc=2YlRW%F@5VS-dhDv@iAEdQZN&W~txT92y;ph7`f zk;Ap9C?OX~3%sTfP-(bBSoE0ZAFRtOB80H!BO~iQ_5E zqgi=9{&O`RoVL%=#1sZ8lowzG7{ci4t!o7mCgDrL+()hKPpdW5NwcEQ*u?z=y=U5) zK|AF;Di$N%0MKwi!23PRgQgb~HZGMJ3{AJw3ThQf?HFFZFJ)>zyq%H?l^K~9vzio` zl8mb*(C_lExQn2zib7;HH(WEyk1EPHYVB1bTY5(W%?_6ej3ltsI9W*HFOa7<|F4%IZ7y+TRB1qa3F#E;wIBwdtXfLyjZl1U+Rifth{Pf|Em|T=Lk3FfFt3qK!H;+_tF9Fi8E){;anrrRuna|tN(XNfJv~-bmhMXj+x`JY) z;_fonxF)b?H)S3BThlufiW53llVynn)FQI11jBqQx+g)nuj1zq;Zc5U|2(X-j_gW- zgx*JJd{TQanFh;*ke8=EVXc@TK}={4seEE!Pyr0wG`A>4)2U{39OtGJZubBf1I&xa z26Yn^01K3=5YXrf)df^>So0b-i>z*_qlm%^6&r}8Yo|GP7Fl)n(-7PVWXLy=DkAM|fU^cT?DD7?K7#9 zKqJw0strknY;l{YDXzzAIFiIAC>Aj}EJ%6u=UT%ryD#sY2ucyAcupU?C=~nA`*FZE zHv3$0ZP111<*6mbPyOS~V2y(cr|g2Xzk79`2nV{)#P^;OsWmc`fVAYH@IcNxVD;PU zZhL#nZEZuR-k5QX^>x>`j%4K8s^B5bnvq6~D4-}V);j77mQWNoOe+$^(e9 z^SMSk%nG3<-)P+wz@U7=_=dS7(tJY`OWFn66x@?ISM#JORMj>o?MPb<5mH*p4Db5E zCv*2J=P%scK54dm6!+^&3keM6w_#ckVM%nB)SZ&_9P)%EtlwAM7NyiUlZpjtQ{i`M zn~J2Ol!gh99%WR$0%WP#X*9#nLIlsturE6c&bDsc#G)(AV&Uiw4far3V=Q$VF7$U>Te2$Qt8O-r6dlx@`_l z{COqem3Q^PA3@(SSH~hos(fVq`)WP0W~DNGTl)!*F~!9zgvuv;+m{nOS9+rPC%0sL zz8h(TG=%4V8Jyxe4(Yn)d>rep6i68S-$q7Yu+0-E_-DQ$1tBXAlkw=HVRza(96fP) z$hq-%xnT4XO3asCwNVi;d2%4=`C z+Ul0;UtVy->x<2&ipHRMDm$(zmeuZC39g;;)-nX!qPyT8;=tH#4URiEbPlfCifdeX z)fI=~)~gJneSN;hD)90X7ZAe?ySmZf1u5=ZeEUSO#0_mWP@i52F&EA8HK6*v$ zA0K>9$t6oT2Mtc1-nq2W*zSVP1Twt_sugd!F|4C1G=>%F3QLN!H}c`9WcVb0rXi`e z`?C8FGv>W;j=6l)O%}MV&2871x#tR#Z@SXbyc?~dKrI0XbfL8h8NoE*#M(h=O5;i5 z8ZM~rN2Q_<0*@b-x+=`xalyF}w{re{u6phjcVQxMRrK@GvNp}G#$K3*lY9q3Gvfd1 z%0fOLVuLn=Bm<)FRAgBNhMh_AoCAUe(gb={Op1(2;YTemmR5sElkZh|JnD0)m`Xg0 z){yi_E87v!v5W3OofD=Z4<%0K>xA~nx zLEpF4|IRCNWrhgHvz9g*M~LtFx|udkH;d)E}QMtlPAlCB%4eVZ>_){5zpe z{jU3TD-g1~u;7MPKjNafcU*jN!d0()HVW&)&DZS5OXj?r=HfJCUgGLhE+I-?z#e8& z1-yWsW8@W@(<4zOe{3i62&*EaeVNjYR#^eOK@hs4`0!02AmjRrO$T<-m#z~?81Wkz zUxfN~BSBH5SUYf!Tf=wNP%N8TQFWS6KoYftT5Z@x4a)q+3~Zk4xqOf2I03aCXm4~i zP`i_7-`jnYjz^YYZH#tOWIOG%D>c#36ou)cWz0F+#zzKP1} z&~&9%80moBIoqsW4f0vY;1J6@d(q|_NL&!Tt%_*a7}rr)cWcq1_o6F~Ot|2}br+8@ zt%S@*QF-mG-F)9}a=CZT>t**XS#@8*!nIJMHg!5ShY<_)p-Gy`aTxs^c>szKE zTGi}!Dj^w*g)X#qbCDQ0o^0eeDZQLIS}V;YTRX6WSVm?XWl-OC-vGU?+-l90H{N!| zCB&2frf7f$ibKPYm8gTLEXUthZ{90&cRcUmlbWf3N>VwQH{G&K0g=(8DAIBCqnplP zC-DecLh8Ba{v_EdqIY)J&Kx+IJZP<{ytdc3(DbvYSxq98!F?Cox%~ z|0-ytUPJ9aSVP;>Gp_XHvFl%7a3f+1d22%hN-a0eN)?Pf6Jv{5CUEu0Moz{U6HCeq zf50)Y!dwjuPm+}Uh8|V2u?Q~z29i%0ppvNHTJOzk2W|lEMS`_;w>4P<@M6t{m#(_T zxfk#pXnP~z3cYW;`G2-i?6tEK+X64f5?z|o!2wJFQHfsB`8*=q-%07*EPHxT(&`e( zOS%lz27POCfpqK?4W|8qc5n3hjl_w-e2^q2zGB9cgt>RoK1uFH@?J=D8}9*E9gCGSRwdtx#SvU6j2_#;DV7c9n=8`1;y8TSq7$n_8>tW$;>S1DMAQ8ZYU5XsIIzr zW!}Z}%dS{Q#fW9Ms^Iy3+oM5tI?veYU>rpK?*?I zbsy5Mt1P7H=?8;Rv~f`pWvU$zak3+O8T%SUod^Z;SeE8t2*8?ef$=wtA#f5A807Vs z`Fz6X3jZQ+1CygrRqY*dF}7l+wdWK2jp^=ZL6R|L%c30Q-2GhtxQ;QVnhk{8y|VjS zK^ocTVWMiVx$NpsrrgTZjJvur>xO|={1F&Eaf~X%U zZ@^hk6DcoLOBZ(+zdYK)ml=-G||r^PqySv2wAS7q?LN$ox& z2I(t;OP3Wy7+*5?oe)Oj3-I5cKaFvJmV0)UK*AEG89L_Ied75@1Cbg%5Qgltt}W=t z3AAbrngFX+a+MI93n!k`x#nQx^H6IOl%F?iEQL=TG$K?FKh4i_?&0tHY-hH6W^+Mi z8FBV5WXjczMOU1F>7KJVPmILW7#2`mfi*M^yv*phG(HUa zusl$KL8>ZCawUZX7rO#u_^&zL0@=q+YvHj&uxud`iz*{77yy)en>jI8Tr{!hf~7eK znkDDfVKu?E$jG$B3TYNwTtj?visv7MyRrCqL!@0?Kvjr7RC_=tVt!XAUULPHcB9|U zx_-7<>g=-x3g9a*c#pgYB`HJ-1+eC8!ilot6V;Qd83H8I_tSs;7<07!6lEQPN|Uxo zpZ#3ramur-fUDF?Oc2C8Kx=tYAeqNVogxYluF@LLPJIYLg4TI z0a#EY05G6yFsvnq$`Fhh1*nZDS4f_hR=mt*c8y0O0+68XjJUEnJgURP@=BB%qwV%WX`gS@Lx-tVD=XXJ z(!wXm;IqQSqu4xYq&?P7iXS|k5AlITVNLSkR0|Q#hx{t$FG{>j0AJGh^Af&az(J3@ zX+pb7AVH{n&<5A1vvG+g?U$Lre{su zVd?eNJ)$`#_3D;eN7aSm+jrf$?G>2NR0YJB})47eN@gt3a+zT+<^dC@6%m zB9NcFe}P0MW;!U(r4fYdB>UP82?ZXjwliWe0D&}k4uS>3CAjCp<;SkD32TYgaS=4Z zf~~$nga93&v{W`BxMopp{M;26UcBrgSa=Oqcc7)nysDgL_8>$pxXNfPD}dLfxUz2> zBCb~BADzQXT6rC-KZvo7PXtd(2*Pbdd=DO}Rm~#=L7|H=#L-m(DNPwaCSGz>mwht# zfT}K$BfD<&14}6n@)r;n62vrcNskH@Urd^nWZ^_M$a(y+YzuJQ=Vl+Agwv$@;u#rt zFkV8fUrL_jTiX$k9#JS6Y`4-iEBatVdlW}gd0{*;Akakek}Qr) zk8E>}PbcvbzPq$#$Fqmv5o|Xh6=v`bMOa3}_L4JZ|8<0D1_P0Db^6Z$}Kw8-Hb>35%2W5MV-4-o8;4xRkKo6|HOIB-u#^ z-^<$2kY->(8!EB6ZG`4237{Zdo^8i49ac@L)#EdI(SxgJX$yDQ)77gk>+;L&F^CYNA69k`O1_jtyqIR?l4e; zPNMpgt()Yrott@Fmikb2nOd6AlDdr&;DxZ2B#fZ%q!+M%&(gm1optgGU@BEWy6dwK zTxI@|o7e{P*3t1FKUTCdX?czTJ$D@n<3&`SDnqw{J4`k)oIH!5AY$0T{G@{J-ooc_ zabcb-%+CuT@h)fYVS>rxOcbJgwu{#Q#=GSrlnsi2_KS9yJ^GFn#2Q0@BISdODjl<0$|yPtXe|Rwvx73yr~~Yd_0d(w=F?D}1ER^A4?!p!BBQTUB*c zWgr89k>j83TxAc&3seO8=@q^un*boxxhG#mfr{Y@=&r4METq`Ih_N1Q(Pw3}4b)&m zuL8!$mW+ufa7iUVvp!DZTp@c3M0r3(#%MuQMaL-GkKqfCtP`3d0qVp1*!>R5$_l3J zySEnk=4KV3d_NOjSJzo5vE*=8x`U+x2S0Idd0S>ch zlFcI}2x|%>$}o}-tRsg6WdwNeuLpM?WPKN4-N0fA8hWm{0*fAm;oX8+jE(X%+!I16 zo&XXLv8bpD?RR6%RhY|^on#7S58S9N&bsQrLpQ*DDRiin7ZZ*|rs>sc9kw0X{#n>Z zm#o+>8E^?LRb5xv7&O5ES%IR={UmsVC+oJnNv$7i9;k}7=uD&mCdPWmx=51=%iz(xJvA=tLUsf1NX%w{?#dq$O7TnhCq6=5i zt(ApnIbN9x3}W?QQP$CS$UXO*D_n$y1OXG*$;dGeZQ?}S7f@hu$P-`!Tw#aYg8I&L z?H&_U5?WS>OYc-+X zlhfxV*>n{}*=b^|D6K^0ijoU;Ht{tgEdUx7sN^!dUVg=e zl|B(lF%e`;q|M36E3j1Xye7*^`ohw=rFm{_@sO^+&fq0lQG#eXB=wSRXnAUYv4*?V$$RBk5?4qqJVn|PBAC$51UKMS|TSC@pHATkhsH<__NgH$* z1hh#sLPp-#n^<{*476T6-!RA&rc=4GY=yG^W9!~f>z_R zZm0D}$^DKn3x>we%V?iircpj56-A1CWx$ zo5FpZOXH1(3qKG>37Re|IKsqTt6i_Fxu(s?1 ztPYAGz;zkq!a!0bL|RIq;zB%uyufkv6e@$nr7@#Pc0aTRE->?f00uF^gjGMotMBt%PPOn1 zA!gmEyz@D%J0rhK_yGTbK&m0JAVTAD`PYs{LX}kuu`<6_Qf$hKG}KPlk`2g&0zE{77@O92jl{>!`i}mpE(G zv4Aee)1%O&^*A-(Q3xWmYzX>k3V|V$AgBma=))q3H`GcZupyEAOlp;cRn&>glqWjK zA`GIwgB-5%frbvPBmyls$9xU}^{H|qk5~tT86HEt3F82(kRS)44mp8}jP`blkZij? z{m6yLwJIawHUu186*gYPTj9c}Je8eMn$lJc%H(DIh?2u!EN)D1hO9rIqCuk25P?<& z=U+OeRuMsA*t)L0B5X>)QJpI&J$+^kMUZ!S&^L3de5!+aV93it90yAZg&1SxICRg} zEduEV+zoxKZ)>G95&@Ew)7YnGs%#)LLkHCu4|=X9s}Yhb77~zktjfTkqiQzl6K?ok zI%&@n5WFDqgw_)csC!83@K4$<<`GaJF^2MF7Eote0A#|7qZUErx44Wo$l|EujOAj3 zQ5BcGfTzGg;J*Oif(R%A7(BS3P*GRM!MCHZWWCaodA^7Vv8d1>?icMQ=LUwxQ3LOy zt1qs=QUs8}CwP*c3Fsixtgu!0{H(OgC?dhO8nIo5y_E-rWaujS)@WDE@Gpzc( zxb29>^vhlqTUB5a>qy+{8k6B}UB9Byi14AJTLdUc-DgySs03?VnBW41d8;5h>T{V; zPcW2Ro9=#0t|Z6$dUo2HhmAe)jLb`O(JQAm=!dv*R|q69?i*5QaF0b}$*lAVOTp}f zFtiN?i6|v1HO(2oY$c-OI+uh)`^>VeiRRI!ql&ysdYSB^wYFo@hnVlKJB4#D5P7y+ zScV{4oJZUU=rRhS7Jq*OOgT6Y%V=y|P-_l|I_Ymj^qgq1*hlN*pgPEIqefVFhytng z3GZ7wC()V^nZi0Ytn2dsesUw2AAA7!tO z^gn6*qSHv^be<>iiTh#V0*g0R(cXIz9aT|Cm7_)knYioJ?GlWEp`+RXtt3%GvW|6o zjf^mo7!IqhdkaLA6UJ{S1fZ%}uF9?>z=ImN=OJBu$#on3cn+WEM2lEZctWY_xuamB zE00!F1=YyUAz>C(C)#Of(j^D3O}Dz_3TW`hk}^6@s>vUnG(H`=c-FgG%vN1;Udbg7 zz*kxtW+`cm*ZQZaP!Q!vED#?K@CmQ#$Rlqu*P8MjtH^TLbJIk9VO!p1NM54cMFCRT z8P)HagQWeE@E!RM-LrLtK*DfB1x>fTETyL7npEK|#^&k%i4^+DEAIbXCC+qf{Vu-> zLCbRR@`&H0WIz*-vG>fr?^)Pqqi63*%XSMcs@m4N3+r1je(1I!qt$uTa{KrfjrD?| zQEBy^$#;}v)G|nCrd<^U(OX)1HkD6{b+?9xsUSs2MwOEezXcIp{gT?Nn?TQL-BDmt zI8mcf5+Q88Fj{hzi80wv=y#LLl2r+)9j`9|DvnqitpGu8nlh%hI7>8@T{G!SDeLoL zIQ_fL6t?c$-MHTQ%TbnUR8+0M0qv7rDJ5u>p$wZMFrTX8EYWLHa> z_{@6K+FEF+oe=Kjea0a8jv=ZgY_Bc2Dq~1w(itwIEyuANjqq4C+f~rhh&e|)WQ4|P z5}AZ@Kr!L~wuxI$G-YpZZ5M{Y$j0onEFPVahG@p>yn$VaXlDN3Z!w>``Xz zX=MFMDJJ6$M4cFK&=drrC$WS`78)Ah4HLfejOQwCrl2VKCdzCgc2sc@O+_D1KYTy$ z1w!|&?h!{#ZOA(Mv4?Fk+C3$SNI?U-X|qmW5=3Z()8rH3gkaKRPvYDHgQ$Sv(x*>f zwRU*aeoYL{vjRoT0KK@G?AgvP!cOO!A4NVk$W+&6U11yX8ag9-?lmYV95v1ocTwcjCZbMZRHmsh&1XVvJ)>6VMD~M|kz=IIiOR6nE zi0#>Wf=^LE=hp%fpleNr|LzNrLYT2Hc?Y~_4WG)Us}JIQ^hFBz&i-8rGB&ZRg2~oU zY<8fE69L?ivGVasX=~!&sa+hYm-e;3i>jX-P-+)CE>edMF{L^L61QyC7mYicvU0L~ zBe`$#q&mwKK@>Wg@Sw1D#?19yw7o_hoelWxcq102?wYMDEF`W%K^yJjtIM{U;K(Pf zCOB1~wf(l5IIeRE$UvcZ(XN$Pkjw^xk#rN$&N759e(Tf%Y;revZLin&i9$g^Bc*^a zhpU?|1hTBK$zr9=8w-y%Du@}4p?yOMF0^6jE+xcdh)^TE7oizRB*b?D8w&jroKdjD zZb%UdnigSXcNO#-t|?W(5ql~O;5qpnRTrfC0`&^slU2mQ^CBXhq%C=7i@+lqV>_7y z?`!9_@ePSl#pmX;RRD?^1`tBDo1I%7WreCMo6?P1XtZxfb6h-v*WK;DGG7ALQq-kBD+!HBv8>2IfD{F%dXRXW zR-6!I@9^C0ql4!ow56)!-`N!?JJ1k%1;~^oCbjq6>E6uZwZCPT|BvWI;_^@}IlI)GgPF;?F8n!2`hksdVzZDV$8-( zkZ=Qc9pXn!f(?j9NQpw$sg!o3HR=bnmDziDoc%6_nfLC>%t#G6>|?$V6>C^*@m5`G zhix}fGpt-1Kv#5nNN}U_3eEulfj2h*i@$x~OTn0iF4vT2V!USqf(@mPJXK^!07f;5 zK;MT?M-Im6E7E`0u$Q-S(hB|*+%TRvUZb22IRvFw*CinV2^_U2=mXA3z zo5s3j?b+AU;xE}}6OaUU5Zu6$L5(Ee(n1cR#_1_>%uH(X&z;&__M#o~cUK4`j8(<_ z|J3T*EtsS0Wly<~wOACvWdZSKumc$bCtfFCw98%2Z4M%nGYGY`kb${Y(w}>}Cwtcodx}mOIv-J%?UW^#TvO z)|^9DT5Y&`z0XZ82X1aXc8l1LzOHWDyLouc5daR(BcEwvV9;G3o`aykGYOn~=W1_j zol)LM9AgjeV7!z<3~tJ8yf@1g5ely^Uw#Vk($yi5(711F9>QtcMS$CBw5|R6Nf>Rr zIq8vo*->p)OZAs*5!1u2bG=UUy5293*w495l;IP48(bqov}BItL-e}%XF!({e90}O zJ(kpgf5Om;_k6D{B_>V?5lWiaCX+18EnCnujngy};_;m;%(LYsv}{RM_{qbHYpGRK z9eB{X^#n0bwC%8u2sKh@1Byc}H+wWel_q+SJ-;(uI@=rPjblWvpYcHXG-tR(^{Q1G6 ztI%C0$wj0`wx?~L7^&IcULrB z31yaw=%yR9i5~(`^#I_91eMXP#PRIUEkh_I;&}u9VpV;*&b6lzCtss9k~$&)DBd@# z=@>vNZ3l_LKX@5N`w!4gQe9Z_^|RGsU}OJJ4El4XCLdsT%qGFq`A2% z%m~pueF&qX~eC`nzBi(G4U(`D4EV08FknkADitKTUV&V;U zAzB8{x(ML|cT2|X-R)Vl8axFL(11nc6xA*u7DeH!JTry^ChQ+^<&hOvTtj!+Z7?Oo z&oSk4ImX+W00?@MAxxG%*JAGg7lJdzRHjK)*NO(?mD_v&~)Z)>#U9~6@= z%Tl0~7-TCQlw~rV)N11C&ysm^2JNM4bMq!-B-+o8pL%|Wxn|`>>54$!ky}ST4XRm- z8!eSZVg(ln0_bl}5E5`fW~9i_iBbrd#7bhKHAQQJ38yR_b1p*(NaC0L0*sF=p!nWxINYrR4^LbEPuZG-494tDDSAK&5vQa?c%dj4$ zlm(xek8jv?T6c&paQtWmz(UgM7CJDkN{u#*Y^J$h+~@T?8H2=&Lf#^SLhw<^C$y@N zvh|z=RHYpUQYt&neO9TVAcV=OhP5oVFz5-iMt~I2cAALG{%Zg_NJB3xAtDWt_v)qkocIWwo#m#XHu=KrMTx@J-w-kR(t z^&rTWxP^OcU%NP&DtKTJwK{6H)ul#TDA4%k(TV|ii;E+!PyrACrGli~j_2A56G8GS zfdnZ539nJ$0yW(VzA)A#z$IE&9CIE&j)dHG_XdQ-&xHf70YqJu!l*eQsIYSpGCENa zet&|t5x;_Ge{QAbo=0z*3fyahrN?+Y@&<44+aq~-D&>s;fM`xp;y`%4QOQ_oq00E# zpbHxSLCBD3{6M&nfh4F&6Ny#F3n70=UBP-YzCxC+#C6zXbk(|M?0YhO8H9qS5Lv1P z2U7DFIbNsDH!_Bp%$)+hDL<7Ul;G zRjXF7uW8saS>Dv(zO+q+5t?4(B+pIM(`00o@O^M($7?3*CF2tA#eL~Kq$H>PuIRGE zzpx@p_=rGi*&2wS)G7cH6#@MgV-rlc71h>S3Bj(xq4zEvYqBad!(Kwj-`Q+jcAs9Z zxYxG|ZW3;~X*9lTWQ7qKK1&)=NKq(p27Q7L_s!xupI)iE*O!15EFgCXK&O~Rb-l2a z>1_8tp~8%D$7)STgl3 zij7iE^CnI^Vf6f*Cf`V(EBn|jOffk~^%5^!RU6;!(5DgEiT~d5E;~;rPhFlTK5|EL zL!%Y1n)LS?0XXv#^47Np4og(TXBOeh(Ji!SOZY+MxW|cGJK4^@P9r= zlKjgbMG#O3_>nMufR+(MP!ellc0RhX!qv8l1k{hu54ihPK&ppBi5q1%$z@_6B1`Du zy(t7TexXO3k$VkR+>4cQH;gtCV#pA_ZAvWNivpxzX$bn<`t%u<2P(jV&u#8BkNyiP zU^wt%7At6FUg8UJe7vcZ$Q@c+mR2BKD#KiNQo~uHJF9lU@sK!>w~pF{13GWbXk9(V z!06#&8+LXNpt7MVxtY-#i{?%!Idlql#n$;2QX5fZZOr#K!q1`{9QC<&J$)%wZBR>& z9BE%_@%~=92aaM@3!=ixa5Y7=LK1Gt6_&<~Dp+^@zIiHRFH)TWaT-Yw1bBh?BI~kA zcbrtk&^Afw#&t^rh0}m43US{iFx;4On^gQF$hLZVER0NV05ZpHH-naP9`I!Rj8X zIPn??dupzG*8^m7pjSwZTQYO6#E6+lav)5=$l@SIMJtau-gBk03{fiLJ)r*OyBIJp zP2PYCnZ~8HaI`34DU|m>BX;r!cfN(>tz{dU6f~gP05g@@9y}d$Z3(W8wv^Bq4@m1& zvCPovoNJ->21_(x1N#zxuvpa+aDEm6c=E(^oOjfcEhws558WWGkVGKS3ZdIeNq3t( z9)Av+P$7Dbf8+F!&}d(BhgJz?KKmYJ%K>>J@hu-9?CPwdfH^6lluUKWEsplPwQzss zz@(@tHCDJ0ZCeC@Vy4t)nbG3GvkAb0)6VJVpU`EKeIyHB$R8)53mT3b8ozI#0Y(4I(w=8PvqDi%|0BKK4kdveW^|$3res zcWj+6kSJ8Rd6ia6t}DibaU+`uT|9mt1H-;DLb^`@4jQ;TopX&wC{)EIm1s4jD{?6H zwU`WUm#yC&WOdM|Ov^=T&u(tIz@!P8_F|CWy_Wo;>{g);;F^ACAp!v@;G9A0%}kuW|b8bRn$5A zY+-oTD3+0~13n`;6p2c6X%1reKW)Kv`tNG5rki?ExQ+mDg_ar+Fko)6mKaj17vg;J zSP19PA?3z>;^M-X!ea7GX4M##4}}Q+5Fv&c5kW>%Ww&k=G6#L;r>z0wFO0~ja_i~BTTfZbk%Mm7UDI=pbDv&Yg`oGR_-EAbA}slW z37vYLCt93LcC(iBw81#V-#cF*kv6nUvF9L03~DEtE5`^#=FPizI&U8dMEPYMX151s zWu{*_h0@T|Sj{O?%@N*} zjLZ0ablXWqXIzu}$j~7lJZe^j0;fh@@FED2Y3lk0hukP?#q|?5o!w{|VUnmRm*A$W zA-+`E-jqsotpe#1?t3d!U0x?xS%h@IHX-8!7&hx-38~JdmJyH52u5Gf0_B0gkRWii zb8M?<_xCzGq;#Z|DR#TLicKX>TGS}1D8xEVNMCTBV1hWAl&OvYA1n1%oANv6 zPBFHm-XKx6f&f}ocWfOGYPfLm3e!5sAv_~e^IF>UifO8^V6Hd@`JTE@%-WXYPGFxr zDCxJY1wv6dWAaX~O40`UWAQT}{@b`hDaK;#-+b`|7DUD#TadV7l~;j@PR zM6KH^g9Z25W3WoHW)_7}MisPbL5TpRU?nhvIZ^x@v7-oRJwfM@gzzuF^O7sIhT9N< z$ykv`R@p;vX*{*)Rz_&a828ZUnWysXN&bmvu%a;MT5LMMqSkS-hptjW+@sj%HVgfT5h;}+J14V-&7Z?E;#MnnBAw= zhz9+d%Q@+_w8#oAFa1}qrQH@);o#q}!Yp9un|djv!gD@tf_0#Cd4iUovRnb&y=|Q0 zIH$g|udP-QEDIDX4ZzSN!095C)8Pzr?#yjhgrh77*qQ>)JC;xpUj`Pc4Xt<0iR>pm z@H<_0)vD^K{}6ZAdqR9|BLTojw0Y@^nvIQ<*YLc0aX%v`kY{;a@-@2C63A(Bd_L#b1nf zhzL_YJSx6lSLK0Ch13Ct7ofeE4z@s&wW%Pi8A7xu@)46w@$K&F!E=rA2^L$DAd!tOT@%6 z_@_twiBhZRm%YyAM5>>cHTiT}r73_s6Bq}76%?T|JULc^?oV4;$4Me5du?-x_+miwnO2erFKP*tSbin@`7R;p z^aFzgC2YG%R2_ea-=CIcSOz!y%#jKA!I5+BxymEg*I2|wS-k}x#Cw3OnHNKp|~@_rCTnT2y2^KgKBc7;F!lUkNV zO2+K9NtyHn#_bumpCnZwn8gh1C`Q+scn#V$P1_Baxnw9K5KW_SgFq;G5n>k>>qzb+ zYK|(Os`ALB3uN4MP05GRh0o)paf zKrk|icd)PGzU;Z{Zmh8725U>WBp}~`mJ?G!!&rm{pe1bB@_Y&C!Vr0sw;IJ3y3jI5 zBox5X0VfyOxm7~-3xu>KZ7ERlNXC)BBVMLdZ*l2}xGoy)j4EgD{1t>Q${w8!$ee)SHJ_ekhm_>Jg-m(zmgdJ@y| z&}{iTQ_-QnQgxR{X5IP^PP@^E^DcPLOK#!i7hE*G=nA(kxjO#cdNAoW)>d8V;+Xs3 z%WLiu%KGRwn!J50uK0d_P;8dRNqfkXdLFRyr2CehEzT!r+55OFbd`;w5@Lc~)G9*V4aLVA2w9id8y6n9NLNY6Fbz z$iiX|0!&Duf!5Mkr1kA5&})AT>B(r}91#Vz?kW{cVB};D60O2k0h@zvYx#>^-_T{0 z5W9jBEGY9&{aQ?v1U8vuw=2o=IZ{ei*HOB(H51;xGv1K~vPIM=uXS}W5o$}K%}Z+m zYEG0;3U^lCVwIV-Kg-$Kv?{v@b^g(h`LzaoSa1<5A5bpYkThU{Y|dl&u4$hm&Iy^e zfd;Y`2xCZO`a8RRG!HLtjq2ePRK~bUK-Il#>b{$vT6ERfDL3%Tzkzem9-<6O1ZcN` ztyQ!zckbojc~`8z0y;$tb4Z**fOh8bDxUeAc7)}FQ@)aH`HYNdHItEoGE{cx^BOYH zNRMTZo@}_%))tg5zAOc5TET(Tz`MN`7Ibxei%Qz$gY z|I}TM&cJLzLVm(AZ7S%yzqPOHT#1v{B4EiZVsI}H$rjP*HBTkIr|}Z<2fLnBrlC;F zl%bGtBK|}Ci@b{{?7`ak3pcxld31$9!mzHZb)jW5Wbq|hf`>q2eu|B|u3Y;xTqkhv zlxA=^1KuFI5R4(a{Ls=lU}Z{7aDU+=U>*amTKh08_+d<@807dLU1gk4p8@SBI1MJ+ zq&Ei`so@(eou@PCm=H%sQy0^nf>CUDPn_gZ;!`qzaF$25QRjMALg~9ow1YyaGDMh} zzAeW}>c5%!K*0gUWSy=n#0%N5kEfH@kWXjy1CejOqJy2jt6(Czsb|o;%Rqr^1=r7b z6)J(FpSeTXJKQT{O`|VT2sd5{#pPnbYkM~!``5rqk@yi`K@gT2yJ`YhaCa7T!DG44 zNFvKW8H8M2bbYlopzP3mPkhB`X&^kEs}=|0SsWM58*EBm#$v3V1@W;85isS1swLd1u^#d@ zwO;i=-KRjU#QP%mSAHW$cz#H@Gx@nTTLLgz3m(tQ6${#pwTCxMl zlktYDfk_1QcaR(M8xqJ>#x(32r5o_2U-NUKZlDlB=CDDHdec>cJL2|mTVq)Gms}Yz z-R;5z2oUE>#=b7}1e+^l$&Xq-8maJFuTYXbosyM&GN>0L4r*W;H}XtMVgfweuHQ{$ zbkxu4$G~f>t_)^AFaZA?=44Y=qz2j@5`#)Qj_Fi;pF(L1&XGp*c4QpktUrmzOx;EM~g{al|Fl9>bZLyvNbtk;SgpsZF z>@`~UCHz2-kpx*!`AV6(Nsg3~mi+Fc3cT0SUZc=yzjcW~LTgOFX{B3E02jYRcacdy zhXo3T)R@9VAWl?5A<5E<&_vI>TImC>T6&jGCUpo*T&b}Dt7ryV?gA{Thag0_Rcep1 z?-N+amtC#@yta#$1x#&+TtKxKjUg!|sOe8wxN$pDf{%50>ehmmMx@38m3i1T7$<2U z20##oR8mV1%aB~Bk z65^WUHBG39RPtOSA!_WRy3OvfO47<%vc|FrEu7zg>u_Uv(~WGQIUilto(_3ADLaK5 zRsgIh4O1X7pG#~_@4{()-s7Cd4!L$RX{Jn=B}B`StCvKe79g^00t8C8LSo4`_@ zK)6xrXHC$dvfe#EP`|VA5V@S^88RwO%BSWO8PO_lK(vXL4`Wzj&fD)kww)a9{~*{( z_!C0``ob#sg1HWvg?&9nR|q7K$AY=NB$mWUmYQ62i@;S=op<5(qHvX{G=PZ#0;=+5 zqAfRqL1{T4M1>X4sjXuFRtf(6a1BKD>xePI_g`2;fc%%>{<)4rKj`D#o{JF81g)0@ zLQ~iXQzpHoXiBa$7)va;wI?fXaPXWf4FJ(bLC^wfAX8}Cr=gdf$I<+089rI6vF{#nc=m&AqqNdn8JW#o@b5_>bx ztS#1Y4BV633o|GigcvD67|J|#OMp2gtPjNAqR^*5cu}fIFj`qDgXQA@yTpmZQOALRJm+AsgW-Nc{89o^|ONhPy zx6P6H<_m6M2rbI{==QP_IoVP0?$4z~7oQt-ZU|(J$_^6VF@eJ|-VNxm3-}>>2jDi{ zI_S!nzs#1HTeQ?wfZ8VdG4JcGEphE<@6j@W@*4#Y6?K1{2vnprD)JZahrgMVgeFZc zTETnHufP=zFbt|k6qtv^O5^O=#Bbahri4VXdk#EM0s zW1{PheTMuu;}Q6YXxNlv?7sF*VHW=4d5y$#2zmi+6vX{+@#T!ujr^>MN9fw$jc@Q* z{f)c~*9%D?)MS)DCDyX{AYf-6LplbANwbq!dK6FARjz%6h*rZ2Za`ZM;mQfeumG>( za{<3r5C_s69!qhRu%$QOH7OQ^Nn{e1Hu><5VR$?BlK#CpIM)yv9VGG0coeS7-nZ&+z+?i#eQ{DiJwFnzIZ|`w!~>Me#A9R#n^`h z4E!KDe%Oz6**G9CMl1}@|+Bh@ro=P_k}|2a+jq}UES@Tt4l1T!V+e36GPuG z%TL@6nrJ4j2Q(lHkc1c&=&pMXe@|d8jJ%YiXd)a*Oo>b>jtQyAWG@dP6CYX!m|Prf z!gYp4&+K+W!v&#~3Yb*bXgo^8llr@SlZc`xX8tMK7@wEV?Fl@gEfY&VkYRxXf4l5; z{gZbSZ5`@a6Yz?kEo~)200HJpJtO(L&_h?3}YgG3(bz>0+`j$9pce!Aabe>Q5WYA#LOj|{;@_eR zi%T-@Fx_#x%kbbJ$=hATegI?$ijhF3&kwWv3a=n!Sdp=3@mNg-FhL+tu zTXzVgpsYia{+8RA7kQWeAf#HOX`$+sZH%A+(%ttdVe$$Je6X5R;`bN-GF^13kkcel zKE6iAQ^D9h1a|Nz)fv4Z{K;xEwlTV53j2f;^8RxZ5<%GZnEtu!6rPRvMmgDW- zn7MN7s{|$_$-eSW3clQNU;i7GaMhb6{;<6YMBU=5tE{cTZpQ`SV~VK`%TOtGY*$8H z-v#8=4UMUXfMe&oC+qVaKq4P}@;demsd&P9^y8#4Xg@xj3yhw2mCh)aVmU$hAg+{+ z8|xRk)i~~;L4aza8seAHe|DVaqML?`AC`Izpb{W}d3?EEhUz;EsPS9or zv>f1H@w$*7r1uuLpND;GDKS-gw1K37GMe`(l@fq~>LmjG7O&Eyj-8Y?57rd|>HLN3 zTk~^wS7^;3#4VHK`3SyYvWlbdtt0LOqHCZ;OB}#b5;K=cCnU1e9M>`6!t^=>8B9!O z!RvZl3S&krUMY+NiynXm+cX%N20JZKaJYTErIsB^Z$P2ORtPE9HxW$TL|KP?RsnVR zbJY^2zZ{T$%yXd+F_Up93FpV)z@5aDQ9v}iorFOwEJ(6+#K3+ZtYtDDF>J74kwUar zbp#O>N+NQc010q<9op_jfw@G?VdLDSG_mKaN-h-JSx`9QZ;NH|BztuGS0$g`msKJX z7b2JwT5QB~b1r}dSVSUl%)Bfl0gD9$p(M`)0K))cM}^_@NOyqC(#J_qV97>QZ*WF7 zt9#kBeni7i0U$}GT+d$N37NMjN~NEh)}a!?rGWkhJu5i3R0T?RSOAFRb%ZZb z#X~B+;NbEy_z|pis>Q_>#Hk^qs`uPzZ5sbxc8%~um_yJhYimOB)$Rj)BqoNlIi>bZ zBhO)3vgUmrQr>c$RV8O1F>LF2H~0>_XX^@qB*PiIIq450?a6hMO5R+(^+o*7B9lPe zHI}su440}@;#P9Yx`ND6CW{m2HQRhFGu|qss7@o49_{MYH!| z4gmJtqVbCYK?L6Vk_+acYz&M^bq{a@6#(Q%R;hu1C)SW!NCJEySrEXJ4d9~I;a5r9=lVBRd>!jrMKW(t0gDb=)!&h-I%?r) z{D)N;Vj%G9&@e-(3eFNMaQguq!ICgiTaLj_p$TPZTB(8VKh1>J>nXkSI0aqsH+AM| zr3Mv@?auWtB-a-PB7ssBx@XnBqO+{Q5d>3mxrG7FG(pLbbCoaNu6G2;M%{j^mAKQ|nEkxkSRVQCR4WQ_@7Z=>%)MGcW zhFB@-1L(SdWw0a%Nnau^LxP^0fCUMVPT!zfP+|!vjmo=gWITPqGw_!VrDxv$Zw>)r z_KeYpV4@q(m+?v~Cg`LHcq$n~exs`oydzqG>kXb2^tlS-dxFr5iXX)FVDa?5%hk*8 zf>2P!SniHQ{4ja~)__`v(U0Pxs8~!xAbkqccnSA-P8C~AxcB$89B{=b@Jf+jS5#^B zgh~=h5@UHk_H2^5h6cl$Ro%07jfI5ae?nilEh-sqL9DRO*@Ua2H9!E^cd>9A69R3; zyN;nS6CH3ur1OboeEFoWvAE7)2q35>#Z-o|0+}D&S;IQ^XaPr)oWCeN%=?=HUa%uwaXquLI$XnOv;7 z3hKFWjw7wpA{In|>J9M^zcR79%?v7@+e6z>Dt6@79WECj@$?v3c>Br6c zT|~%)4G5PFRC|e$ky6CGz@6JDe+I6Be~VXKEkwax5e@2kZvbIekFG-it-_GKhnvC0 zhY(K?-BqoJ<)7G0k#{4#Sj<~AqwGEjC}#FCsn*k~JS&xLpa5mf#B<~4pG$rJUBF1X zMj&CF=Ovs+twZ>ZGAVMCIJoS#Ya`Ht?;*kUEqsUO(fDFa8Y~_OLbFL0=S7*3MrrUr zREZ87Z%XMQT30cMCJx8J*!lq9WX=n%CXf}a7bdCtpr_WZQekqKeaweaa!;=#=C=qX zX4VUP_1bm|hwB2OI+929mP&dpU3Id~I82u=xv-8L99C}FS{9bU&aKp8mAMFaam8uG zT{f0wzGJkE2-&vWS3?j1!D9(%Fe}9?5)w<2hJboM!lp}&4PT)>eX7>kA+0oExila= zRH|?zqrpdIjc#^7&r3{JXxO7>7U_ceV11pg}_IDPO=(BnGNgfF%tD!itHqaq0cAisq2-_!j8# z5qJw|1A>KA*O;!F=EDo>|f-?HYlENoJyu zPi*y5BMThDruZTPxgZk6l2~;CXgt@q`VnZQK(thDpnMSEmJnRxQWI){HB{Sj+nY<6 zwzp6;6Ydn$ON$53W71JJD1nH3D)h6OmiJI$#O*NqtOYX9mwSP*BnXMh6VilGxD)pi z;n!6P&JohTtj?zENi2v~FJeRu6v8c!U2%oQCoWo=5rkcs0fMO13fyo5{je5R;G;*5 zNdJHvh6^u7dvLLyC7uIX%Cvxx>&xgv385=TTAjm|u10Pdme$fn=xQu0#mWkv9uwJu z9gIh=Z>+lY)djRZzwY{wa{?@I@*Y-g!Qw^2=;(vttFbk?&pp}zN-&&!;3~+g0%fXw zDDYw-8o8dvD&e*pyX4&UcS9hZ1Ea%nqB!wGhDJro=dm2&>~!y?q&Qci7w|pgnHVx)hIEs9d&n7=p7*3F zPxP$DOoSjJor;(e^_Fo0Jcl=)4tc9CJ&gjn_0ct$8xz)w*(;1Os2&x%q_XwZ_c?1#B&BlXszH{R;huf@YOOcFr)&5D(rYS zSXXy|!g>NByRx9Yo<#WUMD;ZgCyD`sFI>9m3S*;6Pd*NzTE33K*{sUYp6pozlU@jE zSlDXb?y^!$@YDJ(faerg9j100^s$Kf0(vsMh)dyLT2AJ>X`w$-F1<8VEgFR}S3rNQ z075AOPZAd(VoIUJotdkqxk+jr*&a3MH}d!$H?X-5w-8OYc3jhg zX+|$PcL_?^D3~FYD5*@I0ai2#^nG&Q?k0^rpI+ew-tDVmK!Gw86HSRm!dZ0PQ;fhO zr2?sIQsLKo310C$1yU0D7iJ+?Hkq_2yaG$94<_#t zc*~SnKSZ+>;x}bp`fW|3_$rbHFn#@S{d@=vtm5j$7qk#7v~Rk}3|XhdWG5;?32MfJ z7{sEIeLgS1AHUZ=HS_hl;_ku8+SQ4h>R1+|+P50lZIpMw=hg8_H&GbqQX7Cn>*7uP zigpW|K-Qrb7As(D(Nzj33Vb~?Ko29g3TvuxA8{r0$hvS5_1-Rk2{2)m2dK5ACY`Nbpw(Yd8ct|O!2p695df-Gukx*>HLM~Hs)sU-os=(pLLT+ z(iqFAPzNcF!4+~2DDW-U*j&US-Gb)v5Ff}gp$FAA2waF^HZy^?TKQrTOoFH*L{|<} zD5&b2Y8}}oP9uR>dXfX72rljb`-p(CKr^37EAuK*(UlNTi}pU8reJjDIl7I|p80t_ zQ_z`Ujs?evs3I)pfeUWn3ap)_DOUv)Jlt48tv9;5cA^w1s0P-6jDqWpkZOWb!eO|( z20#PUaAn1VP8ioIB31y)V{WeIK6z)ueRQGd%1P^11)n7ID4dJ)2e%!rF|)Yh-oCfw zp1V5ahA$y#T?4p=iLr*Q!J{>pu#LQ;?d6&)PENbNxrc~(kpX$;#p^fCxo1QWM)5e} zMppq9#@|eRu)?FBNrg;uvCu-01*O;P!r`**1OK3H%Yt~M&rb^q*Q0& zQFQkaR?mY`Zj8uk@DgP)q#siUQof<02(e-i0QptKF30S{W{^(C8pSu?ez196=?(yw zuBjZnrp3FpxgQ@u&&U3`3m0!`_sA~Vx<(-Bn1;UqpUZD;9p5z1LO}vFeQSN6kI6yF z9|Rx^G_R?dFr%FeU%HPnI~qnfAmc16#AB_3H{!}k*0eOl%DC#7oh^+l;O1c>EV+_& zXFSY4JcYRmn32uJAn2G^!%#Z5MJ0lxgJ?{UEptPb(LQEP>3u6B;z6gM?< z-@SA9t}u*o8YzZAcv{S&|1;K-h;FivM!kfTuHi~`HBYad8B6? z!Y|MAzRbIe_2^x9Vh#0=xY6q`LYO1jxe9k%mEBaWY)&)Pkm*#A`%zg3%4vJqtK_9}!G zg5Ip`0XW~r28wW^r&D1bWn>_bf~^HNR09f6fEAek_K&N<>=Fd#wdY-M6AdSsZ$v=| zno%cm>b6P1S!bPAvi#Z49+f>wKtJH7#ZK9huTK!MQEM%$-VJ$i$BNYwkB`W?YN_80hp9&^* z`bpIosYW3XOyz3<%RzMC)>Q%tv-N3=^de?>JRRz+I%w0!iK1^r)gtk>dW%-IN!2xE zlNb~Ul-Ef~M6asxhqOG6w_2Kx%bvsgG+!fIO5S^YcTkBcHjEkgXu1?zHKCLcSk_Z% zM0e)*`AHO(TqC#z@sz^ln*h%>+{TkxH@5Iti>^}OQ-UQ}5iVk!#aL0bj;_PAKw~2Q z15iPIV9E6jz%;sa-mOfnx`+3kxXA^etFkla>4^>U(q4D8ytHC;faKjdSU&geK`2e0 zb0fq3ZfN#x#JRwCEqwcoD4$MX?=hhU;PR23$UtC{X0e?ex0pzn8U=JB$h$*9Lb*1ctrNQurJVoRJ~95 znjQf`hzIMwt*ZnQw162{CukWOjJKB65#*KE71f=Z@ncZ!6arMZxJoClJ{rnR1c^?& zRo&%u3X72JNlw01=vlq_S( z_oWsit6R$q4kOp7h?q@f0p+=9wV8%hUCFGd@}esKRjx3RVDCht6O4?f;-FW$Q1hNkbL z+5+@!Fr^TTs=!L*LLNL9pH!FefDHTums~sq(83L*B@DybLg!p*y60&zrE`5NqZNC{ zvq~T79B2NL7>%-eTfy2o#OAneeC?!uLL@yVTs5I(Q!>eF>8(=H3tGlLyD8`MNu_siq> zY4v!bOstZGcn}+s$g^$AY&^^Hj6iQHrHe8aQJSaZF=6t%T51Wj+seH(o$K!*RuP#b zVNA`)ycKUHEiO`=NVyc>Lnn0>kv8(Sk|ca!bW_h z=o6Szz`v0X>4F=ul1r!r1(+qlD*#r7TMrR#Lg}C~1Q!&IMiFTyrFY>TP%;1kSNCfw zF0D|i(X8>8v`R;dl_z{n-iWHzC%ch0x=J945QqzJf+2jVU}BgXfXSA!FftMCTpmhp zO#yC!QEJymmJXAa1#%e7Uq6e&V5DXg1Bdh(8<884Dl6162Z9xx8BFJM0CfXp8XK;)+iP_r#U1f8w~me1ON7Z6DhOUb|0z|& zTC9Ka9P*}Ca7)U^$cLEPpwA}?cS20TEEHNuzwX<*P9R~3e+9zi>oqfy!9v5G$V_?z zSp|b`mXBgt&MLa7A~ggl<*gU~E!r!8vZ>YMcHYC&O~MqsmgUb^txMwxwy7nRi7#as zir&wJriG{tTAG%f(P#5Un!mJp5fg7BujIW)XK|lWfzCOnp%EgcG>$x@3UWVC%^-R_ z>B0p7kaht(_?dN8XajG&{&Bau1b7S>O9&U>(gs{@f~aHgn#v013Q~fV5csd@+PpV= z76sV1wYlx?&6nLT&kVVnR{%#R)Yq5($+8Qj56~i#v}+T$kY9u#`K6a#G>Ui_6&3t! zj;2;?SzguC#aWzlTV@H}vkH1*u^L5?$x|4y>7JjdL;$Js$vORQ7ki zuT@wp7(nI>jER7ti~EsFg$8@k z^$)sm0Qad3%d?Xf0tlt#eS}qdsr?}NjJE*1?R^r5He2& zUb6Mwyq=p~^PGG9Zn=->0$YbWm+i?}Xw{*1VgW783o#l<0+C1jgvh2Ao>mF>C-4+-IbHt=LudR7cYepaX3_8COqu{^d?&YWCHn(H< zXlB99zq{WR5m$f>gm?q2aoj5&K&5VUca25>HwWZA7=~pufgm^26r>O^1re{4khT8V z!gIaB*0jH!`|eEa%bJNcZ04$y?f_)$eh~eD=$bVC@$~h}R1vADKp`hdwwTr6HzC9a zG-eFCf(y^4h%j>sr#L1UrG(hgH3%etZixPr_BP}<>KQp0-)O^guUUp;f1l-j$(V_Y zSNp{@29a1gaNQLl1mcM)6r@7aG(fTgR(HVA&abVwU%iXkb=!2YFz*aIDLkmOcvqkC zv)1{yD3R(id3t#BAqgpC!G&N84c`DSuIhDu2P9)GB1e zP2IwX@_iU9KQ8Imu&o3d_R;w0M;$nn9g5GvFLwb|vp42k3;;u8;~~nl+;K}Qo6vek z5MyS;JGQHCF-uyAUK1kIIH6Qw_FX)Zwey=u5t6T zgi%skjuE$tQ3jkXDE8XS?IsO|g}J3iTh3?Jay)BvAYGS5A!S0mAIp$MZVko8^`l9} z(oW()>sLbp)~Q$fmhlQ{iw`Oj>KfE7Mh!(ZqMIwWQ)udWsPJx?N5Uh>cJzEj2XjxB zzgU(MJv+v4$X`TpT?No97f5@qpd^-bsh=-sC zb+;r|Q${Ei33}jkl?L6fZxr2!&VMGb3eUNIv@}mzXp8Gcq2yAdFX`*lUH~TUIbN6a z*+zb4_nkF55Jv9jS9(K1Dc~m65`1a}|4!ChvatO24g90noSQo?`-Cm@;P0z#a_l$ZX>U%PyJ-n` zr#JYAymMCyBz@Pk8=?@5cctwZ2hmJYHwq~roj@LK41hwy2+9_MId2lQjk}fi3X#MW&mzLk-yS8lvz#aAa-k;fRexS2=_pxamj^|N~j!mVG6O{V_pV+k&gxOI=$!?mE^f%FRyp8c1@jRvyuO?&12Rwc|sX z`)8i7na?PlB|5V3K2J01+WS~H&uaGyq}crgCq}$k>M&N~YAU_K9cJB_VDdyrOGpG& z`nzd5Vs?9ocN0@FM2?u^#)K@kqt{7t0+M4h!Bzi!>A5NCC{g>xk}Md;xFC#>v#_K3 zbCwXhnF3Gw+11biOG3WV7CO&9MxN6BNwlXRBcr>N%U^x-DY!*Bnqicy44jVT%*l|$Q|QF82m^;4Q2@&bMgua zCuSE@M9&Ic1-*-Ar=GY6cOSaNg(b*5Hr7-0-f?d2Vob+*zmvSSy<6K@ng}4ktTW&y z5g#I`Z0&oOYlcUpaT|S;=5=l7*;|^c&W^R1&oQ6dQjFJI;*$VMympe~f7JKtT7h)_ z!VQ*JM=Mw|?QDgH)>oq2O)Z)%VUY(A5FrFAzc+Jwt6l&o4M3g3RfM*H~_*< zOD%cjkcyoLH6-1HGs*CWUBAz=_78Wi#j+Bm`qvRZn(Ssu=vsl~2mKd>@aR&ZAn@q4 zq@}O^=mkhtD47savQ5qHtWeSdjAqI!!5HJzli-Iu-rjHp>sQH!>Pe0cKB)qz8 zv5OcQo>*5>0i1-l2ii{-W*bInZcAgp$#Jw4Jqet(eVlihV6~Q)m)G2zcW2z}{5ld~ zeeumqY*GwYasQb6PAEdhFFSTdb7uCK`&Zn4T7PkJYR0|s#yhA64n+r+Sr(LYU}kdG z=B?fPn!D7~G64)y9Yx%(05nMckycvK_Tma&G6AJyo`M=oIOy8fmM~9Wzt6Jv_j|7K zEBDP8ZPs1}O(3qt$X;Jw3I3u2j&F{xFvnQWX|aVJ_~a$ zb7b#|yfU#wnFOnrt{B2%+4?z?zgs*B86KhhqV@Oep3^!vOC97e8D15~Z%<5IeSBd0 z>97;JS|FXf@Em}&;V($+MS{xO+{y}{CT$>^63q;ztFat4$<5laBAbe!Nd*ms5RW~X zbCaBvvoY_Pv5^lG`PNmQ^eaGqIn2 zCWForeb`j+-x#&!96oF_V(z;{VA&i9&>=<2H7BEH*SYpl(+RT52${rKQqr#c<>=2% zD|?&b%_=maO#eoQuC@a`R#yuoUFC)ECZ%WrO0|Tn8DC07R?R`J8*bSI)#lP1tweMh z=Qhuw)wkn9V;P$u1R@Wbwv;8}-C)DCY=*{$(c7k9T2Oc*N?S>gu5eC>pZd`1qJZiEB8$B1RRIqwcz6%g zbA>=c^FM$nXfa7`v=&cb7CC0%%l+)j9-GLEz3}1+=Bbqr`~bPD=1M!7ZZLj7EnH_DXafPN2v>MmcUT`B33X1g^>b- z6oitx*wtd?T&QqQd4O5My1sYg2U=|Tw9d_j4s5bOh4=70U*4Xja3L9S7w=AJApx=+4&7p^lDSXK6wgng2>4-g{5Lxb*>mtS!G z{jhvcXqTm`q(Zazi;1gd-RcK|){iNl^{2Dyv zbM;+Q1v}$F{`v8V8#7%!rT*c&ULfgvgg>fUr3QADnXBd`h6StY;v=mblAyn$Z!GRC zmApND>wbg&YTJraIhXlJbOm`qD#bV@mIQYMt2gX$NwmZ`dVxZZ{2f%upxbQ|&G{Zq zEx6l2*NHF@p<*$lG;UOcrE~tmdH2#Q&x<=xE50YPNa;=h5(*`*pu_CDUVXt`m>6)S zko2f-Vo8FPx#Y>p81LP`?@&V}n3$_Ytt8zl`0c#Q_Wtljk z$`3TQY^teMc8uYOmMoUEx5h9Jc8yy{VFTQxyz4+WYSFE!uXw6$v&Ev1#WD6(@TVs2~oC&5QABZl$U>iEuvOui) zNbdoKQgdaL?tJ4`1=9y6vWfhGyI&|2ySiLZc5Zq_AU(iKHI-a93x`Stv$C5rv%POw zAlg|3jU~eEj=oVDz8i32Z}iP!&ehfv&4k$?iUu&17TkfsbKP57rAOux9v%(*;2LkDZiv#Y%FHHcfpdgYRo4AP-ttpM+f^Ao- zjJQ``eUH0*`7*BIQ{`w`0r+4Ad3nEjRC2fPJaAJpPlTD)8f2<_DM-gRL|uJlC~2(9 z(17P4Ta_WZR-20_ckqF+{s5` zNts%GO~LzvkU|d}yH^NJH52VERUC9nt6T2=!zuT85-rSOEhTwl6i%>8r7aQ8>Feur zSFT=m*REfdGC!GsghVP8K*LSlb{fA#yK@M=cfD}V-MBiTbqJ%Hg6vr4Dv4|2ZzvWI zA5FW552oDOIs_NX++d!=pf0ZFLv1}*y&*FSt?wptP6VT`%-}&kY2J~>jWph;EZp3! zw${~?$9YlLzPbAKdn@1A$rq0N+=Mq-{9A>OP}vT^OYk2LMI#-0QcnmZov83TL72-s z6W%&>@6Wn>4`$u!2AB?nf+{fnFx5l^Avb>hyu0$;bNF`x$ha*ZEKhGBEJNmnmKDdI zN)gM{Y`W{$Cfsw+U2!AB12DCK^Y#ckp;w7*uyRA$Ei5d%#}6O51)%N-S(YjSJ1Plu z>cAi8bG2v~eqK^q=hRXVvF8!J1=?yt1w=BLslJd=9uhD^%UVgQ?n^+C)8Lcf`6yo5 zJMMG!H8X-#Kf$Oh2veJ6Vtldrdbxr-_Rv z@81>2$pZCxJodmg9KPj1YVFd+iM~W{-h*Yb0GkHmXNj^N@S+vCfzzy4-Hn^q-E;U1 z3?R|6fo9~swqWx>w^0CK5si$Dz`cR^=+*vk?BP@pI30buraey6zc)#1{h!?O!uiWG^KXsA2^!5NbL_ zahnM0j#KIr92JGfE1;FNca!Mkclfy?Tc91vg7lVv2^*nkZLur@C}G;Zmy_+Yo;)VJ zcwD#b+ml^%zzd z1y<;ablDX$RlpMgYs~o!{44XJ?sM6g&@AoUZ6A|6DiGpCowlihFYCAa*7*(!Yau#G z9SDM15c5CVlk~gr$DR^M$XNb&n1k8f=7CH}8G^=%NbcRTPco4bVX5ySEt-K2Qw@=U zb){S$R{{fN2Dd_py{k$Dl&tI?-j~ik$E*}=LGd8)x(EOP+dnki$6tpvGQH$Bw-jt( zo5qeXKv?h*7~gZ(FT%pP>c&R{V=M zukA}`RmTBY`*4*p5f&L_?_v9-Vu=7i=&Dn+sf|^u6`Nf%Z7tjmWdz2rEaV`7ro@dG z^hBwko)$>{<-UgtG|l>GW>89y%F@NFl`x{t-66$va{TkyC24w|A zvs2DRdy=1%UH)WN)E><(D=e6TnXwzZc^x2yg@pz8$xq#OD=V;gBv7m|hXf2mVT5Z8 z4fVVCzvpFlezXim4M7G*P>;)S@hR#m5hyK?{8Z3r42bTy^Alt4{qK6-^_3appb(@l zNk6K^^O~@dfc*R9Yj3-C6uP4zhviTi5 zbDvGCta88JgFB$zo=W*r;eW^Qr^0(xh>&?RSy%*;XU?=O1da{nwYpi5zDIZOJ$4(L zfN=XX0b!?J6OUkJl;A?Ua^-^ijQ73ZMhBp!H&)^H(~hIr#%>gI)<@Xj#GVE{Fhx4Hhq$ZXvN+GQvQf6(3)$ zH8GiS^SWay0L?f)Erck(8{efRt^Jpj&+~67KVnmB)R9T0}^N-Up~RnkvnLg^<@ttAC)(1j7gmrfY5_|#ibXNfeX z%jSeW*?{yhjf{X53Ph_RsT39rj36nJT8B%EEkhVh9*t z*WLB!FT4ISfDyRHjtxK(0vhIL7Ti0Zc-^h8Ho$~o_2NK@7fDqPC1$>lRCHj~_a?+7 zWoFu{TU~Y8_UO$?ziE8YKg|iAi+UEAH@YTap(0*KD^yy!%Y67}ZjFEX=VKd|s4(mr z;Rr_~8A<~$NgT<;zNut#eRT6a5k?Z%6p=KIIsX^Ow46@;vOOn|IHF)q-;1f6;bJxo zngmJ0q&6kTfM9!Jp9O7ANKwNS_FRo-Vcud|LJ&R_ z#`s&^ju})PzR6sIhQ)$nOOGOQx+M253-9(*$=T|`b*`9Td&k1hppfd+5v`z(yG&0C zq=|D^p1@s!`cCQ;5KU16g5GrJe*d?a`zp4?Jl4QrCb6!=_nD=n?|@feRRAPc21O)T ziZh6y2NJZ7L2qmt_|_^3zAGq^N3?k4O_?|hAq4>}L2%TFTU%XoQx7NIG?P!0{4BaD zbwtSMqXyh{5JFcjPq_EKdIje~m^%nLI_A70BQDWat0dtT>G*1gS>qyTUs0^P559E8 zT{%Ajkc7thj5Os?3Mp~Hh3->#R{#TFc59n>cFd;$5j^;y0IQGIg|xC4Km!#JjUO>K z#XKgxwxTc_uo?~AqO<@P9i=AqlcZw&$(<{p3%|zr{3>ij)Fz;fERAw~S|ySgWq~4A z)sQ%;#m&@WlxuYOT0Ja(QJ1pMsSLvJ=#4ep{w;b^ASr!hgPSIzlp$y! zGZ9-!;Lvmu{$jzzj@;)NWiq|g9HBuvXp&^If-*}2-rY^g8f)=Zg1kx=zOL_<^pTPT zRGnAuo19s6Z@%-`ZEZ6bD0P4Nv*Z{aKR!0Vbbi;gg0OrBF+5Qf}`@CC_rCw>Lku>Zk3{HL%R9D+ql<7xga=%d4vS+ zKp{X3MJ-Q1f?d6S_rYK6{h)w-9G3SlboVOW`{{dDAYldmIEeY9i6-iWk_3ZO{WNju z**+6cwp>)#RH4?O`%eU;zeTtq_Mk_8J zDLhNY?&}Lih_%QFuoxu;3EMlD5SyvHyAS8wCvUT5j56hf9qQ|PCLbV?^}KuarRQ9+ zgxn(tBRkMy5{yfw62S)5TUr^xWCBhlB2}7_8yX#TuOg0gX<|@ZhytrI#GSVg1So-m zu6N$PE!7*;(6SsezA1qToKF*yWc4P1h(Z(FL35Tk&ln#vbLLmct^BbXdr~;Oj_L89 zD=$KLJNrHfl2Hp8>vx|g*TSo8P4Zbo>9`BaU+Ooi)o%cXUS`ntZbGv`@SPJASBc~A z*{x><(!{yvwm`lAXX29~E0Uf_78uqAo!ys>E7@_KzfWTkd=Ie#nWI98G8tDeB!xt! zD!3Om42F|AFPplN4zM1_L!jlG8)Wfib0^SaKW7Pu%3= z$8K_V4O;eqyelg)2n9&LZwL&;Xi5Mu+`2vnp)raBblqF*Nb_JI5Hj%#v%m!PKz^&T zM>fWP1SBEilE8#*asNGkZQNZ0SfW&BTnN^h2rDuh6(F|VokH^N%rwdh)m;P6tS&%) zT7U^SL4+WCo{*df=)wQDhwa*=dJ7bfB3wHSy@2t7fvozS^5KptQr?p6UX zB-7ZI!3xlUmRw;7V=$^?B?;h)&@-??R_W|TPEA^d67n{pY2atQz4fd>QU)CUU(loO zi7u7Yr|Y!|P2bJdw=Gt2;jodPlvN?qLux34{9u->8bD^tb7Y_B)nshi{(wwOV-6j% zj~v_jz$9@W#!pyd4gxve5X+A-3dURv3;r&N)u2H?-V11Jn>|KSA_dYPq%E z*RMNTMG%%W#YDf(+~ZdqW1xU9r2N$s4B6fkfG;^}+$353+Q1m)#9s91wO z=92E?pjk0cWqA7Aaqgot3QV7Usw`Gw_ce7|A401Nz={z#EQ{w*xcVSJU!FpV?^TCo z@avzt>+U|70aMq&u)6w)bmK>90!N|=-wP;&dR?I24#iO|FGaQax>y}S1gonFN}Zvp zB)DVO)GISXilRNLZ@Wr=KkjkO-MVpAVpM8Bd6%m^jK;_sfPg=ooO8GDPJs#2n$oNy zWyBf}(rO$!C*HT`tq$??Wj+V_evo7B-gd9u&!vzNE7Q+s`rMi4^g~JN6>tV!&!Ate zXz$UIiLX_wQ%GzngPiT9eTgeQ2$n#%J<}C-FD~5E0!ai>T=-TH>_h&oFn(LJ`o$1v zx~^4drN=4qhfKrZ;(A)cihH0DmUQ0#Jgx#lFhH&WS8e@Gux-TOCz#LtB#h3 z(OFc1%c>)6xF@w51&rZquZTcXV26xaMh0@H0Ufl~BX8%y4?IWiPUWjR&Q-lh-r^@G z&Ru`=bm#75?%wkPY2w0-MN*I_YOI^Zb+#1~FmIO+@7Osqr1k89tip=8C8n5ZV zb9KEn2~E15BE%saKLQ0#p~9ktc}A+$3iNx@(2P75@g{97C(>CDKZ<>R+%LI$ekL(5()K*owd ztE5?NLTOMNj-S4_3L8~AQV)TSy((t5!c*nN1X5R>8`EV__y;?wtvC1dyg*VWQvCm6 ziBB>>8Vb=XA4n?!@6x8i>sw82D&&GKZ7O7KwY0c6wR62*?pte6qZZs1@;4+m33)Bn zZdOT&OEF{qsdU1YQJZ8^#_OD+r8 zIKd7GUV=c_ zH0KmiNf{jMb6@y5*H8o%wE%s>C96La1(6831YzF5M}!j^?U|OopYFuk8iI+e1dnKi z0t(EFV6pY^I-KZYAnt^D+3Tq!~+BpcZT}?yuV(Y*=fwC8Z`=Duu21(@h>7m_C*kAtgIk07A)iqv?jm*&a|7Ho^{)>E?8kf6cOe8 zsw+dthG^P%>C$<3^VW5^(C88(R9cgX4KyIt5j+fByOK6J=5}SenvAO1GJIa<~ zF{|Nz_wu{n?aqz&3s`~ABKct=p>PW*2_Y&>Y;V`xy?b!mJ(xuQCe`elkZez7`JH`$ z0vKrhsKp(jK3x_NvTF_X8G<)HgONBvwW$uCWq|q+3 zn(=@1`#2SRMp_frK12422ugE~64I9!^8pAStfo*RV>cnZynEBfZO0F>SuHzJgnY;1dbR2{ z*SFER)&{30y9hi-8V?o?Q^IvkxLgdQ0;Qi!+CvPF>6$1vn;E%`dFGS`{ufR)COxNu(4C3_hP)ZvMtQ8Fh>0 zlr~884fgQd+neidc6uJ@xhZ%1t%t5u8A4SERv^&YbXG)F;!!G{+%_cFuYT&jo10&e z-(fh3qTr!s7Qa6h!Ew|VwMrprix9jFXt9Cn-P+F!wBXy3bJPqL&#_=ENnbXtn$kOK z)r(-EH~D-ta3x7uIZIocM)bY=`e;pYfBwnCe}#qo7pRd+P732KU@{69)uwjRihwRX zVZCHR47Bq%3Mj3JKqe<8?YrPyWde$zqZ>*B!R#&z_YmK)SlpDD4Vkbkb}&bTVEo3+ zc$Rl*z*d2~PmVe2eOggF29gYQ74R>Mq)GuGJQLzW!G^9?v4A4D3;0$f1Ot%1GR)d-GUT!h#&P2ptjtodkc;4@6X?NFJ7B>?|%7$JAeJM z8yP~i2e&D<2ra4#3Z!aIi~e#n{)i*}PVHxy)LXwac}t!i>N9 z`YauGu2$^G)=b2=e>-ySa!;2DYDbV~N+9U~1pff^`BgyV-0YFK@V*$0YTk5LG0%z% z)mw)Q*h4!Fn4}2=m_z>_rqp`%9LLiF@fggu3xxC`-JV>r4` znZI`_wqd~XYaJF;xak&V=iK9m_v9T|GcIP!29+SmSkZ7A9xl7_@jllFlY{IJhLyWB zxr*YZ8*coaC+ZeexPt#6_;E#g;_)G1bg8b6FfZJ~$L>u*oG_q}`8y>fFH zKd>{f##i`1?V76HVu?D`xn};;N$*p|gx0KBGZX|e5xRc(E;6UIG$l7q6JIUQODK}_ zApnMSo^=g2$IY@9g?cUYcW-0rnoZVkC!VWxZ2&9fF@-AV|E~>?-+0nWj0a9;1aOHgXEGSr7H`;xdpr=P1!wID7GGB0IV+{9;3 z-#yV}a4)eMK@hWc8Z}Kljy41tiR|;t?kM&d*O6pcxku{rGN1$ZrSZO&XA!35+Yms2lpPi)%RR-!w{q)I?pOh-Nce2_^eui(&-8B z^Fk!Kuf=`5g(Jzyq&0#UFkc#_%$U3)g!Q`)f&W`=M*XiJ8~!a(&8Fih1igjnCA!uH z@4RzOc_AP1wcn{I{)h2%H-0)pWM}HnGbxaem-J-u$=!bj#`E{7WhE6CB!X>fsR|yA zYWL1QYmSy$ORBXh2SDtGv30nnD0m1cFpLug0t;Ib{;c~{2&70SUG%yS0tD7g^KmWv z$T&qX(uGJeWUfgSd$m%6x||sALd-#6!JgkI_oa~HJ#;_s+raa^jTRH{++T9*Rpb$| zRFK!q6K$LG35a$7P@fwb9B_RVxWBMVqD&r0Ai`0kVbRqAaJcud>YmK5xUs&fTieiz z*|abdkwI%y7%uljfSj+o-}uA>x3;|MYFnuC4cA?v$dW|On=j+%iyQf zBGMKPWX!F}cKh1rEsmyhJA9vq49NT1hkyWS>{lKI;~0QQL6v1NU%IiFKub3i-D=XB#zy*Yf%elNBZbsCf#*g6MVYO%c$m$J> z#`DL?Js?bc>ucVFmwJPxc4lUUsR@jofpe+HlkxxHj$`9Pu#gb1VoU=F4iOH%gogK;9uagADCT3T2I0bWmn z@R?`fyOlsIV z)Vrm^7|o-V1lvgnVJr=h6u-I!QL@SASC{WL37Xq5qir$q*}~%5`!BZJcRt6nW(^YD z;t9OuZ-ubW9OrN8dDOeGFU}>hE#M7{JZ)T|GCU>;fs}O4qRvyBksU)c^ z34E|1gJ7GrF9G<$DOMihV9JqgvI=kmP)K#O&4TnSvORvZ7Kq_2x>VNCh*t$Bgcw7M zad6fRn?uL?0ZKqyha_G*)p;7YA#yD@hpoif=AG!fM5QN}unfC$O$?cVKQ%5Glgx!p z?|AIeSBPiJh^bdSPr0$(2j^lhqY@2loW^4BUZ zkOY{u?kxKPKs7r`k4eJwaW<@%%2NTIjH9|^Nq1tQb7auNARQH(n} z+|T6(KU=%b%Bc;dX@n>t-e1&wAgur ze7|gIg}W6Bwz2OJ0XjAqtji1DvoI`psT{l17{ou1BG|#D+t=2XHJL+7xWy^458#b{ zGE_r@riQr|c8Pm^&y^bv4?PpIvhqwOiCku-ns|{DJXIIwSk2L>Qg8?-&R@-r{#Vd$ zF~M-*cfy`0bRNly$DSoHI-)7uy!eL=C#|&2X&!t(&&+>N>lIb9R(m;P7L_RWpPHI7 z_uPNL3=TPmSAn!T3N?m=yQg6&*KA#9uDx}R&NiSldp;SNvLxBZ(xn^Bip((2>-TPq;{Ymdz!hXEI6Pz^_ z49k%ym90-mRiy<)!E>jJK*H#mUv$jfx@gn)P(S(vu@kQLm2&5B(s3*Yy5Gfr?9!(u zbj-HY;Qd+~IGLTq5xy7);Ri8UL{98CZ|?T zxQ+T0hEEV|npX-!bmCGdYD!Px%S0v;Sa|86AUV5!M6ekvP;Ok52)3 zAlp1_XSLbAwaVC7NH&~$HdcFoN3h{y%-uEE=a^Fi&&{-Z6O}UNmPh@ zuf~W4$?2IHW?gZf*|Me9Tn*#6dq=(5wWZQryR#AN9>^Vqv^r;f>Vj4oko^$g=zI1Z zHsfO`XeJPaE$Znd2(ZFFr4jEw!Gk@e`w>|ro%CKtRfrQhw&7V>1QQ6K8-aK8ITGSj zqB_IHkQgMpI1;be`9D%mq%w7F-Z?7ukMx~!UXw$8>i4WYy10)GpA?Q*77(8*EH3Lm z$rH3DzFzYNNgjBE)k#X~@1u7-6<$z~_-BPTdkQg$9iXYWw-X;%Wr=kTYI5{@rsS8d ziY}gGV}yHK11ahOkZ*alh2M^z5?8sIP?Uh_N~1q5s_U1ATo0rjR@ZtO$?Orgls_As7gQ zQ&V4W$~QmUWTefTob*YwEUz%vJnCBW+8!*dPW);5LlQQ($mnmEmr_5>O?|f zNujF9gQWIU4GQx}Gq6ZmD74+QxyC&H#%<=|*EX8!(o~a~GK?HjimBPS)l`&~n2gkE zh=U%fDq!ZV#7IH*)6*&FlhkF}T92AZ)G;p#6M53d87OW(-TQH>$1ZbC8c>24Qjvp9 z$tad^okkT{v>X92a1*{@sMQ%vZEd0qD0~K8&W(#XzJD<(c%{^}*p;YC-KGrTG*I)h zFeDp<4(?(+)~#N+2wX@_zbz$}_Q|C;aBXh!Av@gn;^Okjq5k6^f|C6%9_AE2=rl;; zHOT|+dh8@WB*{i7`n`s_R{mTp$12iEs@pMGCY1T1k&^t9joAwt3au;nNnJo#3`&~@ z+9_jQ$url1iVDK5ffkc?iV&;&!dZry9mz zsEgw9^YgYqmL3a~k0Sgux4=er5ANM(`p{*93Og;XP-2cxR^9aUFs@AWAzF{zQE@&P z4kR*2lpKw2iYY*y<@Y5T)?9wp7vHfu&eS2iEPs<%SmCPC zPjb^P|F6A4viBG-#P<=m{vkpLf2?{|VaJZ;S=Y-pHtvpDW?T5koLD0)cfJdCY#7;h z(Rv%Qv#LQn0ZE)&4mT#JxpHTdzS$A{9tjmW6dX;03st(d-^`uZkedrHvCc>$|Acvy zVZeo*7%r3TG;UOEYVaHsTGJw_W(w^YTH1QeZyz`cPlPBqYZ$52tfJGL{~Y=qWtpq4 z+zLYg#9Yd>BH(ac0y*M9G!*88H;*+z`T6i#Qp`~prrzFRQ2k)F9vFrsr69MN<65dj z9mP;~cD5-+i;K+-`7nINrVx}x*%>?#%9r!Rj#S1RdsbGO*}QeL*>_;S7$gbR@$_O4 zoMHv!9dXJB9^7ZHyY5O;R$c@^JmLBDW-SE#oaip+b|^QXvo`W(z;hPPL$YPSCit{SLhEQydAMZ0gFiL~N<7NW!v3Vw} z++APB2t~t}xu|n0D$FwF>k3U}O_ixHkAYcSujOFn;4G5?FCwwexspm~EAmQ}6(y#t zXV6RnF{pGx>K!>C0QYZcZ8xnQ1E#LF+!P_)=jaN)ePu%=8)7m(_^&n zQE<3!b4NI%75Q3N+}*Kuzv$5y@>o|m&IwVp!pb1bD2sRD9=tnomi{lFLy9~DMa4A- z=ND5xEvOxvFJhR9FK;x=;0~ekc9@~4!q%5Be8Jp)(Z}sVADcWDS*cqEAuCp!G)|tE z9*5O9!*G1DkSj20_+ir8Dma9GPE{dy1(QeU1z0**t z(8wggGxYWLo8wT-+IL7yq|I5ViIor+@<*j5g=X`HI&^9Ucmax5;nJEymyhIlP|S;c znV-nYOfy?Hl$h&w*O=W`G?==&3X_-39EdZK_Bs(kI#viG@d`kg+PI<0Tz%CBbKTW7 zW^-LOT3ry_0<&48f){-#`TpZKQ9{)c9Pv%^=(6HVw9ltM-Wmx zc=$LB*MP{FjSgMQj9^%z1=VX5^)DV5x9R-|wyDXJ@5C74xtIP@fk&$g0e&g+$2cV? zl!m+_8a^(@3l-YUe4`bqdUg6-sb|bW=fFJ3yd4lo-v|Bh`ICb6h-}?9&FkvO^`w%w$k_Cy(ccfr-J?Ao{3H$Qp z;tEl{i69hZ_X)R!`-O*J_+yjD;%YgP=ds-T5zY-OV|4hOj}<~8q0t=r`lKR%M5Tw+ zyW}*aeFAezvV2$6m=sC6;#ON^s>^GI(@Tg>3MQBTNDc|i5%Y61<`BYle>l<$Fazmm z=!qr2E4w;Vj4gsE!c8Q&51%W2TWEQc=YtRG494T8_t=sz{ z+oTPIa7O8OmC>&t&2|Lt{oj!_s$9_q#Zb)m$u1a)ORXjeWAPsQRuGOJi+*>kU%UeJ?7i9D_@J z%X~`upw>bVb%xM|H9l+eF!0Z9jC7Z?h+IuEqB^_aLihLP*;=r=7#n$19OAG{CbE}T;5mBfpnj-8cu;k6s< zO)b2Rlo^sJM~#U!gh3&yRpKyi1WwE>W{Z)@&Q3*}^J2+8r7Vn#H$pZD$JF53Y{xPF zLUe&$S5{=Q;u9uiZWKmhQCeuwV2Vc;7-46J+`K}mT)DZxY^pDo=6wR*usKa-L1M@a z-J>!xK_xV7jy3m~k>N=xVy28^i<1)4WJ_@QaBf@#2wTF^SDwK_K`qK+!g{M5r!`W% zwkrk}uSo87K0G6o0x)MpFL%MQctr2)iGVw6_Dw?0DD?wtcJ?QkxHm}42&kx}{(cxE zc9+%nnX5+s1ld|8^*qEgWXOy8A<9P}tR&3Lv`8z2ame<-eIryq_DFyTpwQtxNeD^K zM=m_)NkzOH3#3rAo1)PqY=qT!bIWnl+SV=5XZ4QcL^fokcWf3RxT@M(Q`67@!-UY{ z9H7)LzhrYV`nTrJ+<0hcG#5qtp`JrZnx(ywi&*}{q$fjs1HzFxHy$NkinfGTXF+0K z>b*n&9PYa6BuxSQPzD27Ybw@3>CeLeN|CDusU+V;o;_THd97nDUFI;15+V6J8FLh9)KU&v>tYr3}ytOmN``zS>ciYpZ51%WYxE#kCNN2#oqFP{@*b(7X}~BIO4O zZt)7NQDLlK>w@&L3yr)D6A6-z^+RkQ?pD{-(EQyR3o#m?6a~@f;pPt0(KC#*+G1U? zAlAdN=V#8Qv7yRTgPJE5{Bny}$;*|kA#_Q6r&z7E5Jl^}0(wJ)Fte*}^b^>=$VM>+ zV#vs0r}|oQF3iUyKWok)$v4gzvi@rdXunKT10ci()JB;F6#EM3!b*+Lq)dT8h6U5n z*<+fHkxB@=S)(dXE%y;O(aA-R(bI5eUX`E+Dtvgl2_&>?jl~d2kt>WbJR*g4v!R~C z@Er;@%%&>9fW}I*MS49KwsNcrZX5Sb-WI-FI@Fbpy%hFy^H;Aw{-J{6x*x8ja{Tr% z;O=FSB!S}M3KZL<{uLhjQF&>kXw$vS^a!+4{Bqx>>Sc*4wMtf3uBs?Qc!zWVWnMuj zWAHCQ4{;XOI`#v!-dlj-V(8AfA>wH%8czsCow>5gl&g2qmqhO2hefbWtvv#bj#&hs zMKj1f(YlsJlaslK(APR}#Gz1=%?E>frf4zcfwTFfs9_OrL3=4l!KTgS2p}Qwuo54d z5JhNpzBL@8|ARhH)Z!|y@MDcHpDAo+?Nusra1{vqH3Eo1{;c@c5OnN+VA%iR(w@<|AHDaGP9Wo=(%QS> zVt-B=*g2!b2P~3Mb(BDt=Qj0Bq6DnrNi6qtO)UBqPXOAF?dPkFrph8YS7h|;W2ApxB#$W zFz&~ufg_+0I@Hu@_8scC?LpX6Ao)+AvT=cA;DxUl|z#RM`{R zMz3ih4T*5ntE2)doC2sYSMv;I#o31e`6kz2NfB>qsMK%)?0`$sFfeR31+?1F_I8E z8G@#IV0gkjwC{lQOp=ccU54nnXsFK4&F1!a58U`@tQne{k8>dbLqr%i{jFudD7-Ff zY8<=AiM^qV(r&E!pqLL+M*r{=OHFxyVNunCtA4S|@PytVo#dt#6<3Wy>HQ^k>(f9I zNmd!>*AR%ygSg+Fn=bm)et+q1)782d8|D!>BgtjhoK8e`QNl~593t-@7wPm?XkfVd z$2p`GK>-wAfmuN9$~=&Hgh8t@P^ksr0`VqD@XGJ?cn~v~o~}-F@JI)`w{o?wp(QQ& z)a%iJKnb80D92pAs}@DB90RD1;Hks`E|6;lmdl3h!uXaAsfCl%LS3kBpa!KV*a0!z z%|FpIBsoaSI3b}fiIdS{=v-|cNls;RWg5j)165LzZ?3s!8wz^~5V2f}*0^e|oaSpr z$7akykjwV>4VgLgWRD@trz{wX&=bju_ZNNT?RUbiphT#=CyOvd5_Ywb0iB-al=x91 z-q66i=fhPPX^2~ihQkO#NItCF7*^H#z7y|9ktH8{VYjiJO!Oh4By=9S7}JcilX?8x z1x0nAIME~GzY8Vc4bmw*4PbG22rthkm*ZTB9==>f_@%flQ6x6cVmAg&@|JNpsA$5~ zp+?WC#9ZQA3^RG@BqzZ?)Y@1W`L z9RPxk+bkPIpd#SQ2$5>ctgovyjdi6a2ko5btuV(S3L`)pD20pgsR%R3XhJ=g+D9+4r`ZqP8ojpTEv>z z2HOt7`h?Ewa}rQRq>4n8ktj_KbwyXxGFt&c5W|gn7T4M$4Q&b#D$?$)dRCFA)GYCQ zD(QiNVRO$t`@t`VaGmw0G@QhJG%rIU)tsCxvvbE*upOXaSB6664ZIw|6xP_u%9eVA zB(Tn73FaQTy-fPs+Nl$P8kRmviXc-`AP0(ZZdGV-!_{_Vo5&B%;nBcpU3sP1h&rmA zYzqXj_dpH4%iS1|%#NZ@(or)w3MLAAoxGPYhFbV))jKawkBOiYD@sJwIObK$qFBmr-bPVw1540sxu-oM0Z z^oYJHqlxO61(mfq4kUTdC5B&dueTgm@JONh(+1EzQGInoTPbz zlmHF_A~>GJ8e+?Ekc!$K)=g0crvqxBqGC9bp+YwgXG9VnJIPrk<{jwa5Wv9@V>*g{ zuiCZ4lz{d~T5v%52LJ*)R>!v9b?ja(wamts~K9+NI;0FQ(*nA>+ZUPHt zA*7Ji&Ix0+!kM`Wr*VU!6K*sl(?wwxnVFPgF*1}{NB4-?cen@eX0&XubUTtavcD^D z-MlHv&orCXuQLtRr6vOgjmCh=T|6k!d{NjkZ%R@DBMl%~3&aDXf`!2plpWL|YJyG` z)SyO&p+chUY@Lrir=B~xa8ebvTwA8fO8-ZUDH(#IK0kpVg3v|fu!uNce? zjrHZG1Q77~2$OagE@D0d-DD?HlyJ3o62_;@%*EGf$6pvB)`ST|BV?Oc1e-j5&H3;n z00#M!MqF7I)K{VhhPiVQp>Ki6mkR~gs)Nsh1FP`566hm$p1dg<=AvQKCm?M1qWdy* zXjvz$SHyi)Y8nU??}Q5m`CY?|&chOXq{xwx3O;{&T|F;{t;Z@*hwq@9@5*D=MTE+P zAF1E6$Ejz8V^d=P2$E*saBs!8;>2Hg59tg9S6E#4Q78g{9KtZ0K9@?TBQK^6P4E>6 zjF7z8?t6;fhK8(y(+YomiPYn`6pnSt+)$8eV6D;@8F3#+mKqvt?&E5D$fC{t*rP~4 zeEEsW!%9A_&`iu_n%4Fqp~;b?dqNmUcc-ySL+8DkD%2jWuZCwtWE~VRSiEH=D;6Tz zfT)4g^SNttlQnue`e01LP#_9Xx9RC3Oa92|15kuLIy`&yp|f6&@WtsElvq}kHjNS$ zbb4Bb+0;;NDgkcLaYg_U?sPmJ@cE-HY{xNVW=syeA%s84Jx59>QTqDKIXT-5W-y?{ zzv<0rEtM#3dv7E;gnb%!9P|k?bPpRDnre(dMoMm}!p<*wE#? zJYL@qc}MIs<;tkVAlY}vy-V(03?TjTR;eM4zL%#mW;d%q+;WESJ^--uB{YcqyXf8Z zzn`82yg@oWd4+qY#NUb+^FJjdVqaFiWT6s@Dvjtx+=?&}I+{2Ps=LITf_{G?k9A{8 zR;zAI>eWSCSBNr@ZK$=Ofwjuo<;bY8)UUB?Z0k*m9L3`TM4N^IEDt?>qhgG@dPgMu zBpwfURH2JOVW==KKgVoD+XtfS7STL#4!IQWBkOSq54lHPG^!dS(KJy*rQWWyGeRB; zr7nGXA|K}khO6Xd>>Y=Q!?aLUb8&9GlE;d8jP80eChk+BZt z0F1HZ+;0DH9?>zo(Yjmj02c`lLrUsTfn0nua?MH1!3lf$KTaY6Z;;OL5dlFWVP3Dn z%lTV@*kXk{kN9#bV*ZZTa_NKXYIv5vD8a$eReIuH7vfkd&rt1#Z4#m*bC1w+<8#MS z=^+vB!ZSAC=31vqo+a7iNfOb)eS1vHu_MSkp*U5DOQ|xfmtq5F^K(;Z5x&mU!ILN` z1ZvENR0v35$5=8qxK*_x^0@lPJ(DJR)>v3I#!#BHY7lfDLyB`Kj3pXR6{7njdkD+j zS!JQXv0wrZJx96$)@$T7SRgB{A?!yK?W~Zcs`oZ$D$s~;{g!&5?h4K9jIvHR^)6vj z@#^Ace00Jb0}Fan({TycQC10bOuHPpp`5eP$$%gnu&uLTwY7|`V(B+!c zn9;zo4v9?qmWB&kPxKrteLqhATqU=uSpLmh`s{{d)_daK<>khQXXp@sJZ~v1su(^) zb>a`R67UA;EFOiTlInhhk6wiLbw8TjNIeUYKu+-{Qtq6^h0gn-4s@X*n>bNdL{>rB zx#B+u<_JSa%MCK3FqifCmh%E5=Mi*WT#V46<~GySH;h^ww!6^6TLpRSXaeq|hHl4G(I4=5TK# zOby917LOw`C1Gk{Ud>VmEda!!ED#Y?9gGr@bP1pf<`>DBAdqap)`b-vf2XZ8mDQU- zC$xT<9$kqZcY9Z_IefH5jj;Vlfh=l|$W^DH8t0j6f}X~~ZBsT9tqXHuRRMjIVky~4 zUg7z4z@Ml`6S24}L;+6sVPEbUI>~c&N|y+|Fh%z*b=foq66-{(npfo();x4dr}aCX zPy*f{o#g{kR9xPIxAa9&)a}eKNC+Vat?9}2#auQ9ah6wK-NQAUqc1a8uM)Ll7!AsK z1}pN#dGrFZFmLXop&M62qQC^#V!-v#arG=N9UUFM2tBpq1f(n?c zk~v$?NsN*GUA+t2Wj4aputfSvo`im{VK)IaI3NZMff#v0sG;VO_Yr1vup@A693z1o z9IuRBiiZj8$TAg`)n@DFMpKl_UQ;x18VYkcHG#bYJTWjZWRAc~>gn&XVKM@4a4-42 zg(o{8f*K4Ba5-D!eh>Xnoel963Tm){H_CoV3kkOk!$Nq*(bH zeEvcs8a|Uz!x~;gJ?q3)7%Oe#v#%ft{_Bjgdp~T6!!Vxnw-pxG+_AcE;@Ul1B8%kO zmBU%h91zb31_#<-1!eF}tmmQig4dNQ-oEJiYV*I0VwEI0Aiwk~Y<_^=l$^(Q$rR-# ziajFUNSH~J`1BU+>>^{)aFjutiCOa?iB!A#U=(5eU`V2#i)+Ea^E9rnHTCs%CNB?R zD%KtmT_uJ_lk%LU=8~9yVknBCCpEwlm|-VaF)A9OllvnIm2JlfhGW}yLVcH8$7y&f z_^=lgpw%hTCY`6D;la4%8rVjLa_gaJ;Ev%#8btab_O)b*fS~#m6hg&VSXf{h8tP4D zMJd?MhxI9n05bSD+0Q2@roi0L0m9Xz<`LIiVKNx{lN^>B6Mgp7{OBDg*dPc1%J(6& zg5DoZ{6}(ba%-bzO!sr!oSBQOY*lXpD)}qyvB*QC4QUi*x5{B!eHDseGl}# zVD2dj_ttP@d(tA-u?tX&FTT^H63HKp^YeRuwVFvS>&d#Pj*C!jgK=QMXF^)1Af}q*WAXNlDe$ z5pVu5lf%lJMrGmP&L_IiiT6`P(Moag(?6CknR0L8hpix7ULYal#G+NK$`=r(n@4+V zTt8=F%%tPTU>jk>YFCswT53dK2j(22!%a5qK8HHYlP0`K(8~)`Y3ujYziofi*`?8(CP^xb;Z6<%wMsW z5RYa14d$^JMiid75a}naFdR}1bD6b#c0y)LCT+oCC`qb3Q@D4f#o6ZJ*Ix^?U3$O{ zpaY=ir@##|i%(4e+;He2Gd|RzkZE$)(SwTA&z$<>zZ_`gRJVm!Iep;Hsb1ssK|jll z#cd1OQXE5xdds+1L%3&e1)A>Dr!G6c=c!7-hwM&OQm42dl;i(_LafB@uRO&=&dY9G z@i|2#U0iJlhDt6r({CmQht2%dkjcuJGr0vNW-4Q&gpa6XnNv^8iJ9?vRJP0mcFpdm zP}BtAxs2nYQ?bFF-ie3 z&ObOdW$u0Gh#46jkw8-_X=ogBfUA7Y0b|O}&M+Gqt4(!Psmab@h?GT;`Vr(K*c&tu zL{yd{yQEi;7$F*`FnlU-a=V(JMZ$z^8`55hStJyx#(|;~CIiZa+XDk)XNND?@tnC9 z8fO=>b2nL;&~3ns;W!v!N<)KCFvphlAXPlf#79HDNMmxr7Q1<4nW?NQG|kP^0DWlQ zNZ1o_2#bR$t66MsZRs<6_O^m8Jl_xYnEy=csasU%JvgiLH)KM0S6sHUYf{0=(15`}+wtSeU4 z%6mzuNOW9Q*39|L4w%^30h88$r%4&S!_3bDRxE~xbwG^JrI>V~ia`zs$IMPon2~`V zliGK;$(*>~q|LTLxuWhR;EW4_90`eQflymcG@FoiwKx(+qS>H<0DxksuhTqq|9!|E z0sUpiYJ+0BTICFg0z@%v3?!s2$BvnSL9&1={8`}mlE7C4n!6wJw(baE`G$uhYa3USXA?cRaP1P zbP)-7gLDoa2Qd7OgI?%mc;SB+rinGk&wL3DQAB@oIN1Pj@7{x^yPKd8)?+zU} zSB>F7_xzo3zW|N5%ssaY1j^*Bu8}YnZExXT_E=FM1TfGmvHz1C5q_8x ziRU+%v_){o&L1<=V|Y<}@5a7mSX3jwGMfTrwrFNR`k6*=VXW1}N4rcOLVPhWQK#gh zjX_R@f&ma}QnhTE21HqE{>yncG8T-D^&Lv#uj(x*B!&U$?;i$i`MBxs9RjKk`4_5P z>)A=1kB$W_Wjr$tJ%e&gepVJ5_YIiAz7g=gb(#7NfJbktFxmNK$hDv|t$;Rc9?qf) z9g5EJ4Y~w2Jvw?2$|IqR18s`|qXc;=Z=nPC>-JztLA$Tw56rQ6ec}NF-i>-Smk(6W z*tMl_=W&1lzM8C&nm3c^N;uNrZ4SfGHXmy@gEY4I6zAk2M44_za6y4{%YAj{(I=9B zwYK$`V@HpneyQ4&tph-V-mlCd{I~{l3gcIEDc^HHd1h=Vli$cQWdRXZMtUvIMS0!> zb`FuBjw86|_PN(*)m3EFm+M;Cn zi~kqTo$nI4>?i}t7xBK0p(gBaV3<6BA@aPOt6#lAI#-g#d0~{=hK72cYv!hZfIqJl z#f1ld4%P2*QL0QrtD%s37_>WJ(IP2c*zuGJ?*(iVsu!WJVeulE3WN;;334$~bJ|)Q z#$ryg^~ggoOcgm+sBfqwkR0cJ%v(rqN1P3%^^YSYmzuK~LzqMR>}HcS`T+KYH6xz9;{hwy6F zMA?~IrAwPhkJ9y2jry=e|M7fkS3|i-c##H+#H2VsWySl?DBSSK7&^f=o4xn#MORqV zVL`jcaSt7uF+VTU43Eal#H6-~V9rc$f;A~P_w4kjIdtH#*#Q({RduzQ!rx@4(C13q zqR;@l`SKa$v|e^;ms&=j43MkE#6TAg>ewd~g@#0_5LwLer#m zUjhz^UYB`GF2ZoGxPU)YR?Z2e4CdyPxHT1M9z-)fh^Oom1x4j6p^DC-23dQj_6F%3 z-}A!4vW}s_Hh4gij50d#8E4NNec{|{kVE2%cY!Y@6{uywb}LN2)Eb=N zikKX7nj9A&0Lp;tyHq09B!RD9kc0R-1_DXm<0Xy>95@p%F|L_WZ&FH2O?vKjlivGH zlRAu63kV6t*TK`su0nWh(o8^^#h|S+atchmVw0IGxE@F{G76Ai4k0~JWYbE-Dc%x+ z4OBWh770y>r$T@M6f5@;MTF5?#NXuDsA)RZ0(ORWWoD4otirdQjARuIv<1<1#YLsT zU6hchPzxdGKQd$Pzv~aC<9Inh0ClDw9b~h!0mp_ij>$PK9GW#jLfhl~OAcsWlp zE8dTP%rErDDDjCtcYk?@7z7Fr_2@D@OMh7YuSw%|{Ss~9Z zH{@Owmts|tMvoF22(k6`9sTVRZ03`>coU9s5eFo7NvNTmgz~9p|&}QOD3y4(P08oHO<`OodSl!&I1m{gA&~=1)=VZg6k`+hv zU_?StHiSNRwzivz;Stl--f609Dotf=oypG15D!O=AZ*>MplDFx2EI7kHNBX>Ls|@#X)KVe0q=sC1mn6t3i!!mScC_3W|3@tJ zKAZ=TQg9;w%Q=^TH%RAP#Cib$9l8exyPu1v{u@vfPXj2|Do>}NZOoc4iL3ybOqE~k z3+Y~T`^pD~i+l3LvUDsFg`Y@aC1x#rOP(nV)8Kq?d z>Wu=hwG5=Ex!h_gI$xCtx+?GoBdPiOAU9VA*^6fKQNUT(I@C(;bpRQ03s3if6m z4a#O_YR2?{ZDM$67)EXgN`Bl_R#uqe;zEIpi)&(KE>gDf8z=vzkBH`Kf}ECB!l9`Z zQ3NyM@lgPZ9!r_nZ=eWAL5tMa+lNqPH@uk+GdhU-19TyCSM&tsQ3&LuBclCD2bv@| zCl~X`G9xg$DXf7KY1%~zuY&~ynH!p$kDH^%T1|O%4W`U4x^D5K#wBDVaAw6C_k?Fn zy>gw8hPu>aq|tJBK@GF}J2cbW=71db@n5o^m>D%%coub$r3-?SZPWYiu5ITp^9mO| z?&(+pc94CfX(sL0$Kb`@3dC%r&G6Evz;9W733!9F`Z8Vdj9>^K8XW9;30#J60=M=Q zd1-AzpT7&(f$@8*Q5npOel$7mh-MN)C(BXdyNdImUkq1(K*8~iOF>x8Om>^8-ZqmF zy8~-}B)VlqOHVDsjOJbs&>WZ=gpd=!h6S#?8CO@svp6|s7KXb`Rth*JBc2QS))q}J zybrb_M zQHj#Z-6~pPQJ@A~KD7{4!fuY_l9L3#F2I(w+YN$!hf1;4WvnqKe;t|P-TtUZ0l;4>T&n1;zt&MyA7@DI;0Op0v6twvUq33)ZUdS25>yR^=W4#JO zVYx)jWx$V9niw7lS=3qF> zpt)Qd@<$ygh8;)v4|%DC`Wp3Q_>-O%L)eXVH~=be1&^P37d4AmgH#r$GOT2cCWBGa zQw!$M{w9R5I?!3R++4S--jvpDksJ+kE9xLo32L%kR6ArgH?OSEG0ZzvC=?QB7(^Gb zzW_@j!784SfP*;mb{4TWGm`=s_c3#D|6Um2KD3lj4>JREVh)ZdOgnJBWwMaqPomF} zot+NjoN3y5MM=-m0Mjss`?0~_(C~z!^!oZiv6Kr*u-_CYZ0Q7js-T5L3?}ytMJFT)hSrGykY1{pfRbcQkFK`o#{13q z7zc*VI^IeV;|0_$y@#xto#@64X()jD>m2bY3^yVyJOiyFRm0n~xNWJChq zAYGux0YC?!@4BD8xH$V2D3@os2#O0634M+j9ztV2^vQ#S)Z#^B(nnVLEZW{3gM@vJk|=*n7IRRIH{jOS9H!Ucdc29bQ7 z3yKAgk=@53BgLFaC=q#_@ln&>*=yQhjJn#pQELUGk35+ca3%)%oJZ$8LjEnOeLEk@ zthl5EA;)UeT%kV_jO5T@ziCI!5yho&X}d@ePm8x;9{UWMz55QB8?M_0gG3lSzo6B1 zAO~JVO{m_b2+=48!~5k7iWmqQW?jz6CwSKEej)3Hey?)Ty)V?UiHs);58>H*O<_^( zUBNx{zg#d0c!PAoL@z)G=9FFlCG$!A{3%zqx|Y`Xx-z~w^@%MKJJRH?^2|}`hZHtp zI|mve8XQeDOCCZFrgBuyGeuCTw<1V5<^`r;Y(_fF^l+ESnmq=EjL;km&&+t-OhMVD z7Oq1JJY%xr!^j~unT5U{GrPFaWaO3#tMx((JPTP_6CmM|Mz#=96qG)02`f}FS}~yY zX3X){idAuk%*-05|nen zdpmTv&GdC0$KOP^!HX0_z&w#P9BL))`P_LU4=3c20b^7EV_b*6Pn+Nsm6qfSs6jyH zu$ddy*O^*)cg#yo11yosqEI_x?ZK1|z{CQ=dR;I|M@>OdnJLN#$VCd7LpXz)T24fb zt$5dVViL}?&rf7@B165)y3lcwQh5cY(L&1=6>>j$7 zprJzq;gpW$kO=4r7dY7RE!@MuC@8KOh|a_Reqklx4bp{`zg)ezxPou-n+N(^@p3G_ z6K_ryWBydibI8<7H9U9%kp-l%zro|x5fTl=2JExpEY7ILwY?hy& zZFXI?-DKqzBew-021r<`D+x$wtgkS2<+-N0wcPC6*KFEAmoqnub+GgeQZIua$E~e) zDh!p0p%=ct6x0LFng{NE$TS^oHQP5;Nd0HEsut z+WtLzOzV*&@Y*mAlE8{L%G8%b?1`QXbh!LVFG0q|eANOxk_A%$k7&b&IjW7TMABN2?XE#Xpbrn99~!6#bB2BR*fxXDSQHT#v~mal5g|~7^AtvS%UTjG^mfc1 zWQ>pyHg_sPe~^Dj{c1Pf9=2>`=i7nRiD;r5@4Ndn#= zT|{@IxTNmy`};fgApQJtanoB|5k^qafrxFVqmG(&6LP%YbWo=*>X$(ZFt<6N69l$Ccs6Pos ziV4BLOo%A(A&y*Dd0Cmca_3I8xj+|JBI1Jk2W5kmejMC-b#=9-sHo8NHddGehXJKV z-ev*?vfP=TkSH$+TRQZe``g+l?f}<|9?AUFG^l&pOh@-HWRNS&;{ve5E>a&XXLA)_ z91OgosbTZWU;hrZM8jqTbx*UiY#_*bDtffxh+W>u86OEHS*|rgzxjJ!LB6S~uQgk@ z)SANL3X=uyJ``9>5fTlC7)5Jv(lFi~*IZ@p0{LqH5McSv5Q%rAhLb2h8o)zGkD8XY zc2l~p5Tv?X;4n7{nTo7ol5l^>9zvs_qzNv(wmfz+&F1=|(aYf0L_AdWpfoon%PcMc zlF*87pK!5|aF=D#75%7@a#r1r&(4>NHd(~!Jb=zgd0$aU!#`a_ue~2iL;~I*U1W~~ zn*4olXrTQFUhJ>o726e)me&kDX=q0P4nf|6d8KFX=aVjRe{fbbI_$&;B`BnQIzp%l{!Oe`C5qIHh}m)#(CMGGit z%dLh>)Pf7k$jVf`JpB-%hQCN(gPps(d%)1$Bt|2Jv^H|6-B-770uf0qa53DCrtoBU3i- zL5~2d`)L%`PWKL)IWQ+o05UH57^kG|JgKj>jtpTxz^jiRYZFAHkhu{gOv0V=@s;0Kgw6%Ab zu?aA6@Sa%NNZyRf8{=t59_vU`EAnvFrlz8hzL*+lSv1)2ojhyw7_E1Gf_KIBVp?$* z>+sqjw0JWb+I8J#mw$F;=)p4{?eOZJdv4QEZ1Qu@V-+|d^XSBB-ds@J@a+>!!+&*w zCEyLx1-=2xUB0lm`k|r0&L`m=`|N_5eYScUVTym{A-ib(N_&LiDGm22b2WMBV%Zg- z3sS{2kG}zO#*1!i+_}P>v2Fpwg#u21@`|BJU;Z^PNDS+-`zk>VRGOr8q4#2w>7wd2 zw;;d^I}FWvEtvL>4lr3aV-*YDJgYpNqE%WKRrKY6WN+Hk2r|`NuuKq9r^+?@af+J9 zWuZ=~raH?M6c(8L!hCZaO1`_J3k9S@0x=hZDP!U4-=4+lclAv9y&9)^gq9}8Cjf&E zucpPPGA;RtkrD$oYo@VpI=mw7avR!><mjfiE zd~92Il`sw>LeKFKaGZIJB=wT1L+FWtvPE%D|ZgO%ng_DoUO%QA}nWDSG;17qbKm`jG=XX&rQ@@PN zPIE}oszQEo$E(K|7$bX_gzzXU7?OB;T#ROILyg&e?Nw&?)mNDH>#Jq#ZXW90D37=z z7AYWQx#lhRI}X`T&tUc_hL&cA^jc)- z)_W90r!&0a^QYeKQn>ob-{8>l2kk(DgD9otLxOTI5&#o=P_WRk?}sdUg7e9P^jo|i zHx+qfbn;ts5$xeTq>JDttTcqe!gb`*x@B;n?KcaHb03D+QO9_=((v2Rip|G33V&HW z+HJa@0s`pOF#I<+uS@}4kyC-O#Q;B&xDLDn0uf+z7($BWo3y+-Q=E=kBj$%-xWo$* zrG@i=pw)%f95~pu30P@fT*-1(oB}3>rejBtqiHomfNN)<(H@idfl06meRg)nlp(CN zX;YP{uPFiyyMbYIN{Nx8hX4@D<_#6-eNJLk!OpO;rPWGojuI6cWMy$;=dT4eQkiAlkB8uv&D1^Ff#|DssVm zy3u#(i0SF*mVA%Enr-`vz&Ke$zh*rPCX(N1+2mI@&DQuffPm#iN-l9+LDlIwiZ!YORfY! zm~1reYp4fTUtP6%V9x>ciV7j?ZYTsVOwUXKk=J5cj~*0*l<=X~P2+0soAa1BqUdv_ zc}d;o?zwASak6d8J*Q`Sz9hp4aB2LLcxc~NR8*xa2>-bxB;XCwC2^ai*&kY1bUqC# z_N^dB1vK0gY1mCy-AWv(;SLQBIe4x{+_jFwCaGmVi7iP8N84VwV^tt7G$`v9u&0kB0;X$kUMRRAE= zm=e?zWo4l;pWH$kPIon~`gxCB;$N?uz;Ga*828g05cg%+j%_wJHr4@3zgNd9@>I}< z+;@iX@Y9J#h=&g~nTI`c0$D>Hw+&D-W-ED_P|nHERrFbN&tLdlh0o-2+m?Gy&-{Gh zyO7eekec?c!s5Dr4F>Lixnv~Z4bmlZt7w!esZKsT+~0gRUfqvCTkKYFf_?%uC?Ej! zWVFyw!x_}l$~0{iQ)KSS^1zd5Za~XbLzONLKyWRh=|TgTC_-7k2c|$AGOJ(}1*JI( zHn%;7{yfK7Gcyim2IP}8NT&570;LuOzhFvH4BCi7*iwKJ=(Q!!mnu_@-O>*k1VoLB zN2rQfkZjCL!Q(5;&q5oEYLlIp2g6h-J(GHS`Tz((`v(FaQRz9B=BPYsO3TbuIeHi0gVT^u$qFd&_yLctw zK@Au0y;*T&1tkr)13d5;D51~bO+-&Uh0ltSurI$fRkL9f(LwfXuJyHsS3*F9W5jko zg{omaN|Wf$Jn44%o(XW~o~#Gq&{uktuBH{H&P2SW5VFdXxtRMO++*6h1`J3Aq&`OJ zYiKMq{~}OgTw~+r^`@?-2F>W$Jr;QmH!jXmj9g?M)+btizC548h1DoC#HF2fE75uN zsw=meYp=i3Y}>gRh`vG~-heb@8*|FQdZMf+qW2_n!50Xl2F6#t&WJ~06+8FO$jUU8 zfNyW#z0+KM&2F=O>jqO;n2oVuKFq_(oN0u)Xi$Z%ALorZxrezecaL1SF7R?;nDRj{ zRM!CJhC0wI@!1fjg7A@&7UCEe0S%p)jc^{)X2p&z@%gh$Bl`@w4$IN!NM{ngLLuVqh&`}R9rn=P*VRow0(F9+8P|ymz^tRRVd6ku)c^&j-fS2z0Znz z@fMIDAS(gm{M?Uu4W%K{kQluO+a*E%<=>(nMN!fRVrYoK0yTyL2oRuw=Cf#ow7-y! zMHwTMXq3u!dTPQvbpHV}1VU5?>vo|qBEXzpXU^t^YpxOgI_GUkYi*pF;0%WdbMshf zzA_$yhh3}q1gS!)ay!OFw(o1M-DRHm)W;&vM2LB|cphZdUj75Q2|y$a54!yb6_=VK z6u0i!y~{l1$&WNw?b;-sSO~h%fTP?G7-ceDxHjKR^f{EGyB{>tWaNn6BS8rwl<3&v z<$MT%7J++k*Y@q;t7FL2j^Dz>g_WIm3t`Lw+=GYq?l*Ij!`6jTFWQYo7Zc1?@mWzq zR^D@Mor2UcbjCKo#Pp6jzi!^K=8y;lu6vQ*$? z&lMXY^4ih4EjQob`2$rJ>7gX#YQu*Z%l8*jGar>-y79dU!uNk%vJ&tH>5{#5;lK-v zD!Nl*>CZzo3&9S(bb&O{t_n=n?l$%>irLnpNRpp*EK*Y5}pw%81$FsIm3BsZy_FVGp8NX_N@k0CG+KR+OMKYMLu! zBRUu*7{LlKV(++Oo4NMdD}jdF02T;^WG8+ks23<GiRw}hPJ!Wu?XS|~lI6O9-I$-6i)*|Ce}=XRW142_P1^g| zAquINWrEZp(KrfwH@5enFVo(=2S9s7V^5D+y%04n)_A?OkP8n_bhz-5m-9iWYY%4#g!n#ogT< ziWG`lad#;0P_(#9ad&qo5XeLCzwmy2laI;Dy4GaQ%$z-Y_FyrK|HMK~HZ{USLf4|A z9v#SFC|ET!2NqIogpr@Bj{jB^VVNrk)P}diN7Z_UeHF40$>^U5exML_yS5TQK>oBd z{1GqmBFtoJgt2y5Fm_hB-bIKz?P9n3bg)z|cMH{)i4QQ8Z;4;IP-~N>s!dJW8bac! zNi-=hzg28s$+_B6Bi-&)e2I)=R^_a^6?)JyOkIbL4)=iFcy~f4)&>dn_-zhD@zYLRV6pHuTQor6(U$; zVtJpTOV(%*vfUj#fkQoIFKRxZy9y*&S`ECexf)Lq3nsa+j4F&F{7@>Q*E@A-3rxJ+ zwO1KL9tR;JNedHfw*|H-80d?{{CJ-``#nw`9$at&3mUiwN>>DFiCdFv4#-j!Fxqig z*d7hh=2qeChvXqKmv%IHCa&O35Qd&DplHS~KnID{9-8V$hk7tYXDzx6^V`v(y8BAg zVR=Y%qfw)1Yn@M0uy^;6f6>4%K8QTeRIZUYAwA7!H>1f3O>|j-QetCO^s5lVp920Y zQ4o(IL}!Q+2|4G=V~H*?_(m^VF4>Enh8f7gX+i`Hg06-ENcJCl*|%bJ+fp-GxYXAx zvSS4uTXW$=3{=@*sTZFvSskqt9fMRBNC-4wz8Zu}X$+kSb0A)SWj5;BXzAf>5=iVi zI$^AV`oz36vx{Q7n3dhcU=ok7;M`h1(ij5k=;ES^-X@5VA)t!Ud9}RdSx=AM6Y8*N z5g`BA@J=)g#nS3f=5KRo=+fA7het)!=dmsvd{Xg}bnKr}1WC?!1*%+8>lt*vXF>1v zDI*?ucymMTcbPzF5kP-$LuwoLL6Ds(^m-i1%t6>w`x#a8bH?6cx5hRWT7EdiR4{I2 zWbY$5VYBUblg66^)?}271(DcOdw-5@*v8 zZ9}cNopJVSwmClPVAR%_ZJKmKSB5Oa$-WeH2XY5L9GnL4lp{gX>7b$3hwYgmaY1>a zN$oA-Y!TXn7(Jh0IOJqD_ev8CyrcMNoA=H|HKplHuolDK9(&Xwbxz0z)yQ%iTSn;f z9XZXY0W?eyVMM2imA8soxKu!%{HQp6f;SzBAYy;K!|_gVQJ$DdD*v3@_+3!3USGsE zNPJlr>IY{mN7wX=u0!|Ui`16*Q%C4+{C6BlxnP66y0kGE9|shU7t+C-w2s~r;1-=* z1naD)Co^#DL($mN1yv>c56$Dt;1)M3yz$4p&lbh!A@rUtD`76d;?9E-^@7a}74*PN zEtm6;^emF+-z(g&zY-1Z)bT*G)|y-lA=o?_H}ElJJxn^d9u2drlbw?Q);eGyWN zA=uFsyG}|N!Ad8Q9l>qui0X8t)WMP?3j^X2&v**2|RV#P~lg@_HL;`@e@ z85TB#ot9_x9j!60th_v>OX}7Y4Nz_}n}6(0ldqI52hY6Q5RHIykoYY%v;4jG3oYDMb@ppknb!KDi_H<80Q&sX#Pe&wuY z0$Flb>f-Q(zj-!`MwDjzq-)&zEQ-BGe7SmKVb4#QdlnWGVTzg4gD~iLO}<9-@|oaW z<=N?t9WUE(Ymp5bi=Gme!2zFP2EvHdlh@`_r)3(%C9H(uNBVh)M6a1s{6`zq*gsO%zS z(^G!sYq$s>L=PkYF0>dN%GcY^B)8k2oGQ81VK`%nu$zBb!7@t7yH*g3wYzxeyAQRQ zf-Xsa=T%E&E5Sy7UQDinHQxx`;}xexz8@#eQCQ7t?_I(&r!A50z=lUJgDuHJKtymF zC`*(`ye&)6>^y}6kQmGs&Tqld^V6+TeAWj7OLA7l0$yG+7;a!@LF-fJk(ecuy4VDzUu%Fr8JcR< zh;tPooKT6JLJ}B7yJV9}3T6|RcJdr%5-H_!G?Q)@KUonj|NIl)wGCcqP_R77$BJA~ zxM}n>>S@z%*}3Y}Fo}suFG=-J?1;ruWmN8){FaaP$Up1gKOyyeiNoHXP`3P=hM$$s zF)eQ71<0!LYH@IYvt_#*MWOep!>|)$wVcGuzZW3xv9)2Gp(St9g!$ow+l+vT;DAEr z64&HLkvbQ9i>rX+<8Px^xwuC_`OvoIRjK{c)GGkmYxVjQQ#KmLf@wXD+E21R|GIXg z9}ZG!pknXu8swv$gLjFU)x0vccY}m@iyr%_c3yNka)K~A2e4Ru?5Q%IqKLG~8pO7B zMc{L^WM)BkepFB_KXm4nM@|&IFg-Z^+Q8KcLO#1ZPc!0|Z_)JiTTj5&8nNhi`;D#v zb&V>CUTIxABrHl7eRAMFW3B55@uyw5mKr``y)X42Iy{t>Bki%v8i_1yx6N1Dm141tK`3=ZXHI$t79LF<8N;!RZrz6z9R|xT4$xOD;sxpmN;$k9J(k_!Ua{)c~eqms4d>ymZe;!JX;_$) z{gIryh>s45L@IA2iO>j|Gd?gx8ZWDsz)1u6OpTtIu%#h{9Y$}hpT&!Zk^WjV_dykN zGzO^bJT|`DAD1uL%-@&5WtdtRxxqV8_o+dgDTl_j4DNKGd7?6AG$d87M!r)aW~h$Z z2%B52T-?LAl33p_jy%M+ks}~}CX6H{s&1x|63B&5R zDofk2&{cmqXgNxnetYo!0OO_?pyXh(*%~#`hWw*PyqbHd>}H0(GztGw2FYleT+N4$ z-|~9Y3=Tyzp_XzoGbuYJg|Mjv8^N%v!NBqgST+o9APO|I336>o2G-pkr#j zqAo1$w7pC3tnz2#)#;LPvAj2ymf|MURsd(KmWWs@_Ls7zz{r7VXb6fAGT*!3?B#xk zLx!54)BdXW(lVT~21Rw3I!)obhM}SvbR-5Hnk7eA9p2nqBK74Q188&{sLR32@{rDLIdq`+url>Og^eI5L!jgdAD6L#ZS2u zD0Nl(1sQASU(Fp@G^4JPWnOo`RuFoh@m)0Ay5R9!BWO4@sD+J2e^iC@VJa%5Cr5BH z1&z1mq9>IXxy5GmsVRr}q!JX%^f7~|Cb(s17!L<8dWgQt%GNEn*_PswBi5&~6~ES* zejp+LBecrOd|>@UUwC>#aR>_re{E^6_aa9}6OB9O6D*tACPz6jaG1H$*C)WZSkm{I za9W>+P2Z0l4qswCrGGTfRtQJGy89R)e8<_NAD zY6NXnB5t1d8-@&g9tQ-*5t4$iu0yHA0F8>6Yt1V@hc_ z8JXkIR&35x{*e9zg`Oi9^bw8$2{oiM606)qFLKaz+R8lhM*)mGv?xUo0Y{X?cfcaK zxP3p2mp6_p_29ar?j?S$NRL<#;0)CX1 zbPz>eE6t>+=ka)A!HdAPk&5*VjI(L3Jc8eNE&S}hYF#JP5=XHoryFC>2_9SEKJEOn zImNCXGvJ^_MEG&QR0JPZ+su##v)eG5m05Vr|VpAb`)SnE$fbe8PNH;(jSL9vPVKvRLs&rYZnLz)g^{&4nGG#{Q5!wguHMh)tF zh0_Zz#P8{$4M&S%z@i%9a7K#nnbfk2N3Z$p$WCa7p2?%0`TXpj#}hn+nAXYRE&UBW zPf@3*qy5jX>n(rZ@x8g9bF3tvx48P^BJBJq#q6aWQ=nC=6H~7=k+tfQW#e5g%FBF##Qv4U&I_=r?iY1di-sm z5_OhB^_&ZnT#$Br6+`Y^5YfY7A5-hZnSNip(WCX!vzupK-`)hNK!yuF`8#^-;lVM> z@uoQ07ruIQLhB28VvJA^L1$A3Mo#^;Wn(M(NVe(+U z=*CN|NnRi9u~;B*$SS|qRT>J7CG2qOc)4-bN zR4141QtrTrPCtXI`Nb58im_L?f7fNczY)wO_Gdc8oM|kByO8ftlK@0iUctQ@sJuhirb zzx1l8|1h&SB4bmORyIQ>VrTTC7Th040L|IGefP6XPfur4aCUtXO(K@ijkIz5QB_$j z{&FLJU9gv>IrCc+*Tn6}e%c7BOtjoU|3Ky;^^4##R-Q*&#^FsiC7Z1I%*?EYaMC@h z-OFT?(9m$P&h)UlE7wh@pIzyS%$3UFz9{#`H{o_gH5U3U27fRaGcib;B4+ z-d8K+q%lnGg0Cdz<5crFKS!gB(GedP^;FzGP_A)tqq=gIz-D{5udFJ1S|a8>!VXiK z2Vqmex=T|!Q7cec(>;}p-sWML|KWuxKV z_Z>z@&w7B}$Gmz6$VNn9Eg6G)3q}ohNV`eNPsYQYN)7r zoZe2UpdF-jQTvOMl~P>N6qzd*Aoi0=m&eTLyU1t3pfKku3n!zwyGP8z_=aBfWc-Zr zHJF~%z744rT3sAElW)|X=J@p_i2C=oIG2R|%f7p zuXFb8%ZhTmRQRBD6c4@w6jcuxx6Cd0f$Z+Oh?7AgWVEySZdVkY3qwqp#+X;SyU=b? z^E#^Ki+5fGxkQ=@51iH>LmmeA-p;-88v8NOJce*e42bi>ImZhvF*`f!7)x%=Jrw7e z@xF{BR4t-W9^O)a&1}bTfhs08Cf(XCT0@SWJ2yX7cK9ueAF9TEs9Di)Q(5cYzj2@F zi&9lXS*ypUwg}%FoB@pNfBu70!2*3}O7cfm`t4YvC8d$8r6wwAg4jn*<_mWh^`hA| zLw1m0(sX19S{k%|~{ipG4m%DQOJD5UK>er7m(a+_rmKVc(?*TXE0) zei7cN5Ic{_1390~!AhYsD8vm-lUy-x91hG56RK=8|BO-5$sV6dJp zu?&D*drzK8?i=cN$>owFiq*a4-$eT&%7~$qj3ggm$e(||jIUD_A_=)?AT+8jt$lT< zZ*Xn0oZJx?z`G^wDDtDf{@C{Qr`WefUK8t|r!452%JlAVO;R<`Prv!){XFVKDO!?E9CFrRBfkj%yS0Oi^q~P8dYG?&Elgwf^3swac$&6Gyti zsQK7KXxBt(Po~$2(~KoVKgdhN6E?!L8^?3TIqquWM`R#~dnX#ROZ9pm4n@Jg;HD>T zuQq$;g$in|E!-OtKTS(YFu!qeQPdfXPtO+Pn^|C$jrqw8O?5lC)nj%sLp5{?o;{~= zs{Uu6wv;OpA;_PQiT2eMU%&{hhd9r#5p0$9f}XmVNd*IgYP|l>^sZPeE7w+Nb`AO4H4{b#kND}A7Nc1ciTJk_7X)q zRu%<9w_OA7dU}6QANIQDC!KLa-Yz#;d^c_l@>o(KUdUOn?*+0OM(7F9dOV>|5!lP% zPv%QZQ_wP(yG4iKnNPtwWhQ+Rt4AE`L-C9a99bBN4=bxFU5rNK9O6>Ck}!9-*QhLN zeAk&tcWxAsd!?DPq2anfApMOkvj0>*1d1$TC!g=K$0aYm#Ae7Ij&Y5K<0|^{$64^s z0S|*kIO{&8l5)Gb2PBg&nRbP_RNkJ~`bM7PVOPe@Z0^v7As5Iw^j-gh)1)8YM{S~8 z!RUUbcj789niCvh=yx{Lr{kU}1Mr>kODGX@>le0;HVG)dv)tf8m^5w!*=DL#Kob7pA9#eQ-#L= zY7Ug&@AYIcL!@GhvA>EQS9v7*#`0dkENkXlyXB={>O((_4UuwM9o9mKDAqaY-LfSe ztc7c=`XcWIgtEgMh6ZU#-V;jq$PUwmSV5TBO?5w z?XnK`RbmmPu!Z_n0$y6%NuXDwLF;nkEq2g;)ghA{;Jag_^|G3uRgvy@DBa1Ry*swK z09QtT@AdwWwdnM}n^PA4PA=?TRu~w*Y+Yo>yMloGN`X)*|7@;=~V>DrbM9EnXoRzEF^gR%)B(hs0OSeXa zD4>uphz`WdCpM!6@1Vv&^~T{wMKws+QFgC&NIvSa??@3?P@rjPFgzm(-thHXz}%okq!qW z+eaVVb6&^IPsU8vK8O&uX=t$SzrNnxz3UotZ{7`U3WY9jxmQg}bS!YAO96I)lQB|Y z@3VX&1eLbAg|-;Qt3Dqb5YU>es2byK#v~RX=7k9=gnZ9Mxm62P#D>CARd>-;MpQIi z@UH+-yEOsitoc38yglDeCbc{~AA~&oOa!AA31BZ=+&Ex(tFKPpF)k0gf)-ITQ>JER zRqeOU)5XQ^)8nZQ5ak8v80h~C@+Ul27<%GGZa${qEZf+WoWWr*Y{>R;qv4R&Zx{Wq z&4ylJwdgx=4GK5bpt)MV3=n{r=04pNF87K`81dZELKyO`e0+YFSJgbHb4$6rTCUx7 zgmicAYE4<&3O~~s;d&va{ox%CN|UkuA!CheW^V?WMpP!^OlCQ?lM0i*Ew#un6c*&V zy6UP<1YCMwJsNJbojxNLB#pDK^F?%n`Y_RlDEGX)61Za7x{I7;Ig9_~^dUV?q#Dza z(A&ma#W7v|d8Q#C6NdS+c4ve95Y&FT1Zo$!4DfgKe01$W|H^~z0dJm3aSrTvU~(0U z4X@8MeIGzuF)=p27Q&y`$SpJMe*3U!@W>X1y?^_AvHPtn(;;AkRRwZSN@R+@svYu0 zdzNnss>$v({`K>7yjO1fX8a!Yi(!MZPRNfY)vjXfR##6_fs&_^veDQ6%mUSp8~?I?iyDo47Z9&USNT3V-i4c$@ZlN{311atd;koBdMV+`IA6aa!G6 zY&k6iK>E2`Ii;7Q*fh>4tMwbj+1PS@LO zI(%uIg|EHp(Na@Ae^y;Gi0x^ISjEU zROWP!vvtcc;H9GCqTO?fnT&bJkdK`wXOa~A)`CPqMRZbZnmd|f-QjHQ#| zD;|#DVv91 z1BtfWblY=x^d8GR;kEZtx3M^Au{b!OCBXJEc^xlsD@Mmmj?aEg3X_$QzwSoUb96JR zHJa+g?6}Ypc^!xgyvsH8pPlK$Y`t(R<$jzH0B~cLAVeGMMB0!Yu5r+%i~C-1-o#^E zwiRC4LLO=WZM&r{kTUDbw^Sfdp~%t%gXMjF$5h*z&Yj_C*!jryY>43cVaw&(Q`zFi z&4Fj`IFU03tIx=okNntZH)%@`P64sCD_PH%!*uc9wNn2_-_0o@=50`RC!CTP%!b5& zkb{yUjPE0_P(VOH2~SRrZHRV(R8z-yS$F!;8+Y?Z$JLJQ!%`2a^-~b54=CVdtj7PI zF%B-{0#GtI1dufU)J79_U3o~;C?MGLS=FS-2rV4~^&6w8sv!pPk*Bk}u<3DIu}*q?vuB*G*go4@B-4WAp(&4 zpMC5#JvP(snZ)QxKs$>^-3ngmi2H(>cDZ)uW#Bwxe}x2jI5_NnY6Knd*j2u$$lIP) z!TR@ox3;cb%4v=N+4EqSmZkYn zT%uyos7{>&cCBmhAzm5^yPld_1Hb=k2r1m97kX$F|IuA6t8y2% zNGzp;G@9^nY-Fn4wXd0Z%5PS8^DT>$U5fO!edGEe<>sayz*1W~g0raeC1Ut%WR&qe z=9$QIq*`|2=9K)F`oDx&E;oAVDURGoD&zs52IGL`z<*Ibf+2*UgPW5i25lGkj@E1c znR>cyr4w?0E3WZ5Cu}}n3V^k-5>87PdoTQ)l>u8`bCQj))F_Crtq~v6G0*2cbFV>oNBUl5L868DHOiCTn z`uY>RvmC?wh|iRW(5bo%gvmS=+xU^T9UCtz zBnp3i9`eY~>W3XfQE_9vwse*0d%?`VG`rkML#3|)cS#w84WaBYF*9o{YHI^IKb^=| zxTpl;utLl9_{zMo^VuSU$LNH0JUTkh`Q_4V0H3~F!pq??Pag6*Iy}v38!{ckv3gz0 z$95f`UwRqKnh#9eM%{Kx8JFg54zo}&x1B=>DzzwWvO!pU>Rd2peHQbUftHUAZ%#vw z-M1iMz|Cw61YEkR#5P%MgqDvlx76{`4?H9Sj>~j}98WpE^f_L>EhuYEX_Sk?l?*JS z$;M!t51)K|W3w!bxxxF(a{Fhk=a4syA1p0tKM!~vFzmdqs<4jss?zGbNv66#{UFRf z6c%g~d)2o>Es1+WKDE=nu&|&Nc&lrODu7h|FmZpV>-tZ~E~9Ms9n9to{eHkS61y2Ufv@!J+s-mS>f2-~k~r zdi@b0y*LO9H|GwNyZW|yFCE9-8L+t_F_oL0F=@itD+w;@-Bf^h>9srB|g7m>{5yv-t3LK%+Yh9IypP?8MzxL73Xg*C+)-*K&?JnE^n%?ez*;Mh)m65 z`{~|{8wfVd?GK)dgY0#8K>%b`RhRF0ng21kS8zmafQ|pC@e~=aq_y=#OBwE#Hpz5X zpoFf}LqQ2BvM581x-@`B3At8|0U4R`3H03Y` ztt+nhG0DTsh{G{#j&?NAf2f8d;HeLw2bzAxT=O}*+K!7uL*rrzMoPArLZ>{sqDY*r zQgTCszWIE8*SNjoUJO`obRR1;1Xco;j?i4KB_8EgP^pkv&+gOgzC&GA zR};)Ji0NJs>ylg1=jwQV7$9gp z4Rg=UE%@zrU@#q<)Obyt2DF~8RFJDEtAaC@)6)qEj_O^)DLG+~8|{6LKDPz0@XMq3 z3rlb|G|UUxXFI0D0CQHbCxL-$;UfVgdv!DEYdNu9-I>U|0mz)Pb#F*ahi(ph*tc`Mvn zgerVI0?hUAV|E0Ax#Rqnnk3E5b3^`QnXpp+rh;LpMW7t^U%twA>N75+*xceSwuDL! zkGoo$Np_avYt13aL2H$~i?*YlCMoFm%3qMQzOW%^W6Y{6t!>=9bnrW)B7a!vej2M0 zyl@5zmh!i#wb8YE+JVG%qz;z2hMHlLmhmY4ddYC^T32FXi{@Cca3e}!sNRfojSYHi%5@HS{~NM3s{05;bi2V21Nww`Az z0p_1pa^x2f2ft~GeZ$1w%ktv-@@L!7QtqIRHMw>#xIZz0H_n(R6&6MmX1mSIk=`Z} z=1T|B$2+=6)(rRL(}3FDUyP1k?-mKz#LWS_J?Q_6{FU0zr9^nkpS@s{dMgI9gzx7XHzOII)=Vr{_PuvGsc!{ygIeoOKpf%hq z2ky<^PKA1)(W!uqD2$6G|AE5Og~e_`I@ZH)40_yxlk_tiGR*O1J4Ki+((e)r3V+W5 z@!dOnpzq%wdAJ-}kEb@D4lG4p4i33;d#xv5STr=uAt|y42$XDbY$iX@=I+R?ZM?5} zyKl*Wtv(xu57lqUAgm>-8b`&78fGZH_z(FsQqtnXx__L z_?k1yQ_8B=C6)CDQI_ucw{BMr4gqgZwvKK4kOhYoCk-af-7!wr1}ZLErU3jx94{DI z*u>sqT+f;K-_*KalONufCnw3neGx z=MpY;sH@N%^sYrI&yE z+8I1_DQ1#5h@2-G_P`okfeAf3U$ZZtlkBxFR5Vh(&=oT^-{-7c|Xvu=>GCNSm;+qL?MLm!f;L_x_! zWOIS)DD%y$t&RWDez_SW%XgTR<2~!jx`K5OK_2?pdFU9css3|=UqFH*x|kftS1Bfc z-S2j$5GZtxI11RJF?z4k69e&-y6%ho=T_vgxixf z;0CS0z_Ev_MNM_Bj!yz~x8Jd9?c8r=4P|}rLRd^>KY`M|Lu1|GVpdkbtNxXQ)J z$_(~a8mCgWm(x`@Kx`wse-Ua5k&rT3_q*yf-)q9VX2n4*2ZITY+@yaqK0!GLZ6C<|5 z(uj$OmN#5FDsVR4Di_>ey%%ENvt^^l#r>~wH$T5hsC5O-9VC7DDq8AH(awJGOmMkv z+1uGKy|a&>MOj@hk)Bn3WKmqb!XSSZ*j`SQ%L#5nI6bhL9^44yml2 zQ^S{xgveh7to%}*+EHIt9QwtM**H0qIJvmW=KJ1uX`C|tO&M^(H!pZjO^lpNe0BJC zhIV{BTq;T_TNS$#lwc~`>A9G!1-aa3cpm_MfZjeO5HQ09=V5*f338hLqeeeICgRjK z2|2N?2BDEeH)1)L#yhG~ebRkq@=?jpw37}9*go3-94J!b%J@&DtIChHy&>?f5FlJ1 z;J>bwCZCp;1{G{ap8U*dVdL|+|L-oDfQKC@s%7IQEGjJBc-~P|?u1E4rw1yiZFOOf zp0kBf1BYva2Kj&wU;FjdcSGQ-q1J6n-B*;~t_m|$!IT-iU^2-W*AKk*Pd&byx07#b z{HdEm@)X)I!r^!%w_3(GSgUfiT4UBaFfM2j1VChqym zmpeKLC^7iikVD*%3icksI%e%?KI@>u@b%ZHtjjU5_hnU!MM-HfYsW2_qhX!>qm9AK zM?NitbmSrc)hj}tf|&p|muw=g5dGs{w2j0xYWIX;@e>gP7z3EnPw#(}lA2M# zBR6Z1y7+1_P<6>sZ-jxV7TQX{F@6DTx&!Y-`_FF_iVou5Q*aPmqFho(Wd~dboRZ3W zNs(QU2X-)k(S*4jCzBm^kZoBKm6Bhf^FH=QeyQKpHxr;!Q(`J=Fs-+ z>NlvXaKaBnVGZJ@hX&N^hVZTfL6y|Cd?Hgk2P4H&$P+IMXli}hvVQ?*H1X8XK(ajm zGHcN6Pbe|;FoXz;A|qS&~pE7sr*+sd_u_I*ni|9{Dq%E z(Dn(lf}NLy7-Z+jylxo4{98Z=PTHbz^1+#wDsPmy;DhD~)uv|S)_btqET!YlKX>%+BUnR|353M{e!U-gFx$x9dN2hHZn#wwdZsng_97u zD?vm3s9Or}ndoo2%mknzg(kjUPz~0wxCaBYQ`7_weQL}7&wWg1K(LFy;8GfMvBc;{ zCjC=jCR<+)^BZM9ee4&DvR0)0uD-F5~}uvLSJ zs+;3GiJ9(N^ZpV$6)P$89Qf`W2Mybn{we>Qg9-i!)6f=2M!W7vMi%3=u>%h!M}hQ*?U*|8%zVm zD$@ZNp(wWToAlSyM9v&y4U~N%_Cc=fdOrv{{^`%027@>3X_3%6pfr_S~e@p0BE6zfE|PNqMj4EC6J|i@G>JSB-(+knFT9F5DzF3!e;; zSzPpYFyO6-PUI~lbxPq?p#yHR22SvB0hHX*y<+|`h}D0;qOQ~TLAbuX^OkmwI!1GT y-tQG4{Pc*(nsf}Z_If`||Ns8KTj0Gn3l3yS9~~A*`a%o!{*skc`cf@!6#PGM7Q$!% literal 0 HcmV?d00001 diff --git a/assets/images/repost.svg b/assets/images/repost.svg new file mode 100644 index 000000000..036dc9442 --- /dev/null +++ b/assets/images/repost.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/talawa-logo-lite-200x200.png b/assets/images/talawa-logo-lite-200x200.png new file mode 100644 index 0000000000000000000000000000000000000000..9d341376612c598c7e08af8bbd79d717abb15a6e GIT binary patch literal 5133 zcmc&&hd*3TwBN<*ogk~M-l7wtFF`D#tROnE5xrZYt}ciY2{vlfXhEVymyH%Zdh{AZ zFVTW`fA9SfZ$6)U=X1}UIqiGSoSAv0ultCC6iNyLfhZ7~YDl2({qG?r1m2ZTKji=& zfwwB+2{F)uh*7a15Z!l#n#vRZtljyS{!dQ75*_Sgc~al)#D^tU^T4S|pMmeld}nYh zw^2D!IyOxcudp3A9I3U~pnvOsP#DPLWOPSfZGYsIwG%8>Y zH3CQ^H4Qzrs+#`)AK^o46WEB_-=>g)sRF+u9UKS~o1|*g0H;%U%z`bM^2mrz4B!q5 zHku&LG0gNj{ORX$>o6xz9}Qc~fk;OXgIG2Jp))w$_wVqX98&H|qBoPTW1__#f)8a% zAe%y9xg^k#?X7a?cLnzA82Hb}7>z%-zxftb!H0|sBur#se>po88O{SfkaXn7VAgy= zjU7{l0;I9ZX|9jAKWOX5;_ z0|L@s9g6#)`=JNB^{#p91Ng?uRFP`h^RISBH7|7%(7+$^Jr5A3=vXV(73s$rNKfrP za~1af77Dvgi%2nE`sR#TN^7DsEx`CcTnejNV4-@IbrMQayQVcCRbc>c8BLQ>O43S9 zxPae6N}H2~Nqc<&Rq6pfmhr(K1BpE33*FSx_}QNk*ak&fEEVm2m$7SIt>Q*?1GIp9 zVI0`Dx}$L`f`n7VeAJFUyqJ?%BGh?3%nxrjrf^Rc&ChPQB~O$9E!z9mE&{`60cV6) z+0ZAKS_r;t!oOYJ#caWlejNAcllvY-_w-P|?e#%!Q=+2qB(OPSKUl-q?kDQ0b69=A z=oH_QmC6$f6}8C`f*{{h*%OARjXtYHg$9SHfe%r;cv)OXKbogncV}%ecq@GYrrVTw z!{SnHSEN`5U^qRqsAi}An{Gl|KE^*z$M7a9z^8bewHIJWR|0wVxp0rO`dJ!c zKFmcQ&P&&90qA^B+8me~0oY$ip}$>Yk9K9Du7ht&|1W98zpIVnVke(&P*}xhQ!lvy zqw{=^w^aT>o{=hRi~NzUE~SM?`uJ`y9t0(b_=6F9&YJMDUXuJFS~wsu@NniuE@D0r z(7*VbBjzL!fW+M&{9uyy^t9(u5}Uf7UQ#4$A3j8Fz?a!}j2FPuI!huN=Q0s|T{F9@ z;pQf?NucCOPfg?6O&N3`D|%(k86Sa5>6V@P7wGLRIg};KrSj-V1&j@!-R-`)z8d`r z3oje;D4jh-bapvRXQkeLBqJjemlI62Tjz#@vEOR!dPe5wDL@ZA#G%DB^HRAqS!HrK zkH1Ib;0Ciwejy>$bV>{08C&U01GCG)jS1Zb!dpKj26TE0A=P6pxwYW?*M;A|yco`} zsYwAu1NqEOjOXR;U3HgF?DgiMt*?-Ugsh9xNO7mUk*7yf>lKaO-}`i=z4yz?%S-+_ z|FWU%YJ1Pr7@@#jfTnae>9%tixN3;Xsd|rMfvgEK#6y6VpCr3@Cy}b$ZkhaNE9+&2 zS&L~-tW|tScW&URFXP=u;ICQ+1~fuxTMcV1({#}d_g2N7s6M${|4ycKPvZ-6Zn5Ka za9K0!Jf%z12fS2PR@M>{G>ZWT>hk8dO;LAzYT+X8I7}mM@f4)tLRabyPyGBTQLrEJ z(*O=?v=CWaTN^k(*4Qy?F}xGgLgsDbtLYt6{^ChIAjse;BSphfE*rp~ISXD@!Y?48 zfXRI=~l#YJ(V9O6^>ArH|C468%%ky03}(_>umh>{=W0U$U~}&>zC^qr{Jxv ztmu;@8TSKec@pz;=jrF@&$?xgLW9Dq;UFx zySu4R#yV$`24b%0xC~{=Tc5EwcKKCHVqWiJi@e9w=N+B`OGr%2|M)Q$Q7N8I*flCw z>%BPeYK5KMf|?ovCIlIKFhPiBrJR>{m*Ib&F*3+hUzA%J8%Ix+n{e^)L?K#j3Vt;| z1(2>btJHCNtwFM>dHYw263ikr(m^1cFp|&s-VrDM!7hwBjaV9Y;RItgcn*g`q577V zgN13JJhv$Pa9I0TIN`@(w5p9yq>8iiJ>6WT!9wF|150?8E*}t(*oo$>jc$*G+t3uE zRY(SMX3$U8XOmh(gFfVPpZf`8^3R{hlhaf2(sg2*k*sy{>0=pT-_BCIW5H)%W|DJr zhYO9x42N!8;%d>DkoiD2H2m5hdJSK665{dU!=-; z;q56;-6Q#u%*U~f8RtDc*giZs7=>H5G1hY`Bhge>ha_llrJ5=5OBY7}#Wd7F zoHmt|FvT3Jq@G3r&HDQKz&1jC6zutcrMJJ|&bUgx>-CM=7DI(!$nw02hLi^LFhA23J3f#(y?TdKQvaEvKSj3CW)OvNdY1Nt5 ziT?h6!<`(nIC4!RqdR8i=Gbvs_Ph{CfjE`upEJWVEd-tKXR?0^779D|! zdyQ_4@KJZlGlB7PbKA_;yY~J-?$yl1QS?SGELg3ruR~DY8)W4yn+S@%V9l}2+Na~2 ziv-SfX8&b?-@;2iAGznET1G)|%whar@83fo^71;|uM|(anhm_|JS+osqF2NAbI4U9 zyOj5fB_$-P?RqHf-EE7C<1jivwDXIIXsD}4=?&w&@pRpNIv6;T+%0urF%$1NmVz|D zblP-GR+`t?;s`w~l5dR;xQrkuRdaJ@09G3bto`YQaD29dIjus2Z)?p?3+0sW;NGr2 z8ZBM#zL>bVxit(mfEp1JFfAr5ogc2ApN#1(`vfTCxsm)f_&VC|JYY&(ga1dDDKEE^ z18!hoFkSD;47lrV$542t6TZZU_I4N%B@5iub+la~^W_ zSY|#_*u0)yNJyx|5+XA}gi?L{nBwU8SeySCD&mVj7`+K)=k!B%Apw5w6I^h2M?shh>O(jM9zj*g`% zp@2P5enCqK^5=Et3rVd@MF<;0liCxq;LUY02*t1Ym{|V;S(rUhCQnf&ZF@u}-Dgkl ze_nI%YTqLs6YYQ7Yf3Vzx%lQ{053l1(!b{=nvFu#hQ_J=-U&(_<}oyR5rrw0{_ZGAdkI(x(%4PnmySrS=t5m z57~+s@tV3}@_`EH^#AHAqyq78mUUpkw^i5_c>p&8;%UnUDs;}E&zs#+nbph91cBR7 zqXE^q^rkR`D5$#G4aU+UA!D5ZY-Ww(n#=S@t$PZME0k#UgxdUm^(cPbv{L)S#pFX! zYubFMlIi}t>mCJUEsmoEQYH0yHtNtsyWTEQDd<;ESESlXpZXY4pY?+KJ(bL&Ow(2y zpx&?46-O|6T)vRq^O@`x>70Da+#2#PxRkjXxmKB>EDK>oPwf}fq}=0Y2bB@MPY%Tn zY7EHf#=rQ&mNEL-C~@_`Vsee~ILyO7k4D{cTcLI=bsK+W$rJ%#GjngENNH6JSBnx%(PyJ{b$QIol_4`f}2+S7w=!V*ULpRFxp&;dwSU^b;>4q4yo+3mOXz8!*x1X@H3T4vkN^+#MKf0lRNGS32b}u z8Lc{8Gc#H}|109mEJ>{NPQsJB$>1J-D`$n?iiK6OhRf4mwjutsA#ZAC+=ped+nJQr z%b%kIWBalN@sFJB*rF|5?5pfGhPpn1=7KLByXQ5@v`?;%b-M)`552PGdNhEN_~Ryk z9xI3)Ujemcu{ zj>*`?`L_z>nzqJ_$#8LnUvFubKVw+2iY}*8milboAj;E4gwnGU(Xf!_t=ov=IhO)p z5i)@_5y+sY1VdfaM!~WZel(Aoh9%0+G6%B79E#+R(oVN=-VX;KcwEqb2|((*z<1pE zLac8|z64~Z8n13d0u}c0^PtmZJo{5C_a8l&@E#3%=H#o)iD4{Z@BOw;pyPFld5J%4p^FGe9Ngz=_j10j^v^=luy)Uh1(d`H?a zgT%O;%3ZsW?du*lo?=}>5K|Rh(F8o$%qR!Y8M!69JrJU?^iGQ~QX{wIckQ|Vy!V@d zh9mWt*1{p4H+qscEt#w7tAJU_PzD(0Q+TcuK3;re?g;E zcyp#U|9aB*Kh*xtGD&(p_Go!);OemTEpvx>CLc@C6V_xB)=8^>pKewilaw+T(=gY6 za?<}(FkmNQ+Ukb0Vr*`-`K*cJ{EX*JJoB7sfS=t&cHHQd3G}#lZvFbyD5?LZeq%A= z(V^4WT2JL5mEJcpZ9iLA7v9xR;f#>)xbLzYQEbhb?g_))p`pJ$Uo{=U827t}#+uvf zU^QuDOV&SSR$q{{B~iatux7;v&hk;I8&wC-<{xd=QK<|&)`VUkXTWl}ea%BW%l0`# zUfzU)K=EA2!`%McyZsv + + 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..8d4492f97 --- /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 + 9.0 + + diff --git a/ios/Flutter/Debug.xcconfig b/ios/Flutter/Debug.xcconfig new file mode 100644 index 000000000..ec97fc6f3 --- /dev/null +++ b/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Flutter/Release.xcconfig b/ios/Flutter/Release.xcconfig new file mode 100644 index 000000000..c4855bfe2 --- /dev/null +++ b/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/ios/Podfile b/ios/Podfile new file mode 100644 index 000000000..2c068c404 --- /dev/null +++ b/ios/Podfile @@ -0,0 +1,41 @@ +# Uncomment this line to define a global platform for your project +platform :ios, '12.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + use_modular_headers! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/ios/Podfile.lock b/ios/Podfile.lock new file mode 100644 index 000000000..8d5953fa6 --- /dev/null +++ b/ios/Podfile.lock @@ -0,0 +1,115 @@ +PODS: + - connectivity_plus (0.0.1): + - Flutter + - Reachability + - Flutter (1.0.0) + - FMDB (2.7.5): + - FMDB/standard (= 2.7.5) + - FMDB/standard (2.7.5) + - image_cropper (0.0.4): + - Flutter + - TOCropViewController (~> 2.6.1) + - image_picker (0.0.1): + - Flutter + - MTBBarcodeScanner (5.0.11) + - path_provider_ios (0.0.1): + - Flutter + - "permission_handler (5.1.0+2)": + - Flutter + - qr_code_scanner (0.2.0): + - Flutter + - MTBBarcodeScanner + - quick_actions (0.0.1): + - Flutter + - Reachability (3.2) + - shared_preferences (0.0.1): + - Flutter + - social_share (0.0.1): + - Flutter + - sqflite (0.0.2): + - Flutter + - FMDB (>= 2.7.5) + - TOCropViewController (2.6.1) + - uni_links (0.0.1): + - Flutter + - vibration (1.7.4-nullsafety.0): + - Flutter + - video_player (0.0.1): + - Flutter + +DEPENDENCIES: + - connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`) + - Flutter (from `Flutter`) + - image_cropper (from `.symlinks/plugins/image_cropper/ios`) + - image_picker (from `.symlinks/plugins/image_picker/ios`) + - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) + - permission_handler (from `.symlinks/plugins/permission_handler/ios`) + - qr_code_scanner (from `.symlinks/plugins/qr_code_scanner/ios`) + - quick_actions (from `.symlinks/plugins/quick_actions/ios`) + - shared_preferences (from `.symlinks/plugins/shared_preferences/ios`) + - social_share (from `.symlinks/plugins/social_share/ios`) + - sqflite (from `.symlinks/plugins/sqflite/ios`) + - uni_links (from `.symlinks/plugins/uni_links/ios`) + - vibration (from `.symlinks/plugins/vibration/ios`) + - video_player (from `.symlinks/plugins/video_player/ios`) + +SPEC REPOS: + trunk: + - FMDB + - MTBBarcodeScanner + - Reachability + - TOCropViewController + +EXTERNAL SOURCES: + connectivity_plus: + :path: ".symlinks/plugins/connectivity_plus/ios" + Flutter: + :path: Flutter + image_cropper: + :path: ".symlinks/plugins/image_cropper/ios" + image_picker: + :path: ".symlinks/plugins/image_picker/ios" + path_provider_ios: + :path: ".symlinks/plugins/path_provider_ios/ios" + permission_handler: + :path: ".symlinks/plugins/permission_handler/ios" + qr_code_scanner: + :path: ".symlinks/plugins/qr_code_scanner/ios" + quick_actions: + :path: ".symlinks/plugins/quick_actions/ios" + shared_preferences: + :path: ".symlinks/plugins/shared_preferences/ios" + social_share: + :path: ".symlinks/plugins/social_share/ios" + sqflite: + :path: ".symlinks/plugins/sqflite/ios" + uni_links: + :path: ".symlinks/plugins/uni_links/ios" + vibration: + :path: ".symlinks/plugins/vibration/ios" + video_player: + :path: ".symlinks/plugins/video_player/ios" + +SPEC CHECKSUMS: + connectivity_plus: 5f0eb61093bec56935f21a1699dd2758bc895587 + Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a + FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + image_cropper: 60c2789d1f1a78c873235d4319ca0c34a69f2d98 + image_picker: e06f7a68f000bd36f552c1847e33cda96ed31f1f + MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb + path_provider_ios: 7d7ce634493af4477d156294792024ec3485acd5 + permission_handler: ccb20a9fad0ee9b1314a52b70b76b473c5f8dab0 + qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e + quick_actions: 6cb2390c4dab0e737c94573c27e18d9666710720 + Reachability: 33e18b67625424e47b6cde6d202dce689ad7af96 + shared_preferences: af6bfa751691cdc24be3045c43ec037377ada40d + social_share: 702a5e3842addd22db515aa9e1e00a4b80a0296d + sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 + TOCropViewController: edfd4f25713d56905ad1e0b9f5be3fbe0f59c863 + uni_links: d97da20c7701486ba192624d99bffaaffcfc298a + vibration: 1ec279c4a1a7a646627b54039d812334b3f1114a + video_player: ecd305f42e9044793efd34846e1ce64c31ea6fcb + +PODFILE CHECKSUM: fe0e1ee7f3d1f7d00b11b474b62dd62134535aea + +COCOAPODS: 1.11.2 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 000000000..39eccc98c --- /dev/null +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,565 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + 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 */; }; + 6915D38338D0ADAB147B5DB7 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 11EBC6466495142DFCF23943 /* Pods_Runner.framework */; }; + 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 */; }; + AA09F252DE0CCC7E69DE3E12 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69935DC81F37E501ACAA4312 /* Pods_Runner.framework */; }; +/* 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 */ + 11EBC6466495142DFCF23943 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 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 = ""; }; + 1EAE81F3FE5F67128E58B85C /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 69935DC81F37E501ACAA4312 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 786A3858C1D311840AA1B4F9 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 93F84FD8134080F559F7DA61 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; 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 = ""; }; + C1864E0A0142AEF880972331 /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + F0F18908A6BD606AFFAECAC6 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AA09F252DE0CCC7E69DE3E12 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 15ED1F9ED2C51FEC3C38506F /* Frameworks */ = { + isa = PBXGroup; + children = ( + 69935DC81F37E501ACAA4312 /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 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 */, + 987BE9FBF8B99A813F359646 /* Pods */, + 15ED1F9ED2C51FEC3C38506F /* Frameworks */, + ); + 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 = ""; + }; + 987BE9FBF8B99A813F359646 /* Pods */ = { + isa = PBXGroup; + children = ( + 93F84FD8134080F559F7DA61 /* Pods-Runner.debug.xcconfig */, + C1864E0A0142AEF880972331 /* Pods-Runner.release.xcconfig */, + F0F18908A6BD606AFFAECAC6 /* Pods-Runner.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 7AE1B0F508BCAB74F4600E45 /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + F5E55538C6E5FA6AF4D9E28D /* [CP] Embed Pods Frameworks */, + ); + 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 = 1300; + 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 */ + 13FF27AB0F3886FAC5A400E8 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + 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"; + }; + 7AE1B0F508BCAB74F4600E45 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + 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"; + }; + F5E55538C6E5FA6AF4D9E28D /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 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.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 000000000..3db53b6e1 --- /dev/null +++ b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..21a3cc14c --- /dev/null +++ b/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + 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/AppDelegate.swift b/ios/Runner/AppDelegate.swift new file mode 100644 index 000000000..70693e4a8 --- /dev/null +++ b/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import UIKit +import Flutter + +@UIApplicationMain +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} 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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:0#*ld0Dc8b=X5vm17sZTM=d)BCy=So{0ih%Jx!vpdQ^r_rpOpf*P z@eVgqz7OfFua}Inj^&?7E_By@M!R^ABG!K7PpdB8jYd_hKb$4DVk0ZWMMSS7IIc@s zRD86%W%xs~)CTtw@832%k5VclkhwPvwNMXmlBnam%kS*s$l#~EM z&^7Lb`uPo2$lZnX=kcW(-+HPP#*QnUmlrOz_1~^2{)ToQLu9XTmF(yhK%luakap## zltn?McG`u^vz*BM5Go3~I8wsQGmgqTCMmlTPZtiCXqqN8aJa35qP)EJ=Lmh0!rwCS zMgE9CdNA9U2wM`({rAoDf67rL__EKm zciT#%V?y&%?s6A0Z*U+}*t!DR>$9~KmiaEtrf@4EmA>hi{@ral2%aItPW%C^^)S%0 zJ$`)S6Z#1);*Mig9}Ue{W{_R3IbMSk%_XE{2Bx#-^;8_5m?OyM4Svg!_wC>2y*jV# z@Ad(&t-u- zL|^BgN+EZjwK|qG!c$=vJLPxCVJjq%Y&@kKJlV6(H@;O9Z2Z%nzDlqRjBaMDl#Pdn zfL+~EXOr_GH!iS}(8PmhsrRg-=X8AEw!Igy^8?l~}>lA3ogj_LczFM-H$) z5g>4LZKALLp}#8%19sC0<^bNySF@&){U?%?va z|GYb#%bn_MTk74T$@e8>7Jr4m1-ye4e3!@9P^+$rKku6rRA*mPs;~Gi4*_zL$A%Er z^3!pZgT9VDkSkX<2IKueA$F^!30{e>RbcOjbe?)HH1kMVf$4h+V)nN21|t1w!wTN95-Sf$9vd)r$9s9QG4^6CKj83nvelRv!lK~Cw*7LSfDSPGN(gMC z(DKGcQyp$k*rLYIKr`lk=(U#VDBhV+)N}E5Zkt+J(CbI$yO2>I0!xZ3X9CgRjQBQg zp?}|B`w`vFbkpk~(A`8xqm)z+C6N!x&G#Q@86 zfHC52?CUKeP$~`|4L-Z7f)w9oIoKc)X$%GO%@0e`uU`y!vFI*d^ZFNnDCFU!o7>;r z6$D}ubu>l#Td0ui?MJPbpi%(XVTvwy>J|1eHGkaFLi>eSFtC%g5-OBL;CxA7YvOU6 zs=sBuAA~}4K-_ttKq3{X6%w~X06L-rrOgkGovCCxlJU}K?nK2`u`q>Qyneroe?c^7 zLjWiU6;$SjG6I&b)&OVV+p5C*h2|*&E4kng)dbpj&Z}a19#L2_+Dr&b>}HXC2zb76 zf)f0W1S|g9QTemY*2BIsFEdHHlo))>8K&TsHj#H0;^9GEjFYjYRBO^L^ab%aIY4Hs zuTW5ZWLhAF`-9D6B%4xif6D;*_;}4fBf_Cd&o4BHs8DCM^Bavl5!`5zSH2v8cw4Ufn3&ZPMXaCp9v)m!k|ZGaCaM@>I;iG}ft;Lc+{p7jZMhq!GJ_VGPvVnq zgrWt>MCntuc{oGZ9H17(Zq48U8za%EsDfCe(Pyi!I5i$*X?=~34Rf5we>$^S?VdN-4s(^2%Ln_p3TAu#nZ9y4_DJuKP)mx|PSG_Vo7jnb!sO=Bia zho(9m&ROgcE3B&FbE9!l*X}!SvLy^PQ7$rC_p2ZNT(@m{1Tsm+Um9>~-Z%#MH%97V}UTy12ipHhf6PfGitH;TCuvmZDr~NEEB$Z!B={4goFZ($z|mJe0ZnVnPT9+ zAlyBHoqsOUt(!IPg}#_f+Io~Srug20-0L~$TM|hUCqE|BN&8{@snyT6e=m@>5DCrT zR=%)#S?_lRjH&de0VRVeg^CqqrsPYTS?H?f716UcR73y|epOXhw}0G5b$tNbkDm$n z0_=%tz`_X7x-}>6U~C-rr2=q}BKpkS!y66rKGzYBIAO@M|MGDeaYYXu*DlxL(Gc}r zy0AOkHg7GTTI9MLNKJh@DUOa4V6SOb7P`Lmy=OkCvJp&NvO{pa7Sk4jZcYB;|27QcQ>ENK)z*fH8g3O^>GKIVBeQ3% znK!&TjMbPQT@a}d#U36v^Qi2QJv|d%A-%t_p@m+-c;LyyK7vOCYvObKrG%Ki{$V

D>YU$!Qyv(Q`f)URjwDb1X((4b6Sa@fD-$9uRvtp=By&i&91kEfEq+H4Z`Xn>zRHAsldx<92m;2B zuV%Bpzkr*!C@>6jk&ccIo><%hF(|Ntr)B2d(`Qv8|pTxbOVnQ{_x=g z4#Tl4=(Qc`T5Bc+$Unl?f!qlLZnaB*j-A}JQu)J zv%2JS=2c3OVcKV!-OMKi0gDVWd#rsoN%W!S&)i1sazjrQUUVQj{hE?Hf!7gjo$G2` zoer`&NA~pklShw!*~Q;HHTzl{FwS0hgf7R* zKSBW(;f%y;G1EW!FBELZE|N}2Mowe%O`8;_}M>~4I|-siyj;MqQ&LRU|r?)*AH39#`zQB@{9{^qj31f zeQ?0v9tJ$OpiS{r)oV;iN@84KpqwWb`)sq}OX7-OK8P=gZ4a!BAIkubs~sD1#q9heqD*7EC9- zAmT>~fEGG7ihF=iHM5wMzUgSkF+z^XsUuDF6@rCTL_)&*BD7{(9Fo=yW5V_kGs zj}~oKof7yT|86(#`uc7hjvG!+Pro?Cyx%@hJTQPW1R!&2Mebk1rz`?w~Itv}yg0wjE%-fgeg+SC`dTJqj8iygLrPFM%HZD9kmTL>fyn zb%A@!;vPzIA-Tc{OpAsQBDJ4aZl+8+WiMq%W@xd0aQh?NLx<)HGxMk8mz=x`b!o-b zg~|D>isa)2SJdk<1?O{-*gF6q74|&$26>YcF+MrO6E<)W?HWgq0KUuZJCl=~yu7^H zF5Ch{LmwI?2Sme$T0)w$gG@;b$8!^+M1bmNIUDKf^_*mkO@1OO0bEHGS z((eATKQY~k3TP={+Y_?2v9BEhHa&OqUg!= zGj?>j$D^hJK5#6@W5WnwF!e3L(@8CTo9%M|uPY#6TN4-53EKX`|demQ|wA3>c(kW*Vvccg$bIUYccIHW$U2tS8NpC7e0$ zce>v6`QjS4ex--<9(@PRiQ*eKPS`+^CzX>T`j1Mnv!z$IWTl|oKG8R}|`FMJP5Kmtb)7^#DFmdh=PuyOa+AMFf)wl0f@kfz;#V9#yJv zz}F1#gjUeYE0wSZ&MkS}S+R9aqk9{Riz0B}yxeWVHKcy%Fwjvo?bAf<-HUIJVbcBx zu-8U7Hs|MD`jRMq$5JOEsz3YBcjx3_(kSIW%&m2J;|5% zK3R|sb>0UY11S1pljP~{gID?>lUA8hnMeGphU7N+tUyPuaKr<1-mg9^@d@-?(|g*Zt>6}SWjXqYdmI%bkn56z~BTTD=VvUu4ml+sxY=i zH)70N{8h_ctdYv)@=BZX>>>1Kp7!jx6F+dVZ`)Jkt4Jm%{92FVMMZlr1DZ zJ*@sc!M?uPy9hWA&@fOO!{=?)v7U8H0MZF4?P2DVGD;SBFJPl+D$M^XS*-%{G25P# z4n;`;rfR|SDw7l+eqMgdTzJ}RO9-(ZdzLCq49Mquqmm1S*|fV zMwQ;=NNjvTmOVPYafJ71W`opsr{rI*=8bB*CQ7=QI**y#KT1nkl0rw;6MyV?2YmE} z9YL|numWE;&6@$7TnAo#i>SXD0q*Y9P4OJWZwYTGPwwvS+WuAIC7adBP(?>#NLV?) z)r1FKyA`U3z+-^JUi?Z;{?9?9-ElePLJj&WQExPIeE%-r6e^k%Pm(U9ldC+y96n7S z{Zp&SCKpF{VDdA1*^=wZ9j+@;45*jmFRijeJBNvh+3vn+cy=S)w18b9^X0ELnL1xg z_)fm>MrrkjPb70aTW)3Ric{|p4?zI82_wp{aQdF^G~WE`w(}{cDRT5`0jV23k+^Ow z6e_%VK+1$aJ;SPnxVj2Gc6QDy>QO(8z5j5?}O#nC-XMn>5SMc=bdnFY37vr@7b zFJ2^SCdwOG`4s=R7XX&r2vicB{f??lAe*?~MUBepgv<%m$vvd?13@H4x(Zr#p-{H> zw!}I?x;9deT!QHU_qAj*ncsaFC%T6TU8vg%q=j^2K3iQueo;Y>Uv$AY8T2lx?S#~^ zAU}vqI!>o`5ZhxrtD-~J4|}B(>xh%rt?%6f4vM^DM_D8Z7>t|vsAcFNn+O5*5aJ1L@hPG^=U21OcHZy4`c_cT1l}R? z06L4|-`0&Gn0EaF&~($V28Xl9cin3ioRuaTci-KyOY8?D^oV3a(7$@{8PP_WNsaZ= zlXAw6&C&E_q1r6vDg7QQ5M|?2BVVKZV`d!){SdkVr}W%E%A>k4WyTqcN7$J z0)riCnMtMdq$T36Os_^%Tn|m#3;5;kT&6kXn-sgTosfc zvkOL=_Q`-<4vK*|b}O0>j)FX^W!fNEno{IEC?rN|f6T{0WJ&z+fqWub06Mh88o46V zDGbQ_{)m`PR-6UewLto9FR^#2Cxt?#la)AEm3x(iS%*)X$z(o5tQ>rkiBVftdfiDG zBBOf~g%83jPnqcHhp4(Qpfg0x4h5p%n?elU4}TwTSFVI9RGgIaG(J8y)-)9xe6s%l zSanDT9Tt)jjvh^gW6X%yDOkxM?UMs_I_7J7lh_mk@}!2zX#ciVj9daMSXM11^k*o< zsl3j8D12F0I4AJ5Ic1A$UMrbTJv#|m5$!iVxP-s;D+wo@yYr=5Q3n?l71cNFM*7>B z1NJ2Q0k6sR&|p|biKKIHMOGB*br9K@Vu8iVb0C9zwnlK3eDm__f+W{MzV5ix8ol@A{zZ@7s6VUMygU{&hul{V z#=Js9=Hf!t)CeCxe(W+83hd=tXZ4JeL3(cl{9gj_f~8{$YvaX6-pURvmV-tJd-xMl z5UzRrFVNb1goWv$g^d&8?)Q)^Vkyo{{((P1(-sZ{Tdbcl8*%5$Pj$Sm5$IE?($iLK zwECB{rzi^q`YIlm%%r9+|Mljoig!6x82?SAV+ra;=6$|OM+{M@#bHT)T~!sUfN{R6 zr)SA4Nc+f_SgWpYSa|NY88PsBDkOoo0cjun9DK878V%hI-v)>bAx;A3!oQSKc`==( z%o4RXC>r7`Bc)T4ltS;3-=q+YVd9%dLB^aKKTZ2-UMbDfWQs5y$YroeTvGV4x|L<~ z?4Mi;H^k$Mo|?Ei-ZLBj4VQZ$EGYN`>%K8}T5WdbFkbpe3``ZegS%6o2ds)cPne!F zi?qCa46v|nC9!G60!@oEO9OFBS{hp*+M?qh{GH}4EHZ9^u881 zcfA_lb>vkbl0u84VvY?JJ^zFL_l*GbG&j3A+xEv#6AOOc?%l1$>F;iW|DkYpEO7mB zN1?qBjGF^p+PKe|=>eu@rSqhg5&xybLJ^Kmc^GG~?|dx*$5)yHx&CbY3I0#{Cu*z< z9JY9SACX`Bo zdx{;3?AmjU-R5*EZkF_P4IR_JIbN_pkHJF!$BVG4dksxe5$NQFh+o>~qTVv|!9Jyd zM$N!6IrDw|xCLc8aO4K0iOz%h5^oi&aByk@KS6K)|7|jOXeXLM<h5f=M)#yj_M& zDkC}kj!)?Z$P!el@vROK-t4W3N=OaAO9=GsjL#|x;u{B9UJ0hqs~?>x_v#{doXLt_ zBpz_E6F#^{+vW}k$#CFu^_Nd(ZJKs zyj3ZYY%}cL?J)Wa6+7>Q{y`Q)p1-JHc1g&GtyeKuUHrr>;NwG{ax9FnIcg~Hc<4{- zt|QB>%<22v4ynX2f^2kDs}aAkr7d}sHPmt)yP|Juk=L0(?zyHMYt50xw1 zX;0GM!@H8k3U=j7qmJSgVBoBbQuwR-_~}zxK-pj;IYLOvsO&W%j=N)#1782a?l3~P zqwR)5Z_^X>YoGZ7sp}3#IV|5$ClFcVTG<%i9)Ng9r@=5&*Me~#Hf1!KJ{be(lq$J&-njEHMwZj7cI*pDB1X%+H%r|y$AswWO=s7~%&BGZ?hg)@H(aS-qF zzn_8)`OdymdcVYJUnRS@ya6h#Ykk0&@z(?xPx04wR;=Z%)aG2{)g(TDctZ^W-{S}ElD@v0Cc<*zI=!!JFE}WKt+SV9M>Gc2@UGQp{9)KFHNL21&DXU$d^l?(+2%AX3p(B$lW z7A*SZc15*l#6Uky+boZZQ&;gb!(0VvihAWpLF83s>~+G-#Uu%ecL!iC=GD6kn{E(% z!Zoy`q-#q#)C|TiRIY?}$Se#E78l=WMY%WejhP!F^C{2YsOfnJ!c;t6`cfIlxsPcz zth%ZtzH7UEhLl2~MB+kE=nQda)A|NF@Q(i6R7{k-hK*>QUVI$$AoE(pSH&0j0gZtRhAeQq~v%l_aw6olYa24FJ$0=kCr(nW@eJbAm*LO-o)Qyz0v`j zoe*4r3Qe;<63BtK>&HSI5k}re`k_OSHJVhvm78`wYsC8-{604Kt zOmwcUqQcMhzR?EeBO<344pbvhH!w1kD*#6ePD9cPxzl`Rkn+h8z!PELqE%^-JUZsh zPt<&PO6h5|4ApU#n#XQ`LzgjKy_e8rylgcvl$j6zF|LBT`xYG-Te4o~f{pI4J{w@~ zk|4GCO3pdB8lN2kEYZqVHnLCnl5Vyi+!U5@QdS4IHvrUdP2bZQ76%_%0umlMtLiUW zZfG#SzeAX*2(==?s7E^!daua!(rVD8$4QtNMMd6~XC2whxBkUVP29S9*xBTjTA3EKn2D#m2_o-@%Ly z>+y!}h}8u!!6l2d0ays#ckisuZAx~OI4cJx+KDn1v9RDM)Pz>)t&)Pgr#^Xdf$~n> zt7p=bxv`(h6^PtM?W*xXo9DX6anvX|RCY}M2mS1U@MF2)ugm)>Qji!zR~?$1#vDi; zj5mA;@sa=b?ORb<$jV?rIW0tKJUV+*Uk=|Yx9;TwR^%J-omX0Je-)J{Zl?}JyOJYKCTH`0sHip4;mj&mdQ#4jpj_B8>4?yfHMdjVs!Kt){LPdBaypR%1PlTG`)%fM1_CCGwv`d^2|qQ?1AU03$E zv4H^ks|RinU=qw;&e^pZYd@3QdCQRn5-o$YGJ_rHpM1A{NkrRB=Kt;(Z@Re~Ok)y( zN}k_HJS!y7SjuGDTZ_BQNvwm^E2Bq82RMqpfA`L&H(SSXSG_#6{JCcJS*u8b*B$Wb zkH8Z=O2fM8lol`tM{~%-oeK!{R-}y#wl?^rO(a3iMV!RTw@*Qb+}#jwy1>zL2Tt(o zjr>8M8>lXHy{_7w*i(EEI44v#$SC3_tPrupdNuvl6&4 zew&gW+Oqfg_!&$vD*dYHrJ1BUdRB2s=kUD)csnPnTG1Cbm}l<9Gj`)jxquSUbpKVD z>r!fg%eZ30ECRpRNuCTJ%S#*MH#-Lf$IgfmtSm zo88Fx-UDEyB)yR4nY)ic{>ONd!hBQK2^>`~_<0vgC*3B{h)WPf#T^h%zUsYz9*5x9 zJ~Dm=ib#t*q*@(Kk2V>1MRGTI{K$`e@b!i(3u2XsbEYnaG*$0rw=`{8R%^v}K+UFq z4KJ|#+iKa*! z5b?w_S4emJRJ*O|%C#Z4-yZw-*Ft&KJG(udNYRlI3A^E4J&H5ozn@TObSAX0a}2ER zXZf|oFDa3Ke8}A3@L75zjbg}aobaK`LvbsNgX)JZeL|2(lu&nJxIv%Jd@1p~jH3JcM+`jh+U8Q$yEyjvT zC1g4}6t&`V$0xEX{`OUL`@<^%%Ndts++^Wb1;}}A97DIBmkw{AoW0}rsL98bo7WYBq6Gi3F-C9OpBdeFKcLqm( zD@G(=$62cUZR5%=0WBx$uw6KGf){kv!3!e^A3>S=hmJIGb3Z_SNTHZ2{=l`VHCRsc zhHTVmGRKySaCS)=yH$R#Z^U%VVedR``@+^oMe&$o8ycK#!@}n0Mgbk>Lri|s)&?;~ zHPny(y{Xzf1^E3XDveby|HzZ5-qiRL=2u2+H%`4Bq#X2doh-St%-5PZ$|f|M2v&Jm16M-3Y~5jxr%3z6DNEptTf*k z6WD2^34Om+JRPFlrp-lvVdi(S_u*TH!KvRprTkdD@L zZ=YoIOpief_nVi~XWc4?|2}@%a={1gQ(G}NEAuE+Z!?v|@L`iPHB>L#SU%u(%^8nz zzSgN0tXo;Ml)>^_i=cY*VQ1=)%&_ByP+woEnJH2<&Ey%ctoa6Jru}zi!}Y`7Z0Dj% zuRKqVs3z*oyVtwGN5Xd=F}U-39wd6jz-duLi}UC~;D#z+NHG+T24x-H*4k5)m1ic4pK8j}n>?^ANQU%hJ5~7EX|Uvc zBF3`z0a?T$1yos6r0<+$9C&>Dte$^TsvUFVhYGX)zzUYhH^|0NwpW0eZ^+YC?sSaS^ZeJ z@ruLB>$MBaoQd%j|1`PIRoPq#Rq$6?A6;xdM+R|db0@8tJbn47gGlo&n@(rH>JO0Zwhr-AMhRLEL~7n zKSzwW(HA7Y%rSO}d7>1ZN1_%^Ch9fpdwc>2*s~{Fs&uBNsV9Fcu*DB!z6(fBo;a`n z&Z%KF$9niqJQ;Jmer1Xoe<^vj5kGbSg2}J*2Ekzy1KFQ@sAS_mC*&o!;+{7Z$<{GW zSovQRx^5lclW9mcIi3Y3BH_QE(;H4dW0l>n;q(JSDqM=`k*<_4l@;sID~{DrsQUJZ zK5bihLn`BAGDcc=ru}X|dSz=!r}AFKw_{{bE$->;iD%ke?dQjG`D+8ZJu|1Hs$Q%I zzCWXy0?TH)j0zm6QS!R4(EnX&U?SC*wM}hKF=18ZID#rX z_|I)R{x6ON=$yp8sL}q(L~iv!+-ri0x*Z9ZwNPU9-*o(xv%|K!Nc6LaTd(7_#HmD> z*;O10nXO%FkmdK?M5&;ViN`^}1{gWGhR)3uf_DHWYOiYK(4aVPU4o=e-+oh(ad&H=B zJ6Mq&AM~PtZ~_KW%kcFU;Q5IgemM`pjkPpAiIUFFdJrTs9)bCx@X9#SCso-zU(vav z-LhE~{fyeMB-l#$!_)6ul`T8&dS?zz%=pUe(57BMa1s5^swmh2@53F$y+{6;_Lx0< z)^fw(Wjl?#JTKQvo@tOIY_*omMo0W4g!oPE3LYepme)ToJdYHT{}{pL_DzCAmi7E{ z<5nW}sjBo`Wp{4ckh5-R4X^HEVl6V-$kgL~LY9<;GAU4`O;Jh|M$3V7$+S|Sq!kj| zKo(dbHa4MirkIg>ax>dooko4cUO1%ph?addpuGl)Iy-vFlQs~>$~8$#5^%;Gt({7; z`9)`NIzBc3R;_ST8}C)9VomFR3>85r!@b4y%C6V&LSaQw6_ZbOhC;j#{Z9i|=oYEs zFLx$Ak@)w+!_cSfS!2}UYmuUdyzIAi?vvs^9TAP*^L=$T@^`hds=%QVOE6Y2rD%q^ zrT388)T*xEw;FS0nM(;7Q&7}Q&yTXW8^XArTa8N98pyK;=+<+pnXmho67kBsoh{M0Qnx>8PsP3%bV+aTiF%WlVsVgZ^A^$CnYbz% zwW#>pFSF7KT`*=Pr=#BY{#cwhVeCMD?30l+#y5QPE$g)d zXaA_0C}$#x*&992F_D+Oy1vEWfC2)>=mnuF7l)OUL=v7|l zYdAN%ROOU__a@fA%iw%(*bswx>D6b#xQ^I@6_9kbnfQG9#1+6 zLmUd5dvF_1s)+tsec1PKN~FcU0uUsV9#P?LXAC9MpBj&N&J!wmVxRMgj@(Z0NZvB! zga*vsG-zNS+S3x^Tr8|YDA#j;GAAXb6JnB(?>sx-P-nWIlUjYi0E<&%URnJzOeJuP zd>gwt9!Fed)xwaY9m^7K4qf=3Ij7&4^bFryd z{jxOijRdkNtXw%cxNWv&zcJ#M<96{_C97F4XQN}4rR$#@>J7KxgXv!Hdl$Fz-j{#6 zRz0-tObgM&HYNYJM7@!Q{=63m3D+>k>YBFJH3gJCkiOw+e_A5q$;d<=W^v+66*SLT;rB}0LM*;szOkh< z7%KVaPt^BKqpz2pW^G}>uZ#ZX&h=OVC;p>RXq8SIqluCGKKk^{ zC7rKP?m5qs7CO7-Y;VXuu|(AN_%YO0Zu1IUkWO)>Z+#on0fY*m5C})3(0$3omq6!2 ziHI%}qKvG` z=Gv&!pZa>{!Uq+_YNSZEZpZP)jNjP7WZ(_SFLsyZ2X+{7rF$N`9c;=EI0t=#u0Z_a zZ%I){r3-rhTW+*>ML{_t~3axpL#DmGLFd;-YXlYJm(OMCkqYr@+n{RHXp zCvP4Tesz!|uGBn7LT50DohmB)=)Upy%Saxq;A?$(+vxRTrOQHBLNX4)I(y*u1@Jn#udVdPdzx9``O9C*#E7K;iIk87fkPaJb;DG#Z zXLWf97Ag>cTcz~@qcA-)ekLnTw0Bv%5BUwYKgIh@fLO;9a3lF6SS z@cMDag3Q@Ohn+1$tI@J&%O*HKll#Nb*j02E(fgg(U*6#U^CE)dq;LqnaV0&1&xeVV zy+6GDq=NvM!j6}*vG>ev27k$qJiV8o%#%^`Pn!z>XUqcc!YaPn=F%VSxV!cCADZn@ zYz79E?R1Kt_3E79#e4obToc=e_v7#-OrOegn# z#c%2ZWV+LAMgF3RX7kYAs8VFHci)mFTKCb*Ce=^h1v(qb&0W_n@h{O zpP%hp;A|&S*D3%jCQeV%i?J&<2Q@U!NJoV$7*L1g!PyNi0WDOI3;JCt@*rxFg zmQG3ha$VGml(5|(W5+LlsGBtW*jC7lC*`h}!w7<&a69iishYs;{@-e@0Z)4k&QJR- z__QZ@?Ty2`xOo*OK!x_pFa3+Gn>Yxpk$Xzrpe*#?5QUOAo{T*bV%i(HM(bf8_^hJ# zI4G!m&d11}VfcW_lTYHPB)}p7#*bVN8m?U`%oDtraqN z=RHO-qW?@eH^MVaFN<4t8o-hi*jxz=elt(Hp_brY9;y_Pal0i2Glu!N5 zSOdV}Qy0crF8Ap@y_H89<>5{-n{`vo&r1!e%WS#V^XuAt493QA4Y{8cYMmRLRXC=@ z)(1DYvBb$QJ4~FFS{N*b9=(L@k`CmBwz-R#w+UnpgU03#Z|~?d?-A#jqdT>h9)5gk zEKUrs0+8PTnm;r7yhcz1dIznWbW}5S!x_KM#tKYXAWWFUarw))uZcM3z<7tD`D?=$ z8~Ih2r0%&D)6z)27-lqy{(*j~7>#Lv6aLMlIY_36tu zK%VPOj*Ij#{TC4AIj1vZGWslSZBRbt|J4Fit~0pGV7b`eDV$%0H(*YLJl!uHv|zB) zbcGE+n;!Ky;uTmou<_;`O=4#oAKnIL2wz-%od@4Igk_&c>!X806IpO)M^T**EFWYc z%vwU0|6+bR?^1^ZEo#;uPf$v;6^+QW#qx7bD`4&bG}R+&#tpaPH6QCOm-Owudf6#=pFnF?^ses)r8FY zJ^GYA9Qq<;l9i; zfb7{+OcRByEc@CEWAQ{%>h#;Dh18)%)1DR8>$I~+C2Qlr4eUw$wf`+sF2K*c{x0g5 zI}c`2)EnQ*kcmAq+}h;KVv39{71lz(($VcVFIbV>grY_I?K2rrqpxh1&R{1K$JWXmwn~pMm=bh5goWJ zlzyGCxtQCh-N0~j(^~@$nL-y>d?9K0jSe6ijeE#-mAsLrV7SB|+@fXQ_!prs|E$L* z?0RC~w(vbCcaQk!r5$l~J5~B)&%z>*`9=Y_zjm{pl7|5WC24FI)rc2fzy}}71c?kd z=5HAN;5TZfvhkSVyQdh7gi2I~I(q)n{;daP+a#z^G8Ml3Uh?|&Ch1DcW6gW6vO?#z zfE&1U=2O3ppU+FiaVLz*<~avY*R2O3gm*Votsnk*oSm|qr}pM|;}xu$7zG!|hAx6; zFA5|rqc5~}C_Unw09^{74b9hTZw$$>0eIB$t$LtIkqYVE`t%Ait>t`LqkLq>|0DkL zWcm|k8G4o`P?`t1?WI=~pSl3XD|)!+ZtpqbO#!c$DrI-nbeIDs{ugP*qn?44fPucX z(vM?@ziLl5f04wHA>0rlcpqtVv>p$#qS{fE2^GyyXOCkxqii2 zu*{M`GX&<&!B281yeyb+;|6dRk5L*OE|Gauz;?n{vOGe&!O=y^%g*4!dQKg^l(Abevu%J^4k^UAP=bV*+~gZU>G^|sqTw#u4^>&4 z=^(`4swTQl>wc!oJoqBaf)1)JngsQE*0FJ-3sdA@f1dOSu^%<>_#=C74EfF#px zeIi|FzqcCPZ6|Xj-|t$$|6F)G@G&|q>XSR?zu6GkYI1mlSdqwnjPIm+Ui@_FuQ6~@ zzMiAtqK%JACTSDOh!^s!*z$j{#B%7``ozS%%f>+U0cU@E_viqc9;v|mq)Cz8585E# zh@4m{zkyKacb`M*1Z4vRhb4cV;zz<@+E7t7Z2?mkxxy|t#04)s7=-2!_5uGbo`Tdp z56dEscykUwr-B+W$t?CgzEKwD-u!$fExmN9xIlt@^5ZU^;Tq565A_{ed09J;qM`~y zKxX`sV7Le%CT8TO9x(#l)chG|^N<{Hp>V}FleMKQR^7JebakF#+Y^RHo=w(TX#|UyeB4LaIe@;f2>`VA1`Ugm5K{+d`!NJH+QH@C9(wZbMFu(N;!y*%mhr@-lWqM?p0h@P0YYT-F~6;|u?&KDNTA-m6t zs?zMGg2~%9G(rOA@xoG8FA`5#Pi(9>LO>3XBMtBc6dE8j5u91s=6tYQR2Rymyk+-Z z92k2!)M?W4dt}3RtipYtcx}JRYH_CPP=}=gRIwAbKCM7CvvL@ zr21WC=UFxG(X}-o{?j`zDUaZ`C(dL!9fs&O0~IaKa%OOW%far4isTJ6pl((c?>L20 zGOudK(N5|f*~_E!eus}Z3;(gsuVE>baTrkkZF=|xLnTXb;gP+DLHO3VLVtYd%|qsl z)xZ($v7vtSU?g18B@<%X5*Lb0WXM&G99% zKDqO9TU27W4LKw?{wlI+0t+hKNe%l^^87a_F4;x!98qf$9Z)Dp^#>@jm1*$06?bj%c;nG`BMGe!qb68Y<1*mmu;Yp{-Sm;EX z$aID@G6S9d7KoZshY4kDgkrAJQ$#j(rx}L_rsn@zxYk)R7J8f15@8|yickiv=GV(S zz4=Sj?f;?btD~Zhy0vG9K~e!JK}xzoxmSFpI$=UA zT6kBDhrF<8_5+9s+?yR57ZuBK38T6m`6}Hea!NtIU4Z<|jQP-EQj@c-cfHmN#KOfi zwaD}yxQb}YpPHuvJO2>Q|4Q&$${w_Yyy)uZa=@!^T-86Hoaj1~J@9aKvb>bOsf?`7#iQgzdm~g z#IIiLB&$S1%AbPa%P&*(-}Lnj{Y5xBdaxy@wUDQ__ zv(P{l0;Vs`&E(!X%#YkSe2lu!MN!EQ5&(2-Q|k`I%VY z>H+J@tNH;T$Ii*GjxtYFI`syclU|nDsfcXJ&Z$8HZg*x)Ne0{lVSy@jf8LlvAQ-6^ zYToC(qPm)#K-#Xv9@qE#vfRmXuTz8X$x*+3RBdu`;;2k6?Y}CZG){w zHOl(DOD=%q;V$jLPYnIymE~07hZHG~6nKa9Q0n7;pN-uX8_|`#_UdtevBWQ1>{FJHF$SEnjZ`J=)-q z3JEjHm^U;P_^g+s&7b>0S^8g?N<+`wv7{ft`)A8qumbJ%L6R;RFA`Aqn@%2>UQCuO zD7T211Lp4X3~&VWB;h7}lx<;i&t0#Zn`{^+$OOQJdqZ=VV#zL*6Y{BVw*Bf*2B0%* zC-SKW2y+N$%F8Z%ec>MXoG({!W;sZ4uksJtaz2l{GHGn%rhEMh1u^Iz_1|7w<7n&U zoeiIP=sqjeKoHn`AhqM1dN5R~Z%_wp6*w00FLRyAAA_Cbrl-&A1wB_kzVRWB=Hm($ zz3@wX^n_?B?T*C9>d0NWM|Af^7dT69lF$LbOEvq25Jk#UbB~8on(k1Cf`xatbRuD? z^W#0Xh;pw)Rr;Dqvrv7%2da6*t8&kv?1b7d#u|^@KwiR=k0MlQr7I-0WmR&PmnNlG zgskqlR1$>zZ0xoE(RT^05A{3TooNF4!j?4FYl1d-=hM6=xagl=a+QCqtB(8cp=pr^ zu({wBQ&#eeSEanj{2K}YHE#jBG@S=hopDY}`&v-8rRP@A34d`v`%mgh^40aP%33i8 zyU2Rx=)@|gW%mv_YJfR9tCky?Aq^rWqt}o>exj$6`to(}KjZMmyr+g*m>BEnmqG&@ zx9=2i*i{s82pjP2>8QQ?7Y6e{zm*gF*fBpi77BTU4qN<*8)sA}@s#jzXrQ$}J~~>b zcSTVd{@O-?rGVT-ikvYkTEUeYH9PLPoLR;XP^g*PeSQOZy)x1D5QEu^Kw~480JkOM z3YF6gPAw}6*zUdb2Qc|!7TUHWY{1EmS;T*Rumrwkx&O^AUj>(Z1@No^dSA}b(@aRH z(FWoKg9Ay{sg<X7M##7j5ck=JBwGb%}sxv@^h`8eaX2#`sGyq zV2b(3GlgeGdZudSnHN4LQV$10;mhQI8CpLrNE6ldQLs2qjNI@?Gwz9~`RS9MX`Qxz zwO9H>XY?XS|GNlAX(g8~6uK;}hw`;b+pfkMurqw&-$(k$6<#BP)5$PVRluE#uc?vz z7Wn0k%Qj};2sM`?EWz}jFJb*f#y{bCR5($lvxidG zmb0T%QVq1;O`L$i0CdxP>`##52XT5wJ|+z$Sbqob4^O{_J82ka>4$2-jOLl$3fXM_ zIZrS2t`Ps*6&(27Sm2p1K(R+MXFKQmU5fYcqcR1wtfDe!5?`Nxg2Yqo)3|fe$iL(z zI2$v3?gif@kMfu(@e&kHISR{vA@dx%|>EE^O0!-?Q*Z=;?Lbz1K=owYRBT9jXhLB6c z3&O*a?j74VwWB+`PuT>up}%X8{1(iaqu+rKagV+4EI;2l^`c_r@Yms>Hquu9PmCNy zUWq~8;MLG^qwSi|K_pd&tXr?%g12NDbuQYw-s9=NlNcH7q%bXZeey%RB;&g`_vlj! zNEm3-go5I0`aQJm1`Pq8>qGrLXc-!zm4@^+a{T+<$$)FwM z=P``y=Q(a)^Zi(9_GaVI%`9 zv&{84@FK4|J!mnNbj0q5;X=xTo&S+C`bOcjxqZU#xJ3RPG$)p+?QC zyrXIO93KQ1cGXpX7yU{o#BCLSkFZ;;mdMj)vx#)gq zg1&EWL(i8Fzq~=AF&P_#8kWZj#UT21-vd<;lcNODDA((zzogeIhkrMdX%dvrJ$qpl z*gXlK&fl{124j-nYhT7OyMome{gJqS*={aU>=heRiY6N|8mT;D?=UgFg?W0VM;N#;|$ zY0lkO^Hmlg3JLT$%IHNA<0aSH{sL;cdl5=2z`v~KhNQL`dEu|MKGyxM01&Brsz$c+fKmi>(`~ zy_g%Xk_~r>@xMYdxmWh&Yydm5WuuR(AHG~9&|F434Qelk<2kk^MTo*~AhBwpG>?d3 z`P9FE0{AQE9pWiT=P4n-`3eX3B@yqUz7rPC(VsIIJ}v#xu@~cL!sT3V{9>^3UR3*m zI>n$%N?;0jbFHNZSh15!!!cS_X0Fsi3OPTyK%RlOw4yTH%gAeybo9;uo-8_3sG=0o zC_6KcHY>8v4Rr#@n&zAY2e}MFVS$k`9(H*s9k*nGDea>U^C^D*kL0%&x}MAzuf8qy zFikq>6FQQ60@s6)toYHSRay_6S+1tm^&NJ;=lJzmQ(W`Ss*n4Je~Jb(bfZ+F#FZFG z>7fiu6IT4nUjk>CeG9QJ{8NgJ82Lh1j8Yq)_61^oe9}@%lLg@=#nVo^1cYv=V_^fP zXj6+`UFpXz6-k5SUI!NUBtxvnrsvD8A0qjc>_)<29X_)?mkh4>6tm@#^FT(>h>R%x-;)k zgz_``R(pRoN)ZAk=LVKpcIy9R^^NLkXT|@$@_EGl-0x%hpTm|Kp1*#LRLwLG50e+ca+8RT+kJ=0t?PZSk^ zyEQx7+~NiM9hFni zfNJFN($gpHTbh9iT#NoO#$eB;fQ@Ufv+qD~O`ZiY$aY1!#EEhE-D72{lP&Z&0JG}E z2N=X;e6B_fuqbV!l5a@uu0ZbNvyYxDiA~fXCF0opO8NLDFKqyUufnLo^CxgBSe4Tu zBjGXJ*?#S*U;P@HqOixRf;;LjIh)yb+-Awp6|%?Sy1nV@Xy#W)_mR17y$Z7aAKLX7 zb8f$?!V(nCK7V{eT2p;w^Eb+<;k=>u*UJv{bwc0sMDa7AJ@58{?XSEc2#yALf5#7p zz^ySdato?>v+?%Z6>s8E3A|+vS(|<@N*S=1!Qsy*m*c(;)MQ>$nR(yDouA7!k?(b%wICGoDj}z@!38wP_nk=A7p1keT;u0@o|S^sB5vHiF%-RoSD*@ zx4ok_NARB~E(dgccfrNPG%zAYqGx1~nVieRER3inkfa^@NOu3V)ZSqQheeJjrIG9_ zaSuBxgS(z&(V>cxcT?qm*k zM-Ef8f3(LT0OC@vjYX3{4h2n+{J%T)7elrh_F|(>Chpz9baItJHe}5(b{}lhHwGwW z=s?v+CQ^EH%zbEoo4Y@EM}IT|F@Dvq{hL24oW5mJV-5j0iP^zs zG1#}+kK0~oMismTkGP=EJ3|*JIABT_xk2}^$WhYPzIQ{IF9{DHM$9VQj;;67QQmq( z!%0pA$ea8J3u<*_Ku-9vk9{JmJIyjJe+-4$Da}##t98Byb2EXmq6ji{yCI~iM=F=Z zs0wqnjW$&3fj;&NlFVP?REfMV&!V=u+vAgp+QO2bzZh^;Y%s%4;O76a3P_d&0sw8+ z-)4fw6InWY?3(u`B#UI?>o1NA@M8 zO-+ZAD3e5NObFM_M$&a|Gi@RkNOrB}E@GajW>~I&7$A_7T*rRaq}y=u>_pWiSk$0T z;7}qz9Vf7Qo!gFEUtE)hjtB8NO^!MZ#0fu8pXE&xI57ZAV?&Q;iI_WIJYDub54kx5 zt#lf{y~;n81Zu7X_NuPX)6n(F=43wjD4z?eN=!(*&W-+)X4X&Q^}b#LT>eA^99h!r zWKp{Jh0zr4`h02S!GFnghQ5vJj}Wx?^0KsN)W&@gtNzha&pUjpVNr%7FPJ*rnyu7c`tJ)s;>!8bEjC z#*q;-nV|7z+zi+G!VmG6iRyN@O!Nd;_X3YF-s1`GECtn^xGe(q1Lbn~utB1xkI&1+ zPka5k2&8a0BAV>Qx>Za9}_H6z5z}sX5v6% zsZ?-`XC|$aLDDhP)uLMsnFwPickb+&i_GXUwMHF>fs1ddZ%pivUrPw;IDCJfxu%>k zDn2)NRSONQ z-*zZq`_8`{U&_c6b(|nioehp^3mwvZu8&8-CRxiM!h>YndZ0^h7g~F0Y#&&Nzi*-| zYY3>kR($KN*Z<_$w_!pP`OIr>Cgf&1Y{%Jst@e8#cX^|wA{%(0F5#6+zvYq7`eA>L zU9-5$FFv2tec$^}mT^e1Tx&);|-dQFYI zGJq&b%I6(l=uPp@r@?5NCoDCW7IN~B?R>F$44Gu z9ufw0k&o)*YR10s;oqu4tF(RLQ5FZfKgKU60@;MD72QPi;3Z0Cd}5|5e=SLiTK1G~ zil;yN1r8QKK-&Y;*VHI~I~UEU{jCSr1@;^URDQGo%+3zn_VV+v&*zZ&(XVAgg(bH* z+|77R)2zQ}XkRx`21yWn3`Ia!E#klZB-&v`hYBMk2o(v^aXu{n7PYj0$0fR@`D_q> zbx|j+;g&x?8#3t?iY zXmH!%`^>vp8y?vR{f*u~3Mq*rX!RuP`ya{wqXpoEgHyzNq<#Pz{XgA>>*advAA1hq zFXt`nd1YFPqqTcC9z{H}WLW=L&rw(Bq2mBU7Yg3bH}X~Y$t>Lv!GouS>GQz+Wr-C9{)CKC9Cw#dEvS=bG%b$&qH{^ zpP@07lSG){#Ys)pDZQSdyA-7>2Ni}wJ^|T*e^0#}qp&ZGFoyyq zS<7Evbc2EOZ>=P~U&_}^`K(_E^R?sQmnaJE2~J|fNLtt1jVn(ytz2U7MewveX5!B% zR$67?C?PZ+QXClf351_t$(j+;4mG$y6Z2IN`OX~vFh}6uZL39(Thg;o+W@e7sp6_k z|NexdkCRa*7Mk}%ZTV5y$N0zHQZi+sK(T3k#z|m(caNE#e@f5i7V_+C{Q${F>(=K` zm13>Z{J^Te^H-^+jktSWGj0eD~GcSXi<_MjI#OP8edIU;c0isGnT@4<58( zF4!@L^ahUDs*tZ*f%*zF{pg1W?~`n+mc%(6-3pOKbSB{VgG<%&7~NO= z>)iorp8O!tjILX z2zm13d&lcrvWPw(u`XYtu;9|Vbecu`+S`DQGi8aUQr&XX5Yxzql=R=3a0fH4VMD}{ zvqz&glxn`SsOL>wR5Z0TM?7}xbrAYl93`}# zhM71I$bghsS~?|nd@mqpfDAl8o9J>jD#McEp-v?}b;_k~R*L$Zwc&_|^17D_FQKo- zozzGPnYH1TePxi{83sojN0H(}?Do1#P0t}{r6(v7LLTlTeOD~7zxzJE9Qx~*3N7}x zfB~vbm*Q8W^5hangk~0d{*+i($*7r2()7i(T_Z@?fnz~y?Zf4C(m*6Fp@S#%Dt0+a z?Yat1iVD8FsyFC#6gTY9GQ$O~N|yN8S)=aYjgrjQCbk{_5Qfz%eLvqlxvEjkv{w$= zjCzpn3vp!@p{uIhn+zw=k^u(o5|#O&nrc!rB}&(} z%E&&TvGIjHDo(S8s@b%@(h)0Q_J|(HPZE~zhfL-V()HO+sG{u7#e=g=`{`}F3tK?@ zLW{flMiyIjTgMZN6z6Wb<74d|YP9vH0a(~+S)__iGq7L|9MUm z05bj2CqQ-3wtA#fmxE4kwTNlLlB?e=R2{z z{Fq7V+RD?>!Wx-6bl->rf6gkX+wsDB8k?RReHg!y9=RdAqvG)vHS}5;?e_FwdULK1 zHz~bh;kX3@ljxFRkhG;xD%C>;(+eVAh8Ix`hi*y)D+gx_A-PwJpr_CgPl9_>Kz7Ls zMiK!E9>kxE^Q8#D0kM2_&8IS*uH}R{qbnXk$7r=izwhF75LE{UfJ#Sz z+aZy}d_9H%!Kby`Iw}7)<(zJ)Q+mEp5d*WP@zewiNy7mmk{LzLEHjTFR-3*kh(9eW z%4=CLEd;B6p#^{(QBbJfHlVf0G*;?*tfl`V1QbBq1!Ffd z*{VnOSx8`Bj>G?0TsQQpQY;j^z*s^f_~)I9t0xRoGtC&N(IY-7N^!uwla(co0G-6} zXW5qd!uz*XSNhv-UC(dVJDYcko)S8mGyZyV?Q-W{H6AwkISGbX?mubR^&h}`rqVoq zNw>%cp93rEf4t$b0_S92QL*^6xGD#FUn(&hN_}Exf>TAFHmZR7InZ3l`OrogziekB{GCeyt_J#DFnD_MWytC#;k=OkU zJPy4VrIJCPe{a#Mi3sgvJof1OaT5j@wUGjD?-`fEKI|{n<=i@2+#6aErsgqbrg?0w z5fmB$k z%N%&MKd!0#{MVF4a!V+n#pJ2eb^6&zON;&&VBX0rfy%LoEoye1rLFlDNpGnNz0K`} z#NneJOXZ-%x0&>k46KZ0_)8Nrc+neuRR?*=&(KW!C-l6&Z|$60_vGl>ai$`ZLwtE! zlq5{t>j^xYgBn+?)QML)B4jxkL;h+!K zbal;26TBAO(*6qLJQsstC2zsAApBXA^z1u^+e9L%kU-*>GAn8M?1N~cG&t5Nbj#xdzyvJBNdoA{tZ z0xcJv({X*k%_ZHZ=2jS|36uGWg)awL&`n@#OE~wQMN6K-fuTJViroBOmiZBEBm^!I z&LAs8Hl8@_4E(N0{blI+oQi$d7zFf1 zgf4nCyt|3fkMp27zKs2muO<2(Lhd$~B7T>qOFLNkd|_MMS?Bq(FPM88l@sPg3(3EqbxEg?`^F;~mgdt|t-ThDy1) zVnr4a6^u3lZRE9j9~bCh5zOMoh0IL@{c1G>P}3LOGG-nYXTbVbBl2aydbuAx$3r4y~({$2l}kDs77k^lqZk(`cfpp0I0`%eJKJN;4-| z<-83_aNiY}Kh3o_@(6rPqxPX3y3-KCu#D58j5y9`Ks;VIh3mzM zQoac^KYX$?dNX`(%qvLuJcfzj1`1aK1Ue|->CF;PwC%ka5j?*PyYK99^!zG-kwy>- z3?h={Q?mW$elEY0-LlydQ841d7X(3f6yb|w$jC`-I=9U52 zM#h%T8!fY54;vnCalA7j{fKbI$wUH3NOCPHOPU;=sJZW=EIBgwuXzJs4W2)LR@D{l z@nyl#KSn*csjE8RFcC|6PpAAOK{Py8%E%cNJDy4H~PvU}!6lt5eO($eb#mFuNa z=^DK>O;i@$r|^hQuA2PQyL$Sy#{0`j#nHf2MTuYy^@lXFkJv!xKTDzNiY7IWmWM(W zkJX~<{$omdr!Npi`Fr;nq7@2y^DEU5J3oXnCA6$~Tmo#jxW6T!IrH1#WYkP)+(_s@ z9l>{@Y|xHRCDgN#dC*z!tAkTZ5H~`Al&A7KtMoHEZdhScgvmdoN^O}A<~WRq6;9j< zl+zg2t2-U07IP*Jl2$^TJpfbU3?K(lRVz(Jnm~i5g8xoFdUb%0SdIG>U3->^j&|lJ zj!MAlLHnhw%RXn@0SlaHTw)M^zo6&luI0#rftZO3bhYy0o(nWP)9=we(5Xi%0B@bj z>`R%MGe1Z<0p329QtpA2pP`{U4bovi5;zrSs##0r8d(*%%6mkTX@^T-73I8C1D3Sd zA!`-ELG?ap!bZI7j)8uCRGdxT<0fDR8|JFiMXT{M*|p5z66N~#36C=WmBtj&YA>~s zNlVay(GR9^HtvB*2?PXECiXQVQ|*#Dae-lRj4+b7B7m3%A~t6OXFP}ETI@;n6h{kt zr5bZ3Z!TkSL4fklwsuv2cPx2;aiRAZnU zA80>TJ(!G-kO-{muZ|16mpn#M=Y9id#R0aiNew+m3dmZkN!(1^!O>Sp`j6R|wjbm} zcY%PCdn&>BG3{rtw;g?N#UIk7JT;~p;#0EH`SAe84eg3yyj6u|meXC=_7o_Cbo5>Z zR5iX^%xZr3AGQqrq^zQXVH)Uk0^ruSLVCU$L)zAt(yo1NcbR!9WJqCaf-p#%gDZdZ zR7|o;n53}7Q`e!rwv)rYb*N$wK~qM`@mHpWl*K#Br^568KcSQANfr=()YsPW3}E~= zKPBs@Jo5IxhZ6x>Yr>_io9-CeH{1faDW%Fq`Aj4wU2TW_&8#e>aVJZS`*mG4djMK(Pj-R_+~|P<^xSKQ%#Wz zLs$)mZM~hF^I0kqYm1sMRpw75ms}5RwN#LB$f*&#lxY+3+<>~_=Z^$2rjQqqLtp=U zw^hH=c^ho8&*}Sy#9tW(-#w~=x-YG-#!5o*!{f)rAl{;OZj?c7ge6#(iXjzPnT-rACmZsqzXpTax$n1dEUjlhccC+a zd1Tl4Pcab1%C645n9p%6tWoq7(%(WPTx^IXIzmxQ+_3{SDbJpctX{VEXr4%`G!`5k zf62%E)St6{Woumwf$#d1HXD!?*l{?HfNt_tzF3{-J7A(+V7|ik7m^kuS6uAhi4Z74 z;y!O(xXc6W{=tvGUG~ifaZ!@fmHH^JYfN{g(|XCdJ)_fR!l%B-!PXI*Ts{S5i_dih zKD9Kq^>Wn$1{vn&;deu{$I}LfA;`qXKaWzt~Iv02xwPn~VZoygP)H=)8mR&A1GFO4{wyS$rx4^F2Bl{gXyHj#0* z$Bl|K&a<}K7Knk03tf!Cv$GKzSU}_5n36=4@YU%ytt#@dI9AkmK8NTF8-Eljdj`1 zSzi@*^j@?SaX7M3VZpHJN_fHcko`<_d;|%ifF2lk`HpQR(v0jh(r(M=8jd2PV}5*y zt!<3KfjHInla^GLow^8qp`7duBdabx_2-)Wo?YO;e6*NP+$upisr(7%aZuL2Z>aI@ z_+mfBC&xBKic)mB47Mvb#DgR=leQ9XMqAQVyuLJPshWL(c1Bm+{10E9A`cdmzyp)$ zdr-tRrG`(qi~$}Yqo4~2w3fN;E}pYpm(GgQh-5YP7!6KJ_u%Mjti5Y-aUY3A z7#YW(QM1CSnYcRl%b}g7AIg>adNa)fO_!Y&>sR&G1VOd1+C&J#96BX9DJl3})5l}y zAWAxym{`(=Gw&s*3F$(4%Y#D>Sm-k)(?qsdc||ayaP}l6_UwDcHya_y66QluLK#TV z5+*hT?$|F(hd^))Szt!lF*B|rMUyEf7pZ(TP;{O6aPed{4@xojFQv<=efZu znTPD3)mcsm@8?vvl*S^Yn&gB>zJvYT_a9!hSEzw`GGXb#4+iuInI>GYN0ZT6i{R=Z z;@39^_Ro|FcH(b*Ph`7vXC&SFC3!Ww`dBk#ElnxiJnhx(I4NBx!zCF5T`y8DJ^Kz` z+ghj8Tj<$Cs`VLp^d3cF?xm4-|K`MKsb7COO6=2Qo13~7(8YyW!bz&zYc>tDGwxOA z*KFB;WsuSRA)mq7{YLC&cpIy-)}ivM)J=$CcIzDm6i$e(gMi5VYO9EXz!ut-xwE`F zd~2pfy|e;7ueJ9mr1sTn_JU?+`FeCs`+^VyMVBY^YSR@H8eGG)g%@S}Hci`_MJyGB zTF;>Ms?*%er)@dURPZgQV)?~ZuT7_LrKaNy9Z|*}5cIwg1z4@w~ z?S9#)ezud*Ia&WPM@eW01_`LrJ0A+6`M-M=ia_y#cNQ)B17?omkjN?5?Nl1K9gCai z-QF(G-CUvY-3QaBLsgpJE7il@4Z%AwMn@W4#a14RDs{Use3;=;EsQLotRk>JuyNvV zMpNL5sK3Nao|SB`ndO_WaA-}~I(AJk1JUerml;y{oLaL+^SDppzFpIE^&`IOf{r&U zRU8oX%_IB*TtT{-H8~V+VK{cp6=`?B+A!JMPzj?X+60(u`Byvnn2ox{(N*f%iooNFUV5Br zJEmAg!+!2R^AAW4$)da{9EYuBs|5`*q_wX;X{c8WlC+#uVg8nZK;duh(m@EnaPH9~ zz{JlM!>d5QOkLF3a+^uQPG3F*8tJxaHh4)wVdHh;T_2X} z%AVDB%)cm7jWb!WNzhLF4YiI6eo#2a($Lb3QZqGA>V=H-&Qy+MdzV05qKEn?u7T*b zKyuIIw$r^hE)yssw7n+nq;mB_R2VlSnLsY)8i?!cwkj072TMiiJbA4)bHKfO8n%9Af-ungN+P-AgP zsj(oGF+u`=)Zfg;MgQU$7I2w4u&)a-q7%$%7Q3tnm}pYg5Xq-EShpAuAw0xv&>vr` z>R}J<7}Ht!?weFRAsn}u@%}UWnJG!viVsdc!tl#T+;=J}+ey^LQL~NwVt{%l$CnSC z4b&JSgy&ym=;^dnk zobdd0@M+NR?+Y{{>9omya^hG7d7L^c7M*rC3|KJcB@0!1Qg_BocS$d|N0Lqs zSMFCd`6OPUW}lQa-%#3Mzf%UG-y>xv@F(A^%i%oD6QvDto3vf^r`oYk@9vA`E+|Yr z-CsHFvXMUzrsv{q%65ooD*t0(pQpPcW&wSPch`vy0fGHxlYtmX30mVp;mII|OwC@M z?O^2^xC3}-Jv%WlyEA1Wgx;O&W90DIw~5zW6K50t>YjpW`UJMN1)_x5`7P6XD)!;M zA0s0?w|WNmd>Z_dZmE%t{ct&xfI*C@Tf=90>YKG6wY-

ir7Tuy|ElSXw&A5|Z( zoPKhYhXg$a*XqTyte#prr)bQE+jE1rAO)XhRcEWWXrr3HBga12ti$oHOusZVHB+#Uj?Fxg5^HauU_iLo z&VeJ83TBD9>zHHjD3(mANq={;Fd}}(R?%^y^7f885r=w*xwQ6s97Sl21EGwzvgpbG zXaS4@;J}2U7z#m1Yy8f(qgK0@Fql)}Z`6zjxi0f8&T(ZMuY(|Bg-uS=@YV|ulE-&) zyYx#du5_w5lk7dWN4ABugE*^^s!r(kcpJ{eosqxzY$MG8-{Yo!p?628m5OREAL`lGiytBSNfD;~` zT1C}zB20Jpsniq=(C{e-$4kLobSJU4p6>W|SNexGYXZK$y2rPSG zl&sN@-E8>ukO!5|zFz;*YvFFz@C4;_P3}{*qYo%Ap1e$?LKFTv>}>Q+3K{&~^N89R zmcX+02lK;j*}Wz>)e+yCp}1Et&cl{NcWjb$upAiGYZaWJaHb_J$S!m}Vj)Uz4P|Po z4}y8&hdtlqth=Y3lu5h+#hBrrr@!RzDG0_+Y!}51__*~b*JXOd?i8u3RF7!^bD@&F zJobixVWx+@k+f+6`Y5**xs*goH*KzfPY5N}qKsM?vZ^L)3ul~}-Q9PTS+ee!S%0yl z^(JBOjmb*{tEVhC6`Zg}27rEY?Cvfi8Ka!C6D24lsnS0`FfDb@XXs}14Rk^5siPvp z9k?Gf=_0M4Q7|=eWFVY-G*ItM9e6g2^&_Db3#G)p6`vk?XrQjl&Xs&S%kkfR&p9>3 zU?`OQ9&6~&X<%t>W8+_dDOvBPIiuEIPIzd`GczMvy3Hzu8djDqI+muf4^{Va7VtT$lg)3;- zCEOjL>txji%i2=VUv$a~2t0W^^SWM5@aRt>U;WC$z2A^uLNGZx8Av+zt;AQdbkCr= zqX)T+%;naN!sn&P*^q2n;(p3fRxzm#h5PbW8Bv<%x+pW{ZisCSk8<($=W# zs?9ndUppNahg(=dne7|FkBc z6XT8D;uRf}St|JmOsHWVj>=2A&|-54O|dWgMKIYZUv^h=Qova(-ao#YzCS(9NabQ(d9sfK6M zy|HG-iDASZ0fG_JS2eTvm{_nT1SW*Dad84E96Pb)sX3o3AHPuWN2_Og z3?+J{&kzFA;Hj_nf#KD8{S_YCB^5XBjeZu@BefOVia+!`AaZJW#uXc9RGhAicSCJB z1@kIn!%ybj33eiXDm&mHXy2tRI-n*ULPTt;R1{f6k918KR@jvRny8O$ax_zz{ zZ=?7lwr@ILI;tF6vSA-{N@r`U$tChyQ!RUEdvXT^Yu8{@!a(n=arWv4-O^aveqH0Ngw-gEYi(|CvyvbsSJ zg1I*=+(Sl*FLxMJ>kFZ;YCqyddP5;s`g91L&B?Znl(cyQQ=(ZJzFar%{Ndwwy;<2a zdd*J_4g6B}ZEK&Z2b_`wzY4!lTb?5l;Qy401dRl>M!I(=x+c z7GIFh$JiU1`PQYSv@RJ}X%*ko&9xyY@zA&X?l5{#93UgiU8i(A)JC|Tv{HYBp-NW_ ziZE$>8n)GN13{d*uxN^$7|v90rL#d1fJ#HmV5e%XwySHGqm=}CzbSH&U3hx~MZwMy0jc@T17^%R(jt%a1MQ%Qjt@GM#fV2={zhA?#p@_C-DUm1tKVf?ThY7`)+iIAG)rM$``{ZDq_?=zt8=rP`P*nRzlLnTD zkotBX(fDXD>ukn{&_Xs#<2fTZ(-{%j27h@}Scin#E`P!@d|H0GVj0H}sEV zm1sTsnJx0iOZP*3sG{+JITz=*GOfp&<3+=$GBl<)6u+X|IWX4$urVb1;4le(eU*ck z{xp+PMR_xKZ}!-;D@{Gn<+XCQV6T~L9KYPxGsm|6_P_(I_C1~@E1MC_o>_KEciUCc zx;*DB?tF(=udEAuO|#1_Hx3G(G=7nwa;p0%(+$@8&Q50Y4(x(;iM*;zo6EQLEGl*D zfhOJIe9#jI1q3FhPfWYRg^YJW$1HN7O4tLn%t``PJgWXNehMqE3`n8T1uP9n_}-7$ z#6wqxJV<*lTxhV9i$RdMHktx->}8*+>Q2`3>Vo9M4Rd8@PYJ_$C;vg7KbEUvvC8a# ze{Fsn!6c~jayV1DlEeKb^LAZM!2GUY^kB~X^T2w?88s-{HjSjvm_3Bvo(|DcOj<(T zsKlMMd|Xp?Mmwfxx!~Cfxmq+Yy<2@&dGiqy{7;fWxi25Qpb$K`U*n#~&GI&udJL;) z@Ib-^PqOp661Sd_1NBGb7E$9!y}YV>Qz1xa=Ojz{G=yR<{g)Tz@W?emCib#gjXN{c zZKQFGhr{q&(tVyuj6z*^>v6u=j=TJ`DE+ynKYQ48FQx#Ki0kVoDh?;pYZ3G%=FH;L<|>sVT$gpg zz`O(ajPA8HF-Q;*XOA5Tsw_vzbNLk-C7oo3+?ukYo~l|22xjDclw9%=g&-Gx60WDU zOh2D^1vu;ArrH&i>Jvjn>l9DP-!9)u*B47hRuP!HQli4*>xo6wfUKHy_o`^e9MHS0 z*1{z`5PKg?`xbN*@4M*&kpIgkf;&$~?5cXC3R&*^-TtWSG$05cD*_NP zA0bc(Hzpv|UboQr?HXI`GYok7JO>W@)$)ip7 z(GKYnQ&0N-!n)#JHpH86!JtKaB`iJ1h2n%selGlGy>1+YC|v!?5(E1+WgWeV!%)uJ zTHPn>J$WO_aKi3aAij8uIRP-}M_fWKqj@GBpEQrPU{URHhh_p~t95Of`lA?>2{fZ- z%v;+SU!D^4=k{bGc%!Pbk+Y!VQcXc1qt7O8XPHTO6a1-rcx>6a&W(ff_u`i@ocn#t z++qxass3eod(_VOg5REYHvH$yc72K@PLEt#OW1i(>iiuToeie}rkwk9j2m zzD+HkgKP+?uV`UUj?MEV(i`Pkz0N`;v(yHzg`lXkZ zGUT<3g|uILaKg3CJm4+=y-UPyCh8`-?e-e{z@WfbY-96EL+8~6DUB&rXw8Rhjza|q z+0J(2h1REBqvFQtSbtaXQYc#7$r|s#zDa2ua>Vxsbwkg5-;8yyoiPmM^=`6Dd`Ld~ zC92reB%^DYvPg}UM_8NrUye8Obj;hAer<|B7M+eu(04R<0}yG@%LWqUM7KbF^z6wU zvaa#z3d0n7WG<9Y#^jv=;Mi89o`ucOEb{~i-bpT4 zCdPn9%h3evKrzegMX;s_{DmLR5(!U(W`BC%gLg~z^2THD+m*$#avsn3uh||z@+2f}@+;}IXd`EJpJ8D0; zj#E^)TU6hEI`I4sqBozNT zW0#0yt=i9YVeQugfUn!f6d|r37TUu_fTU;+3>oJ{4?IVcfFO|>a~BX?q(JpNs&@-Y z%!8>2-y`RBT`Wqdjbf2VskKp`W?;8K-;Bp#<}V|A%D+g7)rUkJhOR5Rz#gU8_^j$O z7r(_xv1V2ZHtd^sH>l)>QZWLNBSVkJTtN9ej6+A-;Ix7j-JrsU^K&-&T=h(N^O2>Cv_RG&~ zY$~guZnP7FIW_*^!s|N*>XfDEv}oxB>>RaSGORxQ!;n1FO7uzP3|wWK1c`_V;Akw*}93wO%tjfjYH`K}!Qn<0X-l&AW!;cK^Z0#ylu@z^s-W(p%jQGy-g@-t2e)JP;_9@T__d8-3?A-j>ZEIn2 zWCvSW8Sx&lm2dbQaGrp8UuH;FQAR(kSN3BPX z;afYqT)7X8g)9f(AJF_BdX;(O^UTbss~6o^ z)2RI({9HWHeL$*^QMqy$P2AjGbv-~0w!%QWshtRpI2qyCkv*6v$<5byqH9{}Im_Nt zs%ffY#P^%Y!nKg|r*f15e;tjV@EUT&HMQ3ISr-jXd2aRHEVbjU9Z_7I$E^Jr9^D)E zW;&9S!rM)D&~UUiEPGvBUVdX=!bNMTRZs4< zzKVnAqq(AUZ-KcE!)3U`1n$5Qb)^w1qj%6mfqZ2P%3kU4Vb#dybZu+h{Y}s4u_*RJv zOOm2TTwDpuZqs-90UymNgR-IZqM&s}5D|BM1QBwHReaOX)2Igs!!UHA9p=UUMHtUF7>bTK=~uG z(27Okan-lojM?l(`KULkVHeCtRvt3z0_dmhXe;+&hiuOs*%Q>zdP98@dMvqAwJ+7` z<`sa~-~?yfNuOTO?YNOm-FkcsCB)qjFVh79)p!|<_udVenQb85SE1Wh%#hCk&E!y= zF^B<*E?%=@VY1?obM9Y3T(ia+LL6_?*XSVb8-2LR;2TczaEZ0y=q1<4HTO;FXp2LNBcx6=} zyW1n8@`&~|1wR{rcfA4LeT4da7QwT_gxGxwg({Q`!0oJ98PL>grvF{9FXXr9MGe*u zO?K_EmF*NEy}kVNtkbS3jl?wnC`ARhV;6x#8CCwixO$uX$h(Mj_Ed}DL6Fx(e?^n# zLzXxwGTpT!&$Z0Vda3MeE94{JuiGVC#ss9vfcKVun2}sp6-PJ~0sR89O#xMeCba~h(29(CX;C-3t)orwd_f1Z3O8LYP1zL{FugN=Fp)i{*Pul!MHTJ6+7~?ws_g$5d zCnI#(-CMcCw2=?Mf`AjuR}T7JIX1DT#3d$ms{sM?@IH{PqUhV}q-;9}NO1?PBw93M zaeKjL^(%mQN;rt8Kh$5He;*djCQdPsS!cbcns)F=NiB9V?_R3FL}x#J98?X_x$;)` z)+$tSPy#;HcH#DVXdK&SqGj1zrJ#p^!e1Hj#`pAbm!t~2eSWlI`!osR!j&Fd`74)F z;5`+#_|=frxFojXuqbsp9<_Qhy>Du5rA}!KT3`A2rbbflB3yEsrM zm8;~vcOw2n8;jZC5M6WxFmNXUytuFaHbW3($lO)3G3&=zwDgm|NQ#=_D>P#B?8|wQ zotthF^?iY(uVBX(BSt6;%8>Dft&dZWDXSnR`Zq^L{GSvRI%$>z$7u7{`TZmTsDScM zcc_WG<;GU&G=03M*h^M(^buE>&N+eMTcK$#!nQIeGO@{9XT@p@&8%($YmDOW5L=ML z-w!GNo`xMO$4jiL7fFNBS#d_EQI;VF<=-^&3{yz$^6=DcZo)gp5D|>X_wU9jG@WXW zcnA?!I$AgEGpic@zks{HK+w2KQT z<_IP4zTpmnTqpno65MFp`bAKowYj2OwF$qH*nQ!#W-}C!!u-~%KoDBRD(-n1%nL=e z;V~#2-^_K2YG5c%y>9>4gxR;esLk9JNwRvr@nv5W=E1L_{MkgB*l4?WK}tvUvrAn#$YfG=UZLH zMS@G-=j|`v-!2|Awioc>5w7jxhs}GzTdVaCdUqx+nQD^gSHF+Q8>ELxf-&g6(@W(LjSt&aY%gVXw`$^(TXLM# zElXkCC6FB6pao|nj2)tm$O(US+Dq?BdV!ZJ3C7cCD8{ju@Pa{rReaf{ zzs(W67s>Fej(6iufCFQ_Y20x6^>OzTEFQb4PDZKS6csv}tIX|GsedwmbfU_}Mtu(N zRX-+`g%bDzI6?iB!KJa!7cae@;oS^R(-~-;hetB$Jx@_#?-up0+{m>)orJO6Y5Z#5 z$7eN&S$uji#MMu!SZtNSF=q|Pb7aFj>02kIAoW3Wl zO`M_!oF#v5e}uG0dccw?m3?7(?y12mi?+-g#kplSZO^o1i7mKqDlhJ^?`-d?G^z+F zGPa_oG(Fj1Ji@!Ley(ISZ-?yrEkdlGj7MkRcZIDn_MFQ!q*7^;fb{H`>Ag`5nBERi z{kGJAnrBfCo&7C1yF|jQ{(WFQ3v^XG$yIWyfSrAtwAX#bZP8h5C*br7JWl49d3;*f=OUOOdj4qd z7p~x^+}}>%x&|~c@RbFT)tN`Hl4(B{UY?r^<=Twc2e6VMaYUH-s(k3kh}P1bVd?Yp zZl5TvJ||~AgZGV%77yae%Q397w8DNHSXZWUdXOF~2j~lS%E+MXkG5lcQMXyJ&x&^f zbRjVT!ZHv)6{Afcd+sYlgMQBRxYXJ7p(vM$3g$UvqrJOOpZ<}&rstl()up)+qF67h80V2DWMiKJqT`dC3ze;&j!J{*<((KT zf^af)@QU;c%E!W^E*j~(Z9l+XpAIfAlf10-@kBCK=F&yr#Zp$t>w5LbCY2U#*)ut0 zR~Ny6D-|3QjZ36ObI~|YzT*#LUxiaKgVq)AexZ{ZCk2da za@W-l_$2=lkcYUa-L%=)<<|Vl$TP@t9Jw(&b|5H-{xQqahErLrC=vNEW%4vMH7cw(gVYLl6`Q``;sv#=B+An_f^L- zfPv;a4zM@tqB)v?fq=)9-{120sr@jyP<>1cgmR!y?;7OxLTPDSiNL2paH4S+F@p*0AybB z>}U#9|DEs`_uwSyfpkszg<`h<(;i9*3+2c04|ZI=xOVv7ew~fqtz?n zQ<>q1CdSix+&Prp|8Z)dwYm61&uyCkI)X@3`8aXl7^`;K2_=2zb^Eud;_ej_h5VfN zQ>$~g^wS(K=5$rn*G_C>HDd+yjyO|y&cAlC;d1QF(A5#J>$i~Ib1TiTu17Dd+&4Qa zVk2ll@@!F=U7XRo?Wy0A5@HcmeOqY{2j-*nF-Uq%-OVH^kHLInuUfHa+$Zo^YO)o!i(uW>!@T6s@apJy~(3A-_PrKWz=B4kHYbz_8} z??h{8rx}lmKJgADs+v&rjf=J3B~R~86Z{dWbj`p7Wt(*V?50&T{*pZbQy;_Y3d?iO zJs^tee6s66MWttH$_v;vO||psc8XveNKvT^B69JeSs9qFb`jkD=(r zGiSmaV3~tCA;5AHP-b>F?*wkOQe;m>n))JtbeuNMv|mK)o=#m+h?gs5 z`dsYVEtR`W&CeW5UdvQ) zMfz-e+QNQQyOX*PN&teM#O82f(nh(SR!_KIEXAaT5<9=RO=P5(7Mv{bXL&|$lU|37=r5Rd4hMAmYZf-8XI_zB#iRud|pzWxRjAeXQ53o zwwb%;_W&`E-JpHk^YTFLT&7h2vU~9CeOji*@vs)u>P>v=y;7Oi*~u^3rYb7lUJU`Q z69BDv2pTTxk|rQbQ1a3aJsA&XZC@2gJ5XsCQ$bEE@ym;Qpq?C%@Xpmq<79u)>NY_t zB_@Hs=c3>Vn!i*xE zhYJsgI^}xJk-Q@57MMcsv@5Htsn(_aT0cnAb$XB(KVYNfUtQ}w2Uz54qIaUUqLs*# zHqln{xd`3jm3e>own}nJ%;5W6wPUM`<5z8qX5VT?z-6u;Jc z^8IgeRd4RfX%6&%3*@56j~s?3r1TGA-Hk769xK({UMr@6RSQ%&Nx|E|T+eQx? z`}AfPh1>0lQ&>Ip6M52nnH~S?_cGYzMAb;|yaY+fB-X}l5DA+oK!l+BNhLL=6 zlzbShez{dTEF#mgE`#UQkv?;*1*w3DS~8NW)^943L+Haok{Nd|{OFHT zgRcOWd{HOjc7=W$GRVQH+Rm0#-1THv>P<@k+KYe+pti+`(pgPp2!koS4q%13(&4t- zfPFC7TVfk-%+}Hv&a(|;%!pAI=X!4>6x90);+*4%KW)c{TI=d21V0@4VG}*#yd+1V zlo?#f!L~oJuZ$0l`}KvN=g4vJo2)H%Pn;MBI+l&0w@QWZ(1DPF?n43){X=J!mA!g7 z!v4=OFQ?K%Gc5a>@VxU>!sofld374-ulfwjgUqt3EGan_8m z0=mPgOv8MItGU1J(hB?~t<=#ZL4k|!gCZNlB7G@`hs?`=)UA<2qH11WOWZB_;fc1+ z_Nt#_88uR|7s+(}X>wS;S1e$}fi~)Iz^DykEQi~r#N^1>Dc>pm{@yDB$in3A#g-at zj$)(UuaxZ+I584m>%!H5UYFeEpa*ixdC)yMZs!b{2z5uyEXa}Jq>Uvzyz@*Lg1oUh z+pC{o97nGtmO&#JYv-Z`2`VfbVcUnD{e4Awj)hD(ZWiz$1x4?>S@>%51K#gC%fM7m zga$0f&#$rot-C?k&9Yh)lnmxV-zzXwWphEaUZ*{5Lb9#XH^G#H_TG{%f)E4JRQmGnf`MuKDz&+5AFgHzf&9}u(xQ6v68@7 z=aO(B7PEkq2IO@KQ?r`zCphkhI2o$$ZZG-Vmj#-~&uGp<1-uGUW^$XJ)ZFSqIv}uC z#w}uPJ`3(6$QZNqU(whSa3fdu-@%$aoM_HN>%J!XelvrU2ERqV1ZXGI(!!X zI{&_Bucn5Y=KC8*7TmrYxo%Ib53d)2{uqzYFX|`Sd0G@G!0F(yMHi(low7=9tj=Kr zCRY2Jz?%I9#yQ{n+9>hvo=h^`zr*K=d#+Xb$G~%UZzOBN_+e-lUOo(~LO|WBS+Sy~ z%o={6pW5G~7#Ktu8mwd;iry!s3G=ydkK@PUAjaj~aX^0o?vUT^)jR;vdaes$OW*mz zFd;b8r|?8#RsI-Kjm(>c5F$!_LfwvGm17F8a!k|3%J@NE=)4R)I;!cJjnG#yF0C1N z7!~-iatIo~D?r!h6jpCMsMWC(A|N~Dj(L*jZGm0dK^cz7FK%bZv`Wg~bZLcN$B%^agI@}ak zZ}F+Y=?%C~k<$`9B`+euKU22=P-{Kv;81ya&MSr5GSpWzFw#f&LNYT4M)~#+48cZ< z4{ZSR{<;z%jj}H#)B`<0hd(rcdA1;Yp?`Wv?{`+>-i>cm680S%4Gg+IPv*t!<>!hg zu&KnTBjKD=B`SaimZjYwl^F(5oR4iOw(g3=wxaRI7i%cQo}9QshWq&0nQjE@r& zM39VmE*dv-7PET$W({i1qWW>6Ix$wS8Cw@k7?wQ$9vBW%x0|Pb^lN~GKVugTK~he+ zBx94RD}Zq{u=Q;#eWonkjr8;RMzoJ>quD`o59pTW;Y{pXwD7JEP4tlFtUj&mD7|Ay zs{_S>tq(5Dm87nPo}7XvGrF}>vMda0d+XLlfN@m4uc#Xwhyk8-xAc;1If%K3?Vjno zUIj3izPAO6v&jCeU6_|^GOz+ArMgQztQeh2_$~#sjBDcvN zx+SJm!AwwAFSBP;O}dft;M7OI2(|!#+`6J-L~+h!ykk;j#n-KI|0I4@|2G_h>kUVY zXu0;rlCultc?%r~IU_@j8);OXzjdAYC$I_O|xN3Fb>gCy%fCjg*Iyq-%qxBvJ zt7~tYS}(t4^CEsCy68BM&`Z4fNdIrP7c-p$Q!-zk8BY;P)*pLxu~sZx(c;xNWUtNe zN4`|YVxWY2+%!lU3rIP5bt1uQ2j|!g0c4b43BsDddUHthmx9OikDVE)j!EfEOBS#| zIRHj~rmemXpj1EvB1=`1FJfws9pZ_b5Z4hzd)+~R75s{`Wx+{=v zr7thvK9g6pu#x>?xKrEH3gk23=5v%|)2&-Uf|UUL;jqX?xe|n30*R6QfvEb-fpNb$ zsFS_FOAlZs;`V`^^_m`VVJ)q?%E)}PjzC&xL0x#S+NqCQ6EERRa7s>4x!xJDVtEgq zORTz>PDZQ9f-?j`(168Vp#D+`Q9u%YlHu3-a8K7Bto2E1uEBvov(~3# zicDtfi%tVhoA8f00EcRLqnxf{fQLs?d@hiATdRluRO1NWO4}q3@MMHB#$;v3+8o=k zYw|j1r_2Pt?}AjAF{s&O1gYF<(L*CCn65|jsrhKPx#*JN(1C>MiFP zBY^h!%nXRvoK%z+>!a9?RAa??MD*Wae>JrIhWGL}55ao(bE+Ake4(nA0zJd|Gla;m zc$U44i$Z#Dv+KgpFahD3cZ||sVMsddsKI>mB7Gef7!CLQ%u%&vp80~f{EhlN0|Wp0 zB@Si$^0|*!I&Lm;CF0N-hy-}iuLx>04@9zg58(>@Wf4_?+ zcaaz77BDS2$4Td3ck@6EjvilizP>7Kvo1DjKs?6DX&m?Wz?(_1=&uKOHe-X&`4Tij zO2z%^!N^9T!*!pBzTJXV`{(BnlFk2ufFx%vP4 zru~s4`FNh00TkIkUxz>&_`wEiO11%W|L-d$gBUR1#h0n`@7J|u_Je0@sOnbu@0H$w zWfaOEeXaJNJMi;>Ge|P~Z5{sJSO2&TIFSVU`BQ%dZu{4r!P2^L>e0AS!GEuG&j>u; z#|L-Y|NRVL!hyjD?c#V-d#{QYvX{*_9rs_okaemsedPtm_KRiKNoeRZRs}0CaAGOADPIk1ZHx}Lz7DyS z59LsaK=Ho6%H782N|GZS_E*m@Lqn@>Z)vfWyK;L;r_2~P4DttNA&dqp4VwiUL>AKg zBFhkDMkHNT+ZEA3)r2uT-)w~LFrGVXuA0ditwn#YsNa1$u1>k+Evf#RjGNjWuZKv$ zhrNNv9aCTd4rqN2z}vol^G2Wm0kUQX`N6Ty8TIVlW3Q!FQ2@MB{SvQiKR=vI%wfw0 z%t5lHJ3t6i3|ref<`gLo;}t{b1Ibw^3AA&GHvbX-tq+?ei^PX96WNn`l@L}6gMDF` z$DI8FWE>vEZhPKAf0ruc;ed$vXWWEWdq3cKXS%x1LvAQ`|*hu9~2puE&k6>gA4bI#vfh}2SOmJ?V`A{3z*JEHO+j|(M$DX9NS zjuihuVs99mA7Fj1pZAJxX%I-X`j~PJ*gg8b?7A@u-sWpiI(@@WJ5lEK{rE5VnO{#{$K6~ z(JUr*NDLxY`)ueZwdAiUigp<1%a%2Vsw__k9BG(IK@H7piIfW)B!yQqfhWZu&%Jm8 z&7{zj(fbF;vscxHw7p{jLQI}4kS&e5;;Yn^9;FLfgclqTP7RZMx+%(~RO%r`Mvoij z*(%+K*)bmD%Wx-_M zevhUE)4;;a@>KZj8S$oZbCZeBmo?iD9j$ScSm0W&!aXSyi&BIOVE)ieUy6c+g!OM( z^+h8A#YfJLi)qV`!LqY`OwDr-L=l4=LOJ5LOhar}U-!03{5AHIZGC5ay6f*PHZTC~ zt7iz1+V16W{qn>eB&v-DdZQq@(-rv);-Bo}hM`0kNp}y1S8_Mw`a9tQy@*+D>%RUA zvz#C1p|%wPrbZeYiKM)u^qf2vrS!+UW`PUpUu0c=*8F9`PYbv6Pf5)B1ueH?;<##d z`$>wNf+JA@qsFYR7|s7W0s_Fq^pC}l_{MxIWBfw0UUs1-4!9T%lIH96af2)Nt6`Ja zihgf|lbf-(&vfv-_-E>-5@l?&+xI<`)KNBE4kXEzXT2cD1n zU4IXtNEN=3fI^+G$lcfJQL;~;V_FE|G~t7nW9UtAjW!NH#bT|I>PKS8`uNt1pDmN9 z@ud$dr=VC&i8F@OxVRd;-As!lBzM)#-^d1fc@CI4l`+&#gn}Q)8L_d2vQJkFed%PlL&=*PzHW%%pY^7~D@qW=Jsy;S7b&^Ke44F z;=@>N#zRM;|=&@hhVRQLtY|gYY0Z`a9EFywv zLqPRua3t}7b~^FF|^K z6CaOP63P_n%Axb4@3{4`3=|}KhK7-^PBtVk1rL=}!q@Jj4i*!nU4MfW6|arvp`q3_D@YDGG7%Jj-qo|uBvCvi!@9Uiw?Y* zuZ>Skq)kpsTiwX=WFGCMBE~iwW?ru8TUb~u`^nAhy$4k!j}yK?;FeCsOP>Gj?y(73 zbBLsl$j`|si{sQFGB+ewlFdnU?;H0n>5lb_%2|n15}JDg(y5dJ#CEJ6S^q3h>mLM^ zH!zYxOje_5*sEU-G27eQKhMKe{(HF-kDyS8*uUoCAEdMG8Pi##Hjpr!!VrRVwkV#c zkVB;4xR8Z#P;JBxEl~Zs_njZeOHj_BF++KOV)G=wu8#4m!w5h#MI~(Q{_f6BwQVm| z>PFV(XmE)lk*4j*(6k8vH(<+j$qm}Z(wYbFkSw7iWe^nb2=ru}oH{7L`jnGY8MsTB z&RH}(I;x}aZ`zJU(ji`4JclMbwa(&P1ov~i3U(ZG@#x@_cSx^|6Q(>p<5)u-G zJD2rF8jUK|)2Jpa**n_+Orl1%RML|D*=3@jslPt?)xQa)b%0Md^VVWqhHSc{&8#f$ zxadNCyB|4aKhhOJeOADr85|0=FXo3R|3X3!$$@d|nyU8bM%Q2t0IK8n>ltatEQ zoz>=HTTjfq&_hQ<3kS#X8xz;eojbBi(b@+7{Lk&L%p;z>Q>i9u!$m-(*wdK8G_Zi{ zh)0swxD0BZK_z+Cr$gE2t+cds;ChOQX{zSe**)<3Gksq#Es7Y8n3Y8Lh3ptUrNVNi zcvwZxy6tBU?sO3mk#u>KsHUc-uy+kHEw*{GP~*MrLX$u2)iLC$Pd`h|o5_9ZQCHkQ zVNl99vXR$_TMVTe=_^|bJQ zf~-fL4*Mxh53Q=w@Rg;U$;@Ej!0}RDM$Ij&7@R>oZ zl>d&QR+dbHh$B5*KhH=ozLlIC9#A@pCZ~gm#nV?fCCv# z#mtMk?ZYTJ2^V{MhvD?_t}YcDLw;dIrA}K)#J^pP94h#bUQmXKjum>r+da)h|x>}wD}QBtnI?S5uct&`oIzD+7=i{Y|OO~ z8EnGa#hc5Wf5GQIYG9JJXfN zXN$xf9`=cK?RsSy^LQ^uzfcU}YzvtQbO^jTxs|t!`riCPEfE`Xv&m~(Yu6ARY^r$U zJs&ay32ufL8Yy89Tbc5i@B>DpKm95=vNuIWc53YtbXJrX9%G_p^yyw70xD!vCdumEGwGYi7LF?iI(m ziPDdGXP)SrsTK0Wt;z8wX{lWP_OgY@modNXFhWCqD|Yr>fCzJn_EvBD${%gfuc)Yq zd8otTZ0eUblY(yU73!&22f4(bo7c-a@uN*t?afC5C7iKVmcqleHnWTQQHOv3iY+;5 z5Vz>0ZP!MRuHGXT7j+~Fk=#ZGThn+Yk|3_$C=qE4ny?>r$0|`*6is!6tQ8$KJF{@@#=yLY5@;&2A-_< zKZ?=nio?#7@al%z)iXj+z9}Q*hxlwU?gxohf>kugfu~ik871%W_Px|o3ctDPVOD6q zebn#!61P73s`bAiZ(r}eb%qr=R4BZj8dAk-BocA37f7fvySwb)q}?Y3wYPwU)wbAP zZ}waY+vMkFfUd8LMq>hmpZL34)(Lpl&L=@WCEbq>Jg%h_HEY#HrRR65=llgkvo^-U z*y4^f5`^s9Q+2^P83d=J?z^Tv6Z?HZ8-Bq{oC|9m$$Uj4&%J5BvGVzA@>YG1WJYrv zszW)aij`f^>_`{RZ`C`e`*(;;rkz(%E#x_#%X_j$VGchW%G}QJnC`qc!|#mDYR{3J z17gzg8P4#V^EGf+=?e25r^WYW(O~DNFTP(=P4mhmb$H+4kvclC2l&47_D&Zw!Cb&OU926*3u7tf?>J<0eLWU5mP=xg1X@TXw1>I) z$v@;90%TyXypq!RlsO7E7I)jkL?qiueP{*Q8F_xyf284=n**W1&g^6E_NNBfj=g>f zCV|ICg{}vkcv6FD=k2eIVhrylT3dYx+mvMkNb^U}W&7XOSs{wUGy-ZSDWQ3fIeOBa z4Cc9IgHo1G?PV4X`HDv>f;rE^c^eBXw48W;{&4*K3X^Aert+?kA0 zlgyA`7mP2Z{5j{^Jh2%?hy)ItXJd)7CIc!Ij>+9%XO9|2R+hWwj>fBk+fAek&7Sy( zNjOf49R_p<{B9F!-*HWs43^uyVev>VXfR4VU6H4!vNtgrYj<`(25S7lm0@RCG=*s1 zq%WP4q&^aMnboyDYMVNo_;g@xyN_5lbaKA5F=kTV%WufKy!kw1$9JqmZNfTWa!gpwkS5&}!NfJnEr z#L^u<-+%pGd>1owb4|fjF^!a0059_YN#6APt^YuA^v@rwwL@308rOz zsy;D7S?y+%prC6FJ$GWVfqn9!36!wpca+i42AX0zk`0*N0ijlb=T^A-Hdtd=pVIAE z4#{JxS1NB-sxB}w10H|0X7H662@LI|6vW3%eAaQ3#MI#I>*tI3bre!#ZK15}TdnEq zD{~~r$RgS#yLgs)cXhjXcI7~2WNd8nUtu<|4diV0-5E{?_d2QrWM)-Bra;c848j-Z zWz5b%$qUl-AXI9Y0G2BU_<>^Bpb|2*Dh5AXeo6ctkQs!ptswWTjSl`{7~L0%;JHU0 z-Xr&KHKELnj%vcvzrRKzl(D>6U$zo7?Dr>(Q)u-f-wbX_dR<-{Pm1uA5zb4w4@3ee zIk4-mLG>U)?}zES^IU*A!ZHi65et4PIk>I}(7?Fg1XROUC4hB-e;L6_=ts63V4U=n zoMeq!xkCk;Q~26>sXP=)^U_O$>ewz2*03-F-bRPVh1@t8(MFnpGBQ@0z#l)OSyq4u zZh_jG4rXMWCDy_vnnLO$MY1dYwFG(y^6nIt3m0tZwu5wtG!rx{EJ6M@0;K)G(;u`8 z)~E0WmnW{l=ZD6*{|Mo_zoE}so%C#^)_GpnK6-2T2qy~KRHS$JkyPuAlgAG7Pot}w zmHK$G))X2<=zkQE>ps7T!U~yL(uha{KpOo~{=HR@biTBuJ?rvNuJBHy*{1}}2pDRN zG}uJUPQ9y@rTUO>Pn0>07GlhZx|KE6gF_xXwjn8czHvA6VbeS4(gpQfN#$13dXsP{89>|xgU z(g0I`zAYSQfYmv1WlB{IC{NNhSs;e7$rgH6RnZQ1EKlM9+zZ?1`^;vN7p0*<67=33 zwV}<-5;{DF=qeTTs;e!|7z!OcbeGuwCW{WCFhifHw$Ke1(Al@K=kAq#pPNj)`0=DI zIdU6)Y=ea(tKXK{)=8l^Kf&P;ukbZ|Uq#S)smuc05>n5iu|@LUl*Q6kMsfZeU2>s| z-a@F$ZsKD>OJ|_I$AE_~HnaY2esT@M*1knRAw}z;j(W(6a4on(dc z59+MS=n9$Tm>*mxr-aY)Kk^W(abwUkfxe;-hHU!KCj_>x<IbUw@g9ZXC;ZJH>&w@${Q-Vx1+ZW+A$JwS2CZQvyY&TjS}5oA zCOxbxN`ChzZuT@}7ER$ z?_jgsu5MG5#SG4y*+=_J%~jbE+@7~ORjv9yZY=W8?FDuETBN>m&n6~M=30u)*Kyb6 zRm~)mkdR21^B3jP$$CJ;D=7}YwOlhcHa2ZIOe-$=keHIclxQx*_N!cpjF3#XytW{f z!J;X8VBEKCW)x!8N|>1|$pL9BSBs%zhvlKSdLP`@_kB!D8*OX~lAUrx!kbT2UpGc0^P4vSA7qbZmHHZ+#$KW?1r8kRGFl-B3~+lO8VpOc(i-E z%%UP3$kWt`KxXFVG1E1OheATbBY86kX#dxz0nMgWwh&%k-t>~?H^Z<2P$So+NU$EK z>)4lbhJzojoJK8SkWzShl4NeB}ZB#&3Tl}buVB6X@K zB})J5cXN4izWPCT3h(z@3=7`$#-!)IKr>RLT$jv%<_66!JaxTOXnF)1=zd*N25m%j z#kI0%wtW)wNN^r$zw_Z0G4Qao{O@TzODuz!!vm8p40!PQK#5^dC33vVuU{R^l7#HyLBB*z8(7t@;U0qckzzgC$`<-li z;+vDG_+x^MH7osX+eS6uZ0kn2tbQmTKnjoc&s7re9EPP2l5EQho2T?R!S=f7XjB7? z)o%-(s-~Tb%gY_=4!&r9AT6@(0IcUV{QQ~4z}LE1(bU2rMV^CJ2@ig>yBj&irzhjE zoT}(fec3F#gEPi%06gQS-N%3gLF6d~ubK(wv%dUwoo{3)m6RlfmoGeC45A4<+f!3k zR*uP&hJxBs>~r&D!tzHI-o@t25FG`~ZJu=a$t0MtwF@~e@Xdu!b~iLM@Ut?NNJ`?t z$$GKigq0-^Q9rtGy4~rew*q`orD>-&4Q&q$wer5G#)#;PI z_yateNu7HX;edRmmGnpN2=kepB_sYU(F2t`*j~F}p_RZRM=^y{s#uYv`+icKPD-ER zX-`}tsiUJKsp`V)gT2-n9v<$Q_-5|Iz&G)k5?~G}j(<^g6=;R$jhXDWS=a+Vb@6Lo zrpoxA|J-h z>hltKh)L(ylrA}`LYi*%hMZQqV(4o`qr)k<=W9=-^}&PVR|h?;b}QYngQgO$>fgmp zC(5crBOLs~`jvgm0bCs^2AuFta>Q2?;a-)I#)Eo~6=9!$e~L?`kZ8@e<3)3~<_P(~ z)5>x7jP%q-6K0vmChGXTQmL~tcH_=t9IxwJf=A*Oto4h@TO|wSw22F4KFu8;Z;ic_ zXZGJ9_yxBMDA($Es>)6z=u)SsdVDaqNE+LbPLFW|DIIO?&bLG~!VZHE==|SDfQ_0ZBYS&6Qm(fEv3*QF6G&E#9YTd8e9s>gt6ZZB2Za^zz7o>tH-eoA~Bb(ip-wLs=$qY;a_M4;mIRiWi4-c}!anZc zWdE-sK4)IVr%h}`)GhwqxoahyfETMWKSfar-H6xHM=LR1DAb)>0#bLxr)H#XL?VhZ zQ4vWL(1k$$vKm&HPZer-J}fK_FHa~Uza@Vo(*$-rRkc)-nmhQYa?qdauNT%&51~3b zYmOF3J7w!)S&TmOwsYOG*i%WiA;OtFZuCJQ3;vyT-Qw^sobQfl+dM^h;Bn_@ofk-V#s z_6DZnG4%(Jqu9@^?zdg$CA?n0*o_)8^*;{w_DxtOzMEa?Gwmy7&1UX97seqps<`o3 zvqe5Fi*mrpm)7jI54P>zOpu{H^JSORTx}&MVuPsh%maNj!B{s~4*N=E#DM$Hy&yhU z7!_@c+2Hkrsoc@-M~rdRGQexh^UJ#Uo`A&yZ(6?=V=I9ZMxe7-=f-re;3rdn_!sn{ z3JM;73su4u1jo_4QCPpFatzMA&T==@3d}|*VP{&2Ws1(#pe8{P96UNdh)R>4M4EdZ z@HcPuOd8WgYOhURdNuhpAz64XIUVeFd%4p)C}N?zkmti!jKsn@`#y;8D_h}C3F{*p z89aD~g3puw9xNB{P_JMW(~X!H;Xs#$Z!rZZ1zI(eY!Zb^!DZ061Vs%Nw*)e zK)uT0En(#1`~aI6`HZUWHsHPXKo<@pU~f|DvEU+8>lhzp&>+5YM0@_XUz0<_C@Er5 z;B$3UhVYL9icTk$5XOnv0`9@5p5<%+FPh`C0qdo_=GLc4@>Y|0V|WRQspEi&I285G zhroXZRCm|S#y!GcUvpYW-pu+DiLTumgWrV7)*O<8rT?M*`wS{j9=dHp?lZv*f|qO)b+N5O=3 z@k{G^1R$RMv$+K#DB%a*f#i#?S^UE%$sK*}`bAo9i zwGcj(U3=;+?*f!XqU#ofzR?k-zpMpyrC2|F5CHe6n|nfWWn5J59) z?g(|8#=>_d@6=#(()Vx6w>62IFa-J*6|6j6rHuN>Fw{FMJ2O`+N%+T1- zyV&@Bd$gExh1|E_Yewac-d{vm?6BKDME$7h@~wikQe9v$Hs%sdVb~boeFWY^2n@ZE zfgBaKTI=r@)y#fuYux;1t5rA>++5Ixp|dfNx_oX z&$A{ozK%CZv4~WNn%~a}-fMq5Xj7(7BTzrs^%Z~WT!-Fs!7$W1_=Zg~O9+nr>+;J% zMbhoiDTZj*&b~g{eCFoKelN+N^X=)>PgemUtVe;mPphG{%;g4+p@7YUpgLL)scRN z3-BX%)&8keC{!`vvMv?B+r-gPptcjZ#HU$?>1G_k3nz3m>}2D~T)p~{d$%LiJi)+H zEcSQZH3x!y{g`o>ogy^W;g^e?!~O3^PZzMkTJIUQTmR^hVwfsVoKO90@WK&zed&`h zJq>%r9O_IRBSxE?SpsED6CsR0xlaOUs;7Fy>-LzpHq8cw*>b+)8MCWE%2 z@q$EB@!yk&Zv9TYDXNzXyBC+~fU>p6qH?3w*~>B1qh&59bCe=r)8X7Quhx%1lFB|D zKFR+nuHlE6qn|5)xmZ6H!0%xQ>}p31^nc5K`ha(ebmS#apLK+q%q`MK8Mq;H~K5fI(1(p&X zp7Z_-@AF}1&U~12&pqed*ZrGwMQdxmBLdI@(9qC`RFvQ9KCO-a9e6lTv-CKQ5E>eT zh00qweP4^?Z}?sYb8~}_s4h-&d{Smotlv^twv45pjqUWO086ZD=Z7VP!8KniDDM_4 zd5bCvAlBW6v0)071P1P}nlynp_E;=&p#lRyvXo5mwY!?26Uj~X$eoB4+|zFXCnh}1 ze!bHB_Y*P!k0_aau6F2QQsxo5oIfxbNFbC_Pg9Ni0!D^a=nur;opm1>P=>H$%3p%9 zOe!|h;*)`DIN^WL@f)>!IqBF!GYIkKFv&oLk$PfE7`!y3l}|_IiOQYhuuO!Q^+}W= z5wx0%)cB3IzzW7BAc1IJy&xHA7_2SL97^T%+Ro+$ECv1lCy)l6CPT%i6T54gtdScx z9mKlTqxkXNF0RhgC31g2g;r{`Cg`%-B}%!@dw8eAJo8AU`8yA zbTAv`P&+=ttHJ7~_q2F;o&5n<8FEN#L#$H^Shy31AjmPTO~ay@;phD^L@-QnHwMU$ z9p>;dX~jZ*^{d~jQ0S^L{oaU8&xAv0eGph!bgTyS_S9llO@S)c_>cmEB4oBH377cY zl?IIRp@?d$Mq7BG0HQ;r7u|9BE)`wzuoFtkE^gUjR-NGzVS-6Oq~?}D<_UJQ6ftNm zDfSbMyLIevKyn8qz5&sWZTy9M;pX&iS?QDnq34( ziAU1N^r<+ogGp7*e9~8$VElzRnw)qN$`tY!vFjnR?4J`_x`F=3EDJr(h7L(oeiLMtxjX^F-QWJ9C0@ zx!2b|mg|2PyhWX~_&lURWX%X%LO-4h(`?2cRFTz=g~I@D@DKW-Hm0*ox(Inew{LH{ zvAih-u6=-`57Vkq8vY+mK(60NeqaDBu;~S9@hpZetqj}AK%!XG*UBJPRc?({I}OP9 zT`cc41>lWb&%{R&>m@(v-JX(^%_}DT94>Ao51yB=zhp?4ju!<#RO$6}iEmQXY>))( zhALZbXDw?t5R@+=b4FGBSaXe!!%t0bPZxumn>Kx13mJVzd(9hyrrJz%IbK&S4bPM= z8CF5bZW;H?naR6IGf7}IJmwX;YNxQ~&&Hn`J7VMcg5{8*7oobxwe+x+5E&opp#Xs{ zD|?opSDwno3L}gos#3Ao5%h?eHl<2Q*VT9d=^Vpc%~Wu{Y$nx`Kb3^OTA&wi?H#2J zhbj*ht70W%3Zq8TG)*!10r>)!ft~Z&?KFrtm@?sy)DQLAK>q65H0Srci$95uLi9)> ze&&OxY)yyq-4iDD47j&2RfuKwYhdbcL4*$Hvhn=x>%S~##|8apIe`c zU{u0|#5r~?^38S@xK+I}yo#O@cy|asS|kIFVwkt%E?iW6Vlg2~Nby0AHjJTX1L&e{I)s-Vw_*$WO1I;xSa8-gC=ck@jk4_ztd?`>V zF|sPgbIpnwtP!!k-+#1-DhfcIWJE1Z0}r(!t%-HkA?D?e{SW;$$dMY}v&B$*PzI#; z_iE-o5bBp}Ia0Cu(BFs()Ft&}ayg-rcXGSEixFgj?L??IuE|w<`1tlNxk^CGa(q|N-By0UNnLe%Gd+xc zFX-;d>U^u;z0FJ;QaoM0wFKRFAMI&?1v;s>G0MdYUC=f&s0>u)n*6qdACAqF&o=&1 zFOXsAjU;M#F`I#r(?J^wM4OaG(I+rS;*`%g^1uPqv*IYu-mD`b(AomnWCm@n)M|Yg zi)Y-WKL+!_;*hJH^*I|gp^%3ETBo0~ib|as7{vLM%)`ZuR-Mxvm)ORIaB%YI!Fkp7 zr_Y?hvsLstA0j+x4ue{Y(GI*PH$9xn zQ3sl06@xW>d3hq<@sDfZ^3`BTm)#hJ(=WBE;M%No#`lQX+8P0TH)qFTp89Y37gTbk z+)bm0ms@KAHRT$nI3VJ)=~A`2k8r*h?Cf*36Pxo1JWb2x)|U2^u0Q|sOzUF6f|PLh za(<)NsR~q;SbzXBOEZLzT*?s|b5^mW_E5RIKp9(md+Uk3HyP7qyyzl6qJRJXt#w`$ z+Ovu5p!MckWhrR)_CQOm9~D3VT38aX2_;=$F3d46E04fFmGngzte046eZoj#h*YBp zwSrC&dPs9|aS1q1zldX!T@!*vodJ=+Bpjd3-x1D9oVf!b76lUTer3v5)XM%7t`dMc zypd?WpmD>0<$S}@$&cguJFVb(CD~AA!ZZN)!IK&L1Cwf`mYx%0Ohf0HO0Fv$`i;HO zaWiyp{$^Z!z3=w&kga|~bS06r)*zTtGdJ?6nem>v3d4LRNPF1d>4KCA^TeH-7HR`; zh7NdIP7;|hrjlHfcnT+a#dDV!a981#C9P0%k;1get2uYUMu`OHPb*X?Wl>k<~ zpT`rLG;w1H$fm4f37k@JqVSoc)@9#IpL8NM37KTfeBlZp2);%4dZI%?5EX}JUd4P~ zuC-k&&Jn?@vqOL`MDCar?2ttFt%(4w#{dGNf%U@c#N!*_(I8%J1Hzm6N=lmHxW={x)et4=B66CaA|JFUrE> zPME85fpo`>;Hh87w{`PmJ_HlVl(!k?sQHy>Oy-CZNC#X|P&u)L?&ToW_*TVbIvJ+uv&`D*SUYCNg8dqh;f*tNwl1$^SG!kF>GVztp7 z==t7edm!GZE6}glAYQr0{_H07SmFNlyx3~q;u`*izbg~oR&u)r;Mww7n1sSF{55zw1tW_5c`9X*c({+Et0o4s1`Se*z+0% z;u5eeCO;@Qz@pz%7&l`zckrG`Q=zDFHF@=4Y1@t$PfATCr#u`3YY)wx6$vRu@q!p( zw#h2H%De^w_aEW?w0HjN?+kNZ`v0)_Dd4%MzS-z#1>O@lUHeJL-+eDcMn8ahL(w{;30!V$&*%0Hl;YykxNnx(21@#Ordh% zyI#5aR9-I&dzJc$qF+wJ3X|{nR?Ep`Aw<{`>#K?@wp?x-6c=9h9e5au%LsIGsuVyk zA_aOL-fu=RSsyPom3^GZlh73tOS~w2tzaW(rHA>8U>rcjECK$k$c3}lvEhTz!6$X} z8LiMM7I0Y-v8wi3!5sgRQ&hy7@homYj@wL^djw!T$Q+_?wUzoWc$X3VRBAga)k7lJE#dM8L6MrBO!zPcVhFRmtI2^BC1KJLNR2lB6}x z*E*(=IPGA2m(^=pl01$?q9lXz9s7~$$q#-0+ei*B7u&V{otp`p?Mf3R3O(>5`QIXZGSJd}efi~RY(>gcBT zfgBD@O@FxFPCQ?9D5%pY+>xD`92+A1yH$)Sjd9(~)J8j{CrV5Eme~7IgSb)FT9}tt z(=dBQOac;l4_c}e^+LcZu;z)HrmEKmd10FjK)~RixhgpoO0F%A*cn*wj0l1fx41NNxE3JQo%lP*mtaqh9k$APv zHd^)KX#YcI3p*@8T~Cl8;Y{xcU&ZjOFMq|ujk2?#G8R<$60LcLFLB_Ow-iPybkmURR$S@^Fypw~&!H4`zL(c>XFGl98 zRr`14Ux*Edyb1|fanq|k{QV`M-4FiFI))UeBB%`c({E|W{i6n*EhlKD&69)Mq$tkF zMLhgDQ@SWTNnFC~N~t8xd<%YVJ2}K}?rve}Ltt#D8w~Q$Q)Kv+myuyugBER@9^w7w z&lVT`(aMV1-iOSzv{@Pv-7VW0WhT`nkcJ^y(Xj93Nk;GIi)AxmAYtZ~#OI?SP0c?u z<%uxEMO|PNH-l~Z$mpoCBBRSx(PKv*AJzr)Om?E~`IKchr)gyoe&gmnZI{e3g%-cq z=avPEV&4J`E5P+Y98Is`i{!Ab$Xf%W%wm?08o3Vdp=QxGgNZDhEciJL3%*Uy4OH3> zI9<0dh^%3qnBvzb8C2_>)Xh^7;G*7bsI}Jb93eY^gcrh+rpoyZ0mGVQzRHeivSE!y zg!y5MwT~>*)g^Jyfs4s>(bZes!k((BPr_g|Z=f)Z(~|nKTPnk9!VBw#g(+%TSE=Q9 zoMB}vNutgA+6&qa;Uw29O_ST?LE?ET_^@7Lpc_J%_V#CGMFpO|mG7vM2+&d;{gZs~K(IA>mDK}ht78K%AXIO| zR-@C|_Sl5$D3J?or>^s;zTSN!GLY-9d_G?iH4>;?djk!|%Qkco1eY`!E8?A!JOPeT zWp4#HC#pm6%|3qK-@J&?J+S>&46sTgyPJ%BnYbVM@AUtucc(kWt)uvev}~6*TtQUx zqZpF4RrO!`_4)%!pa+C8r6~KsQ;4K{@d1z{nNk(vI`2cL-BD-TqaHU-ZL3nji`{sR zz-6EnS;>ARY|c1&S061$8X$es}c?bsP zFddVbZvEUuCT}T=hiuh(~@dAWl|P@11yPFm>Dd`t_@s}y3jh* zwMqXPrW5x)v5^!uF#ULV%)ecnnww-_PokF5!i7+1*-`HlzPEa95LGAsW8U2}qQCgY z-E<=L^^weYiIgxo-|WN)kn*GQMP%D?=OXWJi-M8t5=( zx<+AAMEs_aHkGH!n2AjaMxV!l>WqgIhs01#*yH8o%|c$_mo~05yM*IX5kY*DtOLQTh9D_ zzLi_wt6blqK0a~2Rm?KpVY3KpD=Z(;4KlZVPC`2Tdp*Aetz$GXD>%_C7y7Nq8H62O zja`T0vU)=F)4AS)jl_U8CAHL<<-k|?1C$C(Z@U|-W9x(OWsnmm{pPt;EW`FECBoH> zL=HjwXARYL*DgN_#GELjrEL$p*`5FqKTaOSsXpwNLWz+a;$+VZqG0;g%P*1W=7I4= z;U5ADKR2A(2W<+7Z}tZHPp_?0-=g7&o%-vf@-uEwQ9PxQ-*l;1E%`H@68GF6AdJ&* zG=K@ph2?SLz332S?;qn>@>%m(NkP6I`IlbH{aKHL`Cum$m_SM}Vl>79T0)>oZN z1pwI}c-5-548KV%UND{TG7@fZ$Ko@FeOxBIw>a0)1DBy_cS|IYrN{{?NVfFUPI`ZZ zD9d5D$5SC?&6X+EsOX)_Qmye*z*a{7JuFlDZVz=&O($DBeG_h@#KMyMcXD=v$jf`i zr4*wNuLv1xJMC_`7bx46=~p!!r=%guPOd~Bv?uIKL2n30mPVlGe4My(AP|r)n8on) zfsn>f;AK2X8!(ZxwS4qaM~C3Lq-2%%(Fb8uHt|*=x6I%Oo7}w2sCI(qdT#u+`i)Ra z5)QGjYdr}R;w_PI_k&98yaL_WDAmfrtR6}sjG3^WNb?=pR|Wd&WMppF5_%xF6l!f8jvnWczIsG zv-cvj+%Ahuxa2h~5-x^6zL;nxl`#j73i;^qv;v7IVp4fm`Tb2UI2-Aq zkK=i{pbq`1Ki#d^In{W)iLn4f>;9=nfvosn_MdBp|Mhdv1~2+aF?No1lovO3L@21? z&f2z`Y@G0s3)J)`LS7|j_K39=YdnBku_Zd0n$sEkJnz;ABU9XrZ%Xx=#5wK8K7L(( z*=QTee5}-#_e*ztl{ZnCsO`Jt{ICy{(6H`%i09s`m1S?TCH6)UnjdP9pPs1nT8{6O zA}IPfNg$X!Us#!dq1#(<(B-^Fjh`?p^qfY)T7IJPXUDE}B7br7ltVi93L-NnqHUGK z#;eL%$)XcC{I@OOCYx>tnSYV@3wih6>hhd^5BKFF8Ev}6UK6p+5@BB~rcL>LXu+-R zk*gn|W0ZjIDLF%iKO_JTau>~&IY*x0IX{d$@lf^dSU6B1kl||pfqCYbqAZ(+|5R7{ zf_ZS7@kiHeS`)0{$1?b|j)}2;pcf6sFM`$Wn^j)y*4RG=M-yLlw`Lh*1QCsMQwNLH zRP2&XsRD+^Mv(7Tk+X_U;Q$|4Y$+~$>+-iZB+f`djty?Rf7wdu*40#wKB+hW0h^vZO^XPn}izw)k}itmOHK{D&bEy*GO^0qeby!X3%h zYL@=q#|%6o*C${S>71rP$zG-~g~HTCYyOW^2PagzjulxWKd=Srjs?aJJ`qT~Xa;Cp zBOD~?Oz?{@1O6-AIc7LeJRaGE3+63*>x^5j z#ZLgQI6mnLWeQFx%hw2E0G*T6k3>jm_U8hrj?*9>ZnHsR(HAt_`He=zmuwvwR{hD7 z?rtqAS&O?kFP6;YRX!2Le=iM%j+*Fw>w{3O8Yu}dRtvjfE<2YbT?JD`oXk)^s~_1M zE*t1!{{4}6*JGAZfRS{dJ>VH9Na($z9*H;uu w4YD1Cwfhf_c=G#fB5lDNh=vwJrHKXG*eWJ8A(bRGrn^b@axNot_H5dRy_~A}q65ovn9Fbe z|L>dmMo1|o|8f)mL-RW>K}ADo*=}iP|8w6S!*m7qs?ZB}Sp~O2=q_AsB-dA(>=Eh$ z({nI(5axc$Ld$EQ{vL>4=Q`jG>;dW~cj^KRJr9X<;0t9{+iB3tpm8_E*1PIm>x&33 z4RvhP;K$eC{MQhSfo*1&)O0WwAiN4T?*~2LqKYdn0d;LP67by3=DT6=Oz%2g_o2{C$TA+Tty{|JmI)>&8QyWVW+_V4z z$>_Wv`;wY7D0c6K^SMUl&*AT+0PU|@j${(i!da{Nh~ku?@4Z#MB~zz#?@ zp7OE!XFov}B>TNy@4ioW(Fl>wJ;4-Gu7x8O4 z2{XxqsSWJD<5Bd0ujGwiJdu!2Y~ps3`-fg+Ix&kaZR*0+9JpmCkNwcc#NrH^(5R}o zijSMRsMO1y@4u8tYP;$@>O$k0Q}6Q8__tJtD)~JV=Z(f4Y+bQ|FQ$grdGbxF0#T+? ze{f$-GcT=sWNBU@$%V65+Rl!@pFPV%CthKhzns}jf;(5DjR=5wH5P7P5R zh%lF#=beqaxIK1*N!kYYGM%0ynT7SStLN)rfo#Gns>$N&0>{#KFm<%%m@}Z|!y-zGmx^eL4Hz z8vC3*BOkCbSV>213p-ZdMTJ{)^A$Ny*?WBUET2psW8Y2N@u?c>D#&dvW1BpC`aK?~ zX`!j|`oEXGYId>M%`nhFJ 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 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 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/Base.lproj/Main.storyboard b/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 000000000..f3c28516f --- /dev/null +++ b/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist new file mode 100644 index 000000000..f7df0c453 --- /dev/null +++ b/ios/Runner/Info.plist @@ -0,0 +1,68 @@ + + + + + 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 + + LSApplicationQueriesSchemes + + instagram-stories + facebook-stories + facebook + instagram + twitter + whatsapp + tg + + io.flutter.embedded_views_preview + + NSCameraUsageDescription + This app needs camera access to scan QR codes + LSApplicationQueriesSchemes + + sms + tel + + NSPhotoLibraryUsageDescription + Allow access to photo library + + \ 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/lang/de.json b/lang/de.json new file mode 100644 index 000000000..679e807a5 --- /dev/null +++ b/lang/de.json @@ -0,0 +1,280 @@ +{ + "Hello": "Hallo", + "User Name": "Nutzername", + "we've": "temos", + "got you covered": "hast du abgedeckt", + "password": "Passwort", + "Enter new password": "Neues Passwort eingeben", + "Re-Enter your password": "Wiederhole die Eingabe deines Passwortes", + "Change Password": "Passwort ändern", + "Email Hint": "test@test.org", + "Enter your registered Email": "Geben Sie Ihre registrierte E-Mail-Adresse ein", + "Enter your password": "Geben Sie Ihr Passwort ein", + "Forgot password": "Passwort vergessen", + "Login": "Anmeldung", + "Sit back relax, we'll": "Lehnen Sie sich entspannt zurück, wir werden", + "Recover": "Genesen", + "your password": "Ihr Passwort", + "Recover Password": "Passwort wiederherstellen", + "Select Language": "Sprache auswählen", + "Default": "Standard", + "Select": "Auswählen", + "Selected Organization": "Ausgewählte Organisation", + "Continue": "Weitermachen", + "Enter Community URL": "Geben Sie die Community-URL ein", + "Verify": "Verifizieren", + "Sign Up": "Anmeldung", + "Change language": "Sprache ändern", + "First Name Hint": "John", + "Enter your first name": "Geben Sie Ihren Vornamen ein", + "Last Name Hint": "Carlos", + "Enter your last name": "Geben Sie Ihren Nachnamen ein", + "Confirm your password": "Bestätigen Sie Ihr Passwort", + "Next": "Nächste", + "Request Sent to": "Anfrage gesendet an", + "Log out": "Ausloggen", + "Join": "Verbinden", + "and": "und", + "Collaborate": "Zusammenarbeiten", + "with your": "mit Ihrem", + "Organizations": "Organisationen", + "Title from the viewMode GSoC branch": "Titel aus dem Ansichtsmodus GSoC-Zweig", + "Please verify URL first": "Bitte zuerst URL bestätigen", + "Enter a valid URL": "Geben Sie eine gültige URL ein", + "Firstname must not be left blank.": "Der Vorname darf nicht leer bleiben.", + "Invalid Firstname": "Ungültiger Vorname", + "Lastname must not be left blank.": "Der Nachname darf nicht leer bleiben.", + "Invalid Lastname": "Ungültiger Nachname", + "Email must not be left blank": "E-Mail darf nicht leer sein", + "Please enter a valid Email Address": "Bitte geben Sie eine gültige E-Mail-Adresse ein", + "Password must not be left blank": "Passwort darf nicht leer bleiben", + "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,$,etc.)": "Ihr Passwort muss mindestens 8 Zeichen lang sein, mindestens eine Ziffer, einen Groß- und einen Kleinbuchstaben und ein Sonderzeichen (@, #, $, etc.) enthalten.", + "Password must not contain spaces": "Passwort darf keine Leerzeichen enthalten", + "Password does not match original": "Passwort stimmt nicht mit Original überein", + "Join Organisation": "Der Organisation beitreten", + "We're": "Wurden", + "Glad": "Froh", + "you're": "du bist", + "Back": "Zurück", + "Let's": "Lasst uns", + "get": "werden", + "you": "Sie", + "SignUp": "Anmeldung", + "Please wait": "Warten Sie mal", + "for organisation(s) to accept your invitation.": "für Organisationen, um Ihre Einladung anzunehmen.", + "Add Event Title": "Ereignistitel hinzufügen", + "Where is the event": "Wo ist die Veranstaltung", + "Add Location": "Ort hinzufügen", + "Describe the event": "Beschreiben Sie die Veranstaltung", + "Add Description": "Beschreibung hinzufügen", + "Add Event": "Ereignis hinzufügen", + "Add": "Anzeige", + "Add Image": "Bild hinzufügen", + "Select Start Date and Time": "Wählen Sie Startdatum und -uhrzeit", + "Select End Date and Time": "Wählen Sie Enddatum und -uhrzeit", + "Does not repeat": "Wiederholt sich nicht", + "Keep Public": "Öffentlich halten", + "Keep Registerable": "Registrierbar bleiben", + "Event Details": "Veranstaltungsdetails", + "Register": "Registrieren", + "Created by": "Erstellt von", + "public": "öffentlich", + "private": "Privatgelände", + "Description": "Beschreibung", + "Admins": "Admins", + "Attendees": "Teilnehmerinnen", + "See all": "Alles sehen", + "Start Date": "Startdatum", + "End Date": "Endtermin", + "Cancel": "Abbrechen", + "Done": "Fertig", + "Explore Events": "Veranstaltungen erkunden", + "Filters": "Filter", + "Filter by Date": "Filtern nach Datum", + "Show all events": "Alle Veranstaltungen anzeigen", + "Show all events created by you": "Alle Veranstaltungen anzeigen, die von Ihnen erstellt wurden", + "Show all events you have registered": "Alle Veranstaltungen anzeigen, für die Sie sich registriert haben", + "Show events for all": "Alle Veranstaltungen anzeigen", + "Show invite-only events": "Nur Einladungsveranstaltungen anzeigen", + "Add Date": "Datum hinzufügen", + "Event": "Vorfall", + "My Events": "Meine Veranstaltungen", + "Public Events": "Öffentliche Veranstaltungen", + "Private Events": "Private Veranstaltungen", + "Liked by": "Beliebt bei", + "Comments": "Kommentare", + "FirstName LastName": "Vorname Nachname", + "Pinned Posts": "Angepinnte Beiträge", + "Profile": "Profil", + "Email": "Email", + "Update": "Aktualisieren", + "App Settings": "App Einstellungen", + "Language": "Sprache", + "dark mode": "Dunkelmodus", + "font size": "Schriftgröße", + "Help": "Hilfe", + "Reach out to us for help": "Wenden Sie sich an uns, um Hilfe zu erhalten", + "Donate Us": "Spenden Sie uns", + "Help us to develop for you": "Helfen Sie uns, für Sie zu entwickeln", + "Log out from Talawa": "Abmelden von Talawa", + "Share News": "Neuigkeiten teilen", + "Post": "Post", + "Organization Name": "Organisationsname", + "Add hasthtag": "Hashtag hinzufügen", + "Write here what do you want to share": "Schreiben Sie hier, was Sie teilen möchten", + "Join selected organisation": "Ausgewählter Organisation beitreten", + "Home": "Heim", + "Events": "Veranstaltungen", + "Chat": "Plaudern", + "Chat Screen": "Chat-Bildschirm", + "Confirm": "Bestätigen Sie", + "Confirmation": "Bestätigung", + "Close": "Nah dran", + "Switch Organization": "Organisation wechseln", + "Join new Organization": "Treten Sie einer neuen Organisation bei", + "Leave Current Organization": "Aktuelle Organisation verlassen", + "Creator": "Schöpferin", + "Public": "Öffentlich", + "Private": "Privatgelände", + "No Internet": "Ohne Internet", + "Subscribed": "Gezeichnet", + "from": "von", + "See all Pinned news": "Alle gepinnten Nachrichten ansehen", + "show more": "Zeig mehr", + "show less": "zeige weniger", + "Likes": "Likes", + "comments": "Kommentare", + "Final": "Finale", + "Enter Details": "Details eingeben", + "Select\nOrganization": "Organisation\nauswählen", + "already selected": "bereits ausgewählt", + "Switched to": "Gewechselt zu", + "Organisation already joined": "Organisation bereits beigetreten", + "Membership request already sent": "Mitgliedsantrag bereits gesendet", + "Select one organization to continue": "Wählen Sie eine Organisation aus, um fortzufahren", + "Something went wrong": "Etwas ist schief gelaufen", + "Join in request sent to": "Beitrittsanfrage gesendet an", + "successfully": "erfolgreich", + "Are you sure you want to logout?": "Möchten Sie sich wirklich abmelden?", + "Logout": "Ausloggen", + "Settings": "Einstellungen", + "Dark Theme": "Dunkles Thema", + "Error": "Fout", + "Warning": "Waarschuwing", + "Information": "Informatie", + "No account registered with this email": "Server werkt niet/verkeerde url", + "Dismiss": "afwijzen", + "No organizations found Please contact your admin": "Geen organisaties gevonden! Neem contact op met uw beheerder", + "Notification Feature is not installed": "Meddelelsesfunktionen er ikke installeret", + "For complete access, please": "Für vollständigen Zugriff bitte", + "join an organization.": " einer Organisation beitreten.", + "JOIN": "BEITRETEN", + "Camera": "Kamera", + "Gallery": "Galerie", + "NEXT": "NÄCHSTE", + "COMPLETE": "VOLLSTÄNDIG", + "Start app tour to know talawa functioning": "Starten Sie die App-Tour, um die Funktionsweise von Talawa zu erfahren", + "Scan QR": "QR scannen", + "Add tag": "Tag hinzufügen", + "Enter the Tag": "Geben Sie das Tag ein", + "Title": "Titel", + "Where is the event?": "Wo ist das Ereignis?", + "Add Members": "Mitglieder hinzufügen", + "All Events": "Alle Veranstaltungen", + "Created Events": "Erstellte Veranstaltungen", + "Registered Events": "Registrierte Veranstaltungen", + "Send": "Senden", + "Write your comment here..": "Schreiben Sie hier Ihren Kommentar..", + "You need access": "Sie benötigen Zugang", + "Request access, or switch to an account with access": "Fordern Sie Zugang an oder wechseln Sie zu einem Konto mit Zugang", + "Request Access": "Zugang anfordern", + "Last Name": "Nachname", + "First Name": "Vorname", + "Edit Profile": "Profil bearbeiten", + "Log Out": "Ausloggen", + "Please Select an amount": "Bitte wählen Sie einen Betrag", + "Input custom amount": "Benutzerdefinierten Betrag eingeben", + "Organisation Name": "Name der Organisation", + "Choose an Organization": "Wählen Sie eine Organisation", + "Your Report has been sent to the Admin": "Ihr Bericht wurde an den Admin gesendet", + "Report the post to the Admin": "Melden Sie den Beitrag dem Admin", + "Do you really want to delete the post?": "Möchten Sie den Beitrag wirklich löschen?", + "Liked": "Gefällt", + "Looks like there aren't any events.": "Es scheint keine Veranstaltungen zu geben.", + "You have not created any event.": "Sie haben keine Veranstaltung erstellt.", + "No registered events are present": "Keine registrierten Veranstaltungen vorhanden", + "There aren't any public events.": "Es gibt keine öffentlichen Veranstaltungen.", + "There aren't any private events.": "Es gibt keine privaten Veranstaltungen.", + "Donate to the Community": "An die Gemeinschaft spenden", + "Donating to": "Spenden an", + "Are you sure you want to delete this event?": "Sind Sie sicher, dass Sie diese Veranstaltung löschen möchten?", + "Are you sure you want to exit this organization?": "Sind Sie sicher, dass Sie diese Organisation verlassen möchten?", + "This is the Profile tab here you can see all options related to account, app setting, invitation, help etc": "Dies ist der Profil-Tab, hier können Sie alle Optionen im Zusammenhang mit dem Konto, den App-Einstellungen, der Einladung, der Hilfe usw. sehen", + "You can edit application settings like language, theme etc from here": "Sie können die Einstellungen der Anwendung wie Sprache, Thema usw. von hier aus bearbeiten", + "For any help we are always there. You can reach us from here": "Für jede Hilfe sind wir immer da. Sie können uns von hier aus erreichen", + "Current selected Organization Name": "Name der aktuell ausgewählten Organisation", + "Click this button to see options related to switching, joining and leaving organization(s)": "Klicken Sie auf diese Schaltfläche, um Optionen zum Wechseln, Beitreten und Verlassen von Organisation(en) zu sehen", + "Current selected Organization's Name appears here": "Der Name der aktuell ausgewählten Organisation erscheint hier", + "All your joined organizations appear over here you can click on them to change the current organization": "Alle beigetretenen Organisationen erscheinen hier, Sie können darauf klicken, um die aktuelle Organisation zu wechseln", + "From this button you can join other listed organizations": "Über diese Schaltfläche können Sie anderen aufgeführten Organisationen beitreten", + "To leave the current organization you can use this option": "Um die aktuelle Organisation zu verlassen, können Sie diese Option nutzen", + "This is the post card you can like and comment on the post from the options available": "Dies ist die Postkarte, Sie können den Beitrag über die verfügbaren Optionen liken und kommentieren", + "This is the Events tab here you can see all event related information of the current selected organization": "Dies ist der Veranstaltungs-Tab, hier können Sie alle ereignisbezogenen Informationen der aktuell ausgewählten Organisation sehen", + "This is the home tab here you can see the latest post from other members of the current organization": "Dies ist der Home-Tab, hier können Sie den neuesten Beitrag von anderen Mitgliedern der aktuellen Organisation sehen", + "This section displays all the important post set by the organization admin(s)": "Dieser Abschnitt zeigt alle wichtigen Beiträge, die von den Admin(s) der Organisation festgelegt wurden", + "Filter Events based on categories": "Veranstaltungen nach Kategorien filtern", + "Filter Events between selected dates": "Veranstaltungen zwischen ausgewählten Daten filtern", + "Description of event to see more details click on the card": "Beschreibung der Veranstaltung, um weitere Details zu sehen, klicken Sie auf die Karte", + "This is the Create post tab here you can add post to the current selected organization": "Dies ist der Tab 'Beitrag erstellen', hier können Sie der aktuell ausgewählten Organisation einen Beitrag hinzufügen", + "This is the Chat tab here you can see all your messages of the current selected organization": "Dies ist der Chat-Tab, hier können Sie alle Ihre Nachrichten der aktuell ausgewählten Organisation sehen", + "To help your organization grow you can support them financially from here": "Um Ihre Organisation zu unterstützen, können Sie sie finanziell von hier aus unterstützen.", + "You have no event in this organization": "Sie haben keine Veranstaltung in dieser Organisation", + "Create your first event": "Erstellen Sie Ihr erstes Event", + "You are all set to go let's get you in": "Sie sind bereit zu gehen, lassen Sie uns Ihnen helfen.", + "There are no posts in this organization": "Es gibt keine Beiträge in dieser Organisation", + "Create your first post": "Erstellen Sie Ihren ersten Beitrag", + "You have no post in this organization": "Sie haben keinen Beitrag in dieser Organisation", + "You can create a new event from here": "Hier können Sie eine neue Veranstaltung erstellen", + "You are all set to go lets get you in": "Sie sind bereit zu gehen, lassen Sie uns Sie hereinbringen", + "App Tour": "App-Tour", + "Start": "Starten", + "Skip": "Überspringen", + "Posts": "Beiträge", + "Tasks": "Aufgaben", + "Or": "Oder", + "Please select any amount": "Bitte wählen Sie einen Betrag aus", + "Registered": "Registriert", + "Not Registrable": "Nicht registrierbar", + "Enter the title of your post": "Gib den Titel deines Beitrags ein", + "General": "Allgemein", + "Help & Support": "Hilfe & Support", + "Talawa Docs": "Talawa Dokumentation", + "All day": "Den ganzen Tag", + "Join an Organisation": "Einer Organisation beitreten", + "DONATE": "SPENDEN", + "Permission Denied": "Berechtigung verweigert", + "Camera permission is required, to use this feature, give permission from app settings": "Die Kamera-Berechtigung ist erforderlich, um diese Funktion zu verwenden. Erteilen Sie die Berechtigung über die App-Einstellungen.", + "SETTINGS": "EINSTELLUNGEN", + "LogOut": "Ausloggen", + "Membership request already exist": "Mitgliedsantrag existiert bereits", + "Enter a valid password": "Geben Sie ein gültiges Passwort ein", + "Organization Not Found": "Organisation nicht gefunden", + "Account with this email already registered": "Konto mit dieser E-Mail bereits registriert", + "Something went wrong!": "Etwas ist schief gelaufen!", + "URL doesn't exist/no connection please check": "URL existiert nicht/keine Verbindung, bitte überprüfen Sie", + "The QR is not Working": "Der QR-Code funktioniert nicht", + "This QR version is not Supported.": "Diese QR-Version wird nicht unterstützt.", + "Comment sent": "Kommentar gesendet", + "Server not running/wrong url": "Server wird nicht ausgeführt/falsche URL", + "Couldn't update User details": "Benutzerdetails konnten nicht aktualisiert werden", + "Image is added": "Bild hinzugefügt", + "Post is uploaded": "Beitrag hochgeladen", + "Profile updated successfully": "Profil erfolgreich aktualisiert", + "The Camera is not working": "Die Kamera funktioniert nicht", + "This QR is not for the App": "Dieser QR-Code ist nicht für die App", + "The tag was added": "Der Tag wurde hinzugefügt", + "Start time must be before end time": "Die Startzeit muss vor der Endzeit liegen", + "Organisation on different server, logout and scan qr again": "Organisation auf einem anderen Server, ausloggen und QR-Code erneut scannen", + "Post was deleted if you had the rights!": "Der Beitrag wurde gelöscht, wenn Sie die Berechtigungen hatten!", + "Members": "Mitglieder" +} diff --git a/lang/en.json b/lang/en.json new file mode 100644 index 000000000..aa970061d --- /dev/null +++ b/lang/en.json @@ -0,0 +1,280 @@ +{ + "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", + "Notification Feature is not installed": "Notification Feature is not installed", + "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 Community URL": "Enter Community 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", + "Error": "Error", + "Warning": "Warning", + "Information": "Information", + "No account registered with this email": "No account registered with this email", + "Dismiss": "Dismiss", + "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", + "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,$,etc.)": "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,$,etc.)", + "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", + "Please wait": "Please wait", + "for organisation(s) to accept your invitation.": "for organisation(s) to accept your invitation.", + "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", + "Filters": "Filters", + "Filter by Date": "Filter by Date", + "Show all events": "Show all events", + "Show all events created by you": "Show all events created by you", + "Show all events you have registered": "Show all events you have registered", + "Show events for all": "Show events for all", + "Show invite-only events": "Show invite-only 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", + "Settings": "Settings", + "Dark Theme": "Dark Theme", + "No organizations found Please contact your admin": "No organizations found ! Please contact your admin", + "For complete access, please": "For complete access, please", + "join an organization.": " join an organization.", + "JOIN": "JOIN", + "Camera": "Camera", + "Gallery": "Gallery", + "NEXT": "NEXT", + "COMPLETE": "COMPLETE", + "Start app tour to know talawa functioning": "Start app tour to know talawa functioning", + "Scan QR": "Scan QR", + "Add tag": "Add tag", + "Enter the Tag": "Enter the Tag", + "Title": "Title", + "Where is the event?": "Where is the event?", + "Add Members": "Add Members", + "All Events": "All Events", + "Created Events": "Created Events", + "Registered Events": "Registered Events", + "Send": "Send", + "Write your comment here..": "Write your comment here..", + "You need access": "You need access", + "Request access, or switch to an account with access": "Request access, or switch to an account with access", + "Request Access": "Request Access", + "Last Name": "Last Name", + "First Name": "First Name", + "Edit Profile": "Edit Profile", + "Log Out": "Log Out", + "Please Select an amount": "Please Select an amount", + "Input custom amount": "Input custom amount", + "Organisation Name": "Organisation Name", + "Choose an Organization": "Choose an Organization", + "Your Report has been sent to the Admin": "Your Report has been sent to the Admin", + "Report the post to the Admin": "Report the post to the Admin", + "Do you really want to delete the post?": "Do you really want to delete the post?", + "Liked": "Liked", + "Looks like there aren't any events.": "Looks like there aren't any events.", + "You have not created any event.": "You have not created any event.", + "No registered events are present": "No registered events are present", + "There aren't any public events.": "There aren't any public events.", + "There aren't any private events.": "There aren't any private events.", + "Donate to the Community": "Donate to the Community", + "Donating to": "Donating to", + "Are you sure you want to delete this event?": "Are you sure you want to delete this event?", + "Are you sure you want to exit this organization?": "Are you sure you want to exit this organization?", + "This is the Profile tab here you can see all options related to account, app setting, invitation, help etc": "This is the Profile tab here you can see all options related to account, app setting, invitation, help etc.", + "You can edit application settings like language, theme etc from here": "You can edit application settings like language, theme etc from here.", + "For any help we are always there. You can reach us from here": "For any help, we are always there. You can reach us from here.", + "Current selected Organization Name": "Current selected Organization Name", + "Click this button to see options related to switching, joining and leaving organization(s)": "Click this button to see options related to switching, joining and leaving organization(s).", + "Current selected Organization's Name appears here": "Current selected Organization's Name appears here.", + "All your joined organizations appear over here you can click on them to change the current organization": "All your joined organizations appear over here you can click on them to change the current organization.", + "From this button you can join other listed organizations": "From this button you can join other listed organizations.", + "To leave the current organization you can use this option": "To leave the current organization you can use this option.", + "This is the post card you can like and comment on the post from the options available": "This is the post card you can like and comment on the post from the options available.", + "This is the Events tab here you can see all event related information of the current selected organization": "This is the Events tab here you can see all event related information of the current selected organization.", + "This is the home tab here you can see the latest post from other members of the current organization": "This is the home tab here you can see the latest post from other members of the current organization.", + "This section displays all the important post set by the organization admin(s)": "This section displays all the important post set by the organization admin(s).", + "Filter Events based on categories": "Filter Events based on categories.", + "Filter Events between selected dates": "Filter Events between selected dates.", + "Description of event to see more details click on the card": "Description of event to see more details click on the card.", + "This is the Create post tab here you can add post to the current selected organization": "This is the Create post tab here you can add post to the current selected organization.", + "This is the Chat tab here you can see all your messages of the current selected organization": "This is the Chat tab here you can see all your messages of the current selected organization.", + "To help your organization grow you can support them financially from here": "To help your organization grow you can support them financially from here.", + "You are all set to go let's get you in": "You are all set to go let's get you in.", + "You have no event in this organization": "You have no event in this organization", + "Create your first event": "Create your first event", + "There are no posts in this organization": "There are no posts in this organization", + "Create your first post": "Create your first post", + "You have no post in this organization": "You have no post in this organization", + "You can create a new event from here": "You can create a new event from here", + "You are all set to go lets get you in": "You are all set to go lets get you in", + "App Tour": "App Tour", + "Start": "Start", + "Skip": "Skip", + "Posts": "Posts", + "Tasks": "Tasks", + "Or": "Or", + "Please select any amount": "Please select any amount", + "Registered": "Registered", + "Not Registrable": "Not Registrable", + "Enter the title of your post": "Enter the title of your post", + "General": "General", + "Help & Support": "Help & Support", + "Talawa Docs": "Talawa Docs", + "All day": "All day", + "Join an Organisation": "Join an Organisation", + "DONATE": "DONATE", + "Permission Denied": "Permission Denied", + "Camera permission is required, to use this feature, give permission from app settings": "Camera permission is required, to use this feature, give permission from app settings", + "SETTINGS": "SETTINGS", + "LogOut": "LogOut", + "Membership request already exist": "Membership request already exist", + "Enter a valid password": "Enter a valid password", + "Organization Not Found": "Organization Not Found", + "Account with this email already registered": "Account with this email already registered", + "Something went wrong!": "Something went wrong!", + "URL doesn't exist/no connection please check": "URL doesn't exist/no connection please check", + "The QR is not Working": "The QR is not Working", + "This QR version is not Supported.": "This QR version is not Supported.", + "Comment sent": "Comment sent", + "Server not running/wrong url": "Server not running/wrong url", + "Couldn't update User details": "Couldn't update User details", + "Image is added": "Image is added", + "Post is uploaded": "Post is uploaded", + "Profile updated successfully": "Profile updated successfully", + "The Camera is not working": "The Camera is not working", + "This QR is not for the App": "This QR is not for the App", + "The tag was added": "The tag was added", + "Start time must be before end time": "Start time must be before end time", + "Organisation on different server, logout and scan qr again": "Organisation on different server, logout and scan qr again", + "Post was deleted if you had the rights!": "Post was deleted if you had the rights!", + "Members": "Members" +} diff --git a/lang/es.json b/lang/es.json new file mode 100644 index 000000000..df4d6ea1c --- /dev/null +++ b/lang/es.json @@ -0,0 +1,280 @@ +{ + "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": "", + "Notification Feature is not installed": "La función de notificación no está instalada", + "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 Community URL": "Ingrese la URL de la comunidad", + "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", + "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,$,etc.)": "Su contraseña debe tener al menos 8 caracteres, contener al menos una letra numérica, una mayúscula y una minúscula y un carácter especial (@, #, $, etc.)", + "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", + "Please wait": "Espere por favor", + "for organisation(s) to accept your invitation.": "para que la (s) organización (es) acepten su invitación..", + "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": "Añadir 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", + "Filters": "Filtros", + "Filter by Date": "Filtrar por fecha", + "Show all events": "Mostrar todos los eventos", + "Show all events created by you": "Mostrar todos los eventos creados por ti", + "Show all events you have registered": "Mostrar todos los eventos en los que te has registrado", + "Show events for all": "Mostrar eventos para todos", + "Show invite-only events": "Mostrar eventos solo por invitación", + "Add Date": "Agregar fecha", + "Event": "Evento", + "My Events": "Mis Eventos", + "Public Events": "Eventos publicos", + "Private Events": "Eventos privados", + "Liked by": "Gustado 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", + "Settings": "Ajustes", + "Dark Theme": "Tema oscuro", + "Error": "Error", + "Warning": "Advertencia", + "Information": "Información", + "No account registered with this email": "El servidor no se está ejecutando/url", + "Dismiss": "despedir", + "No organizations found Please contact your admin": "Neniuj organizoj trovitaj! Bonvolu kontakti vian administranton", + "For complete access, please": "Para acceso completo, por favor", + "join an organization.": " unirse a una organización.", + "JOIN": "UNIRSE", + "Camera": "Cámara", + "Gallery": "Galería", + "NEXT": "SIGUIENTE", + "COMPLETE": "COMPLETO", + "Start app tour to know talawa functioning": "Inicie el recorrido por la aplicación para conocer el funcionamiento de talawa", + "Scan QR": "Escanear QR", + "Add tag": "Añadir etiqueta", + "Enter the Tag": "Ingrese la Etiqueta", + "Title": "Título", + "Where is the event?": "¿Dónde está el evento?", + "Add Members": "Añadir miembros", + "All Events": "Todos los eventos", + "Created Events": "Eventos creados", + "Registered Events": "Eventos registrados", + "Send": "Enviar", + "Write your comment here..": "Escribe tu comentario aquí..", + "You need access": "Necesitas acceso", + "Request access, or switch to an account with access": "Solicitar acceso o cambiar a una cuenta con acceso", + "Request Access": "Solicitar acceso", + "Last Name": "Apellido", + "First Name": "Nombre", + "Edit Profile": "Editar perfil", + "Log Out": "Cerrar sesión", + "Please Select an amount": "Por favor, seleccione una cantidad", + "Input custom amount": "Ingresar cantidad personalizada", + "Organisation Name": "Nombre de la organización", + "Choose an Organization": "Elija una Organización", + "Your Report has been sent to the Admin": "Su informe ha sido enviado al Administrador", + "Report the post to the Admin": "Reportar la publicación al Administrador", + "Do you really want to delete the post?": "¿Realmente quieres eliminar la publicación?", + "Liked": "Gustado", + "Looks like there aren't any events.": "Parece que no hay eventos.", + "You have not created any event.": "No has creado ningún evento.", + "No registered events are present": "No hay eventos registrados", + "There aren't any public events.": "No hay eventos públicos.", + "There aren't any private events.": "No hay eventos privados.", + "Donate to the Community": "Donar a la Comunidad", + "Donating to": "Donando a", + "Are you sure you want to delete this event?": "¿Estás seguro de que quieres eliminar este evento?", + "Are you sure you want to exit this organization?": "¿Estás seguro de que quieres salir de esta organización?", + "This is the Profile tab here you can see all options related to account, app setting, invitation, help etc": "Esta es la pestaña de Perfil, aquí puedes ver todas las opciones relacionadas con la cuenta, configuración de la aplicación, invitación, ayuda, etc.", + "You can edit application settings like language, theme etc from here": "Puedes editar la configuración de la aplicación, como el idioma, el tema, etc., desde aquí", + "For any help we are always there. You can reach us from here": "Para cualquier ayuda, siempre estamos aquí. Puedes contactarnos desde aquí", + "Current selected Organization Name": "Nombre de la organización actualmente seleccionada", + "Click this button to see options related to switching, joining and leaving organization(s)": "Haz clic en este botón para ver opciones relacionadas con cambiar, unirse y salir de organizaciones", + "Current selected Organization's Name appears here": "El nombre de la organización actualmente seleccionada aparece aquí", + "All your joined organizations appear over here you can click on them to change the current organization": "Todas las organizaciones a las que te has unido aparecen aquí; puedes hacer clic en ellas para cambiar la organización actual", + "From this button you can join other listed organizations": "Desde este botón, puedes unirte a otras organizaciones enumeradas", + "To leave the current organization you can use this option": "Para salir de la organización actual, puedes usar esta opción", + "This is the post card you can like and comment on the post from the options available": "Esta es la tarjeta de la publicación; puedes darle me gusta y comentar en la publicación desde las opciones disponibles", + "This is the Events tab here you can see all event related information of the current selected organization": "Esta es la pestaña de Eventos; aquí puedes ver toda la información relacionada con eventos de la organización actualmente seleccionada", + "This is the home tab here you can see the latest post from other members of the current organization": "Esta es la pestaña de Inicio; aquí puedes ver la última publicación de otros miembros de la organización actual", + "This section displays all the important post set by the organization admin(s)": "Esta sección muestra todas las publicaciones importantes establecidas por el(los) administrador(es) de la organización", + "Filter Events based on categories": "Filtrar eventos según categorías", + "Filter Events between selected dates": "Filtrar eventos entre las fechas seleccionadas", + "Description of event to see more details click on the card": "Descripción del evento; para ver más detalles, haz clic en la tarjeta", + "This is the Create post tab here you can add post to the current selected organization": "Esta es la pestaña de Crear publicación; aquí puedes agregar una publicación a la organización actualmente seleccionada", + "This is the Chat tab here you can see all your messages of the current selected organization": "Esta es la pestaña de Chat; aquí puedes ver todos tus mensajes de la organización actualmente seleccionada", + "To help your organization grow you can support them financially from here": "Para ayudar a que tu organización crezca, puedes apoyarla financieramente desde aquí", + "You are all set to go let's get you in": "Estás listo para ir, vamos a empezar", + "You have no event in this organization": "No tienes ningún evento en esta organización", + "Create your first event": "Crea tu primer evento", + "There are no posts in this organization": "No hay publicaciones en esta organización", + "Create your first post": "Crea tu primera publicación", + "You have no post in this organization": "No tienes ninguna publicación en esta organización", + "You can create a new event from here": "Puede crear un nuevo evento desde aquí", + "You are all set to go lets get you in": "Ya estás listo para irte, vamos a meterte", + "App Tour": "Tour de la aplicación", + "Start": "Comenzar", + "Skip": "Saltar", + "Posts": "Publicaciones", + "Tasks": "Tareas", + "Or": "O", + "Please select any amount": "Por favor, seleccione una cantidad", + "Registered": "Registrado", + "Not Registrable": "No registrable", + "Enter the title of your post": "Ingrese el título de su publicación", + "General": "General", + "Help & Support": "Ayuda y soporte", + "Talawa Docs": "Talawa Documentos", + "All day": "Todo el día", + "Join an Organisation": "Únete a una organización", + "DONATE": "DONAR", + "Permission Denied": "Permiso denegado", + "Camera permission is required, to use this feature, give permission from app settings": "Se requiere permiso de cámara para usar esta función. Otorgue el permiso desde la configuración de la aplicación.", + "SETTINGS": "AJUSTES", + "LogOut": "Cerrar sesión", + "Membership request already exist": "Ya existe una solicitud de membresía", + "Enter a valid password": "Ingrese una contraseña válida", + "Organization Not Found": "Organización no encontrada", + "Account with this email already registered": "Cuenta con este correo electrónico ya registrada", + "Something went wrong!": "¡Algo salió mal!", + "URL doesn't exist/no connection please check": "La URL no existe/no hay conexión, verifique", + "The QR is not Working": "El código QR no funciona", + "This QR version is not Supported.": "Esta versión de QR no es compatible.", + "Comment sent": "Comentario enviado", + "Server not running/wrong url": "Servidor no en ejecución/URL incorrecta", + "Couldn't update User details": "No se pudieron actualizar los detalles del usuario", + "Image is added": "Se agregó la imagen", + "Post is uploaded": "Se subió la publicación", + "Profile updated successfully": "Perfil actualizado correctamente", + "The Camera is not working": "La cámara no funciona", + "This QR is not for the App": "Este código QR no es para la aplicación", + "The tag was added": "Se agregó la etiqueta", + "Start time must be before end time": "La hora de inicio debe ser anterior a la hora de finalización", + "Organisation on different server, logout and scan qr again": "Organización en un servidor diferente, cierre la sesión y escanee el código QR nuevamente", + "Post was deleted if you had the rights!": "¡Se eliminó la publicación si tenías los derechos!", + "Members": "Miembros" +} diff --git a/lang/fr.json b/lang/fr.json new file mode 100644 index 000000000..9c241bbb1 --- /dev/null +++ b/lang/fr.json @@ -0,0 +1,280 @@ +{ + "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", + "Notification Feature is not installed": "La fonction de notification n'est pas installée", + "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 Community URL": "Entrez l'URL de la communauté", + "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", + "Error": "Erreur", + "Warning": "Avertissement", + "Information": "Information", + "No account registered with this email": "Le serveur ne fonctionne pas/mauvaise URL", + "Dismiss": "Rejeter", + "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", + "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,$,etc.)": "Votre mot de passe doit comporter au moins 8 caractères, contenir au moins un chiffre, une lettre majuscule et une lettre minuscule et un caractère spécial (@, #, $, etc.)", + "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", + "Please wait": "S'il vous plaît, attendez", + "for organisation(s) to accept your invitation.": "pour que les organisations acceptent votre invitation.", + "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", + "Filters": "Filtres", + "Filter by Date": "Filtrer par date", + "Show all events": "Afficher tous les événements", + "Show all events created by you": "Afficher tous les événements créés par vous", + "Show all events you have registered": "Afficher tous les événements auxquels vous êtes inscrit", + "Show events for all": "Afficher les événements pour tous", + "Show invite-only events": "Afficher les événements sur invitation uniquement", + "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", + "Settings": "Paramètres", + "Dark Theme": "Thème sombre", + "No organizations found Please contact your admin": "Aucune organisation trouvée ! Veuillez contacter votre administrateur", + "For complete access, please": "Pour un accès complet, veuillez", + "join an organization.": " rejoindre une organisation.", + "JOIN": "REJOINDRE", + "Camera": "Caméra", + "Gallery": "Galerie", + "NEXT": "SUIVANT", + "COMPLETE": "COMPLÉTER", + "Start app tour to know talawa functioning": "Démarrez la visite de l'application pour connaître le fonctionnement de talawa", + "Scan QR": "Scanner QR", + "Add tag": "Ajouter un tag", + "Enter the Tag": "Entrez le Tag", + "Title": "Titre", + "Where is the event?": "Où se trouve l'événement?", + "Add Members": "Ajouter des membres", + "All Events": "Tous les événements", + "Created Events": "Événements créés", + "Registered Events": "Événements enregistrés", + "Send": "Envoyer", + "Write your comment here..": "Écrivez votre commentaire ici..", + "You need access": "Vous avez besoin d'accès", + "Request access, or switch to an account with access": "Demander un accès ou passer à un compte avec accès", + "Request Access": "Demander l'accès", + "Last Name": "Nom de famille", + "First Name": "Prénom", + "Edit Profile": "Modifier le profil", + "Log Out": "Se déconnecter", + "Please Select an amount": "Veuillez sélectionner un montant", + "Input custom amount": "Entrer un montant personnalisé", + "Organisation Name": "Nom de l'organisation", + "Choose an Organization": "Choisissez une Organisation", + "Your Report has been sent to the Admin": "Votre rapport a été envoyé à l'Admin", + "Report the post to the Admin": "Signaler le post à l'Admin", + "Do you really want to delete the post?": "Voulez-vous vraiment supprimer le post?", + "Liked": "Aimé", + "Looks like there aren't any events.": "On dirait qu'il n'y a pas d'événements.", + "You have not created any event.": "Vous n'avez créé aucun événement.", + "No registered events are present": "Aucun événement enregistré n'est présent", + "There aren't any public events.": "Il n'y a pas d'événements publics.", + "There aren't any private events.": "Il n'y a pas d'événements privés.", + "Donate to the Community": "Faire un don à la Communauté", + "Donating to": "Don à", + "Are you sure you want to delete this event?": "Êtes-vous sûr de vouloir supprimer cet événement?", + "Are you sure you want to exit this organization?": "Êtes-vous sûr de vouloir quitter cette organisation?", + "This is the Profile tab here you can see all options related to account, app setting, invitation, help etc": "Ceci est l'onglet Profil où vous pouvez voir toutes les options liées au compte, aux paramètres de l'application, à l'invitation, à l'aide, etc.", + "You can edit application settings like language, theme etc from here": "Vous pouvez modifier les paramètres de l'application comme la langue, le thème, etc. depuis ici", + "For any help we are always there. You can reach us from here": "Pour toute aide, nous sommes toujours là. Vous pouvez nous joindre depuis ici", + "Current selected Organization Name": "Nom de l'organisation actuellement sélectionnée", + "Click this button to see options related to switching, joining and leaving organization(s)": "Cliquez sur ce bouton pour voir les options liées au changement, à l'adhésion et au départ d'organisation(s)", + "Current selected Organization's Name appears here": "Le nom de l'organisation actuellement sélectionnée apparaît ici", + "All your joined organizations appear over here you can click on them to change the current organization": "Toutes les organisations auxquelles vous avez adhéré apparaissent ici, vous pouvez cliquer sur elles pour changer l'organisation actuelle", + "From this button you can join other listed organizations": "À partir de ce bouton, vous pouvez rejoindre d'autres organisations répertoriées", + "To leave the current organization you can use this option": "Pour quitter l'organisation actuelle, vous pouvez utiliser cette option", + "This is the post card you can like and comment on the post from the options available": "Ceci est la carte de publication, vous pouvez aimer et commenter la publication à partir des options disponibles", + "This is the Events tab here you can see all event related information of the current selected organization": "Ceci est l'onglet Événements, ici vous pouvez voir toutes les informations liées aux événements de l'organisation actuellement sélectionnée", + "This is the home tab here you can see the latest post from other members of the current organization": "Ceci est l'onglet Accueil, ici vous pouvez voir le dernier post des autres membres de l'organisation actuelle", + "This section displays all the important post set by the organization admin(s)": "Cette section affiche tous les posts importants définis par le(s) administrateur(s) de l'organisation", + "Filter Events based on categories": "Filtrer les événements en fonction des catégories", + "Filter Events between selected dates": "Filtrer les événements entre les dates sélectionnées", + "Description of event to see more details click on the card": "Description de l'événement, pour voir plus de détails, cliquez sur la carte", + "This is the Create post tab here you can add post to the current selected organization": "Ceci est l'onglet Créer une publication, ici vous pouvez ajouter une publication à l'organisation actuellement sélectionnée", + "This is the Chat tab here you can see all your messages of the current selected organization": "Ceci est l'onglet Chat, ici vous pouvez voir tous vos messages de l'organisation actuellement sélectionnée", + "To help your organization grow you can support them financially from here": "Pour aider votre organisation à se développer, vous pouvez les soutenir financièrement depuis ici.", + "You are all set to go let's get you in": "Vous êtes prêt à partir, laissez-nous vous aider.", + "You have no event in this organization": "Vous n'avez aucun événement dans cette organisation", + "Create your first event": "Créez votre premier événement", + "There are no posts in this organization": "Il n'y a aucun article dans cette organisation", + "Create your first post": "Créez votre premier article", + "You have no post in this organization": "Vous n'avez aucun article dans cette organisation", + "You can create a new event from here": "Vous pouvez créer un nouvel événement à partir d'ici", + "You are all set to go lets get you in": "Vous êtes prêt à partir, laissez-nous vous faire entrer", + "App Tour": "Visite guidée de l'application", + "Start": "Démarrer", + "Skip": "Ignorer", + "Posts": "Publications", + "Tasks": "Tâches", + "Or": "Ou", + "Please select any amount": "Veuillez sélectionner un montant", + "Registered": "Enregistré", + "Not Registrable": "Non enregistrable", + "Enter the title of your post": "Entrez le titre de votre publication", + "General": "Général", + "Help & Support": "Aide et support", + "Talawa Docs": "Talawa Docs", + "All day": "Toute la journée", + "Join an Organisation": "Rejoindre une organisation", + "DONATE": "FAIRE UN DON", + "Permission Denied": "Autorisation refusée", + "Camera permission is required, to use this feature, give permission from app settings": "L'autorisation de la caméra est requise pour utiliser cette fonctionnalité. Accordez l'autorisation à partir des paramètres de l'application.", + "SETTINGS": "PARAMÈTRES", + "LogOut": "Se déconnecter", + "Membership request already exist": "La demande d'adhésion existe déjà", + "Enter a valid password": "Entrez un mot de passe valide", + "Organization Not Found": "Organisation non trouvée", + "Account with this email already registered": "Compte avec cet e-mail déjà enregistré", + "Something went wrong!": "Quelque chose s'est mal passé !", + "URL doesn't exist/no connection please check": "L'URL n'existe pas/pas de connexion, veuillez vérifier", + "The QR is not Working": "Le code QR ne fonctionne pas", + "This QR version is not Supported.": "Cette version de code QR n'est pas prise en charge.", + "Comment sent": "Commentaire envoyé", + "Server not running/wrong url": "Serveur non en cours d'exécution/mauvaise URL", + "Couldn't update User details": "Impossible de mettre à jour les détails de l'utilisateur", + "Image is added": "L'image a été ajoutée", + "Post is uploaded": "Le message a été téléchargé", + "Profile updated successfully": "Profil mis à jour avec succès", + "The Camera is not working": "La caméra ne fonctionne pas", + "This QR is not for the App": "Ce code QR n'est pas pour l'application", + "The tag was added": "La balise a été ajoutée", + "Start time must be before end time": "L'heure de début doit être antérieure à l'heure de fin", + "Organisation on different server, logout and scan qr again": "Organisation sur un serveur différent, déconnectez-vous et scannez à nouveau le code QR", + "Post was deleted if you had the rights!": "Le message a été supprimé si vous aviez les droits !", + "Members": " Membres" +} diff --git a/lang/hi.json b/lang/hi.json new file mode 100644 index 000000000..75d702e97 --- /dev/null +++ b/lang/hi.json @@ -0,0 +1,280 @@ +{ + "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": "चुनते हैं", + "Notification Feature is not installed": "अधिसूचना सुविधा स्थापित नहीं है", + "Selected Organization": "चयनित संगठन", + "Continue": "जारी रखें", + "Enter Community 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": "पासवर्ड खाली नहीं छोड़ना चाहिए", + "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,$,etc.)": "आपका पासवर्ड कम से कम 8 वर्णों का होना चाहिए, जिसमें कम से कम एक संख्यात्मक, एक अपरकेस और एक लोअरकेस अक्षर और एक विशेष वर्ण (@,#,$, आदि) हो।", + "Password must not contain spaces": "पासवर्ड में रिक्त स्थान नहीं होना चाहिए", + "Password does not match original": "पासवर्ड मूल से मेल नहीं खाता", + "Join Organisation": "संगठन में शामिल हों", + "We're": "हमें", + "Glad": "खुशी है कि", + "you're": "आप", + "Back": "वापस आ गए हैं", + "Let's": "आइए", + "get": "आपको", + "you": "साइनअप", + "SignUp": "कराते हैं", + "Please wait": "कृपया प्रतीक्षा कीजिये", + "for organisation(s) to accept your invitation.": "संगठन (ओं) के लिए आपका निमंत्रण स्वीकार करने के लिए।", + "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": "घटनाओं का अन्वेषण करें", + "Filters": "फ़िल्टर", + "Filter by Date": "तारीख़ से फ़िल्टर करें", + "Show all events": "सभी घटनाएँ दिखाएं", + "Show all events created by you": "आपके द्वारा बनाई गई सभी घटनाएँ दिखाएं", + "Show all events you have registered": "आपने जिन घटनाओं में पंजीकृत हुए हैं, उन सभी घटनाएँ दिखाएं", + "Show events for all": "सभी के लिए घटनाएँ दिखाएं", + "Show invite-only 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": "लॉगआउट", + "Settings": "अपनी सेटिंग्स बदलें", + "Dark Theme": "डार्क थीम", + "Error": "गलती", + "Warning": "चेतावनी", + "Information": "जानकारी", + "No account registered with this email": "सर्वर नहीं चल रहा/गलत url", + "Dismiss": "नकार", + "No organizations found Please contact your admin": "कोई संगठन नहीं मिला! कृपया अपने व्यवस्थापक से संपर्क करें", + "For complete access, please": "पूर्ण पहुंच के लिए, कृपया", + "join an organization.": " किसी संगठन से जुड़ें.", + "JOIN": "जोड़ना", + "Camera": "कैमरा", + "Gallery": "गैलरी", + "NEXT": "अगला", + "COMPLETE": "पूर्ण", + "Start app tour to know talawa functioning": "Talawa कार्यप्रणाली जानने के लिए ऐप टूर शुरू करें", + "Scan QR": "QR स्कैन करें", + "Add tag": "टैग जोड़ें", + "Enter the Tag": "टैग दर्ज करें", + "Title": "शीर्षक", + "Where is the event?": "इवेंट कहाँ है?", + "Add Members": "सदस्य जोड़ें", + "All Events": "सभी ईवेंट्स", + "Created Events": "बनाए गए ईवेंट्स", + "Registered Events": "पंजीकृत ईवेंट्स", + "Send": "भेजें", + "Write your comment here..": "यहां अपनी टिप्पणी लिखें..", + "You need access": "आपको पहुँच की आवश्यकता है", + "Request access, or switch to an account with access": "पहुँच का अनुरोध करें, या पहुँच वाले खाते में स्विच करें", + "Request Access": "पहुँच का अनुरोध करें", + "Last Name": "अंतिम नाम", + "First Name": "पहला नाम", + "Edit Profile": "प्रोफ़ाइल संपादित करें", + "Log Out": "लॉग आउट", + "Please Select an amount": "कृपया एक राशि चुनें", + "Input custom amount": "कस्टम राशि दर्ज करें", + "Organisation Name": "संगठन का नाम", + "Choose an Organization": "एक संगठन चुनें", + "Your Report has been sent to the Admin": "आपकी रिपोर्ट एडमिन को भेज दी गई है", + "Report the post to the Admin": "पोस्ट को एडमिन को रिपोर्ट करें", + "Do you really want to delete the post?": "क्या आप वाकई पोस्ट को हटाना चाहते हैं?", + "Liked": "पसंद किया", + "Looks like there aren't any events.": "लगता है कि कोई इवेंट नहीं हैं।", + "You have not created any event.": "आपने कोई इवेंट नहीं बनाया है।", + "No registered events are present": "कोई पंजीकृत इवेंट मौजूद नहीं हैं", + "There aren't any public events.": "कोई सार्वजनिक इवेंट नहीं हैं।", + "There aren't any private events.": "कोई निजी इवेंट नहीं हैं।", + "Donate to the Community": "समुदाय को दान करें", + "Donating to": "को दान देना", + "Are you sure you want to delete this event?": "क्या आप वाकई इस इवेंट को हटाना चाहते हैं?", + "Are you sure you want to exit this organization?": "क्या आप वाकई इस संगठन से बाहर जाना चाहते हैं?", + "This is the Profile tab here you can see all options related to account, app setting, invitation, help etc": "यह प्रोफाइल टैब है जहाँ आप खाता, ऐप सेटिंग, आमंत्रण, सहायता आदि से संबंधित सभी विकल्प देख सकते हैं", + "You can edit application settings like language, theme etc from here": "आप यहाँ से भाषा, थीम आदि जैसी एप्लिकेशन सेटिंग्स को संपादित कर सकते हैं", + "For any help we are always there. You can reach us from here": "किसी भी मदद के लिए हम हमेशा यहाँ होते हैं। आप हमसे यहाँ संपर्क कर सकते हैं", + "Current selected Organization Name": "वर्तमान चयनित संगठन का नाम", + "Click this button to see options related to switching, joining and leaving organization(s)": "स्विचिंग, ज्वाइनिंग और ऑर्गनाइजेशन छोड़ने से संबंधित विकल्प देखने के लिए इस बटन पर क्लिक करें।", + "Current selected Organization's Name appears here": "वर्तमान चयनित संगठन का नाम यहाँ दिखाई देता है।", + "All your joined organizations appear over here you can click on them to change the current organization": "यहाँ सभी आपके जुड़े हुए संगठन दिखाई देते हैं, आप इन पर क्लिक करके वर्तमान संगठन को बदल सकते हैं।", + "From this button you can join other listed organizations": "इस बटन से आप अन्य सूचीबद्ध संगठनों में शामिल हो सकते हैं।", + "To leave the current organization you can use this option": "वर्तमान संगठन छोड़ने के लिए आप इस विकल्प का उपयोग कर सकते हैं।", + "This is the post card you can like and comment on the post from the options available": "यह वह पोस्ट कार्ड है जिस पर आप उपलब्ध विकल्पों से पसंद और टिप्पणी कर सकते हैं।", + "This is the Events tab here you can see all event related information of the current selected organization": "यहाँ इवेंट्स टैब है जहाँ आप वर्तमान चयनित संगठन की सभी इवेंट संबंधित जानकारी देख सकते हैं।", + "This is the home tab here you can see the latest post from other members of the current organization": "यहाँ होम टैब है जहाँ आप वर्तमान संगठन के अन्य सदस्यों के नवीनतम पोस्ट देख सकते हैं।", + "This section displays all the important post set by the organization admin(s)": "यह खंड वह सभी महत्वपूर्ण पोस्ट दिखाता है जो संगठन एडमिन द्वारा निर्धारित की गई हैं।", + "Filter Events based on categories": "श्रेणियों के आधार पर इवेंट्स को फ़िल्टर करें।", + "Filter Events between selected dates": "चयनित तिथियों के बीच इवेंट्स को फ़िल्टर करें।", + "Description of event to see more details click on the card": "इवेंट का विवरण और विवरण देखने के लिए कार्ड पर क्लिक करें।", + "This is the Create post tab here you can add post to the current selected organization": "यह यहाँ से तैयार करें पोस्ट टैब है जहाँ आप वर्तमान चयनित संगठन में पोस्ट जोड़ सकते हैं।", + "This is the Chat tab here you can see all your messages of the current selected organization": "यहाँ चैट टैब है जहाँ आप वर्तमान चयनित संगठन के सभी संदेश देख सकते हैं।", + "To help your organization grow you can support them financially from here": "अपने संगठन को बढ़ावा देने के लिए आप उन्हें यहाँ से वित्तपोषण दे सकते हैं।", + "You are all set to go let's get you in": "आप तैयार हैं जाने के लिए, चलो आपको एंटर करते हैं।", + "You have no event in this organization": "इस संगठन में आपका कोई इवेंट नहीं है", + "Create your first event": "अपना पहला इवेंट बनाएं", + "There are no posts in this organization": "इस संगठन में कोई पोस्ट नहीं है", + "Create your first post": "अपनी पहली पोस्ट बनाएं", + "You have no post in this organization": "इस संगठन में आपका कोई पोस्ट नहीं है", + "You can create a new event from here": "यहां से आप एक नया इवेंट बना सकते हैं", + "You are all set to go lets get you in": "आप सभी सेट हैं जाने के लिए, चलो आपको भेजते हैं", + "App Tour": "ऐप टूर", + "Start": "शुरू करें", + "Skip": "छोड़ दें", + "Posts": "पोस्ट्स", + "Tasks": "टास्क", + "Or": "या", + "Please select any amount": "कृपया कोई राशि का चयन करें", + "Registered": "पंजीकृत", + "Not Registrable": "पंजीकरण योग्य नहीं", + "Enter the title of your post": "अपने पोस्ट का शीर्षक दर्ज करें", + "General": "सामान्य", + "Help & Support": "सहायता और समर्थन", + "Talawa Docs": "Talawa दस्तावेज", + "All day": "पूरा दिन", + "Join an Organisation": "एक संगठन से जुड़ें", + "DONATE": "दान करें", + "Permission Denied": "अनुमति अस्वीकृत", + "Camera permission is required, to use this feature, give permission from app settings": "कैमरे की अनुमति आवश्यक है, इस फ़ीचर का उपयोग करने के लिए, ऐप सेटिंग्स से अनुमति दें", + "SETTINGS": "सेटिंग्स", + "LogOut": "लॉगआउट", + "Membership request already exist": "सदस्यता अनुरोध पहले से ही मौजूद है", + "Enter a valid password": "कृपया एक मान्य पासवर्ड दर्ज करें", + "Organization Not Found": "संगठन नहीं मिला", + "Account with this email already registered": "इस ईमेल से पहले से ही खाता रजिस्टर किया गया है", + "Something went wrong!": "कुछ गलत हो गया!", + "URL doesn't exist/no connection please check": "URL मौजूद नहीं है/कृपया कनेक्शन की जाँच करें", + "The QR is not Working": "QR काम नहीं कर रहा है", + "This QR version is not Supported.": "यह QR वेर्जन समर्थित नहीं है।", + "Comment sent": "टिप्पणी भेज दी गई", + "Server not running/wrong url": "सर्वर रन नहीं हो रहा/गलत URL", + "Couldn't update User details": "उपयोगकर्ता विवरण अपडेट नहीं किये जा सके", + "Image is added": "छवि जोड़ी गई", + "Post is uploaded": "पोस्ट अपलोड किया गया", + "Profile updated successfully": "प्रोफ़ाइल सफलतापूर्वक अपडेट की गई", + "The Camera is not working": "कैमरा काम नहीं कर रहा है", + "This QR is not for the App": "यह QR ऐप के लिए नहीं है", + "The tag was added": "टैग जोड़ा गया था", + "Start time must be before end time": "शुरू समय अंत समय से पहले होना चाहिए", + "Organisation on different server, logout and scan qr again": "संगठन अलग सर्वर पर है, लॉगआउट करें और फिर से QR स्कैन करें", + "Post was deleted if you had the rights!": "यदि आपके पास अधिकार थे तो पोस्ट हटा दिया गया था!", + "Members": " सदस्य" +} diff --git a/lang/ja.json b/lang/ja.json new file mode 100644 index 000000000..7c802fe1e --- /dev/null +++ b/lang/ja.json @@ -0,0 +1,280 @@ +{ + "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": "回復", + "Notification Feature is not installed": "通知機能がインストールされていません", + "your password": "あなたのパスワード", + "Recover Password": "パスワードを回復", + "Select Language": "言語を選択する", + "Default": "ディフォルト", + "Select": "選択する", + "Selected Organization": "選択した組織", + "Continue": "継続する", + "Enter Community URL": "コミュニティの URL を入力してください", + "Verify": "確認", + "Sign Up": "サインアップ", + "Change language": "言語を変更", + "First Name Hint": "John", + "Enter your first name": "名を入力してください", + "Last Name Hint": "Carlos", + "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": "ビューモードGSoCブランチからのタイトル", + "Please verify URL first": "最初にURLを確認してください", + "Enter a valid URL": "有効な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": "パスワードは空白のままにしないでください", + "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,$,etc.)": "パスワードは8文字以上で、数字が1つ、大文字と小文字が1つ、特殊文字(@、#、$など)が1つ含まれている必要があります。", + "Password must not contain spaces": "パスワードにスペースを含めることはできません", + "Password does not match original": "パスワードが元のパスワードと一致しません", + "Join Organisation": "組織に参加する", + "We're": "私たちです", + "Glad": "嬉しい", + "you're": "あなたは", + "Back": "戻る", + "Let's": "しましょう", + "get": "得る", + "you": "あなた", + "SignUp": "サインアップ", + "Please wait": "お待ちください", + "for organisation(s) to accept your invitation.": "組織があなたの招待を受け入れるために。", + "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": "イベントを探索する", + "Filters": "フィルター", + "Filter by Date": "日付で絞り込む", + "Show all events": "すべてのイベントを表示", + "Show all events created by you": "あなたが作成したすべてのイベントを表示", + "Show all events you have registered": "あなたが登録したすべてのイベントを表示", + "Show events for all": "すべてのイベントを表示", + "Show invite-only events": "招待限定イベントを表示", + "Add Date": "日付を追加", + "Event": "イベント", + "My Events": "私のイベント", + "Public Events": "公開イベント", + "Private Events": "プライベートイベント", + "Liked by": "によって好まれる", + "Comments": "コメント", + "FirstName LastName": "名前苗字", + "Pinned Posts": "固定された投稿", + "Profile": "プロフィール", + "Email": "Eメール", + "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": "組織を選択", + "already selected": "すでに選択済み", + "Switched to": "に切り替え", + "Organisation already joined": "組織はすでに参加しています", + "Membership request already sent": "メンバーシップリクエストはすでに送信されています", + "Select one organization to continue": "続行するには組織を1つ選択してください", + "Something went wrong": "何かがうまくいかなかった", + "Join in request sent to": "に送信されたリクエストに参加する", + "successfully": "正常に", + "Are you sure you want to logout?": "ログアウトしてもよろしいですか?", + "Logout": "ログアウト", + "Settings": "設定", + "Dark Theme": "暗いテーマ", + "Error": "エラー", + "Warning": "警告", + "Information": "情報", + "No account registered with this email": "サーバーが実行されていない/間違った URL", + "Dismiss": "解散", + "No organizations found Please contact your admin": "組織が見つかりません!管理者に連絡してください", + "For complete access, please": "完全にアクセスするには、", + "join an organization.": " 組織に参加します。", + "JOIN": "参加する", + "Camera": "カメラ", + "Gallery": "ギャラリー", + "NEXT": "次へ", + "COMPLETE": "完了", + "Start app tour to know talawa functioning": "タラワの機能を知るためにアプリツアーを開始する", + "Scan QR": "QRをスキャン", + "Add tag": "タグを追加する", + "Enter the Tag": "タグを入力してください", + "Title": "タイトル", + "Where is the event?": "イベントはどこですか?", + "Add Members": "メンバーを追加する", + "All Events": "すべてのイベント", + "Created Events": "作成されたイベント", + "Registered Events": "登録されたイベント", + "Send": "送信", + "Write your comment here..": "ここにコメントを書いてください..", + "You need access": "アクセスが必要です", + "Request access, or switch to an account with access": "アクセスを要求するか、アクセス権のあるアカウントに切り替える", + "Request Access": "アクセスをリクエストする", + "Last Name": "苗字", + "First Name": "名", + "Edit Profile": "プロフィールを編集", + "Log Out": "ログアウト", + "Please Select an amount": "金額を選択してください", + "Input custom amount": "カスタム金額を入力", + "Organisation Name": "組織の名前", + "Choose an Organization": "組織を選択する", + "Your Report has been sent to the Admin": "あなたのレポートは管理者に送信されました", + "Report the post to the Admin": "投稿を管理者に報告する", + "Do you really want to delete the post?": "本当に投稿を削除しますか?", + "Liked": "いいね", + "Looks like there aren't any events.": "イベントがないようです。", + "You have not created any event.": "あなたはどんなイベントも作成していません。", + "No registered events are present": "登録されたイベントは存在しません", + "There aren't any public events.": "公開イベントはありません。", + "There aren't any private events.": "プライベートイベントはありません。", + "Donate to the Community": "コミュニティに寄付する", + "Donating to": "に寄付する", + "Are you sure you want to delete this event?": "このイベントを削除してもよろしいですか?", + "Are you sure you want to exit this organization?": "この組織を退出してもよろしいですか?", + "This is the Profile tab here you can see all options related to account, app setting, invitation, help etc": "これはプロファイルタブです。ここでは、アカウント、アプリの設定、招待、ヘルプなどに関連するすべてのオプションを見ることができます。", + "You can edit application settings like language, theme etc from here": "ここから言語、テーマなどのアプリケーションの設定を編集できます。", + "For any help we are always there. You can reach us from here": "お手伝いが必要な場合はいつでもお手伝いします。ここからお問い合わせいただけます。", + "Current selected Organization Name": "現在選択されている組織の名前", + "Click this button to see options related to switching, joining and leaving organization(s)": "組織の切り替え、参加、退出に関連するオプションを見るには、このボタンをクリックしてください。", + "Current selected Organization's Name appears here": "現在選択されている組織の名前がここに表示されます。", + "All your joined organizations appear over here you can click on them to change the current organization": "参加したすべての組織がここに表示され、現在の組織を変更するにはそれらをクリックできます。", + "From this button you can join other listed organizations": "このボタンから他のリストされた組織に参加できます。", + "To leave the current organization you can use this option": "現在の組織を退出するには、このオプションを使用できます。", + "This is the post card you can like and comment on the post from the options available": "これは投稿カードです。利用可能なオプションから投稿にいいねやコメントをすることができます。", + "This is the Events tab here you can see all event related information of the current selected organization": "これはイベントタブです。ここでは、現在選択されている組織の関連するすべてのイベント情報を見ることができます。", + "This is the home tab here you can see the latest post from other members of the current organization": "これはホームタブです。ここでは、現在の組織の他のメンバーの最新の投稿を見ることができます。", + "This section displays all the important post set by the organization admin(s)": "このセクションには組織の管理者によって設定されたすべての重要な投稿が表示されます。", + "Filter Events based on categories": "カテゴリに基づいてイベントをフィルタリング", + "Filter Events between selected dates": "選択した日付の間でイベントをフィルタリング", + "Description of event to see more details click on the card": "詳細を見るには、イベントの説明をクリックしてください。", + "This is the Create post tab here you can add post to the current selected organization": "これは投稿を作成するタブです。ここでは、現在選択されている組織に投稿を追加できます。", + "This is the Chat tab here you can see all your messages of the current selected organization": "これはチャットタブです。ここでは、現在選択されている組織のすべてのメッセージを見ることができます。", + "To help your organization grow you can support them financially from here": "組織の成長をサポートするためには、ここから経済的にサポートできます。", + "You are all set to go let's get you in": "準備が整いました。さあ、始めましょう。", + "You have no event in this organization": "この組織にはイベントがありません", + "Create your first event": "最初のイベントを作成してください", + "There are no posts in this organization": "この組織には投稿がありません", + "Create your first post": "最初の投稿を作成してください", + "You have no post in this organization": "この組織には投稿がありません", + "You can create a new event from here": "ここから新しいイベントを作成できます", + "You are all set to go lets get you in": "あなたは完全に準備が整いました。入れてあげましょう。", + "App Tour": "アプリトール", + "Start": "開始", + "Skip": "スキップ", + "Posts": "投稿", + "Tasks": "タスク", + "Or": "または", + "Please select any amount": "金額を選択してください", + "Registered": "登録済み", + "Not Registrable": "登録不可", + "Enter the title of your post": "投稿タイトルを入力してください", + "General": "一般", + "Help & Support": "ヘルプとサポート", + "Talawa Docs": "Talawa ドキュメント", + "All day": "1日中", + "Join an Organisation": "団体に参加する", + "DONATE": "寄付する", + "Permission Denied": "許可が拒否されました", + "Camera permission is required, to use this feature, give permission from app settings": "この機能を使用するには、カメラの許可が必要です。アプリの設定から許可を与えてください。", + "SETTINGS": "設定", + "LogOut": "ログアウト", + "Membership request already exist": "メンバーシップリクエストはすでに存在しています", + "Enter a valid password": "有効なパスワードを入力してください", + "Organization Not Found": "組織が見つかりません", + "Account with this email already registered": "このメールアドレスではすでにアカウントが登録されています", + "Something went wrong!": "何かが間違っています!", + "URL doesn't exist/no connection please check": "URLが存在しない/接続がないため、確認してください", + "The QR is not Working": "QRコードが動作していません", + "This QR version is not Supported.": "このQRバージョンはサポートされていません。", + "Comment sent": "コメントを送信しました", + "Server not running/wrong url": "サーバーが実行されていません/URLが違います", + "Couldn't update User details": "ユーザーの詳細を更新できませんでした", + "Image is added": "画像が追加されました", + "Post is uploaded": "投稿がアップロードされました", + "Profile updated successfully": "プロファイルを正常に更新しました", + "The Camera is not working": "カメラが動作していません", + "This QR is not for the App": "このQRコードはアプリには使用できません", + "The tag was added": "タグが追加されました", + "Start time must be before end time": "開始時間は終了時間より前でなければなりません", + "Organisation on different server, logout and scan qr again": "異なるサーバー上の組織です。ログアウトして、QRコードを再びスキャンしてください。", + "Post was deleted if you had the rights!": "権限がある場合、投稿は削除されました!", + "Members": " メンバー " +} diff --git a/lang/pt.json b/lang/pt.json new file mode 100644 index 000000000..f83c80a06 --- /dev/null +++ b/lang/pt.json @@ -0,0 +1,280 @@ +{ + "Hello": "Olá", + "User Name": "Nome do usuário", + "we've": "wir haben", + "got you covered": "te cobrimos", + "password": "senha", + "Enter new password": "Insira a nova senha", + "Re-Enter your password": "Digite sua senha novamente", + "Change Password": "Mudar senha", + "Email Hint": "test@test.org", + "Enter your registered Email": "Digite seu e-mail cadastrado", + "Enter your password": "Coloque sua senha", + "Forgot password": "Esqueceu sua senha", + "Login": "Conecte-se", + "Sit back relax, we'll": "Sente-se relaxe, vamos", + "Notification Feature is not installed": "O recurso de notificação não está instalado", + "Recover": "Recuperar", + "your password": "sua senha", + "Recover Password": "Recuperar senha", + "Select Language": "Selecione o idioma", + "Default": "Predefinição", + "Select": "Selecione", + "Selected Organization": "Organização Selecionada", + "Continue": "Prosseguir", + "Enter Community URL": "Insira o URL da sua comunidade", + "Verify": "Verificar", + "Sign Up": "Inscrever-se", + "Change language": "Mudar idioma", + "First Name Hint": "John", + "Enter your first name": "Digite seu primeiro nome", + "Last Name Hint": "Carlos", + "Enter your last name": "Digite seu sobrenome", + "Confirm your password": "Confirme sua senha", + "Next": "Próxima", + "Request Sent to": "Pedido enviado para", + "Log out": "Sair", + "Join": "Juntar", + "and": "e", + "Collaborate": "Colaborar", + "with your": "com o seu", + "Organizations": "Organizações", + "Title from the viewMode GSoC branch": "Título da ramificação viewMode GSoC", + "Please verify URL first": "Verifique o URL primeiro", + "Enter a valid URL": "Insira um URL válido", + "Firstname must not be left blank.": "O nome não deve ser deixado em branco.", + "Invalid Firstname": "Nome Inválido", + "Lastname must not be left blank.": "O sobrenome não deve ser deixado em branco.", + "Invalid Lastname": "Sobrenome inválido", + "Email must not be left blank": "O e-mail não deve ser deixado em branco", + "Please enter a valid Email Address": "Por favor insira um endereço de e-mail válido", + "Password must not be left blank": "A senha não deve ser deixada em branco", + "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,$,etc.)": "Sua senha deve ter pelo menos 8 caracteres, conter pelo menos um número, uma letra maiúscula e uma minúscula e um caractere especial (@,#,$,etc.)", + "Password must not contain spaces": "A senha não deve conter espaços", + "Password does not match original": "A senha não corresponde ao original", + "Join Organisation": "Junte-se à organização", + "We're": "Estamos", + "Glad": "Alegre", + "you're": "você é", + "Back": "Voltar", + "Let's": "Vamos", + "get": "pegue", + "you": "tu", + "SignUp": "Inscrever-se", + "Please wait": "Por favor, espere", + "for organisation(s) to accept your invitation.": "para a (s) organização (ões) aceitarem o seu convite.", + "Add Event Title": "Adicionar Título do Evento", + "Where is the event": "Onde é o evento", + "Add Location": "Adicionar local", + "Describe the event": "Descreva o evento", + "Add Description": "Adicionar descrição", + "Add Event": "Adicionar Evento", + "Add": "Adicionar", + "Add Image": "Adicionar imagem", + "Select Start Date and Time": "Selecione a data e hora de início", + "Select End Date and Time": "Selecione a data e hora de término", + "Does not repeat": "Não repete", + "Keep Public": "Manter público", + "Keep Registerable": "Manter registrável", + "Event Details": "detalhes do evento", + "Register": "Registro", + "Created by": "Created by", + "public": "pública", + "private": "privada", + "Description": "Descrição", + "Admins": "Admins", + "Attendees": "Participantes", + "See all": "Ver tudo", + "Start Date": "Data de início", + "End Date": "Data final", + "Cancel": "Cancelar", + "Done": "Feita", + "Explore Events": "Explorar eventos", + "Filters": "Filtros", + "Filter by Date": "Filtrar por data", + "Show all events": "Mostrar todos os eventos", + "Show all events created by you": "Mostrar todos os eventos criados por você", + "Show all events you have registered": "Mostrar todos os eventos em que você se registrou", + "Show events for all": "Mostrar eventos para todos", + "Show invite-only events": "Mostrar apenas eventos com convite", + "Add Date": "Adicionar Data", + "Event": "Evento", + "My Events": "Meus Eventos", + "Public Events": "Eventos Públicos", + "Private Events": "Eventos Privados", + "Liked by": "Curtido por", + "Comments": "Comentários", + "FirstName LastName": "Primeiro nome, ultimo nome", + "Pinned Posts": "Postagens fixadas", + "Profile": "Perfil", + "Email": "O email", + "Update": "Atualizar", + "App Settings": "Configurações do aplicativo", + "Language": "Língua", + "dark mode": "modo escuro", + "font size": "tamanho da fonte", + "Help": "Ajuda", + "Reach out to us for help": "Entre em contato conosco para obter ajuda", + "Donate Us": "Doe-nos", + "Help us to develop for you": "Ajude-nos a desenvolver para você", + "Log out from Talawa": "Saia de Talawa", + "Share News": "Compartilhe notícias", + "Post": "Publicar", + "Organization Name": "Nome da organização", + "Add hasthtag": "Adicionar hashtag", + "Write here what do you want to share": "Escreva aqui o que você deseja compartilhar", + "Join selected organisation": "Junte-se à organização selecionada", + "Home": "Casa", + "Events": "Eventos", + "Chat": "Bate-papo", + "Chat Screen": "Tela de bate-papo", + "Confirm": "confirme", + "Confirmation": "Confirmação", + "Close": "Fechar", + "Switch Organization": "Mudar de organização", + "Join new Organization": "Junte-se a uma nova organização", + "Leave Current Organization": "Sair da Organização Atual", + "Creator": "Criadora", + "Public": "Pública", + "Private": "Privada", + "No Internet": "Sem internet", + "Subscribed": "Subscrito", + "from": "a partir de", + "See all Pinned news": "Ver todas as notícias fixadas", + "show more": "mostre mais", + "show less": "mostre menos", + "Likes": "Gosta", + "comments": "comentários", + "Final": "Final", + "Enter Details": "Insira os detalhes", + "Select\nOrganization": "Selecione a Organização", + "already selected": "já selecionado", + "Switched to": "Transferido para", + "Organisation already joined": "Organização já aderiu", + "Membership request already sent": "Pedido de adesão já enviado", + "Select one organization to continue": "Selecione uma organização para continuar", + "Something went wrong": "Algo deu errado", + "Join in request sent to": "Solicitação de adesão enviada para", + "successfully": "com sucesso", + "Are you sure you want to logout?": "Tem certeza que deseja sair?", + "Logout": "Sair", + "Settings": "Definições", + "Dark Theme": "Tema escuro", + "Error": "Erro", + "Warning": "Aviso", + "Information": "Informação", + "No account registered with this email": "Servidor não está em execução/url errado", + "Dismiss": "liberar", + "No organizations found Please contact your admin": "Neniuj organizoj trovitaj! Bonvolu kontakti vian administranton", + "For complete access, please": "Para acesso completo, por favor", + "join an organization.": " ingressar em uma organização.", + "JOIN": "ENTRAR", + "Camera": "Câmera", + "Gallery": "Galeria", + "NEXT": "PRÓXIMO", + "COMPLETE": "COMPLETO", + "Start app tour to know talawa functioning": "Inicie o tour do aplicativo para conhecer o funcionamento do talawa", + "Scan QR": "Escanear QR", + "Add tag": "Adicionar tag", + "Enter the Tag": "Digite a Tag", + "Title": "Título", + "Where is the event?": "Onde é o evento?", + "Add Members": "Adicionar membros", + "All Events": "Todos os eventos", + "Created Events": "Eventos criados", + "Registered Events": "Eventos registrados", + "Send": "Enviar", + "Write your comment here..": "Escreva seu comentário aqui..", + "You need access": "Você precisa de acesso", + "Request access, or switch to an account with access": "Solicitar acesso ou mudar para uma conta com acesso", + "Request Access": "Solicitar acesso", + "Last Name": "Sobrenome", + "First Name": "Nome", + "Edit Profile": "Editar perfil", + "Log Out": "Sair", + "Please Select an amount": "Por favor, selecione um valor", + "Input custom amount": "Inserir valor personalizado", + "Organisation Name": "Nome da Organização", + "Choose an Organization": "Escolha uma Organização", + "Your Report has been sent to the Admin": "Seu relatório foi enviado ao Administrador", + "Report the post to the Admin": "Reportar a postagem ao Administrador", + "Do you really want to delete the post?": "Você realmente quer deletar a postagem?", + "Liked": "Curtido", + "Looks like there aren't any events.": "Parece que não há eventos.", + "You have not created any event.": "Você não criou nenhum evento.", + "No registered events are present": "Não há eventos registrados", + "There aren't any public events.": "Não há eventos públicos.", + "There aren't any private events.": "Não há eventos privados.", + "Donate to the Community": "Doar para a Comunidade", + "Donating to": "Doando para", + "Are you sure you want to delete this event?": "Tem certeza de que deseja excluir este evento?", + "Are you sure you want to exit this organization?": "Tem certeza de que deseja sair desta organização?", + "This is the Profile tab here you can see all options related to account, app setting, invitation, help etc": "Esta é a aba de Perfil, onde você pode ver todas as opções relacionadas à conta, configurações do aplicativo, convites, ajuda, etc.", + "You can edit application settings like language, theme etc from here": "Você pode editar as configurações do aplicativo, como idioma, tema, etc., a partir daqui", + "For any help we are always there. You can reach us from here": "Para qualquer ajuda, estamos sempre aqui. Você pode nos contatar a partir daqui", + "Current selected Organization Name": "Nome da organização atualmente selecionada", + "Click this button to see options related to switching, joining and leaving organization(s)": "Clique neste botão para ver opções relacionadas a trocar, juntar-se e sair de organizações", + "Current selected Organization's Name appears here": "O nome da organização atualmente selecionada aparece aqui", + "All your joined organizations appear over here you can click on them to change the current organization": "Todas as organizações às quais você se juntou aparecem aqui; você pode clicar nelas para mudar a organização atual", + "From this button you can join other listed organizations": "A partir deste botão, você pode se juntar a outras organizações listadas", + "To leave the current organization you can use this option": "Para sair da organização atual, você pode usar esta opção", + "This is the post card you can like and comment on the post from the options available": "Este é o cartão de postagem; você pode curtir e comentar na postagem a partir das opções disponíveis", + "This is the Events tab here you can see all event related information of the current selected organization": "Esta é a aba de Eventos; aqui você pode ver todas as informações relacionadas a eventos da organização atualmente selecionada", + "This is the home tab here you can see the latest post from other members of the current organization": "Esta é a aba Início; aqui você pode ver a última postagem de outros membros da organização atual", + "This section displays all the important post set by the organization admin(s)": "Esta seção exibe todas as postagens importantes definidas pelos administradores da organização", + "Filter Events based on categories": "Filtre eventos com base em categorias", + "Filter Events between selected dates": "Filtre eventos entre as datas selecionadas", + "Description of event to see more details click on the card": "Descrição do evento; para ver mais detalhes, clique no cartão", + "This is the Create post tab here you can add post to the current selected organization": "Esta é a aba de Criar postagem; aqui você pode adicionar uma postagem à organização atualmente selecionada", + "This is the Chat tab here you can see all your messages of the current selected organization": "Esta é a aba de Chat; aqui você pode ver todas as suas mensagens da organização atualmente selecionada", + "To help your organization grow you can support them financially from here": "Para ajudar sua organização a crescer, você pode apoiá-la financeiramente a partir daqui", + "You are all set to go let's get you in": "Você está pronto para ir; vamos começar", + "You have no event in this organization": "Você não tem nenhum evento nesta organização", + "Create your first event": "Crie seu primeiro evento", + "There are no posts in this organization": "Não há posts nesta organização", + "Create your first post": "Crie sua primeira postagem", + "You have no post in this organization": "Você não tem nenhuma postagem nesta organização", + "You can create a new event from here": "Você pode criar um novo evento aqui", + "You are all set to go lets get you in": "Você está tudo pronto para ir, vamos te levar", + "App Tour": "Tour do aplicativo", + "Start": "Iniciar", + "Skip": "Pular", + "Posts": "Postagens", + "Tasks": "Tarefas", + "Or": "Ou", + "Please select any amount": "Por favor, selecione uma quantia", + "Registered": "Registado", + "Not Registrable": "Não registrável", + "Enter the title of your post": "Insira o título do seu post", + "General": "Geral", + "Help & Support": "Ajuda e suporte", + "Talawa Docs": "Talawa Documentos", + "All day": "Todo o dia", + "Join an Organisation": "Junte-se a uma organização", + "DONATE": "DOAR", + "Permission Denied": "Permissão negada", + "Camera permission is required, to use this feature, give permission from app settings": "É necessária permissão de câmera para usar este recurso. Conceda permissão pelas configurações do aplicativo.", + "SETTINGS": "CONFIGURAÇÕES", + "LogOut": "Sair", + "Membership request already exist": "Solicitação de associação já existe", + "Enter a valid password": "Insira uma senha válida", + "Organization Not Found": "Organização não encontrada", + "Account with this email already registered": "Conta com este e-mail já está registrada", + "Something went wrong!": "Algo deu errado!", + "URL doesn't exist/no connection please check": "A URL não existe/não há conexão, verifique", + "The QR is not Working": "O código QR não está funcionando", + "This QR version is not Supported.": "Esta versão do QR não é suportada.", + "Comment sent": "Comentário enviado", + "Server not running/wrong url": "Servidor não está em execução/URL errada", + "Couldn't update User details": "Não foi possível atualizar os detalhes do usuário", + "Image is added": "Imagem adicionada", + "Post is uploaded": "Postagem enviada", + "Profile updated successfully": "Perfil atualizado com sucesso", + "The Camera is not working": "A câmera não está funcionando", + "This QR is not for the App": "Este código QR não é para o aplicativo", + "The tag was added": "A tag foi adicionada", + "Start time must be before end time": "O horário de início deve ser anterior ao horário de término", + "Organisation on different server, logout and scan qr again": "Organização em servidor diferente, faça logout e escaneie o QR novamente", + "Post was deleted if you had the rights!": "A postagem foi excluída se você tiver os direitos!", + "Members": "Membros" +} diff --git a/lang/zh.json b/lang/zh.json new file mode 100644 index 000000000..8d473194c --- /dev/null +++ b/lang/zh.json @@ -0,0 +1,280 @@ +{ + "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": "", + "Notification Feature is not installed": "未安装通知功能\n", + "your password": "我们会找回您的密码", + "Recover Password": "恢复你的密码", + "Select Language": "选择语言", + "Default": "默认值", + "Select": "选择", + "Selected Organization": "选定组织", + "Continue": "继续", + "Enter Community 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": "密码不能为空", + "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,$,etc.)": "您的密码长度必须至少为 8 个字符,至少包含 1 个数字、1 个大写和 1 个小写字母以及 1 个特殊字符(@、#、$ 等)", + "Password must not contain spaces": "密码不能包含空格", + "Password does not match original": "密码与原密码不符", + "Join Organisation": "加入组织", + "We're": "我们很高兴", + "Glad": "", + "you're": "你回来了", + "Back": "", + "Let's": "让我们", + "get": "帮", + "you": "", + "SignUp": "你注册", + "Please wait": "请稍等", + "for organisation(s) to accept your invitation.": "以便组织接受您的邀请。", + "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": "探索事件", + "Filters": "过滤器", + "Filter by Date": "按日期过滤", + "Show all events": "显示所有活动", + "My Events": "我的活动", + "Show all events created by you": "显示由您创建的所有活动", + "Show all events you have registered": "显示您已注册的所有活动", + "Public Events": "公共活动", + "Show events for all": "显示所有人的活动", + "Private Events": "私人活动", + "Show invite-only events": "仅显示邀请活动", + "Add Date": "添加日期", + "Event": "事件", + "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": "登出", + "Settings": "设置", + "Dark Theme": "黑暗主题", + "Error": "错误", + "Warning": "警告", + "Information": "信息", + "No account registered with this email": "服务器未运行/网址错误", + "Dismiss": "解雇", + "No organizations found Please contact your admin": "未找到任何组织。请联系您的管理员。", + "For complete access, please": "如需完整访问,请", + "join an organization.": " 加入一个组织。", + "JOIN": "加入", + "Camera": "相机", + "Gallery": "画廊", + "NEXT": "下一个", + "COMPLETE": "完成", + "Start app tour to know talawa functioning": "启动应用程序导览以了解塔拉瓦的功能", + "Scan QR": "扫描QR码", + "Add tag": "添加标签", + "Enter the Tag": "输入标签", + "Title": "标题", + "Where is the event?": "事件在哪里?", + "Add Members": "添加成员", + "All Events": "所有活动", + "Created Events": "创建的活动", + "Registered Events": "注册的活动", + "Send": "发送", + "Write your comment here..": "在此处写下您的评论..", + "You need access": "您需要访问权限", + "Request access, or switch to an account with access": "请求访问权限,或切换到有访问权限的账户", + "Request Access": "请求访问", + "Last Name": "姓氏", + "First Name": "名字", + "Edit Profile": "编辑个人资料", + "Log Out": "登出", + "Please Select an amount": "请选择一个金额", + "Input custom amount": "输入自定义金额", + "Organisation Name": "组织名称", + "Choose an Organization": "选择一个组织", + "Your Report has been sent to the Admin": "您的报告已发送给管理员", + "Report the post to the Admin": "向管理员举报帖子", + "Do you really want to delete the post?": "您真的想要删除这个帖子吗?", + "Liked": "喜欢", + "Looks like there aren't any events.": "看起来没有任何活动。", + "You have not created any event.": "您还没有创建任何活动。", + "No registered events are present": "没有注册的活动", + "There aren't any public events.": "没有公开的活动。", + "There aren't any private events.": "没有私人活动。", + "Donate to the Community": "向社区捐款", + "Donating to": "捐赠给", + "Are you sure you want to delete this event?": "您确定要删除此活动吗?", + "Are you sure you want to exit this organization?": "您确定要退出这个组织吗?", + "This is the Profile tab here you can see all options related to account, app setting, invitation, help etc": "这是个人资料选项卡,您可以在此处查看与帐户、应用设置、邀请、帮助等相关的所有选项。", + "You can edit application settings like language, theme etc from here": "您可以从这里编辑应用程序设置,如语言、主题等。", + "For any help we are always there. You can reach us from here": "任何帮助我们都会在这里。您可以通过这里联系我们。", + "Current selected Organization Name": "当前选择的组织名称", + "Click this button to see options related to switching, joining and leaving organization(s)": "单击此按钮以查看与切换、加入和离开组织相关的选项。", + "Current selected Organization's Name appears here": "当前选择的组织名称将显示在此处。", + "All your joined organizations appear over here you can click on them to change the current organization": "您加入的所有组织都会显示在这里,您可以单击它们以更改当前的组织。", + "From this button you can join other listed organizations": "您可以通过此按钮加入其他列出的组织。", + "To leave the current organization you can use this option": "要离开当前组织,您可以使用此选项。", + "This is the post card you can like and comment on the post from the options available": "这是帖子卡片,您可以从可用的选项中点赞并评论帖子。", + "This is the Events tab here you can see all event related information of the current selected organization": "这是活动选项卡,您可以在此处查看当前选择组织的所有与活动相关的信息。", + "This is the home tab here you can see the latest post from other members of the current organization": "这是主页选项卡,您可以在此处查看当前组织其他成员的最新帖子。", + "This section displays all the important post set by the organization admin(s)": "此部分显示由组织管理员设置的所有重要帖子。", + "Filter Events based on categories": "基于类别筛选事件", + "Filter Events between selected dates": "在选定的日期之间筛选事件", + "Description of event to see more details click on the card": "事件描述以查看更多详情,请单击卡片。", + "This is the Create post tab here you can add post to the current selected organization": "这是创建帖子选项卡,您可以在此处向当前选择的组织添加帖子。", + "This is the Chat tab here you can see all your messages of the current selected organization": "这是聊天选项卡,您可以在此处查看当前选择组织的所有消息。", + "To help your organization grow you can support them financially from here": "要帮助您的组织成长,您可以从这里提供财务支持。", + "You are all set to go let's get you in": "您已经准备好了,让我们开始吧。", + "You have no event in this organization": "您在此组织中没有活动", + "Create your first event": "创建您的第一个活动", + "There are no posts in this organization": "此组织中没有帖子", + "Create your first post": "创建您的第一篇帖子", + "You have no post in this organization": "您在此组织中没有帖子", + "You can create a new event from here": "您可以从这里创建一个新活动", + "You are all set to go lets get you in": "您已经准备好出发了,让我们带您进去", + "App Tour": "应用导览", + "Start": "开始", + "Skip": "跳过", + "Posts": "帖子", + "Tasks": "任务", + "Or": "或者", + "Please select any amount": "请选择任何金额", + "Registered": "已注册", + "Not Registrable": "不可注册", + "Enter the title of your post": "请输入您的帖子标题", + "General": "普通", + "Help & Support": "帮助和支持", + "Talawa Docs": "Talawa 文档", + "All day": "一整天", + "Join an Organisation": "加入一个组织", + "DONATE": "捐赠", + "Permission Denied": "权限被拒绝", + "Camera permission is required, to use this feature, give permission from app settings": "使用此功能需要摄像头权限。请从应用设置中授予权限。", + "SETTINGS": "设置", + "LogOut": "登出", + "Membership request already exist": "已存在会员请求", + "Enter a valid password": "请输入有效密码", + "Organization Not Found": "未找到组织", + "Account with this email already registered": "该电子邮件已注册帐户", + "Something went wrong!": "出错了!", + "URL doesn't exist/no connection please check": "URL不存在/没有连接,请检查", + "The QR is not Working": "二维码无法使用", + "This QR version is not Supported.": "不支持此二维码版本。", + "Comment sent": "已发送评论", + "Server not running/wrong url": "服务器未运行/URL错误", + "Couldn't update User details": "无法更新用户详细信息", + "Image is added": "已添加图像", + "Post is uploaded": "已上传帖子", + "Profile updated successfully": "已成功更新资料", + "The Camera is not working": "相机无法使用", + "This QR is not for the App": "此二维码不适用于本应用", + "The tag was added": "已添加标签", + "Start time must be before end time": "开始时间必须在结束时间之前", + "Organisation on different server, logout and scan qr again": "组织在不同的服务器上,请注销并重新扫描二维码", + "Post was deleted if you had the rights!": "如果您有权限,则已删除帖子!", + "Members": "成员" +} diff --git a/lib/apptheme.dart b/lib/apptheme.dart new file mode 100644 index 000000000..c036bf6bc --- /dev/null +++ b/lib/apptheme.dart @@ -0,0 +1,165 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/rendering.dart'; + +/// Apptheme class. +/// +class AppTheme { + // Text Styles + /// Custom theme for the app. + /// + static TextStyle title = const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + color: blackPrimary, + fontFamily: 'OpenSans', + decorationThickness: 0, + ); + + /// Custom theme for the app. + static TextStyle headline1 = const TextStyle( + fontSize: 24, + fontWeight: FontWeight.w600, + color: blackPrimary, + fontFamily: 'OpenSans', + ); + + /// Custom theme for the app. + static TextStyle headline2 = const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w600, + color: blackPrimary, + fontFamily: 'OpenSans', + ); + + /// Custom theme for the app. + static TextStyle headline3 = const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: blackPrimary, + fontFamily: 'OpenSans', + ); + + /// Custom theme for the app. + static TextStyle headline4 = const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + color: blackPrimary, + fontFamily: 'OpenSans', + ); + + /// Custom theme for the app. + static TextStyle headline5 = const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w600, + color: blackPrimary, + fontFamily: 'OpenSans', + ); + + /// Custom theme for the app. + static TextStyle headline6 = const TextStyle( + fontSize: 10, + fontWeight: FontWeight.w600, + color: blackPrimary, + fontFamily: 'OpenSans', + ); + + /// Custom theme for the app. + static TextStyle subtitle1 = const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: blackSecondary, + fontFamily: 'OpenSans', + ); + + /// Custom theme for the app. + static TextStyle subtitle2 = const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w500, + color: blackSecondary, + fontFamily: 'OpenSans', + ); + + /// Custom theme for the app. + static TextStyle bodyText1 = const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w400, + color: blackSecondary, + fontFamily: 'OpenSans', + ); + + /// Custom theme for the app. + static TextStyle bodyText2 = const TextStyle( + fontSize: 8, + fontWeight: FontWeight.w400, + color: blackSecondary, + fontFamily: 'OpenSans', + ); + + /// Custom theme for the app. + static TextStyle bodyText3 = const TextStyle( + fontSize: 10, + fontWeight: FontWeight.w400, + color: blackSecondary, + fontFamily: 'OpenSans', + ); + + /// Custom theme for the app. + static TextStyle overline = const TextStyle( + fontSize: 6, + fontWeight: FontWeight.w400, + color: blackSecondary, + fontFamily: 'OpenSans', + ); + + /// Custom theme for the app. + static TextStyle button = const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: primary, + fontFamily: 'OpenSans', + ); + + /// Colors. + /// + /// Custom colors for the app. + static const Color primary = Color(0xFFFFC107); + + /// Custom colors for the app. + static const Color secondary = Color(0xFF795548); + + /// Custom colors for the app. + static const Color tertiary = Color(0xFFA16938); + + /// Custom colors for the app. + static const Color white = Color(0xFFFFFFFF); + + /// Custom colors for the app. + static const Color red = Color(0xFFEB5757); + + /// Custom colors for the app. + static const Color blue = Color(0xFF2196F3); + + /// Custom colors for the app. + static const Color yellow = Color(0xffF6BA18); + + /// Custom colors for the app. + static const Color green = Color(0xFF2ACC00); + + /// Custom colors for the app. + static const Color grey = Color(0xFFD2D2D2); + + /// Custom colors for the app. + static const Color lightGrey = Color(0xFFECECEC); + + /// Custom colors for the app. + static const Color blackPrimary = Color(0xFF3E3E3E); + + /// Custom colors for the app. + static const Color blackSecondary = Color(0xFF636363); + + /// Custom colors for the app. + static const Color blackTertiary = Color(0xFFAEAEAE); + + /// Custom colors for the app. + static const Color shadow = Color(0x408E8E8E); +} diff --git a/lib/constants/constants.dart b/lib/constants/constants.dart new file mode 100644 index 000000000..5cf96cdd4 --- /dev/null +++ b/lib/constants/constants.dart @@ -0,0 +1,152 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:talawa/models/language/language_model.dart'; + +/// This file contains the prototypes of all the languages available and supported currencies. +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', + ), + Language( + countryCode: 'JP', + langCode: 'ja', + langName: '日本', + langSample: 'ようこそユーザー', + ), + Language( + countryCode: 'GE', + langCode: 'de', + langName: 'Deutsch', + langSample: 'Willkommen Benutzer', + ), + Language( + countryCode: 'PE', + langCode: 'pt', + langName: 'português', + langSample: 'Bem-vindo, usuário', + ), +]; + +List supportedCurrencies = [ + 'AED', + 'ALL', + 'AMD', + 'ARS', + 'AUD', + 'AWG', + 'BBD', + 'BDT', + 'BMD', + 'BND', + 'BOB', + 'BSD', + 'BWP', + 'BZD', + 'CAD', + 'CHF', + 'CNY', + 'COP', + 'CRC', + 'CUP', + 'CZK', + 'DKK', + 'DOP', + 'DZD', + 'EGP', + 'ETB', + 'EUR', + 'FJD', + 'GBP', + 'GHS', + 'GIP', + 'GMD', + 'GTQ', + 'GYD', + 'HKD', + 'HNL', + 'HRK', + 'HTG', + 'HUF', + 'IDR', + 'ILS', + 'INR', + 'JMD', + 'KES', + 'KGS', + 'KHR', + 'KYD', + 'KZT', + 'LAK', + 'LBP', + 'LKR', + 'LRD', + 'LSL', + 'MAD', + 'MDL', + 'MKD', + 'MMK', + 'MNT', + 'MOP', + 'MUR', + 'MVR', + 'MWK', + 'MXN', + 'MYR', + 'NAD', + 'NGN', + 'NIO', + 'NOK', + 'NPR', + 'NZD', + 'PEN', + 'PGK', + 'PHP', + 'PKR', + 'QAR', + 'RUB', + 'SAR', + 'SCR', + 'SEK', + 'SGD', + 'SLL', + 'SOS', + 'SSP', + 'SVC', + 'SZL', + 'THB', + 'TTD', + 'TZS', + 'USD', + 'UYU', + 'UZS', + 'YER', + 'ZAR', +]; diff --git a/lib/constants/custom_theme.dart b/lib/constants/custom_theme.dart new file mode 100644 index 000000000..15909e59d --- /dev/null +++ b/lib/constants/custom_theme.dart @@ -0,0 +1,143 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; + +///This file contains various custom themes. +///For instance, lightTheme, darkTheme, _lightTextTheme, _darkTextTheme, etc. +///These are imported to other files/widgets to apply the required themes. +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, + iconTheme: const IconThemeData( + color: _lightIconColor, + ), + fontFamily: 'product-sans', + textTheme: _lightTextTheme, + inputDecorationTheme: _lightInputDecor, + colorScheme: const ColorScheme.light( + primaryContainer: _lightPrimaryVariantColor, + primary: _lightColorSchemePrimary, + secondary: Color(0xffF5F5F5), + secondaryContainer: _darkScaffoldColor, + ).copyWith(secondary: _lightAccentColor), + ); + + static final darkTheme = ThemeData( + textSelectionTheme: const TextSelectionThemeData( + cursorColor: _darkCursorColor, + ), + scaffoldBackgroundColor: _darkScaffoldColor, + primaryColor: _darkPrimaryColor, + iconTheme: const IconThemeData( + color: _darkIconColor, + ), + fontFamily: 'product-sans', + textTheme: _darkTextTheme, + inputDecorationTheme: _darkInputDecor, + colorScheme: const ColorScheme.dark( + primaryContainer: _darkPrimaryVariantColor, + primary: _darkColorSchemePrimary, + secondary: Colors.black, + secondaryContainer: _lightScaffoldColor, + ).copyWith(secondary: _darkAccentColor), + ); + + static const TextTheme _lightTextTheme = TextTheme( + headlineMedium: TextStyle( + fontWeight: FontWeight.w700, + fontSize: 34, + ), + headlineSmall: TextStyle( + color: _lightInBlack, + fontSize: 20, + ), + titleLarge: TextStyle( + fontSize: 16, + color: Color(0xFF737373), + ), + bodyLarge: TextStyle( + fontSize: 14, + ), + bodyMedium: TextStyle( + fontSize: 14, + ), + bodySmall: TextStyle( + fontWeight: FontWeight.w400, + color: Color(0xFF737373), + fontSize: 12.0, + ), + ); + + static const TextTheme _darkTextTheme = TextTheme( + headlineMedium: TextStyle( + fontWeight: FontWeight.w700, + fontSize: 34, + ), + headlineSmall: TextStyle(color: _darkInWhite, fontSize: 20), + titleLarge: TextStyle( + fontSize: 16, + color: Color(0xFF737373), + ), + bodyLarge: TextStyle( + fontSize: 14, + color: Colors.white, + ), + bodyMedium: TextStyle( + fontSize: 14, + color: Colors.white, + ), + bodySmall: 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/quick_actions.dart b/lib/constants/quick_actions.dart new file mode 100644 index 000000000..690fbbd08 --- /dev/null +++ b/lib/constants/quick_actions.dart @@ -0,0 +1,32 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:quick_actions/quick_actions.dart'; + +///This file contains the shortcuts by which user can manage and interact with the +///application. quick_actions package is used for this purpose. +class ShortCutMenu { + static final quickActionsList = [ + eventAction, + feedAction, + chatAction, + ]; + + static const eventAction = ShortcutItem( + type: "events_action", + localizedTitle: "Events", + icon: "event_icon", + ); + + static const feedAction = ShortcutItem( + type: "feed_action", + localizedTitle: "NewsFeed", + icon: "newsfeed_icon", + ); + + static const chatAction = ShortcutItem( + type: "chat_action", + localizedTitle: "Messages", + icon: "chat_icon", + ); +} diff --git a/lib/constants/recurrence_values.dart b/lib/constants/recurrence_values.dart new file mode 100644 index 000000000..c6393aa06 --- /dev/null +++ b/lib/constants/recurrence_values.dart @@ -0,0 +1,53 @@ +/// Class containing constants for recurrence options. +class Recurrance { + /// Constant representing an event that does not repeat. + static const once = 'Does not repeat'; + + /// Constant representing daily recurrence. + static const daily = 'day'; + + /// Constant representing weekly recurrence. + static const weekly = 'week'; + + /// Constant representing monthly recurrence. + static const monthly = 'month'; + + /// Constant representing yearly recurrence. + static const yearly = 'year'; + + /// Constant representing a custom recurrence. + static const custom = 'custom...'; + + /// Constant representing Monday in weekdays. + static const weekdayMonday = 'MO'; + + /// Constant representing Tuesday in weekdays. + static const weekdayTuesday = 'TU'; + + /// Constant representing Wednesday in weekdays. + static const weekdayWednesday = 'WE'; + + /// Constant representing Thursday in weekdays. + static const weekdayThursday = 'TH'; + + /// Constant representing Friday in weekdays. + static const weekdayFriday = 'FR'; + + /// Constant representing Saturday in weekdays. + static const weekdaySaturday = 'SA'; + + /// Constant representing Sunday in weekdays. + static const weekdaySunday = 'SU'; +} + +/// Class containing constants for event end types. +class EventEndTypes { + /// Constant representing an event that never ends. + static const never = 'Never'; + + /// Constant representing an event that ends on a specific date. + static const on = 'On'; + + /// Constant representing an event that ends after a specified number of occurrences. + static const after = 'After'; +} diff --git a/lib/constants/routing_constants.dart b/lib/constants/routing_constants.dart new file mode 100644 index 000000000..389607c6e --- /dev/null +++ b/lib/constants/routing_constants.dart @@ -0,0 +1,117 @@ +///This file contains the routes. These can be used to make push screen call via Routes.splashScreen to access these string. + +class Routes { + /// static variables. + static const String demoPageViewRoute = "/demoPageViewRoute"; + + /// static variables. + static const String splashScreen = "/"; + + /// static variables. + static const String languageSelectionRoute = "/selectLang"; + + /// static variables. + static const String setUrlScreen = "/setUrl"; + + /// static variables. + static const String loginScreen = "/login"; + + /// static variables. + static const String selectOrgScreen = "/selectOrg"; + + /// static variables. + static const String signupDetailScreen = "/signupDetails"; + + /// static variables. + static const String waitingScreen = "/waiting"; + + /// static variables. + static const String recoverScreen = "/recover"; + + /// static variables. + static const String updateScreen = "/update"; + + /// static variables. + static const String homeScreen = "/homeScreen"; + + /// static variables. + static const String demoHomeScreen = "/demoHomeScreen"; + + /// static variables. + static const String mainScreen = "/mainScreen"; + + /// static variables. + static const String progressDialog = "/progress"; + + /// static variables. + static const String individualPost = "/individualPost"; + + /// static variables. + static const String pinnedPostPage = "/pinnedPostPage"; + + /// static variables. + static const String exploreEventsScreen = "/exploreEvents"; + + /// static variables. + static const String demoExploreEventsScreen = "/demoExploreEvents"; + + /// static variables. + static const String eventInfoPage = "/eventInfo"; + + /// static variables. + static const String createEventPage = "/createEventPage"; + + /// static variables. + static const String customRecurrencePage = "/customRecurrencePage"; + + /// static variables. + static const String profilePage = "/profilePage"; + + /// static variables. + static const String demoProfilePage = "/demoProfilePage"; + + /// static variables. + static const String editProfilePage = "/editProfilePage"; + + /// static variables. + static const String joinOrg = '/joinOrg'; + + /// static variables. + static const String requestAccess = '/requestAccess'; + + /// static variables. + static const String editEventPage = "/editEventPage"; + + /// static variables. + static const String appSettings = '/appSettingsPage'; + + /// static variables. + static const String chatMessageScreen = '/chatMessageScreen'; + + /// static variables. + static const String calendar = '/calendar'; + + /// static variables. + static const String eventTasks = '/event_tasks'; + + /// static variables. + static const String userTasks = '/user_tasks'; + + /// static variables. + static const String addTask = '/addTask'; + + /// static variables. + static const String editTask = '/editTask'; + + /// static variables. + static const String selectContact = '/selectContact'; + + /// static variable to access pinnedpostscreen. + static const String pinnedPostScreen = '/pinnedpostscreen'; + + /// static variable to access addPostScreen. + static const String addPostScreen = '/addpostscreen'; + + /// static variable to access org info screen. + static const String orgInfoScreen = '/OrganisationInfoScreen'; +} diff --git a/lib/constants/timeout.dart b/lib/constants/timeout.dart new file mode 100644 index 000000000..810a3c944 --- /dev/null +++ b/lib/constants/timeout.dart @@ -0,0 +1,11 @@ +/// Class to define constant timeout to bring consistency in the code. +class TimeOuts { + /// For small timeout, used for small data fetch. + static const small = 5; + + /// For medium timeout, used for medium data fetch. + static const mediums = 100; + + /// For large timeout, used for large data fetch. + static const large = 300; +} diff --git a/lib/custom_painters/language_icon.dart b/lib/custom_painters/language_icon.dart new file mode 100644 index 000000000..dbc2d1d87 --- /dev/null +++ b/lib/custom_painters/language_icon.dart @@ -0,0 +1,330 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; + +///This class draws the language icon using custom paint. +///CustomPaint is a widget from the Flutter SDK, which enables +/// you to use a canvas to draw different shapes. +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..f10f32b7e --- /dev/null +++ b/lib/custom_painters/talawa_logo.dart @@ -0,0 +1,433 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; + +///This class draws the app logo using custom paint. +///CustomPaint is a widget from the Flutter SDK, which enables +/// you to use a canvas to draw different shapes. +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/custom_painters/telegram_logo.dart b/lib/custom_painters/telegram_logo.dart new file mode 100644 index 000000000..7519d7bb4 --- /dev/null +++ b/lib/custom_painters/telegram_logo.dart @@ -0,0 +1,123 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'dart:ui' as ui; + +import 'package:flutter/material.dart'; + +///This class draws the telegram logo using custom paint. +///CustomPaint is a widget from the Flutter SDK, which enables +/// you to use a canvas to draw different shapes. + +//Copy this CustomPainter code to the Bottom of the File +class TelegramLogo extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final Paint paint0Fill = Paint()..style = PaintingStyle.fill; + paint0Fill.shader = ui.Gradient.linear( + Offset(size.width * 0.6670000, size.height * 0.1670000), + Offset(size.width * 0.4170000, size.height * 0.7500000), [ + const Color(0xff37aee2).withOpacity(1), + const Color(0xff1e96c8).withOpacity(1), + ], [ + 0, + 1, + ]); + canvas.drawCircle( + Offset(size.width * 0.5000000, size.height * 0.5000000), + size.width * 0.5000000, + paint0Fill, + ); + + final Path path_1 = Path(); + path_1.moveTo(size.width * 0.4083333, size.height * 0.7291667); + path_1.cubicTo( + size.width * 0.3921333, + size.height * 0.7291667, + size.width * 0.3948875, + size.height * 0.7230500, + size.width * 0.3893000, + size.height * 0.7076250, + ); + path_1.lineTo(size.width * 0.3416667, size.height * 0.5508625); + path_1.lineTo(size.width * 0.7083333, size.height * 0.3333333); + + final Paint paint1Fill = Paint()..style = PaintingStyle.fill; + paint1Fill.color = const Color(0xffc8daea).withOpacity(1.0); + canvas.drawPath(path_1, paint1Fill); + + final Path path_2 = Path(); + path_2.moveTo(size.width * 0.4083333, size.height * 0.7291667); + path_2.cubicTo( + size.width * 0.4208333, + size.height * 0.7291667, + size.width * 0.4263542, + size.height * 0.7234500, + size.width * 0.4333333, + size.height * 0.7166667, + ); + path_2.lineTo(size.width * 0.5000000, size.height * 0.6518417); + path_2.lineTo(size.width * 0.4168417, size.height * 0.6016958); + + final Paint paint2Fill = Paint()..style = PaintingStyle.fill; + paint2Fill.color = const Color(0xffa9c9dd).withOpacity(1.0); + canvas.drawPath(path_2, paint2Fill); + + final Path path_3 = Path(); + path_3.moveTo(size.width * 0.4168333, size.height * 0.6017083); + path_3.lineTo(size.width * 0.6183333, size.height * 0.7505792); + path_3.cubicTo( + size.width * 0.6413292, + size.height * 0.7632667, + size.width * 0.6579208, + size.height * 0.7566958, + size.width * 0.6636500, + size.height * 0.7292333, + ); + path_3.lineTo(size.width * 0.7456708, size.height * 0.3427208); + path_3.cubicTo( + size.width * 0.7540667, + size.height * 0.3090542, + size.width * 0.7328375, + size.height * 0.2937792, + size.width * 0.7108375, + size.height * 0.3037667, + ); + path_3.lineTo(size.width * 0.2292125, size.height * 0.4894792); + path_3.cubicTo( + size.width * 0.1963375, + size.height * 0.5026667, + size.width * 0.1965333, + size.height * 0.5210083, + size.width * 0.2232208, + size.height * 0.5291792, + ); + path_3.lineTo(size.width * 0.3468167, size.height * 0.5677583); + path_3.lineTo(size.width * 0.6329542, size.height * 0.3872375); + path_3.cubicTo( + size.width * 0.6464625, + size.height * 0.3790458, + size.width * 0.6588625, + size.height * 0.3834458, + size.width * 0.6486875, + size.height * 0.3924792, + ); + + final Paint paint3Fill = Paint()..style = PaintingStyle.fill; + paint3Fill.shader = ui.Gradient.linear( + Offset(size.width * 0.6600000, size.height * 0.4370000), + Offset(size.width * 0.8510000, size.height * 0.8020000), [ + const Color(0xffeff7fc).withOpacity(1), + const Color(0xffffffff).withOpacity(1), + ], [ + 0, + 1, + ]); + canvas.drawPath(path_3, paint3Fill); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) { + return true; + } +} diff --git a/lib/custom_painters/whatsapp_logo.dart b/lib/custom_painters/whatsapp_logo.dart new file mode 100644 index 000000000..fb150dd35 --- /dev/null +++ b/lib/custom_painters/whatsapp_logo.dart @@ -0,0 +1,433 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; + +///This class draws the whatsapp logo using custom paint. +///CustomPaint is a widget from the Flutter SDK, which enables +/// you to use a canvas to draw different shapes. +class WhatsappLogo extends CustomPainter { + @override + void paint(Canvas canvas, Size size) { + final Path path_0 = Path(); + path_0.moveTo(size.width * 0.3580000, size.height * 0.1673307); + path_0.cubicTo( + size.width * 0.4170000, + size.height * 0.1406375, + size.width * 0.4836000, + size.height * 0.1314741, + size.width * 0.5480000, + size.height * 0.1400398, + ); + path_0.cubicTo( + size.width * 0.6134000, + size.height * 0.1486056, + size.width * 0.6760000, + size.height * 0.1764940, + size.width * 0.7260000, + size.height * 0.2193227, + ); + path_0.cubicTo( + size.width * 0.7740000, + size.height * 0.2595618, + size.width * 0.8106000, + size.height * 0.3129482, + size.width * 0.8308000, + size.height * 0.3719124, + ); + path_0.cubicTo( + size.width * 0.8540000, + size.height * 0.4390438, + size.width * 0.8558000, + size.height * 0.5133466, + size.width * 0.8360000, + size.height * 0.5810757, + ); + path_0.arcToPoint( + Offset(size.width * 0.7034000, size.height * 0.7677291), + radius: + Radius.elliptical(size.width * 0.3520000, size.height * 0.3505976), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_0.arcToPoint( + Offset(size.width * 0.5662000, size.height * 0.8264940), + radius: + Radius.elliptical(size.width * 0.3500000, size.height * 0.3486056), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_0.cubicTo( + size.width * 0.4822000, + size.height * 0.8424303, + size.width * 0.3930000, + size.height * 0.8268924, + size.width * 0.3202000, + size.height * 0.7826693, + ); + path_0.cubicTo( + size.width * 0.3156000, + size.height * 0.7806773, + size.width * 0.3112000, + size.height * 0.7756972, + size.width * 0.3058000, + size.height * 0.7778884, + ); + path_0.lineTo(size.width * 0.1780000, size.height * 0.8107570); + path_0.lineTo(size.width * 0.2120000, size.height * 0.6864542); + path_0.cubicTo( + size.width * 0.2140000, + size.height * 0.6820717, + size.width * 0.2100000, + size.height * 0.6784861, + size.width * 0.2080000, + size.height * 0.6745020, + ); + path_0.cubicTo( + size.width * 0.1694000, + size.height * 0.6159363, + size.width * 0.1494000, + size.height * 0.5454183, + size.width * 0.1514000, + size.height * 0.4752988, + ); + path_0.cubicTo( + size.width * 0.1534000, + size.height * 0.3318725, + size.width * 0.2454000, + size.height * 0.2183267, + size.width * 0.3574000, + size.height * 0.1665339, + ); + + final Paint paint0Fill = Paint()..style = PaintingStyle.fill; + paint0Fill.color = const Color(0xff40c351).withOpacity(1.0); + canvas.drawPath(path_0, paint0Fill); + + final Path path_1 = Path(); + path_1.moveTo(size.width * 0.3760000, size.height * 0.2908367); + path_1.cubicTo( + size.width * 0.3854000, + size.height * 0.2910359, + size.width * 0.3916000, + size.height * 0.2994024, + size.width * 0.3952000, + size.height * 0.3067729, + ); + path_1.cubicTo( + size.width * 0.4072000, + size.height * 0.3326693, + size.width * 0.4168000, + size.height * 0.3593625, + size.width * 0.4282000, + size.height * 0.3854582, + ); + path_1.cubicTo( + size.width * 0.4306000, + size.height * 0.3908367, + size.width * 0.4322000, + size.height * 0.3968127, + size.width * 0.4302000, + size.height * 0.4025896, + ); + path_1.cubicTo( + size.width * 0.4242000, + size.height * 0.4195219, + size.width * 0.4102000, + size.height * 0.4316733, + size.width * 0.3990000, + size.height * 0.4452191, + ); + path_1.cubicTo( + size.width * 0.3950000, + size.height * 0.4498008, + size.width * 0.3954000, + size.height * 0.4563745, + size.width * 0.3986000, + size.height * 0.4611554, + ); + path_1.arcToPoint( + Offset(size.width * 0.5456000, size.height * 0.5876494), + radius: + Radius.elliptical(size.width * 0.2600000, size.height * 0.2589641), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.cubicTo( + size.width * 0.5516000, + size.height * 0.5902390, + size.width * 0.5588000, + size.height * 0.5896414, + size.width * 0.5630000, + size.height * 0.5844622, + ); + path_1.arcToPoint( + Offset(size.width * 0.5970000, size.height * 0.5428287), + radius: + Radius.elliptical(size.width * 0.5640000, size.height * 0.5617530), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.cubicTo( + size.width * 0.6062000, + size.height * 0.5308765, + size.width * 0.6142000, + size.height * 0.5342629, + size.width * 0.6262000, + size.height * 0.5392430, + ); + path_1.lineTo(size.width * 0.7030000, size.height * 0.5760956); + path_1.cubicTo( + size.width * 0.7090000, + size.height * 0.5786853, + size.width * 0.7150000, + size.height * 0.5830677, + size.width * 0.7144000, + size.height * 0.5900398, + ); + path_1.cubicTo( + size.width * 0.7184000, + size.height * 0.6418327, + size.width * 0.6718000, + size.height * 0.6820717, + size.width * 0.6230000, + size.height * 0.6836653, + ); + path_1.cubicTo( + size.width * 0.4970000, + size.height * 0.6745020, + size.width * 0.4110000, + size.height * 0.6047809, + size.width * 0.3490000, + size.height * 0.5243028, + ); + path_1.cubicTo( + size.width * 0.3286000, + size.height * 0.4960159, + size.width * 0.3070000, + size.height * 0.4675299, + size.width * 0.2958000, + size.height * 0.4338645, + ); + path_1.cubicTo( + size.width * 0.2852000, + size.height * 0.4043825, + size.width * 0.2848000, + size.height * 0.3707171, + size.width * 0.2974000, + size.height * 0.3416335, + ); + path_1.cubicTo( + size.width * 0.3168000, + size.height * 0.3027888, + size.width * 0.3338000, + size.height * 0.2878486, + size.width * 0.3766000, + size.height * 0.2902390, + ); + path_1.close(); + path_1.moveTo(size.width * 0.2580000, size.height * 0.1422311); + path_1.cubicTo( + size.width * 0.3504000, + size.height * 0.07649402, + size.width * 0.4700000, + size.height * 0.05139442, + size.width * 0.5820000, + size.height * 0.07370518, + ); + path_1.arcToPoint( + Offset(size.width * 0.7774000, size.height * 0.1699203), + radius: + Radius.elliptical(size.width * 0.4180000, size.height * 0.4163347), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_1.arcToPoint( + Offset(size.width * 0.9178000, size.height * 0.4368526), + radius: + Radius.elliptical(size.width * 0.4200000, size.height * 0.4183267), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_1.arcToPoint( + Offset(size.width * 0.8918000, size.height * 0.6380478), + radius: + Radius.elliptical(size.width * 0.4220000, size.height * 0.4203187), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_1.cubicTo( + size.width * 0.8622000, + size.height * 0.7137450, + size.width * 0.8098000, + size.height * 0.7802789, + size.width * 0.7434000, + size.height * 0.8272908, + ); + path_1.arcToPoint( + Offset(size.width * 0.5254000, size.height * 0.9039841), + radius: + Radius.elliptical(size.width * 0.4180000, size.height * 0.4163347), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_1.arcToPoint( + Offset(size.width * 0.2994000, size.height * 0.8541833), + radius: + Radius.elliptical(size.width * 0.4200000, size.height * 0.4183267), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_1.lineTo(size.width * 0.07540000, size.height * 0.9119522); + path_1.lineTo(size.width * 0.1344000, size.height * 0.6968127); + path_1.cubicTo( + size.width * 0.1356000, + size.height * 0.6942231, + size.width * 0.1338000, + size.height * 0.6920319, + size.width * 0.1324000, + size.height * 0.6900398, + ); + path_1.arcToPoint( + Offset(size.width * 0.08240000, size.height * 0.4310757), + radius: + Radius.elliptical(size.width * 0.4200000, size.height * 0.4183267), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_1.arcToPoint( + Offset(size.width * 0.2574000, size.height * 0.1422311), + radius: + Radius.elliptical(size.width * 0.4260000, size.height * 0.4243028), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_1.moveTo(size.width * 0.3568000, size.height * 0.1673307); + path_1.cubicTo( + size.width * 0.2898000, + size.height * 0.1972112, + size.width * 0.2328000, + size.height * 0.2486056, + size.width * 0.1964000, + size.height * 0.3121514, + ); + path_1.cubicTo( + size.width * 0.1676000, + size.height * 0.3619522, + size.width * 0.1516000, + size.height * 0.4187251, + size.width * 0.1504000, + size.height * 0.4760956, + ); + path_1.cubicTo( + size.width * 0.1484000, + size.height * 0.5462151, + size.width * 0.1684000, + size.height * 0.6165339, + size.width * 0.2070000, + size.height * 0.6752988, + ); + path_1.cubicTo( + size.width * 0.2090000, + size.height * 0.6788845, + size.width * 0.2126000, + size.height * 0.6826693, + size.width * 0.2110000, + size.height * 0.6872510, + ); + path_1.lineTo(size.width * 0.1770000, size.height * 0.8115538); + path_1.cubicTo( + size.width * 0.2196000, + size.height * 0.8007968, + size.width * 0.2622000, + size.height * 0.7892430, + size.width * 0.3050000, + size.height * 0.7784861, + ); + path_1.cubicTo( + size.width * 0.3104000, + size.height * 0.7764940, + size.width * 0.3150000, + size.height * 0.7808765, + size.width * 0.3194000, + size.height * 0.7832669, + ); + path_1.arcToPoint( + Offset(size.width * 0.5654000, size.height * 0.8272908), + radius: + Radius.elliptical(size.width * 0.3500000, size.height * 0.3486056), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.arcToPoint( + Offset(size.width * 0.7026000, size.height * 0.7685259), + radius: + Radius.elliptical(size.width * 0.3460000, size.height * 0.3446215), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.arcToPoint( + Offset(size.width * 0.8352000, size.height * 0.5818725), + radius: + Radius.elliptical(size.width * 0.3520000, size.height * 0.3505976), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.arcToPoint( + Offset(size.width * 0.8300000, size.height * 0.3727092), + radius: + Radius.elliptical(size.width * 0.3500000, size.height * 0.3486056), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.arcToPoint( + Offset(size.width * 0.7252000, size.height * 0.2201195), + radius: + Radius.elliptical(size.width * 0.3500000, size.height * 0.3486056), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.arcToPoint( + Offset(size.width * 0.5470000, size.height * 0.1408367), + radius: + Radius.elliptical(size.width * 0.3480000, size.height * 0.3466135), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.cubicTo( + size.width * 0.4830000, + size.height * 0.1322709, + size.width * 0.4162000, + size.height * 0.1414343, + size.width * 0.3570000, + size.height * 0.1681275, + ); + path_1.close(); + + final Paint paint1fill = Paint()..style = PaintingStyle.fill; + paint1fill.color = const Color(0xfffcfcfc).withOpacity(1.0); + canvas.drawPath(path_1, paint1fill); + } + + @override + bool shouldRepaint(covariant CustomPainter oldDelegate) { + return true; + } +} diff --git a/lib/demo_server_data/direct_chat_demo_data.dart b/lib/demo_server_data/direct_chat_demo_data.dart new file mode 100644 index 000000000..7bd545d36 --- /dev/null +++ b/lib/demo_server_data/direct_chat_demo_data.dart @@ -0,0 +1,167 @@ +/// This file contains demo data. +/// +/// It contains a list of type Map and sample data of chats. +const directChatDemoData = [ + { + "sender": { + "name": "Sender 1", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url", + }, + "lastMessage": { + "sender": { + "name": "Sender Name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url", + }, + "messageID": "asdasdfasdfgasdf", + "text": "Last message from the sender.", + "bool": "True", + }, + "unreadCount": 6, + }, + { + "sender": { + "name": "Sender 2", + "id": "sadiufghbasdqwuibnnads", + "image": "sender_profile_inmage_url", + }, + "lastMessage": { + "sender": { + "name": "Sender name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url", + }, + "messageID": "asdasdfasdfgasdf", + "text": "Last message from the sender.", + "bool": "True", + }, + "unreadCount": 6, + }, + { + "sender": { + "name": "Sender 8", + "id": "sadiusfgafghbasdqwuibnuads", + "image": "sender_profile_inmage_url", + }, + "lastMessage": { + "sender": { + "name": "Sender Name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url", + }, + "messageID": "asdasdfasdfgasdf", + "text": "Latest message", + "bool": "True", + }, + "unreadCount": 3, + }, + { + "sender": { + "name": "Sender 7", + "id": "sasdasddiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url", + }, + "lastMessage": { + "sender": { + "name": "Sender Name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url", + }, + "messageID": "asdasdfasdfgasdf", + "text": "Latest message", + "bool": "True", + }, + "unreadCount": 3, + }, + { + "sender": { + "name": "Sender 6", + "id": "sadiufghbassadasddqwuibnuads", + "image": "sender_profile_inmage_url", + }, + "lastMessage": { + "sender": { + "name": "Sender Name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url", + }, + "messageID": "asdasdfasdfgasdf", + "text": "Latest message", + "bool": "True", + }, + "unreadCount": 3, + }, + { + "sender": { + "name": "Sender 5", + "id": "sadiufghbasdqwsaduibnuads", + "image": "sender_profile_inmage_url", + }, + "lastMessage": { + "sender": { + "name": "Sender 5", + "id": "sadiufghbasdqwdfdibnuads", + "image": "sender_profile_inmage_url", + }, + "messageID": "asdasdfasdfgasdf", + "text": "Latest message", + "bool": "True", + }, + "unreadCount": 3, + }, + { + "sender": { + "name": "Sender 4", + "id": "sadiufghbsdasdqwuibnuads", + "image": "sender_profile_inmage_url", + }, + "lastMessage": { + "sender": { + "name": "Sender Name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url", + }, + "messageID": "asdasdfasdfgasdf", + "text": "Latest message", + "bool": "True", + }, + "unreadCount": 3, + }, + { + "sender": { + "name": "Sender 41", + "id": "sadiufghbadgsdqwuibnuads", + "image": "sender_profile_inmage_url", + }, + "lastMessage": { + "sender": { + "name": "Sender Name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url", + }, + "messageID": "asdasdfasdfgasdf", + "text": "Latest message", + "bool": "True", + }, + "unreadCount": 1, + }, + { + "sender": { + "name": "Sender 13", + "id": "sadiufghbadsfsdqwuibnuads", + "image": "sender_profile_inmage_url", + }, + "lastMessage": { + "sender": { + "name": "Sender Name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url", + }, + "messageID": "asdasdfasdfgasdf", + "text": "Latest message", + "bool": "True", + }, + "unreadCount": 8, + }, +]; 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..9d22b4ef9 --- /dev/null +++ b/lib/demo_server_data/events_demo_data.dart @@ -0,0 +1,223 @@ +/// 'eventsDemoData' is a list of events that are used to display the events in the app. +/// +/// Each event has the following properties: +/// - title: The title of the event. +/// - description: The description of the event. +/// - location: The location of the event. +/// - recurring: Whether the event is recurring or not. +/// - allDay: Whether the event is an all-day event or not. +/// - startDate: The start date of the event. +/// - endDate: The end date of the event. +/// - startTime: The start time of the event. +/// - endTime: The end time of the event. +/// - recurrence: The recurrence of the event. +/// - isPublic: Whether the event is public or not. +/// - isSubscribed: Whether the user is subscribed to the event or not. +/// - isRegisterable: Whether the event is registerable or not. +/// - creator: The creator of the event. +/// - attendees: The attendees of the event. +/// - admins: The admins of the event. +/// - organization: The organization of the event. + +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.", + "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", + }, + "attendees": [ + {"id": "attendee1", "firstName": "firstName1", "lastName": "lastName1"}, + {"id": "attendee2", "firstName": "firstName2", "lastName": "lastName2"}, + {"id": "attendee3", "firstName": "firstName3", "lastName": "lastName3"}, + {"id": "attendee4", "firstName": "firstName4", "lastName": "lastName4"}, + {"id": "attendee5", "firstName": "firstName5", "lastName": "lastName5"}, + {"id": "attendee6", "firstName": "firstName6", "lastName": "lastName6"}, + {"id": "attendee7", "firstName": "firstName7", "lastName": "lastName7"}, + {"id": "attendee8", "firstName": "firstName8", "lastName": "lastName8"}, + {"id": "attendee9", "firstName": "firstName9", "lastName": "lastName9"}, + { + "id": "attendee10", + "firstName": "firstName10", + "lastName": "lastName10", + }, + ], + "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.", + "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", + }, + "attendees": [ + {"id": "attendee1", "firstName": "firstName1", "lastName": "lastName1"}, + {"id": "attendee2", "firstName": "firstName2", "lastName": "lastName2"}, + {"id": "attendee3", "firstName": "firstName3", "lastName": "lastName3"}, + {"id": "attendee4", "firstName": "firstName4", "lastName": "lastName4"}, + {"id": "attendee5", "firstName": "firstName5", "lastName": "lastName5"}, + {"id": "attendee6", "firstName": "firstName6", "lastName": "lastName6"}, + {"id": "attendee7", "firstName": "firstName7", "lastName": "lastName7"}, + {"id": "attendee8", "firstName": "firstName8", "lastName": "lastName8"}, + {"id": "attendee9", "firstName": "firstName9", "lastName": "lastName9"}, + { + "id": "attendee10", + "firstName": "firstName10", + "lastName": "lastName10", + }, + ], + "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.", + "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", + }, + "attendees": [ + {"id": "attendee1", "firstName": "firstName1", "lastName": "lastName1"}, + {"id": "attendee2", "firstName": "firstName2", "lastName": "lastName2"}, + {"id": "attendee3", "firstName": "firstName3", "lastName": "lastName3"}, + {"id": "attendee4", "firstName": "firstName4", "lastName": "lastName4"}, + {"id": "attendee5", "firstName": "firstName5", "lastName": "lastName5"}, + {"id": "attendee6", "firstName": "firstName6", "lastName": "lastName6"}, + {"id": "attendee7", "firstName": "firstName7", "lastName": "lastName7"}, + {"id": "attendee8", "firstName": "firstName8", "lastName": "lastName8"}, + {"id": "attendee9", "firstName": "firstName9", "lastName": "lastName9"}, + { + "id": "attendee10", + "firstName": "firstName10", + "lastName": "lastName10", + }, + ], + "admins": [ + {"firstName": "Utkarsh", "lastName": "Shendge", "_id": "asdasdasd"}, + ], + "organization": { + "_id": '1', + "image": ' ', + "name": 'Computer Science', + "creator": { + "firstName": "Ritik", + "lastName": "Srivastav", + "_id": "asdasdasd", + }, + }, + }, + { + "title": "Gaming", + "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.", + "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", + }, + "attendees": [ + {"id": "attendee1", "firstName": "firstName1", "lastName": "lastName1"}, + {"id": "attendee2", "firstName": "firstName2", "lastName": "lastName2"}, + {"id": "attendee3", "firstName": "firstName3", "lastName": "lastName3"}, + {"id": "attendee4", "firstName": "firstName4", "lastName": "lastName4"}, + {"id": "attendee5", "firstName": "firstName5", "lastName": "lastName5"}, + {"id": "attendee6", "firstName": "firstName6", "lastName": "lastName6"}, + {"id": "attendee7", "firstName": "firstName7", "lastName": "lastName7"}, + {"id": "attendee8", "firstName": "firstName8", "lastName": "lastName8"}, + {"id": "attendee9", "firstName": "firstName9", "lastName": "lastName9"}, + { + "id": "attendee10", + "firstName": "firstName10", + "lastName": "lastName10", + }, + ], + "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..fad34c4b6 --- /dev/null +++ b/lib/demo_server_data/pinned_post_demo_data.dart @@ -0,0 +1,160 @@ +///This file contains demo data for pinned posts. It contains a list of type Map and sample data. + +const pinnedPostsDemoData = [ + { + "_id": "1", + "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": "2023-03-15T15:28:52.122Z", + "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"}, + }, + ], + }, + { + "_id": "2", + "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": "2023-03-15T15:28:52.122Z", + "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"}, + }, + ], + }, + { + "_id": "3", + "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": "2023-03-15T15:28:52.122Z", + "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"}, + }, + ], + }, + { + "_id": "4", + "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": "2023-03-15T15:28:52.122Z", + "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..adf832ec6 --- /dev/null +++ b/lib/demo_server_data/post_demo_data.dart @@ -0,0 +1,183 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +///This file contains demo data for posts. It contains a list of type Map +/// and sample data of posts. +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..f2bb7274e --- /dev/null +++ b/lib/enums/enums.dart @@ -0,0 +1,71 @@ +/// Represents the state of the view. +enum ViewState { + /// The view is not doing anything. + idle, + + /// The view is loading something. + busy, +} + +/// Represents the state of the chat. +enum ChatState { + /// The chat is at initial state. + initial, + + /// The chat is loading something. + loading, + + /// The chat state is complete. + complete +} + +/// Represents the type of the tile. +enum TileType { + /// Represents the tile of the user. + user, + + /// Represents the tile of the attendee. + attendee, + + /// Represents the tile of the organization. + org, + + /// Represents the tile of the option. + option +} + +/// Represents the type of the Message. +enum MessageType { + /// Represents error message. + error, + + /// Represents warning message. + warning, + + /// Represents info message. + info, + + /// Represents random message. + random +} + +/// Represents the type of CallFor. +enum CallFor { + /// Represents the call for login. + login, + + /// Represents the call for signup. + signup, + + /// Represents the call for joining Public organization. + joinPublicOrg +} + +/// Represents the type of ModalSheet. +enum ModalSheet { + /// Represents the modal sheet for donation. + donation, + + /// Represents the modal sheet for invite. + invite +} diff --git a/lib/locator.dart b/lib/locator.dart new file mode 100644 index 000000000..495e8fad1 --- /dev/null +++ b/lib/locator.dart @@ -0,0 +1,153 @@ +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:get_it/get_it.dart'; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:talawa/main.dart'; +import 'package:talawa/services/chat_service.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/image_service.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/services/org_service.dart'; +import 'package:talawa/services/post_service.dart'; +import 'package:talawa/services/session_manager.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/services/third_party_service/multi_media_pick_service.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/utils/queries.dart'; +import 'package:talawa/utils/validators.dart'; +import 'package:talawa/view_model/access_request_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/add_post_view_models/add_post_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/chat_view_models/direct_chat_view_model.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/edit_event_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/event_calendar_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/event_info_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/after_auth_view_models/settings_view_models/app_setting_view_model.dart'; +import 'package:talawa/view_model/lang_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/theme_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'; + +// Instance of GetIt and storing it in a global variable +/// Intializaing the locator. +GetIt locator = GetIt.instance; + +///GetIt for UserConfig. +final userConfig = locator(); + +///GetIt for NavigationService. +final navigationService = locator(); + +///GetIt for DataBaseMutationFunctions. +final databaseFunctions = locator(); + +///GetIt for GraphqlConfig. +final graphqlConfig = locator(); + +///GetIt for SizeConfig. +final sizeConfig = locator(); + +///GetIt for Queries. +final queries = locator(); + +///GetIt for Connectivity. +final connectivity = locator(); + +///GetIt for OrganizationService. +final organizationService = locator(); + +///GetIt for ImageService. +final imageService = locator(); + +///GetIt for SessionManager. +final sessionManager = locator(); + +/// This function registers the widgets/objects in "GetIt". +/// +/// **params**: +/// None +/// +/// **returns**: +/// None +void setupLocator() { + //services + locator.registerSingleton(NavigationService()); + + //sizeConfig + locator.registerSingleton(SizeConfig()); + + locator.registerSingleton(Validator()); + + //userConfig + locator.registerSingleton(UserConfig()); + + //sessionManager + locator.registerSingleton(SessionManager()); + + //Services + locator.registerLazySingleton(() => PostService()); + locator.registerLazySingleton(() => EventService()); + locator.registerLazySingleton(() => CommentService()); + locator.registerLazySingleton(() => OrganizationService()); + locator.registerLazySingleton(() => MultiMediaPickerService()); + locator.registerLazySingleton(() => Connectivity()); + locator.registerLazySingleton(() => ChatService()); + locator.registerLazySingleton(() => ImageService()); + locator.registerLazySingleton(() => ImagePicker()); + locator.registerLazySingleton(() => ImageCropper()); + + //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()); + locator.registerFactory(() => EditEventViewModel()); + locator.registerFactory(() => EventCalendarViewModel()); + locator.registerFactory(() => AddPostViewModel()); + locator.registerFactory(() => EventInfoViewModel()); + locator.registerFactory(() => AppSettingViewModel()); + + //Widgets viewModels + locator.registerFactory(() => ProgressDialogViewModel()); + locator.registerFactory(() => CustomDrawerViewModel()); + locator.registerFactory(() => LikeButtonViewModel()); + locator.registerFactory(() => AppLanguage()); + locator.registerFactory(() => CommentsViewModel()); + locator.registerFactory(() => AppTheme()); + locator.registerFactory(() => DirectChatViewModel()); + locator.registerFactory(() => AccessScreenViewModel()); +} diff --git a/lib/main.dart b/lib/main.dart new file mode 100644 index 000000000..2237cf4d7 --- /dev/null +++ b/lib/main.dart @@ -0,0 +1,216 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart' as fs; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:hive/hive.dart'; +import 'package:path_provider/path_provider.dart' as path; +import 'package:provider/provider.dart'; +import 'package:quick_actions/quick_actions.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/constants/quick_actions.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/asymetric_keys/asymetric_keys.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/plugins/fetch_plugin_list.dart'; +import 'package:talawa/router.dart' as router; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/base_view_model.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/view_model/theme_view_model.dart'; +import 'package:talawa/views/base_view.dart'; + +Future main() async { + // Returns an instance of the binding that implements WidgetsBinding. + WidgetsFlutterBinding.ensureInitialized(); + + final Directory dir = await path.getApplicationDocumentsDirectory(); + Hive + ..init(dir.path) + ..registerAdapter(UserAdapter()) + ..registerAdapter(OrgInfoAdapter()) + ..registerAdapter(AsymetricKeysAdapter()); + + await Hive.openBox('currentUser'); + await Hive.openBox('currentOrg'); + await Hive.openBox('user_keys'); + await Hive.openBox('pluginBox'); + await Hive.openBox('url'); + + setupLocator(); + // The runApp() function takes the given Widget and makes it the root of the widget tree. + runApp(MyApp()); +} + +/// Main widget that sets up the quick actions, internationalization, routing , notifications. +class MyApp extends StatefulWidget { + // This widget is the root of your application. + @override + _MyAppState createState() => _MyAppState(); +} + +/// The _MyAppState class extends the State. +/// +/// All the coding related to state updation is inside this class. +class _MyAppState extends State { + /// Initializing the Quickactions to enable them on long press of app icon in device. + final quickActions = const QuickActions(); + + /// Initializing the mainScreen window to 1 to show the events by default after app in opened. + late int mainScreenQuickActionindex = 0; + @override + void initState() { + // initState() is a method that is called once when the Stateful Widget + // is inserted in the widget tree. We generally override this method if + // we need to do some sort of initialization work like + // registering a listener because, unlike build(), this method is called once. + super.initState(); + + initQuickActions(); + + final urlBox = Hive.box('url'); + if (urlBox.get('url') != null) { + FetchPluginList(); + } + + fs.SystemChrome.setPreferredOrientations( + [ + fs.DeviceOrientation.portraitUp, + fs.DeviceOrientation.portraitDown, + ], + ); + } + + /// It allows to manage and interact with the application’s home screen quick actions. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + +// ignore: avoid_void_async + void initQuickActions() async { + final bool userLoggedIn = await userConfig.userLoggedIn(); + if (userLoggedIn && + userConfig.currentUser.joinedOrganizations!.isNotEmpty) { + quickActions.initialize((type) { + if (type == ShortCutMenu.eventAction.type) { + mainScreenQuickActionindex = 1; + } else if (type == ShortCutMenu.feedAction.type) { + mainScreenQuickActionindex = 0; + } else if (type == ShortCutMenu.chatAction.type) { + mainScreenQuickActionindex = 3; + } + }); + + /// Registering quick action list in the app.zx + quickActions.setShortcutItems(ShortCutMenu.quickActionsList); + } + } + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return MaterialApp( + locale: langModel.appLocal, + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + AppLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + title: 'Talawa', + theme: Provider.of(context).isdarkTheme + ? TalawaTheme.darkTheme + : TalawaTheme.lightTheme, + 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: '/', + onGenerateInitialRoutes: (String initialRouteName) { + return [ + router.generateRoute( + RouteSettings( + name: '/', + arguments: mainScreenQuickActionindex, + ), + ), + ]; + }, + ); + }, + ); + }, + ); + } +} + +/// PageView is a scrollable list that works page by page. +/// +/// DemoPageView is demo PageView of Talawa Mobile App. +class DemoPageView extends StatelessWidget { + const DemoPageView({required Key key}) : super(key: key); + @override + Widget build(BuildContext context) { + FetchPluginList(); + return BaseView( + builder: (context, model, child) => Scaffold( + appBar: AppBar( + title: + Text(AppLocalizations.of(context)!.strictTranslate('Demo Page')), + ), + body: Container( + child: Text(model.title), + ), + ), + ); + } +} + +/// ViewModel uses property-based data binding to establish a connection. +/// +/// between the ViewModel and the View, and drives the View changes +/// through the ViewModel. DemoViewModel is the ViewModel for DemoPageView. +class DemoViewModel extends BaseModel { + /// Demo title to be used. + final String _title = "Title from the viewMode GSoC branch"; + + /// Getter function of the title. + /// + /// params: + /// None + /// returns: + /// * `String`: title of the model + String get title => _title; +} diff --git a/lib/models/app_tour.dart b/lib/models/app_tour.dart new file mode 100644 index 000000000..055821831 --- /dev/null +++ b/lib/models/app_tour.dart @@ -0,0 +1,187 @@ +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/main_screen_view_model.dart'; +import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; + +/// Class that handles all the apptour routines. +class AppTour { + AppTour({ + required this.model, + }); + + ///instance of mainscreenviewmodel. + MainScreenViewModel model; + + ///instance of tutorialCoachMark. + late TutorialCoachMark tutorialCoachMark; + + /// This function show tutorial to user. + /// + /// **params**: + /// * `onClickTarget`: Its a function which is required to run desired tasks on click. + /// * `onFinish`: Its a function which is required to run desired tasks on finish + /// * `targets`: [FocusTargets] to show the tour on. + /// + /// **returns**: + /// None + + void showTutorial({ + required Function(TargetFocus) onClickTarget, + required dynamic Function() onFinish, + required List targets, + }) { + tutorialCoachMark = TutorialCoachMark( + targets: targets.map((target) => target.focusWidget).toList(), + colorShadow: Theme.of(model.context).colorScheme.secondaryContainer, + textSkip: "SKIP", + textStyleSkip: TextStyle( + color: Theme.of(model.context).colorScheme.background, + fontSize: 20, + ), + paddingFocus: 10, + opacityShadow: 1.0, + onFinish: onFinish, + onClickTarget: onClickTarget, + onSkip: () { + if (MainScreenViewModel.scaffoldKey.currentState!.isDrawerOpen) { + navigationService.pop(); + } + model.tourSkipped = true; + model.onTabTapped(0); + return true; + }, + onClickOverlay: (target) { + onClickTarget(target); + }, + ); + if (!model.testMode) tutorialCoachMark.show(context: model.context); + } +} + +/// Class that represents FocusTarget. +class FocusTarget { + /// This returns a widget for a step in a tutorial. + /// + /// **params**: + /// * `key`: key of type GlobalKey. + /// * `keyName`: key where the widget shows. + /// * `description`: description of the step. + /// * `isCircle`: bool to specify if circle + /// * `align`: align of type ContentAlign to align button. + /// * `crossAlign`: Cross align axes + /// * `skipAlignment`: to give alignment of skip option + /// * `next`: Function` type, this show the next step or `key` to show the tour of. + /// * `nextCrossAlign`: nextCrossAlign to give alignment of next option + /// * `isEnd`: true if last step of the tour. + /// * `tutorialCoachMark`: instance of tutorialCoachMark to which this focusTarget is linked. + FocusTarget({ + required this.key, + required this.keyName, + required this.description, + required this.appTour, + this.isCircle = false, + this.align = ContentAlign.bottom, + this.crossAlign = CrossAxisAlignment.start, + this.skipAlignment = Alignment.topRight, + this.next, + this.nextCrossAlign = CrossAxisAlignment.end, + this.isEnd = false, + }) { + this.focusWidget = TargetFocus( + enableOverlayTab: true, + color: Colors.transparent, + identify: keyName, + keyTarget: key, + alignSkip: skipAlignment, + shape: isCircle ? ShapeLightFocus.Circle : ShapeLightFocus.RRect, + contents: [ + TargetContent( + align: align, + builder: (context, controller) { + return Container( + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: crossAlign, + children: [ + Text( + AppLocalizations.of(context)!.strictTranslate(description), + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 20, + ), + ), + ], + ), + ); + }, + ), + TargetContent( + align: ContentAlign.custom, + customPosition: CustomTargetContentPosition( + bottom: SizeConfig.screenHeight! * 0.025, + ), + builder: (context, controller) { + return GestureDetector( + onTap: () { + next?.call(); + appTour.tutorialCoachMark.next(); + }, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: nextCrossAlign, + children: [ + Text( + AppLocalizations.of(context)! + .strictTranslate(isEnd ? 'COMPLETE' : 'NEXT'), + style: TextStyle( + color: Theme.of(context).colorScheme.secondary, + fontSize: 20, + ), + ), + ], + ), + ); + }, + ), + ], + ); + } + + /// represents the key of the target that is intended to be focused. + GlobalKey key; + + /// keyName of the target in mainScreenViewModel. + String keyName; + + /// description of the target. + String description; + + /// true if focusing shape is circle. + bool isCircle; + + /// alignment of description text. + ContentAlign align; + + /// crossAxisAlignment. + CrossAxisAlignment crossAlign; + + /// skip alignment configuration. + Alignment skipAlignment; + + /// instance of AppTour. + AppTour appTour; + + /// next callback that is executed on pressing this target. + Function()? next; + + /// next target's crossAxisAlignment. + CrossAxisAlignment nextCrossAlign; + + /// true current target ends ths appTour. + bool isEnd; + + /// Target focus widget with all above properties. + late TargetFocus focusWidget; +} diff --git a/lib/models/asymetric_keys/asymetric_keys.dart b/lib/models/asymetric_keys/asymetric_keys.dart new file mode 100644 index 000000000..bdd971a77 --- /dev/null +++ b/lib/models/asymetric_keys/asymetric_keys.dart @@ -0,0 +1,15 @@ +import 'package:hive/hive.dart'; +import 'package:pointycastle/api.dart'; +part 'asymetric_keys.g.dart'; + +// This model is created to save Asymmetric Keys to the Hive as Hive doesn't allow to store objects other than Arrays, List, int, Strings etc. +@HiveType(typeId: 7) + +/// Hive Type for [AssymetricKeys]. +class AsymetricKeys extends HiveObject { + AsymetricKeys({required this.keyPair}); + @HiveField(0) + + /// The key pair to work with. + final AsymmetricKeyPair keyPair; +} diff --git a/lib/models/asymetric_keys/asymetric_keys.g.dart b/lib/models/asymetric_keys/asymetric_keys.g.dart new file mode 100644 index 000000000..5661ba4f0 --- /dev/null +++ b/lib/models/asymetric_keys/asymetric_keys.g.dart @@ -0,0 +1,41 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'asymetric_keys.dart'; + +// ************************************************************************** +// TypeAdapterGenerator +// ************************************************************************** + +class AsymetricKeysAdapter extends TypeAdapter { + @override + final int typeId = 7; + + @override + AsymetricKeys read(BinaryReader reader) { + final numOfFields = reader.readByte(); + final fields = { + for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), + }; + return AsymetricKeys( + keyPair: fields[0] as AsymmetricKeyPair, + ); + } + + @override + void write(BinaryWriter writer, AsymetricKeys obj) { + writer + ..writeByte(1) + ..writeByte(0) + ..write(obj.keyPair); + } + + @override + int get hashCode => typeId.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is AsymetricKeysAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +} diff --git a/lib/models/chats/chat_list_tile_data_model.dart b/lib/models/chats/chat_list_tile_data_model.dart new file mode 100644 index 000000000..6e0949fc8 --- /dev/null +++ b/lib/models/chats/chat_list_tile_data_model.dart @@ -0,0 +1,25 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:json_annotation/json_annotation.dart'; +import 'package:talawa/models/chats/chat_user.dart'; + +part 'chat_list_tile_data_model.g.dart'; + +@JsonSerializable() + +/// This class creates JSON code using the JsonSerializable package. +class ChatListTileDataModel { + ChatListTileDataModel(this.users, this.id); + + // Connect the generated [_$ChatListTileDataModelFromJson] function to the `fromJson` + // factory. + factory ChatListTileDataModel.fromJson(Map json) => + _$ChatListTileDataModelFromJson(json); + + // Connect the generated [_$ChatListTileDataModelToJson] function to the `toJson` method. + Map toJson() => _$ChatListTileDataModelToJson(this); + + List? users; + String? id; +} diff --git a/lib/models/chats/chat_list_tile_data_model.g.dart b/lib/models/chats/chat_list_tile_data_model.g.dart new file mode 100644 index 000000000..b7d137027 --- /dev/null +++ b/lib/models/chats/chat_list_tile_data_model.g.dart @@ -0,0 +1,28 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'chat_list_tile_data_model.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +ChatListTileDataModel _$ChatListTileDataModelFromJson( + Map json, +) => + ChatListTileDataModel( + (json['users'] as List?) + ?.map((e) => ChatUser.fromJson(e as Map)) + .toList(), + json['_id'] as String?, + ); + +Map _$ChatListTileDataModelToJson( + ChatListTileDataModel instance, +) => + { + 'users': instance.users, + '_id': instance.id, + }; diff --git a/lib/models/chats/chat_message.dart b/lib/models/chats/chat_message.dart new file mode 100644 index 000000000..cbfd6d7b2 --- /dev/null +++ b/lib/models/chats/chat_message.dart @@ -0,0 +1,31 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:json_annotation/json_annotation.dart'; +import 'package:talawa/models/chats/chat_user.dart'; +part 'chat_message.g.dart'; + +@JsonSerializable(explicitToJson: true) + +/// This class creates JSON code for chat message using the JsonSerializable package. + +class ChatMessage { + ChatMessage( + this.id, + this.sender, + this.messageContent, + this.receiver, + ); + // Connect the generated [_$ChatMessageFromJson] function to the `fromJson` + // factory. + factory ChatMessage.fromJson(Map json) => + _$ChatMessageFromJson(json); + + // Connect the generated [_$ChatMessageToJson] function to the `toJson` method. + Map toJson() => _$ChatMessageToJson(this); + + String? id; + ChatUser? sender; + ChatUser? receiver; + String? messageContent; +} diff --git a/lib/models/chats/chat_message.g.dart b/lib/models/chats/chat_message.g.dart new file mode 100644 index 000000000..4ac1f3456 --- /dev/null +++ b/lib/models/chats/chat_message.g.dart @@ -0,0 +1,29 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'chat_message.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +ChatMessage _$ChatMessageFromJson(Map json) => ChatMessage( + json['_id'] as String?, + json['sender'] == null + ? null + : ChatUser.fromJson(json['sender'] as Map), + json['messageContent'] as String?, + json['receiver'] == null + ? null + : ChatUser.fromJson(json['receiver'] as Map), + ); + +Map _$ChatMessageToJson(ChatMessage instance) => + { + '_id': instance.id, + 'sender': instance.sender?.toJson(), + 'receiver': instance.receiver?.toJson(), + 'messageContent': instance.messageContent, + }; diff --git a/lib/models/chats/chat_user.dart b/lib/models/chats/chat_user.dart new file mode 100644 index 000000000..d12b3c51d --- /dev/null +++ b/lib/models/chats/chat_user.dart @@ -0,0 +1,24 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:json_annotation/json_annotation.dart'; +part 'chat_user.g.dart'; + +@JsonSerializable() + +/// This class creates JSON code for chat user using the JsonSerializable package. +class ChatUser { + ChatUser({this.firstName, this.id, this.image}); + + // Connect the generated [_$ChatUserFromJson] function to the `fromJson` + // factory. + factory ChatUser.fromJson(Map json) => + _$ChatUserFromJson(json); + + // Connect the generated [_$ChatUserFromJson] function to the `toJson` method. + Map toJson() => _$ChatUserToJson(this); + + String? firstName; + String? id; + String? image; +} diff --git a/lib/models/chats/chat_user.g.dart b/lib/models/chats/chat_user.g.dart new file mode 100644 index 000000000..421737da7 --- /dev/null +++ b/lib/models/chats/chat_user.g.dart @@ -0,0 +1,22 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'chat_user.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +ChatUser _$ChatUserFromJson(Map json) => ChatUser( + firstName: json['firstName'] as String?, + id: json['_id'] as String?, + image: json['image'] as String?, + ); + +Map _$ChatUserToJson(ChatUser instance) => { + 'firstName': instance.firstName, + '_id': instance.id, + 'image': instance.image, + }; diff --git a/lib/models/comment/comment_model.dart b/lib/models/comment/comment_model.dart new file mode 100644 index 000000000..8455e52b5 --- /dev/null +++ b/lib/models/comment/comment_model.dart @@ -0,0 +1,31 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:talawa/models/user/user_info.dart'; + +///This class returns a Comment instance. +class Comment { + Comment({this.text, this.createdAt, this.creator, this.post, this.likeCount}); + //Creating a new Comment instance from a map structure. + factory Comment.fromJson(Map json) { + return Comment( + text: json['text'] as String?, + createdAt: json['createdAt'] as String?, + creator: json['creator'] == null + ? null + //Creating a new User instance from a map structure. + : 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..4c4bbb727 --- /dev/null +++ b/lib/models/events/event_model.dart @@ -0,0 +1,177 @@ +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; + +///This class creates an event model and returns an Event instance. +class Event { + Event({ + this.id, + this.title, + this.description, + this.attendees, + this.location, + this.latitude, + this.longitude, + 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, + }); + //Creating a new Event instance from a map structure. + factory Event.fromJson( + Map json, + ) { + return Event( + id: json['_id'] as String, + title: json['title'] as String?, + description: json['description'] as String?, + location: json['location'] as String?, + longitude: json['longitude'] as double?, + latitude: json['latitude'] as double?, + 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['isRegistered'] 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(), + attendees: (json["attendees"] as List?)?.isEmpty ?? true + ? null + : (json['attendees'] as List?) + ?.map( + (e) => Attendee.fromJson(e as Map), + ) + .toList(), + ); + } + + ///Unique identifier for the event. + String? id; + + /// The title of the event. + String? title; + + /// The description of the event. + String? description; + + /// The location of the event. + String? location; + + /// The latitude of the event. + double? latitude; + + /// The longitude of the event. + double? longitude; + + /// A boolean value that indicates if the event is recurring. + bool? recurring; + + /// A boolean value that indicates if the event is an all-day event. + bool? allDay; + + /// The start date of the event. + String? startDate; + + /// The end date of the event. + String? endDate; + + /// The start time of the event. + String? startTime; + + /// The end time of the event. + String? endTime; + + /// The recurrence of the event. + String? recurrence; + + /// A boolean value that indicates if the event is public. + bool? isPublic; + + /// A boolean value that indicates if the user is registered for the event. + bool? isRegistered; + + /// A boolean value that indicates if the event is registerable. + bool? isRegisterable; + + /// The creator of the event. + User? creator; + + /// The organization of the event. + OrgInfo? organization; + + /// The admins of the event. + List? admins; + + /// The attendees of the event. + List? attendees; +} + +///This class creates an attendee model and returns an Attendee instance. +class Attendee { + Attendee({this.id, this.firstName, this.lastName, this.image}); + + Attendee.fromJson(Map json) { + id = json['_id'] as String?; + firstName = json['firstName'] as String?; + lastName = json['lastName'] as String?; + image = json['image'] as String?; + } + + ///Unique identifier for the attendee. + String? id; + + /// The first name of the attendee. + String? firstName; + + /// The last name of the attendee. + String? lastName; + + /// The image of the attendee. + String? image; + + /// Converts the Attendee instance to a map structure.. + /// + /// This method is used to convert the Attendee instance to a map structure that can be converted to a JSON object. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Map`: A map structure that can be converted to a JSON object. + + Map toJson() { + final Map data = {}; + data['_id'] = this.id; + data['firstName'] = this.firstName; + data['lastName'] = this.lastName; + data['image'] = this.image; + return data; + } +} diff --git a/lib/models/language/language_model.dart b/lib/models/language/language_model.dart new file mode 100644 index 000000000..15f643fc1 --- /dev/null +++ b/lib/models/language/language_model.dart @@ -0,0 +1,17 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +///This class creates an langauge model. +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/mainscreen_navigation_args.dart b/lib/models/mainscreen_navigation_args.dart new file mode 100644 index 000000000..a23caaff2 --- /dev/null +++ b/lib/models/mainscreen_navigation_args.dart @@ -0,0 +1,42 @@ +/// This class creates a MainScreenArgs model. +class MainScreenArgs { + MainScreenArgs({ + this.fromSignUp = false, + required this.mainScreenIndex, + this.toggleDemoMode = false, + }); + + /// Indicates whether the user navigated to the main screen from the signup page. + final bool fromSignUp; + + /// Represents the index of the current page. + final int mainScreenIndex; + + /// Determines if the application is in demo mode. + final bool toggleDemoMode; + + /// Overrides the equality operator to compare instances of the MainScreenArgs class. + /// + /// Checks whether the [other] object is of the same type and compares its properties: + /// If all properties match, returns `true`; otherwise, returns `false`. + /// + /// **params**: + /// * `other`: The object to compare against this MainScreenArgs instance. + /// + /// **returns**: + /// * `bool`: Returns `true` if the properties of both instances match; otherwise, `false`. + @override + bool operator ==(Object other) => + identical(this, other) || + other is MainScreenArgs && + other.fromSignUp == fromSignUp && + other.mainScreenIndex == mainScreenIndex && + other.toggleDemoMode == toggleDemoMode; + + /// Overrides the hashCode getter to generate a hash code based on the properties of the MainScreenArgs instance. + /// + /// Returns an integer value representing the combined hash codes. + @override + int get hashCode => + fromSignUp.hashCode ^ mainScreenIndex.hashCode ^ toggleDemoMode.hashCode; +} diff --git a/lib/models/options/options.dart b/lib/models/options/options.dart new file mode 100644 index 000000000..828fccb33 --- /dev/null +++ b/lib/models/options/options.dart @@ -0,0 +1,19 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; + +///This class creates a Option model. +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..961ce9965 --- /dev/null +++ b/lib/models/organization/org_info.dart @@ -0,0 +1,133 @@ +import 'package:hive/hive.dart'; +import 'package:talawa/models/organization/org_info_address.dart'; +import 'package:talawa/models/user/user_info.dart'; + +part 'org_info.g.dart'; + +@HiveType(typeId: 2) + +///This class creates an organization-information model and returns an OrgInfo instance. +class OrgInfo { + OrgInfo({ + this.admins, + this.members, + this.creatorInfo, + this.description, + this.id, + this.image, + this.userRegistrationRequired, + this.name, + this.address, + }); + + 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, + userRegistrationRequired: json['userRegistrationRequired'] != null + ? json['userRegistrationRequired'] 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, + address: json['address'] != null + ? Address.fromJson(json['address'] as Map) + : null, + ); + } + + /// The conventional function to parse json, check flutter docs to know more. + /// + /// + /// **params**: + /// * `json`: Passing the json to be parsed. + /// + /// **returns**: + /// * `List`: returning the OrgInfo object containing the json data + List fromJsonToList(dynamic json) { + final List orgList = []; + + if (json is List) { + for (final dynamic outerElement in json) { + if (outerElement is List) { + for (final dynamic innerElement in outerElement) { + if (innerElement is Map) { + final OrgInfo org = OrgInfo.fromJson(innerElement); + orgList.add(org); + } + } + } else if (outerElement is Map) { + final OrgInfo org = OrgInfo.fromJson(outerElement); + orgList.add(org); + } + } + } + + return orgList; + } + + /// contains the Image url. + @HiveField(0) + String? image; + + /// The org id. + @HiveField(1) + String? id; + + /// The org name. + @HiveField(2) + String? name; + + /// The org admins. + @HiveField(3) + List? admins; + + /// The org name. + @HiveField(4) + List? members; + + /// The org descriptions. + @HiveField(5) + String? description; + + /// The org registration is required. + @HiveField(6) + bool? userRegistrationRequired; + + /// The org creatorInfo. + @HiveField(7) + User? creatorInfo; + + /// Address of the Organisation. + @HiveField(8) + Address? address; +} diff --git a/lib/models/organization/org_info.g.dart b/lib/models/organization/org_info.g.dart new file mode 100644 index 000000000..1deae17c9 --- /dev/null +++ b/lib/models/organization/org_info.g.dart @@ -0,0 +1,65 @@ +// 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?, + userRegistrationRequired: fields[6] as bool?, + name: fields[2] as String?, + address: fields[8] as Address?, + ); + } + + @override + void write(BinaryWriter writer, OrgInfo obj) { + writer + ..writeByte(9) + ..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.userRegistrationRequired) + ..writeByte(7) + ..write(obj.creatorInfo) + ..writeByte(8) + ..write(obj.address); + } + + @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/organization/org_info_address.dart b/lib/models/organization/org_info_address.dart new file mode 100644 index 000000000..13664655f --- /dev/null +++ b/lib/models/organization/org_info_address.dart @@ -0,0 +1,52 @@ +/// Model for the address of an organisation. +class Address { + /// Constructs an Address object. + Address({ + this.city, + this.countryCode, + this.dependentLocality, + this.line1, + this.line2, + this.postalCode, + this.sortingCode, + this.state, + }); + + /// Factory method to construct an Address from a JSON object. + factory Address.fromJson(Map json) { + return Address( + city: json['city'] as String?, + countryCode: json['countryCode'] as String?, + dependentLocality: json['dependentLocality'] as String?, + line1: json['line1'] as String?, + line2: json['line2'] as String?, + postalCode: json['postalCode'] as String?, + sortingCode: json['sortingCode'] as String?, + state: json['state'] as String?, + ); + } + + /// The city of the address. + final String? city; + + /// The country code of the address. + final String? countryCode; + + /// The dependent locality of the address. + final String? dependentLocality; + + /// The first line of the address. + final String? line1; + + /// The second line of the address. + final String? line2; + + /// The postal code of the address. + final String? postalCode; + + /// The sorting code of the address. + final String? sortingCode; + + /// The state of the address. + final String? state; +} diff --git a/lib/models/post/post_model.dart b/lib/models/post/post_model.dart new file mode 100644 index 000000000..1e5b52a69 --- /dev/null +++ b/lib/models/post/post_model.dart @@ -0,0 +1,168 @@ +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; + +///This class creates a Post model. +class Post { + Post({ + required this.sId, + this.description, + this.createdAt, + this.imageUrl, + this.base64String, + this.videoUrl, + required this.creator, + this.organization, + this.likedBy, + this.comments, + }); + + ///Creating a new Post instance from a map structure. + + /// + /// params: + /// None + /// returns: + /// * `PostObject`: Dart Object for posts + Post.fromJson(Map json) { + sId = json['_id'] as String; + description = json['text'] as String?; + createdAt = DateTime.parse(json['createdAt'] as String); + imageUrl = json['imageUrl'] as String?; + base64String = json['base64String'] 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'] as List).forEach((v) { + likedBy?.add(LikedBy.fromJson(v as Map)); + }); + } + if (json['comments'] != null) { + comments = []; + (json['comments'] as List).forEach((v) { + comments?.add(Comments.fromJson(v as Map)); + }); + } + } + + /// unique identifier for post. + late String sId; + + /// description for post. + String? description; + + /// createdAt for post. + DateTime? createdAt; + + /// imageUrl for post. + String? imageUrl; + + /// base64String for Image. + String? base64String; + + /// videoUrl for post. + String? videoUrl; + + /// creator for post. + User? creator; + + /// organization for post. + OrgInfo? organization; + + /// likedBy for post. + List? likedBy; + + /// comments for post. + List? comments; + + /// this is to get duration of post. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `String`: date is returned in ago form. + 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'; + } + } +} + +/// This class convert between json and object for likedby. +class LikedBy { + LikedBy({this.sId}); + + /// JSON factory constructor. + LikedBy.fromJson(Map json) { + sId = json['_id'] as String?; + } + + /// These are dart object. + /// + /// params: + /// * `sId` : unique identifier for post + String? sId; + + /// Convert dart object to json. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Map`: json is returned. + Map toJson() { + final Map data = {}; + data['_id'] = this.sId; + return data; + } +} + +/// This class convert between json and object for comments. +class Comments { + Comments({this.sId}); + + /// Convert json to dart object. + /// + /// params: + /// None + /// returns: + /// * `Map`: Dart object is returned. + Comments.fromJson(Map json) { + sId = json['_id'] as String?; + } + + /// these are dart object. + /// + /// params: + /// * `sId` : unique identifier for post + String? sId; + + /// Convert dart object to json. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Map`: json is returned. + 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..f71c98893 --- /dev/null +++ b/lib/models/user/user_info.dart @@ -0,0 +1,203 @@ +// ignore_for_file: use_setters_to_change_properties + +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) + +/// This class creates a User model and returns a user instance. +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; + Map? appUserProfile; + if (fromOrg) { + json = json1; + appUserProfile = json1; + } else { + json = json1['user'] as Map; + appUserProfile = json1['appUserProfile'] 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: appUserProfile?['adminFor'] != null + ? (appUserProfile!['adminFor'] as List) + .map((e) => OrgInfo.fromJson(e as Map)) + .toList() + : null, + createdOrganizations: appUserProfile?['createdOrganizations'] != null + ? (appUserProfile!['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, + ); + } + + /// Method to print the User details. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void 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 for authToken. + @HiveField(0) + String? authToken; + + /// HiveField for refreshToken. + @HiveField(1) + String? refreshToken; + + /// HiveField for userID. + @HiveField(2) + String? id; + + /// HiveField for user's first name. + @HiveField(3) + String? firstName; + + /// HiveField for user's last name. + @HiveField(4) + String? lastName; + + /// HiveField for user's Email. + @HiveField(5) + String? email; + + /// HiveField for user's avatar. + @HiveField(6) + String? image; + + /// /// HiveField for all organisations joined by user. + @HiveField(7) + List? joinedOrganizations = []; + + /// HiveField for all organisations created by user. + @HiveField(8) + List? createdOrganizations = []; + + /// HiveField for all organisations user is admin of. + @HiveField(9) + List? adminFor = []; + + /// HiveField for all organisations user has sent membership request. + @HiveField(10) + List? membershipRequests = []; + + /// Method to updated joinedOrganisation list. + /// + /// **params**: + /// * `orgList`: List of organsaitions user has joined. + /// + /// **returns**: + /// None + void updateJoinedOrg(List orgList) { + this.joinedOrganizations = orgList; + } + + /// Method to updated createdOrganisation list. + /// + /// **params**: + /// * `orgList`: List of organsaitions user has created. + /// + /// **returns**: + /// None + void updateCreatedOrg(List orgList) { + this.createdOrganizations = orgList; + } + + /// Method to update membershipRequests List. + /// + /// **params**: + /// * `orgList`: List of organisations user have sent membership request. + /// + /// **returns**: + /// None + void updateMemberRequestOrg(List orgList) { + this.membershipRequests = [...membershipRequests!, ...orgList]; + } + + /// Method to update adminFor List. + /// + /// **params**: + /// * `orgList`: List of organisations user is admin of. + /// + /// **returns**: + /// None + void updateAdminFor(List orgList) { + this.adminFor = orgList; + } + + /// Method to update the user details. + /// + /// **params**: + /// * `details`: updated user Info/details + /// + /// **returns**: + /// None + void update(User details) { + this.firstName = details.firstName; + this.lastName = details.lastName; + this.email = details.email; + this.image = details.image; + 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..7059bec4c --- /dev/null +++ b/lib/models/user/user_info.g.dart @@ -0,0 +1,74 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +// 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/plugins/fetch_plugin_list.dart b/lib/plugins/fetch_plugin_list.dart new file mode 100644 index 000000000..5513a5e2b --- /dev/null +++ b/lib/plugins/fetch_plugin_list.dart @@ -0,0 +1,32 @@ +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:hive/hive.dart'; +import 'package:talawa/locator.dart'; + +/// This class fetch plugins list. +class FetchPluginList { + /// Constructor of the class. + FetchPluginList() { + fetchList(); + } + + /// late initialize the box. + late Box box; + + /// Fetches plugins from server and stores them in Hive `pluginBox`. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future fetchList() async { + late final GraphQLClient client = graphqlConfig.clientToQuery(); + final QueryResult result = await client.query( + QueryOptions( + document: gql(queries.getPluginsList()), + ), + ); + box = Hive.box('pluginBox'); + box.put('plugins', result.data?["getPlugins"]); + } +} diff --git a/lib/plugins/talawa_plugin_provider.dart b/lib/plugins/talawa_plugin_provider.dart new file mode 100644 index 000000000..528ad4180 --- /dev/null +++ b/lib/plugins/talawa_plugin_provider.dart @@ -0,0 +1,57 @@ +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/user_config.dart'; + +/// TalwaPluginProvider provides ability to implement features as plugins. +class TalawaPluginProvider extends StatelessWidget { + const TalawaPluginProvider({ + super.key, + @required this.child, + required this.visible, + required this.pluginName, + }); + + ///child contains the widget for the plugin UI. + final Widget? child; + + ///visible is the property that decides visibility of the UI. + final bool visible; + + ///name of plugin preferred with underscores(_) instead of spaces. + final String pluginName; + + /// This function checks if the plugin is insatlled and therefore determine visibility of the plugin. + /// + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `bool`: define_the_return + bool checkFromPluginList() { + final UserConfig userConfig = locator(); + final Box box; + bool res = false; + box = Hive.box('pluginBox'); + final List> pluginList = + (box.get('plugins') as List>?) ?? []; + + ///mapping over the list from the server + pluginList.forEach((plugin) { + if (plugin["pluginName"] == pluginName) { + res = plugin["pluginInstallStatus"] as bool || + (plugin["installedOrgs"] as List) + .contains(userConfig.currentOrg.id); + } + }); + return res; + } + + @override + Widget build(BuildContext context) { + var serverVisible = false; + serverVisible = checkFromPluginList(); + return serverVisible || visible ? child! : Container(); + } +} diff --git a/lib/router.dart b/lib/router.dart new file mode 100644 index 000000000..fe1dd2347 --- /dev/null +++ b/lib/router.dart @@ -0,0 +1,320 @@ +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/mainscreen_navigation_args.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/view_model/after_auth_view_models/chat_view_models/direct_chat_view_model.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/add_post_page.dart'; +import 'package:talawa/views/after_auth_screens/app_settings/app_settings_page.dart'; +import 'package:talawa/views/after_auth_screens/chat/chat_message_screen.dart'; +import 'package:talawa/views/after_auth_screens/chat/select_contact.dart'; +import 'package:talawa/views/after_auth_screens/events/create_custom_recurring_event.dart'; +import 'package:talawa/views/after_auth_screens/events/create_event_page.dart'; +import 'package:talawa/views/after_auth_screens/events/edit_event_page.dart'; +import 'package:talawa/views/after_auth_screens/events/event_calendar.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/feed/pinned_post_screen.dart'; +import 'package:talawa/views/after_auth_screens/join_org_after_auth/access_request_screen.dart'; +import 'package:talawa/views/after_auth_screens/join_org_after_auth/join_organisation_after_auth.dart'; +import 'package:talawa/views/after_auth_screens/org_info_screen.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/demo_screens/explore_events_demo.dart'; +import 'package:talawa/views/demo_screens/organization_feed_demo.dart'; +import 'package:talawa/views/demo_screens/profile_page_demo.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_screen.dart'; + +/// The MaterialApp provides us with a property called generateRoute where. +/// +/// +/// we can pass in a Function that returns a Route and takes in RouteSettings +/// Thus for this purpose, we create a function named generateRoute +/// +/// **params**: +/// * `settings`: RouteSetting have been passed +/// +/// **returns**: +/// * `Route`: Return a Route +Route generateRoute(RouteSettings settings) { + // The settings contains the route information of the requested route. + // It provides two key things to us: the name, and the arguments. + // We use the name to determine which view to return. + switch (settings.name) { + // Returns the SplashScreen + case Routes.splashScreen: + final int mainScreenIndex = settings.arguments! as int; + return MaterialPageRoute( + builder: (context) => SplashScreen( + key: const Key('SplashScreen'), + mainScreenIndex: mainScreenIndex, + ), + ); + + // Returns the SelectLanguage Widget + case Routes.languageSelectionRoute: + return MaterialPageRoute( + builder: (context) => const SelectLanguage(key: Key('SelectLanguage')), + ); + + // Returns the SetUrl Widget + case Routes.setUrlScreen: + final String uri = settings.arguments!.toString(); + return MaterialPageRoute( + builder: (context) => SetUrl( + key: const Key('SetUrl'), + uri: uri, + ), + ); + + // Returns the Login Widget + case Routes.loginScreen: + return MaterialPageRoute( + builder: (context) => const Login(key: Key('Login')), + ); + + // Returns the SelectOrganization Widget + case Routes.selectOrgScreen: + final String id = settings.arguments!.toString(); + return CupertinoPageRoute( + builder: (context) => SelectOrganization( + key: const Key('Signup'), + selectedOrgId: id, + ), + ); + + // Returns the SignUpDetails Widget + case Routes.signupDetailScreen: + final OrgInfo org = settings.arguments! as OrgInfo; + return CupertinoPageRoute( + builder: (context) => SignUpDetails( + key: const Key('Signup'), + selectedOrg: org, + ), + ); + + // Returns the WaitingPge Widget + case Routes.waitingScreen: + return CupertinoPageRoute( + builder: (context) => const WaitingPage(key: Key('Waiting')), + ); + + // Returns the Recover Widget + case Routes.recoverScreen: + return MaterialPageRoute( + builder: (context) => const Recover(key: Key('Recover')), + ); + + // Returns the ChangePass Widget + case Routes.updateScreen: + return MaterialPageRoute( + builder: (context) => const ChangePass(key: Key('Update')), + ); + + // Returns the OrganizationFeed Widget + case Routes.homeScreen: + return MaterialPageRoute( + builder: (context) => const OrganizationFeed(key: Key('HomeScreen')), + ); + + // Returns the DemoOrganizationFeed Widget + case Routes.demoHomeScreen: + return MaterialPageRoute( + builder: (context) => + const DemoOrganizationFeed(key: Key('DemoHomeScreen')), + ); + + // Returns the MainScreen Widget + case Routes.mainScreen: + final MainScreenArgs mainScreenArgs = + settings.arguments! as MainScreenArgs; + // final bool fromSignUp = settings.arguments! as bool; + return MaterialPageRoute( + builder: (context) => MainScreen( + key: const Key('MainScreen'), + mainScreenArgs: mainScreenArgs, + ), + ); + + // Returns the IndividualPostView Widget + case Routes.individualPost: + final Post post = settings.arguments! as Post; + return MaterialPageRoute( + builder: (context) => IndividualPostView( + key: const Key('IndividualPost'), + post: post, + ), + ); + + // Returns the PinnedPostPgae Widget + case Routes.pinnedPostPage: + final List pinnedPosts = settings.arguments! as List; + return MaterialPageRoute( + builder: (context) => PinnedPostPage(pinnedPosts: pinnedPosts), + ); + + // Returns the ExploreEvents Widget + case Routes.exploreEventsScreen: + return MaterialPageRoute( + builder: (context) => const ExploreEvents(key: Key('ExploreEvents')), + ); + + // Returns the DemoExploreEvents Widget + case Routes.demoExploreEventsScreen: + return MaterialPageRoute( + builder: (context) => + const DemoExploreEvents(key: Key('DemoExploreEvents')), + ); + + // Returns the EventInfoPage Widget + case Routes.eventInfoPage: + final Map args = + settings.arguments! as Map; + return MaterialPageRoute( + builder: (context) => EventInfoPage( + key: const Key('EventInfo'), + args: args, + ), + ); + + // Returns the CreateEventPage Widget + case Routes.createEventPage: + return MaterialPageRoute( + builder: (context) => const CreateEventPage(key: Key('CreateEvent')), + ); + + // Returns the CreateEventPage Widget + case Routes.customRecurrencePage: + final model = settings.arguments! as CreateEventViewModel; + return MaterialPageRoute( + builder: (context) => CustomRecurrencePage( + key: const Key('CreateEvent'), + model: model, + ), + ); + + // Returns the ProfilePage Widget + case Routes.profilePage: + return MaterialPageRoute( + builder: (context) => const ProfilePage(key: Key('Profile')), + ); + + // Return the DemoProfilePage Widget + case Routes.demoProfilePage: + return MaterialPageRoute( + builder: (context) => const DemoProfilePage(key: Key('DemoProfile')), + ); + + // Returns the EditProfilePage Widget + case Routes.editProfilePage: + return MaterialPageRoute( + builder: (context) => const EditProfilePage(key: Key('EditProfile')), + ); + + // Returns the JoinOrganizationAfterAuth Widget + case Routes.joinOrg: + final String id = settings.arguments!.toString(); + return MaterialPageRoute( + builder: (context) => JoinOrganisationAfterAuth( + key: const Key('JoinOrganisationAfterAuth'), + orgId: id, + ), + ); + + case Routes.requestAccess: + final OrgInfo org = settings.arguments! as OrgInfo; + return CupertinoPageRoute( + builder: (context) => SendAccessRequest( + key: const Key('Signup'), + org: org, + ), + ); + // Returns the EditEventPage Widget + case Routes.editEventPage: + final Event event = settings.arguments! as Event; + return MaterialPageRoute( + builder: (context) => EditEventPage( + key: const Key('EditEvent'), + event: event, + ), + ); + case Routes.pinnedPostScreen: + // final Map post = settings.arguments! as Map ; + final Map post = + settings.arguments! as Map; + + return MaterialPageRoute( + builder: (context) => PinnedPostScreen(post: post), + ); + // Returns the AppSettingsPage Widget + case Routes.appSettings: + return MaterialPageRoute( + builder: (context) => const AppSettingsPage(key: Key('AppSettings')), + ); + + // Returns the ChatMessageScreen Widget + case Routes.chatMessageScreen: + final List arguments = settings.arguments! as List; + final String chatId = arguments[0] as String; + final DirectChatViewModel model = arguments[1] as DirectChatViewModel; + return MaterialPageRoute( + builder: (context) => ChatMessageScreen( + key: const Key('ChatMessageScreen'), + chatId: chatId, + model: model, + ), + ); + + case Routes.calendar: + return MaterialPageRoute( + builder: (context) => EventCalendar( + settings.arguments! as List, + key: const Key('Calendar'), + ), + ); + + case Routes.selectContact: + return MaterialPageRoute( + builder: (context) => const SelectContact(key: Key('selectContact')), + ); + + case Routes.addPostScreen: + return MaterialPageRoute( + builder: (context) => const AddPost( + key: Key('AddPostPage'), + ), + ); + + case Routes.orgInfoScreen: + final OrgInfo orgInfo = settings.arguments! as OrgInfo; + return MaterialPageRoute( + builder: (context) => OrganisationInfoScreen( + orgInfo: orgInfo, + key: const Key('orginfoscreen'), + ), + ); + + default: + return MaterialPageRoute( + builder: (context) => const DemoPageView( + key: Key("DemoPage"), + ), + ); + } +} diff --git a/lib/services/chat_service.dart b/lib/services/chat_service.dart new file mode 100644 index 000000000..ebb216412 --- /dev/null +++ b/lib/services/chat_service.dart @@ -0,0 +1,147 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/chats/chat_list_tile_data_model.dart'; +import 'package:talawa/models/chats/chat_message.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/utils/chat_queries.dart'; + +/// Provides different services for direct chats of the user. +/// +/// Services include: +/// * `sendMessageToDirectChat` - used to send messages. +/// * `getDirectChatsByUserId` - used to get all chats by the user. +/// * `getDirectChatMessagesByChatId` - gets all chats of a user with +/// another user. +class ChatService { + ChatService() { + _dbFunctions = locator(); + _chatListStream = _chatController.stream.asBroadcastStream(); + _chatMessagesStream = _chatMessageController.stream.asBroadcastStream(); + } + + /// Database mutation functions. + late DataBaseMutationFunctions _dbFunctions; + + /// Stream for chat list data. + late Stream _chatListStream; + + /// Stream for chat messages. + late Stream _chatMessagesStream; + + /// User configuration instance. + final _userConfig = locator(); + + /// Stream for GraphQL query results. + late Stream chatStream; + + /// Controller for chat list stream. + final StreamController _chatController = + StreamController(); + + /// Controller for chat messages stream. + final StreamController _chatMessageController = + StreamController(); + + /// Getter for chat list stream. + Stream get chatListStream => _chatListStream; + + /// Getter for chat messages stream. + Stream get chatMessagesStream => _chatMessagesStream; + + // Stream getMessagesFromDirectChat() async* { + // final operation = SubscriptionOptions( + // document: gql(ChatQueries().messageSentToDirectChatsubscription), + // operationName: 'messageSentToDirectChat'); + // chatStream = graphqlConfig.clientToQuery().subscribe(operation); + + // _cha + // } + + /// Sends a message to a direct chat. + /// + /// **params**: + /// * `chatId`: The ID of the chat where the message will be sent. + /// * `messageContent`: The content of the message to be sent. + /// + /// **returns**: + /// None + Future sendMessageToDirectChat( + String chatId, + String messageContent, + ) async { + // trigger graphQL mutation to push the message in the Database. + final result = await _dbFunctions.gqlAuthMutation( + ChatQueries().sendMessageToDirectChat(), + variables: {"chatId": chatId, "messageContent": messageContent}, + ); + + final message = ChatMessage.fromJson( + (result as QueryResult).data?['sendMessageToDirectChat'] + as Map, + ); + + _chatMessageController.add(message); + + debugPrint(result.data.toString()); + } + + /// Retrieves direct chats by user ID. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future getDirectChatsByUserId() async { + final userId = _userConfig.currentUser.id; + + // trigger graphQL query to get all the chats + // of the user using [userId]. + final String query = ChatQueries().fetchDirectChatsByUserId(userId!); + + final result = await _dbFunctions.gqlAuthQuery(query); + + final directMessageList = + (result as QueryResult).data?['directChatsByUserID'] as List; + + // loop through the result [directMessageList] + // and append the element to the directChat. + directMessageList.forEach((chat) { + final directChat = + ChatListTileDataModel.fromJson(chat as Map); + + directChat.users!.forEach((element) { + if (element.id != userId) _chatController.add(directChat); + }); + }); + } + + /// This function retrieves direct chat messages by chat ID. + /// + /// **params**: + /// * `chatId`: The ID of the chat for which messages + /// are to be retrieved. + /// + /// **returns**: + /// None + Future getDirectChatMessagesByChatId(chatId) async { + // trigger graphQL query to get all the chat messages + // of a particular chat using [chatId]. + final String query = + ChatQueries().fetchDirectChatMessagesByChatId(chatId as String); + + final result = await _dbFunctions.gqlAuthQuery(query); + + final messages = + (result as QueryResult).data?['directChatsMessagesByChatID'] as List; + + messages.forEach((message) { + final chatMessage = ChatMessage.fromJson(message as Map); + _chatMessageController.add(chatMessage); + }); + } +} diff --git a/lib/services/comment_service.dart b/lib/services/comment_service.dart new file mode 100644 index 000000000..b118b6c00 --- /dev/null +++ b/lib/services/comment_service.dart @@ -0,0 +1,77 @@ +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/utils/comment_queries.dart'; + +/// CommentService class have different member functions which provides service in the context of commenting. +/// +/// Services include: +/// * `createComments` - used to add comment on the post. +/// * `getCommentsForPost` - used to get all comments on the post. +class CommentService { + CommentService() { + _dbFunctions = locator(); + _navigationService = locator(); + } + late DataBaseMutationFunctions _dbFunctions; + late NavigationService _navigationService; + + /// This function is used to add comment on the post. + /// + /// To verify things are working, check out the native platform logs. + /// **params**: + /// * `postId`: The post id on which comment is to be added. + /// * `text`: The comment text. + /// + /// **returns**: + /// None + Future createComments(String postId, String text) async { + final String createCommentQuery = CommentQueries().createComment(); + + try { + await _dbFunctions.gqlAuthMutation( + createCommentQuery, + variables: { + 'postId': postId, //Add your variables here + 'text': text, + }, + ); + + _navigationService.showTalawaErrorSnackBar( + "Comment sent", + MessageType.info, + ); + } on Exception catch (_) { + _navigationService.showTalawaErrorSnackBar( + "Something went wrong", + MessageType.error, + ); + } + } + + /// This function is used to get all comments on the post. + /// + /// To verify things are working, check out the native platform logs. + /// **params**: + /// * `postId`: The post id for which comments are to be fetched. + /// + /// **returns**: + /// * `Future>`: promise that will be fulfilled with list of comments. + /// + Future> getCommentsForPost(String postId) async { + final String getCommmentQuery = CommentQueries().getPostsComments(postId); + + final dynamic result = await _dbFunctions.gqlAuthMutation(getCommmentQuery); + + if (result == null) { + return []; + } + final resultData = (result as QueryResult).data; + + final resultDataPostComments = (resultData?['post'] + as Map)['comments'] as List; + return resultDataPostComments; + } +} diff --git a/lib/services/database_mutation_functions.dart b/lib/services/database_mutation_functions.dart new file mode 100644 index 000000000..5760616c2 --- /dev/null +++ b/lib/services/database_mutation_functions.dart @@ -0,0 +1,405 @@ +import 'dart:async'; +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/utils/queries.dart'; + +/// DataBaseMutationFunctions class provides different services that are under the context of graphQL mutations and queries. +/// +/// Services include: +/// * `encounteredExceptionOrError` +/// * `gqlAuthQuery` +/// * `gqlAuthMutation` +/// * `gqlNonAuthMutation` +/// * `gqlNonAuthQuery` +/// * `refreshAccessToken` +/// * `fetchOrgById` +class DataBaseMutationFunctions { + /// Client Auth for handling non-authenticated request. + late GraphQLClient clientNonAuth; + + /// Client Auth for handling authenticated request. + late GraphQLClient clientAuth; + + /// Query passed by fucntion calling this function. + late Queries _query; + + /// Initialization function. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void init() { + clientNonAuth = graphqlConfig.clientToQuery(); + clientAuth = graphqlConfig.authClient(); + _query = Queries(); + } + + /// Initializes [clientNonAuth] function. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void initClientNonAuth() { + graphqlConfig.getOrgUrl(); + clientNonAuth = graphqlConfig.clientToQuery(); + _query = Queries(); + } + + /// Graphql error for handling. + GraphQLError userNotFound = const GraphQLError(message: 'User not found'); + + /// Graphql error for handling. + GraphQLError userNotAuthenticated = + const GraphQLError(message: 'User is not authenticated'); + + /// Graphql error for handling. + GraphQLError emailAccountPresent = + const GraphQLError(message: 'Email address already exists'); + + /// Graphql error for handling. + GraphQLError wrongCredentials = + const GraphQLError(message: 'Invalid credentials'); + + /// Graphql error for handling. + GraphQLError organizationNotFound = + const GraphQLError(message: 'Organization not found'); + + /// Graphql error for handling. + GraphQLError refreshAccessTokenExpiredException = const GraphQLError( + message: + 'Access Token has expired. Please refresh session.: Undefined location', + ); + + /// Graphql error for handling. + GraphQLError memberRequestExist = + const GraphQLError(message: 'Membership Request already exists'); + + /// Graphql error for handling. + GraphQLError notifFeatureNotInstalled = const GraphQLError( + message: + 'Failed to determine project ID: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal. Error code: ENOTFOUND', + ); + + /// This function is used to check if any exceptions or error encountered. The return type is [boolean]. + /// + /// **params**: + /// * `exception`: OperationException which occur when calling for graphql post request + /// * `showSnackBar`: Tell if the the place where this function is called wants a SnackBar on error + /// + /// **returns**: + /// * `bool?`: returns a bool whether or not their is error, can be null + bool? encounteredExceptionOrError( + OperationException exception, { + bool showSnackBar = true, + }) { + // If server link is wrong. + if (exception.linkException != null) { + debugPrint(exception.linkException.toString()); + if (showSnackBar) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => navigationService.showTalawaErrorSnackBar( + "Server not running/wrong url", + MessageType.info, + ), + ); + } + return false; + } + + /// Looping through graphQL errors. + debugPrint(exception.graphqlErrors.toString()); + for (int i = 0; i < exception.graphqlErrors.length; i++) { + // if the error message is "Access Token has expired. Please refresh session.: Undefined location" + 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; + } + + /// If the error message is "User is not authenticated" + if (exception.graphqlErrors[i].message == userNotAuthenticated.message) { + print('client refreshed'); + refreshAccessToken(userConfig.currentUser.refreshToken!).then( + (value) => graphqlConfig + .getToken() + .then((value) => databaseFunctions.init()), + ); + return true; + } + + /// If the error message is "User not found" + if (exception.graphqlErrors[i].message == userNotFound.message) { + if (showSnackBar) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => navigationService.showTalawaErrorDialog( + "No account registered with this email", + MessageType.error, + ), + ); + } + return false; + } + + /// If the error message is "Membership Request already exists" + if (exception.graphqlErrors[i].message == memberRequestExist.message) { + if (showSnackBar) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => navigationService.showTalawaErrorDialog( + "Membership request already exist", + MessageType.error, + ), + ); + } + return false; + } + + /// If the error message is "Invalid credentials" + if (exception.graphqlErrors[i].message == wrongCredentials.message) { + if (showSnackBar) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => navigationService.showTalawaErrorDialog( + "Enter a valid password", + MessageType.error, + ), + ); + } + return false; + } + + /// If the error message is "Organization not found" + if (exception.graphqlErrors[i].message == organizationNotFound.message) { + if (showSnackBar) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => navigationService.showTalawaErrorDialog( + "Organization Not Found", + MessageType.error, + ), + ); + } + return false; + } + + /// If the error message is "Email address already exists" + if (exception.graphqlErrors[i].message == emailAccountPresent.message) { + if (showSnackBar) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => navigationService.showTalawaErrorDialog( + "Account with this email already registered", + MessageType.error, + ), + ); + } + return false; + } + } + // If the error is unknown + + WidgetsBinding.instance.addPostFrameCallback( + (_) => navigationService.showTalawaErrorDialog( + "Something went wrong!", + MessageType.error, + ), + ); + return false; + } + + /// This function is used to run the graph-ql query for authentication. + /// + /// **params**: + /// * `query`: query is used to fetch data in graphql, for more info read graphql docs + /// * `variables`: variables to be passed with query + /// + /// **returns**: + /// * `Future`: it returns Future of dynamic + Future gqlAuthQuery( + String query, { + Map? variables, + }) async { + final QueryOptions options = QueryOptions( + document: gql(query), + variables: variables ?? {}, + ); + final QueryResult result = await clientAuth.query(options); + // if there is an error or exception in [result] + if (result.hasException) { + final exception = encounteredExceptionOrError(result.exception!); + if (exception!) { + gqlAuthQuery(query, variables: variables); + } + } else if (result.data != null && result.isConcrete) { + return result; + } + return null; + } + + /// This function is used to run the graph-ql mutation for authenticated user. + /// + /// **params**: + /// * `mutation`: mutation is used to change/add/delete data in graphql, for more info read graphql docs + /// * `variables`: variables to be passed with mutation + /// + /// **returns**: + /// * `Future`: it returns Future of dynamic + Future gqlAuthMutation( + String mutation, { + Map? variables, + }) async { + final QueryResult result = await clientAuth.mutate( + MutationOptions( + document: gql(mutation), + variables: variables ?? {}, + ), + ); + // If there is an error or exception in [result] + if (result.hasException) { + final exception = encounteredExceptionOrError(result.exception!); + if (exception!) { + gqlAuthMutation(mutation, variables: variables); + } + } else if (result.data != null && result.isConcrete) { + return result; + } + return null; + } + + /// This function is used to run the graph-ql mutation to authenticate the non signed-in user. + /// + /// + /// **params**: + /// * `mutation`: mutation is used to change/add/delete data in graphql, for more info read graphql docs + /// * `variables`: variables to be passed with mutation + /// * `reCall`: when not first fetch call + /// + /// **returns**: + /// * `Future`: it returns Future of dynamic + Future gqlNonAuthMutation( + String mutation, { + Map? variables, + bool reCall = true, + }) async { + final QueryResult result = await clientNonAuth.mutate( + MutationOptions( + document: gql(mutation), + variables: variables ?? {}, + ), + ); + // if there is an error or exception in [result] + if (result.hasException) { + final exception = encounteredExceptionOrError(result.exception!); + if (exception! && reCall) { + gqlNonAuthMutation(mutation, variables: variables); + } + } else if (result.data != null && result.isConcrete) { + return result; + } + return null; + } + + /// This function is used to run the graph-ql query for the non signed-in user. + /// + /// **params**: + /// * `query`: query is used to fetch data in graphql, for more info read graphql docs + /// * `variables`: variables to be passed with query + /// + /// **returns**: + /// * `Future?>`: it returns Future of QueryResult, contains all data + Future?> gqlNonAuthQuery( + String query, { + Map? variables, + }) async { + final queryOptions = QueryOptions( + document: gql(query), + variables: variables ?? {}, + ); + final result = await clientNonAuth.query(queryOptions); + QueryResult? finalRes; + // if there is an error or exception in [result] + if (result.hasException) { + final exception = encounteredExceptionOrError(result.exception!); + if (exception!) { + finalRes = await gqlNonAuthQuery(query, variables: variables); + } + } else if (result.data != null && result.isConcrete) { + return result; + } + return finalRes; + } + + /// This function is used to refresh the Authenication token to access the application. + /// + /// **params**: + /// * `refreshToken`: Needed for authentication + /// + /// **returns**: + /// * `Future`: it returns Future of dynamic + Future refreshAccessToken(String refreshToken) async { + // run the graphQL mutation + final QueryResult result = await clientNonAuth.mutate( + MutationOptions( + document: gql( + _query.refreshToken(refreshToken), + ), + ), + ); + // if there is an error or exception in [result] + if (result.hasException) { + final exception = encounteredExceptionOrError(result.exception!); + if (exception!) { + refreshAccessToken(refreshToken); + } else { + navigationService.pop(); + } + } else if (result.data != null && result.isConcrete) { + userConfig.updateAccessToken( + refreshToken: (result.data!['refreshToken'] + as Map)['refreshToken'] + .toString(), + accessToken: (result.data!['refreshToken'] + as Map)['accessToken'] + .toString(), + ); + databaseFunctions.init(); + return true; + } + return false; + } + + /// This function fetch the organization using the [id] passed. + /// + /// **params**: + /// * `id`: id that identifies a particular org + /// + /// **returns**: + /// * `Future`: it returns Future of dynamic + Future fetchOrgById(String id) async { + final QueryResult result = await clientNonAuth + .mutate(MutationOptions(document: gql(_query.fetchOrgById(id)))); + // if there is an error or exception in [result] + if (result.hasException) { + final exception = encounteredExceptionOrError(result.exception!); + if (exception!) { + fetchOrgById(id); + } + } else if (result.data != null && result.isConcrete) { + print(result.data!['organizations']); + return OrgInfo.fromJson( + // ignore: collection_methods_unrelated_type + (result.data!['organizations'] as List>)[0], + ); + } + return false; + } +} diff --git a/lib/services/event_service.dart b/lib/services/event_service.dart new file mode 100644 index 000000000..6b3146ec8 --- /dev/null +++ b/lib/services/event_service.dart @@ -0,0 +1,182 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/models/mainscreen_navigation_args.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'; +import 'package:talawa/widgets/custom_progress_dialog.dart'; + +/// EventService class provides different services in the context of Event. +/// +/// Services include: +/// * `setOrgStreamSubscription` : to set organization stream subscription for user. +/// * `getEvents` : to get all events of the organization. +/// * `fetchAttendeesByEvent` : to fetch all attendees of an event. +/// * `registerForAnEvent` : to register for an event. +/// * `deleteEvent` : to delete an event. +/// * `editEvent` : to edit the event. +/// * `dispose` : to cancel the stream subscription of an organization. +class EventService { + EventService() { + _eventStream = _eventStreamController.stream.asBroadcastStream(); + _currentOrg = _userConfig.currentOrg; + _userConfig.initialiseStream(); + setOrgStreamSubscription(); + } + + // variables declaration + final _userConfig = locator(); + final _dbFunctions = locator(); + + late OrgInfo _currentOrg; + late StreamSubscription _currentOrganizationStreamSubscription; + late Stream _eventStream; + + final StreamController _eventStreamController = + StreamController(); + + /// The event stream. + /// + /// params: + /// None + /// returns: + /// * `Stream`: returns the event stream + Stream get eventStream => _eventStream; + + /// This function is used to set stream subscription for an organization. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void setOrgStreamSubscription() { + _currentOrganizationStreamSubscription = + _userConfig.currentOrgInfoStream.listen((updatedOrganization) { + _currentOrg = updatedOrganization; + }); + } + + /// This function is used to fetch all the events of an organization. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future getEvents() async { + // get current organization id + final String currentOrgID = _currentOrg.id!; + // mutation to fetch the events + final String mutation = EventQueries().fetchOrgEvents(currentOrgID); + final result = await _dbFunctions.gqlAuthMutation(mutation); + + if (result == null) return; + + final List eventsJson = + (result as QueryResult).data!["eventsByOrganizationConnection"] as List; + eventsJson.forEach((eventJsonData) { + final Event event = Event.fromJson(eventJsonData as Map); + event.isRegistered = event.attendees?.any( + (attendee) => attendee.id == _userConfig.currentUser.id, + ) ?? + false; + _eventStreamController.add(event); + }); + } + + /// This function is used to fetch all registrants of an event. + /// + /// **params**: + /// * `eventId`: id of an event. + /// + /// **returns**: + /// * `Future`: Information about event registrants. + Future fetchAttendeesByEvent(String eventId) async { + final result = await _dbFunctions.gqlAuthQuery( + EventQueries().attendeesByEvent(eventId), + ); + return result; + } + + /// This function is used to register user for an event. + /// + /// **params**: + /// * `eventId`: id of an event. + /// + /// **returns**: + /// * `Future`: Information about the event registration. + Future registerForAnEvent(String eventId) async { + final Map variables = {'eventId': eventId}; + final result = await _dbFunctions.gqlAuthMutation( + EventQueries().registerForEvent(), + variables: variables, + ); + return result; + } + + /// This function is used to delete the event. + /// + /// **params**: + /// * `eventId`: id of an event + /// + /// **returns**: + /// * `Future`: Information about the event deletion + Future deleteEvent(String eventId) async { + navigationService.pushDialog( + const CustomProgressDialog(key: Key('DeleteEventProgress')), + ); + final result = await _dbFunctions.gqlAuthMutation( + EventQueries().deleteEvent(eventId), + ); + navigationService.pop(); + return result; + } + + /// This function is used to edit an event. + /// + /// **params**: + /// * `eventId`: id of an event + /// * `variables`: this will be `map` type and contain all the event details need to be update. + /// + /// **returns**: + /// None + Future editEvent({ + required String eventId, + required Map variables, + }) async { + navigationService.pushDialog( + const CustomProgressDialog( + key: Key('EditEventProgress'), + ), + ); + final result = await _dbFunctions.gqlAuthMutation( + EventQueries().updateEvent(eventId: eventId), + variables: variables, + ); + navigationService.pop(); + if (result != null) { + navigationService.removeAllAndPush( + Routes.exploreEventsScreen, + Routes.mainScreen, + arguments: MainScreenArgs(mainScreenIndex: 0, fromSignUp: false), + ); + } + } + + /// This function is used to cancel the stream subscription of an organization. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void dispose() { + _currentOrganizationStreamSubscription.cancel(); + } +} diff --git a/lib/services/graphql_config.dart b/lib/services/graphql_config.dart new file mode 100644 index 000000000..374485d08 --- /dev/null +++ b/lib/services/graphql_config.dart @@ -0,0 +1,82 @@ +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'; + +/// GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. +/// Talawa uses graphQL for the integrating with the API's. +/// You can go through talawa-api, [here](https://github.com/PalisadoesFoundation/talawa-api). +/// GraphqlConfig class provides service to configure graph ql API with talawa mobile-app. +class GraphqlConfig { + // variable declaration + static const imageUrlKey = "imageUrl"; + static const urlKey = "url"; + static String? orgURI = ' '; + static String? token; + late HttpLink httpLink; + late WebSocketLink webSocketLink; + +//prefix route for showing images + String? displayImgRoute; + + /// This function is used to get user the access token. + Future getToken() async { + final authToken = userConfig.currentUser.authToken; + token = authToken; + getOrgUrl(); + return true; + } + + /// This function is used to get the organization URL. + void 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!); + } + + GraphQLClient clientToQuery() { + //TODO: Implement websocket link from OrgUrl + // final link = Link.split( + // (request) => request.isSubscription, webSocketLink, httpLink); + 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, + ); + } + + void test() { + httpLink = HttpLink( + 'https://talawa-graphql-api.herokuapp.com/graphql', + httpClient: MockHttpClient(), + ); + } +} + +/// A mock HTTP client designed for use when testing code that uses BaseClient. +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/image_service.dart b/lib/services/image_service.dart new file mode 100644 index 000000000..3d57e3ebf --- /dev/null +++ b/lib/services/image_service.dart @@ -0,0 +1,80 @@ +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:image_cropper/image_cropper.dart'; +import 'package:talawa/locator.dart'; + +/// ImageService class provides different functions as service in the context of Images. +/// +/// Services include: +/// * `cropImage` +/// * `convertToBase64` +class ImageService { + /// Global instance of ImageCropper. + final ImageCropper _imageCropper = locator(); + + /// Crops the image selected by the user. + /// + /// **params**: + /// * `imageFile`: the image file to be cropped. + /// + /// **returns**: + /// * `Future`: the image after been cropped. + /// + /// **throws**: + /// - `Exception`: If an error occurs during the image cropping process. + Future cropImage({required File imageFile}) async { + // try, to crop the image and returns a File with cropped image path. + try { + final CroppedFile? croppedImage = await _imageCropper.cropImage( + sourcePath: imageFile.path, + aspectRatioPresets: [ + CropAspectRatioPreset.square, + CropAspectRatioPreset.original, + ], + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Crop Image', + toolbarColor: const Color(0xff18191A), + toolbarWidgetColor: Colors.white, + backgroundColor: Colors.black, + cropGridColor: Colors.white, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false, + ), + IOSUiSettings( + minimumAspectRatio: 1.0, + ), + ], + ); + + if (croppedImage != null) { + return File(croppedImage.path); + } + } catch (e) { + throw Exception( + "ImageService : $e.", + ); + } + + return null; + } + + /// Converts the image into Base64 format. + /// + /// **params**: + /// * `file`: Image as a File object. + /// + /// **returns**: + /// * `Future`: image in string format + Future convertToBase64(File file) async { + try { + final List bytes = await file.readAsBytes(); + final String base64String = base64Encode(bytes); + return base64String; + } catch (error) { + return null; + } + } +} diff --git a/lib/services/navigation_service.dart b/lib/services/navigation_service.dart new file mode 100644 index 000000000..baecf3dc5 --- /dev/null +++ b/lib/services/navigation_service.dart @@ -0,0 +1,193 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/widgets/talawa_error_dialog.dart'; +import 'package:talawa/widgets/talawa_error_snackbar.dart'; + +/// NavigationService class provides different functions as service in the context of navigation. +/// +/// Services include: +/// * `pushScreen` +/// * `popAndPushScreen` +/// * `pushReplacementScreen` +/// * `removeAllAndPush` +/// * `showSnackBar` +/// * `pushDialog` +/// * `showTalawaErrorWidget` +/// * `showTalawaErrorDialog` +/// * `pop` +class NavigationService { + /// Key for Navigator State. + GlobalKey navigatorKey = GlobalKey(); + + /// Pushes a Screen. + /// + /// **params**: + /// * `routeName`: Name of the Route + /// * `arguments`: Set of arguments + /// + /// **returns**: + /// * `Future`: resolves if the Screen was succesfully pushed. + Future pushScreen(String routeName, {dynamic arguments}) { + return navigatorKey.currentState! + .pushNamed(routeName, arguments: arguments); + } + + /// This function pop the initial route and push the new route to the navigator. + /// + /// **params**: + /// * `routeName`: Name of the Route + /// * `arguments`: Set of arguments + /// + /// **returns**: + /// * `Future`: resolves if the Screen was succesfully popAndPushed. + Future popAndPushScreen(String routeName, {dynamic arguments}) { + navigatorKey.currentState!.pop(); + return pushScreen(routeName, arguments: arguments); + } + + /// This function push the route and replace the screen. + /// + /// **params**: + /// * `routeName`: Name of the Route + /// * `arguments`: Set of arguments + /// + /// **returns**: + /// * `Future`: resolves if the Screen was succesfully pushedReplacementScreen. + 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]); + // } + // } + + /// This function remove all the routes till the particular route and add new route. + /// + /// **params**: + /// * `routeName`: Name of the Route + /// * `tillRoute`: Route till we want to remove + /// * `arguments`: Set of arguments + /// + /// **returns**: + /// * `Future`: resolves if the Screen was succesfully removeAllAndPushed. + Future removeAllAndPush( + String routeName, + String tillRoute, { + dynamic arguments, + }) { + return navigatorKey.currentState!.pushNamedAndRemoveUntil( + routeName, + ModalRoute.withName(tillRoute), + arguments: arguments, + ); + } + + /// This function remove all the routes till the particular route and add new route. + /// + /// **params**: + /// * `dialog`: Widget to show + /// + /// **returns**: + /// None + void pushDialog(Widget dialog) { + showDialog( + context: navigatorKey.currentContext!, + barrierColor: Colors.transparent, + barrierDismissible: false, + builder: (BuildContext context) { + return dialog; + }, + ); + } + + /// This is used for the quick alert of `duration: 2 seconds` with text message(passed). + /// + /// **params**: + /// * `message`: Message would be shown on snackbar + /// * `duration`: Duration of Snackbar + /// + /// **returns**: + /// None + void showSnackBar( + String message, { + Duration duration = const Duration(seconds: 2), + }) { + ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar( + SnackBar( + behavior: SnackBarBehavior.floating, + duration: duration, + content: Text( + AppLocalizations.of(navigatorKey.currentContext!)! + .strictTranslate(message), + ), + ), + ); + } + + /// This is used for the quick error of `duration: 2 seconds`. + /// + /// **params**: + /// * `errorMessage`: Error Message shown in snackbar + /// * `messageType`: Type of Message + /// * `duration`: Duration of snackbar + /// + /// **returns**: + /// None + void showTalawaErrorSnackBar( + String errorMessage, + MessageType messageType, + ) { + final Duration duration = Duration(milliseconds: errorMessage.length * 80); + ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar( + SnackBar( + padding: EdgeInsets.zero, + duration: duration, + content: TalawaErrorSnackBar( + duration: duration, + messageType: messageType, + errorMessage: errorMessage, + ), + backgroundColor: const Color.fromRGBO(65, 65, 66, 1), + ), + ); + } + + /// Shows an Error Dialog Box. + /// + /// **params**: + /// * `errorMessage`: Message shown in dialog + /// * `messageType`: Type of Message + /// + /// **returns**: + /// None + void showTalawaErrorDialog(String errorMessage, MessageType messageType) { + showDialog( + context: navigatorKey.currentContext!, + barrierColor: Colors.transparent, + barrierDismissible: false, + builder: (BuildContext context) { + return TalawaErrorDialog( + errorMessage, + messageType: messageType, + ); + }, + ); + } + + /// This function pops the current state. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void pop() { + return navigatorKey.currentState!.pop(); + } +} diff --git a/lib/services/org_service.dart b/lib/services/org_service.dart new file mode 100644 index 000000000..40b4e5703 --- /dev/null +++ b/lib/services/org_service.dart @@ -0,0 +1,44 @@ +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/utils/queries.dart'; + +/// Provides the Services in the context of organizations. +/// +/// Services include: +/// * `getOrgMembersList` : to get all organizations members +class OrganizationService { + // constructor + OrganizationService() { + _dbFunctions = locator(); + } + late DataBaseMutationFunctions _dbFunctions; + + /// Retrieves a list of organization members. + /// + /// **params**: + /// * `orgId`: The ID of the organization to fetch members from. + /// + /// **returns**: + /// * `Future>`: A promise that will be fulfilled + /// with the list of organization members. + Future> getOrgMembersList(String orgId) async { + final String query = Queries().fetchOrgDetailsById(orgId); + // fetching from database using graphQL mutations. + final result = await _dbFunctions.gqlAuthMutation(query); + final organizations = + (result as QueryResult).data?['organizations'] as List; + final List orgMembersResult = + (organizations[0] as Map)['members'] as List; + final List orgMembersList = []; + orgMembersResult.forEach((jsonElement) { + final User member = + User.fromJson(jsonElement as Map, fromOrg: true); + orgMembersList.add(member); + }); + + // return list + return orgMembersList; + } +} diff --git a/lib/services/post_service.dart b/lib/services/post_service.dart new file mode 100644 index 000000000..4b893277b --- /dev/null +++ b/lib/services/post_service.dart @@ -0,0 +1,263 @@ +// ignore_for_file: talawa_good_doc_comments, talawa_api_doc +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'; + +/// PostService class provides functions in the context of a Post. +/// +/// Services include: +/// * `getPosts` : to get all posts of the organization. +/// * `addLike` : to add like to the post. +/// * `removeLike` : to remove the like from the post. +class PostService { + // constructor + PostService() { + _postStream = _postStreamController.stream.asBroadcastStream(); + _updatedPostStream = + _updatedPostStreamController.stream.asBroadcastStream(); + _currentOrg = _userConfig.currentOrg; + setOrgStreamSubscription(); + getPosts(); + } + // Stream for entire posts + final StreamController> _postStreamController = + StreamController>(); + late Stream> _postStream; + + //Stream for individual 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 = []; + + Map? postInfo; + String? after; + String? before; + int? first = 5; + int? last; + + /// Getter for Stream of posts. + Stream> get postStream => _postStream; + + /// Getter for Stream of update in any post. + Stream get updatedPostStream => _updatedPostStream; + + ///This method sets up a stream that constantly listens to change in current org. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void setOrgStreamSubscription() { + _userConfig.currentOrgInfoStream.listen((updatedOrganization) { + if (updatedOrganization != _currentOrg) { + _renderedPostID.clear(); + _currentOrg = updatedOrganization; + getPosts(); + } + }); + } + + /// Method used to fetch all posts of the current organisation. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Future`: returns future void + Future getPosts() async { + // variables + final String currentOrgID = _currentOrg.id!; + final String query = + PostQueries().getPostsById(currentOrgID, after, before, first, last); + final result = await _dbFunctions.gqlAuthQuery(query); + //Checking if the dbFunctions return the postJSON, if not return. + if (result == null || (result as QueryResult).data == null) { + // Handle the case where the result or result.data is null + return; + } + + final organizations = result.data!['organizations'] as List; + final posts = (organizations[0] as Map)['posts']; + final List postsJson = (posts as Map)['edges'] as List; + postInfo = posts['pageInfo'] as Map; + postsJson.forEach((postJson) { + final Post post = Post.fromJson( + (postJson as Map)['node'] as Map, + ); + if (!_renderedPostID.contains(post.sId)) { + _posts.insert(0, post); + _renderedPostID.add(post.sId); + } + }); + _postStreamController.add(_posts); + } + + /// Method to refresh feed of current selected organisation. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Future`: returns future void + Future refreshFeed() async { + _posts.clear(); + _renderedPostID.clear(); + await getPosts(); + } + + ///Method to add newly created post at the very top of the feed. + /// + /// **params**: + /// * `newPost`: new post made by user to add in feed + /// + /// **returns**: + /// None + void addNewpost(Post newPost) { + if (!_posts.contains(newPost)) { + _posts.insert(0, newPost); + } + _postStreamController.add(_posts); + } + + ///Method to add like on a Post. + /// + /// This method basically update likedBy list of a Post + /// in database. + /// + /// **params**: + /// * `postID`: ID of the post to add like in database + /// + /// **returns**: + /// * `Future`: define_the_return + Future addLike(String postID) async { + _localAddLike(postID); + final String mutation = PostQueries().addLike(); + // run the graphQl mutation. + final result = await _dbFunctions + .gqlAuthMutation(mutation, variables: {"postID": postID}); + print(result); + // return result + return result; + } + + /// Locally add like on a Post and updates it using updated Post Stream. + /// + /// **params**: + /// * `postID`: ID of the post to add like locally + /// + /// **returns**: + /// None + void _localAddLike(String postID) { + _posts.forEach((post) { + if (post.sId == postID) { + post.likedBy!.add(LikedBy(sId: _userConfig.currentUser.id)); + _updatedPostStreamController.add(post); + } + }); + } + + /// Method to remove like in a Post. + /// + /// This method basically update likedBy list of a Post + /// and removes the like of a user in database. + /// + /// **params**: + /// * `postID`: ID of the post to remove like in database. + /// + /// **returns**: + /// * `Future`: nothing + 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; + } + + /// Locally removes the like of a user and update the Post UI. + /// + /// **params**: + /// * `postID`: ID of the post to remove like locally + /// + /// **returns**: + /// None + void _removeLocal(String postID) { + _posts.forEach((post) { + if (post.sId == postID) { + post.likedBy!.removeWhere( + (likeUser) => likeUser.sId == _userConfig.currentUser.id, + ); + _updatedPostStreamController.add(post); + } + }); + } + + ///Method to add comment of a user and update comments using updated Post Stream. + /// + /// **params**: + /// * `postID`: ID of the post to add comment locally + /// + /// **returns**: + /// None + 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]); + } + } + } + + /// Method to handle pagination by fetching next page of posts. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future nextPage() async { + if (postInfo!['hasNextPage'] == true) { + _posts.clear(); + _renderedPostID.clear(); + after = postInfo!['endCursor'] as String; + before = null; + first = 5; + last = null; + await getPosts(); + } + } + + /// Method to handle pagination by fetching previous page of posts. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future previousPage() async { + if (postInfo!['hasPreviousPage'] == true) { + _posts.clear(); + _renderedPostID.clear(); + before = postInfo!['startCursor'] as String; + after = null; + last = 5; + first = null; + await getPosts(); + } + } +} diff --git a/lib/services/session_manager.dart b/lib/services/session_manager.dart new file mode 100644 index 000000000..76df5bfa0 --- /dev/null +++ b/lib/services/session_manager.dart @@ -0,0 +1,52 @@ +import 'dart:async'; + +import 'package:talawa/locator.dart'; + +/// Manages user sessions and periodically refreshes access tokens. +class SessionManager { + SessionManager() { + initializeSessionRefresher(); + } + + /// returns refresh interval of Session Manager. + int get refreshInterval => _refreshInterval; + + /// refresh interval in seconds. + static const int _refreshInterval = 600; + + /// Initializes as session refresher. + /// + /// Invokes [refreshSession] periodically at regular + /// refresh intervals. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Timer`: refresh timer. + Timer initializeSessionRefresher() { + return Timer.periodic( + const Duration(seconds: _refreshInterval), + (Timer timer) async { + refreshSession(); + }, + ); + } + + /// Asynchronously refreshes the user session. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Future`: indicates if session refresh was + /// successful. + Future refreshSession() async { + if (userConfig.loggedIn && userConfig.currentUser.refreshToken != null) { + final refreshed = await databaseFunctions + .refreshAccessToken(userConfig.currentUser.refreshToken!); + return refreshed; + } + return false; + } +} diff --git a/lib/services/size_config.dart b/lib/services/size_config.dart new file mode 100644 index 000000000..10d8c6bda --- /dev/null +++ b/lib/services/size_config.dart @@ -0,0 +1,54 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/widgets.dart'; + +/// SizeConfig class is used to initialise the height and width of the media. +class SizeConfig { + // variables + 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; + + // function to initialise the width and height. + 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"); + } + + void 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/third_party_service/multi_media_pick_service.dart b/lib/services/third_party_service/multi_media_pick_service.dart new file mode 100644 index 000000000..616c0dc31 --- /dev/null +++ b/lib/services/third_party_service/multi_media_pick_service.dart @@ -0,0 +1,114 @@ +/* This is an abstraction service for picking up Photos/videos +Library used: image_picker (https://pub.dev/packages/image_picker) +Service usage: "add_post_view_model.dart" +*/ + +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:permission_handler/permission_handler.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/image_service.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/widgets/custom_alert_dialog.dart'; + +/// This is a third party service which provide the service to select the image from. +/// +/// gallery and then image can be cropped as well. +/// +/// Services include: +/// * `getPhotoFromGallery` - Used to select photo from gallery. +/// * `cropImage` - Used to crop the selected image. +class MultiMediaPickerService { + MultiMediaPickerService() { + _picker = locator(); + _fileStream = _fileStreamController.stream.asBroadcastStream(); + _imageService = imageService; + } + + /// Controller for handling the stream of selected files. + final StreamController _fileStreamController = StreamController(); + + /// Stream of selected files. + late Stream _fileStream; + + /// [ImagePicker] used for selecting images or videos. + late ImagePicker _picker; + + /// [ImageService] for additional image-related operations. + late ImageService _imageService; + + /// Provides a stream of selected multimedia files. + /// + /// params: + /// None. + /// + /// returns: + /// * `Stream`: Stream of files. + Stream get fileStream => _fileStream; + + /// Picks the image from gallery or to click the image from user's camera. + /// + /// First ask for the permission to access the camera, if denied then returns a message in. + /// custom Dialog Box. Returns a File type for which `camera` variable is false by default. + /// + /// **params**: + /// * `camera`: if true then open camera for image, else open gallery to select image. + /// + /// **returns**: + /// * `Future`: the image the user choosed. + Future getPhotoFromGallery({bool camera = false}) async { + // asking for user's camera access permission. + try { + // checking for the image source, it could be camera or gallery. + final image = await _picker.pickImage( + source: camera ? ImageSource.camera : ImageSource.gallery, + ); + // if image is selected or not null, call the cropImage function that provide service to crop the selected image. + if (image != null) { + return await _imageService.cropImage( + imageFile: File(image.path), + ); + } + } catch (e) { + // if the permission denied or error occurs. + if (e is PlatformException && e.code == 'camera_access_denied') { + // push the dialog alert with the message. + locator().pushDialog( + permissionDeniedDialog(), + ); + } + debugPrint( + "MultiMediaPickerService : Exception occurred while choosing photo from the gallery $e", + ); + } + + return null; + } + + /// Generates a custom alert dialog for permission denial. + /// + /// When called, it creates and returns a `CustomAlertDialog` widget with pre-defined settings. + /// This dialog prompts the user to grant camera permissions from the app settings. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `CustomAlertDialog`: Custom Alert Dialog widget. + CustomAlertDialog permissionDeniedDialog() { + return CustomAlertDialog( + success: () { + locator().pop(); + openAppSettings(); + }, + dialogTitle: 'Permission Denied', + successText: 'SETTINGS', + dialogSubTitle: + "Camera permission is required, to use this feature, give permission from app settings", + ); + } +} diff --git a/lib/services/user_config.dart b/lib/services/user_config.dart new file mode 100644 index 000000000..047159587 --- /dev/null +++ b/lib/services/user_config.dart @@ -0,0 +1,288 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.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/widgets/custom_progress_dialog.dart'; + +/// Provides different services in the context of the User. +/// +/// Services include: +/// * `userLoggedIn` : helps to make user logged in to the application. +/// * `updateUserJoinedOrg` : helps to update the user joined organization. +/// * `updateUserCreatedOrg` : helps to update the user created organization. +/// * `updateUserMemberRequestOrg` : helps to update the User membership +/// request for the organization. +/// * `updateUserAdminOrg` : helps to update the Admin of the Organization. +/// * `updateAccessToken` : helps to update the access token of an user. +/// * `updateUser` : helps to update the user. +class UserConfig { + // variables + late User? _currentUser = User(id: 'null', authToken: 'null'); + late OrgInfo? _currentOrg = OrgInfo(name: 'Organization Name', id: 'null'); + late Stream _currentOrgInfoStream; + final StreamController _currentOrgInfoController = + StreamController.broadcast(); + + /// Retrieves the stream of current organization information. + Stream get currentOrgInfoStream => _currentOrgInfoStream; + + /// Retrieves the stream controller for current organization information. + StreamController get currentOrgInfoController => + _currentOrgInfoController; + + /// Retrieves the current organization information. + OrgInfo get currentOrg => _currentOrg!; + + /// Retrieves the name of the current organization. + String get currentOrgName => _currentOrg!.name!; + + /// Checks if a user is logged in. + bool get loggedIn => _currentUser?.id != 'null'; + + /// Updates the current organization information. + set currentOrg(OrgInfo org) => _currentOrg = org; + + /// Retrieves the current user. + User get currentUser => _currentUser!; + + /// Updates the current user. + set currentUser(User user) { + _currentUser = user; + } + + /// initialise. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void initialiseStream() { + _currentOrgInfoStream = + _currentOrgInfoController.stream.asBroadcastStream(); + } + + /// This function is used to log in the user. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Future`: returns future of bool type. + 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 there is not currentUser then returns false. + if (_currentUser == null) { + _currentUser = User(id: 'null', authToken: 'null'); + return false; + } + databaseFunctions.initClientNonAuth(); + await sessionManager.refreshSession(); + // generate access token + graphqlConfig.getToken().then((value) async { + try { + final QueryResult result = await databaseFunctions.gqlAuthQuery( + queries.fetchUserInfo, + variables: {'id': currentUser.id}, + ) as QueryResult; + final List users = result.data!['users'] as List; + final User userInfo = User.fromJson( + users[0] as Map, + fromOrg: false, + ); + 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.showTalawaErrorSnackBar( + "Couldn't update User details", + MessageType.error, + ); + } + }); + return true; + } + + /// Logs out the current user. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Future`: returns future of bool type. + Future userLogOut() async { + bool isLogOutSuccessful = false; + try { + final result = await databaseFunctions.gqlAuthMutation(queries.logout()) + as QueryResult?; + if (result != null && result.data!['logout'] == true) { + navigationService.pushDialog( + const CustomProgressDialog( + key: Key('LogoutProgress'), + ), + ); + // throw StateError('error'); + + final user = Hive.box('currentUser'); + final url = Hive.box('url'); + // final androidFirebaseOptionsBox = Hive.box('androidFirebaseOptions'); + // final iosFirebaseOptionsBox = Hive.box('iosFirebaseOptions'); + final organisation = Hive.box('currentOrg'); + await user.clear(); + await url.clear(); + // androidFirebaseOptionsBox.clear(); + // iosFirebaseOptionsBox.clear(); + // try { + // Firebase.app() + // .delete(); // Deleting app will stop all Firebase plugins + // } catch (e) { + // debugPrint("ERROR: Unable to delete firebase app $e"); + // } + await organisation.clear(); + _currentUser = User(id: 'null', authToken: 'null'); + isLogOutSuccessful = true; + } + } catch (e) { + isLogOutSuccessful = false; + } + return isLogOutSuccessful; + } + + /// Updates the user joined organization. + /// + /// **params**: + /// * `orgDetails`: details of the organization that user joined. + /// + /// **returns**: + /// * `Future`: returns future of void type. + Future updateUserJoinedOrg(List orgDetails) async { + _currentUser!.updateJoinedOrg(orgDetails); + saveUserInHive(); + } + + /// Updates the user created organization. + /// + /// **params**: + /// * `orgDetails`: details of the organization that user joined. + /// + /// **returns**: + /// * `Future`: returns future of void type. + Future updateUserCreatedOrg(List orgDetails) async { + _currentUser!.updateCreatedOrg(orgDetails); + saveUserInHive(); + } + + /// Updates the user request to join the organization. + /// + /// **params**: + /// * `orgDetails`: details of the organization that user joined. + /// + /// **returns**: + /// * `Future`: returns future of void type. + Future updateUserMemberRequestOrg(List orgDetails) async { + _currentUser!.updateMemberRequestOrg(orgDetails); + saveUserInHive(); + } + + /// Updates the organization admin. + /// + /// **params**: + /// * `orgDetails`: details of the organization that user joined. + /// + /// **returns**: + /// * `Future`: returns future of void type. + Future updateUserAdminOrg(List orgDetails) async { + _currentUser!.updateAdminFor(orgDetails); + saveUserInHive(); + } + + /// Updates the access token of the user. + /// + /// **params**: + /// * `accessToken`: current user's accesstoken. + /// * `refreshToken`: current user's refreshtoken. + /// + /// **returns**: + /// * `Future`: returns future of void type. + Future updateAccessToken({ + required String accessToken, + required String refreshToken, + }) async { + _currentUser!.refreshToken = refreshToken; + _currentUser!.authToken = accessToken; + saveUserInHive(); + } + + /// Updates the user details. + /// + /// **params**: + /// * `updatedUserDetails`: `User` type variable containing + /// all the details of an user need to be updated. + /// + /// **returns**: + /// * `Future`: returns future of bool type. + Future updateUser(User updatedUserDetails) async { + try { + _currentUser = updatedUserDetails; + saveUserInHive(); + graphqlConfig.getToken(); + databaseFunctions.init(); + return true; + } on Exception catch (e) { + debugPrint(e.toString()); + return false; + } + } + + /// save user in hive. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void saveUserInHive() { + final box = Hive.box('currentUser'); + if (box.get('user') == null) { + box.put('user', _currentUser!); + } else { + box.put('user', _currentUser!); + } + } + + /// save current organization details in hive. + /// + /// **params**: + /// * `saveOrgAsCurrent`: instance of OrgInfo + /// + /// **returns**: + /// None + void 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..89290d1ee --- /dev/null +++ b/lib/splash_screen.dart @@ -0,0 +1,314 @@ +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/models/mainscreen_navigation_args.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:uni_links/uni_links.dart'; + +/// This widget return the SplashScreen. Splash Screen is the first screen that we see when we run our application. It is also known as Launch Screen. +class SplashScreen extends StatefulWidget { + const SplashScreen({required Key key, this.mainScreenIndex = 0}) + : super(key: key); + + /// This is required if url requires us to push different Screen to Home Screen. + final int mainScreenIndex; + + @override + _SplashScreenState createState() => _SplashScreenState(); +} + +/// This return state for the SplashScreen Widget. +class _SplashScreenState extends State { + Uri? _initialUri; + Uri? _latestUri; + late StreamSubscription _sub; + + // Flutter supports deep linking on iOS, Android, and web browsers. + // Opening a URL displays that screen in your app. + // `_handleInitialUri` is an async function that is used to hanlde + // the initial uri of the application. + + /// Opening a URL displays that screen in your app. + /// + /// Used to handle the initial uri of the application. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future _handleInitialUri() async { + _sub = uriLinkStream.listen( + (Uri? uri) { + // After creating a State object and before calling initState, the framework + // "mounts" the State object by associating it with a BuildContext. + if (!mounted) return; + setState(() { + _latestUri = uri; + }); + }, + onError: (Object err) { + if (!mounted) return; + setState(() { + _latestUri = null; + }); + }, + ); + try { + // Retrieving the initial URI from getInitialUri function. + 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); + } + final bool userLoggedIn = userConfig.loggedIn; + _initialUri = null; + _latestUri = null; + if (_latestUri == null && _initialUri == null) { + _handleUserLogIn(userLoggedIn); + return; + } + + // if (_initialUri != null) { + // await _handleDeepLinks(userLoggedIn); + // } + } + + // Future _handleDeepLinks(bool userLoggedIn) async { + // final keys = _initialUri!.queryParameters.keys; + // final values = _initialUri!.queryParameters.values; + + // final fromInviteLink = navigationService.fromInviteLink; + // final showSnackBar = navigationService.showTalawaErrorSnackBar; + // final pushReplacementScreen = navigationService.pushReplacementScreen; + + // final orgURI = GraphqlConfig.orgURI!; + // final mainScreenArgs = + // MainScreenArgs(mainScreenIndex: widget.mainScreenIndex); + + // if (_initialUri!.pathSegments[1] == 'invite') { + // if (!userLoggedIn) { + // fromInviteLink( + // keys.toList(growable: false), + // values.toList(growable: false), + // ); + // return; + // } + + // final setUrl = values.toList(growable: false)[1]; + // if (setUrl.compareTo(orgURI) != 0) { + // showSnackBar( + // 'Organisation on different server! Logout and open link again', + // MessageType.error, + // ); + // return; + // } + + // if (keys.last.compareTo('selectOrg') != 0) { + // showSnackBar('Invalid url', MessageType.error); + // return; + // } + + // final routeNames = [ + // Routes.mainScreen.split('/').last, + // Routes.joinOrg.split('/').last, + // ]; + // final arguments = [ + // mainScreenArgs, + // values.last, + // ]; + // fromInviteLink(routeNames, arguments); + // return; + // } + // if (_initialUri!.pathSegments[1] == 'eventInvite') { + // if (!userLoggedIn) { + // pushReplacementScreen( + // Routes.languageSelectionRoute, + // arguments: 'en', + // ); + // return; + // } + + // final setUrl = values.toList(growable: false)[0]; + // if (setUrl.compareTo(orgURI) != 0) { + // Clipboard.setData(ClipboardData(text: setUrl)); + // showSnackBar( + // 'Organisation on different server! Url copied to clipboard.', + // MessageType.error, + // ); + // pushReplacementScreen( + // Routes.mainScreen, + // arguments: mainScreenArgs, + // ); + // return; + // } + + // final currentOrgId = userConfig.currentOrg.id!; + // if (values.toList()[1].compareTo(currentOrgId) != 0) { + // pushReplacementScreen(Routes.joinOrg, arguments: values.toList()[1]); + // return; + // } + + // final routeNames = [ + // Routes.mainScreen.split('/').last, + // Routes.eventInfoPage.split('/').last, + // ]; + + // final model = locator(); + // await model.initialise(); + + // await Future.delayed(Duration.zero); + // Event? event; + // for (final ele in model.events) { + // if (ele.id == values.last) event = ele; + // } + + // if (event == null) { + // showSnackBar('Event not found', MessageType.error); + // pushReplacementScreen( + // Routes.mainScreen, + // arguments: mainScreenArgs, + // ); + // return; + // } + + // final arguments = [ + // MainScreenArgs(mainScreenIndex: 1), + // { + // "event": event, + // "exploreEventViewModel": model, + // }, + // ]; + + // fromInviteLink(routeNames, arguments); + // return; + // } + // } + + /// Handles User Login. + /// + /// **params**: + /// * `userLoggedIn`: Bool for if user is logged in already or not + /// + /// **returns**: + /// None + void _handleUserLogIn(bool userLoggedIn) { + Future.delayed(const Duration(milliseconds: 750)).then((value) async { + final pushReplacementScreen = navigationService.pushReplacementScreen; + if (!userLoggedIn) { + pushReplacementScreen(Routes.languageSelectionRoute, arguments: 'en'); + return; + } + + final currentUser = userConfig.currentUser; + if (currentUser.joinedOrganizations!.isNotEmpty) { + final mainScreenArgs = MainScreenArgs( + mainScreenIndex: widget.mainScreenIndex, + fromSignUp: false, + ); + pushReplacementScreen(Routes.mainScreen, arguments: mainScreenArgs); + return; + } + + if (currentUser.membershipRequests!.isNotEmpty) { + pushReplacementScreen(Routes.waitingScreen, arguments: '0'); + return; + } + + pushReplacementScreen(Routes.joinOrg, arguments: '-1'); + }); + } + + @override + void initState() { + super.initState(); + _handleInitialUri(); + } + + @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, + ), + 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.headlineMedium, + ), + ], + ), + ), + 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.bodySmall, + ), + ], + ), + ), + 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 + .titleSmall! + .copyWith(fontWeight: FontWeight.w700), + ), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/utils/app_localization.dart b/lib/utils/app_localization.dart new file mode 100644 index 000000000..7446a530b --- /dev/null +++ b/lib/utils/app_localization.dart @@ -0,0 +1,102 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; + +///This class provides methods to localize the application so that it can be available +///to users with different languages. +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', 'de', 'ja', 'pt'] + .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/chat_queries.dart b/lib/utils/chat_queries.dart new file mode 100644 index 000000000..06f75da4f --- /dev/null +++ b/lib/utils/chat_queries.dart @@ -0,0 +1,87 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +///This class creates the queries dealing with chats. + +class ChatQueries { + //Returns a query to fetch direct chat using userId + String fetchDirectChatsByUserId(String userId) { + return ''' + query { + directChatsByUserID(id: "$userId") { + _id + users{ + _id + firstName + email + } + } + } + '''; + } + + //Returns query to fetch direct chat messages using chatId + String fetchDirectChatMessagesByChatId(String chatId) { + return ''' + query { + directChatsMessagesByChatID(id: "$chatId") { + _id + messageContent + sender { + _id + firstName + image + } + receiver { + _id + firstName + image + } + } + } + '''; + } + + //Gets messages sent to direct chat subscription + String get messageSentToDirectChatsubscription => ''' + subscription{ + messageSentToDirectChat{ + _id + messageContent + sender { + _id + firstName + image + } + receiver { + _id + firstName + image + } + } + } + '''; + + //Send message to direct chat. + String sendMessageToDirectChat() { + return ''' + mutation sendMessageToDirectChat( + \$chatId: ID! + \$messageContent: String! + ){ + sendMessageToDirectChat( + chatId: \$chatId + messageContent: \$messageContent + ) { + messageContent + sender{ + firstName + } + receiver{ + firstName + } + } + } + '''; + } +} diff --git a/lib/utils/comment_queries.dart b/lib/utils/comment_queries.dart new file mode 100644 index 000000000..fa11f6c18 --- /dev/null +++ b/lib/utils/comment_queries.dart @@ -0,0 +1,49 @@ +///This class creates the queries dealing with comments. +class CommentQueries { + /// Creating a comment. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `String`: The query for creating a comment + String createComment() { + return """ + mutation createComment(\$postId: ID!, \$text: String!) { + createComment(postId: \$postId, + data:{ + text: \$text, + } + ){ + _id + } + } + """; + } + + /// Get all comments for a post. + /// + /// **params**: + /// * `postId`: The id of the post to get comments for. + /// + /// **returns**: + /// * `String`: The query for getting all comments for a post. + String getPostsComments(String postId) { + return """ + query { + post(id: "$postId") + { _id, + comments{ + _id, + text, + createdAt + creator{ + firstName + lastName + } + } + } + } +"""; + } +} diff --git a/lib/utils/encryptor.dart b/lib/utils/encryptor.dart new file mode 100644 index 000000000..becf9a455 --- /dev/null +++ b/lib/utils/encryptor.dart @@ -0,0 +1,162 @@ +import 'dart:convert'; +import 'dart:math'; +import 'dart:typed_data'; + +import 'package:crypto/crypto.dart'; +import 'package:hive/hive.dart'; +import 'package:pointycastle/asymmetric/oaep.dart'; +import 'package:pointycastle/asymmetric/rsa.dart'; +import 'package:pointycastle/key_generators/rsa_key_generator.dart'; +import 'package:pointycastle/pointycastle.dart'; +import 'package:pointycastle/random/fortuna_random.dart'; +import 'package:talawa/models/asymetric_keys/asymetric_keys.dart'; + +/// Handles all of the encryption tasks in the codebase. +class Encryptor { + /// A global switch to flag the encryption. + /// + /// Since adding encryption invalidates all of the previous + /// data, disabling it by default will help in keeping + /// other contributors working without any issue. + /// TODO: Remove this and make encryption default. + static bool shouldEncrypt = false; + + /// Encrypts a given string with SHA256 Encryption. + /// + /// **params**: + /// * `data`: The string data to encrypt + /// + /// **returns**: + /// * `String`: SHA256 encrypted data + static String encryptString(String data) { + if (!shouldEncrypt) return data; + return sha256.convert(utf8.encode(data)).toString(); + } + + /// Generates RSA Key Pairs (Public/Private). + /// + /// Should be called only during app's first initialization, + /// and any future usage should be done by getting the keys + /// from the local storage. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `AsymmetricKeyPair`: The generated + /// public and private keys. + AsymmetricKeyPair generateRSAKeyPair() { + final secureRandom = FortunaRandom(); + final random = Random.secure(); + final List seeds = []; + for (int i = 0; i < 32; i++) { + seeds.add(random.nextInt(255)); + } + secureRandom.seed(KeyParameter(Uint8List.fromList(seeds))); + final rsapars = RSAKeyGeneratorParameters(BigInt.from(65537), 2048, 64); + final params = ParametersWithRandom(rsapars, secureRandom); + final keyGenerator = RSAKeyGenerator(); + keyGenerator.init(params); + return keyGenerator.generateKeyPair(); + } + + /// Saves the generated key pair to local storage. + /// + /// Any future usage of the keys must be initiated from here. + /// + /// **params**: + /// * `keyPair`: [AsymmetricKeyPair] to save. + /// * `hive`: The [HiveInterface] to store keys in. + /// + /// **returns**: + /// None + Future saveKeyPair( + AsymmetricKeyPair keyPair, + HiveInterface hive, + ) async { + // TODO: Implement secure storage here + final Box keysBox = + await hive.openBox('user_keys'); + keysBox.put('key_pair', AsymetricKeys(keyPair: keyPair)); + } + + /// Loads secret keys from the Hive db. + /// + /// **params**: + /// * `hive`: The [HiveInterface] to load keys from. + /// + /// **returns**: + /// * `Future>`: The public and + /// private key pair + Future> loadKeyPair( + HiveInterface hive, + ) async { + final keysBox = await hive.openBox('user_keys'); + return keysBox.get('key_pair')!.keyPair; + } + + /// Encrypts the given string data with Recipient's Public Key. + /// + /// **params**: + /// * `data`: The string to encrypt + /// * `recipientPublicKey`: Key to be used to encrypt. Recipient's public + /// key in our case. + /// + /// **returns**: + /// * `String`: Encrypted string + String assymetricEncryptString(String data, RSAPublicKey recipientPublicKey) { + final cipher = OAEPEncoding(RSAEngine()) + ..init(true, PublicKeyParameter(recipientPublicKey)); + + final encryptedBytes = cipher.process(Uint8List.fromList(data.codeUnits)); + return base64Encode(encryptedBytes); + } + + /// Encrypts the given string data with user's Private Key. + /// + /// **params**: + /// * `data`: The string to decrypt + /// * `privateKey`: Key to be used to decrypt. User's private key in our case. + /// + /// **returns**: + /// * `String`: Decrypted string + String assymetricDecryptString(String data, RSAPrivateKey privateKey) { + final cipher = OAEPEncoding(RSAEngine()) + ..init(false, PrivateKeyParameter(privateKey)); + + final decryptedBytes = cipher.process(base64Decode(data)); + return String.fromCharCodes(decryptedBytes); + } + + // TODO: Use this somewhere + + /// Helper function to decrypt the message. + /// + /// Internally uses the [loadKeyPair] function to get private key and + /// [assymetricDecryptString] to decrypt the given message. + /// + /// **params**: + /// * `message`: Message object containing a field named [encryptedMessage] + /// which is supposed to contained user's message in encrypted format. + /// * `hive`: The [HiveInterface] to store things in. + /// + /// **returns**: + /// None + Future receiveMessage( + Map message, + HiveInterface hive, + ) async { + try { + final encryptedMessage = message['encryptedMessage'] as String; + final privateKey = (await loadKeyPair(hive)).privateKey; + final decryptedMessage = assymetricDecryptString( + encryptedMessage, + privateKey as RSAPrivateKey, + ); + + print('Decrypted Message: $decryptedMessage'); + } catch (e) { + throw Exception('Error'); + } + } +} diff --git a/lib/utils/event_queries.dart b/lib/utils/event_queries.dart new file mode 100644 index 000000000..554c180f4 --- /dev/null +++ b/lib/utils/event_queries.dart @@ -0,0 +1,193 @@ +///This class creates queries related to the events. +class EventQueries { + /// Fetches events by organization ID. + /// + /// **params**: + /// * `orgId`: The ID of the organization to fetch events for. + /// + /// **returns**: + /// * `String`: Returns a GraphQL query string to fetch events associated with the specified organization ID. + /// + /// This function generates a GraphQL query string to retrieve events + /// based on the provided organization ID. + + String fetchOrgEvents(String orgId) { + return """ + query { + eventsByOrganizationConnection( + where: { + organization_id: "$orgId" + } + ) { + _id + organization { + _id + image + } + title + description + isPublic + isRegisterable + recurring + startDate + endDate + allDay + startTime + endTime + location + creator { + _id + firstName + lastName + } + admins { + _id + firstName + lastName + } + attendees { + _id + firstName + lastName + image + } + } + } + """; + } + + /// Fetches attendees by event ID. + /// + /// **params**: + /// * `eventId`: The ID of the event to fetch registrants for. + /// + /// **returns**: + /// * `String`: Returns a GraphQL query string to retrieve registrants associated with the specified event ID. + /// + /// This function generates a GraphQL query string to fetch registrants + /// based on the provided event ID. + String attendeesByEvent(String eventId) { + return ''' + query { + getEventAttendeesByEventId(eventId: "$eventId") { + eventId + userId + isRegistered + isInvited + isCheckedIn + isCheckedOut + } + } + '''; + } + + /// Creates a GraphQL mutation for adding an event. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `String`: Returns a GraphQL mutation string to create an event. + /// + /// This function generates a GraphQL mutation string for creating an event. + String addEvent() { + return """ + mutation Mutation(\$data: EventInput!, \$recurrenceRuleData: RecurrenceRuleInput) { + createEvent(data: \$data, recurrenceRuleData: \$recurrenceRuleData) { + _id + title + description + } + } + """; + } + + /// Creates a GraphQL mutation for registering for an event. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `String`: Returns a GraphQL mutation string to register for the specified event. + /// + /// This function generates a GraphQL mutation string for registering an individual for an event. + String registerForEvent() { + return """ + mutation registerForEvent(\$eventId: ID!) { + registerForEvent(id: \$eventId) { + _id + } + } + """; + } + + /// Creates a GraphQL mutation for deleting an event. + /// + /// **params**: + /// * `id`: The ID of the event to delete. + /// + /// **returns**: + /// * `String`: Returns a GraphQL mutation string to delete the specified event. + /// + /// This function generates a GraphQL mutation string for removing/deleting an event + /// based on the provided event ID. + String deleteEvent(String id) { + return """ + mutation { + removeEvent( + id: "$id", + ){ + _id + } + } + """; + } + + /// Creates a GraphQL mutation for updating an event. + /// + /// **params**: + /// * `eventId`: The ID of the event to update. + /// + /// **returns**: + /// * `String`: Returns a GraphQL mutation string to update the specified event. + /// + /// This function generates a GraphQL mutation string for updating an event + /// based on the provided parameters. It takes the event ID along with updated + /// details. + /// The mutation updates the event details and returns the ID, title, and description + /// of the updated event. + String updateEvent({ + eventId, + }) { + return """mutation updateEvent( + \$title:String!, + \$description: String!, + \$startTime: Time, + \$endTime: Time, + \$allDay: Boolean!, + \$recurring: Boolean!, + \$isPublic: Boolean!, + \$isRegisterable: Boolean!, + \$location: String, + ) { + updateEvent( + id: "$eventId" + data:{ + title: \$title, + description: \$description, + isPublic: \$isPublic, + isRegisterable: \$isRegisterable, + recurring: \$recurring, + allDay: \$allDay, + startTime: \$startTime + endTime: \$endTime + location: \$location + } + ){ + _id + title + description + } + }"""; + } +} diff --git a/lib/utils/post_queries.dart b/lib/utils/post_queries.dart new file mode 100644 index 000000000..2b4a82ace --- /dev/null +++ b/lib/utils/post_queries.dart @@ -0,0 +1,225 @@ +///This class creates queries related to posts. +class PostQueries { + /// Getting Posts by Id. + /// + /// **params**: + /// * `orgId`: The organisation id + /// * `after`: The cursor after which the posts are to be fetched + /// * `before`: The cursor before which the posts are to be fetched + /// * `first`: The number of posts to be fetched from the start + /// * `last`: The number of posts to be fetched from the end + /// + /// **returns**: + /// * `String`: The query related to gettingPostsbyId + String getPostsById( + String orgId, + String? after, + String? before, + int? first, + int? last, + ) { + print(after); + final String? afterValue = after != null ? '"$after"' : null; + final String? beforeValue = before != null ? '"$before"' : null; + + return """ + query { + organizations(id: "$orgId") { + posts(first: $first, last:$last,after: $afterValue, before: $beforeValue) { + edges { + node { + _id + title + text + imageUrl + videoUrl + creator { + _id + firstName + lastName + email + } + createdAt + likeCount + commentCount + likedBy{ + _id + } + comments{ + _id + } + pinned + } + cursor + } + pageInfo { + startCursor + endCursor + hasNextPage + hasPreviousPage + } + totalCount + } + } + } +"""; + } + + /// Getting Post by Post Id. + /// + /// **params**: + /// * `postId`: The post id + /// + /// **returns**: + /// * `String`: The query related to gettingPostsbyId + String getPostById(String postId) { + return """ + query { + post(id: "$postId") + { + _id + text + createdAt + imageUrl + videoUrl + title + commentCount + likeCount + creator{ + _id + firstName + lastName + image + } + organization{ + _id + } + likedBy{ + _id + } + comments{ + _id, + text, + createdAt + creator{ + firstName + lastName + } + } + } + } +"""; + } + + /// Add Like to a post. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `String`: The query related to addingLike + String addLike() { + return """ + mutation likePost(\$postID: ID!) { + likePost( id: \$postID,) + { + _id + } + } + """; + } + + /// Remove Like from a post. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `String`: The query related to removingLike + String removeLike() { + return """ + mutation unlikePost(\$postID: ID!) { + unlikePost( id: \$postID,) + { + _id + likedBy{ + _id + } + } + } + """; + } + + /// Upload a post to database. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `String`: The query related to uploadingPost. + String uploadPost() { + return ''' + mutation CreatePost( + \$text: String! + \$title: String! + \$imageUrl: URL + \$videoUrl: URL + \$organizationId: ID! + \$file: String + ) { + createPost( + data: { + text: \$text + title: \$title + imageUrl: \$imageUrl + videoUrl: \$videoUrl + organizationId: \$organizationId + } + file: \$file + ) { + _id + text + createdAt + imageUrl + videoUrl + title + commentCount + likeCount + creator{ + _id + firstName + lastName + image + } + organization{ + _id + } + likedBy{ + _id + } + comments{ + _id + } + } + } + '''; + } + + /// Mutation to remove the post. + /// + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `String`: query is returned + String removePost() { + return ''' + mutation RemovePost(\$id: ID!) { + removePost(id: \$id) { + _id + } + } + '''; + } +} diff --git a/lib/utils/queries.dart b/lib/utils/queries.dart new file mode 100644 index 000000000..942490911 --- /dev/null +++ b/lib/utils/queries.dart @@ -0,0 +1,592 @@ +///This class returns some queries for the application. +class Queries { + //Returns a query to register a user. + + /// Mutation to register a user. + /// + /// + /// **params**: + /// * `firstName`: user's data. + /// * `lastName`: user's data. + /// * `email`: user's data. + /// * `password`: user's data. + /// * `selectedOrganization`: ID of the selected organization. + /// + /// **returns**: + /// * `String`: Return the mutation in string type to be passed to graphql client. + String registerUser( + String firstName, + String lastName, + String email, + String password, + String? selectedOrganization, + ) { + return """ + mutation{ + signUp(data: {firstName: "$firstName", lastName: "$lastName", email: "$email", password: "$password", selectedOrganization: "$selectedOrganization"}) + { + appUserProfile{ + adminFor{ + _id + name + } + createdOrganizations{ + _id + name + image + description + userRegistrationRequired + creator{ + _id + firstName + lastName + image + } + } + } + user{ + _id + firstName + lastName + email + image + joinedOrganizations{ + _id + name + image + description + userRegistrationRequired + creator{ + _id + firstName + lastName + image + } + } + membershipRequests{ + organization{ + _id + name + image + description + userRegistrationRequired + creator{ + _id + firstName + lastName + image + } + } + } + } + refreshToken + accessToken + } + } + """; + } + + //Returns a query to login the user + /// mutation to login the user. + /// + /// **params**: + /// * `email`: user's data + /// * `password`: user's data + /// + /// **returns**: + /// * `String`: mutation in string form, to be passed on to graphql client. + String loginUser(String email, String password) { + return """ + mutation { + login(data: {email: "$email", password: "$password"}){ + appUserProfile{ + adminFor{ + _id + name + } + createdOrganizations{ + _id + name + image + description + userRegistrationRequired + creator{ + _id + firstName + lastName + image + } + } + } + user{ + _id + firstName + lastName + email + image + joinedOrganizations{ + _id + name + image + description + userRegistrationRequired + creator{ + _id + firstName + lastName + image + } + } + membershipRequests{ + organization{ + _id + name + image + description + userRegistrationRequired + creator{ + _id + firstName + lastName + image + } + } + } + } + refreshToken + accessToken + } + } + """; + } + + /// to update user profile. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `String`: return a mutation + String updateUserProfile() { + return """ + mutation UpdateUserProfile( + \$firstName: String + \$lastName: String + \$email: EmailAddress + \$file: String + ) { + updateUserProfile( + data: { firstName: \$firstName, lastName: \$lastName, email: \$email } + file: \$file + ) { + _id + } + } + """; + } + + /// logout muiation. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `String`: simple mutation + String logout() { + return """ + mutation { + logout + } + """; + } + + /// getter for joined org. + /// + String get fetchJoinInOrg { + return """ + query organizationsConnection(\$first: Int, \$skip: Int){ + organizationsConnection( + first: \$first, + skip: \$skip, + orderBy: name_ASC + ){ + image + _id + name + image + description + address{ + city + countryCode + state + } + userRegistrationRequired + creator{ + firstName + lastName + } + members{ + firstName + lastName + image + } + admins{ + firstName + lastName + image + } + } + } +"""; + } + + /// getter for fetchJoinInOrgByName. + String get fetchJoinInOrgByName { + return """ + query organizationsConnection( + \$first: Int, + \$skip: Int, + \$nameStartsWith: String + ){ + organizationsConnection( + where:{ + name_starts_with: \$nameStartsWith, + visibleInSearch: true, + userRegistrationRequired: true, + } + first: \$first, + skip: \$skip, + orderBy: name_ASC + ){ + image + _id + name + image + userRegistrationRequired + creator{ + firstName + lastName + } + } + } +"""; + } + + /// make mutation string for joiining org by ord.id. + /// + /// + /// **params**: + /// * `orgId`: refer org object. + /// + /// **returns**: + /// * `String`: returns a string for client + String joinOrgById(String orgId) { + return ''' + mutation { + joinPublicOrganization(organizationId: "$orgId") { + joinedOrganizations{ + _id + name + image + description + userRegistrationRequired + creator{ + _id + firstName + lastName + image + } + + } + } + } + '''; + } + + /// mutation to send the member request. + /// + /// + /// **params**: + /// * `orgId`: refer org object + /// + /// **returns**: + /// * `String`: mutation in string form, to be passed on to graphql client. + String sendMembershipRequest(String orgId) { + return ''' + mutation { + sendMembershipRequest(organizationId: "$orgId"){ + organization{ + _id + name + image + description + userRegistrationRequired + creator{ + _id + firstName + lastName + image + } + } + } + } + '''; + } + + /// mutation in string form, to be passed on to graphql client.. + String fetchUserInfo = ''' + query Users(\$id: ID!){ + users(where: { id: \$id }) { + appUserProfile{ + adminFor{ + _id + name + } + createdOrganizations{ + _id + name + image + description + userRegistrationRequired + creator{ + _id + firstName + lastName + image + } + } + } + user{ + _id + firstName + lastName + email + image + joinedOrganizations{ + _id + name + image + description + userRegistrationRequired + creator{ + _id + firstName + lastName + image + } + } + membershipRequests{ + organization{ + _id + name + image + description + userRegistrationRequired + creator{ + _id + firstName + lastName + image + } + } + } + } + } + } + '''; + + /// mutation for refresh token. + /// + /// **params**: + /// * `refreshToken`: related to auth, token based authentication, mutation to refresh the token + /// + /// **returns**: + /// * `String`: mutation in string form, to be passed on to graphql client. + String refreshToken(String refreshToken) { + return ''' + mutation{ + refreshToken(refreshToken: "$refreshToken"){ + accessToken + refreshToken + } + } + '''; + } + + /// lang update mutation. + /// + /// **params**: + /// * `languageCode`: lang code to identify the lang, refer lang jsons + /// + /// **returns**: + /// * `String`: mutation in string form, to be passed on to graphql client. + String updateLanguage(String languageCode) { + return ''' + mutation { + updateLanguage(languageCode: "$languageCode"){ + _id + firstName + appLanguageCode + } + } + '''; + } + + /// fetching org details with the help of id. + /// + /// + /// **params**: + /// * `orgId`: Org identifier + /// + /// **returns**: + /// * `String`: mutation in string form, to be passed on to graphql client. + String fetchOrgById(String orgId) { + return ''' + query{ + organizations(id: "$orgId"){ + image + _id + name + image + userRegistrationRequired + creator{ + firstName + lastName + } + } + } + '''; + } + + /// query to fetch user lang. + /// + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `String`: query in string form, to be passed on to graphql client. + String userLanguage() { + return ''' + query{ + myLanguage + } + '''; + } + + /// query for new user language . + /// + /// + /// **params**: + /// * `userId`: user identifier + /// + /// **returns**: + /// * `String`: query in string form, to be passed on to graphql client. + String newUserLanguage(String userId) { + return ''' + query{ + userLanguage(userId:"$userId") + } + '''; + } + + /// query to fetch org details. + /// + /// **params**: + /// * `orgId`: org identifier + /// + /// **returns**: + /// * `String`: query in string form, to be passed on to graphql client. + String fetchOrgDetailsById(String orgId) { + return ''' + query{ + organizations(id: "$orgId"){ + image + _id + name + admins{ + _id + } + description + userRegistrationRequired + creator{ + _id + firstName + lastName + } + members{ + _id + firstName + lastName + image + } + } + } + '''; + } + + ///`getPluginList` queries all properties of pluginList from the server. + /// + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `String`: query in string form, to be passed on to graphql client. + String getPluginsList() { + return ''' +query { + getPlugins { + _id + pluginName + pluginCreatedBy + pluginDesc + pluginInstallStatus + installedOrgs + } +} + '''; + } + + /// `createDonation` creates a new donation transaction by taking the userId ,orgId ,nameOfOrg ,nameOfUser as parameters. + /// + /// more_info_if_required + /// + /// **params**: + /// * `userId`: user identifier + /// * `orgId`: org identifier + /// * `nameOfOrg`: org data + /// * `nameOfUser`: user data + /// * `payPalId`: for payment + /// * `amount`: amount + /// + /// **returns**: + /// * `String`: mutation in string form, to be passed on to graphql client. + String createDonation( + String userId, + String orgId, + String nameOfOrg, + String nameOfUser, + String payPalId, + double amount, + ) { + return ''' + mutation createDonationMutation { createDonation( + userId :"$userId" + orgId :"$orgId", + nameOfOrg:"$nameOfOrg", + nameOfUser:"$nameOfUser", + payPalId:"$payPalId" + amount :$amount + ){ + _id + payPalId + userId + orgId + payPalId + nameOfUser + } + } + '''; + } +} diff --git a/lib/utils/validators.dart b/lib/utils/validators.dart new file mode 100644 index 000000000..bc38df304 --- /dev/null +++ b/lib/utils/validators.dart @@ -0,0 +1,194 @@ +import 'package:flutter/material.dart'; +import 'package:http/http.dart' as http; + +///This class creats various validator methods for the application. +/// +///They are used to validate information given by the users. +class Validator { + /// Method to validate an organization's URL. + /// + /// **params**: + /// * `value`: the URL of the organization + /// + /// **returns**: + /// * `String?`: error message if URL is invalid. + 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; + } + + /// Method to validate a user's first name. + /// + /// **params**: + /// * `value`: the value of the first name + /// + /// **returns**: + /// * `String?`: error message if first name is invalid. + 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; + } + + /// Method to validate a user's last name. + /// + /// **params**: + /// * `value`: the value of the last name + /// + /// **returns**: + /// * `String?`: error message if last name is invalid. + 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; + } + + /// Method to validate a user's email. + /// + /// **params**: + /// * `email`: the entered email + /// + /// **returns**: + /// * `String?`: error message if email is invalid. + 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; + } + + /// Method to validate password. + /// + /// **params**: + /// * `password`: the entered password + /// + /// **returns**: + /// * `String?`: error message if password is invalid. + 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 (!noSpaceRegex.hasMatch(password)) { + return "Password must not contain spaces"; + } + if (!regExp.hasMatch(password)) { + return "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,\$,etc.)"; + } + + return null; + } + + /// Method to valid password re-entered for confirmation. + /// + /// **params**: + /// * `value`: the entered password + /// * `comparator`: the original password + /// + /// **returns**: + /// * `String?`: error message if password is invalid. + static String? validatePasswordConfirm( + String value, + String comparator, + ) { + if (value != comparator) { + return 'Password does not match original'; + } + return null; + } + + /// Method to validate already exisiting URL. + /// + /// **params**: + /// * `url`: the entered URL + /// + /// **returns**: + /// * `Future`: true if URL exists, false otherwise. + Future validateUrlExistence(String url) async { + try { + await http.get(Uri.parse(url)); + return true; + } on Exception catch (e) { + debugPrint(e.toString()); + return false; + } + } + + /// Method to validate event form. + /// + /// **params**: + /// * `value`: the value of the field + /// * `label`: the (optional) label of the field + /// + /// **returns**: + /// * `String?`: error message if field is invalid. + 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; + } + + /// Method to validate event time. + /// + /// **params**: + /// * `startTime`: the start time of the event + /// * `endTime`: the end time of the event + /// + /// **returns**: + /// * `String?`: error message if time is invalid. + static String? validateEventTime(TimeOfDay startTime, TimeOfDay endTime) { + if (startTime.hour > endTime.hour || + (startTime.hour == endTime.hour && startTime.minute > endTime.minute)) { + return 'Start time must be before or equal to end time'; + } + return null; + } +} diff --git a/lib/view_model/access_request_view_model.dart b/lib/view_model/access_request_view_model.dart new file mode 100644 index 000000000..2057499c6 --- /dev/null +++ b/lib/view_model/access_request_view_model.dart @@ -0,0 +1,66 @@ +import 'package:flutter/cupertino.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/view_model/base_view_model.dart'; + +/// AccessScreenViewModel widget. +class AccessScreenViewModel extends BaseModel { + /// selectedOrganization list. + late OrgInfo selectedOrganization = OrgInfo(id: '-1'); + + /// organizations list. + late List organizations = []; + + /// org identifier. + late String orgId; + + /// text controller for optional message during the request. + final optionalMessageController = TextEditingController(); + + /// Initialization function. + /// + /// **params**: + /// * `org`: Org to send request to. + /// + /// **returns**: + /// None + Future initialise(OrgInfo org) async { + selectedOrganization = org; + } + + /// Sending member ship request function. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future sendMembershipRequest() async { + //TODO: Implement Message arg for below function + final result = await databaseFunctions.gqlAuthMutation( + queries.sendMembershipRequest(selectedOrganization.id!), + ); + if (result != null) { + final OrgInfo membershipRequest = OrgInfo.fromJson( + (((result as QueryResult).data!)['sendMembershipRequest'] + as Map)['organization'] as Map, + ); + userConfig.updateUserMemberRequestOrg([membershipRequest]); + if (userConfig.currentUser.joinedOrganizations!.isEmpty) { + navigationService.removeAllAndPush( + Routes.waitingScreen, + Routes.splashScreen, + ); + } else { + navigationService.pop(); + navigationService.showTalawaErrorSnackBar( + 'Join in request sent to ${selectedOrganization.name} successfully', + MessageType.info, + ); + } + } + } +} diff --git a/lib/view_model/after_auth_view_models/add_post_view_models/add_post_view_model.dart b/lib/view_model/after_auth_view_models/add_post_view_models/add_post_view_model.dart new file mode 100644 index 000000000..0885df8ea --- /dev/null +++ b/lib/view_model/after_auth_view_models/add_post_view_models/add_post_view_model.dart @@ -0,0 +1,219 @@ +import 'dart:async'; +import 'dart:io'; + +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/post/post_model.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/services/image_service.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/services/post_service.dart'; +import 'package:talawa/services/third_party_service/multi_media_pick_service.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/utils/post_queries.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +/// AddPostViewModel class have different functions. +/// +/// They are used to interact with the model to add a new post in the +/// organization. +class AddPostViewModel extends BaseModel { + AddPostViewModel({this.demoMode = false}); + + // Services + late MultiMediaPickerService _multiMediaPickerService; + late NavigationService _navigationService; + late ImageService _imageService; + + late File? _imageFile; + late String? _imageInBase64; + late OrgInfo _selectedOrg; + final TextEditingController _controller = TextEditingController(); + final TextEditingController _textHashTagController = TextEditingController(); + final TextEditingController _titleController = TextEditingController(); + + /// Whether the app is running in Demo Mode. + late bool demoMode; + + /// The image file that is to be uploaded. + /// + /// params: + /// None + /// returns: + /// * `File?`: The image file + File? get imageFile => _imageFile; + + /// Method to set image. + /// + /// + /// **params**: + /// * `file`: The file to set + /// + /// **returns**: + /// None + void setImageFile(File? file) { + _imageFile = file; + notifyListeners(); + } + + /// Getter to access the base64 type. + String? get imageInBase64 => _imageInBase64; + + /// Method to set Image in Bsse64. + /// + /// **params**: + /// * `file`: The file to convert. + /// + /// **returns**: + /// None + Future setImageInBase64(File file) async { + _imageInBase64 = await _imageService.convertToBase64(file); + notifyListeners(); + } + + /// The username of the currentUser. + String get userName => + userConfig.currentUser.firstName! + userConfig.currentUser.lastName!; + + /// User profile picture. + String? get userPic => userConfig.currentUser.image; + + /// The organisation name. + String get orgName => _selectedOrg.name!; + + /// The main text controller of the post body. + TextEditingController get controller => _controller; + + /// The main text controller of the hashtag. + TextEditingController get textHashTagController => _textHashTagController; + + /// The text controller of the title body. + TextEditingController get titleController => _titleController; + late DataBaseMutationFunctions _dbFunctions; + + /// This function is usedto do initialisation of stuff in the view model. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void initialise() { + _navigationService = locator(); + _imageFile = null; + _imageInBase64 = null; + _multiMediaPickerService = locator(); + _imageService = locator(); + if (!demoMode) { + _dbFunctions = locator(); + _selectedOrg = locator().currentOrg; + } + } + + /// This function is used to get the image from gallery. + /// + /// The function uses the `_multiMediaPickerService` services. + /// + /// **params**: + /// * `camera`: if true then open camera for image, else open gallery to select image. + /// + /// **returns**: + /// None + Future getImageFromGallery({bool camera = false}) async { + final image = + await _multiMediaPickerService.getPhotoFromGallery(camera: camera); + // convertImageToBase64(image!.path); + if (image != null) { + _imageFile = image; + // convertImageToBase64(image.path); + _imageInBase64 = await _imageService.convertToBase64(image); + // print(_imageInBase64); + _navigationService.showTalawaErrorSnackBar( + "Image is added", + MessageType.info, + ); + notifyListeners(); + } + } + + /// This function uploads the post finally, and navigate the success message or error message in Snack Bar. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future uploadPost() async { + // {TODO: Image not getting uploaded} + if (_imageFile == null) { + try { + final result = await _dbFunctions.gqlAuthMutation( + PostQueries().uploadPost(), + variables: { + "text": "${_controller.text} #${_textHashTagController.text}", + "organizationId": _selectedOrg.id, + "title": _titleController.text, + }, + ); + final Post newPost = Post.fromJson( + (result as QueryResult).data!['createPost'] as Map, + ); + locator().addNewpost(newPost); + _navigationService.showTalawaErrorSnackBar( + "Post is uploaded", + MessageType.info, + ); + } on Exception catch (e) { + print(e); + _navigationService.showTalawaErrorSnackBar( + "Something went wrong", + MessageType.error, + ); + } + } else { + try { + final result = await _dbFunctions.gqlAuthMutation( + PostQueries().uploadPost(), + variables: { + "text": _controller.text, + "organizationId": _selectedOrg.id, + "title": _titleController.text, + "file": 'data:image/png;base64,${_imageInBase64!}', + }, + ); + final Post newPost = Post.fromJson( + (result as QueryResult).data!['createPost'] as Map, + ); + locator().addNewpost(newPost); + _navigationService.showTalawaErrorSnackBar( + "Post is uploaded", + MessageType.info, + ); + } on Exception catch (_) { + _navigationService.showTalawaErrorSnackBar( + "Something went wrong", + MessageType.error, + ); + } + } + removeImage(); + _controller.text = ""; + _titleController.text = ""; + notifyListeners(); + } + + /// This function removes the image selected. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void removeImage() { + _imageFile = null; + notifyListeners(); + } +} diff --git a/lib/view_model/after_auth_view_models/chat_view_models/direct_chat_view_model.dart b/lib/view_model/after_auth_view_models/chat_view_models/direct_chat_view_model.dart new file mode 100644 index 000000000..5a4db6a25 --- /dev/null +++ b/lib/view_model/after_auth_view_models/chat_view_models/direct_chat_view_model.dart @@ -0,0 +1,121 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'dart:async'; + +import 'package:flutter/widgets.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/chats/chat_list_tile_data_model.dart'; +import 'package:talawa/models/chats/chat_message.dart'; +import 'package:talawa/models/chats/chat_user.dart'; +import 'package:talawa/services/chat_service.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +/// This ViewModel class have different functions that are used interact with model in the context of Direct Chat. +/// +/// Functions include: +/// * `initialise` : Initialise the states. +/// * `getChatMessages` : to get all the messages of a chat. +/// * `sendMessageToDirectChat` : to send the message to chat. +class DirectChatViewModel extends BaseModel { + final ChatService _chatService = locator(); + late StreamSubscription _chatListSubscription; + StreamSubscription? _chatMessageSubscription; + + final listKey = GlobalKey(); + + ChatState chatState = ChatState.initial; + + String? name; + + final Set _uniqueChatIds = {}; + final List _chats = []; + + List get chats => _chats; + + final Map> _chatMessagesByUser = {}; + + Map> get chatMessagesByUser => _chatMessagesByUser; + + /// This function refresh the chats. + void refreshChats() { + _chats.clear(); + _uniqueChatIds.clear(); + notifyListeners(); + _chatService.getDirectChatsByUserId(); + } + + // initialise + Future initialise() async { + setState(ViewState.busy); + chatState = ChatState.loading; + + _chatListSubscription = _chatService.chatListStream.listen((newChat) { + _uniqueChatIds.add(newChat.id!); + _chats.insert(0, newChat); + }); + + await _chatService.getDirectChatsByUserId(); + + chatState = ChatState.complete; + setState(ViewState.idle); + } + + /// This function get all messages for a chat. + /// + /// params: + /// * [chatId] : id of a chat for which messages need to be fetched. + Future getChatMessages(String chatId) async { + _chatMessagesByUser.clear(); + chatState = ChatState.loading; + // await _chatService.getMessagesFromDirectChat(); + // variable + final List messages = []; + _chatMessageSubscription = + _chatService.chatMessagesStream.listen((newMessage) { + messages.add(newMessage); + _chatMessagesByUser[chatId] = messages; + }); + // use `chatService` services + await _chatService.getDirectChatMessagesByChatId(chatId); + chatState = ChatState.complete; + notifyListeners(); + } + + /// This function send the message to Direct Chat. + /// + /// params: + /// * [chatId] : id of a chat where message need to be send. + /// * [messageContent] : content of a message. + Future sendMessageToDirectChat( + String chatId, + String messageContent, + ) async { + chatState = ChatState.loading; + _chatService.chatMessagesStream.listen((newMessage) { + _chatMessagesByUser[chatId]!.add(newMessage); + }); + await _chatService.sendMessageToDirectChat(chatId, messageContent); + chatState = ChatState.complete; + } + + @override + void dispose() { + _chatMessageSubscription?.cancel(); + _chatListSubscription.cancel(); + super.dispose(); + } + + // return chat name. + void chatName(chatId) { + final List users = + _chats.firstWhere((element) => element.id == chatId).users!; + + users.forEach((element) { + if (element.id != userConfig.currentUser.id!) { + name = element.firstName; + } + }); + } +} diff --git a/lib/view_model/after_auth_view_models/chat_view_models/select_contact_view_model.dart b/lib/view_model/after_auth_view_models/chat_view_models/select_contact_view_model.dart new file mode 100644 index 000000000..fe5e174df --- /dev/null +++ b/lib/view_model/after_auth_view_models/chat_view_models/select_contact_view_model.dart @@ -0,0 +1,43 @@ +import 'package:talawa/locator.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/org_service.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +/// SelectContactViewModel class have different functions to interact with model. +/// +/// Functions include: +/// * `getCurrentOrgUsersList` : to get all users of current organization. +class SelectContactViewModel extends BaseModel { + late OrganizationService _organizationService; + + /// orgMembersList is used to store all users of current organization. + late List orgMembersList = []; + + /// This function initializes the [SelectContactViewModel] class. + /// + /// more_info_if_required + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void initialise() { + _organizationService = locator(); + } + + /// function to get all users of current organization. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future getCurrentOrgUsersList() async { + if (orgMembersList.isEmpty) { + orgMembersList = await _organizationService + .getOrgMembersList(userConfig.currentOrg.id!); + notifyListeners(); + } + } +} 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..3baf49052 --- /dev/null +++ b/lib/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart @@ -0,0 +1,375 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:talawa/constants/recurrence_values.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/event_service.dart'; +import 'package:talawa/services/third_party_service/multi_media_pick_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'; + +/// CreateEventViewModel class have methods to interact with model in. +/// +/// the context of creating the event in the organization. +/// +/// Methods include: +/// * `createEvent` : to create an event. +/// * `getImageFromGallery` : to select image for a post. +/// * `removeImage` : to remove the image. +/// * `getCurrentOrgUsersList` : to get all user list of current organization. +/// * `removeUserFromList` : to remove a user from list. +class CreateEventViewModel extends BaseModel { + late MultiMediaPickerService _multiMediaPickerService; + late File? _imageFile; + + /// Event Title Text Controller. + TextEditingController eventTitleTextController = TextEditingController(); + + /// Event Location Text Controller. + TextEditingController eventLocationTextController = TextEditingController(); + + /// Event Description Text Controller. + TextEditingController eventDescriptionTextController = + TextEditingController(); + + /// Repeats Every count controller. + TextEditingController repeatsEveryCountController = + TextEditingController(text: '1'); + + /// Event ends After n occurences controller. + TextEditingController endOccurenceController = TextEditingController(); + + /// Event Start Time. + TimeOfDay eventStartTime = TimeOfDay.now(); + + /// Event End Time. + TimeOfDay eventEndTime = TimeOfDay.now().replacing( + hour: (TimeOfDay.now().hour + (TimeOfDay.now().minute >= 30 ? 1 : 0)) % 24, + minute: (TimeOfDay.now().minute + 30) % 60, + ); + + /// Event Start Date. + DateTime eventStartDate = DateTime.now(); + + /// Event End Date. + DateTime? eventEndDate = DateTime.now(); + + /// Public Event or Not. + bool isPublicSwitch = true; + + /// If event is registerable after creation. + bool isRegisterableSwitch = true; + + /// TitleFocus FocusNode. + FocusNode titleFocus = FocusNode(); + + /// LocationFocus FocusNode. + FocusNode locationFocus = FocusNode(); + + /// DescriptionFocus FocusNode. + FocusNode descriptionFocus = FocusNode(); + + /// Latitude store. + double? latitude; + + /// Longitude store. + double? longitude; + + /// is an allday event. + bool isAllDay = true; + + /// Is a recurring event. + bool isRecurring = false; + + /// recurrence count. + int recurranceCount = 1; + + /// recurrence. + String? recurrance; + + /// RecurranceRuleData frequency. + String recurranceFrequency = Recurrance.weekly; + + /// Monthly recurrence. + String monthlyRecurrence = 'Monthly on day 3'; + + /// weekdays. + Set weekdays = {Recurrance.weekdayTuesday}; + + /// Event end type. + String eventEndType = EventEndTypes.never; + + /// Custom recurrance event end date. + DateTime? eventEndOnEndDate = DateTime.now(); + + //late OrganizationService _organizationService; + late final Map _memberCheckedMap = {}; + late final List _selectedMembers = []; + + /// Organisation Members List. + late List orgMembersList = []; + + /// Global FormKey. + final formKey = GlobalKey(); + final _eventService = locator(); + + /// AutoValidateMode default to disabled. + AutovalidateMode validate = AutovalidateMode.disabled; + + late OrgInfo _currentOrg; + final _userConfig = locator(); + + /// Getter to return selected members. + /// + /// params: + /// None + /// + /// returns: + /// * `List`: Returns a list of selectedMembers for events + List get selectedMembers => _selectedMembers; + + /// Getter to return members map. + /// + /// params: + /// None + /// + /// returns: + /// * `Map`: Returns a map of entries with id and boolean if they are + /// selected for events or not in bottom sheet. + Map get memberCheckedMap => _memberCheckedMap; + + /// Getter to return imageFile. + /// + /// params: + /// None + /// + /// returns: + /// * `File?`: Returns imageFile. + File? get imageFile => _imageFile; + + /// Function To Initialize. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void initialize() { + _currentOrg = _userConfig.currentOrg; + //_organizationService = locator(); + + _imageFile = null; + _multiMediaPickerService = locator(); + } + + /// This function is used to create the event for the organization. + /// + /// The function uses `database_mutation_functions` services to call the graphQL mutation + /// for creating an event and passes the required variables for the event. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future createEvent() async { + titleFocus.unfocus(); + locationFocus.unfocus(); + descriptionFocus.unfocus(); + validate = AutovalidateMode.always; + if (formKey.currentState!.validate()) { + validate = AutovalidateMode.disabled; + + // variables initialisation + final DateTime startTime = DateTime( + eventStartDate.year, + eventStartDate.month, + eventStartDate.day, + eventStartTime.hour, + eventStartTime.minute, + ); + final DateTime endTime = DateTime( + eventEndDate?.year ?? DateTime.now().year, + eventEndDate?.month ?? DateTime.now().month, + eventEndDate?.day ?? DateTime.now().day, + eventEndTime.hour, + eventEndTime.minute, + ); + + final String? frequency = getRecurrance(recurranceFrequency); + + // all required data for creating an event + final Map variables = { + "data": { + 'startDate': DateFormat('yyyy-MM-dd').format(eventStartDate), + if (eventEndDate != null) + 'endDate': DateFormat('yyyy-MM-dd').format(eventEndDate!), + 'organizationId': _currentOrg.id, + 'title': eventTitleTextController.text, + 'description': eventDescriptionTextController.text, + 'location': eventLocationTextController.text, + 'isPublic': isPublicSwitch, + 'isRegisterable': isRegisterableSwitch, + 'recurring': isRecurring, + 'recurrance': recurrance ?? frequency, + 'allDay': isAllDay, + 'startTime': '${DateFormat('HH:mm:ss').format(startTime)}Z', + if (eventEndDate != null) + 'endTime': '${DateFormat('HH:mm:ss').format(endTime)}Z', + if (latitude != null) 'latitude': latitude, + if (longitude != null) 'longitude': longitude, + }, + if (recurrance == null) + 'recurrenceRuleData': { + if (eventEndType != EventEndTypes.never) 'count': recurranceCount, + 'frequency': frequency, + if (frequency == 'WEEKLY') 'weekDays': List.from(weekdays), + }, + }; + + navigationService.pushDialog( + const CustomProgressDialog(key: Key('EventCreationProgress')), + ); + // invoke the `gqlAuthMutation` function of `databaseFunctions` + // service along with the mutation query and variable map. + final result = await databaseFunctions.gqlAuthMutation( + EventQueries().addEvent(), + variables: variables, + ); + print(result); + navigationService.pop(); + if (result != null) { + navigationService.pop(); + + await _eventService.getEvents(); + } + } + } + + /// This function is used to get the image from gallery. + /// + /// The function uses the `_multiMediaPickerService` services. + /// + /// **params**: + /// * `camera`: if true then open camera for image, else open gallery to select image. + /// + /// **returns**: + /// None + Future getImageFromGallery({bool camera = false}) async { + final image = + await _multiMediaPickerService.getPhotoFromGallery(camera: camera); + if (image != null) { + _imageFile = image; + notifyListeners(); + } + } + + /// This function remove the selected image. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void removeImage() { + _imageFile = null; + notifyListeners(); + } + + /// This function fetch all the users in the current organization and return `List`. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Future>`: Current Organization Users List + Future> getCurrentOrgUsersList() async { + if (orgMembersList.isEmpty) { + orgMembersList = await organizationService + .getOrgMembersList(userConfig.currentOrg.id!); + } + + // loop through list + orgMembersList.forEach((orgMember) { + _memberCheckedMap.putIfAbsent(orgMember.id!, () => false); + _memberCheckedMap.putIfAbsent(orgMember.id!, () => false); + }); + // return list + return orgMembersList; + } + + /// This function build the user list. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void buildUserList() { + _selectedMembers.clear(); + + // loop through the organization member list + + orgMembersList.forEach((orgMember) { + if (_memberCheckedMap[orgMember.id] == true) { + _selectedMembers.add(orgMember); + } + }); + notifyListeners(); + } + + /// This function is used to remove a user from user's list. + /// + /// **params**: + /// * `userId`: id of the user that need to be removed. + /// + /// **returns**: + /// None + void removeUserFromList({required String userId}) { + _selectedMembers.removeWhere((user) => user.id == userId); + _memberCheckedMap[userId] = false; + + notifyListeners(); + } + + /// Updates the event end date to selected event end date. + /// + /// **params**: + /// * `selectedEndDate`: new event end date selected by user. + /// + /// **returns**: + /// None + void setEventEndDate(DateTime? selectedEndDate) { + eventEndDate = selectedEndDate; + notifyListeners(); + } + + /// Returns corresponding recurrence value based on frequency. + /// + /// **params**: + /// * `frequency`: Recurrence frequency selected by user. + /// + /// **returns**: + /// * `String?`: Recurrence value. + String? getRecurrance(String frequency) { + isRecurring = true; + if (frequency == Recurrance.daily || frequency == 'Every day') { + return 'DAILY'; + } else if (frequency == Recurrance.weekly || frequency == 'Every week') { + return 'WEEKLY'; + } else if (frequency == Recurrance.monthly || frequency == 'Every month') { + return 'MONTHLY'; + } else if (frequency == Recurrance.yearly || frequency == 'Every year') { + return 'YEARLY'; + } else if (frequency == Recurrance.once) { + isRecurring = false; + return null; + } else { + return null; + } + } +} diff --git a/lib/view_model/after_auth_view_models/event_view_models/edit_event_view_model.dart b/lib/view_model/after_auth_view_models/event_view_models/edit_event_view_model.dart new file mode 100644 index 000000000..f7800f059 --- /dev/null +++ b/lib/view_model/after_auth_view_models/event_view_models/edit_event_view_model.dart @@ -0,0 +1,98 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:intl/intl.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'; + +/// EditEventViewModel class have methods to interact with model in +/// the context of editing the event in the organization. +/// +/// Methods include: +/// * `updateEvent` : to update an event. +class EditEventViewModel extends BaseModel { + late Event _event; + 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(); + AutovalidateMode validate = AutovalidateMode.disabled; + + // initialiser, invoke `_fillEditForm` function. + void initialize(Event event) { + _event = event; + _fillEditForm(); + } + + /// This function initialises the controller with the data. + void _fillEditForm() { + eventTitleTextController.text = _event.title!; + eventLocationTextController.text = _event.location!; + eventDescriptionTextController.text = _event.description!; + isPublicSwitch = _event.isPublic!; + isRegisterableSwitch = _event.isRegisterable!; + eventStartDate = DateFormat().add_yMd().parse(_event.startDate!); + eventEndDate = DateFormat().add_yMd().parse(_event.endDate!); + eventStartTime = + TimeOfDay.fromDateTime(DateFormat("h:mm a").parse(_event.startTime!)); + eventEndTime = + TimeOfDay.fromDateTime(DateFormat("h:mm a").parse(_event.endTime!)); + } + + /// This function is used to update an event. + /// The function uses `editEvent` function provided by `eventService` service. + Future updateEvent() async { + titleFocus.unfocus(); + locationFocus.unfocus(); + descriptionFocus.unfocus(); + validate = AutovalidateMode.always; + if (formKey.currentState!.validate()) { + validate = AutovalidateMode.disabled; + final DateTime startTime = DateTime( + eventStartDate.year, + eventStartDate.month, + eventStartDate.day, + eventStartTime.hour, + eventStartTime.minute, + ); + final DateTime endTime = DateTime( + eventEndDate.year, + eventEndDate.month, + eventEndDate.day, + eventEndTime.hour, + eventEndTime.minute, + ); + // map for the required data to update an event. + final Map variables = { + 'title': eventTitleTextController.text, + 'description': eventDescriptionTextController.text, + 'location': eventLocationTextController.text, + 'isPublic': isPublicSwitch, + 'isRegisterable': isRegisterableSwitch, + 'recurring': false, + 'allDay': false, + 'startDate': DateFormat('yyyy-MM-dd').format(eventStartDate), + 'endDate': DateFormat('yyyy-MM-dd').format(eventEndDate), + 'startTime': '${DateFormat('HH:mm:ss').format(startTime)}Z', + 'endTime': '${DateFormat('HH:mm:ss').format(endTime)}Z', + }; + _eventService.editEvent(eventId: _event.id!, variables: variables); + } + } +} diff --git a/lib/view_model/after_auth_view_models/event_view_models/event_calendar_view_model.dart b/lib/view_model/after_auth_view_models/event_view_models/event_calendar_view_model.dart new file mode 100644 index 000000000..03b86bfe0 --- /dev/null +++ b/lib/view_model/after_auth_view_models/event_view_models/event_calendar_view_model.dart @@ -0,0 +1,104 @@ +import 'package:flutter/scheduler.dart'; +import 'package:syncfusion_flutter_calendar/calendar.dart'; +import 'package:syncfusion_flutter_datepicker/datepicker.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +/// ViewModel for managing events and calendar view. +/// +/// This ViewModel handles operations related to events and calendar views. +class EventCalendarViewModel extends BaseModel { + /// List of events managed by the ViewModel. + late List _eventList = []; + + /// Controller for managing the calendar. + final CalendarController _calendarController = CalendarController(); + + /// Controller for managing the date range picker. + final DateRangePickerController _dateRangePickerController = + DateRangePickerController(); + + /// The current view of the calendar. + late CalendarView _calendarView; + + /// Getter for accessing the calendar controller. + CalendarController get calendarController => _calendarController; + + /// Getter for accessing the date range picker controller. + DateRangePickerController get dateRangePickerController => + _dateRangePickerController; + + /// Getter for accessing the current view of the calendar. + CalendarView get calendarView => _calendarView; + + /// Getter for accessing the current list of events. + List get eventList => _eventList; + + /// Initializes the view model. + /// + /// **params**: + /// * `eventList`: list of events. + /// + /// **returns**: + /// None + void initialize(List eventList) { + _eventList = eventList; + _calendarView = CalendarView.schedule; + } + + /// The function to triggered when the view is changed. + /// + /// **params**: + /// * `viewChangedDetails`: The dates that visible on the view changes in SfCalendar. type is ViewChangedDetails + /// + /// **returns**: + /// None + void viewChanged(ViewChangedDetails viewChangedDetails) { + print("came"); + SchedulerBinding.instance.addPostFrameCallback((timeStamp) { + _dateRangePickerController.selectedDate = + viewChangedDetails.visibleDates[0]; + _dateRangePickerController.displayDate = + viewChangedDetails.visibleDates[0]; + }); + } + + /// Changes the view of the calendar. + /// + /// **params**: + /// * `view`: String representing the desired view ("Day", "Month", "Schedule"). + /// + /// **returns**: + /// None + void changeView(String view) { + switch (view) { + case "Day": + _calendarView = CalendarView.day; + break; + case "Month": + _calendarView = CalendarView.month; + break; + case "Schedule": + _calendarView = CalendarView.schedule; + break; + default: + break; + } + calendarController.view = _calendarView; + notifyListeners(); + } + + /// function to be triggered when selection is changed. + /// + /// + /// **params**: + /// * `args`: Object of type DateRangePickerSelectionChangedArgs, The selected dates or ranges changes in the SfDateRangePicker. + /// + /// **returns**: + /// None + void selectionChanged(DateRangePickerSelectionChangedArgs args) { + SchedulerBinding.instance.addPostFrameCallback((timeStamp) { + _calendarController.displayDate = args.value as DateTime?; + }); + } +} diff --git a/lib/view_model/after_auth_view_models/event_view_models/event_info_view_model.dart b/lib/view_model/after_auth_view_models/event_view_models/event_info_view_model.dart new file mode 100644 index 000000000..8835a662e --- /dev/null +++ b/lib/view_model/after_auth_view_models/event_view_models/event_info_view_model.dart @@ -0,0 +1,97 @@ +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/event_service.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/base_view_model.dart'; +import 'package:talawa/widgets/custom_progress_dialog.dart'; + +/// EventInfoViewModel class helps interacting with model to serve view with the event information data. +class EventInfoViewModel extends BaseModel { + /// ExploreEventsViewModel instance to fetch the event data. + late ExploreEventsViewModel exploreEventsInstance; + + /// Event instance to store the event data. + late Event event; + + /// String type variable to store the FAB title. + late String fabTitle; + + /// List of Attendee type to store the attendees data. + late List attendees = []; + + /// This function initializes the EventInfoViewModel class with the required arguments. + /// + /// **params**: + /// * `args`: A map of arguments required to initialize the EventInfoViewModel class. + /// + /// **returns**: + /// None + Future initialize({required Map args}) async { + event = args["event"] as Event; + exploreEventsInstance = + args["exploreEventViewModel"] as ExploreEventsViewModel; + fabTitle = getFabTitle(); + setState(ViewState.busy); + + attendees = event.attendees ?? []; + setState(ViewState.idle); + } + + /// The function allows user to register for an event. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future registerForEvent() async { + // if event registration is open and user not already registered for the event. + if (event.isRegisterable == true && event.isRegistered == false) { + navigationService.pushDialog( + const CustomProgressDialog( + key: Key('RegisterEvent'), + ), + ); + + // use `registerForAnEvent` function provided by `EventService` service. + final registerResult = + await locator().registerForAnEvent(event.id!); + if (registerResult != null) { + event.isRegistered = true; + final userConfig = locator(); + attendees.add( + Attendee( + id: userConfig.currentUser.id, + firstName: userConfig.currentUser.firstName, + lastName: userConfig.currentUser.lastName, + image: userConfig.currentUser.image, + ), + ); + } + fabTitle = getFabTitle(); + navigationService.pop(); + notifyListeners(); + await locator().getEvents(); + } + } + + /// The funtion returns title to be displayed on Floating Action Button. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `String`: Returns the title to be displayed on Floating Action Button. + String getFabTitle() { + if (event.isRegisterable == false) { + return "Not Registrable"; + } else if (event.isRegistered == true) { + return "Registered"; + } else { + return "Register"; + } + } +} 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..4740452f6 --- /dev/null +++ b/lib/view_model/after_auth_view_models/event_view_models/explore_events_view_model.dart @@ -0,0 +1,296 @@ +import 'dart:async'; + +import 'package:intl/intl.dart'; +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'; +import 'package:talawa/widgets/custom_alert_dialog.dart'; + +/// ExploreEventsViewModel class helps to interact with model to serve data to view for event explore section. +/// +/// Methods include: +/// * `fetchNewEvents` : to fetch new events in the organization. +/// * `refreshEvents` : to refersh the event. +/// * `checkIfExistsAndAddNewEvent` : to check if the event exists or not, if now add a new event. +/// * `deleteEvent` : to delete the event. +/// * `choseValueFromDropdown` : to return the relevant message in the dropdown after any action. +class ExploreEventsViewModel extends BaseModel { + ExploreEventsViewModel({this.demoMode = false}); + + /// flag to check if the app is in demo mode. + bool demoMode; + + final _eventService = locator(); + late StreamSubscription _eventStreamSubscription; + + String _chosenValue = 'All Events'; + String _emptyListMessage = "Looks like there aren't any events."; + List _events = []; + final List _userEvents = []; + final Set _uniqueEventIds = {}; + late StreamSubscription _currentOrganizationStreamSubscription; + late final List _bufferEvents; + + /// Getter method to retrieve the list of events. + List get events => _events; + + /// Getter method to retrieve the list of User events. + List get userEvents => _userEvents; + + /// Getter method to retrieve the EventService instance. + EventService get eventService => _eventService; + + /// Getter method to retrieve the empty list message. + String get emptyListMessage => _emptyListMessage; + + /// Getter method to retrieve the chosen value. + String get chosenValue => _chosenValue; + + /// This function is used to fetch new events in the organization. + /// + /// The function uses `getEvents` method from `EventService`. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future fetchNewEvents() async { + setState(ViewState.busy); + notifyListeners(); + await _eventService.getEvents(); + setState(ViewState.idle); + } + + /// This function is used to refresh the events in the organization. + /// + /// The function uses `getEvents` method from `EventService`. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future refreshEvents() async { + setState(ViewState.busy); + _events.clear(); + _userEvents.clear(); + _uniqueEventIds.clear(); + await _eventService.getEvents(); + setState(ViewState.idle); + } + + /// initialiser. + /// + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future initialise() async { + setState(ViewState.busy); + if (!demoMode) { + _currentOrganizationStreamSubscription = userConfig.currentOrgInfoStream + .listen((updatedOrganization) => refreshEvents()); + await _eventService.getEvents(); + + _eventStreamSubscription = _eventService.eventStream.listen( + (newEvent) => checkIfExistsAndAddNewEvent(newEvent), + ); + _bufferEvents = _events; + } + setState(ViewState.idle); + } + + /// This function add a new event if the event not exist. + /// + /// **params**: + /// * `newEvent`: `Event` type variable containing data to create a new event. + /// + /// **returns**: + /// None + Future checkIfExistsAndAddNewEvent(Event newEvent) async { + // Check if the event is unique and belongs to the current organization + if (!_uniqueEventIds.contains(newEvent.id) && + newEvent.organization!.id == userConfig.currentOrg.id) { + _uniqueEventIds.add(newEvent.id!); + _parseEventDateTime(newEvent); + } + if (!_userEvents.any((event) => event.id == newEvent.id) && + newEvent.creator!.id == userConfig.currentUser.id) { + _userEvents.insert(0, newEvent); + } + notifyListeners(); + } + + /// The helper function that used to parse the date and time. + /// + /// **params**: + /// * `newEvent`: `Event` type variable containing data to create a new event. + /// + /// **returns**: + /// None + void _parseEventDateTime(Event newEvent) { + // Maybe needed for the tests. Can be further discussed. + if (newEvent.startDate == null || + newEvent.endDate == null || + newEvent.startTime == null || + newEvent.endTime == null) { + newEvent.startDate = DateFormat('yyyy-MM-dd').format(DateTime.now()); + newEvent.endDate = DateFormat('yyyy-MM-dd').format(DateTime.now()); + newEvent.startTime = DateFormat('HH:mm:ss').format(DateTime.now()); + newEvent.endTime = DateFormat('HH:mm:ss').format(DateTime.now()); + } + + if (RegExp(r'^\d{4}-\d{2}-\d{2}$').hasMatch(newEvent.startDate!) && + RegExp(r'^\d{2}:\d{2}:\d{2}.\d{3}Z$').hasMatch(newEvent.startTime!) && + RegExp(r'^\d{4}-\d{2}-\d{2}$').hasMatch(newEvent.endDate!) && + RegExp(r'^\d{2}:\d{2}:\d{2}.\d{3}Z$').hasMatch(newEvent.endTime!)) { + final startMoment = + DateTime.parse('${newEvent.startDate} ${newEvent.startTime}') + .toLocal(); + final endMoment = + DateTime.parse('${newEvent.endDate} ${newEvent.endTime}').toLocal(); + + newEvent.startDate = DateFormat('yMd').format(startMoment); + newEvent.endDate = DateFormat('yMd').format(endMoment); + newEvent.startTime = DateFormat('h:mm a').format(startMoment); + newEvent.endTime = DateFormat('h:mm a').format(endMoment); + } + _events.insert(0, newEvent); + } + + /// This function deletes the event. + /// + /// **params**: + /// * `eventId`: id of the event that need to be delete. + /// + /// **returns**: + /// None + Future deleteEvent({required String eventId}) async { + // push the custom alert dialog to ask for confirmation. + navigationService.pushDialog( + CustomAlertDialog( + reverse: true, + dialogSubTitle: 'Are you sure you want to delete this event?', + successText: 'Delete', + success: () { + navigationService.pop(); + _eventService.deleteEvent(eventId).then( + (result) async { + if (result != null) { + navigationService.pop(); + setState(ViewState.busy); + print(result); + _uniqueEventIds.remove(eventId); + _events.removeWhere((element) => element.id == eventId); + _userEvents.removeWhere((element) => element.id == eventId); + await Future.delayed(const Duration(milliseconds: 500)); + setState(ViewState.idle); + } + }, + ); + }, + ), + ); + } + + /// This function takes the choosen value from dropdown and return the filter events, if empty list then return relevant message. + /// + /// **params**: + /// * `value`: choosen value from dropdown. + /// + /// + /// **returns**: + /// None + Future choseValueFromDropdown(String value) async { + _chosenValue = value; + notifyListeners(); + setState(ViewState.busy); + + if (!demoMode) { + switch (_chosenValue) { + // if `_chosenValue` is "All events". + case 'All Events': + { + // all events + _events = _bufferEvents; + // if list is empty + _emptyListMessage = "Looks like there aren't any events."; + } + break; + // if `_chosenValue` is "created event". + case 'My Events': + { + // loop through the `_events` list and check + // for the creator id matched the current user id. + _events = List.from( + _bufferEvents.where( + (element) => element.creator!.id == userConfig.currentUser.id, + ), + ); + // if list is empty + _emptyListMessage = "You have not created any event."; + } + break; + // if `_chosenValue` is "Registered Events". + case 'Registered Events': + { + // loop through the `_events` list and filter elements + // if `element.isRegistered` is true and user is not the creator. + _events = List.from( + _bufferEvents.where( + (element) => + element.isRegistered == true && + element.creator!.id != userConfig.currentUser.id, + ), + ); + // if list is empty + _emptyListMessage = "No registered events are present"; + } + break; + // if `_chosenValue` is "Registered Events". + case 'Public Events': + { + // loop through the `_events` list and filter elements + // with the `isPublic` as true. + _events = _bufferEvents + .where((element) => element.isPublic == true) + .toList(); + + // if list is empty + _emptyListMessage = "There aren't any public events."; + } + break; + case 'Private Events': + { + // loop through the `_events` list and filter elements + // with the `isPublic` as false. + _events = _bufferEvents + .where((element) => element.isPublic == false) + .toList(); + // if list is empty + _emptyListMessage = "There aren't any private events."; + } + break; + + default: + { + _events = _bufferEvents; + } + } + } + await Future.delayed(const Duration(milliseconds: 500)); + setState(ViewState.idle); + } + + @override + void dispose() { + _eventStreamSubscription.cancel(); + _currentOrganizationStreamSubscription.cancel(); + super.dispose(); + } +} 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..496f8724c --- /dev/null +++ b/lib/view_model/after_auth_view_models/feed_view_models/organization_feed_view_model.dart @@ -0,0 +1,304 @@ +import 'dart:async'; + +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/demo_server_data/pinned_post_demo_data.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/services/database_mutation_functions.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/utils/post_queries.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +/// OrganizationFeedViewModel class helps to interact with model to serve data to view for organization feed section. +/// +/// Methods include: +/// * `setCurrentOrganizationName` : to set current organization name. +/// * `fetchNewPosts` : to fetch new posts in the organization. +/// * `navigateToIndividualPage` : to navigate to individual page. +/// * `navigateToPinnedPostPage` : to navigate to pinned post page. +/// * `addNewPost` : to add new post in the organization. +/// * `updatedPost` : to update a post in the organization. +class OrganizationFeedViewModel extends BaseModel { + // Local caching variables for a session. + // ignore: prefer_final_fields + List _posts = []; + final List _userPosts = []; + + /// flag for the test. + /// + bool istest = false; + List _pinnedPosts = + pinnedPostsDemoData.map((e) => Post.fromJson(e)).toList(); + final Set _renderedPostID = {}; + late String _currentOrgName = ""; + + // Importing services. + final NavigationService _navigationService = locator(); + final UserConfig _userConfig = locator(); + final PostService _postService = locator(); + late DataBaseMutationFunctions _dbFunctions; + + // Stream variables + late StreamSubscription _currentOrganizationStreamSubscription; + late StreamSubscription _postsSubscription; + late StreamSubscription _updatePostSubscription; + + // Getters + /// getter for the posts. + /// + List get posts { + // if (istest) { + // _posts = pinnedPostsDemoData.map((e) => Post.fromJson(e)).toList(); + // return _posts; + // } + return _posts; + } + + /// Getter for User Posts. + List get userPosts { + return _userPosts; + } + + /// getter for the pinned post. + /// + List get pinnedPosts { + if (istest) { + _pinnedPosts = []; + return _pinnedPosts; + } + return _pinnedPosts; + } + + /// getter for the currentOrgName. + /// + String get currentOrgName => _currentOrgName; + + bool _isFetchingPosts = false; + + /// getter for isFetchingPosts to show loading indicator. + bool get isFetchingPosts => _isFetchingPosts; + + /// This function sets the organization name after update. + /// + /// more_info_if_required + /// + /// **params**: + /// * `updatedOrganization`: updated organization name. + /// + /// **returns**: + /// None + void setCurrentOrganizationName(String updatedOrganization) { + // if `updatedOrganization` is not same to `_currentOrgName`. + if (updatedOrganization != _currentOrgName) { + _isFetchingPosts = true; + notifyListeners(); + _userPosts.clear(); + _posts.clear(); + _renderedPostID.clear(); + _currentOrgName = updatedOrganization; + notifyListeners(); + } + // _postService.getPosts(); + } + + /// This function fetches new posts in the organization. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void fetchNewPosts() { + _postService.refreshFeed(); + } + + /// To initialize the view model. + /// + /// more_info_if_required + /// + /// **params**: + /// * `isTest`: for test + /// + /// **returns**: + /// None + void initialise({ + bool isTest = false, + }) { + _isFetchingPosts = true; + + // For caching/initializing the current organization after the stream subscription has canceled and the stream is updated + _currentOrgName = _userConfig.currentOrg.name!; + // ------ + // Attaching the stream subscription to rebuild the widgets automatically + _currentOrganizationStreamSubscription = + _userConfig.currentOrgInfoStream.listen( + (updatedOrganization) => + setCurrentOrganizationName(updatedOrganization.name!), + ); + + _postsSubscription = _postService.postStream.listen((newPosts) { + return buildNewPosts(newPosts); + }); + + _updatePostSubscription = + _postService.updatedPostStream.listen((post) => updatedPost(post)); + + _dbFunctions = locator(); + if (isTest) { + istest = true; + } + _isFetchingPosts = false; + } + + // /// initializing the demo data. + // /// + // /// + // /// **params**: + // /// None + // /// + // /// **returns**: + // /// None + // 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)); + // // }); + // } + + /// This function initialise `_posts` with `newPosts`. + /// + /// more_info_if_required + /// + /// **params**: + /// * `newPosts`: new post + /// + /// **returns**: + /// None + void buildNewPosts(List newPosts) { + _posts = newPosts; + final currentUserId = _userConfig.currentUser.id!; + _userPosts.clear(); + for (final post in newPosts) { + if (!_userPosts.any((element) => element.sId == post.sId) && + post.creator!.id == currentUserId) { + _userPosts.insert(0, post); + } + } + _isFetchingPosts = false; + notifyListeners(); + } + + /// This function navigate to individual post page.. + /// + /// **params**: + /// * `post`: define_the_param + /// + /// **returns**: + /// None + void navigateToIndividualPage(Post post) { + // uses `pushScreen` method by `navigationService` service. + _navigationService.pushScreen(Routes.individualPost, arguments: post); + } + + /// This function navigate to pinned post page. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void navigateToPinnedPostPage() { + // uses `pushScreen` method by `navigationService` service. + _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(); + } + + /// This function adds new Post. + /// + /// **params**: + /// * `newPost`: define_the_param + /// + /// **returns**: + /// None + void addNewPost(Post newPost) { + _posts.insert(0, newPost); + notifyListeners(); + } + + /// This function updates the post. + /// + /// **params**: + /// * `post`: post object + /// + /// **returns**: + /// None + void updatedPost(Post post) { + for (int i = 0; i < _posts.length; i++) { + if (_posts[i].sId == post.sId) { + _posts[i] = post; + notifyListeners(); + break; + } + } + } + + /// function to remove the post. + /// + /// **params**: + /// * `post`: post object + /// + /// **returns**: + /// None + Future removePost(Post post) async { + await _dbFunctions.gqlAuthMutation( + PostQueries().removePost(), + variables: { + "id": post.sId, + }, + ); + _posts.remove(post); + notifyListeners(); + } + + /// Method to fetch next posts. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void nextPage() { + _postService.nextPage(); + } + + /// Method to fetch previous posts. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void previousPage() { + _postService.previousPage(); + } +} 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..f6e93eec6 --- /dev/null +++ b/lib/view_model/after_auth_view_models/profile_view_models/edit_profile_view_model.dart @@ -0,0 +1,174 @@ +import 'dart:convert'; +import 'dart:io'; +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/user/user_info.dart'; +import 'package:talawa/services/third_party_service/multi_media_pick_service.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +/// EditProfilePageViewModel class helps to interact with model to serve data to edit profile views. +/// +/// Methods include: +/// * `getImageFromGallery` +class EditProfilePageViewModel extends BaseModel { + /// current user. + final user = userConfig.currentUser; + late MultiMediaPickerService _multiMediaPickerService; + + /// profile image. + late File? imageFile; + + /// profile image in base64. + String? base64Image; + + /// first name controller. + late TextEditingController firstNameTextController; + + /// last name controller. + late TextEditingController lastNameTextController; + + /// Focus node tpo control focus. + FocusNode firstNameFocus = FocusNode(); + + /// Focus node tpo control focus. + FocusNode lastNameFocus = FocusNode(); + + /// Graphql client. + final databaseService = databaseFunctions; + + /// initialization function. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void initialize() { + imageFile = null; + _multiMediaPickerService = locator(); + firstNameTextController = TextEditingController(text: user.firstName); + lastNameTextController = TextEditingController(text: user.lastName); + } + + /// This function is used to get the image from gallery. + /// + /// The function uses the `_multiMediaPickerService` services. + /// + /// **params**: + /// * `camera`: if true then open camera for image, else open gallery to select image. + /// + /// **returns**: + /// None + Future selectImage({bool camera = false}) async { + final image = + await _multiMediaPickerService.getPhotoFromGallery(camera: camera); + if (image != null) { + imageFile = image; + notifyListeners(); + } + } + + /// This function is used to convert the image into Base64 format. + /// + /// **params**: + /// * `file`: Takes the image in format of file. + /// + /// **returns**: + /// * `Future`: image in string format + Future convertToBase64(File file) async { + try { + final List bytes = await file.readAsBytes(); + base64Image = base64Encode(bytes); + return base64Image!; + } catch (error) { + return ''; + } + } + + /// Method to update user profile. + /// + /// **params**: + /// * `firstName`: updated first name. + /// * `lastName`: updated last name. + /// * `newImage`: New profile picture that is to be updated. + /// + /// **returns**: + /// None + Future updateUserProfile({ + String? firstName, + String? lastName, + File? newImage, + }) async { + if (firstName == user.firstName && + newImage == null && + lastName == user.lastName) { + return; + } + try { + final Map variables = {}; + if (firstName != null) { + variables["firstName"] = firstName; + } + if (lastName != null) { + variables["lastName"] = lastName; + } + if (newImage != null) { + final String imageAsString = await convertToBase64(newImage); + variables["file"] = 'data:image/png;base64,$imageAsString'; + } + if (variables.isNotEmpty) { + await databaseService.gqlAuthMutation( + queries.updateUserProfile(), + variables: variables, + ); + // Fetch updated user info from the database and save it in hivebox. + final QueryResult result = await databaseFunctions.gqlAuthQuery( + queries.fetchUserInfo, + variables: {'id': user.id}, + ) as QueryResult; + + final List users = result.data!['users'] as List; + + final User userInfo = User.fromJson( + users[0] as Map, + fromOrg: false, + ); + userInfo.authToken = userConfig.currentUser.authToken; + userInfo.refreshToken = userConfig.currentUser.refreshToken; + + await userConfig.updateUser(userInfo); + notifyListeners(); + + user.firstName = firstName ?? user.firstName; + user.lastName = lastName ?? user.lastName; + firstNameTextController.text = user.firstName!; + lastNameTextController.text = user.lastName!; + + navigationService.showTalawaErrorSnackBar( + "Profile updated successfully", + MessageType.info, + ); + notifyListeners(); + } + } on Exception catch (_) { + navigationService.showTalawaErrorSnackBar( + "Something went wrong", + MessageType.error, + ); + } + } + + /// This function remove the selected image. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void removeImage() { + imageFile = null; + notifyListeners(); + } +} 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..b8444880b --- /dev/null +++ b/lib/view_model/after_auth_view_models/profile_view_models/profile_page_view_model.dart @@ -0,0 +1,295 @@ +import 'package:currency_picker/currency_picker.dart'; +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:qr_flutter/qr_flutter.dart'; +import 'package:talawa/constants/constants.dart'; +import 'package:talawa/custom_painters/talawa_logo.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/graphql_config.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/base_view_model.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; + +/// ProfilePageViewModel class helps to interact with model to serve data and react to user's input in Profile Page view. +/// +/// Methods include: +/// * `logout` +class ProfilePageViewModel extends BaseModel { + // Services + final _userConfig = locator(); + final _navigationService = locator(); + final _appLanguageService = locator(); + + /// GlobalKey for scaffoldKey. + final GlobalKey scaffoldKey = GlobalKey(); + + /// FocusNode for donationField. + final FocusNode donationField = FocusNode(); + + /// Text Controller for donation Amount. + TextEditingController donationAmount = TextEditingController(); + + /// Hive Box of user. + late final Box user; + + /// Hive Box of url. + late final Box url; + + /// Hive Box of organisation. + late final Box organisation; + + /// Holds Current Organization. + late OrgInfo currentOrg; + + /// Holds Current user. + late User currentUser; + + /// Size of Bottom Sheet Height. + double bottomSheetHeight = SizeConfig.screenHeight! * 0.68; + + /// donationCurrency. + String donationCurrency = "USD"; + + /// Currency Symbol. + String donationCurrencySymbol = "\$"; + + /// denomination. + final List denomination = ['1', '5', '10']; + + /// First function to initialize the viewmodel. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void initialize() { + setState(ViewState.busy); + currentOrg = _userConfig.currentOrg; + currentUser = _userConfig.currentUser; + setState(ViewState.idle); + } + + /// This method changes the currency of the user for donation purpose. + /// + /// **params**: + /// * `context`: BuildContext of the widget + /// * `setter`: Setter Function + /// + /// **returns**: + /// None + void changeCurrency( + BuildContext context, + void Function(void Function()) setter, + ) { + showCurrencyPicker( + context: context, + currencyFilter: supportedCurrencies, + onSelect: (Currency currency) { + setter(() { + donationCurrency = currency.code; + donationCurrencySymbol = currency.symbol; + }); + }, + ); + } + + /// This Function creates a QR Code for latest release . + /// + /// **params**: + /// * `context`: Build Context + /// + /// **returns**: + /// None + void invite(BuildContext context) { + _appLanguageService.initialize(); + final String qrData = + '${GraphqlConfig.orgURI}?orgid=${userConfig.currentOrg.id!}'; + + showDialog( + context: context, + builder: (BuildContext context) { + return Dialog( + backgroundColor: Colors.white, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20.0), + ), + child: Container( + padding: const EdgeInsets.all(20), + constraints: BoxConstraints( + maxHeight: MediaQuery.of(context).size.height * 0.80, + ), + child: Column( + mainAxisSize: MainAxisSize.min, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + iconButton( + CustomPaint( + size: const Size(48, 48 * 1), + painter: AppLogo(), + ), + () {}, + ), + const SizedBox(height: 20), + Text( + '${userConfig.currentOrg.name}', + style: const TextStyle( + fontSize: 22, + fontWeight: FontWeight.bold, + color: Colors.black87, + ), + ), + const SizedBox(height: 20), + QrImageView( + data: qrData, + version: QrVersions.auto, + size: 200.0, + ), + const SizedBox(height: 20), + Text( + AppLocalizations.of(context)!.strictTranslate('JOIN'), + textAlign: TextAlign.center, + style: const TextStyle( + fontSize: 18, + fontWeight: FontWeight.bold, + color: Colors.black87, + ), + ), + const SizedBox(height: 30), + ], + ), + ), + ); + }, + ); + } + + /// This widget returns the button for social media sharing option. + /// + /// **params**: + /// * `icon`: This is Widget type with icon details. + /// * `onTap`: This is Function which invoke on tap. + /// + /// **returns**: + /// * `Widget`: Icon Button + Widget iconButton(Widget icon, void Function() onTap) { + return Stack( + children: [ + IconButton( + key: const Key('iconbtn1'), + onPressed: () { + print('tapped'); + onTap(); + }, + icon: icon, + ), + ], + ); + } + + /// This widget returns button for domination. + /// + /// **params**: + /// * `amount`: donation Amount. + /// * `context`: BuildContext. + /// * `setter`: `Function` type, which on tap set the amount to `donationAmount`. + /// + /// **returns**: + /// * `Widget`: Icon Button + Widget dominationButton( + String amount, + BuildContext context, + void Function(void Function()) setter, + ) { + return InkWell( + key: Key('domBtn_$amount'), + onTap: () { + setter(() { + donationAmount.text = amount; + }); + }, + child: Container( + padding: EdgeInsets.symmetric( + vertical: SizeConfig.screenHeight! * 0.02, + horizontal: SizeConfig.screenWidth! * 0.075, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: donationAmount.text == amount + ? Theme.of(context).colorScheme.secondary + : Theme.of(context).colorScheme.primary, + ), + child: Text( + '$donationCurrencySymbol $amount', + style: Theme.of(context).textTheme.titleMedium, + ), + ), + ); + } + + /// This widget returns button for domination. + /// + /// **params**: + /// * `setter`: SetState holder. + /// + /// **returns**: + /// None + void attachListener(void Function(void Function()) setter) { + donationField.addListener(() { + if (donationField.hasFocus) { + setter(() { + bottomSheetHeight = SizeConfig.screenHeight! * 0.8725; + }); + } else { + Future.delayed(const Duration(milliseconds: 300), () { + { + setter(() { + bottomSheetHeight = SizeConfig.screenHeight! * 0.68; + }); + } + }); + } + }); + } + + /// pop the route from `navigationService`. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void popBottomSheet() { + _navigationService.pop(); + } + + /// to update the bottom sheet height. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void updateSheetHeight() { + bottomSheetHeight = SizeConfig.screenHeight! * 0.65; + notifyListeners(); + } + + /// show message on Snack Bar. + /// + /// **params**: + /// * `message`: String Message to show on snackbar + /// + /// **returns**: + /// None + void showSnackBar(String message) { + _navigationService.showTalawaErrorDialog(message, MessageType.error); + } +} diff --git a/lib/view_model/after_auth_view_models/settings_view_models/app_setting_view_model.dart b/lib/view_model/after_auth_view_models/settings_view_models/app_setting_view_model.dart new file mode 100644 index 000000000..49da3a680 --- /dev/null +++ b/lib/view_model/after_auth_view_models/settings_view_models/app_setting_view_model.dart @@ -0,0 +1,33 @@ +import 'package:talawa/locator.dart'; +import 'package:talawa/view_model/base_view_model.dart'; +import 'package:url_launcher/url_launcher_string.dart'; + +/// ViewModel for the App Settings functionality. +/// +/// This ViewModel handles the logic and data for the application settings. +class AppSettingViewModel extends BaseModel { + // final _appLanguageService = locator(); + + /// This method destroys the user's session or sign out the user from app, The function asks for the confimation in Custom Alert Dialog. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Future`: Logs the user out and returns the logout status as a [bool]. + Future logout() async { + // push custom alert dialog with the confirmation message. + final bool isloggedOut = await userConfig.userLogOut(); + return isloggedOut; + } + + /// Launches a website using the provided URL. + /// + /// **params**: + /// * `url`: A [String] representing the URL of the website to be launched. + /// + /// **returns**: + /// * `Future`: A [Future] that resolves to a [bool] value indicating + /// whether the website launch was successful. + Future launchWebsite(String url) async => await launchUrlString(url); +} diff --git a/lib/view_model/base_view_model.dart b/lib/view_model/base_view_model.dart new file mode 100644 index 000000000..840d03bac --- /dev/null +++ b/lib/view_model/base_view_model.dart @@ -0,0 +1,17 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +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..061cf63e6 --- /dev/null +++ b/lib/view_model/lang_view_model.dart @@ -0,0 +1,207 @@ +import 'package:flutter/material.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/mainscreen_navigation_args.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +/// AppLanguage view model class interact with modal in the context of the App Language. +/// +/// The class provides methods that set's the language, change the language in the modal. +/// +/// Methods include: +/// * `fetchLocale` +/// * `changeLanguage` +/// * `selectLanguagePress` +/// * `dbLanguageUpdate` +/// * `appLanguageQuery` +/// * `userLanguageQuery` +class AppLanguage extends BaseModel { + AppLanguage({this.isTest = false}); + + /// Represents a boolean value indicating whether the current environment is a test environment. + final bool isTest; + + /// A service that provides navigation-related functionalities. + final navigationService = locator(); + + /// Functions related to database mutations. + final databaseFunctions = locator(); + + late Locale _appLocale; + + /// getter for appLocal. + Locale get appLocal => _appLocale; + + /// initialiser. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future initialize() async { + _appLocale = const Locale('en'); + await fetchLocale(); + } + + /// This function fetch the language of the user's app. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future fetchLocale() async { + final prefs = await SharedPreferences.getInstance(); + final String langCode = prefs.getString('language_code') ?? 'en'; + _appLocale = Locale(langCode); + + notifyListeners(); + } + + /// This function change the app default language. + /// + /// **params**: + /// * `type`: `Locale` type, the language need to be updated with. + /// + /// **returns**: + /// None + Future changeLanguage(Locale type) async { + // if the app language is of same [type]. + 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 (type == const Locale("de")) { + //If selected language is Chinese + _appLocale = const Locale("de"); + await prefs.setString('language_code', 'de'); + await prefs.setString('countryCode', 'GE'); + } else if (type == const Locale("ja")) { + //If selected language is Chinese + _appLocale = const Locale("ja"); + await prefs.setString('language_code', 'ja'); + await prefs.setString('countryCode', 'JP'); + } else if (type == const Locale("pt")) { + //If selected language is Chinese + _appLocale = const Locale("pt"); + await prefs.setString('language_code', 'pt'); + await prefs.setString('countryCode', 'PT'); + } else { + //If selected language is english + _appLocale = const Locale("en"); + await prefs.setString('language_code', 'en'); + await prefs.setString('countryCode', 'US'); + } + } + + /// notifying the consumers + notifyListeners(); + } + + /// Navigates the user after choosing lthe anguage. + /// + /// This function navigate user to `/appSettingsPage` route if the user + /// is authenticated else navigate to `demoMode - /MainScreenPage` route. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future selectLanguagePress() async { + if (userConfig.currentUser.id != 'null') { + dbLanguageUpdate(); + navigationService.popAndPushScreen('/appSettingsPage', arguments: ''); + } else { + navigationService.pushScreen( + Routes.mainScreen, + arguments: MainScreenArgs( + mainScreenIndex: 0, + fromSignUp: false, + toggleDemoMode: true, + ), + ); + } + } + + /// This function updates the Database Language by running the graphQL `mutations`. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future dbLanguageUpdate() async { + try { + await databaseFunctions + .gqlAuthMutation(queries.updateLanguage(_appLocale.languageCode)); + print('Language Updated in Database'); + } catch (e) { + print(e); + } + } + + /// Queries the app language. + /// + /// Performs graphQL query to check the app language. + /// The function uses `gqlAuthQuery` method provided by Database + /// Functions Services. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future appLanguageQuery() async { + try { + await databaseFunctions.gqlAuthQuery(queries.userLanguage()); + } catch (e) { + print(e); + } + } + + /// This function perform graphQL query to check the user's language in the database. + /// + /// The function uses `gqlAuthQuery` method provided by Database Functions Services. + /// + /// **params**: + /// * `userId`: user for which language need to be fetch. + /// + /// **returns**: + /// None + Future userLanguageQuery(String userId) async { + try { + await databaseFunctions.gqlAuthQuery(queries.newUserLanguage(userId)); + } catch (e) { + print(e); + } + } +} 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..2cb601310 --- /dev/null +++ b/lib/view_model/main_screen_view_model.dart @@ -0,0 +1,761 @@ +import 'dart:async'; + +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/app_tour.dart'; +import 'package:talawa/plugins/fetch_plugin_list.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/base_view_model.dart'; +// import 'package:talawa/views/after_auth_screens/chat/chat_list_screen.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/demo_screens/explore_events_demo.dart'; +import 'package:talawa/views/demo_screens/organization_feed_demo.dart'; +import 'package:talawa/views/demo_screens/profile_page_demo.dart'; +import 'package:talawa/widgets/custom_alert_dialog.dart'; +import 'package:talawa/widgets/theme_switch.dart'; +import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; + +/// MainScreenViewModel class provide methods to interact with the modal to serve data in user's action in Main Screen Views. +/// +/// The functions in this class are +/// mainly in the context of Tutorials for different componenets of the App. +/// +/// Functions include: +/// * `showTutorial` +/// * `showHome` +/// * `tourEventTargets` +/// * `tourAddPost` +/// * `tourChat` +/// * `tourProfile` +class MainScreenViewModel extends BaseModel { + /// static variables. + static final GlobalKey scaffoldKey = + GlobalKey(); + + /// static variables. + final GlobalKey keyBNHome = GlobalKey(debugLabel: "HomeTab"); + + /// static variables. + final GlobalKey keyBNDemoHome = GlobalKey(debugLabel: "DemoHomeTab"); + + /// static variables. + final GlobalKey keySHPinnedPost = + GlobalKey(debugLabel: "HomeScreenPinnedPost"); + + /// static variables. + final GlobalKey keySHPost = GlobalKey(debugLabel: "HomeScreenPost"); + + /// static variables. + final GlobalKey keySHOrgName = GlobalKey(debugLabel: "HomeScreenOrgName"); + + /// static variables. + final GlobalKey keySHMenuIcon = GlobalKey(debugLabel: "HomeScreenMenuIcon"); + + /// static variables. + static final GlobalKey keyDrawerCurOrg = + GlobalKey(debugLabel: "DrawerCurrentOrg"); + + /// static variables. + static final GlobalKey keyDrawerSwitchableOrg = + GlobalKey(debugLabel: "DrawerSwitchableOrg"); + + /// static variables. + static final GlobalKey keyDrawerJoinOrg = + GlobalKey(debugLabel: "DrawerJoinOrg"); + + /// static variables. + static final GlobalKey keyDrawerLeaveCurrentOrg = + GlobalKey(debugLabel: "DrawerLeaveCurrentOr"); + + /// static variables. + final GlobalKey keyBNEvents = GlobalKey(debugLabel: "EventTab"); + + /// static variables. + final GlobalKey keyBNDemoEvents = GlobalKey(debugLabel: "DemoEventTab"); + + /// static variables. + final GlobalKey keySECategoryMenu = + GlobalKey(debugLabel: "EventScreenCategory"); + + /// static variables. + final GlobalKey keySEDateFilter = + GlobalKey(debugLabel: "EventScreenDateFilter"); + + /// static variables. + final GlobalKey keySEAdd = GlobalKey(debugLabel: "EventScreenAdd"); + + /// static variables. + final GlobalKey keySECard = GlobalKey(debugLabel: "EventScreenCard"); + + /// static variables. + final GlobalKey keyBNPost = GlobalKey(debugLabel: "PostTab"); + + /// static variables. + final GlobalKey keyBNDemoPost = GlobalKey(debugLabel: "DemoPostTab"); + + /// static variables. + final GlobalKey keyBNChat = GlobalKey(debugLabel: "ChatTab"); + + /// static variables. + final GlobalKey keyBNProfile = GlobalKey(debugLabel: "ProfileTab"); + + /// static variables. + final GlobalKey keyBNDemoProfile = GlobalKey(debugLabel: "DemoProfileTab"); + + /// static variables. + final GlobalKey keySPEditProfile = GlobalKey(debugLabel: "ProfileScreenEdit"); + + /// static variables. + final GlobalKey keySPAppSetting = + GlobalKey(debugLabel: "ProfileScreenAppSetting"); + + /// static variables. + final GlobalKey keySPHelp = GlobalKey(debugLabel: "ProfileScreenHelp"); + + /// static variables. + final GlobalKey keySPDonateUs = + GlobalKey(debugLabel: "ProfileScreenDonateUs"); + + /// static variables. + final GlobalKey keySPInvite = GlobalKey(debugLabel: "ProfileScreenInvite"); + + /// static variables. + final GlobalKey keySPLogout = GlobalKey(debugLabel: "ProfileScreenLogout"); + + /// static variables. + final GlobalKey keySPPalisadoes = + GlobalKey(debugLabel: "ProfileScreenPalisadoes"); + + /// bool to determine if we wanna show the apptour. + late bool showAppTour; + + /// bool to determine if apptour is complete. + bool tourComplete = false; + + /// bool to determine if apptour is skipped. + bool tourSkipped = false; + + /// context consist of parent info. + late BuildContext context; + + /// tutorialCoachMark consist of coach used to give tutorial. + late AppTour appTour = AppTour(model: this); + + /// array of target. + final List targets = []; + + /// flag to represent if app is in demoMode. + bool demoMode = false; + + /// flag to represent if app is in testMode. + bool testMode = false; + + /// Initalizing function. + /// + /// **params**: + /// * `ctx`: BuildContext, contain parent info + /// * `fromSignUp`: Bool to find user entry + /// * `mainScreenIndex`: Index to find tab on mainScreen + /// * `demoMode`: Whether the app is in demo mode + /// * `testMode`: Whether the app is in test mode + /// + /// **returns**: + /// None + void initialise( + BuildContext ctx, { + required bool fromSignUp, + required int mainScreenIndex, + bool demoMode = false, + bool testMode = false, + }) { + this.testMode = testMode; + this.demoMode = demoMode; + currentPageIndex = mainScreenIndex; + showAppTour = fromSignUp || demoMode; + context = ctx; + + print(ctx); + print(context); + pluginPrototypeData = { + "Donation": { + "icon": Icons.attach_money_outlined, + "page": const ChangeThemeTile(), + }, + }; + + notifyListeners(); + if (!showAppTour) { + tourComplete = true; + tourSkipped = false; + } else { + Future.delayed( + const Duration(seconds: 1), + () => navigationService.pushDialog( + appTourDialog(ctx), + ), + ); + } + } + + /// Contains the Widgets to be rendered for corresponding navbar items. + /// + /// Features that should be implemented as plugins should be kept here. + List pages = []; + + /// Actual [BottomNavigationBarItem]s that show up on the screen. + List navBarItems = []; + + /// Maps the feature names with their proper Icon and Page. + /// + /// `icon` contains the [IconData] corresponding to plugin's icon. + /// `page` contains the corresponding page to be displayed. + /// Name of the feature provided by the admin must [exactly] match with the. + /// name stored here. + Map pluginPrototypeData = {}; + + /// list of all the pluginList. + List pluginList = []; + + /// Dynamically adds [BottomNavigationBarItems] in `BottomNavigationBar`. + /// + /// by mapping over the data received from the server. + /// + /// **params**: + /// * `context`: its the same context you use everywhere in the flutter framework refer flutter docs for more info. + /// + /// **returns**: + /// None + void fetchAndAddPlugins( + BuildContext context, + ) { + navBarItems = [ + BottomNavigationBarItem( + icon: Icon( + Icons.home, + key: keyBNHome, + ), + label: AppLocalizations.of(context)!.strictTranslate('Home'), + ), + BottomNavigationBarItem( + icon: Icon( + Icons.event_note, + key: keyBNEvents, + ), + label: AppLocalizations.of(context)!.strictTranslate('Events'), + ), + + /// Makes chat inaccessible for the user + //TODO: add chat functionality + // BottomNavigationBarItem( + // icon: Icon( + // Icons.chat_outlined, + // key: keyBNChat, + // ), + // label: AppLocalizations.of(context)!.strictTranslate('Chat'), + // ), + BottomNavigationBarItem( + icon: Icon( + Icons.account_circle, + key: keyBNProfile, + ), + label: AppLocalizations.of(context)!.strictTranslate('Profile'), + ), + ]; + + if (!demoMode) { + pages = [ + OrganizationFeed( + key: const Key("HomeView"), + homeModel: this, + ), + ExploreEvents( + key: const Key('ExploreEvents'), + homeModel: this, + ), + // AddPost( + // key: const Key('AddPost'), + // drawerKey: MainScreenViewModel.scaffoldKey, + // ), + // const ChatPage( + // key: Key('Chats'), + // ), + ProfilePage( + key: keySPEditProfile, + homeModel: this, + ), + ]; + pluginList = + (Hive.box('pluginBox').get('plugins') ?? []) as List; + + print(pluginPrototypeData); + pluginList.forEach((plugin) { + if (pluginPrototypeData.containsKey( + (plugin as Map)["pluginName"] as String, + ) && + plugin["pluginInstallStatus"] as bool) { + navBarItems.add( + BottomNavigationBarItem( + icon: Icon( + (pluginPrototypeData[plugin["pluginName"]] + as Map)["icon"] as IconData, + ), + label: AppLocalizations.of(context)!.strictTranslate( + plugin["pluginName"] as String, + ), + ), + ); + pages.add( + (pluginPrototypeData[plugin["pluginName"]] + as Map)["class"] as StatelessWidget, + ); + } + }); + + /// Causes the app check the plugins updates in every 300 sec + /// + /// updated and re-render the navbar + Timer.periodic(Duration(seconds: (testMode ? 1 : 300)), (timer) { + FetchPluginList(); + final newPluginList = + (Hive.box('pluginBox').get('plugins') ?? []) as List; + + if (listEquals(pluginList, newPluginList)) { + // notifyListeners(); + } + if (testMode) timer.cancel(); + }); + } else { + pages = [ + DemoOrganizationFeed( + key: const Key("DemoHomeView"), + homeModel: this, + ), + DemoExploreEvents( + key: const Key('DemoExploreEvents'), + homeModel: this, + ), + // DemoAddPost( + // key: const Key('DemoAddPost'), + // drawerKey: MainScreenViewModel.scaffoldKey, + // ), + // const ChatPage( + // key: Key('Chats'), + // ), + DemoProfilePage( + key: const Key('DemoProfile'), + homeModel: this, + ), + ]; + } + } + + /// var for current page in index. + int currentPageIndex = 0; + + /// Handles click on [BottomNavigationBarItem]. + /// + /// **params**: + /// * `index`: it is track of current page index. + /// + /// **returns**: + /// None + void onTabTapped(int index) { + currentPageIndex = index; + notifyListeners(); + } + + /// Builds and returns an AppTourDialog. + /// + /// **params**: + /// * `ctx`: The build context to work with. + /// + /// **returns**: + /// * `Widget`: The built [Dialog] + Widget appTourDialog(BuildContext ctx) { + return CustomAlertDialog( + dialogTitle: 'App Tour', + dialogSubTitle: 'Start app tour to know talawa functioning', + successText: 'Start', + secondaryButtonText: 'Skip', + success: () { + navigationService.pop(); + print(MainScreenViewModel.scaffoldKey.currentState?.isDrawerOpen); + if (MainScreenViewModel.scaffoldKey.currentState?.isDrawerOpen ?? + false) { + MainScreenViewModel.scaffoldKey.currentState?.closeDrawer(); + } + tourHomeTargets(); + }, + secondaryButtonTap: () { + tourComplete = false; + tourSkipped = true; + navigationService.pop(); + notifyListeners(); + }, + ); + } + + /// Starts the tour and info to be displayed is mentioned in this functions. + /// + /// **params**: + /// * `givenUserConfig`: Mock user config that helps in testing. + /// + /// **returns**: + /// None + void tourHomeTargets([UserConfig? givenUserConfig]) { + final UserConfig localUserConfig = givenUserConfig ?? userConfig; + targets.clear(); + targets.add( + FocusTarget( + key: keySHOrgName, + keyName: 'keySHOrgName', + description: 'Current selected Organization Name', + appTour: appTour, + ), + ); + targets.add( + FocusTarget( + key: keySHMenuIcon, + keyName: 'keySHMenuIcon', + description: + 'Click this button to see options related to switching, joining and leaving organization(s)', + isCircle: true, + next: () => scaffoldKey.currentState!.openDrawer(), + appTour: appTour, + ), + ); + + targets.add( + FocusTarget( + key: keyDrawerCurOrg, + keyName: 'keyDrawerCurOrg', + description: "Current selected Organization's Name appears here", + appTour: appTour, + ), + ); + + targets.add( + FocusTarget( + key: keyDrawerSwitchableOrg, + keyName: 'keyDrawerSwitchableOrg', + description: + "All your joined organizations appear over here you can click on them to change the current organization", + appTour: appTour, + ), + ); + + targets.add( + FocusTarget( + key: keyDrawerJoinOrg, + keyName: 'keyDrawerJoinOrg', + description: "From this button you can join other listed organizations", + appTour: appTour, + align: ContentAlign.top, + next: () { + if (!localUserConfig.loggedIn) { + navigationService.pop(); + } + }, + ), + ); + + if (localUserConfig.loggedIn) { + targets.add( + FocusTarget( + key: keyDrawerLeaveCurrentOrg, + keyName: 'keyDrawerLeaveCurrentOrg', + description: + "To leave the current organization you can use this option", + align: ContentAlign.top, + next: () => navigationService.pop(), + appTour: appTour, + ), + ); + } + + targets.add( + FocusTarget( + key: keyBNHome, + keyName: 'keyBNHome', + description: + "This is the home tab here you can see the latest post from other members of the current organization", + isCircle: true, + align: ContentAlign.top, + appTour: appTour, + ), + ); + + targets.add( + FocusTarget( + key: keySHPinnedPost, + keyName: 'keySHPinnedPost', + description: + "This section displays all the important post set by the organization admin(s)", + align: ContentAlign.bottom, + appTour: appTour, + ), + ); + + targets.add( + FocusTarget( + key: keySHPost, + keyName: 'keySHPost', + description: + "This is the post card you can like and comment on the post from the options available", + align: ContentAlign.bottom, + appTour: appTour, + ), + ); + appTour.showTutorial( + onClickTarget: showHome, + onFinish: () { + onTabTapped(currentPageIndex + 1); + if (!tourComplete && !tourSkipped) { + tourEventTargets(); + } + }, + targets: targets, + ); + } + + /// This function shows the Home screen. + /// + /// **params**: + /// * `clickedTarget`: object to identify clickedTarget. + /// + /// **returns**: + /// None + void showHome(TargetFocus clickedTarget) { + switch (clickedTarget.identify) { + case "keySHMenuIcon": + scaffoldKey.currentState!.openDrawer(); + break; + case "keyDrawerLeaveCurrentOrg": + navigationService.pop(); + } + } + + /// This function show the tutorial for Events. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void tourEventTargets() { + targets.clear(); + targets.add( + FocusTarget( + key: keyBNEvents, + keyName: 'keyBNEvents', + description: + 'This is the Events tab here you can see all event related information of the current selected organization', + isCircle: true, + align: ContentAlign.top, + appTour: appTour, + ), + ); + + targets.add( + FocusTarget( + key: keySECategoryMenu, + keyName: 'keySECategoryMenu', + description: 'Filter Events based on categories', + appTour: appTour, + ), + ); + + targets.add( + FocusTarget( + key: keySEDateFilter, + keyName: 'keySEDateFilter', + description: 'Filter Events between selected dates', + appTour: appTour, + ), + ); + + targets.add( + FocusTarget( + key: keySECard, + keyName: 'keySECard', + description: + 'Description of event to see more details click on the card', + appTour: appTour, + ), + ); + + targets.add( + FocusTarget( + key: keySEAdd, + keyName: 'keySEAdd', + description: 'You can create a new event from here', + align: ContentAlign.top, + appTour: appTour, + ), + ); + + appTour.showTutorial( + onFinish: () { + onTabTapped(currentPageIndex + 1); + if (!tourComplete && !tourSkipped) { + tourProfile(); + } + }, + onClickTarget: (TargetFocus a) {}, + targets: targets, + ); + } + + /// This function show the tutorial to add Post in the organization. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void tourAddPost() { + targets.clear(); + targets.add( + FocusTarget( + key: keyBNPost, + keyName: 'keyBNPost', + description: + 'This is the Create post tab here you can add post to the current selected organization', + isCircle: true, + align: ContentAlign.top, + appTour: appTour, + ), + ); + appTour.showTutorial( + onFinish: () { + onTabTapped(currentPageIndex + 1); + if (!tourComplete && !tourSkipped) { + // tourChat(); + tourProfile(); + } + }, + onClickTarget: (TargetFocus a) {}, + targets: targets, + ); + } + + /// This function show the tour of chats. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void tourChat() { + targets.clear(); + targets.add( + FocusTarget( + key: keyBNChat, + keyName: 'keyBNChat', + description: + 'This is the Chat tab here you can see all your messages of the current selected organization', + isCircle: true, + align: ContentAlign.top, + appTour: appTour, + ), + ); + appTour.showTutorial( + onFinish: () { + onTabTapped(currentPageIndex + 1); + if (!tourComplete && !tourSkipped) { + tourProfile(); + } + }, + onClickTarget: (TargetFocus a) {}, + targets: targets, + ); + } + + /// This function show the tutorial for the profile page. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void tourProfile() { + targets.clear(); + targets.add( + FocusTarget( + key: keyBNProfile, + keyName: 'keyBNProfile', + description: + 'This is the Profile tab here you can see all options related to account, app setting, invitation, help etc', + isCircle: true, + align: ContentAlign.top, + nextCrossAlign: CrossAxisAlignment.start, + appTour: appTour, + ), + ); + + targets.add( + FocusTarget( + key: keySPAppSetting, + keyName: 'keySPAppSetting', + description: + 'You can edit application settings like language, theme etc from here', + appTour: appTour, + ), + ); + + targets.add( + FocusTarget( + key: keySPHelp, + keyName: 'keySPHelp', + description: + 'For any help we are always there. You can reach us from here', + appTour: appTour, + ), + ); + + targets.add( + FocusTarget( + key: keySPDonateUs, + keyName: 'keySPDonateUs', + description: + 'To help your organization grow you can support them financially from here', + appTour: appTour, + ), + ); + +// Uncomment the section below if you want to add the keySPInvite target +// targets.add( +// FocusTarget( +// key: keySPInvite, +// keyName: 'keySPInvite', +// description: 'Wanna invite colleague, invite them from here', +// ), +// ); + + targets.add( + FocusTarget( + key: keySPPalisadoes, + keyName: 'keySPPalisadoes', + description: 'You are all set to go lets get you in', + isEnd: true, + appTour: appTour, + ), + ); + + appTour.showTutorial( + onFinish: () { + if (!tourComplete && !tourSkipped) { + tourComplete = true; + onTabTapped(0); + } + }, + onClickTarget: (TargetFocus a) {}, + targets: targets, + ); + } +} 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..1ee86fc15 --- /dev/null +++ b/lib/view_model/pre_auth_view_models/login_view_model.dart @@ -0,0 +1,159 @@ +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; + +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/locator.dart'; +// import 'package:talawa/main.dart'; +import 'package:talawa/models/mainscreen_navigation_args.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/utils/encryptor.dart'; +import 'package:talawa/view_model/base_view_model.dart'; +import 'package:talawa/widgets/custom_progress_dialog.dart'; + +/// LoginViewModel class helps to interact with model to serve data. +/// +/// Reacts to user's input in Login View. +/// +/// Methods include: +/// * `login` +class LoginViewModel extends BaseModel { + /// GlobalKey to identify and manage the state of a form widget. + final formKey = GlobalKey(); + + /// List of maps to store greetings.. + late List> greeting; + + /// TextEditingController for handling password input field. + TextEditingController password = TextEditingController(); + + /// TextEditingController for handling email input field. + TextEditingController email = TextEditingController(); + + /// FocusNode to manage focus for the password input field. + FocusNode passwordFocus = FocusNode(); + + /// FocusNode to manage focus for the email input field. + FocusNode emailFocus = FocusNode(); + + /// Determines when to perform automatic validation of form fields. + AutovalidateMode validate = AutovalidateMode.disabled; + + /// Toggles password visibility (true for hidden, false for visible). + bool hidePassword = true; + + /// Initializes the greeting message. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void initialize() { + greeting = [ + { + 'text': "We're ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': 'Glad ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24), + }, + { + 'text': "you're ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': 'Back ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24), + }, + ]; + } + + /// Performs the login operation. + /// + /// Handles the login process by performing the following steps: + /// 1. Unfocusing the email and password text fields. + /// 2. Setting validation mode to `AutovalidateMode.always`. + /// 3. Validating the email and password fields using the form key. + /// 4. If validation is successful, disabling auto-validation mode + /// and initiating the login process. + /// 5. Displaying a custom progress dialog during login. + /// 6. Initializing database functions. + /// 7. Performing a GraphQL mutation to login the user by providing + /// the email and encrypted password. + /// 8. Handling the result of the login operation: + /// - Updating the current user with the received data. + /// - Redirecting the user based on their status in the application. + /// - Handling Firebase options for Android and iOS if available. + /// - Configuring Firebase and saving FCM token to the database. + /// + /// In case of any exceptions during the login process, + /// this function catches and prints the error. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future login() async { + emailFocus.unfocus(); + passwordFocus.unfocus(); + validate = AutovalidateMode.always; + // if the email and password are not empty. + if (formKey.currentState!.validate()) { + validate = AutovalidateMode.disabled; + navigationService + .pushDialog(const CustomProgressDialog(key: Key('LoginProgress'))); + databaseFunctions.init(); + try { + // run the graph QL query to login the user, + // passing `email` and `password`. + final result = await databaseFunctions.gqlNonAuthMutation( + queries.loginUser( + email.text, + Encryptor.encryptString( + password.text, + ), + ), + ); + navigationService.pop(); + // if user found. + if (result != null) { + final User loggedInUser = User.fromJson( + (result as QueryResult).data!['login'] as Map, + ); + userConfig.updateUser(loggedInUser); + // if user has not already joined any organization. + if (userConfig.currentUser.joinedOrganizations!.isEmpty) { + navigationService.removeAllAndPush( + Routes.waitingScreen, + Routes.splashScreen, + ); + } else { + userConfig.saveCurrentOrgInHive( + userConfig.currentUser.joinedOrganizations![0], + ); + navigationService.removeAllAndPush( + Routes.mainScreen, + Routes.splashScreen, + arguments: MainScreenArgs(mainScreenIndex: 0, fromSignUp: false), + ); + } + } + } on Exception catch (e) { + print('here'); + 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..98b4ad528 --- /dev/null +++ b/lib/view_model/pre_auth_view_models/select_organization_view_model.dart @@ -0,0 +1,269 @@ +// ignore_for_file: talawa_good_doc_comments, talawa_api_doc +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:qr_code_scanner/qr_code_scanner.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/mainscreen_navigation_args.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +/// SelectOrganizationViewModel class helps to interact with model to serve data and react to user's input in Select Organization View. +/// +/// Methods include: +/// * `selectOrg` +/// * `onTapJoin` +class SelectOrganizationViewModel extends BaseModel { + // variables + /// Organization selection required data. + final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); + + /// Organization selection required data. + late Barcode result; + + /// Organization selection required data. + final ScrollController allOrgController = ScrollController(); + + /// Organization selection required data. + final ScrollController controller = ScrollController(); + + /// Organization selection required data. + final FocusNode searchFocus = FocusNode(); + + /// Organization selection required data. + final TextEditingController searchController = TextEditingController(); + + /// Organization selection required data. + late OrgInfo selectedOrganization = OrgInfo(id: '-1'); + + /// Organization selection required data. + late List organizations = []; + + /// Organization selection required data. + bool searching = false; + + /// Organization selection required data. + late Widget showSearchOrgList = Container(); + + /// Organization selection required data. + late String orgId; + + /// if search is enabled. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void searchActive() { + if (searchFocus.hasFocus) { + organizations = []; + searching = true; + setState(ViewState.idle); + } + } + + /// initializer. + /// + /// **params**: + /// * `initialData`: data + /// + /// **returns**: + /// * `Future`: None + Future initialise(String initialData) async { + searchFocus.addListener(searchActive); + if (!initialData.contains('-1')) { + databaseFunctions.init(); + final fetch = await databaseFunctions.fetchOrgById(initialData); + if (fetch.runtimeType == OrgInfo) { + selectedOrganization = fetch as OrgInfo; + if (userConfig.currentUser.refreshToken?.isEmpty ?? true) { + navigationService.pushScreen( + Routes.signupDetailScreen, + arguments: selectedOrganization, + ); + } else { + selectOrg(selectedOrganization); + } + setState(ViewState.idle); + } + } + } + + /// This function select the organization. + /// + /// **params**: + /// * `item`: Selected organization data. + /// + /// **returns**: + /// * `Future`: None + Future selectOrg(OrgInfo item) async { + print(item.id); + bool orgAlreadyJoined = false; + bool orgRequestAlreadyPresent = false; + final bool userLoggedIn = await userConfig.userLoggedIn(); + // if user session not expirec + if (userLoggedIn) { + // check if user has already joined the selected organization. + userConfig.currentUser.joinedOrganizations!.forEach((element) { + if (element.id! == item.id) { + orgAlreadyJoined = true; + } + }); + // check if user has already send the membership request to the selected organization. + userConfig.currentUser.membershipRequests!.forEach((element) { + if (element.id! == item.id) { + orgRequestAlreadyPresent = true; + } + }); + // if not already joined and not memebrship request. + if (!orgAlreadyJoined && !orgRequestAlreadyPresent) { + selectedOrganization = item; + notifyListeners(); + onTapJoin(); + + if (selectedOrganization.userRegistrationRequired!) { + navigationService.pushScreen( + Routes.requestAccess, + arguments: selectedOrganization, + ); + } + } else if (orgAlreadyJoined) { + selectedOrganization = OrgInfo(id: '-1'); + navigationService.showTalawaErrorSnackBar( + 'Organisation already joined', + MessageType.warning, + ); + } else { + navigationService.showTalawaErrorSnackBar( + 'Membership request already sent', + MessageType.warning, + ); + } + } else { + selectedOrganization = item; + notifyListeners(); + navigationService.pushScreen( + Routes.signupDetailScreen, + arguments: selectedOrganization, + ); + } + } + + /// Helper for listener to check if user can tap on continue option or not. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void onTapContinue() { + // if user selected any organization. + if (selectedOrganization.id != '-1') { + navigationService.pushScreen( + Routes.signupDetailScreen, + arguments: selectedOrganization, + ); + } else { + navigationService.showTalawaErrorSnackBar( + 'Select one organization to continue', + MessageType.warning, + ); + } + } + + /// This function make user to join the selected organization. + /// + /// + /// The function uses `joinOrgById` graph QL query + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Future`: None + Future onTapJoin() async { + // if `selectedOrganization` registrations is not required. + if (selectedOrganization.userRegistrationRequired == false) { + try { + // run the graph QL mutation + final QueryResult result = await databaseFunctions.gqlAuthMutation( + queries.joinOrgById(selectedOrganization.id!), + ) as QueryResult; + + final List? joinedOrg = + ((result.data!['joinPublicOrganization'] + as Map)['joinedOrganizations'] + as List?) + ?.map((e) => OrgInfo.fromJson(e as Map)) + .toList(); + userConfig.updateUserJoinedOrg(joinedOrg!); + // if user joined organization length is 1 + if (userConfig.currentUser.joinedOrganizations!.length == 1) { + userConfig.saveCurrentOrgInHive( + userConfig.currentUser.joinedOrganizations![0], + ); + navigationService.removeAllAndPush( + Routes.mainScreen, + Routes.splashScreen, + arguments: MainScreenArgs(mainScreenIndex: 0), + ); + } else { + navigationService.pop(); + navigationService.showTalawaErrorSnackBar( + 'Joined ${selectedOrganization.name} successfully', + MessageType.info, + ); + } + } on Exception catch (e) { + print(e); + navigationService.showTalawaErrorSnackBar( + 'Something went wrong', + MessageType.error, + ); + } + } + // else { + // try { + // // navigationService.pushScreen(Routes.requestAccess); + // } on Exception catch (e) { + // print(e); + // navigationService.showTalawaErrorSnackBar( + // 'SomeThing went wrong', + // MessageType.error, + // ); + // } + // } + } + + /// This function fetch more option. + /// + /// + /// **params**: + /// * `fetchMore`: client function + /// * `organizations`: org list + /// + /// **returns**: + /// None + void fetchMoreHelper(FetchMore fetchMore, List organizations) { + fetchMore( + FetchMoreOptions( + variables: { + "first": organizations.length + 15, + "skip": organizations.length, + }, + updateQuery: (existingOrganizations, newOrganizations) { + return { + 'organizationsConnection': + (existingOrganizations!["organizationsConnection"] + as List) + + (newOrganizations!['organizationsConnection'] + as List), + }; + }, + ), + ); + } +} 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..f9ec9324b --- /dev/null +++ b/lib/view_model/pre_auth_view_models/set_url_view_model.dart @@ -0,0 +1,312 @@ +import 'package:flutter/material.dart'; +import 'package:hive/hive.dart'; +import 'package:qr_code_scanner/qr_code_scanner.dart'; +import 'package:qr_flutter/qr_flutter.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/validators.dart'; +import 'package:talawa/view_model/base_view_model.dart'; +import 'package:talawa/widgets/custom_progress_dialog.dart'; +import 'package:vibration/vibration.dart'; + +/// SetUrlViewModel class helps to interact with model to serve data. +/// +/// and react to user's input for Set Url Section. +/// Methods include: +/// * `checkURLandNavigate` +/// * `scanQR` +/// * `initialise` +/// * `checkURLandNavigate` +/// * `checkURLandShowPopUp` +/// * `scanQR` +/// * `_onQRViewCreated` + +class SetUrlViewModel extends BaseModel { + // variables + + /// formKey. + final formKey = GlobalKey(); + + /// qrKey. + final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); + + /// qrText. + late Barcode result; + + /// organizationID. + String orgId = '-1'; + + /// imageUrlKey. + static const imageUrlKey = "imageUrl"; + + /// urlKey. + static const urlKey = "url"; + + /// url. + TextEditingController url = TextEditingController(); + + /// urlFocus. + FocusNode urlFocus = FocusNode(); + + /// qrController. + late List> greeting; + + /// qrValidator. + AutovalidateMode validate = AutovalidateMode.disabled; + + /// This function initialises the variables. + /// + /// **params**: + /// * `inviteUrl`: url + /// + /// **returns**: + /// None + + void initialise({String inviteUrl = ''}) { + final uri = inviteUrl; + if (uri.isNotEmpty) { + /// assigning the invite server url to the url text controller. + url.text = uri; + final box = Hive.box('url'); + box.put(urlKey, uri); + box.put(imageUrlKey, "$uri/talawa/"); + graphqlConfig.getOrgUrl(); + } + + /// greeting message. + greeting = [ + { + 'text': 'Join ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24, fontWeight: FontWeight.w700), + }, + { + 'text': 'and ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': 'Collaborate ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24, fontWeight: FontWeight.w700), + }, + { + 'text': 'with your ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': 'Organizations', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall! + .copyWith(fontSize: 24, color: const Color(0xFF4285F4)), + }, + ]; + notifyListeners(); + } + + /// This function check the URL and navigate to the respective URL. + /// + /// **params**: + /// * `navigateTo`: url + /// * `argument`: message + /// + /// **returns**: + /// None + + Future checkURLandNavigate(String navigateTo, String argument) async { + urlFocus.unfocus(); + validate = AutovalidateMode.always; + + /// if the url is valid. + if (formKey.currentState!.validate()) { + navigationService + .pushDialog(const CustomProgressDialog(key: Key('UrlCheckProgress'))); + validate = AutovalidateMode.disabled; + final String uri = url.text.trim(); + final bool? urlPresent = + await locator().validateUrlExistence(uri); + if (urlPresent! == true) { + final box = Hive.box('url'); + box.put(urlKey, uri); + box.put(imageUrlKey, "$uri/talawa/"); + + navigationService.pop(); + graphqlConfig.getOrgUrl(); + navigationService.pushScreen(navigateTo, arguments: argument); + } else { + navigationService.pop(); + navigationService.showTalawaErrorSnackBar( + "URL doesn't exist/no connection please check", + MessageType.error, + ); + } + } + } + + /// This function check the URL and navigate to the respective URL. + /// + /// **params**: + /// * `argument`: message + /// + /// **returns**: + /// None + + Future checkURLandShowPopUp(String argument) async { + urlFocus.unfocus(); + validate = AutovalidateMode.always; + + // if the url is valid. + if (formKey.currentState!.validate()) { + navigationService.pushDialog( + const CustomProgressDialog( + key: Key('UrlCheckProgress'), + ), + ); + validate = AutovalidateMode.disabled; + final String uri = url.text.trim(); + final bool? urlPresent = + await locator().validateUrlExistence(uri); + if (urlPresent! == true) { + final box = Hive.box('url'); + box.put(urlKey, uri); + box.put(imageUrlKey, "$uri/talawa/"); + navigationService.pop(); + graphqlConfig.getOrgUrl(); + navigationService.showSnackBar("Url is valid"); + } else { + navigationService.pop(); + navigationService.showTalawaErrorDialog( + "URL doesn't exist/no connection please check", + MessageType.info, + ); + } + } + } + + /// This function create a widget which is used to scan the QR-code. + /// + /// **params**: + /// * `context`: BuildContext + /// + /// **returns**: + /// None + + void scanQR(BuildContext context) { + showModalBottomSheet( + context: context, + barrierColor: Colors.transparent, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), + builder: (BuildContext context) { + return ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + child: Container( + height: MediaQuery.of(context).size.width, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.secondary, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: 250, + width: 250, + child: QRView( + key: qrKey, + onQRViewCreated: _onQRViewCreated, + overlay: QrScannerOverlayShape( + borderRadius: 10, + borderLength: 20, + borderWidth: 10, + cutOutSize: 250, + ), + /*overlayMargin: EdgeInsets.all(50)*/ + ), + ), + SizedBox( + height: SizeConfig.safeBlockVertical! * 4, + ), + const Text('Scan QR'), + SizedBox( + height: SizeConfig.safeBlockVertical! * 4, + ), + ], + ), + ), + ); + }, + ); + } + + /// This is the helper function which execute when the on QR view created. + /// + /// **params**: + /// * `controller`: QRViewController + /// + /// **returns**: + /// None + + void _onQRViewCreated(QRViewController controller) { + controller.scannedDataStream.listen((scanData) { + /// if the scanData is not empty. + if (scanData.code!.isNotEmpty) { + print(scanData.code); + try { + final List data = scanData.code!.split('?'); + url.text = data[0]; + final List queries = data[1].split('&'); + orgId = queries[0].split('=')[1]; + Vibration.vibrate(duration: 100); + controller.stopCamera(); + controller.dispose(); + final box = Hive.box('url'); + box.put(urlKey, url.text); + box.put(imageUrlKey, "${url.text}/talawa/"); + graphqlConfig.getOrgUrl(); + Navigator.pop(navigationService.navigatorKey.currentContext!); + navigationService.pushScreen('/selectOrg', arguments: orgId); + } on CameraException catch (e) { + debugPrint(e.toString()); + navigationService.showTalawaErrorSnackBar( + "The Camera is not working", + MessageType.error, + ); + } on QrEmbeddedImageException catch (e) { + debugPrint(e.toString()); + navigationService.showTalawaErrorDialog( + "The QR is not Working", + MessageType.error, + ); + } on QrUnsupportedVersionException catch (e) { + debugPrint(e.toString()); + navigationService.showTalawaErrorDialog( + "This QR version is not Supported.", + MessageType.error, + ); + } on Exception catch (e) { + debugPrint(e.toString()); + navigationService.showTalawaErrorSnackBar( + "This QR is not for the App", + MessageType.error, + ); + } + } + }); + } +} 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..494afac0b --- /dev/null +++ b/lib/view_model/pre_auth_view_models/signup_details_view_model.dart @@ -0,0 +1,218 @@ +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/mainscreen_navigation_args.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/utils/encryptor.dart'; +import 'package:talawa/view_model/base_view_model.dart'; +import 'package:talawa/widgets/custom_progress_dialog.dart'; + +/// SignupDetailsViewModel class helps to interact with model to serve data and react to user's input for Sign Up Details section. +/// +/// Methods include: +/// * `signUp` +class SignupDetailsViewModel extends BaseModel { + /// GlobalKey to identify and manage the state of a form widget. + final formKey = GlobalKey(); + + /// List of maps to store greeting information, where each greeting is represented by a map with String keys and dynamic values. + late List> greeting; + + /// Represents information about the selected organization. + late OrgInfo selectedOrganization; + + /// TextEditingController for handling confirmation password input field. + TextEditingController confirmPassword = TextEditingController(); + + /// TextEditingController for handling first name input field. + TextEditingController firstName = TextEditingController(); + + /// TextEditingController for handling last name input field. + TextEditingController lastName = TextEditingController(); + + /// TextEditingController for handling password input field. + TextEditingController password = TextEditingController(); + + /// TextEditingController for handling email input field. + TextEditingController email = TextEditingController(); + + /// AutovalidateMode to determine when to perform automatic validation of form fields. + AutovalidateMode validate = AutovalidateMode.disabled; + + /// FocusNode to manage focus for the confirmation password input field. + FocusNode confirmFocus = FocusNode(); + + /// Boolean to toggle password visibility (true for hidden, false for visible). + bool hidePassword = true; + + /// Initializes the greeting message for a selected organization. + /// + /// **params**: + /// * `org`: OrgInfo - the organization information to set as selected. + /// + /// **returns**: + /// None + void initialise(OrgInfo org) { + selectedOrganization = org; + // greeting message + greeting = [ + { + 'text': "Let's ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': 'get ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': "you ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': 'SignUp ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24), + }, + ]; + } + + /// Initiates the sign-up process. + /// + /// Handles the sign-up process by performing the following steps: + /// 1. Unfocusing the current focus scope. + /// 2. Setting the view state to `ViewState.busy`. + /// 3. Setting validation mode to `AutovalidateMode.always`. + /// 4. Setting the view state to `ViewState.idle`. + /// 5. Validating the form using the form key. + /// 6. If validation is successful, disabling auto-validation mode and + /// initiating the sign-up. + /// 7. Displaying a custom progress dialog during sign-up. + /// 8. Initializing database functions. + /// 9. Performing a GraphQL mutation to register the user with provided + /// details (first name, last name, email, password). + /// 10. Handling the result of the sign-up operation: + /// - Updating the current user with the received data. + /// - Refreshing the access token. + /// - Joining a public organization or sending a membership request + /// based on the selected organization. + /// + /// In case of any exceptions during the sign-up process, this function + /// catches and prints the error + /// and displays a Talawa error snackbar with a corresponding message. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + Future 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 result = await databaseFunctions.gqlNonAuthMutation( + queries.registerUser( + firstName.text, + lastName.text, + email.text, + Encryptor.encryptString( + password.text, + ), + selectedOrganization.id, + ), + ); + navigationService.pop(); + if (result != null) { + final User signedInUser = User.fromJson( + (result as QueryResult).data!['signUp'] as Map, + ); + final bool userSaved = await userConfig.updateUser(signedInUser); + final bool tokenRefreshed = await graphqlConfig.getToken() as bool; + // if user successfully saved and access token is also generated. + if (userSaved && tokenRefreshed) { + // if the selected organization userRegistration not required. + if (!selectedOrganization.userRegistrationRequired!) { + try { + final QueryResult result = + await databaseFunctions.gqlAuthMutation( + queries.joinOrgById(selectedOrganization.id!), + ) as QueryResult; + + final joinPublicOrganization = result + .data!['joinPublicOrganization'] as Map; + final List? joinedOrg = (joinPublicOrganization[ + 'joinedOrganizations'] as List?) + ?.map((e) => OrgInfo.fromJson(e as Map)) + .toList(); + userConfig.updateUserJoinedOrg(joinedOrg!); + userConfig.saveCurrentOrgInHive( + userConfig.currentUser.joinedOrganizations![0], + ); + navigationService.removeAllAndPush( + Routes.mainScreen, + Routes.splashScreen, + arguments: + MainScreenArgs(mainScreenIndex: 0, fromSignUp: true), + ); + } on Exception catch (e) { + print(e); + navigationService.showTalawaErrorSnackBar( + 'Something went wrong', + MessageType.error, + ); + } + } else { + try { + final QueryResult result = + await databaseFunctions.gqlAuthMutation( + queries.sendMembershipRequest(selectedOrganization.id!), + ) as QueryResult; + + final sendMembershipRequest = result + .data!['sendMembershipRequest'] as Map; + final OrgInfo membershipRequest = OrgInfo.fromJson( + sendMembershipRequest['organization'] as Map, + ); + userConfig.updateUserMemberRequestOrg([membershipRequest]); + navigationService.pop(); + navigationService.removeAllAndPush( + Routes.waitingScreen, + Routes.splashScreen, + ); + } on Exception catch (e) { + print(e); + navigationService.showTalawaErrorSnackBar( + 'Something went wrong', + MessageType.error, + ); + } + } + } + } + } on Exception catch (e) { + print(e); + navigationService.showTalawaErrorSnackBar( + 'Something went wrong', + MessageType.error, + ); + } + } + } +} 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..150859248 --- /dev/null +++ b/lib/view_model/pre_auth_view_models/waiting_view_model.dart @@ -0,0 +1,60 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +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'; + +/// WaitingViewModel class helps to interact with model to serve data +/// and react to user's input for Waiting section. +/// +/// Methods include: +/// * `logout` +class WaitingViewModel extends BaseModel { + late List> greeting; + late List pendingRequestOrg; + late User currentUser; + + // initialiser + void initialise(BuildContext context) { + currentUser = userConfig.currentUser; + pendingRequestOrg = currentUser.membershipRequests!; + // greetings + greeting = [ + { + 'text': "Please wait", + 'textStyle': Theme.of(context).textTheme.headlineSmall, + }, + { + 'text': " ${currentUser.firstName} ", + 'textStyle': + Theme.of(context).textTheme.titleLarge!.copyWith(fontSize: 24), + }, + { + 'text': "for organisation(s) to accept your invitation.", + 'textStyle': Theme.of(context).textTheme.headlineSmall, + }, + ]; + } + + /// This function ends the session for the user or logout the user from the application. + void logout() { + final user = Hive.box('currentUser'); + final url = Hive.box('url'); + user.clear(); + url.clear(); + navigationService.removeAllAndPush( + Routes.languageSelectionRoute, + Routes.splashScreen, + arguments: '0', + ); + } + + void joinOrg() { + navigationService.pushScreen(Routes.joinOrg, arguments: '-1'); + } +} diff --git a/lib/view_model/theme_view_model.dart b/lib/view_model/theme_view_model.dart new file mode 100644 index 000000000..af40c9a34 --- /dev/null +++ b/lib/view_model/theme_view_model.dart @@ -0,0 +1,48 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +/// AppTheme class is a type of View Model to serve data from modal to views in the context of App Themes. +/// +/// Methods include: +/// * `switchTheme` +class AppTheme extends BaseModel { + final String key = "DynamicTheme"; + + late SharedPreferences _pref; + late bool _isDarkMode; + bool get isdarkTheme => _isDarkMode; + + // initializer + void initialize() { + _isDarkMode = true; + _loadFromPrefs(); + } + + /// This function switches the app theme. + /// + /// * `Dart` -> `Light` + /// * `Light` -> `Dark` + void switchTheme({required bool isOn}) { + _isDarkMode = isOn; + _saveToPrefs(); + notifyListeners(); + } + + Future _initPrefs() async { + _pref = await SharedPreferences.getInstance(); + } + + Future _loadFromPrefs() async { + await _initPrefs(); + _isDarkMode = _pref.getBool(key) ?? true; + notifyListeners(); + } + + Future _saveToPrefs() async { + await _initPrefs(); + _pref.setBool(key, _isDarkMode); + } +} 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..ed9de75ea --- /dev/null +++ b/lib/view_model/widgets_view_models/comments_view_model.dart @@ -0,0 +1,102 @@ +// ignore_for_file: talawa_api_doc +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'; + +/// CommentsViewModel class helps to serve the data from model and to react to user's input for Comment Widget. +/// +/// Methods include: +/// * `getComments` : to get all comments on the post. +/// * `createComment` : to add comment on the post. +class CommentsViewModel extends BaseModel { + /// Constructor + late CommentService _commentService; + + /// PostService instance. + late PostService _postService; + + /// Post id on which comments are to be fetched. + late String _postID; + + /// List of comments on the post. + late List _commentlist; + + /// UserConfig instance. + late UserConfig _userConfig; + + // Getters + List get commentList => _commentlist; + String get postId => _postID; + + /// This function is used to initialise the CommentViewModel. + /// + /// To verify things are working, check out the native platform logs. + /// **params**: + /// * `postID`: The post id for which comments are to be fetched. + /// + /// **returns**: + /// None + Future initialise(String postID) async { + _commentlist = []; + _postID = postID; + _commentService = locator(); + _userConfig = locator(); + _postService = locator(); + notifyListeners(); + await getComments(); + } + + /// This function is used to get all comments on the post. + /// + /// To verify things are working, check out the native platform logs. + /// **params**: + /// None + /// + /// **returns**: + /// None + Future getComments() async { + setState(ViewState.busy); + final List commentsJSON = await _commentService.getCommentsForPost(_postID); + print(commentsJSON); + commentsJSON.forEach((commentJson) { + _commentlist.add(Comment.fromJson(commentJson as Map)); + }); + setState(ViewState.idle); + } + + /// This function add comment on the post. The function uses `createComments` method provided by Comment Service. + /// + /// **params**: + /// * `msg`: The comment text. + /// + /// **returns**: + /// None + Future createComment(String msg) async { + print("comment viewModel called"); + await _commentService.createComments(_postID, msg); + addCommentLocally(msg); + } + + /// This function add comment locally. + /// + /// **params**: + /// * `msg`: BuildContext, contain parent info + /// + /// **returns**: + /// None + void addCommentLocally(String msg) { + _postService.addCommentLocally(_postID); + final creator = _userConfig.currentUser; + final Comment localComment = Comment( + text: msg, + createdAt: DateTime.now().toString(), + creator: creator, + ); + _commentlist.add(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..564ef0f39 --- /dev/null +++ b/lib/view_model/widgets_view_models/custom_drawer_view_model.dart @@ -0,0 +1,161 @@ +import 'dart:async'; +import 'package:flutter/material.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/view_model/main_screen_view_model.dart'; +import 'package:talawa/widgets/custom_alert_dialog.dart'; +import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; + +/// CustomDrawerViewModel class helps to serve the data and to react to user's input for Custom Dialog Widget. +/// +/// Functions include: +/// * `switchOrg` +/// * `isPresentinSwitchableOrg` +/// * `setSelectedOrganizationName` +class CustomDrawerViewModel extends BaseModel { + // getters + + /// Scroll controller for managing scrolling behavior. + final ScrollController controller = ScrollController(); + + /// List of TargetFocus objects used for tutorial coaching. + final List targets = []; + + /// Instance of TutorialCoachMark responsible for providing tutorial guidance. + late TutorialCoachMark tutorialCoachMark; + late User _currentUser; + late List _switchAbleOrg; + bool _disposed = false; + OrgInfo? _selectedOrg; + StreamSubscription? _currentOrganizationStreamSubscription; + + //// Getter method to retrieve the selected organization. + OrgInfo? get selectedOrg => _selectedOrg; + + /// Getter method to retrieve the switchAble organization. + // ignore: unnecessary_getters_setters + List get switchAbleOrg => _switchAbleOrg; + + /// Setter method for switchAble organization. + set switchAbleOrg(List switchableOrg) => + _switchAbleOrg = switchableOrg; + + /// initializer. + /// + /// **params**: + /// * `homeModel`: instance of MainScreenViewModel. + /// * `context`: instance of BuildContext. + /// + /// **returns**: + /// None + void initialize(MainScreenViewModel homeModel, BuildContext context) { + _currentOrganizationStreamSubscription = + userConfig.currentOrgInfoStream.listen( + (updatedOrganization) { + setSelectedOrganizationName(updatedOrganization); + }, + ); + _currentUser = userConfig.currentUser; + _selectedOrg = userConfig.currentOrg; + _switchAbleOrg = _currentUser.joinedOrganizations ?? []; + } + + /// This function switches the organization to the specified `switchToOrg`. + /// + /// If `selectedOrg` is equal to `switchToOrg` and `switchToOrg` is present, a warning message is displayed using a custom Snackbar. + /// Otherwise, it saves the `switchToOrg` as the current organization, updates the selected organization name, + /// and displays an informational message using a custom Snackbar. + /// + /// **params**: + /// * `switchToOrg`: The organization to switch to. + /// + /// **returns**: + /// None + void switchOrg(OrgInfo switchToOrg) { + // if `selectedOrg` is equal to `switchOrg` and `switchToOrg` present or not. + if ((selectedOrg == switchToOrg) && + (isPresentinSwitchableOrg(switchToOrg))) { + // _navigationService.pop(); + navigationService.showTalawaErrorSnackBar( + '${switchToOrg.name} already selected', + MessageType.warning, + ); + } else { + userConfig.saveCurrentOrgInHive(switchToOrg); + setSelectedOrganizationName(switchToOrg); + navigationService.showTalawaErrorSnackBar( + 'Switched to ${switchToOrg.name}', + MessageType.info, + ); + } + navigationService.pop(); + } + + /// This function checks `switchOrg` is present in the `switchAbleOrg`. + /// + /// **params**: + /// * `switchToOrg`: `OrgInfo` type of organization want to switch into. + /// + /// **returns**: + /// * `bool`: returns true if switchToOrg is in switchAbleOrg list. + bool isPresentinSwitchableOrg(OrgInfo switchToOrg) { + var isPresent = false; + for (final OrgInfo orgs in switchAbleOrg) { + if (orgs.id == switchToOrg.id) { + isPresent = true; + } + } + return isPresent; + } + + @override + void notifyListeners() { + if (!_disposed) { + super.notifyListeners(); + } + } + + /// returns an exit alert dialog. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `CustomAlertDialog`: returns customAlertDialogBox. + CustomAlertDialog exitAlertDialog() { + return CustomAlertDialog( + key: const Key("Exit?"), + reverse: true, + dialogSubTitle: 'Are you sure you want to exit this organization?', + successText: 'Exit', + success: () {}, + ); + } + + /// This function switches the current organization to new organization. + /// + /// **params**: + /// * `updatedOrganization`: `OrgInfo` type, new organization. + /// + /// **returns**: + /// None + void setSelectedOrganizationName(OrgInfo updatedOrganization) { + // if current and updated organization are not same. + if (_selectedOrg != updatedOrganization) { + _selectedOrg = updatedOrganization; + // update in `UserConfig` variable. + userConfig.currentOrgInfoController.add(_selectedOrg!); + notifyListeners(); + } + } + + @override + void dispose() { + _disposed = true; + _currentOrganizationStreamSubscription?.cancel(); + super.dispose(); + } +} diff --git a/lib/view_model/widgets_view_models/event_card_view_model.dart b/lib/view_model/widgets_view_models/event_card_view_model.dart new file mode 100644 index 000000000..cd3c21f21 --- /dev/null +++ b/lib/view_model/widgets_view_models/event_card_view_model.dart @@ -0,0 +1,38 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +// import 'package:flutter/material.dart'; +// import 'package:talawa/locator.dart'; +// import 'package:talawa/models/events/event_badge_helper_model.dart'; +// import 'package:talawa/models/events/event_model.dart'; +// import 'package:talawa/view_model/base_view_model.dart'; + +// class EventCardViewModel extends BaseModel { +// late final Event _event; +// Event get event => _event; +// late final bool isRegistered; +// late EventBadge eventBadge; +// initialize({required Event event}) { +// _event = event; +// isRegistered = _event.isRegistered ?? false; +// initBadge(); +// } + +// void initBadge() {} + +// Map badgeDetails() { +// if (_event.creator!.id == userConfig.currentUser.id) { +// return { +// "BadgeTitle": "Created", +// }; +// } else if (isRegistered) { +// return { +// "BadgeTitle": "Subscribed", +// }; +// } else { +// return { +// "BadgeTitle": "", +// }; +// } +// } +// } 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..67b8013ce --- /dev/null +++ b/lib/view_model/widgets_view_models/like_button_view_model.dart @@ -0,0 +1,115 @@ +// ignore_for_file: talawa_api_doc +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'; + +/// LikeButtonViewModel class helps to serve the data and to react to user's input for Like Button Widget. +/// +/// +/// Methods include: +/// * `toggleIsLiked` +/// * `setIsLiked` +/// * `updatePost` +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; + + /// First function to initialize the ViewModel. + /// + /// **params**: + /// * `likedBy`: List of LikedBy Objects + /// * `postID`: Post Id of the Post + /// + /// **returns**: + /// None + void initialize(List likedBy, String postID) { + _postID = postID; + _user = _userConfig.currentUser; + _likedBy = likedBy; + notifyListeners(); + checkAndSetTheIsLiked(); + _updatePostSubscription = + _postService.updatedPostStream.listen((post) => updatePost(post)); + } + + /// function to toggleisLiked boolean. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void toggleIsLiked() { + if (!_isLiked) { + _postService.addLike(_postID); + } + } + + /// function to set isLiked boolean. + /// + /// **params**: + /// * `val`: value to set bool to. + /// + /// **returns**: + /// None + void setIsLiked({bool val = true}) { + _isLiked = val; + notifyListeners(); + } + + /// function to set isLiked boolean and check. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void checkAndSetTheIsLiked() { + setIsLiked(val: false); + for (var i = 0; i < _likedBy.length; i++) { + if (_likedBy[i].sId == _user.id) { + setIsLiked(); + } + } + } + + /// function to update the Post. + /// + /// **params**: + /// * `post`: Post Object + /// + /// **returns**: + /// None + void 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..9f4997543 --- /dev/null +++ b/lib/view_model/widgets_view_models/progress_dialog_view_model.dart @@ -0,0 +1,28 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +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'; + +/// ProgressDialogViewModel class helps to serve the data and +/// to react to user's input for Progress Dialog Widget. +class ProgressDialogViewModel extends BaseModel { + late ConnectivityResult connectivityResult; + bool connectivityPresent = false; + + // initialiser + Future 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..9ec32746c --- /dev/null +++ b/lib/views/after_auth_screens/add_post_page.dart @@ -0,0 +1,248 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/enums/enums.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/add_post_view_models/add_post_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/custom_avatar.dart'; + +/// Add Post View Model. +late AddPostViewModel model; + +/// AddPost returns a widget to add(upload) the post. +class AddPost extends StatefulWidget { + const AddPost({super.key, this.drawerKey}); + + /// DrawerKey. + final GlobalKey? drawerKey; + + @override + State createState() => _AddPostState(); +} + +class _AddPostState extends State { + @override + Widget build(BuildContext context) { + // final Uint8List imageBytes = base64Decode(sampleBase64Image); + // final Uint8List bytes = BASE64.decode(_base64); + return Scaffold( + resizeToAvoidBottomInset: false, + // header for the widget + appBar: AppBar( + backgroundColor: Theme.of(context).primaryColor, + elevation: 0.9, + centerTitle: true, + // header title + title: Text( + AppLocalizations.of(context)!.strictTranslate('Share News'), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + leading: IconButton( + //TODO: showing the null pointer exception + key: const Key('add_post_icon_button1'), + color: Theme.of(context).iconTheme.color, + icon: const Icon( + Icons.arrow_back, + size: 36, + ), + onPressed: () { + navigationService.pop(); + }, + ), + // button to upload the post. + actions: [ + TextButton( + key: const Key('add_post_text_btn1'), + onPressed: () { + model.uploadPost(); + navigationService.pop(); + // convertImageToBase64(sampleBase64Image); + }, + child: Text( + AppLocalizations.of(context)!.strictTranslate("Post"), + style: Theme.of(context).textTheme.headlineSmall!.copyWith( + fontWeight: FontWeight.w600, + color: Theme.of(context).colorScheme.secondary, + ), + ), + ), + // Image.memory(imageBytes) + ], + ), + body: BaseView( + onModelReady: (m) { + m.initialise(); + model = m; + }, + builder: (context, model, child) { + return SingleChildScrollView( + child: Column( + children: [ + ListTile( + leading: CustomAvatar( + isImageNull: model.userPic == null, + firstAlphabet: model.userName.substring(0, 1).toUpperCase(), + imageUrl: model.userPic, + fontSize: SizeConfig.screenHeight! * 0.018, + ), + title: Text(model.userName), + subtitle: Text( + AppLocalizations.of(context)! + .strictTranslate(model.orgName), + ), + ), + // renders icon button to upload post files. + Row( + children: [ + // button to select the photo from gallery. + IconButton( + key: const Key('add_post_icon_button2'), + onPressed: () => model.getImageFromGallery(), + icon: const Icon(Icons.photo), + ), + // button to capture the image. + IconButton( + key: const Key('add_post_icon_button3'), + onPressed: () => model.getImageFromGallery(camera: true), + icon: const Icon(Icons.camera_alt), + ), + // button to add hastags to the post. + TextButton( + key: const Key('add_post_text_btn2'), + onPressed: () { + showDialog( + context: context, + builder: (BuildContext context) { + return AlertDialog( + title: Text( + AppLocalizations.of(context)! + .strictTranslate("Enter the Tag"), + ), + content: TextField( + controller: model.textHashTagController, + ), + actions: [ + TextButton( + key: const Key("add_hashtag_button"), + onPressed: () { + navigationService.showTalawaErrorSnackBar( + "The tag was added", + MessageType.info, + ); + Navigator.of(context).pop(); + }, + child: Text( + AppLocalizations.of(context)! + .strictTranslate("Add"), + ), + ), + TextButton( + key: const Key("cancel_hashtag_button"), + onPressed: () { + Navigator.of(context).pop(); + }, + child: Text( + AppLocalizations.of(context)! + .strictTranslate("Cancel"), + ), + ), + ], + ); + }, + ); + }, + child: Text( + model.textHashTagController.text == "" + ? '# ${AppLocalizations.of(context)!.strictTranslate("Add tag")}' + : model.textHashTagController.text, + style: Theme.of(context).textTheme.titleLarge, + ), + ), + ], + ), + const Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: TextField( + controller: model.titleController, + // input field to write the description of the post. + decoration: InputDecoration( + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + errorBorder: InputBorder.none, + disabledBorder: InputBorder.none, + hintText: AppLocalizations.of(context)!.strictTranslate( + "Enter the title of your post", + ), + label: Text( + AppLocalizations.of(context)!.strictTranslate( + "Title", + ), + ), + ), + ), + ), + const Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: TextField( + controller: model.controller, + maxLines: null, + // input field to write the description of the post. + 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", + ), + ), + ), + ), + // if the image for the post is added then render button to remove it. + model.imageFile != null + // ignore: sized_box_for_whitespace + ? Container( + height: 230, + padding: const EdgeInsets.all(8.0), + child: Stack( + children: [ + // Image.file( + // model.imageFile!, + // fit: BoxFit.cover, + // width: MediaQuery.of(context).size.width, + // ), + Image.file(model.imageFile!), + Positioned( + right: 5, + top: 5, + child: IconButton( + key: const Key("remove_icon"), + onPressed: () { + model.removeImage(); + }, + icon: const Icon( + Icons.cancel, + color: Colors.black, + ), + ), + ), + ], + ), + ) + : Container(), + ], + ), + ); + }, + ), + ); + } +} diff --git a/lib/views/after_auth_screens/app_settings/app_settings_page.dart b/lib/views/after_auth_screens/app_settings/app_settings_page.dart new file mode 100644 index 000000000..3398a51e1 --- /dev/null +++ b/lib/views/after_auth_screens/app_settings/app_settings_page.dart @@ -0,0 +1,356 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/enums/enums.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/settings_view_models/app_setting_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/custom_alert_dialog.dart'; +import 'package:talawa/widgets/lang_switch.dart'; +import 'package:talawa/widgets/talawa_error_dialog.dart'; +import 'package:talawa/widgets/theme_switch.dart'; + +/// Widget representing the App Settings page. +/// +/// This widget represents the settings page of the application. +/// It allows users to configure various application settings. +class AppSettingsPage extends StatelessWidget { + const AppSettingsPage({ + super.key, + }); + + @override + Widget build(BuildContext context) { + // Scaffold implements the basic Material Design visual layout structure. + //Learn more about Scaffold class + //[here](https://api.flutter.dev/flutter/material/Scaffold-class.html). + // const String _talawaWebsite = ''; + const String talawaDocs = 'https://docs.talawa.io'; + const String talawaGithub = + 'https://github.com/PalisadoesFoundation/talawa'; + return BaseView( + builder: (context, model, child) { + return Scaffold( + key: const Key('AppSettingScaffold'), + // AppBar is a horizontal bar typically shown at the top of an app using the appBar property. + appBar: AppBar( + iconTheme: Theme.of(context).iconTheme, + backgroundColor: Theme.of(context).primaryColor, + elevation: 0.0, + centerTitle: true, + // title of the page in appBar property + title: Text( + // title text translation according to the app language. + AppLocalizations.of(context)!.strictTranslate('Settings'), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + leading: IconButton( + icon: const Icon(Icons.arrow_back), + onPressed: () => navigationService.pop(), + ), + ), + // style of the AppBar. + body: Padding( + padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 20), + child: Column( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + // SizedBox( + // height: SizeConfig.screenHeight! * 0.77, + // child: + // ), + Flexible( + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: Column( + children: [ + userConfig.loggedIn + ? category( + context: context, + title: 'Profile', + listItems: [ + customListTile( + leading: const Icon(Icons.edit), + content: Text( + AppLocalizations.of(context)! + .strictTranslate('Edit Profile'), + ), + trailing: chevronButton(context: context), + onTap: () { + navigationService + .pushScreen(Routes.editProfilePage); + }, + ), + ], + ) + : Container(), + category( + context: context, + title: 'General', + listItems: [ + const ChangeThemeTile(), + const LanguageTile(), + ], + ), + category( + context: context, + title: 'Help & Support', + listItems: [ + customListTile( + leading: const Icon(Icons.description), + content: Text( + AppLocalizations.of(context)! + .strictTranslate('Talawa Docs'), + ), + trailing: chevronButton( + context: context, + ), + onTap: () { + model.launchWebsite(talawaDocs); + }, + ), + customListTile( + leading: const Icon(Icons.code), + content: Text( + AppLocalizations.of(context)! + .strictTranslate('Talawa GitHub'), + ), + trailing: chevronButton( + context: context, + ), + onTap: () { + model.launchWebsite(talawaGithub); + }, + ), + ], + ), + ], + ), + ), + ), + footerTile(context: context, model: model), + ], + ), + ), + ); + }, + ); + } + + /// Generates an Icon widget for a chevron (right arrow). + /// + /// **params**: + /// * `context`: The BuildContext of the widget used to derive the theme's primary color. + /// + /// **returns**: + /// * `Icon`: An Icon widget representing a chevron (right arrow). + Icon chevronButton({required BuildContext context}) { + return Icon( + Icons.chevron_right, + color: Theme.of(context).colorScheme.primary, + ); + } + + /// Custom List Tile Widget. + /// + /// This widget creates a custom list tile with customizable components such as + /// leading, content, trailing, and an optional onTap callback. + /// + /// **params**: + /// * `leading`: Widget displayed at the start of the list tile. + /// * `content`: Widget displayed as the main content of the list tile. + /// * `trailing`: Widget displayed at the end of the list tile. + /// * `onTap`: Callback function triggered when the list tile is tapped. + /// + /// **returns**: + /// * `Widget`: Returns a ListTile widget customized with the provided components. + Widget customListTile({ + Widget? leading, + required Widget content, + required Widget trailing, + required void Function()? onTap, + }) { + return ListTile( + contentPadding: EdgeInsets.symmetric( + horizontal: SizeConfig.blockSizeHorizontal!, + ), + leading: leading, + title: content, + trailing: trailing, + onTap: onTap, + ); + } + + /// Widget representing a category with a title and a list of items. + /// + /// Displays a category title along with a list of widgets. + /// + /// **params**: + /// * `context`: The [BuildContext] of the widget. + /// * `title`: The title of the category to be displayed. + /// * `listItems`: A list of [Widget]s representing items in the category. + /// + /// **returns**: + /// * `Widget`: A [Padding] widget containing a [Column] with the category title displayed using + /// [catergoryHeader] and followed by the list of `listItems`. + Widget category({ + required BuildContext context, + required String title, + required List listItems, + }) { + return Padding( + padding: + EdgeInsets.symmetric(vertical: SizeConfig.blockSizeVertical! * 1.5), + child: Column( + children: [ + catergoryHeader(context: context, title: title), + ] + + listItems, + ), + ); + } + + /// Creates a header widget for a category. + /// + /// This widget displays a title for a category with a divider line underneath. + /// + /// **params**: + /// * `context`: The [BuildContext] associated with the widget. + /// * `title`: The title string to be displayed for the category. + /// + /// **returns**: + /// * `Widget`: Returns a [Widget] that represents the category header. + Widget catergoryHeader({ + required BuildContext context, + required String title, + }) { + return Padding( + padding: EdgeInsets.only(top: SizeConfig.blockSizeVertical!), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 2), + child: Text( + AppLocalizations.of(context)!.strictTranslate(title), + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith(color: Theme.of(context).colorScheme.primary), + ), + ), + customDivider(context: context), + ], + ), + ); + } + + /// Widget representing a footer tile that performs different actions based on user login status. + /// + /// **params**: + /// * `context`: The [BuildContext] of the widget. + /// * `model`: An instance of [AppSettingViewModel] used for handling app settings. + /// + /// **returns**: + /// * `Widget`: Returns a [Column] widget displaying a divider and a [TextButton] that varies its behavior based on user login status. + Widget footerTile({ + required BuildContext context, + required AppSettingViewModel model, + }) { + return Column( + children: [ + customDivider(context: context), + TextButton( + key: const Key('Logout'), + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + userConfig.loggedIn + ? const Icon( + Icons.logout, + color: Colors.red, + ) + : Icon( + Icons.add, + color: Theme.of(context).colorScheme.secondary, + ), + SizedBox( + width: SizeConfig.blockSizeHorizontal! * 3, + ), + Text( + AppLocalizations.of(context)!.strictTranslate( + userConfig.loggedIn ? 'Logout' : 'Join an Organisation', + ), + style: Theme.of(context).textTheme.bodyLarge, + ), + ], + ), + ), + onPressed: () { + userConfig.loggedIn + ? showDialog( + context: context, + builder: (context) { + return CustomAlertDialog( + reverse: true, + dialogSubTitle: 'Are you sure you want to logout?', + successText: 'LogOut', + success: () async { + try { + final bool isLogoutSuccessful = + await model.logout(); + if (!isLogoutSuccessful) { + throw Error(); //checks whether the logout was successful or not. + } + navigationService.pop(); + navigationService.removeAllAndPush( + Routes.setUrlScreen, + Routes.splashScreen, + arguments: '', + ); + } catch (e) { + navigationService.pushDialog( + const TalawaErrorDialog( + 'Unable to logout, please try again.', + key: Key('TalawaError'), + messageType: MessageType.error, + ), + ); + } + }, + ); + }, + ) + : navigationService.pushScreen( + Routes.setUrlScreen, + arguments: '', + ); + }, + ), + ], + ); + } + + /// Builds a customized Divider widget based on the provided [BuildContext]. + /// + /// This function creates a Divider widget using the provided [context] to obtain + /// the appropriate divider color from the current app's theme. + /// + /// **params**: + /// * `context`: The BuildContext used to access the current app's theme. + /// + /// **returns**: + /// * `Widget`: Returns a Divider widget customized with the color from the app's theme. + Widget customDivider({ + required BuildContext context, + }) { + return Divider( + color: Theme.of(context).dividerColor, + ); + } +} diff --git a/lib/views/after_auth_screens/chat/chat_list_screen.dart b/lib/views/after_auth_screens/chat/chat_list_screen.dart new file mode 100644 index 000000000..d872a7266 --- /dev/null +++ b/lib/views/after_auth_screens/chat/chat_list_screen.dart @@ -0,0 +1,54 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/views/after_auth_screens/chat/direct_chats.dart'; +import 'package:talawa/views/after_auth_screens/chat/select_contact.dart'; + +/// ChatPage returns a stateless widget. +/// +/// That renders a list of users with whom the current user has chatted. +class ChatPage extends StatelessWidget { + const ChatPage({super.key}); + + @override + Widget build(BuildContext context) { + return DefaultTabController( + length: 1, + child: Scaffold( + appBar: AppBar( + backgroundColor: Theme.of(context).primaryColor, + elevation: 0.0, + centerTitle: true, + title: Text( + "Chats", + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + bottom: const TabBar( + tabs: [ + Tab( + text: "Direct", + ), + ], + ), + ), + // returns a tabs on the top for current user to switch between DirectChats and EventChats. + body: const TabBarView( + children: [ + DirectChats(), + ], + ), + floatingActionButton: FloatingActionButton( + // onPressed to FloatingActionButton renders SelectContact Widget to chat with other users in the connection. + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => const SelectContact()), + ); + }, + child: const Icon(Icons.add), + ), + ), + ); + } +} diff --git a/lib/views/after_auth_screens/chat/chat_message_screen.dart b/lib/views/after_auth_screens/chat/chat_message_screen.dart new file mode 100644 index 000000000..7d8b86b8c --- /dev/null +++ b/lib/views/after_auth_screens/chat/chat_message_screen.dart @@ -0,0 +1,79 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/view_model/after_auth_view_models/chat_view_models/direct_chat_view_model.dart'; +import 'package:talawa/views/after_auth_screens/chat/widgets/chat_input_field.dart'; +import 'package:talawa/views/after_auth_screens/chat/widgets/chat_message_bubble.dart'; +import 'package:talawa/views/base_view.dart'; + +/// ChatMessageScreen returns a StatelessWidget for showing the chat message screen. +class ChatMessageScreen extends StatelessWidget { + const ChatMessageScreen({ + super.key, + required this.chatId, + required this.model, + }); + + final String chatId; + final DirectChatViewModel model; + + @override + Widget build(BuildContext context) { + model.getChatMessages(chatId); + model.chatName(chatId); + return Scaffold( + appBar: AppBar( + automaticallyImplyLeading: false, + title: Row( + children: [ + IconButton( + icon: const Icon(Icons.arrow_back), + onPressed: () => Navigator.pop(context), + ), + SizedBox(width: SizeConfig.safeBlockHorizontal! * 3), + CircleAvatar( + backgroundColor: Colors.white, + radius: SizeConfig.blockSizeVertical! * 2.3, + ), + SizedBox(width: SizeConfig.safeBlockHorizontal! * 3), + Text('${model.name}'), + ], + ), + ), + body: BaseView( + onModelReady: (model) => model.getChatMessages(chatId), + builder: (context, model, child) => + (Provider.of(context).chatState == + ChatState.complete) + ? Column( + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.safeBlockHorizontal! * 3, + ), + child: ListView.builder( + itemCount: model.chatMessagesByUser[chatId]!.length, + itemBuilder: (context, index) { + return Message( + message: + model.chatMessagesByUser[chatId]![index], + ); + }, + ), + ), + ), + ChatInputField(chatId: chatId, model: model), + ], + ) + : const Center( + child: CircularProgressIndicator(), + ), + ), + ); + } +} diff --git a/lib/views/after_auth_screens/chat/direct_chats.dart b/lib/views/after_auth_screens/chat/direct_chats.dart new file mode 100644 index 000000000..e76cd37f8 --- /dev/null +++ b/lib/views/after_auth_screens/chat/direct_chats.dart @@ -0,0 +1,53 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/chats/chat_list_tile_data_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/chat_view_models/direct_chat_view_model.dart'; +import 'package:talawa/views/base_view.dart'; + +/// DirectChats return a statelessWidget for rendering all the directs +/// chats of the current user in the Chat List Screen +class DirectChats extends StatelessWidget { + const DirectChats({super.key}); + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(), + builder: (context, model, child) { + return ListView.builder( + // key: model.listKey, + itemCount: model.chats.length, + itemBuilder: (context, index) { + return ChatTile( + chat: model.chats[index], + model: model, + ); + }, + ); + }, + ); + } +} + +/// ChatTile return a widget for a tile in the list of Direct Chats in the Chat List Screen. +class ChatTile extends StatelessWidget { + const ChatTile({super.key, required this.chat, required this.model}); + + final ChatListTileDataModel chat; + final DirectChatViewModel model; + @override + Widget build(BuildContext context) { + return ListTile( + onTap: () => navigationService + .pushScreen(Routes.chatMessageScreen, arguments: [chat.id, model]), + leading: const CircleAvatar( + radius: 20, + ), + title: Text(chat.users![0].firstName!), + ); + } +} diff --git a/lib/views/after_auth_screens/chat/select_contact.dart b/lib/views/after_auth_screens/chat/select_contact.dart new file mode 100644 index 000000000..180abe47c --- /dev/null +++ b/lib/views/after_auth_screens/chat/select_contact.dart @@ -0,0 +1,71 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/view_model/after_auth_view_models/chat_view_models/select_contact_view_model.dart'; +import 'package:talawa/views/base_view.dart'; + +/// SelectContact returns a widget that has mutable state _SelectContactState. +class SelectContact extends StatefulWidget { + const SelectContact({super.key}); + + @override + _SelectContactState createState() => _SelectContactState(); +} + +/// _SelectContactState returns a widget that renders the list of the users that current user can chat with. +class _SelectContactState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + elevation: 0.0, + backgroundColor: Colors.black, + centerTitle: true, + leading: IconButton( + icon: const Icon(Icons.arrow_back), + onPressed: () { + navigationService.pop(); + }, + ), + title: Text( + "Select Contacts", + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + ), + body: BaseView( + onModelReady: (model) async { + model.initialise(); + await model.getCurrentOrgUsersList(); + }, + builder: (context, model, child) { + return ListView.builder( + itemCount: model.orgMembersList.length, + itemBuilder: (context, index) { + return GestureDetector( + key: Key('select_contact_gesture_$index'), + onTap: () { + // Navigator.push(context, MaterialPageRoute(builder: (context)=>ChatMessageScreen(chat: ChatListTileDataModel(ChatUser(model.orgMembersList[index].firstName,model.orgMembersList[index].id,model.orgMembersList[index].image),null,0)))); + }, + child: Container( + child: Padding( + padding: const EdgeInsets.all(5.0), + child: ListTile( + leading: const CircleAvatar( + radius: 25, + ), + title: Text( + model.orgMembersList[index].firstName.toString(), + ), + ), + ), + ), + ); + }, + ); + }, + ), + ); + } +} diff --git a/lib/views/after_auth_screens/chat/widgets/chat_input_field.dart b/lib/views/after_auth_screens/chat/widgets/chat_input_field.dart new file mode 100644 index 000000000..c9606800d --- /dev/null +++ b/lib/views/after_auth_screens/chat/widgets/chat_input_field.dart @@ -0,0 +1,114 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/view_model/after_auth_view_models/chat_view_models/direct_chat_view_model.dart'; + +/// ChatInputField returns a widget that has mutable state _ChatInputFieldState. +class ChatInputField extends StatefulWidget { + const ChatInputField({ + required this.chatId, + required this.model, + super.key, + }); + + /// DirectChatViewModel instance. + final DirectChatViewModel model; + + /// ChatId. + final String chatId; + + @override + State createState() => _ChatInputFieldState(); +} + +/// _ChatInputFieldState is a mutable state which return a widget for Input Field in Chat section. +class _ChatInputFieldState extends State { + // controllers are a means to give control to the parent widget over its child state + /// TextEditingController for input field. + final controller = TextEditingController(); + + @override + // dispose function declaration + void dispose() { + controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + // return a container + return Container( + // styling + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.blockSizeHorizontal! * 2, + vertical: SizeConfig.blockSizeVertical!, + ), + // input field decoration + decoration: BoxDecoration( + // background theme for text field + color: Theme.of(context).scaffoldBackgroundColor, + // box shadow + boxShadow: [ + BoxShadow( + offset: const Offset(0, 4), + blurRadius: 32, + color: const Color(0xFF087949).withOpacity(0.08), + ), + ], + ), + child: Row( + children: [ + Expanded( + child: Container( + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.blockSizeHorizontal! * 3, + ), + decoration: BoxDecoration( + color: Theme.of(context).primaryColor, + borderRadius: BorderRadius.circular(40), + ), + child: Row( + children: [ + SizedBox(width: SizeConfig.blockSizeHorizontal), + Expanded( + // TextField is commonly used text input widget that + //allows users to collect inputs from the keyboard into an app. + child: TextField( + key: const Key('InputFieldKey'), + controller: controller, + decoration: InputDecoration( + enabledBorder: InputBorder.none, + disabledBorder: InputBorder.none, + focusedBorder: InputBorder.none, + suffixIcon: GestureDetector( + key: const Key('InputFieldGestureKey'), + onTap: () { + widget.model.sendMessageToDirectChat( + widget.chatId, + controller.text, + ); + controller.clear(); + }, + child: Icon( + Icons.send, + color: Theme.of(context) + .textTheme + .bodyLarge! + .color! + .withOpacity(0.64), + ), + ), + // Placeholder text for the text field + hintText: "Type a message", + border: InputBorder.none, + ), + ), + ), + ], + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/views/after_auth_screens/chat/widgets/chat_message_bubble.dart b/lib/views/after_auth_screens/chat/widgets/chat_message_bubble.dart new file mode 100644 index 000000000..6487db912 --- /dev/null +++ b/lib/views/after_auth_screens/chat/widgets/chat_message_bubble.dart @@ -0,0 +1,65 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/chats/chat_message.dart'; +import 'package:talawa/services/size_config.dart'; + +/// Message returns a widget for chat message in the bubble form. +class Message extends StatelessWidget { + const Message({super.key, required this.message}); + + final ChatMessage message; + + @override + Widget build(BuildContext context) { + // styling + return Padding( + padding: EdgeInsets.only(top: SizeConfig.safeBlockVertical! * 2), + child: Row( + mainAxisAlignment: + message.sender!.firstName == userConfig.currentUser.firstName + ? MainAxisAlignment.end + : MainAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.safeBlockHorizontal! * 2, + vertical: SizeConfig.blockSizeVertical! * 1.2, + ), + decoration: BoxDecoration( + // if the message is sent by current user, then the background color will be white else green + color: + message.sender!.firstName == userConfig.currentUser.firstName + ? Colors.white + : Colors.green, + borderRadius: + message.sender!.firstName == userConfig.currentUser.firstName + ? const BorderRadius.only( + bottomRight: Radius.circular(15), + topLeft: Radius.circular(15), + bottomLeft: Radius.circular(15), + ) + : const BorderRadius.only( + bottomRight: Radius.circular(15), + topRight: Radius.circular(15), + bottomLeft: Radius.circular(15), + ), + ), + child: Text( + message.messageContent!, + // if the message is sent by current user, then the text color will be black else theme bodyText color + style: TextStyle( + color: message.sender!.firstName == + userConfig.currentUser.firstName + ? Colors.black + : Theme.of(context).textTheme.bodyLarge!.color, + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/views/after_auth_screens/events/create_custom_recurring_event.dart b/lib/views/after_auth_screens/events/create_custom_recurring_event.dart new file mode 100644 index 000000000..5edd07ab2 --- /dev/null +++ b/lib/views/after_auth_screens/events/create_custom_recurring_event.dart @@ -0,0 +1,232 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/constants/recurrence_values.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/widgets/create_recurring_event_helper_widgets.dart'; +import 'package:talawa/widgets/custom_weekday_selector.dart'; + +/// custom padding. +final _sectionPadding = SizeConfig.blockSizeHorizontal! * 8; + +/// Widget to build custom recurrence page. +class CustomRecurrencePage extends StatefulWidget { + const CustomRecurrencePage({super.key, required this.model}); + + /// Instance of create event view model. + final CreateEventViewModel model; + + @override + State createState() => _CustomRecurrencePageState(); +} + +class _CustomRecurrencePageState extends State { + /// Instance of create event view model. + late CreateEventViewModel viewModel; + + @override + Widget build(BuildContext context) { + viewModel = widget.model; + return Scaffold( + appBar: AppBar( + backgroundColor: Theme.of(context).primaryColor, + elevation: 1, + centerTitle: true, + title: Text( + AppLocalizations.of(context)!.strictTranslate('Custom recurrence'), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + actions: [ + TextButton( + onPressed: () { + if (viewModel.eventEndType == EventEndTypes.never) { + viewModel.setEventEndDate(null); + } else if (viewModel.eventEndType == EventEndTypes.on) { + viewModel.eventEndDate = viewModel.eventEndOnEndDate; + } else if (viewModel.eventEndType == EventEndTypes.after) { + viewModel.recurranceCount = + int.parse(viewModel.endOccurenceController.text); + } + navigationService.pop(); + }, + child: Text(AppLocalizations.of(context)!.strictTranslate('Done')), + ), + ], + ), + body: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: _buildRecurrenceOptions(context), + ), + ); + } + + /// Utility to build recurrence options widgets. + /// + /// **params**: + /// * `context`: BuildContext of the widget. + /// + /// **returns**: + /// * `Column`: Column of recurrence options widgets. + Column _buildRecurrenceOptions(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: EdgeInsets.all(_sectionPadding), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + inputFieldHeading('Repeats every'), + _section1InputFields(), + ], + ), + ), + recurrenceisDailyorYearly() + ? buildCustomDivider(context) + : Column( + children: [ + buildCustomDivider(context), + Container( + padding: EdgeInsets.fromLTRB( + _sectionPadding, + _sectionPadding, + 90, + _sectionPadding, + ), + child: viewModel.recurranceFrequency == Recurrance.monthly + ? Row( + children: [ + RecurrenceFrequencyDropdown( + model: viewModel, + options: [ + 'Monthly on day 3', + 'Monthly on the first Sunday', + ], + selectedOption: viewModel.monthlyRecurrence, + onSelected: (String value) { + setState(() { + viewModel.monthlyRecurrence = value; + }); + }, + ), + ], + ) + : Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + inputFieldHeading('Repeats on'), + CustomWeekDaySelector( + model: viewModel, + ), + ], + ), + ), + buildCustomDivider(context), + ], + ), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Padding( + padding: + EdgeInsets.only(top: _sectionPadding, left: _sectionPadding), + child: inputFieldHeading('Ends'), + ), + EventEndOptions( + model: viewModel, + ), + ], + ), + ], + ); + } + + /// Input Fields of repeats every section. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Row`: Row of Custom input fields. + Row _section1InputFields() { + return Row( + children: [ + SizedBox( + width: SizeConfig.screenWidth! * 0.15, + child: CustomTextField( + key: const Key('inputsection1TextField'), + maxTextLength: 2, + textEditingController: viewModel.repeatsEveryCountController, + ), + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.03, + ), + RecurrenceFrequencyDropdown( + model: viewModel, + options: [ + Recurrance.daily, + Recurrance.weekly, + Recurrance.monthly, + Recurrance.yearly, + ], + selectedOption: viewModel.recurranceFrequency, + onSelected: (String value) { + setState(() { + viewModel.recurranceFrequency = value; + }); + }, + ), + ], + ); + } + + /// Custom heading for input fields. + /// + /// **params**: + /// * `title`: Text displayed as heading. + /// + /// **returns**: + /// * `Container`: Container containing the heading text. + Container inputFieldHeading(String title) => Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text(title), + const SizedBox( + height: 12, + ), + ], + ), + ); + + /// Divider with custom properties. + /// + /// **params**: + /// * `context`: BuildContext of the widget. + /// + /// **returns**: + /// * `Divider`: Custom divider. + Divider buildCustomDivider(BuildContext context) { + return Divider( + color: Theme.of(context).hintColor, + ); + } + + /// Determines whether the recurrence frequency is daily or yearly. + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `bool`: A boolean value indicating whether the recurrence frequency is daily or yearly. + bool recurrenceisDailyorYearly() { + final widgetModel = viewModel; + return widgetModel.recurranceFrequency == Recurrance.daily || + widgetModel.recurranceFrequency == Recurrance.yearly; + } +} 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..caac2c137 --- /dev/null +++ b/lib/views/after_auth_screens/events/create_event_form.dart @@ -0,0 +1,125 @@ +// ignore_for_file: talawa_good_doc_comments, talawa_api_doc +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'; + +/// CreateEventForm returns a widget of a Form for creating events in the organization. +/// This widget is used in CreateEventPage widget. +class CreateEventForm extends StatelessWidget { + const CreateEventForm({super.key, required this.model}); + final CreateEventViewModel model; + @override + Widget build(BuildContext context) { + // Form class is a container for grouping together multiple form field widgets. + return Form( + key: model.formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Text field for event title. + TextFormField( + key: const Key('create_event_form_tff1'), + textInputAction: TextInputAction.next, + controller: model.eventTitleTextController, + keyboardType: TextInputType.name, + maxLength: 20, + focusNode: model.titleFocus, + validator: (value) => Validator.validateEventForm(value!, 'Title'), + decoration: InputDecoration( + // placeholder of the text field + labelText: AppLocalizations.of(context)! + .strictTranslate('Add Event Title'), + isDense: true, + labelStyle: Theme.of(context).textTheme.titleMedium, + 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, + ), + // Text field for the location. + TextFormField( + key: const Key('create_event_form_tff2'), + textInputAction: TextInputAction.next, + keyboardType: TextInputType.streetAddress, + controller: model.eventLocationTextController, + focusNode: model.locationFocus, + validator: (value) => + Validator.validateEventForm(value!, 'Location'), + decoration: InputDecoration( + hintText: AppLocalizations.of(context)! + .strictTranslate('Where is the event?'), + labelText: + AppLocalizations.of(context)!.strictTranslate('Add Location'), + labelStyle: Theme.of(context).textTheme.titleMedium, + 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, + ), + // Text field for event description. + TextFormField( + key: const Key('create_event_form_tff3'), + keyboardType: TextInputType.multiline, + controller: model.eventDescriptionTextController, + focusNode: model.descriptionFocus, + validator: (value) => + Validator.validateEventForm(value!, 'Description'), + maxLines: 10, + minLines: 1, + decoration: InputDecoration( + hintText: AppLocalizations.of(context)! + .strictTranslate('Describe the event'), + labelText: AppLocalizations.of(context)! + .strictTranslate('Add Description'), + labelStyle: Theme.of(context).textTheme.titleMedium, + 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..ba5f2a770 --- /dev/null +++ b/lib/views/after_auth_screens/events/create_event_page.dart @@ -0,0 +1,425 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/constants/recurrence_values.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.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/utils/validators.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart'; +import 'package:talawa/view_model/main_screen_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/add_members_bottom_sheet.dart'; +import 'package:talawa/widgets/date_time_picker.dart'; +import 'package:talawa/widgets/event_date_time_tile.dart'; +import 'package:talawa/widgets/member_name_tile.dart'; +import 'package:talawa/widgets/recurrence_dialog.dart'; + +/// CreateEventPage returns a widget that has mutable state _CreateEventPageState. +class CreateEventPage extends StatefulWidget { + const CreateEventPage({super.key}); + + @override + _CreateEventPageState createState() => _CreateEventPageState(); +} + +/// _CreateEventPageState returns a widget for a Page to Creatxe the Event in the Organization. +class _CreateEventPageState extends State { + /// Recurrence label of recurrence selection button. + String recurrenceLabel = Recurrance.once; + @override + Widget build(BuildContext context) { + final TextStyle subtitleTextStyle = + Theme.of(context).textTheme.headlineSmall!.copyWith(fontSize: 16); + final navigationServiceLocal = locator(); + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + print(model.recurrance); + return Scaffold( + // AppBar is the header of the page + appBar: AppBar( + backgroundColor: Theme.of(context).primaryColor, + elevation: 1, + centerTitle: true, + leading: GestureDetector( + onTap: () { + // ignore: undefined_method + navigationServiceLocal.pop(); + }, + child: const Icon(Icons.close), + ), + title: Text( + // text translation to the app language. + AppLocalizations.of(context)!.strictTranslate('Add Event'), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + actions: [ + TextButton( + key: const Key('addButton'), + onPressed: () { + if (userConfig.loggedIn) { + model.createEvent(); + } else { + navigationService.pop(); + MainScreenViewModel.scaffoldKey.currentState?.openDrawer(); + } + }, + child: Text( + AppLocalizations.of(context)!.strictTranslate('Add'), + style: Theme.of(context).textTheme.bodyLarge!.copyWith( + fontSize: 16, + color: Theme.of(context).colorScheme.secondary, + ), + ), + ), + ], + ), + body: Scrollbar( + thickness: 2, + child: SingleChildScrollView( + // SingleChildScrollView is a box in which a single widget can be scrolled. + 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( + key: const Key('txt_btn_cep'), + onPressed: () { + model.getImageFromGallery(); + }, + child: Text( + AppLocalizations.of(context)! + .strictTranslate("Add Image"), + style: subtitleTextStyle, + ), + ), + ], + ), + // If the image for the event is selected or not null. + model.imageFile != null + ? Container( + // Container for rendering the selected image + height: 300, + padding: const EdgeInsets.all(8.0), + child: Stack( + children: [ + Image.file( + model.imageFile!, + fit: BoxFit.fitWidth, + width: MediaQuery.of(context).size.width, + ), + Positioned( + right: 5, + top: 5, + child: IconButton( + onPressed: () => model.removeImage(), + icon: const Icon( + Icons.cancel, + color: Colors.black, + ), + ), + ), + ], + ), + ) + : Container(), + const Divider(), + CreateEventForm( + // CreateEventForm returns a widget of a Form for creating events. + // This widget is exported from `lib/views/after_auth_screens/events/create_event_form.dart`. + model: model, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + const Divider(), + Text( + // translation of the text to app language. + AppLocalizations.of(context)! + .strictTranslate('Select Start Date and Time'), + style: subtitleTextStyle, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + // DateTimeTile is custom widget that returns a tile to select date and time. + // You can learn more about DateTimeTile from [here](lib/widgets/date_time_picker.dart). + DateTimeTile( + // variables and member functions initialisation. + date: "${model.eventStartDate.toLocal()}".split(' ')[0], + time: model.eventStartTime.format(context), + setDate: () async { + final date = await customDatePicker( + initialDate: model.eventStartDate, + ); + if (date.isBefore(DateTime.now())) { + navigationServiceLocal.showSnackBar( + "Cannot create events having date prior than today ", + ); + } + setState(() { + model.eventStartDate = date; + }); + }, + setTime: () async { + print(model.eventStartDate); + final time = await customTimePicker( + initialTime: model.eventStartTime, + ); + // print(model.eventStartTime); + final validationError = Validator.validateEventTime( + time, + model.eventEndTime, + ); + print('hi'); + if (validationError != null) { + navigationService.showTalawaErrorSnackBar( + 'Start time must be before end time', + MessageType.error, + ); + } else { + setState(() { + model.eventStartTime = time; + }); + } + }, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.026, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate('Select End Date and Time'), + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith(fontSize: 16), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + DateTimeTile( + key: const Key('key for test cep'), + date: "${model.eventEndDate?.toLocal() ?? DateTime.now()}" + .split(' ')[0], + time: model.eventEndTime.format(context), + setDate: () async { + final date = await customDatePicker( + initialDate: model.eventEndDate ?? DateTime.now(), + ); + final startDate = model.eventStartDate; + if (startDate.compareTo(date) < 0) { + setState(() { + model.eventEndDate = date; + }); + } else { + // ignore: undefined_method + navigationServiceLocal.showSnackBar( + "End Date cannot be after start date ", + ); + } + }, + setTime: () async { + final time = await customTimePicker( + initialTime: model.eventEndTime, + ); + final validationError = Validator.validateEventTime( + model.eventStartTime, + time, + ); + final showSnackBar = + navigationService.showTalawaErrorSnackBar; + if (validationError != null) { + showSnackBar( + 'Start time must be before end time', + MessageType.error, + ); + } else { + setState(() { + model.eventEndTime = time; + }); + } + }, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.026, + ), + InkWell( + child: Row( + children: [ + const Icon(Icons.restore), + SizedBox( + width: SizeConfig.screenWidth! * 0.045, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate(recurrenceLabel), + style: subtitleTextStyle, + ), + ], + ), + onTap: () async { + final String? selectedReccurence; + selectedReccurence = await showDialog( + context: context, + builder: (context) { + return ShowRecurrenceDialog( + model: model, + initialRecurrence: recurrenceLabel, + ); + }, + ); + setState(() { + recurrenceLabel = selectedReccurence!; + }); + }, + ), + SizedBox(height: SizeConfig.screenHeight! * 0.026), + const Divider(), + SizedBox( + width: SizeConfig.screenWidth, + child: Wrap( + alignment: WrapAlignment.spaceBetween, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + 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, + ), + ], + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + AppLocalizations.of(context)! + .strictTranslate('All day'), + style: subtitleTextStyle, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.005, + ), + Switch( + // Switch to select the visibility of the event. + value: model.isAllDay, + onChanged: (value) { + setState(() { + model.isAllDay = value; + print(model.isAllDay); + }); + }, + activeColor: + Theme.of(context).colorScheme.primary, + ), + ], + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + AppLocalizations.of(context)! + .strictTranslate('Keep Public'), + style: subtitleTextStyle, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.005, + ), + Switch( + // Switch to select the visibility of the event. + value: model.isPublicSwitch, + onChanged: (value) { + setState(() { + model.isPublicSwitch = value; + print(model.isPublicSwitch); + }); + }, + activeColor: + Theme.of(context).colorScheme.primary, + ), + ], + ), + ], + ), + ), + SizedBox(height: SizeConfig.screenHeight! * 0.026), + const Divider(), + InkWell( + key: const Key('inwell_cep2'), + onTap: () { + EventBottomSheet().addUserBottomSheet( + context: context, + model: model, + ); + }, + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + AppLocalizations.of(context)! + .strictTranslate("Add Members"), + style: subtitleTextStyle, + ), + Icon( + Icons.add, + color: Theme.of(context).colorScheme.secondary, + ), + ], + ), + ), + Wrap( + children: model.selectedMembers + .map( + (user) => MemberNameTile( + userName: "${user.firstName!} ${user.lastName!}", + userImage: user.image, + onDelete: () { + model.removeUserFromList( + userId: user.id!, + ); + }, + ), + ) + .toList() + .cast(), + ), + ], + ), + ), + ), + ), + ); + }, + ); + } +} diff --git a/lib/views/after_auth_screens/events/edit_event_page.dart b/lib/views/after_auth_screens/events/edit_event_page.dart new file mode 100644 index 000000000..6a87ceb03 --- /dev/null +++ b/lib/views/after_auth_screens/events/edit_event_page.dart @@ -0,0 +1,238 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.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/view_model/after_auth_view_models/event_view_models/edit_event_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/edit_events_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'; + +/// EditEventPage returns a widget that has mutable state _EditEventPageState. +class EditEventPage extends StatefulWidget { + const EditEventPage({super.key, required this.event}); + final Event event; + + @override + _EditEventPageState createState() => _EditEventPageState(); +} + +/// _EditEventPageState returns a widget to edit the +/// event that is being posted by the current user. +class _EditEventPageState extends State { + @override + Widget build(BuildContext context) { + final TextStyle subtitleTextStyle = + Theme.of(context).textTheme.headlineSmall!.copyWith(fontSize: 16); + return BaseView( + onModelReady: (model) => model.initialize(widget.event), + builder: (context, model, child) { + return Scaffold( + appBar: AppBar( + // returns a header for the page. + backgroundColor: Theme.of(context).primaryColor, + elevation: 1, + centerTitle: true, + leading: GestureDetector( + onTap: () { + navigationService.pop(); + }, + child: const Icon(Icons.close), + ), + // Title of the app bar(header). + title: Text( + 'Edit Event', + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + actions: [ + // Button for "Done". + TextButton( + onPressed: () { + model.updateEvent(); + }, + child: Text( + AppLocalizations.of(context)!.strictTranslate('Done'), + style: Theme.of(context).textTheme.bodyLarge!.copyWith( + fontSize: 16, + color: Theme.of(context).colorScheme.secondary, + ), + ), + ), + ], + ), + body: SingleChildScrollView( + // SingleChildScrollView is a box in which a single widget can be scrolled. + 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("Add Image", style: subtitleTextStyle), + ), + ], + ), + const Divider(), + EditEventForm( + // EditEventForm returns a widget of a Form for editing the event. + // This widget is exported from `lib/views/after_auth_screens/events/edit_events_form.dart`. + model: model, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + const Divider(), + Text('Select Start Date and Time', style: subtitleTextStyle), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + // DateTimeTile is custom widget that returns a tile to select date and time. + // You can learn more about DateTimeTile from [here](lib/widgets/date_time_picker.dart). + DateTimeTile( + // variables and member functions initialisation. + date: "${model.eventStartDate.toLocal()}".split(' ')[0], + time: model.eventStartTime.format(context), + setDate: () async { + final date = await customDatePicker( + initialDate: model.eventStartDate, + ); + setState(() { + model.eventStartDate = date; + }); + }, + setTime: () async { + final time = await customTimePicker( + initialTime: model.eventStartTime, + ); + + setState(() { + model.eventStartTime = time; + }); + }, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.026, + ), + Text( + 'Select End Date and Time', + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith(fontSize: 16), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + DateTimeTile( + date: "${model.eventEndDate.toLocal()}".split(' ')[0], + time: model.eventEndTime.format(context), + setDate: () async { + final date = await customDatePicker( + initialDate: model.eventEndDate, + ); + setState(() { + model.eventEndDate = date; + }); + }, + setTime: () async { + final time = await customTimePicker( + initialTime: model.eventEndTime, + ); + + setState(() { + model.eventEndTime = time; + }); + }, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.026, + ), + Row( + children: [ + const Icon(Icons.restore), + SizedBox( + width: SizeConfig.screenWidth! * 0.045, + ), + Text('Does not repeat', style: subtitleTextStyle), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.026, + ), + const Divider(), + SizedBox( + width: SizeConfig.screenWidth, + child: Wrap( + alignment: WrapAlignment.spaceBetween, + children: [ + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text('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, + ), + ], + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + '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/edit_events_form.dart b/lib/views/after_auth_screens/events/edit_events_form.dart new file mode 100644 index 000000000..68f7f514d --- /dev/null +++ b/lib/views/after_auth_screens/events/edit_events_form.dart @@ -0,0 +1,135 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/validators.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/edit_event_view_model.dart'; + +/// EditEventForm returns a widget of a Form for editing an event. +/// This widget is used in EditEventPage widget. +class EditEventForm extends StatelessWidget { + const EditEventForm({super.key, required this.model}); + final EditEventViewModel model; + @override + Widget build(BuildContext context) { + // Form class is a container for grouping together multiple form field widgets. + return Form( + key: model.formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Text field for event title. + TextFormField( + textInputAction: TextInputAction.next, + controller: model.eventTitleTextController, + keyboardType: TextInputType.name, + maxLength: 20, + focusNode: model.titleFocus, + validator: (value) => Validator.validateEventForm(value!, 'Title'), + decoration: InputDecoration( + labelText: 'Add Event Title', + isDense: true, + labelStyle: Theme.of(context).textTheme.titleMedium, + 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, + ), + ), + suffixIcon: IconButton( + onPressed: () { + FocusScope.of(context).requestFocus(model.titleFocus); + }, + icon: const Icon(Icons.edit), + ), + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + // Text field for the location. + TextFormField( + textInputAction: TextInputAction.next, + keyboardType: TextInputType.streetAddress, + controller: model.eventLocationTextController, + focusNode: model.locationFocus, + validator: (value) => + Validator.validateEventForm(value!, 'Location'), + decoration: InputDecoration( + hintText: 'Where is the event?', + labelText: 'Add Location', + labelStyle: Theme.of(context).textTheme.titleMedium, + 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, + ), + ), + suffixIcon: IconButton( + onPressed: () { + FocusScope.of(context).requestFocus(model.locationFocus); + }, + icon: const Icon(Icons.edit), + ), + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + // Text field for event description. + TextFormField( + keyboardType: TextInputType.multiline, + controller: model.eventDescriptionTextController, + focusNode: model.descriptionFocus, + validator: (value) => + Validator.validateEventForm(value!, 'Description'), + maxLines: 10, + minLines: 1, + decoration: InputDecoration( + hintText: 'Describe the event', + labelText: 'Add Description', + labelStyle: Theme.of(context).textTheme.titleMedium, + 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, + ), + ), + suffixIcon: IconButton( + onPressed: () { + FocusScope.of(context).requestFocus(model.descriptionFocus); + }, + icon: const Icon(Icons.edit), + ), + ), + ), + ], + ), + ); + } +} diff --git a/lib/views/after_auth_screens/events/event_calendar.dart b/lib/views/after_auth_screens/events/event_calendar.dart new file mode 100644 index 000000000..e444b6271 --- /dev/null +++ b/lib/views/after_auth_screens/events/event_calendar.dart @@ -0,0 +1,190 @@ +import 'package:flutter/material.dart'; +import 'package:intl/intl.dart'; +import 'package:syncfusion_flutter_calendar/calendar.dart'; +import 'package:syncfusion_flutter_datepicker/datepicker.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/event_calendar_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/date_time_picker.dart'; + +/// EventCalendar returns a widget that has mutable state _EventCalendarState. +class EventCalendar extends StatelessWidget { + const EventCalendar(this.eventList, {super.key}); + + /// List of events that needs to bge passed when the calling this widget. + final List eventList; + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialize(eventList), + builder: (context, model, child) { + print(model.calendarView); + return Scaffold( + // header of the page. + appBar: AppBar( + title: const Text('Event Calendar'), + actions: [ + IconButton( + // button to select the date and time of an event. + onPressed: () async { + // initially pickedDate is initialised with current time. + final pickedDate = + await customDatePicker(initialDate: DateTime.now()); + model.selectionChanged( + DateRangePickerSelectionChangedArgs(pickedDate), + ); + }, + icon: const Icon(Icons.date_range), + ), + calendarViewSelection(model), + ], + ), + body: Column( + children: [ + // SizedBox( + // height: 100, + // // The SfDateRangePicker widget provides four different types of views to display. + // //It can be assigned to the widget constructor by using the view property. + // child: SfDateRangePicker( + // view: DateRangePickerView.month, + // controller: model.dateRangePickerController, + // showNavigationArrow: true, + // allowViewNavigation: false, + // monthViewSettings: const DateRangePickerMonthViewSettings( + // numberOfWeeksInView: 1, + // dayFormat: 'EEE', + // ), + // onSelectionChanged: model.selectionChanged, + // ), + // ), + Expanded( + child: SfCalendar( + view: model.calendarView, + headerHeight: 60, + viewHeaderHeight: 60, + controller: model.calendarController, + dataSource: _getCalendarDataSource(eventList), + onViewChanged: model.viewChanged, + ), + ), + ], + ), + ); + }, + ); + } + + /// Popupmenu Button to select calendar view. + /// + /// **params**: + /// * `model`: EventCalendarViewModel. + /// + /// **returns**: + /// * `PopupMenuButton`: custom PopupMenuButton.. + PopupMenuButton calendarViewSelection(EventCalendarViewModel model) { + final List views = ["Day", "Month", "Schedule"]; + return PopupMenuButton( + itemBuilder: (context) { + return >[ + for (final view in views) + PopupMenuItem( + value: view, + child: Text(view), + ), + ]; + }, + onSelected: (value) { + model.changeView(value); + }, + ); + } +} + +/// function to convert List to Appointment object. +/// +/// Appointment is provided by the calender external library +/// +/// **params**: +/// * `eventsList`: list of events to be converted +/// +/// **returns**: +/// * `_AppointmentDataSource`: Entire data in [](list) format +_AppointmentDataSource _getCalendarDataSource(List eventsList) { + final appointments = []; + final colors = [ + Colors.green, + Colors.blue, + Colors.red, + Colors.orange, + Colors.purple, + Colors.pink, + ]; + int index = 0; + // looping through all the events created in the organization. + eventsList.forEach((event) { + DateTime startDate; + DateTime endDate; + if (event.startDate!.contains('/')) { + startDate = DateFormat('MM/dd/yyyy').parse(event.startDate!); + } else { + startDate = DateFormat('yyyy-MM-dd').parse(event.startDate!); + } + + if (event.endDate!.contains('/')) { + endDate = DateFormat('MM/dd/yyyy').parse(event.endDate!); + } else { + endDate = DateFormat('yyyy-MM-dd').parse(event.endDate!); + } + print("${event.startTime!}##############################"); + final startTime = parseTime(event.startTime ?? '14:23:01'); + final endTime = parseTime(event.endTime ?? '21:23:01'); + + // adding appointments on the calender for event[index] date time. + appointments.add( + Appointment( + startTime: startDate + .add(Duration(hours: startTime.hour, minutes: startTime.minute)), + endTime: + endDate.add(Duration(hours: endTime.hour, minutes: endTime.minute)), + subject: event.title!, + color: colors[index % colors.length], + location: event.location, + id: event.id, + ), + ); + index++; + }); + + return _AppointmentDataSource(appointments); +} + +/// a_line_ending_with_end_punctuation. +/// +/// **params**: +/// * `time`: define_the_param +/// +/// **returns**: +/// * `DateTime`: define_the_return +DateTime parseTime(String time) { + try { + return DateFormat('h:mm a', 'en_US').parse(time); + } on FormatException { + print('Caught FormatException: $time'); + try { + return DateFormat('Hms').parse(time); + } catch (e) { + print('Caught error: $e'); + throw Exception('Invalid time format: $time'); + } + } +} + +/// class for handling the data source. +/// +/// assign the appointments value +class _AppointmentDataSource extends CalendarDataSource { + _AppointmentDataSource(List source) { + appointments = source; + } +} diff --git a/lib/views/after_auth_screens/events/event_filter_bottomsheet.dart b/lib/views/after_auth_screens/events/event_filter_bottomsheet.dart new file mode 100644 index 000000000..a16452148 --- /dev/null +++ b/lib/views/after_auth_screens/events/event_filter_bottomsheet.dart @@ -0,0 +1,150 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/apptheme.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'; + +/// Shows a list of dropdown taken from `model` and `context`. +/// +/// **params**: +/// * `model`: contains the events data +/// * `context`: the overall context of UI +/// +/// **returns**: +/// * `Widget`: the dropdown +Widget dropDownList( + ExploreEventsViewModel model, + BuildContext context, +) { + final Map filters = { + 'All Events': 'Show all events', + 'My Events': 'Show all events created by you', + 'Registered Events': 'Show all events you have registered', + 'Public Events': 'Show events for all', + 'Private Events': 'Show invite-only events', + }; + return SizedBox( + height: SizeConfig.screenHeight, + width: SizeConfig.screenWidth, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.safeBlockHorizontal! * 10, + ), + child: StatefulBuilder( + builder: (_, StateSetter setState) { + return SingleChildScrollView( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox( + height: SizeConfig.safeBlockVertical, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + AppLocalizations.of( + context, + )! + .strictTranslate( + "Filters", + ), + style: Theme.of( + context, + ).textTheme.headlineSmall, + ), + IconButton( + key: const Key('close'), + onPressed: () { + Navigator.pop(context); + }, + icon: const Icon( + Icons.close, + ), + ), + ], + ), + ...List.generate( + filters.length, + (index) { + return Padding( + padding: EdgeInsets.symmetric( + vertical: SizeConfig.safeBlockVertical! * 2, + ), + child: GestureDetector( + onTap: () { + model.choseValueFromDropdown( + filters.keys.toList()[index], + ); + setState(() {}); + }, + child: Container( + key: Key( + filters.keys.toList()[index], + ), + decoration: BoxDecoration( + color: model.chosenValue == + filters.keys.toList()[index] + ? Theme.of(context).colorScheme.secondary + : AppTheme.white, + borderRadius: BorderRadius.all( + Radius.circular( + SizeConfig.safeBlockHorizontal! * 2, + ), + ), + ), + width: SizeConfig.screenWidth! - 60, + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.safeBlockHorizontal! * 5, + vertical: SizeConfig.safeBlockVertical! / 2, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + AppLocalizations.of(context)!.strictTranslate( + filters.keys.toList()[index], + ), + style: Theme.of(context) + .textTheme + .labelLarge! + .copyWith( + color: model.chosenValue == + filters.keys.toList()[index] + ? AppTheme.white + : AppTheme.blackPrimary, + ), + ), + Text( + AppLocalizations.of(context)!.strictTranslate( + filters.values.toList()[index], + ), + style: Theme.of(context) + .textTheme + .labelSmall! + .copyWith( + color: model.chosenValue == + filters.keys.toList()[index] + ? AppTheme.white + : AppTheme.blackSecondary, + ), + ), + ], + ), + ), + ), + ), + ); + }, + ), + ], + ), + ); + }, + ), + ), + ); +} diff --git a/lib/views/after_auth_screens/events/event_info_body.dart b/lib/views/after_auth_screens/events/event_info_body.dart new file mode 100644 index 000000000..c47745a1c --- /dev/null +++ b/lib/views/after_auth_screens/events/event_info_body.dart @@ -0,0 +1,258 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:talawa/enums/enums.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/event_info_view_model.dart'; +import 'package:talawa/widgets/custom_list_tile.dart'; + +/// EventInfoBody returns a stateless widget which describes the body of a particular event. +class EventInfoBody extends StatelessWidget { + const EventInfoBody({super.key}); + + @override + Widget build(BuildContext context) { + // fetching the event data from model + final model = Provider.of(context); + final event = model.event; + // Slivers are special-purpose widgets that can be combined using a + //CustomScrollView to create custom scroll effects. A SliverToBoxAdapter + //is a basic sliver that creates a bridge back to one of the usual box-based widgets. + return SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + padding: EdgeInsets.only( + right: SizeConfig.safeBlockHorizontal! * 15, + ), + child: Row( + children: [ + Flexible( + child: Text( + // event title + event.title!, + style: Theme.of(context) + .textTheme + .headlineMedium! + .copyWith(fontSize: 26), + ), + ), + ], + ), + ), + Positioned( + right: SizeConfig.screenWidth! * 0.002, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + (model.event.creator!.id == userConfig.currentUser.id) + ? IconButton( + onPressed: () => navigationService.pushScreen( + "/editEventPage", + arguments: model.event, + ), + icon: const Icon(Icons.edit), + ) + : Container(), + const Icon(Icons.chat_bubble_outline), + ], + ), + ), + ], + ), + Text( + // Display event creator full name. + "${AppLocalizations.of(context)!.strictTranslate("Created by")}: ${event.creator!.firstName} ${event.creator!.lastName}", + style: Theme.of(context) + .textTheme + .bodyMedium! + .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( + // Display start and end date of the Event. + "${event.startDate!} - ${event.endDate!}", + style: Theme.of(context).textTheme.bodySmall, + ), + const Spacer(), + // If event type is public then renders lock_open icon else renders lock icon. + event.isPublic! + ? Icon( + Icons.lock_open, + size: 13, + color: Theme.of(context).colorScheme.secondary, + ) + : Icon( + Icons.lock, + size: 13, + color: Theme.of(context).colorScheme.primary, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.027, + ), + // If event type is public then renders 'public' + // else renders 'private' text translated into the app language. + event.isPublic! + ? Text( + AppLocalizations.of(context)!.strictTranslate('public'), + style: Theme.of(context).textTheme.bodySmall, + ) + : Text( + AppLocalizations.of(context)! + .strictTranslate('private'), + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.011, + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // display schedule icon with the start and end date of the time. + const Icon( + Icons.schedule, + size: 12, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.025, + ), + Text( + "${event.startTime!} - ${event.endTime!}", + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.011, + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Icon( + Icons.place, + size: 12, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.027, + ), + Text( + event.location!, + style: Theme.of(context).textTheme.bodySmall, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + maxLines: 3, + ), + const Spacer(), + ], + ), + const Divider(), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + Text( + AppLocalizations.of(context)!.strictTranslate("Description"), + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith(fontSize: 16), + ), + SizedBox(width: SizeConfig.screenWidth! * 0.013), + Text( + // Display the Description of the event if not null. + event.description!, + style: Theme.of(context).textTheme.bodySmall, + ), + SizedBox(height: SizeConfig.screenHeight! * 0.013), + Text( + AppLocalizations.of(context)!.strictTranslate("Admins"), + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith(fontSize: 16), + ), + Divider( + color: Theme.of(context).colorScheme.onBackground, + thickness: 2, + ), + ListView.builder( + padding: EdgeInsets.zero, + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: event.admins!.length, + itemBuilder: (BuildContext context, int index) { + return CustomListTile( + key: Key( + '${AppLocalizations.of(context)!.strictTranslate("Admins")}$index', + ), + index: index, + type: TileType.user, + userInfo: event.admins![index], + onTapUserInfo: () {}, + ); + }, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + Text( + AppLocalizations.of(context)!.strictTranslate("Attendees"), + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith(fontSize: 16), + ), + Divider( + color: Theme.of(context).colorScheme.onBackground, + thickness: 2, + ), + if (model.isBusy) + // if the model is still fetching the attendees details then display Circular Progress Indicator Icon. + const Padding( + padding: EdgeInsets.only(top: 12.0), + child: Center(child: CircularProgressIndicator()), + ) + else + // else if the model fetched the attendees details successfully + //then renders all the attendees in ListView. + ListView.builder( + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: model.attendees.length, + itemBuilder: (BuildContext context, int index) { + return CustomListTile( + key: Key( + 'Attendee$index', + ), + index: index, + type: TileType.attendee, + attendeeInfo: model.attendees[index], + onTapAttendeeInfo: () {}, + ); + }, + ), + ], + ), + ), + ); + } +} 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..3e96d7b55 --- /dev/null +++ b/lib/views/after_auth_screens/events/event_info_page.dart @@ -0,0 +1,88 @@ +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/event_info_view_model.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/event_info_body.dart'; +import 'package:talawa/views/base_view.dart'; + +/// EventInfoPage returns a widget that has mutable state _EventInfoPageState. +class EventInfoPage extends StatefulWidget { + const EventInfoPage({super.key, required this.args}); + + /// Takes in Arguments for the Page. + final Map args; + @override + _EventInfoPageState createState() => _EventInfoPageState(); +} + +/// _EventInfoPageState returns a widget of a Page for particular event. +class _EventInfoPageState extends State { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialize(args: widget.args), + builder: (context, model, child) { + return Scaffold( + body: CustomScrollView( + slivers: [ + // SliverAppBar is a Material Design app bar that integrates with a CustomScrollView. + SliverAppBar( + // Translated title of the App bar. + title: Text( + AppLocalizations.of(context)! + .strictTranslate('Event Details'), + ), + // actions: [ + // IconButton( + // // Button to share the event in the social medias. + // icon: const Icon(Icons.share), + // onPressed: () => SocialShare.shareOptions( + // 'https://cyberwake.github.io/applink/eventInvite?setUrl=${GraphqlConfig.orgURI}&selectOrg=${userConfig.currentOrg.id!}&eventId=${model.event.id}', + // ), + // ), + // ], + pinned: true, + expandedHeight: SizeConfig.screenWidth, + flexibleSpace: FlexibleSpaceBar( + background: Image.network( + 'https://picsum.photos/id/26/200/300', + fit: BoxFit.fill, + ), + ), + ), + const EventInfoBody(), + ], + ), + // if the event is created by current user then renders explore + // button in the event page else renders register button. + floatingActionButton: + model.event.creator!.id != userConfig.currentUser.id + ? FloatingActionButton.extended( + onPressed: () { + model.registerForEvent(); + }, + label: Text( + AppLocalizations.of(context)! + .strictTranslate(model.fabTitle), + style: Theme.of(context).textTheme.bodyMedium, + ), + ) + : FloatingActionButton( + onPressed: () { + (widget.args["exploreEventViewModel"] + as ExploreEventsViewModel) + .deleteEvent(eventId: model.event.id!); + }, + foregroundColor: Theme.of(context).colorScheme.secondary, + backgroundColor: Theme.of(context).primaryColor, + child: const Icon( + Icons.delete, + ), + ), + ); + }, + ); + } +} 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..4155a6762 --- /dev/null +++ b/lib/views/after_auth_screens/events/explore_event_dialogue.dart @@ -0,0 +1,157 @@ +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'; + +/// ExploreEventDialog returns a widget that has mutable state _ExploreEventDialogState. +class ExploreEventDialog extends StatefulWidget { + const ExploreEventDialog({required Key key}) : super(key: key); + @override + _ExploreEventDialogState createState() => _ExploreEventDialogState(); +} + +/// _ExploreEventDialogState returns a widget that show explored dialog of the event. +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.symmetric( + horizontal: SizeConfig.screenWidth! * 0.15, + ), + content: SizedBox( + height: SizeConfig.screenHeight! * 0.33, + // width: SizeConfig.screenWidth! * 0.3, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.symmetric(vertical: 6), + child: Column( + children: [ + datePicker( + context, + key: const Key('StartDateSelector'), + title: 'Start Date', + date: _startDate, + onTap: () async { + final date = + await customDatePicker(initialDate: _startDate); + setState(() { + _startDate = date; + }); + }, + ), + datePicker( + context, + key: const Key('EndDateSelector'), + title: 'End Date', + date: _endDate, + onTap: () async { + final date = + await customDatePicker(initialDate: _endDate); + setState(() { + _endDate = date; + }); + }, + ), + ], + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + key: const Key('CancelButton'), + onPressed: () { + navigationService.pop(); + }, + child: Text( + AppLocalizations.of(context)!.strictTranslate('Cancel'), + style: Theme.of(context).textTheme.bodyMedium, + ), + ), + TextButton( + key: const Key('DoneButton'), + onPressed: () { + navigationService.pop(); + }, + child: Text( + AppLocalizations.of(context)!.strictTranslate('Done'), + style: const TextStyle( + fontSize: 14, + color: Color(0xff4285F4), + ), + ), + ), + ], + ), + ], + ), + ), + ); + } + + /// Creates a column with a date picker. + /// + /// **params**: + /// * `context`: A `BuildContext` representing the build context. + /// * `title`: A `String` representing the title of the date picker. + /// * `onTap`: A `void Function()` callback triggered when the date picker is tapped. + /// * `date`: A `DateTime` representing the selected date for the date picker. + /// * `key`: A `Key` to identify and differentiate the date picker widget. + /// + /// **returns**: + /// * `Column`: Returns a `Column` widget containing the date picker elements. + Column datePicker( + BuildContext context, { + required String title, + required void Function()? onTap, + required DateTime date, + required Key key, + }) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + AppLocalizations.of(context)!.strictTranslate(title), + ), + const SizedBox( + height: 5, + ), + GestureDetector( + key: key, + onTap: onTap, + child: SizedBox( + height: SizeConfig.screenHeight! * 0.08, + child: Card( + color: Theme.of(context).colorScheme.primaryContainer, + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + const Padding( + padding: EdgeInsets.symmetric(horizontal: 10), + child: Icon( + Icons.calendar_today, + size: 20, + ), + ), + Expanded( + // shows the end date of the event + child: Text( + "${date.toLocal()}".split(' ')[0], + // maxLines: 1, + ), + ), + ], + ), + ), + ), + ), + ], + ); + } +} 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..119b31553 --- /dev/null +++ b/lib/views/after_auth_screens/events/explore_events.dart @@ -0,0 +1,309 @@ +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/after_auth_view_models/event_view_models/explore_events_view_model.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/event_filter_bottomsheet.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'; +import 'package:talawa/widgets/event_search_delegate.dart'; + +/// Shows the list of events with options to categorize them. +class ExploreEvents extends StatelessWidget { + const ExploreEvents({ + required Key key, + this.homeModel, + }) : super(key: key); + + /// [homeModal] is a type of [MainScreenViewModel] which provides methods to handle the data for this component. + final MainScreenViewModel? homeModel; + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(), + builder: (context, model, child) { + return Scaffold( + appBar: AppBar( + // AppBar returns widget for the header. + backgroundColor: Theme.of(context).primaryColor, + key: const Key( + "ExploreEventsAppBar", + ), + elevation: 0.0, + automaticallyImplyLeading: false, + centerTitle: true, + title: Text( + AppLocalizations.of(context)!.strictTranslate( + 'Explore Events', + ), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + leading: IconButton( + // returns a button of menu icon to redirect to home. + color: Theme.of( + context, + ).iconTheme.color, + icon: const Icon( + Icons.menu, + ), + onPressed: () => + MainScreenViewModel.scaffoldKey.currentState!.openDrawer(), + ), + actions: [ + Padding( + padding: EdgeInsets.only( + right: SizeConfig.screenWidth! * 0.027, + ), + // if the events is not empty then renders button for searching the events else renders just a box. + child: model.events.isNotEmpty + ? IconButton( + onPressed: () { + showSearch( + context: context, + delegate: EventSearch( + eventList: model.events, + exploreEventsViewModel: model, + ), + ); + }, + icon: Icon( + Icons.search, + size: (SizeConfig.safeBlockHorizontal ?? 4) * 5, + ), + ) + : const SizedBox(), + ), + ], + ), + // if the model is still fetching the events list then renders the Circular Progress Indicator + // else render refresh icon along with the list of searched events for exploration. + body: model.isBusy + ? const Center( + child: CircularProgressIndicator(), + ) + : RefreshIndicator( + onRefresh: () async => model.refreshEvents(), + child: Stack( + children: [ + SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.screenWidth! * 0.010, + ), + child: Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + flex: 2, + child: GestureDetector( + onTap: () { + showModalBottomSheet( + context: context, + builder: (_) { + return dropDownList( + model, + context, + ); + }, + ); + }, + child: Card( + color: Theme.of(context) + .colorScheme + .onPrimary, + child: Container( + padding: EdgeInsets.symmetric( + vertical: (SizeConfig + .safeBlockHorizontal ?? + 4) * + 3, + ), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + width: SizeConfig + .safeBlockHorizontal, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate( + "Filters", + ), + ), + SizedBox( + width: SizeConfig + .safeBlockHorizontal, + ), + ], + ), + ), + ), + ), + ), + Expanded( + flex: 3, + child: GestureDetector( + onTap: () { + showDialog( + // on tap open the Explore Event Dialog. + context: context, + builder: (_) { + return const ExploreEventDialog( + key: Key('ExploreEvents'), + ); + }, + ); + }, + child: Card( + key: homeModel?.keySEDateFilter, + color: Theme.of(context) + .colorScheme + .onPrimary, + child: Container( + padding: EdgeInsets.symmetric( + vertical: (SizeConfig + .safeBlockHorizontal ?? + 4) * + 3, + ), + // width: SizeConfig.screenWidth! * 0.30, + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + SizedBox( + width: SizeConfig + .safeBlockHorizontal, + ), + const Icon( + Icons.calendar_today, + color: Color(0xff524F4F), + ), + SizedBox( + width: SizeConfig + .safeBlockHorizontal, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate( + "Filter by Date", + ), + ), + SizedBox( + width: SizeConfig + .safeBlockHorizontal, + ), + ], + ), + ), + ), + ), + ), + Expanded( + flex: 1, + child: Card( + color: Theme.of(context) + .colorScheme + .onPrimary, + child: IconButton( + onPressed: () { + navigationService.pushScreen( + Routes.calendar, + arguments: model.events, + ); + }, + icon: const Icon( + Icons.calendar_month, + ), + ), + ), + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.027, + ), + // if the events model is empty then renders a box with text as "Empty List" + // else renders lists of the all event tile. + model.events.isEmpty + ? SizedBox( + height: SizeConfig.screenHeight! * 0.5, + child: Center( + child: Text( + AppLocalizations.of(context)! + .strictTranslate( + model.emptyListMessage, + ), + ), + ), + ) + : ListView.builder( + physics: + const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: model.events.length, + itemBuilder: + (BuildContext context, int index) { + return GestureDetector( + onTap: () { + navigationService.pushScreen( + "/eventInfo", + arguments: { + "event": model.events[index], + "exploreEventViewModel": model, + }, + ); + }, + child: EventCard( + event: model.events[index], + isSearchItem: false, + ), + ); + }, + ), + ], + ), + ), + ), + ], + ), + ), + floatingActionButton: FloatingActionButton.extended( + key: homeModel?.keySEAdd, + heroTag: "AddEventFab", + backgroundColor: Theme.of(context).colorScheme.background, + onPressed: () { + navigationService.pushScreen( + "/createEventPage", + ); + }, + icon: Icon( + Icons.add, + color: Theme.of(context).colorScheme.secondary, + ), + label: Text( + AppLocalizations.of(context)!.strictTranslate("Event"), + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith(color: Theme.of(context).colorScheme.secondary), + ), + ), + ); + }, + ); + } +} 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..dcef443eb --- /dev/null +++ b/lib/views/after_auth_screens/feed/individual_post.dart @@ -0,0 +1,309 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/models/comment/comment_model.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/services/size_config.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 State, should be removed in next few iterations + +/// Comment view model. +late CommentsViewModel _commentViewModel; + +/// IndividualPostView returns a widget that has mutable state _IndividualPostViewState. +class IndividualPostView extends StatefulWidget { + const IndividualPostView({super.key, required this.post}); + + /// Individual Post. + final Post post; + + @override + _IndividualPostViewState createState() => _IndividualPostViewState(); +} + +class _IndividualPostViewState extends State { + final TextEditingController _controller = TextEditingController(); + bool _isCommentValid = false; + + @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( + // TextField to send the comment on the post. + child: TextField( + key: const Key('indi_post_tf_key'), + controller: _controller, + textInputAction: TextInputAction.send, + onChanged: (msg) { + if (msg.isEmpty && _isCommentValid == true) { + setState(() { + _isCommentValid = false; + }); + } + if (msg.isEmpty == false && _isCommentValid == false) { + setState(() { + _isCommentValid = true; + }); + } + }, + textAlign: TextAlign.start, + decoration: InputDecoration( + hintText: AppLocalizations.of(context)!.strictTranslate( + "Write your comment here..", + ), + contentPadding: const EdgeInsets.all(8.0), + focusColor: Colors.black, + border: InputBorder.none, + ), + keyboardType: TextInputType.text, + ), + ), + // Button to send the comment. + TextButton( + key: const Key('sendButton'), + style: _isCommentValid == false + ? ButtonStyle( + overlayColor: + MaterialStateProperty.all(Colors.transparent), + ) + : null, + //check if button is enabled when comment is valid + onPressed: _isCommentValid + ? () { + _commentViewModel.createComment(_controller.text); + _controller.text = ""; + + setState(() { + _isCommentValid = false; + }); + } + : null, + child: Text( + AppLocalizations.of(context)!.strictTranslate( + "Send", + ), + style: !_isCommentValid + ? const TextStyle(color: Colors.grey) + : null, + ), + ), + ], + ), + ), + body: ListView( + children: [ + // Post + NewsPost( + post: widget.post, + ), + Padding( + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.screenHeight! * 0.010, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // renders the number of users liked the post. + IndividualPageLikeSection( + usersLiked: widget.post.likedBy!, + ), + // renders the number of users commented on the post. + IndividualPostCommentSection( + comments: widget.post.comments!, + postID: widget.post.sId, + ), + const SizedBox( + height: 200, + ), + ], + ), + ), + ], + ), + ); + } +} + +/// Generates a `Padding` widget with customizable vertical padding around a text element. +/// +/// **params**: +/// * `context`: The build context in which the padding method is called. +/// * `text`: The text on which padding should be applied. +/// +/// **returns**: +/// * `Padding`: Padding widget with vertical padding applied to the provided text. +Padding buildPadding(BuildContext context, String text) { + return Padding( + padding: EdgeInsets.symmetric(vertical: SizeConfig.screenHeight! * 0.006), + child: Text( + AppLocalizations.of(context)!.strictTranslate(text), + style: Theme.of(context).textTheme.titleLarge, + ), + ); +} + +/// IndividualPageLikeSection returns a widget that show the list of all the users liked the post. +class IndividualPageLikeSection extends StatelessWidget { + const IndividualPageLikeSection({ + super.key, + required this.usersLiked, + }); + + /// Represents a list of users who have liked a post. + final List usersLiked; + + @override + Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildPadding( + context, + AppLocalizations.of(context)!.strictTranslate( + "Liked by", + ), + ), + Row( + children: [ + // Looping through the usersLiked list, + for (int i = 0; i < usersLiked.length; i++) + // renders the custom widget for invidual user. + likedUserCircleAvatar(usersLiked[i]), + ], + ), + ], + ); + } +} + +/// Widget representing the comment section of an individual post. +/// +/// The `IndividualPostCommentSection` widget displays a list of comments on a post. +class IndividualPostCommentSection extends StatelessWidget { + const IndividualPostCommentSection({ + super.key, + required this.comments, + required this.postID, + }); + + /// List of comments on a post. + final List comments; + + /// ID of a post with associated comments. + final String postID; + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) async { + await model.initialise(postID); + // print(model.commentList.first.creator); + _commentViewModel = model; + }, + builder: (context, model, child) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildPadding(context, "Comments"), + // Looping through the commentList list, + for (int i = 0; i < model.commentList.length; i++) + // renders the custom widget for invidual user. + CommentTemplate(comment: model.commentList[i]), + ], + ), + ); + } +} + +/// CommentTemplate returns a widget of the individual user commented on the post. +class CommentTemplate extends StatelessWidget { + const CommentTemplate({ + super.key, + required this.comment, + }); + + /// Instance of comment. + 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.bodyMedium, + ), + ), + Text( + comment.text!, + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith(fontSize: 16.0), + ), + ], + ), + ), + ), + ], + ); + } +} + +/// Generates a Circle Avatar representing a user who liked the post. +/// +/// **params**: +/// * `user`: The user who liked the post, represented by the `LikedBy` class. +/// +/// **returns**: +/// * `Widget`: Circle Avatar of the user who liked the post. +Widget likedUserCircleAvatar(LikedBy user) { + return const Padding( + padding: EdgeInsets.only(right: 10.0, bottom: 16.0), + child: Stack( + clipBehavior: Clip.none, + alignment: Alignment.center, + children: [ + CircleAvatar( + backgroundColor: Color(0xfff2f2f2), + radius: 20, + ), + 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..1aabe61af --- /dev/null +++ b/lib/views/after_auth_screens/feed/organization_feed.dart @@ -0,0 +1,184 @@ +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/feed_view_models/organization_feed_view_model.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/pinned_post.dart'; +import 'package:talawa/widgets/post_list_widget.dart'; + +/// OrganizationFeed returns a widget that shows the feed of the organization. +class OrganizationFeed extends StatefulWidget { + const OrganizationFeed({ + required Key key, + this.homeModel, + this.forTest = false, + }) : super(key: key); + + /// MainScreenViewModel. + final MainScreenViewModel? homeModel; + + /// To implement the test. + final bool forTest; + + @override + State createState() => _OrganizationFeedState(); +} + +class _OrganizationFeedState extends State { + final ScrollController _scrollController = ScrollController(); + + /// Counter for first time scrolling when at the start of the list. + int firstDownScroll = 0; + + /// Counter for first time scrolling when at the start of the list. + int firstUpScroll = 0; + @override + void dispose() { + _scrollController.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(isTest: widget.forTest), + builder: (context, model, child) { + return Scaffold( + floatingActionButton: FloatingActionButton( + shape: const CircleBorder(side: BorderSide.none), + key: const Key('floating_action_btn'), + backgroundColor: Colors.green, + onPressed: () { + navigationService.pushScreen('/addpostscreen'); + }, + child: Icon( + Icons.add, + size: SizeConfig.screenHeight! * 0.045, + color: Colors.white, + ), + ), + appBar: AppBar( + // AppBar returns a widget for the header of the page. + backgroundColor: Colors.green, + // Theme.of(context).primaryColor, + elevation: 0.0, + centerTitle: true, + title: Text( + model.currentOrgName, + key: widget.homeModel?.keySHOrgName, + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontSize: 20, + color: Colors.white, + ), + ), + leading: IconButton( + key: widget.homeModel?.keySHMenuIcon, + icon: Icon( + Icons.menu, + color: Theme.of(context).iconTheme.color, + ), + onPressed: () { + MainScreenViewModel.scaffoldKey.currentState!.openDrawer(); + }, + ), + ), + // if the model is fetching the data then renders Circular Progress Indicator else renders the result. + body: model.isFetchingPosts || model.isBusy + ? const Center(child: CircularProgressIndicator()) + : RefreshIndicator( + onRefresh: () async => model.fetchNewPosts(), + child: NotificationListener( + onNotification: (notification) { + final currentScroll = _scrollController.position.pixels; + + if (notification is ScrollEndNotification && + notification.metrics.atEdge) { + if (firstDownScroll > 0) { + model.nextPage(); + firstDownScroll = 0; + } else { + firstDownScroll++; + } + } + if (notification is ScrollEndNotification && + notification.metrics.atEdge && + currentScroll <= 0) { + if (firstUpScroll > 0) { + model.previousPage(); + firstUpScroll = 0; + } else { + firstUpScroll++; + } + } + // Reset counters if scrolling occurs anywhere other than at the edge + if (!notification.metrics.atEdge) { + firstDownScroll = 0; + firstUpScroll = 0; + } + + return false; + }, + child: ListView( + controller: _scrollController, + key: const Key('listView'), + shrinkWrap: true, + children: [ + // Always show PinnedPost if available + if (model.pinnedPosts.isNotEmpty) + PinnedPost( + key: const Key('pinnedPosts'), + pinnedPost: model.pinnedPosts, + model: widget.homeModel!, + ), + // Show PostListWidget if there are posts, otherwise show the 'no posts' message + model.posts.isNotEmpty + ? PostListWidget( + key: widget.homeModel?.keySHPost, + posts: model.posts, + function: model.navigateToIndividualPage, + deletePost: model.removePost, + ) + : // if there is no post in an organisation then show text button to create a post. + Column( + children: [ + Padding( + padding: EdgeInsets.only( + top: SizeConfig.screenHeight! * 0.21, + ), + child: Text( + AppLocalizations.of(context)! + .strictTranslate( + 'There are no posts in this organization', + ), + style: TextStyle( + fontSize: + SizeConfig.screenHeight! * 0.026, + ), + textAlign: TextAlign.center, + ), + ), + TextButton( + onPressed: () { + navigationService + .pushScreen('/addpostscreen'); + }, + child: Text( + AppLocalizations.of(context)! + .strictTranslate( + 'Create your first post', + ), + ), + ), + ], + ), + ], + ), + ), + ), + ); + }, + ); + } +} 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..028ae73f2 --- /dev/null +++ b/lib/views/after_auth_screens/feed/pinned_post_page.dart @@ -0,0 +1,34 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +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'; + +/// PinnedPostPage returns a widget that shows the list of all the pinned post. +class PinnedPostPage extends StatelessWidget { + const PinnedPostPage({super.key, required this.pinnedPosts}); + final List pinnedPosts; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + iconTheme: Theme.of(context).iconTheme, + backgroundColor: Theme.of(context).primaryColor, + elevation: 0.0, + title: Text( + AppLocalizations.of(context)!.strictTranslate('Pinned Posts'), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + ), + body: ListView( + children: [PostListWidget(posts: pinnedPosts)], + ), + ); + } +} diff --git a/lib/views/after_auth_screens/feed/pinned_post_screen.dart b/lib/views/after_auth_screens/feed/pinned_post_screen.dart new file mode 100644 index 000000000..f2112770e --- /dev/null +++ b/lib/views/after_auth_screens/feed/pinned_post_screen.dart @@ -0,0 +1,79 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_cache_manager/flutter_cache_manager.dart'; +import 'package:talawa/apptheme.dart'; + +import 'package:talawa/services/size_config.dart'; + +/// Pinned post screen. +/// +class PinnedPostScreen extends StatefulWidget { + const PinnedPostScreen({super.key, required this.post, this.cacheManager}); + + /// Contains the data of the post. + /// + final Map post; + + /// Custom avatar data. + final BaseCacheManager? cacheManager; + + @override + State createState() => _PinnedPostScreenState(); +} + +class _PinnedPostScreenState extends State { + @override + Widget build(BuildContext context) { + return SafeArea( + child: Container( + decoration: const BoxDecoration(color: Colors.black38), + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.all(18.0), + child: Text( + widget.post['title']!, + maxLines: 2, + style: AppTheme.title.copyWith( + color: Colors.white, + decorationThickness: 0, + ), + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + '${widget.post['time']!}hr', + style: const TextStyle( + color: Colors.white, + fontWeight: FontWeight.w200, + fontSize: 14, + decorationThickness: 0, + ), + ), + ), + ], + ), + CachedNetworkImage( + cacheManager: widget.cacheManager, + imageUrl: widget.post['imageUrl']!, + errorWidget: (context, url, error) { + return const SizedBox( + child: Center( + child: CircularProgressIndicator(), + ), + ); + }, + height: SizeConfig.screenHeight! * .75, + fit: BoxFit.cover, + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/after_auth_screens/join_org_after_auth/access_request_screen.dart b/lib/views/after_auth_screens/join_org_after_auth/access_request_screen.dart new file mode 100644 index 000000000..f6c1a8150 --- /dev/null +++ b/lib/views/after_auth_screens/join_org_after_auth/access_request_screen.dart @@ -0,0 +1,103 @@ +// ignore_for_file: talawa_good_doc_comments, talawa_api_doc +import 'package:flutter/material.dart'; +import 'package:talawa/apptheme.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/view_model/access_request_view_model.dart'; +import 'package:talawa/views/base_view.dart'; + +///requestAccess. +class SendAccessRequest extends StatelessWidget { + const SendAccessRequest({ + super.key, + required this.org, + // required this.model + }); + + /// OrgInfo object. + final OrgInfo org; + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(org), + builder: (context, model, child) { + return SafeArea( + child: Scaffold( + appBar: AppBar( + backgroundColor: Colors.transparent, + ), + resizeToAvoidBottomInset: false, + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset('assets/images/Group 8948.png'), + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "You need access", + style: AppTheme.title.copyWith(color: AppTheme.white), + ), + const SizedBox( + height: 5, + ), + const Text( + "Request access, or switch to an account with access", + ), + const SizedBox( + height: 20, + ), + Container( + child: TextField( + style: const TextStyle(color: AppTheme.blackPrimary), + minLines: 15, + maxLines: 20, + decoration: InputDecoration( + constraints: const BoxConstraints( + maxWidth: 400, + minWidth: 100, + ), + enabledBorder: UnderlineInputBorder( + borderRadius: BorderRadius.circular(20.0), + borderSide: const BorderSide( + width: 3, + color: Colors.white, + ), + ), + hintText: "Message (optional)", + hintStyle: const TextStyle( + color: AppTheme.blackSecondary, + ), + filled: true, + fillColor: AppTheme.white, + ), + ), + ), + ], + ), + ), + Center( + child: TextButton( + onPressed: () { + model.sendMembershipRequest(); + }, + style: + TextButton.styleFrom(backgroundColor: AppTheme.green), + child: const Text( + "Request Access", + style: TextStyle( + color: AppTheme.white, + ), + ), + ), + ), + ], + ), + ), + ); + }, + ); + } +} diff --git a/lib/views/after_auth_screens/join_org_after_auth/join_organisation_after_auth.dart b/lib/views/after_auth_screens/join_org_after_auth/join_organisation_after_auth.dart new file mode 100644 index 000000000..fa519edbb --- /dev/null +++ b/lib/views/after_auth_screens/join_org_after_auth/join_organisation_after_auth.dart @@ -0,0 +1,185 @@ +// ignore_for_file: talawa_api_doc, talawa_good_doc_comments +import 'package:flutter/material.dart'; +import 'package:qr_code_scanner/qr_code_scanner.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/graphql_config.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/organization_list.dart'; +import 'package:talawa/widgets/organization_search_list.dart'; +import 'package:vibration/vibration.dart'; + +/// JoinOrganisationAfterAuth returns a widget for page to join the organization just after user authentication. +class JoinOrganisationAfterAuth extends StatelessWidget { + const JoinOrganisationAfterAuth({super.key, required this.orgId}); + + /// org identifier. + /// + final String orgId; + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(orgId), + builder: (context, model, child) { + return Scaffold( + key: const Key('JoinOrgScreen'), + // header for the widget + appBar: AppBar( + centerTitle: true, + // title of the header. + title: Text( + AppLocalizations.of(context)! + .strictTranslate('Join Organisation'), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + // action button for the option to join the organization using QR code. + actions: [ + IconButton( + icon: const Icon( + Icons.qr_code_scanner, + size: 30, + semanticLabel: 'Join Organisation with QR', + ), + onPressed: () => scanQR(context, model), + ), + ], + ), + body: Column( + children: [ + const Padding( + padding: EdgeInsets.symmetric(horizontal: 12.0), + child: Divider( + color: Colors.grey, + thickness: 2.0, + ), + ), + Expanded( + // if model searching is under process then renders OrganizationSearchList widget + // else renders OrganizationList widget. + child: model.searching + ? OrganizationSearchList(model: model) + : OrganizationList(model: model), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + ], + ), + ); + }, + ); + } + + /// scanQR returns a widget that is use in joining the organization via the QR code. + /// + /// **params**: + /// * `context`: Build context to perform context related operation + /// * `model`: Viewmodel + /// + /// **returns**: + /// None + void scanQR(BuildContext context, SelectOrganizationViewModel model) { + showModalBottomSheet( + context: context, + barrierColor: Colors.transparent, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), + builder: (BuildContext context) { + return ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + child: Container( + height: MediaQuery.of(context).size.width, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.secondary, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: 250, + width: 250, + child: QRView( + key: model.qrKey, + onQRViewCreated: (controller) => + _onQRViewCreated(controller, model), + overlay: QrScannerOverlayShape( + overlayColor: Theme.of(context).colorScheme.secondary, + borderRadius: 10, + borderLength: 20, + borderWidth: 10, + cutOutSize: 250, + ), + /*overlayMargin: EdgeInsets.all(50)*/ + ), + ), + SizedBox( + height: SizeConfig.safeBlockVertical! * 4, + ), + Text( + AppLocalizations.of(context)!.strictTranslate('Scan QR'), + ), + SizedBox( + height: SizeConfig.safeBlockVertical! * 4, + ), + ], + ), + ), + ); + }, + ); + } + + /// To handle to qr. + /// + /// **params**: + /// * `controller`: Controller to manage qr activity + /// * `model`: Viewmodel + /// + /// **returns**: + /// None + void _onQRViewCreated( + QRViewController controller, + SelectOrganizationViewModel model, + ) { + controller.scannedDataStream.listen((scanData) { + if (scanData.code!.isNotEmpty) { + print(scanData.code); + try { + final List data = scanData.code!.split('?'); + final String url = data[0]; + Vibration.vibrate(duration: 100); + if (url == GraphqlConfig.orgURI) { + final List queries = data[1].split('&'); + model.orgId = queries[0].split('=')[1]; + controller.stopCamera(); + controller.dispose(); + Navigator.pop(navigationService.navigatorKey.currentContext!); + model.initialise(model.orgId); + } else { + navigationService.showTalawaErrorSnackBar( + "Organisation on different server, logout and scan qr again", + MessageType.error, + ); + } + } on Exception catch (e) { + print(e); + print('invalid app qr'); + } + } + }); + } +} diff --git a/lib/views/after_auth_screens/org_info_screen.dart b/lib/views/after_auth_screens/org_info_screen.dart new file mode 100644 index 000000000..f1a3fdfae --- /dev/null +++ b/lib/views/after_auth_screens/org_info_screen.dart @@ -0,0 +1,445 @@ +import 'package:flutter/material.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/graphql_config.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/widgets/custom_avatar.dart'; + +/// A screen widget to display detailed information about an organization. +class OrganisationInfoScreen extends StatelessWidget { + const OrganisationInfoScreen({super.key, required this.orgInfo}); + + /// The organization information to be displayed on the screen. + final OrgInfo orgInfo; + + @override + Widget build(BuildContext context) { + SizeConfig().init( + context, + ); + final double imageHeight = SizeConfig.screenHeight! * 0.38; + final SelectOrganizationViewModel model = SelectOrganizationViewModel(); + final Map joinedOrgsMap = {}; + for (final org in userConfig.currentUser.joinedOrganizations!) { + joinedOrgsMap[org.id!] = org; + } + + return Scaffold( + extendBodyBehindAppBar: true, + floatingActionButton: !joinedOrgsMap.containsKey(orgInfo.id) + ? FloatingActionButton.extended( + onPressed: () { + model.selectOrg(orgInfo); + }, + label: Text( + 'Join', + style: TextStyle( + color: const Color.fromARGB(255, 255, 255, 255), + fontSize: SizeConfig.screenHeight! * 0.022, + ), + ), + backgroundColor: const Color.fromARGB(255, 86, 194, 65), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + ) + : FloatingActionButton.extended( + onPressed: () {}, + label: Text( + 'Leave', + style: TextStyle( + color: const Color.fromARGB(255, 255, 255, 255), + fontSize: SizeConfig.screenHeight! * 0.022, + ), + ), + backgroundColor: const Color.fromARGB(255, 208, 51, 51), + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(20), + ), + ), + floatingActionButtonLocation: FloatingActionButtonLocation.endFloat, + appBar: AppBar( + leading: IconButton( + icon: const Icon(Icons.arrow_back, color: Colors.white), + onPressed: () => Navigator.of(context).pop(), + ), + backgroundColor: Colors.transparent, + elevation: 0, + ), + body: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Stack( + alignment: Alignment.center, + children: [ + Stack( + children: [ + orgInfo.image != null + ? Image.network( + orgInfo.image!, + height: imageHeight, + width: double.infinity, + fit: BoxFit.cover, + ) + : ClipRRect( + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(20.0), + bottomRight: Radius.circular(20.0), + ), + child: Image.asset( + 'assets/images/Organisation_Default_Image.jpeg', + height: imageHeight, + width: double.infinity, + fit: BoxFit.cover, + ), + ), + Container( + key: const Key('image_container'), + height: imageHeight, + width: double.infinity, + decoration: BoxDecoration( + color: Colors.black.withOpacity(0.55), + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(20.0), + bottomRight: Radius.circular(20.0), + ), + ), + ), + ], + ), + Positioned( + bottom: 45, + left: 16, + child: Row( + children: [ + Text( + orgInfo.name ?? 'Organization Name', + style: const TextStyle( + fontSize: 28.0, + fontWeight: FontWeight.bold, + color: Colors.white, + ), + ), + if (orgInfo.address != null) + Padding( + padding: const EdgeInsets.only(top: 8, left: 8), + child: Center( + child: Text( + '${orgInfo.address?.city}, ${orgInfo.address?.countryCode}', + style: const TextStyle( + fontSize: 16.0, + color: Color.fromARGB(255, 179, 168, 168), + ), + ), + ), + ), + ], + ), + ), + Positioned( + bottom: 24, + left: 16, + child: Text( + 'Created by: ${orgInfo.creatorInfo?.firstName ?? 'User name'} ${orgInfo.creatorInfo?.lastName ?? ''}', + style: const TextStyle( + fontSize: 16.0, + color: Color.fromARGB(255, 255, 255, 255), + fontWeight: FontWeight.w500, + ), + ), + ), + ], + ), + Padding( + padding: const EdgeInsets.only(top: 16, left: 16, right: 20), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const Text( + 'Description', + style: + TextStyle(fontWeight: FontWeight.bold, fontSize: 18.0), + ), + Row( + mainAxisSize: MainAxisSize.min, + children: [ + !orgInfo.userRegistrationRequired! + ? const Icon( + Icons.lock_open, + size: 18, + color: Colors.green, + ) + : Icon( + Icons.lock, + size: 18, + color: Theme.of(context).colorScheme.primary, + ), + const SizedBox(width: 8), + !orgInfo.userRegistrationRequired! + ? Text( + "Public", + style: Theme.of(context) + .textTheme + .bodySmall! + .copyWith( + color: + const Color.fromARGB(255, 98, 98, 98), + ), + ) + : Text( + "Private", + style: Theme.of(context) + .textTheme + .bodySmall! + .copyWith( + color: const Color.fromARGB( + 255, + 103, + 103, + 103, + ), + ), + ), + ], + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.only( + top: 10, + left: 16, + right: 20, + bottom: 10, + ), + child: Text( + orgInfo.description ?? 'No description provided.', + style: const TextStyle(fontSize: 16.0), + ), + ), + _buildSectionTitle( + context, + 'Admins', + orgInfo.admins, + () => _showAllMembersBottomSheet( + context, + orgInfo.admins!, + 'Admins', + ), + 2, + ), + Divider( + color: Theme.of(context).colorScheme.onBackground, + thickness: 1, + endIndent: 16, + indent: 16, + ), + _buildUserList(context, orgInfo.admins, 2), + _buildSectionTitle( + context, + 'Members', + orgInfo.members, + () => _showAllMembersBottomSheet( + context, + orgInfo.members!, + 'Members', + ), + 4, + ), + Divider( + color: Theme.of(context).colorScheme.onBackground, + thickness: 1, + endIndent: 16, + indent: 16, + ), + _buildUserList(context, orgInfo.members, 4), + ], + ), + ), + ); + } + + /// Builds a section title widget. + /// + /// **params**: + /// * `context`: The build context. + /// * `title`: The title of the section. + /// * `users`: The list of users + /// * `onSeeAllTap`: Callback when "See all" is tapped. + /// * `maxUsers`: The maximum number of users to display. + /// + /// **returns**: + /// * `Widget`: Returns a section title widget. + Widget _buildSectionTitle( + BuildContext context, + String title, + List? users, + VoidCallback onSeeAllTap, + int maxUsers, + ) { + return Padding( + padding: const EdgeInsets.only(left: 16.0, right: 16, top: 10), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + title, + style: const TextStyle(fontWeight: FontWeight.bold, fontSize: 18.0), + ), + if (users != null && users.length > maxUsers) + GestureDetector( + onTap: onSeeAllTap, + child: const Text( + 'See all', + style: TextStyle( + fontSize: 16.0, + color: Colors.blue, + ), + ), + ), + ], + ), + ); + } + + /// Builds a list of users widget. + /// + /// **params**: + /// * `context`: The build context. + /// * `users`: The list of users + /// * `maxDisplay`: The maximum number of users to display. + /// + /// **returns**: + /// * `Widget`: Returns a list of users widget. + Widget _buildUserList( + BuildContext context, + List? users, + int maxDisplay, + ) { + if (users == null || users.isEmpty) { + return const Padding( + padding: EdgeInsets.symmetric(horizontal: 16.0), + child: Text('No users to display'), + ); + } + + final List displayedUsers = users.take(maxDisplay).toList(); + + return Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: Column( + children: displayedUsers + .map( + (user) => Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + decoration: BoxDecoration( + color: Theme.of(context).brightness == Brightness.dark + ? const Color.fromARGB(255, 50, 50, 50) + : const Color.fromARGB(255, 226, 226, 226), + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 1, + blurRadius: + Theme.of(context).brightness == Brightness.dark + ? 1 + : 6, + offset: Theme.of(context).brightness == Brightness.dark + ? Offset.zero + : const Offset(0, 3), + ), + ], + ), + height: 60, + child: Row( + children: [ + Expanded( + flex: 1, + child: CustomAvatar( + isImageNull: user.image == null, + firstAlphabet: + user.firstName!.substring(0, 1).toUpperCase(), + imageUrl: + '${'${GraphqlConfig.orgURI}'.replaceFirst('/graphql', '')}/${user.image}', + fontSize: SizeConfig.screenHeight! * 0.018, + ), + ), + Expanded( + flex: 3, + child: Text( + '${user.firstName ?? 'No Name'} ${user.lastName ?? ''}', + ), + ), + ], + ), + ), + ), + ) + .toList(), + ), + ); + } + + /// Shows a bottom sheet with all members. + /// + /// **params**: + /// * `context`: The build context. + /// * `users`: The list of users. + /// * `title`: The title of the bottom sheet. + /// + /// **returns**: + /// None + void _showAllMembersBottomSheet( + BuildContext context, + List users, + String title, + ) { + showModalBottomSheet( + context: context, + builder: (BuildContext bc) { + return SafeArea( + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + AppBar( + title: Text(title), + leading: IconButton( + key: const Key('modalSheetbackBtn'), + icon: const Icon(Icons.close), + onPressed: () => Navigator.of(bc).pop(), + ), + ), + Flexible( + child: ListView.builder( + itemCount: users.length, + itemBuilder: (BuildContext context, int index) { + return ListTile( + leading: CustomAvatar( + isImageNull: users[index].image == null, + firstAlphabet: users[index] + .firstName! + .substring(0, 1) + .toUpperCase(), + imageUrl: + '${'${GraphqlConfig.orgURI}'.replaceFirst('/graphql', '')}/${users[index].image}', + fontSize: SizeConfig.screenHeight! * 0.018, + ), + title: Text( + '${users[index].firstName ?? 'No Name'} ${users[index].lastName ?? ''}', + ), + ); + }, + ), + ), + ], + ), + ); + }, + ); + } +} 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..6fa5c662f --- /dev/null +++ b/lib/views/after_auth_screens/profile/edit_profile_page.dart @@ -0,0 +1,303 @@ +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'; + +/// EditProfilePage returns a widget that has mutable state _EditProfilePageState. +class EditProfilePage extends StatefulWidget { + const EditProfilePage({super.key}); + + @override + _EditProfilePageState createState() => _EditProfilePageState(); +} + +/// _EditProfilePageState returns a widget for a Page to edit the user profile. +class _EditProfilePageState extends State { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return Scaffold( + key: const Key('EditProfileScreenScaffold'), + appBar: AppBar( + backgroundColor: Theme.of(context).primaryColor, + elevation: 0.0, + title: Text( + AppLocalizations.of(context)!.strictTranslate('Profile'), + key: const Key('ProfileText'), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: SizeConfig.screenHeight! * 0.03, + ), + ), + ), + body: SingleChildScrollView( + child: Column( + children: [ + SizedBox( + height: SizeConfig.screenHeight! * 0.068, + ), + Center( + child: Stack( + children: [ + // if the profile pic is not empty then render Circle Avatar with image as background image + // else render Circle Avatar with grey background color. + CircleAvatar( + key: const Key('profilepic'), + radius: SizeConfig.screenHeight! * 0.082, + backgroundImage: model.imageFile != null + ? Image.file( + model.imageFile!, + fit: BoxFit.fitWidth, + ).image + : model.user.image != null + ? NetworkImage(model.user.image!) + : null, + backgroundColor: + model.imageFile == null && model.user.image == null + ? Colors.grey.withOpacity(0.2) + : null, + child: model.imageFile == null + ? model.user.image == null + ? Text( + '${model.user.firstName![0].toUpperCase()}${model.user.lastName![0].toUpperCase()}', + style: Theme.of(context) + .textTheme + .headlineMedium, + ) + : null + : null, + ), + Positioned( + bottom: 0, + right: 0, + child: InkWell( + key: const Key('AddRemoveImageButton'), + onTap: () { + // modal sheet for image selection from camera or gallery. + model.imageFile == null + ? showModalBottomSheet( + context: context, + builder: (BuildContext context) { + return Container( + height: + SizeConfig.screenHeight! * 0.135, + padding: const EdgeInsets.all(17), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + _createModalSheetButton( + context, + Icons.camera_alt, + 'Camera', + () { + Navigator.of(context).pop(); + model.selectImage( + camera: true, + ); + }, + ), + _createModalSheetButton( + context, + Icons.photo_library, + 'Gallery', + () { + Navigator.of(context).pop(); + model.selectImage(); + }, + ), + ], + ), + ); + }, + ) + : model.removeImage(); + }, + child: CircleAvatar( + radius: SizeConfig.screenHeight! * 0.034, + backgroundColor: model.imageFile == null + ? Theme.of(context).colorScheme.secondary + : Theme.of(context).colorScheme.secondary, + child: model.imageFile == null + ? const Icon( + Icons.photo_camera, + color: Colors.white, + ) + : const Icon( + Icons.close, + color: Colors.white, + ), + ), + ), + ), + ], + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.068, + ), + const Divider(), + Padding( + padding: const EdgeInsets.all(10), + child: Column( + children: [ + Row( + children: [ + // Flexible is a widget that controls how a child of a Row, Column, or Flex flexes. + Flexible( + // Text field for first name with value text of user's first name. + child: TextFormField( + key: const Key('FirstNameTextField'), + controller: model.firstNameTextController, + focusNode: model.firstNameFocus, + keyboardType: TextInputType.name, + decoration: InputDecoration( + labelText: AppLocalizations.of(context)! + .strictTranslate('First Name'), + labelStyle: + Theme.of(context).textTheme.titleMedium, + 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( + // Text field for first name with value text of user's last name. + child: TextFormField( + controller: model.lastNameTextController, + focusNode: model.lastNameFocus, + keyboardType: TextInputType.name, + decoration: InputDecoration( + labelText: AppLocalizations.of(context)! + .strictTranslate('Last Name'), + labelStyle: + Theme.of(context).textTheme.titleMedium, + 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.bodySmall!.copyWith( + color: Theme.of(context) + .colorScheme + .onBackground, + ), + ), + // Text for first name with value text of user's first name. + Text( + model.user.email!, + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(fontSize: 18), + ), + ], + ), + ], + ), + ), + const Divider(), + TextButton( + key: const Key('updatebtn'), + onPressed: () { + model.updateUserProfile( + firstName: model.firstNameTextController.text, + newImage: model.imageFile, + lastName: model.lastNameTextController.text, + ); + FocusScope.of(context).unfocus(); + }, + child: Text( + AppLocalizations.of(context)!.strictTranslate('Update'), + ), + ), + ], + ), + ), + ); + }, + ); + } + + /// Button for the different image selection methods. + /// + /// **params**: + /// * `context`:context for the sheet + /// * `icon`: icon for the method + /// * `label`: label for the method + /// * `onTap`: onTap funtionality for the method + /// + /// **returns**: + /// * `Widget`: Icon Button for selecting different image selection method. + Widget _createModalSheetButton( + BuildContext context, + IconData icon, + String label, + VoidCallback onTap, + ) { + return GestureDetector( + key: Key('select$label'), + onTap: onTap, + child: Column( + mainAxisSize: MainAxisSize.min, + children: [ + Icon( + icon, + size: SizeConfig.screenHeight! * 0.05, + ), + Text(AppLocalizations.of(context)!.strictTranslate(label)), + ], + ), + ); + } +} 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..9accd7066 --- /dev/null +++ b/lib/views/after_auth_screens/profile/profile_page.dart @@ -0,0 +1,475 @@ +import 'package:contained_tab_bar_view/contained_tab_bar_view.dart'; +import 'package:flutter/material.dart'; +// import 'package:flutter_braintree/flutter_braintree.dart'; +// import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/plugins/talawa_plugin_provider.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/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/after_auth_screens/profile/user_event.dart'; +import 'package:talawa/views/after_auth_screens/profile/user_feed.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/custom_avatar.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; + +/// ProfilePage returns a widget that renders a page of user's profile. +class ProfilePage extends StatelessWidget { + const ProfilePage({ + required Key key, + this.homeModel, + }) : super(key: key); + + /// MainScreenViewModel. + /// + final MainScreenViewModel? homeModel; + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return Scaffold( + key: model.scaffoldKey, + appBar: AppBar( + backgroundColor: Colors.green, + // Theme.of(context).primaryColor, + elevation: 0.0, + centerTitle: true, + leading: IconButton( + color: Theme.of(context).iconTheme.color, + icon: const Icon(Icons.menu), + onPressed: () => + MainScreenViewModel.scaffoldKey.currentState!.openDrawer(), + ), + key: const Key("ProfilePageAppBar"), + title: Text( + AppLocalizations.of(context)!.strictTranslate('Profile'), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + // fontWeight: FontWeight.w600, + fontSize: SizeConfig.screenHeight! * 0.03, + fontFamily: 'open-sans', + color: Colors.white, + ), + ), + actions: [ + IconButton( + key: const Key('settingIcon'), + onPressed: () { + navigationService.pushScreen(Routes.appSettings); + }, + icon: const Icon(Icons.settings), + ), + ], + ), + // if data fetching is under process then renders Circular Progress Icon + // else renders the widget. + body: model.isBusy + ? const CircularProgressIndicator() + : RefreshIndicator( + onRefresh: () async => model.initialize(), + child: SingleChildScrollView( + child: Column( + children: [ + SizedBox( + height: SizeConfig.screenHeight! * 0.01, + ), + Row( + children: [ + Expanded( + flex: 1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: CustomAvatar( + key: const Key('profilepic'), + isImageNull: model.currentUser.image == null, + firstAlphabet: model.currentUser.firstName! + .substring(0, 1), + imageUrl: model.currentUser.image, + fontSize: Theme.of(context) + .textTheme + .titleLarge! + .fontSize, + maxRadius: SizeConfig.screenHeight! * 0.02, + ), + ), + ), + Expanded( + flex: 3, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + '${model.currentUser.firstName!} ${model.currentUser.lastName!}', + style: TextStyle( + color: Colors.white, + fontSize: SizeConfig.screenHeight! * 0.025, + fontFamily: 'open-sans', + ), + ), + ), + ), + Expanded( + flex: 1, + child: IconButton( + key: const Key('inviteicon'), + icon: Icon( + Icons.share, + color: + Theme.of(context).colorScheme.secondary, + ), + onPressed: () => model.invite(context), + ), + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.02, + ), + TalawaPluginProvider( + pluginName: "Donation", + visible: true, + child: Column( + children: [ + RaisedRoundedButton( + key: homeModel!.keySPDonateUs, + buttonLabel: AppLocalizations.of(context)! + .strictTranslate( + 'Donate to the Community', + ), + onTap: () => donate(context, model), + textColor: Theme.of(context) + .inputDecorationTheme + .focusedBorder! + .borderSide + .color, + backgroundColor: Theme.of(context) + .colorScheme + .secondaryContainer, + ), + ], + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.68, + width: double.infinity, + child: ContainedTabBarView( + tabs: [ + Tab( + text: AppLocalizations.of(context)! + .strictTranslate( + 'Posts', + ), + key: const Key('UserpostTab'), + ), + Tab( + text: AppLocalizations.of(context)! + .strictTranslate( + 'Events', + ), + key: const Key('UserEventsTab'), + ), + ], + views: [ + const UserFeed(key: Key("UserFeed")), + const UserEvents(key: Key("UserEvents")), + ], + ), + ), + ], + ), + ), + ), + ); + }, + ); + } + + /// donate widget, this widget is used in donate custom tile. + /// + /// **params**: + /// * `context`: Build context to perform context related operation + /// * `model`: Viewmodel + /// + /// **returns**: + /// None + void donate(BuildContext context, ProfilePageViewModel model) { + showModalBottomSheet( + context: context, + isScrollControlled: true, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), + builder: (BuildContext context) { + return StatefulBuilder( + builder: (context, setState) { + model.attachListener(setState); + return ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + child: SizedBox( + height: model.bottomSheetHeight, + child: Scaffold( + // background color set to Primary + backgroundColor: + Theme.of(context).colorScheme.primaryContainer, + // header + appBar: AppBar( + centerTitle: true, + automaticallyImplyLeading: false, + backgroundColor: Colors.transparent, + elevation: 0.0, + toolbarHeight: SizeConfig.screenHeight! * 0.15, + title: Padding( + padding: const EdgeInsets.only(top: 8.0), + // display title + child: Text( + '${AppLocalizations.of(context)!.strictTranslate('Donating to')}\n${model.currentOrg.name}', + style: Theme.of(context) + .textTheme + .headlineMedium! + .copyWith(fontSize: 24), + maxLines: 2, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.center, + ), + ), + actions: [ + Padding( + padding: EdgeInsets.only( + right: 8.0, + top: SizeConfig.screenHeight! * 0.01, + ), + child: IconButton( + icon: Icon( + Icons.cancel, + color: Theme.of(context).colorScheme.primary, + ), + onPressed: model.popBottomSheet, + ), + ), + ], + ), + body: SingleChildScrollView( + // SingleChildScrollView is a box in which a single widget can be scrolled. + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + height: SizeConfig.screenWidth! * 0.05, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate('Please select any amount'), + style: Theme.of(context).textTheme.headlineSmall, + ), + SizedBox( + height: SizeConfig.screenWidth! * 0.05, + ), + Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + // looping through and renders button for donation amounts. + children: List.generate( + 3, + (index) => model.dominationButton( + model.denomination[index], + context, + setState, + ), + ), + ), + ), + SizedBox( + height: SizeConfig.screenWidth! * 0.05, + ), + Text( + AppLocalizations.of(context)!.strictTranslate( + 'Or', + ), + style: Theme.of(context).textTheme.headlineSmall, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate('Input custom amount'), + style: Theme.of(context).textTheme.headlineSmall, + ), + SizedBox( + height: SizeConfig.screenWidth! * 0.05, + ), + // containers for custom amount + Container( + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.screenWidth! * 0.05, + ), + child: TextField( + key: const Key('custom_amt'), + controller: model.donationAmount, + focusNode: model.donationField, + textInputAction: TextInputAction.next, + keyboardType: TextInputType.number, + autofillHints: const [AutofillHints.email], + enableSuggestions: true, + style: Theme.of(context).textTheme.titleLarge, + onChanged: (text) { + setState(() {}); + }, + decoration: InputDecoration( + hintText: AppLocalizations.of(context)! + .translate("Enter donation amount"), + labelText: AppLocalizations.of(context)! + .translate("Enter custom donation amount"), + labelStyle: + Theme.of(context).textTheme.titleMedium, + prefixIcon: GestureDetector( + key: const Key('currency_btn'), + onTap: () { + model.changeCurrency(context, setState); + }, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 15.0, + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + model.donationCurrency, + textAlign: TextAlign.center, + style: Theme.of(context) + .textTheme + .headlineSmall, + ), + const Icon( + Icons.arrow_drop_down_circle_outlined, + ), + ], + ), + ), + ), + enabledBorder: OutlineInputBorder( + borderRadius: const BorderRadius.all( + Radius.circular(12.0), + ), + borderSide: BorderSide( + color: + Theme.of(context).colorScheme.secondary, + width: 2, + ), + ), + focusedBorder: OutlineInputBorder( + borderRadius: const BorderRadius.all( + Radius.circular(10.0), + ), + borderSide: BorderSide( + color: + Theme.of(context).colorScheme.secondary, + ), + ), + ), + ), + ), + SizedBox( + height: SizeConfig.screenWidth! * 0.05, + ), + ElevatedButton( + key: const Key('DONATE'), + onPressed: () async { + ///required fields for donation transaction + // late final String userId; + // late final String orgId; + // late final String nameOfOrg; + // late final String nameOfUser; + // late final String payPalId; + // late final double amount; + // orgId = model.currentOrg.id!; + // userId = model.currentUser.id!; + // nameOfUser = + // "${model.currentUser.firstName!} ${model.currentUser.lastName!}"; + // nameOfOrg = model.currentOrg.name!; + + // amount = double.parse(model.donationAmount.text); + // final request = BraintreeDropInRequest( + // tokenizationKey: + // '', + // collectDeviceData: true, + // paypalRequest: BraintreePayPalRequest( + // amount: model.donationAmount.text, + // displayName: "Talawa", + // ), + // cardEnabled: true, + // ); + + // final BraintreeDropInResult? result = + // await BraintreeDropIn.start(request); + // if (result != null) { + // ///saving the donation in server + // late final GraphQLClient client = + // graphqlConfig.clientToQuery(); + + // ///getting transaction id from `brainTree` API + // payPalId = result.paymentMethodNonce.nonce; + + // final QueryResult donationResult = + // await client.mutate( + // MutationOptions( + // document: gql( + // queries.createDonation( + // userId, + // orgId, + // nameOfOrg, + // nameOfUser, + // payPalId, + // amount, + // ), + // ), + // ), + // ); + // if (donationResult.hasException) { + // model.showSnackBar( + // "Error occurred while making a donation", + // ); + // } + + // /// hiding the donation UI once it is successful + // model.popBottomSheet(); + // model.showSnackBar( + // 'Donation Successful,Thanks for the support !', + // ); + // } + }, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + // if the donation amount entered or selected is empty then renders grey color + // else render primary color + model.donationAmount.text.isEmpty + ? Colors.grey + : Theme.of(context).colorScheme.primary, + ), + ), + child: Text( + AppLocalizations.of(context)!.strictTranslate( + 'DONATE', + ), + style: Theme.of(context).textTheme.labelLarge, + ), + ), + ], + ), + ), + ), + ), + ); + }, + ); + }, + ).then((value) => model.updateSheetHeight()); + } +} diff --git a/lib/views/after_auth_screens/profile/user_event.dart b/lib/views/after_auth_screens/profile/user_event.dart new file mode 100644 index 000000000..e9fea98b0 --- /dev/null +++ b/lib/views/after_auth_screens/profile/user_event.dart @@ -0,0 +1,91 @@ +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/base_view.dart'; +import 'package:talawa/widgets/event_card.dart'; + +///UserEvents to show events created by user in current organisation . +class UserEvents extends StatefulWidget { + const UserEvents({ + required super.key, + }); + + @override + State createState() => _UserEventsState(); +} + +class _UserEventsState extends State + with AutomaticKeepAliveClientMixin { + @override + bool get wantKeepAlive => true; + + @override + Widget build(BuildContext context) { + super.build(context); + return BaseView( + onModelReady: (model) => model.initialise(), + builder: (context, model, child) { + return Scaffold( + body: model.isBusy + ? const Center(child: CircularProgressIndicator()) + : model.userEvents.isEmpty + ? Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + AppLocalizations.of(context)!.strictTranslate( + 'You have no event in this organization', + ), + style: TextStyle( + fontSize: SizeConfig.screenHeight! * 0.026, + ), + ), + TextButton( + onPressed: () { + navigationService.pushScreen( + "/createEventPage", + ); + }, + child: Text( + AppLocalizations.of(context)!.strictTranslate( + 'Create your first event', + ), + ), + ), + ], + ), + ) + : SingleChildScrollView( + key: const Key('UserEventsList'), + child: ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: model.userEvents.length, + itemBuilder: (BuildContext context, int index) { + return GestureDetector( + key: Key('event$index'), + onTap: () { + navigationService.pushScreen( + "/eventInfo", + arguments: { + "event": model.userEvents[index], + "exploreEventViewModel": model, + }, + ); + }, + child: EventCard( + event: model.userEvents[index], + isSearchItem: false, + ), + ); + }, + ), + ), + ); + }, + ); + } +} diff --git a/lib/views/after_auth_screens/profile/user_feed.dart b/lib/views/after_auth_screens/profile/user_feed.dart new file mode 100644 index 000000000..f8130d69a --- /dev/null +++ b/lib/views/after_auth_screens/profile/user_feed.dart @@ -0,0 +1,76 @@ +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/feed_view_models/organization_feed_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/post_list_widget.dart'; + +/// User Feed to shows posts by user in current organisation. +class UserFeed extends StatefulWidget { + const UserFeed({ + required Key key, + this.forTest = false, + }) : super(key: key); + + /// for testing. + final bool forTest; + + @override + State createState() => _UserFeedState(); +} + +class _UserFeedState extends State + with AutomaticKeepAliveClientMixin { + @override + bool get wantKeepAlive => true; + + @override + Widget build(BuildContext context) { + super.build(context); + return BaseView( + onModelReady: (model) => model.initialise(isTest: widget.forTest), + builder: (context, model, child) { + model.userPosts.sort((a, b) => b.createdAt!.compareTo(a.createdAt!)); + return Scaffold( + body: model.isFetchingPosts + ? const Center(child: CircularProgressIndicator()) + : (model.userPosts.isEmpty + ? Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + AppLocalizations.of(context)!.strictTranslate( + 'You have no post in this organization', + ), + style: TextStyle( + fontSize: SizeConfig.screenHeight! * 0.026, + ), + ), + TextButton( + onPressed: () { + navigationService.pushScreen('/addpostscreen'); + }, + child: Text( + AppLocalizations.of(context)!.strictTranslate( + 'Create your first post', + ), + ), + ), + ], + ), + ) + : SingleChildScrollView( + child: PostListWidget( + key: const Key('UserPostWidget'), + posts: model.userPosts, + function: model.navigateToIndividualPage, + deletePost: model.removePost, + ), + )), + ); + }, + ); + } +} diff --git a/lib/views/base_view.dart b/lib/views/base_view.dart new file mode 100644 index 000000000..b0d2578aa --- /dev/null +++ b/lib/views/base_view.dart @@ -0,0 +1,40 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +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() { + widget.onModelReady?.call(model); + super.initState(); + } + + @override + Widget build( + BuildContext context, + ) { + return ChangeNotifierProvider( + create: (context) => model, + child: Consumer( + builder: widget.builder, + ), + ); + } +} diff --git a/lib/views/demo_screens/explore_events_demo.dart b/lib/views/demo_screens/explore_events_demo.dart new file mode 100644 index 000000000..24204d896 --- /dev/null +++ b/lib/views/demo_screens/explore_events_demo.dart @@ -0,0 +1,266 @@ +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/after_auth_view_models/event_view_models/explore_events_view_model.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/explore_event_dialogue.dart'; +import 'package:talawa/widgets/event_card.dart'; + +/// Shows the list of events with options to categorize them. +class DemoExploreEvents extends StatelessWidget { + const DemoExploreEvents({ + required Key key, + this.homeModel, + }) : super(key: key); + + /// [homeModal] is a type of [MainScreenViewModel] which provides methods to handle the data for this component. + final MainScreenViewModel? homeModel; + + @override + Widget build(BuildContext context) { + final model = locator(); + return Scaffold( + appBar: AppBar( + // AppBar returns widget for the header. + backgroundColor: Theme.of(context).primaryColor, + key: const Key("ExploreEventsAppBar"), + elevation: 0.0, + automaticallyImplyLeading: false, + centerTitle: true, + title: Text( + AppLocalizations.of(context)!.strictTranslate('Explore Events'), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + leading: IconButton( + // returns a button of menu icon to redirect to home. + color: Theme.of(context).iconTheme.color, + icon: const Icon(Icons.menu), + onPressed: () => + MainScreenViewModel.scaffoldKey.currentState!.openDrawer(), + ), + actions: [ + Padding( + padding: EdgeInsets.only( + right: SizeConfig.screenWidth! * 0.027, + ), + // if the events is not empty then renders button for searching the events else renders just a box. + // child: model.events.isNotEmpty + // ? IconButton( + // onPressed: () { + // showSearch( + // context: context, + // delegate: EventSearch( + // eventList: model.events, + // exploreEventsViewModel: model, + // ), + // ); + // }, + // icon: const Icon(Icons.search, size: 20), + // ) + // : const SizedBox(), + child: const SizedBox(), + ), + ], + ), + // if the model is still fetching the events list then renders the Circular Progress Indicator + // else render refresh icon along with the list of searched events for exploration. + body: Stack( + children: [ + SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.screenWidth! * 0.010, + ), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Expanded( + flex: 3, + child: Card( + color: Theme.of(context).colorScheme.onPrimary, + elevation: 2, + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 20, + ), + //width: SizeConfig.screenWidth! * 0.45, + child: DropdownButtonHideUnderline( + child: dropDownList(model, context), + ), + ), + ), + ), + Expanded( + flex: 2, + child: GestureDetector( + onTap: () { + showDialog( + // on tap open the Explore Event Dialog. + context: context, + builder: (_) { + return const ExploreEventDialog( + key: Key('ExploreEvents'), + ); + }, + ); + }, + child: Card( + key: homeModel?.keySEDateFilter, + color: Theme.of(context).colorScheme.onPrimary, + child: Container( + padding: const EdgeInsets.symmetric( + vertical: 12, + ), + // width: SizeConfig.screenWidth! * 0.30, + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + const Icon( + Icons.calendar_today, + color: Color(0xff524F4F), + ), + const SizedBox( + width: 8, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate( + "Add Date", + ), + ), + ], + ), + ), + ), + ), + ), + Expanded( + flex: 1, + child: Card( + color: Theme.of(context).colorScheme.onPrimary, + child: IconButton( + onPressed: () { + navigationService.pushScreen( + Routes.calendar, + arguments: model.events, + ); + }, + icon: const Icon( + Icons.calendar_month, + ), + ), + ), + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.027, + ), + // if the events model is empty then renders a box with text as "Empty List" + // else renders lists of the all event tile. + model.events.isEmpty + ? SizedBox( + height: SizeConfig.screenHeight! * 0.5, + child: Center( + child: Text(model.emptyListMessage), + ), + ) + : ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: model.events.length, + itemBuilder: (BuildContext context, int index) { + return GestureDetector( + onTap: () { + navigationService.pushScreen( + "/eventInfo", + arguments: { + "event": model.events[index], + "exploreEventViewModel": model, + }, + ); + }, + child: EventCard( + event: model.events[index], + isSearchItem: false, + ), + ); + }, + ), + ], + ), + ), + ), + ], + ), + + floatingActionButton: FloatingActionButton.extended( + key: homeModel?.keySEAdd, + heroTag: "AddEventFab", + backgroundColor: Theme.of(context).colorScheme.background, + onPressed: () { + navigationService.pushScreen( + "/createEventPage", + ); + }, + icon: Icon( + Icons.add, + color: Theme.of(context).colorScheme.secondary, + ), + label: Text( + AppLocalizations.of(context)!.strictTranslate("Event"), + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith(color: Theme.of(context).colorScheme.secondary), + ), + ), + ); + } + + /// Shows a list of dropdown taken from `model` and `context`. + /// + /// **params**: + /// * `model`: contains the events data + /// * `context`: the overall context of UI + /// + /// **returns**: + /// * `Widget`: the dropdown + Widget dropDownList(ExploreEventsViewModel model, BuildContext context) { + return DropdownButton( + key: homeModel?.keySECategoryMenu, + value: model.chosenValue, + isExpanded: true, + items: [ + 'All Events', + 'Created Events', + 'Registered Events', + 'Public Events', + 'Private Events', + ].map>((String value) { + return DropdownMenuItem( + value: value, + child: Text( + AppLocalizations.of(context)!.strictTranslate(value), + style: Theme.of(context) + .textTheme + .titleLarge! + .copyWith(color: Theme.of(context).colorScheme.secondary), + ), + ); + }).toList(), + onChanged: (value) { + model.choseValueFromDropdown(value!); + }, + ); + } +} diff --git a/lib/views/demo_screens/organization_feed_demo.dart b/lib/views/demo_screens/organization_feed_demo.dart new file mode 100644 index 000000000..65a5f0463 --- /dev/null +++ b/lib/views/demo_screens/organization_feed_demo.dart @@ -0,0 +1,142 @@ +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/main_screen_view_model.dart'; +import 'package:talawa/widgets/pinned_post.dart'; + +/// OrganizationFeed returns a widget that shows the feed of the organization. +class DemoOrganizationFeed extends StatelessWidget { + const DemoOrganizationFeed({ + required Key key, + this.homeModel, + this.forTest = false, + }) : super(key: key); + + /// MainScreenViewModel. + final MainScreenViewModel? homeModel; + + /// To implement the test. + final bool forTest; + + /// List of dummy pinned posts. + static const List> pinnedPosts = [ + { + 'text': 'Church Meeting', + '_id': 'hdkahfu567', + 'imageUrl': + 'https://i2-prod.manchestereveningnews.co.uk/incoming/article25630061.ece/ALTERNATES/s615/2_Church-PA.jpg', + 'createdAt': '2023-12-14T08:30:00Z', + }, + { + 'text': 'Russia-Ukraine war leads to Hike in Gas prices in Europe.', + '_id': 'hfkajhk669', + 'imageUrl': + 'https://gdb.voanews.com/3B960F7F-786C-452C-8ABD-9D5AEEAED9D9.jpg', + 'createdAt': '2023-12-14T08:30:00Z', + }, + { + 'text': 'Flood in near village.', + '_id': 'adadada555', + 'imageUrl': + 'https://www.deccanherald.com/sites/dh/files/styles/article_detail/public/articleimages/2022/08/03/file7m4trf3i92e1krs53cn6-1132513-1659475940.jpg?itok=oVs3TTP8', + 'createdAt': '2023-12-14T08:30:00Z', + }, + { + 'text': 'The craze behind auto-tech stocks.', + '_id': 'nvikaebkf', + 'imageUrl': + 'https://akm-img-a-in.tosshub.com/businesstoday/images/assets/202303/stock-market-02136-4-sixteen_nine.jpg', + 'createdAt': '2023-12-14T08:30:00Z', + }, + { + 'text': 'High seas treaty', + '_id': 'nfqbkbd', + 'imageUrl': + 'https://ichef.bbci.co.uk/news/976/cpsprodpb/A194/production/_128846314_humpbackwhale.jpg', + 'createdAt': '2023-12-14T08:30:00Z', + }, + { + 'text': 'WWE Wrestking and Gambling', + '_id': 'dadadada', + 'imageUrl': + 'https://staticc.sportskeeda.com/editor/2023/03/a9b3a-16783664764772-1920.jpg', + 'createdAt': '2023-12-14T08:30:00Z', + }, + { + 'text': 'Dead of Silicon Valley Bank.', + '_id': 'hfkaaddadajhk669', + 'imageUrl': + 'https://thechainsaw.com/wp-content/uploads/2023/03/2023-50.jpg?w=1200', + 'createdAt': '2023-12-14T08:30:00Z', + }, + { + 'text': 'What if women were paid for chores', + '_id': 'kofapjfn', + 'imageUrl': + 'https://www.shethepeople.tv/wp-content/uploads/2019/06/household.png', + 'createdAt': '2023-12-14T08:30:00Z', + }, + { + 'text': 'Debate over stocks bybacks.', + '_id': 'agdjvfhsjaf', + 'imageUrl': + 'https://m.wsj.net/video/20200105/wsjglossarystockbuybackssplash/wsjglossarystockbuybackssplash_640x360.jpg', + 'createdAt': '2023-12-14T08:30:00Z', + }, + ]; + + /// function returns a widget that shows the feed of the organization. + /// + /// **params**: + /// * `context`: build context of the widget. + /// + /// **returns**: + /// * `Widget`: returns a widget that shows the feed of the organization. + Widget demoOrganisationFeedPage(BuildContext context) { + return Scaffold( + appBar: AppBar( + // AppBar returns a widget for the header of the page. + backgroundColor: Colors.green, + // Theme.of(context).primaryColor, + elevation: 0.0, + centerTitle: true, + title: Text( + AppLocalizations.of(context)!.strictTranslate("Organisation Name"), + key: homeModel?.keySHOrgName, + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontSize: 20, + color: Colors.white, + ), + ), + leading: IconButton( + key: homeModel?.keySHMenuIcon, + icon: Icon( + Icons.menu, + color: Theme.of(context).iconTheme.color, + ), + onPressed: () { + MainScreenViewModel.scaffoldKey.currentState!.openDrawer(); + }, + ), + ), + // if the model is fetching the data then renders Circular Progress Indicator else renders the result. + body: ListView( + shrinkWrap: true, + children: [ + // If the organization has pinned posts then renders PinnedPostCarousel widget else Container. + PinnedPost( + pinnedPost: pinnedPosts.map((map) => Post.fromJson(map)).toList(), + model: homeModel!, + ), + // If the organization has posts then renders PostListWidget widget else Container. + Container(), + ], + ), + ); + } + + @override + Widget build(BuildContext context) { + return demoOrganisationFeedPage(context); + } +} diff --git a/lib/views/demo_screens/profile_page_demo.dart b/lib/views/demo_screens/profile_page_demo.dart new file mode 100644 index 000000000..7210cfcd0 --- /dev/null +++ b/lib/views/demo_screens/profile_page_demo.dart @@ -0,0 +1,251 @@ +import 'package:contained_tab_bar_view/contained_tab_bar_view.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/main_screen_view_model.dart'; +import 'package:talawa/widgets/custom_avatar.dart'; +import 'package:talawa/widgets/from_palisadoes.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; + +/// ProfilePage returns a widget that renders a page of user's profile. +class DemoProfilePage extends StatelessWidget { + const DemoProfilePage({ + required Key key, + this.homeModel, + }) : super(key: key); + + /// MainScreenViewModel. + /// + final MainScreenViewModel? homeModel; + + @override + Widget build(BuildContext context) { + print(userConfig.loggedIn); + return Scaffold( + key: const Key('DemoProfilePage'), + appBar: AppBar( + backgroundColor: Colors.green, + // Theme.of(context).primaryColor, + elevation: 0.0, + centerTitle: true, + leading: IconButton( + color: Theme.of(context).iconTheme.color, + icon: const Icon(Icons.menu), + onPressed: () { + MainScreenViewModel.scaffoldKey.currentState!.openDrawer(); + }, + ), + key: const Key("ProfilePageAppBar"), + title: Text( + AppLocalizations.of(context)!.strictTranslate('Profile'), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + // fontWeight: FontWeight.w600, + fontSize: 20, + fontFamily: 'open-sans', + color: Colors.white, + ), + ), + actions: [ + IconButton( + key: const Key('settingIcon'), + onPressed: () { + print('came'); + navigationService.pushScreen(Routes.appSettings); + }, + icon: const Icon(Icons.settings), + ), + ], + ), + // if data fetching is under process then renders Circular Progress Icon + // else renders the widget. + body: guestViewWidget(context), + ); + } + + /// guestViewWidget, this widget is shown if user is not logged in. + /// + /// **params**: + /// * `context`: Build context to perform context related operation + /// + /// **returns**: + /// * `Widget`: Widget + Widget guestViewWidget(BuildContext context) { + return SingleChildScrollView( + child: Column( + children: [ + SizedBox( + height: SizeConfig.screenHeight! * 0.01, + ), + Row( + children: [ + Expanded( + flex: 1, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: CustomAvatar( + isImageNull: true, + firstAlphabet: "U", + imageUrl: null, + fontSize: Theme.of(context).textTheme.titleLarge!.fontSize, + maxRadius: 30, + ), + ), + ), + const Expanded( + flex: 3, + child: Padding( + padding: EdgeInsets.all(8.0), + child: Text( + 'User', + style: TextStyle( + color: Colors.white, + fontSize: 20, + fontFamily: 'open-sans', + ), + ), + ), + ), + // Expanded( + // flex: 1, + // child: IconButton( + // icon: Icon( + // Icons.share, + // color: + // Theme.of(context).colorScheme.secondary, + // ), + // onPressed: () => model.invite(context), + // ), + // ), + ], + ), + const SizedBox( + height: 20, + ), + RaisedRoundedButton( + key: homeModel!.keySPDonateUs, + buttonLabel: AppLocalizations.of(context)!.strictTranslate( + 'Donate to the Community', + ), + onTap: () { + MainScreenViewModel.scaffoldKey.currentState?.openDrawer(); + }, + textColor: Theme.of(context) + .inputDecorationTheme + .focusedBorder! + .borderSide + .color, + backgroundColor: Theme.of(context).colorScheme.secondaryContainer, + ), + SizedBox( + height: 600, + width: double.infinity, + child: ContainedTabBarView( + tabs: [ + Tab( + text: AppLocalizations.of(context)!.strictTranslate('Posts'), + ), + Tab( + text: AppLocalizations.of(context)!.strictTranslate('Events'), + ), + Tab( + text: AppLocalizations.of(context)!.strictTranslate('Tasks'), + ), + ], + views: [ + ColoredBox( + color: Theme.of(context).colorScheme.background, + child: GridView.count( + mainAxisSpacing: 5, + crossAxisCount: 3, + children: [ + Image.asset('assets/images/pfp2.png'), + Image.asset('assets/images/pfp2.png'), + Image.asset('assets/images/pfp2.png'), + Image.asset('assets/images/pfp2.png'), + Image.asset('assets/images/pfp2.png'), + ], + ), + ), + Container( + color: Theme.of(context).colorScheme.background, + ), + Container( + color: Theme.of(context).colorScheme.onPrimary, + ), + ], + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.67, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: SizeConfig.screenHeight! * 0.01, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.05, + ), + + /// `Donation` acts as plugin. If visible is true the it will be always visible. + /// even if it's uninstalled by the admin (for development purposes) + //TODO: custom tile for Invitation. + // CustomListTile( + // key: homeModel!.keySPInvite, + // index: 3, + // type: TileType.option, + // option: Options( + // icon: Icon( + // Icons.share, + // color: + // Theme.of(context).colorScheme.secondary, + // size: 30, + // ), + // // title + // title: AppLocalizations.of(context)! + // .strictTranslate('Invite'), + // // subtitle + // subtitle: AppLocalizations.of(context)! + // .strictTranslate('Invite to org'), + // ), + // // on tap call the invite function + // onTapOption: () => model.invite(context), + // ), + SizedBox( + height: SizeConfig.screenHeight! * 0.05, + ), + // Custom tile for Logout option. + //TODO: logout + // CustomListTile( + // key: homeModel!.keySPLogout, + // index: 3, + // type: TileType.option, + // option: Options( + // icon: Icon( + // Icons.logout, + // color: + // Theme.of(context).colorScheme.secondary, + // size: 30, + // ), + // title: AppLocalizations.of(context)! + // .strictTranslate('Log out'), + // subtitle: AppLocalizations.of(context)! + // .strictTranslate('Log out from Talawa'), + // ), + // // on tap calls the logout function + // onTapOption: () => model.logout(context), + // ), + SizedBox( + height: SizeConfig.screenHeight! * 0.05, + ), + FromPalisadoes(key: homeModel!.keySPPalisadoes), + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/views/main_screen.dart b/lib/views/main_screen.dart new file mode 100644 index 000000000..f3239cf49 --- /dev/null +++ b/lib/views/main_screen.dart @@ -0,0 +1,106 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/mainscreen_navigation_args.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/custom_drawer.dart'; + +/// This widget is responsible for displaying the main screen of the application. +class MainScreen extends StatefulWidget { + const MainScreen({super.key, required this.mainScreenArgs}); + + /// Holds data for the MainScreenArgs model, providing information to MainScreen. + final MainScreenArgs mainScreenArgs; + + @override + State createState() => _MainScreenState(); +} + +class _MainScreenState extends State { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) { + model.initialise( + context, + fromSignUp: widget.mainScreenArgs.fromSignUp, + mainScreenIndex: widget.mainScreenArgs.mainScreenIndex, + demoMode: widget.mainScreenArgs.toggleDemoMode, + ); + }, + builder: (context, model, child) { + // Checks for updates in plugins from the server. + // Will continously hit the server and fetch plugin information. + model.fetchAndAddPlugins(context); + return Scaffold( + key: MainScreenViewModel.scaffoldKey, + drawer: CustomDrawer( + homeModel: model, + key: const Key("Custom Drawer"), + ), + body: Stack( + children: [ + IndexedStack( + index: model.currentPageIndex, + children: model.pages, + ), + widget.mainScreenArgs.toggleDemoMode + ? Positioned( + bottom: 0, // Adjust this value as per your UI + left: 0, + right: 0, + child: InkWell( + key: const Key('banner'), + onTap: () => navigationService + .pushScreen(Routes.setUrlScreen, arguments: ''), + child: Container( + height: 30.0, // Set the desired height of the banner + color: Theme.of(context) + .canvasColor, // Change color as needed + child: Center( + child: RichText( + text: TextSpan( + children: [ + TextSpan( + text: AppLocalizations.of(context)! + .strictTranslate( + 'For complete access, please', + ), + style: + Theme.of(context).textTheme.bodySmall, + ), + TextSpan( + text: AppLocalizations.of(context)! + .strictTranslate( + 'join an organization.', + ), + style: TextStyle( + color: Theme.of(context) + .colorScheme + .secondary, + ), + ), + ], + ), + ), + ), + ), + ), + ) + : Container(), + ], + ), + bottomNavigationBar: BottomNavigationBar( + type: BottomNavigationBarType.fixed, + currentIndex: model.currentPageIndex, + onTap: model.onTabTapped, + selectedItemColor: const Color(0xff34AD64), + items: model.navBarItems, + ), + ); + }, + ); + } +} 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..9f292b3fe --- /dev/null +++ b/lib/views/pre_auth_screens/change_password.dart @@ -0,0 +1,160 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +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/utils/validators.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; +import 'package:talawa/widgets/rich_text.dart'; + +/// This widget lets the user change his/her password. +/// There are two input fields. The first one is for entering the new password, and the +/// second one is for re-entering the password for verification. +/// There is a raised button which finally updates the password when pressed. +class ChangePass extends StatefulWidget { + const ChangePass({required Key key}) : super(key: key); + + @override + _ChangePassState createState() => _ChangePassState(); +} + +class _ChangePassState extends State { + final formKey = GlobalKey(); + final TextEditingController newPassword = TextEditingController(); + final TextEditingController reNewPassword = TextEditingController(); + final FocusNode newPasswordFocus = FocusNode(); + final FocusNode reNewPasswordFocus = FocusNode(); + + @override + Widget build(BuildContext context) { + //custom text variable (List). + final text = [ + { + 'text': "${AppLocalizations.of(context)!.translate("Hello")}, ", + 'textStyle': Theme.of(context).textTheme.headlineSmall, + }, + { + 'text': '${AppLocalizations.of(context)!.translate("User Name")} ', + 'textStyle': + Theme.of(context).textTheme.titleLarge!.copyWith(fontSize: 24), + }, + { + 'text': "${AppLocalizations.of(context)!.translate("we've")} ", + 'textStyle': Theme.of(context).textTheme.headlineSmall, + }, + { + 'text': + '${AppLocalizations.of(context)!.translate("got you covered")} ', + 'textStyle': Theme.of(context).textTheme.headlineSmall, + }, + ]; + return Scaffold( + key: const Key('ChangePassScreenScaffold'), + 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: Form( + key: formKey, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomRichText( + key: const Key('ChangePageText'), + words: text, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.05, + ), + // Text field taking the input of the password + TextFormField( + key: const Key('PassInputField'), + controller: newPassword, + focusNode: newPasswordFocus, + textInputAction: TextInputAction.done, + keyboardType: TextInputType.text, + enableSuggestions: true, + autofillHints: const [AutofillHints.password], + obscureText: true, + validator: (pass) => Validator.validatePassword(pass!), + decoration: InputDecoration( + hintText: + AppLocalizations.of(context)!.translate('password'), + labelText: + '${AppLocalizations.of(context)!.translate("Enter new password")} *', + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.025, + ), + // Text field taking the input of the password again for verification + TextFormField( + key: const Key('PassRepeatInputField'), + controller: reNewPassword, + focusNode: reNewPasswordFocus, + textInputAction: TextInputAction.done, + keyboardType: TextInputType.text, + enableSuggestions: true, + autofillHints: const [AutofillHints.password], + obscureText: true, + validator: (pass) => Validator.validatePasswordConfirm( + pass!, + newPassword.text, + ), + decoration: InputDecoration( + hintText: + AppLocalizations.of(context)!.translate('password'), + labelText: + '${AppLocalizations.of(context)!.translate("Re-Enter your password")} *', + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.086, + ), + // Button for changing the password + RaisedRoundedButton( + buttonLabel: + '${AppLocalizations.of(context)!.translate("Change Password")} ', + onTap: () { + formKey.currentState!.validate(); + newPasswordFocus.unfocus(); + reNewPasswordFocus.unfocus(); + }, + textColor: const Color(0xFF008A37), + key: const Key('ChangePasswordButton'), + 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..2fc9b39fa --- /dev/null +++ b/lib/views/pre_auth_screens/login.dart @@ -0,0 +1,198 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.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/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'; + +/// This is the login widget. +/// +/// There are two input fiels. The first one takes in the email and +/// the second one takes in the password of the user. +/// There is also a "Forgot Password" text button, which directs to +/// the "recover password" screen when pressed. +/// At the bottom, there is a login button to initiate the login. +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( + resizeToAvoidBottomInset: true, + appBar: AppBar( + elevation: 0.0, + backgroundColor: Colors.transparent, + leading: IconButton( + icon: const Icon( + Icons.arrow_back, + ), + onPressed: () { + navigationService.pop(); + }, + ), + ), + body: SingleChildScrollView( + 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: [ + //Custom greeting text. + CustomRichText( + key: const Key('UrlPageText'), + words: model.greeting, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.05, + ), + //Input form for the email of the user. + TextFormField( + key: const Key('EmailInputField'), + 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.titleMedium, + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.025, + ), + //Input form for the password of the user. + TextFormField( + key: const Key('PasswordInputField'), + 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.titleMedium, + ), + ), + //Option to recover the password if the user forgets his/her password. + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + TextButton( + onPressed: () { + navigationService.showTalawaErrorSnackBar( + 'Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,\$,etc.)', + MessageType.info, + ); + }, + child: const Text( + 'Tip', + style: TextStyle( + fontSize: 14, + color: Colors.green, + fontFamily: 'open-sans', + ), + ), + ), + TextButton( + onPressed: () { + model.emailFocus.unfocus(); + model.passwordFocus.unfocus(); + navigationService.pushScreen('/recover'); + }, + child: Text( + '${AppLocalizations.of(context)!.translate("Forgot password")}?', + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith( + fontSize: 14, + color: const Color(0xFF4285F4), + ), + ), + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.086, + ), + //Button to initiate the login. + 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..59c89799a --- /dev/null +++ b/lib/views/pre_auth_screens/recover.dart @@ -0,0 +1,123 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +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/utils/validators.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; +import 'package:talawa/widgets/rich_text.dart'; + +/// This class recovers the users password. +/// The users needs to enter his/her email and press on the button at the bottom to recover his/her password. +class Recover extends StatefulWidget { + const Recover({required Key key}) : super(key: key); + + @override + _RecoverState createState() => _RecoverState(); +} + +class _RecoverState extends State { + final TextEditingController email = TextEditingController(); + final formKey = GlobalKey(); + + @override + Widget build(BuildContext context) { + final text = [ + { + 'text': + "${AppLocalizations.of(context)!.translate("Sit back relax, we'll")} ", + 'textStyle': Theme.of(context).textTheme.headlineSmall, + }, + { + 'text': '${AppLocalizations.of(context)!.translate("Recover")} ', + 'textStyle': + Theme.of(context).textTheme.titleLarge!.copyWith(fontSize: 24), + }, + { + 'text': AppLocalizations.of(context)!.translate("your password"), + 'textStyle': Theme.of(context).textTheme.headlineSmall, + }, + ]; + return Scaffold( + key: const Key('RecoverScreenScaffold'), + 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, + //custom text at the top of the screen + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomRichText( + key: const Key('RecoverPageText'), + words: text, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.05, + ), + //This form takes the email of the user as an input + Form( + key: formKey, + child: TextFormField( + key: const Key('EmailInputField'), + controller: email, + textInputAction: TextInputAction.next, + keyboardType: TextInputType.emailAddress, + autofillHints: const [AutofillHints.email], + enableSuggestions: true, + validator: (email) => Validator.validateEmail(email!), + decoration: InputDecoration( + hintText: + AppLocalizations.of(context)!.translate("Email Hint"), + labelText: + '${AppLocalizations.of(context)!.translate("Enter your registered Email")} *', + labelStyle: Theme.of(context).textTheme.titleMedium, + ), + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.086, + ), + //Button to initiate the process of recovering password. + RaisedRoundedButton( + buttonLabel: AppLocalizations.of(context)! + .strictTranslate('Recover Password'), + onTap: () { + formKey.currentState!.validate(); + }, + 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..ef71ca2b1 --- /dev/null +++ b/lib/views/pre_auth_screens/select_language.dart @@ -0,0 +1,160 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:talawa/constants/constants.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; + +/// This widget enables us to select a different language. +/// +/// The default language is English. We can choose among the options to switch the language. +/// There is a text button at the right bottom of the screen which changes the language when tapped. +/// The user finally gets redirected to the previous screen. +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: SizedBox( + height: SizeConfig.screenHeight! * 0.045, + child: FittedBox( + // Heading of the screen: "Select Language" + child: Text( + AppLocalizations.of(context)! + .strictTranslate('Select Language'), + style: Theme.of(context).textTheme.headlineSmall, + 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) { + // Returns a list of all the languages available + 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 + .titleLarge, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate('Default'), + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith( + color: const Color(0xFF4285F4), + ), + ), + ], + ) + : Text( + languages[index].langName, + style: Theme.of(context).textTheme.titleLarge, + key: const Key('LanguageItem'), + ), + ); + }, + ), + ); + }, + ), + ), + const Divider( + color: Color(0xffe5e5e5), + ), + // Text Button which changes the language when tapped. + Container( + height: SizeConfig.screenHeight! * 0.08, + alignment: Alignment.centerRight, + child: TextButton( + key: const Key('NavigateToMainScreen'), + onPressed: () async { + Provider.of(context, listen: false) + .selectLanguagePress(); + }, + child: Text( + AppLocalizations.of(context)!.strictTranslate('Select'), + style: Theme.of(context).textTheme.headlineSmall!.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..1c89c3993 --- /dev/null +++ b/lib/views/pre_auth_screens/select_organization.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.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/organization_list.dart'; + +/// This widget lets the user select new organizations. +/// +/// There is a list tile which displays the organization selected by the user. +/// He/she needs to press the "continue" button to proceed. +class SelectOrganization extends StatefulWidget { + const SelectOrganization({required Key key, required this.selectedOrgId}) + : super(key: key); + + /// Contains Integer value for selected org id. + 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: false, + appBar: AppBar( + backgroundColor: Colors.transparent, + ), + body: Padding( + padding: EdgeInsets.only(top: SizeConfig.safeBlockVertical!), + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 18, + ), + child: Text( + AppLocalizations.of(context)! + .strictTranslate("Choose an Organization"), + style: const TextStyle(fontSize: 40), + ), + ), + Expanded(child: OrganizationList(model: model)), + 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..3e123aaa6 --- /dev/null +++ b/lib/views/pre_auth_screens/set_url.dart @@ -0,0 +1,237 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/custom_painters/language_icon.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:talawa/utils/validators.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/widgets/raised_round_edge_button.dart'; +import 'package:talawa/widgets/rich_text.dart'; + +/// This widget lets a user sign in/up with the organization url. +/// +/// The user can enter an organization through the QR code scanner, +/// or enter the organization URL and then login. +/// There is also a signup option which navigates to a screen for the user +/// to select an organization. +/// At the bottom, there is also a gesture detector for changing the language. +class SetUrl extends StatefulWidget { + const SetUrl({required Key key, required this.uri}) : super(key: key); + + /// Variable. + final String uri; + + @override + _SetUrlState createState() => _SetUrlState(); +} + +class _SetUrlState extends State { + @override + Widget build(BuildContext context) { + print("built"); + 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: SingleChildScrollView( + scrollDirection: Axis.vertical, + child: 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: [ + Container( + alignment: Alignment.centerRight, + margin: EdgeInsets.only( + top: SizeConfig.safeBlockVertical! * 2, + ), + // QR code scanner for joining the organization. + child: IconButton( + icon: const Icon( + Icons.qr_code_scanner, + size: 30, + semanticLabel: 'Join Organisation with QR', + ), + onPressed: () => model.scanQR(context), + // model.scanQR(context), + ), + ), + 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, + ), + painter: AppLogo(), + ), + ), + CustomRichText( + key: const Key('UrlPageText'), + words: model.greeting, + ), + //Form input for entering the organization URL + 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( + labelText: + '${AppLocalizations.of(context)!.translate("Enter Community URL")} *', + labelStyle: Theme.of(context).textTheme.titleMedium, + suffixIcon: InkWell( + key: const Key('VerifyButton'), + onTap: () async { + model.urlFocus.unfocus(); + model.validate = AutovalidateMode.always; + model.formKey.currentState!.validate(); + + /// Checking url. If valid, than show the pop-up + await model.checkURLandShowPopUp(''); + }, + child: Container( + height: 48, + width: 48, + alignment: Alignment.center, + child: Text( + AppLocalizations.of(context)! + .strictTranslate("Verify"), + style: Theme.of(context).textTheme.bodyLarge, + textAlign: TextAlign.center, + ), + ), + ), + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.086, + ), + //Login button. + RaisedRoundedButton( + key: const Key('LoginButton'), + buttonLabel: AppLocalizations.of(context)! + .strictTranslate('Login'), + onTap: () async { + /// Checking url. If valid, than navigating to login route + await model.checkURLandNavigate('/login', ''); + }, + showArrow: true, + textColor: Theme.of(context) + .inputDecorationTheme + .focusedBorder! + .borderSide + .color, + backgroundColor: + Theme.of(context).colorScheme.secondaryContainer, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + //Sign up button. + RaisedRoundedButton( + key: const Key('SignUpButton'), + buttonLabel: AppLocalizations.of(context)! + .strictTranslate('Sign Up'), + onTap: () => model.checkURLandNavigate( + '/selectOrg', + model.orgId, + ), + showArrow: true, + textColor: + Theme.of(context).colorScheme.secondaryContainer, + backgroundColor: Theme.of(context) + .inputDecorationTheme + .focusedBorder! + .borderSide + .color, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.06, + ), + //Gesture Detector which navigates to a different screen for changing the language. + GestureDetector( + key: const Key('ChangeLanguage'), + onTap: () { + navigationService + .pushScreen(Routes.languageSelectionRoute); + }, + child: Padding( + padding: EdgeInsets.only( + bottom: SizeConfig.safeBlockVertical! * 2, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + CustomPaint( + size: Size( + SizeConfig.screenWidth! * 0.125, + SizeConfig.screenWidth! * 0.125 * 0.5, + ), + painter: LanguageIcon(), + ), + const SizedBox( + width: 10, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate('Change language'), + style: Theme.of(context) + .textTheme + .titleLarge! + .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..06a39bb5c --- /dev/null +++ b/lib/views/pre_auth_screens/signup_details.dart @@ -0,0 +1,303 @@ +import 'package:flutter/material.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/app_localization.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'; + +/// This widget takes the user details for signup. The form includes first name, last name, email, password, and password confirmation inputs. +class SignUpDetails extends StatefulWidget { + const SignUpDetails({required Key key, required this.selectedOrg}) + : super(key: key); + + /// Details of selected Organisation. + 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( + resizeToAvoidBottomInset: + true, // To allow the keyboard to not overlap the form + extendBodyBehindAppBar: true, + appBar: AppBar( + elevation: 0.0, + backgroundColor: Colors.transparent, + automaticallyImplyLeading: false, + leading: IconButton( + icon: const Icon( + Icons.arrow_back, + ), + onPressed: () { + navigationService.pop(); + }, + ), + ), + body: Padding( + padding: EdgeInsets.only(top: SizeConfig.safeBlockVertical! * 6), + child: SingleChildScrollView( + scrollDirection: Axis.vertical, + 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, + ), //Input field for the first name of the user. + TextFormField( + key: const Key('FirstNameInputField'), + 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.titleMedium, + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.015, + ), //Input field for the last name of the user. + TextFormField( + key: const Key('LastNameInputField'), + 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.titleMedium, + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.015, + ), + //Input field for the email of the user. + TextFormField( + key: const Key('signUpEmailField'), + 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.titleMedium, + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.015, + ), //Input field for the password of the user. + TextFormField( + key: const Key('signuppassword'), + 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.titleMedium, + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.015, + ), //Input field for the confirmation of the password of the user. + 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.titleMedium, + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.086, + ), + ], + ), + ), //Sign up button. + 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_screen.dart b/lib/views/pre_auth_screens/waiting_screen.dart new file mode 100644 index 000000000..5615793c1 --- /dev/null +++ b/lib/views/pre_auth_screens/waiting_screen.dart @@ -0,0 +1,128 @@ +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'; + +/// Displays a screen instructing the user to wait for approval. +class WaitingPage extends StatelessWidget { + const WaitingPage({super.key}); + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(context), + builder: (context, model, child) { + return Scaffold( + key: const Key('WaitingPageScaffold'), + 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.center, + 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: [ + //Greeting text + CustomRichText( + key: const Key('WaitingPageText'), + words: model.greeting, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.03, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate('Request Sent to'), + style: Theme.of(context).textTheme.titleLarge, + ), + ], + ), + ), + //Information of the organization to which the request is sent. + Expanded( + child: ListView.builder( + key: const Key('PendingRequestList'), + shrinkWrap: true, + 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) {}, + ); + }, + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + //Join organization button + RaisedRoundedButton( + key: const Key('JoinOrg'), + buttonLabel: AppLocalizations.of(context)! + .strictTranslate('Join Organisation'), + onTap: model.joinOrg, + showArrow: true, + textColor: Theme.of(context).colorScheme.secondaryContainer, + backgroundColor: Theme.of(context) + .inputDecorationTheme + .focusedBorder! + .borderSide + .color, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + //Logout button + 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.secondaryContainer, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + ], + ), + ), + ); + }, + ); + } +} diff --git a/lib/widgets/add_members_bottom_sheet.dart b/lib/widgets/add_members_bottom_sheet.dart new file mode 100644 index 000000000..9344857d1 --- /dev/null +++ b/lib/widgets/add_members_bottom_sheet.dart @@ -0,0 +1,126 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/models/user/user_info.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'; + +/// Adds members to an event. +class EventBottomSheet { + /// This function creates a modal material design bottom sheet. + /// + /// to let the user add admin or members to an organization. + /// **params**: + /// * `context`: BuildContext + /// * `model`: CreateEventViewModel + /// + /// **returns**: + /// None + void addUserBottomSheet({ + required BuildContext context, + required CreateEventViewModel model, + }) { + // Returns a Future that resolves to the value ("context") passed + // to Navigator.pop + showModalBottomSheet( + context: context, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), + isScrollControlled: true, + builder: (BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + child: Container( + height: MediaQuery.of(context).size.height * 0.8, + decoration: BoxDecoration( + color: Theme.of(context).scaffoldBackgroundColor, + ), + child: Padding( + padding: const EdgeInsets.all(10), + child: Column( + children: [ + Text( + AppLocalizations.of(context)! + .strictTranslate("Add Members"), + style: const TextStyle(fontSize: 16), + ), + TextButton( + key: const Key('text_btn_ambs1'), + onPressed: () { + model.buildUserList(); + Navigator.pop(context); + }, + child: Text( + AppLocalizations.of(context)!.strictTranslate('Done'), + ), + ), + const Divider(), + FutureBuilder( + // an admin can access the list of the members in an organization + future: model.getCurrentOrgUsersList(), + builder: ( + BuildContext context, + AsyncSnapshot> snapshot, + ) { + if (snapshot.data == null) { + return const Center( + child: CircularProgressIndicator(), + ); + } else { + return snapshot.data!.isEmpty + ? const Center( + child: Text( + "There aren't any members in this organization.", + ), + ) + // Displaying the list of the members + : Flexible( + child: ListView.builder( + shrinkWrap: true, + itemCount: snapshot.data!.length, + itemBuilder: (context, index) { + return CheckboxListTile( + checkColor: Theme.of(context) + .colorScheme + .background, + activeColor: Theme.of(context) + .colorScheme + .primary, + title: Text( + "${snapshot.data![index].firstName!} ${snapshot.data![index].lastName!}", + ), + value: model.memberCheckedMap[ + snapshot.data![index].id], + onChanged: (val) { + setState( + () { + model.memberCheckedMap[snapshot + .data![index].id!] = val!; + }, + ); + }, + ); + }, + ), + ); + } + }, + ), + ], + ), + ), + ), + ); + }, + ); + }, + ); + } +} diff --git a/lib/widgets/create_recurring_event_helper_widgets.dart b/lib/widgets/create_recurring_event_helper_widgets.dart new file mode 100644 index 000000000..16c31b1bc --- /dev/null +++ b/lib/widgets/create_recurring_event_helper_widgets.dart @@ -0,0 +1,321 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:intl/intl.dart'; +import 'package:talawa/constants/recurrence_values.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart'; +import 'package:talawa/widgets/date_time_picker.dart'; + +/// Builds a rectangle with custom properties. +class CustomRectangle extends StatelessWidget { + const CustomRectangle({ + super.key, + required this.child, + }); + + /// widget that is wrapped with CustomRectangle. + final Widget child; + + @override + Widget build(BuildContext context) { + final repeatEveryBoxDecoration = BoxDecoration( + border: Border.all( + color: Theme.of(context).textTheme.bodyLarge!.color!, + width: 1, + ), + borderRadius: BorderRadius.circular(5), + ); + return Container( + decoration: repeatEveryBoxDecoration, + child: Center(child: child), + ); + } +} + +/// Builds a TextField with custom properties. +class CustomTextField extends StatelessWidget { + const CustomTextField({ + super.key, + this.maxTextLength, + required this.textEditingController, + this.readOnly = false, + this.enabled, + }); + + /// Max textLength the text field allows. + final int? maxTextLength; + + /// Controller of textField. + final TextEditingController textEditingController; + + /// Indicates wether text field is enabled. + final bool? enabled; + + /// Indicates wether text field is read only. + final bool readOnly; + + @override + Widget build(BuildContext context) { + final outLineBorder = OutlineInputBorder( + borderSide: + BorderSide(color: Theme.of(context).textTheme.bodyLarge!.color!), + ); + return SizedBox( + width: SizeConfig.screenWidth! * 0.15, + child: TextField( + maxLength: maxTextLength, + textAlign: TextAlign.center, + keyboardType: TextInputType.number, + inputFormatters: [FilteringTextInputFormatter.digitsOnly], + controller: textEditingController, + decoration: InputDecoration( + counterText: "", + enabledBorder: outLineBorder, + focusedBorder: outLineBorder, + border: outLineBorder, + disabledBorder: outLineBorder, + contentPadding: const EdgeInsets.symmetric(vertical: 14), + ), + enabled: enabled, + readOnly: readOnly, + ), + ); + } +} + +/// Recurrence Frequency selection widget. +class RecurrenceFrequencyDropdown extends StatefulWidget { + const RecurrenceFrequencyDropdown({ + required this.model, + required this.onSelected, + required this.options, + required this.selectedOption, + }); + + /// Instance of create event view model. + final CreateEventViewModel model; + + /// Callback to be executed when selected value changes. + final void Function(String)? onSelected; + + /// Options to be shown in dropdown. + final List options; + + /// Selected option. + final String selectedOption; + + @override + _RecurrenceFrequencyDropdownState createState() => + _RecurrenceFrequencyDropdownState(); +} + +class _RecurrenceFrequencyDropdownState + extends State { + @override + Widget build(BuildContext context) { + return CustomRectangle( + child: Container( + padding: const EdgeInsets.all(12), + child: Center( + child: Row( + mainAxisAlignment: MainAxisAlignment + .center, // Align the row's contents to the center horizontally + children: [ + PopupMenuButton( + offset: const Offset(0, 40), + itemBuilder: (BuildContext context) { + return >[ + for (int i = 0; i < widget.options.length; i++) + PopupMenuItem( + value: widget.options[i], + child: Text(widget.options[i]), + ), + ]; + }, + onSelected: widget.onSelected, + tooltip: 'Select option', + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text(widget.selectedOption), + const Icon(Icons.arrow_drop_down), + ], + ), + ), + ], + ), + ), + ), + ); + } +} + +/// Event ending configuration options. +class EventEndOptions extends StatefulWidget { + const EventEndOptions({super.key, required this.model}); + + /// Instance of create event view model. + final CreateEventViewModel model; + + @override + State createState() => _EventEndOptionsState(); +} + +class _EventEndOptionsState extends State { + /// Event end types. + List eventEndTypes = [ + EventEndTypes.never, + EventEndTypes.on, + EventEndTypes.after, + ]; + + /// Custom inline width. + static const inlineWidth = SizedBox( + width: 8, + ); + + @override + void initState() { + if (widget.model.eventEndType == EventEndTypes.never) { + widget.model.eventEndDate = null; + } + super.initState(); + } + + @override + Widget build(BuildContext context) { + print(widget.model.eventEndType); + print(widget.model.recurrance); + print(widget.model.recurranceFrequency); + return Column( + children: [ + radioButton( + key: const Key('neverRadioButton'), + child: const Text(EventEndTypes.never), + index: 0, + inputAction: () { + widget.model.setEventEndDate(null); + setState(() { + widget.model.eventEndType = EventEndTypes.never; + }); + }, + ), + radioButton( + key: const Key('onRadioButton'), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + const Text(EventEndTypes.on), + inlineWidth, + CustomRectangle( + child: Container( + padding: const EdgeInsets.symmetric(horizontal: 4), + child: IconButton( + key: const Key('dateSelectorCalendar'), + // button to select the date and time of an event. + onPressed: () async { + // initially pickedDate is initialised with current end time. + final pickedDate = await customDatePicker( + initialDate: + widget.model.eventEndOnEndDate ?? DateTime.now(), + ); + setState(() { + widget.model.eventEndOnEndDate = pickedDate; + widget.model.eventEndType = EventEndTypes.on; + }); + }, + icon: Text( + formatDate( + widget.model.eventEndOnEndDate.toString().split(" ")[0], + ), + style: widget.model.eventEndType == EventEndTypes.on + ? TextStyle(color: Theme.of(context).dividerColor) + : TextStyle( + color: Theme.of(context) + .dividerColor + .withOpacity(0.4), + ), + ), + ), + ), + ), + ], + ), + index: 1, + inputAction: () { + setState(() { + widget.model.eventEndType = EventEndTypes.on; + }); + }, + ), + radioButton( + key: const Key('afterRadioButton'), + child: Row( + children: [ + const Text(EventEndTypes.after), + inlineWidth, + CustomTextField( + enabled: widget.model.eventEndType == EventEndTypes.after, + maxTextLength: 3, + textEditingController: widget.model.endOccurenceController, + ), + inlineWidth, + const Text('occurrence'), + ], + ), + index: 2, + inputAction: () { + setState(() { + widget.model.eventEndType = EventEndTypes.after; + }); + }, + ), + ], + ); + } + + /// Custom radio button to select event ending eventEndType. + /// + /// **params**: + /// * `key`: Uniquely identifies the radioButton. + /// * `child`: RadioListTile widget. + /// * `index`: index of [eventEndType]. + /// * `inputAction`: Call back to be executed when clicked on radio button. + /// + /// **returns**: + /// * `Theme`: custom theme. + Theme radioButton({ + required Key key, + required Widget child, + required int index, + Function()? inputAction, + }) { + return Theme( + key: key, + data: Theme.of(context).copyWith(focusColor: Colors.transparent), + child: RadioListTile( + title: child, + value: eventEndTypes[index], + groupValue: widget.model.eventEndType, + onChanged: (value) { + setState(() { + widget.model.eventEndType = value!; + inputAction?.call(); + }); + }, + ), + ); + } + + /// Formats input date into [MMM d, yyyy] format. + /// + /// **params**: + /// * `inputDate`: Unformatted date. + /// + /// **returns**: + /// * `String`: formatted date. + String formatDate(String inputDate) { + final DateTime dateTime = DateTime.parse(inputDate); + return DateFormat("MMM d, yyyy").format(dateTime); + } +} diff --git a/lib/widgets/custom_alert_dialog.dart b/lib/widgets/custom_alert_dialog.dart new file mode 100644 index 000000000..312c3d47d --- /dev/null +++ b/lib/widgets/custom_alert_dialog.dart @@ -0,0 +1,100 @@ +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'; + +/// This Class returns CustomAlertDialog widget. Custom Alert Dialog is a popup. +/// +/// that appeared in the screen showing Alert message along with the event buttons. +/// This extends stateless widget that means it cannot change its state during the +/// runtime of a application. +class CustomAlertDialog extends StatelessWidget { + /// Constructs a [CustomAlertDialog] widget. + /// + /// [reverse] indicates whether the order of action buttons should be reversed. + /// [success] is the function triggered upon tapping the primary action button. + /// [secondaryButtonTap] is the function triggered upon tapping the secondary action button. + /// [successText] is the text displayed on the primary action button. + /// [dialogTitle] is the title displayed in the dialog (default value is 'Confirmation'). + /// [dialogSubTitle] is the subtitle or message content of the dialog. + /// [secondaryButtonText] is the text displayed on the secondary action button (default value is 'Close'). + + const CustomAlertDialog({ + super.key, + this.successText = 'Confirm', + this.dialogTitle = 'Confirmation', + this.reverse = false, + this.secondaryButtonText = 'Close', + this.secondaryButtonTap, + required this.success, + required this.dialogSubTitle, + }); + + /// Indicates whether the order of action buttons should be reversed. + final bool reverse; + + /// Function triggered upon tapping the primary action button. + final Function() success; + + /// Function triggered upon tapping the secondary action button. + final Function()? secondaryButtonTap; + + /// Text displayed on the primary action button. + final String successText; + + /// Title displayed in the dialog (default value is 'Confirmation'). + final String dialogTitle; + + /// Subtitle or message content of the dialog. + final String dialogSubTitle; + + /// Text displayed on the secondary action button (default value is 'Close'). + final String secondaryButtonText; + + @override + Widget build(BuildContext context) { + final List actions = [ + RaisedRoundedButton( + key: Key(secondaryButtonText), + onTap: () { + secondaryButtonTap != null + ? secondaryButtonTap!() + : navigationService.pop(); + }, + buttonLabel: + AppLocalizations.of(context)!.strictTranslate(secondaryButtonText), + textColor: Colors.white, + backgroundColor: const Color(0xFF008A37), + width: SizeConfig.screenWidth! * 0.2, + height: SizeConfig.screenHeight! * 0.06, + ), + RaisedRoundedButton( + key: Key(successText), + onTap: () => success(), + buttonLabel: AppLocalizations.of(context)!.strictTranslate(successText), + textColor: const Color(0xFF008A37), + backgroundColor: Colors.white, + width: SizeConfig.screenWidth! * 0.2, + height: SizeConfig.screenHeight! * 0.06, + ), + ]; + return AlertDialog( + title: Text( + AppLocalizations.of(context)!.strictTranslate(dialogTitle), + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith(fontWeight: FontWeight.w800), + ), + content: Text( + AppLocalizations.of(context)!.strictTranslate(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..9126cd49b --- /dev/null +++ b/lib/widgets/custom_avatar.dart @@ -0,0 +1,80 @@ +// ignore_for_file: talawa_good_doc_comments, talawa_api_doc +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_cache_manager/flutter_cache_manager.dart'; +import 'package:shimmer/shimmer.dart'; + +/// Creates a custom avatar. +/// +/// The avatar is created using the image provided, +/// or the first alphabet with a standard background color. +class CustomAvatar extends StatelessWidget { + const CustomAvatar({ + super.key, + required this.isImageNull, + this.firstAlphabet, + this.cacheManager, + this.imageUrl, + this.fontSize = 40, + this.maxRadius = 16, + }); + + /// Custom avatar data. + final bool isImageNull; + + /// Custom avatar data. + final String? firstAlphabet; + + /// Custom avatar data. + final String? imageUrl; + + /// Custom avatar data. + final double? fontSize; + + /// Custom avatar data. + final double? maxRadius; + + /// Custom avatar data. + final BaseCacheManager? cacheManager; + + @override + Widget build(BuildContext context) { + return isImageNull + //creating the avatar with the icon-theme color when the image is null + ? CircleAvatar( + backgroundColor: + Theme.of(context).iconTheme.color!.withOpacity(0.2), + maxRadius: maxRadius, + child: Center( + child: Text( + firstAlphabet!, + style: Theme.of(context) + .textTheme + .bodySmall! + .copyWith(fontSize: fontSize), + ), + ), + ) + //creating the avatar with the provided image + : CachedNetworkImage( + cacheManager: cacheManager, + 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..0ebe1f0b7 --- /dev/null +++ b/lib/widgets/custom_drawer.dart @@ -0,0 +1,188 @@ +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/main_screen_view_model.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'; + +/// Creates a custom drawer for switching organizations. +/// +/// joining new organizations, or leaving an organization. +class CustomDrawer extends StatelessWidget { + const CustomDrawer({ + super.key, + required this.homeModel, + }); + + /// home model. + final MainScreenViewModel homeModel; + + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialize(homeModel, context), + builder: (context, model, child) { + return Container( + width: SizeConfig.screenWidth! * 0.6, + alignment: Alignment.centerLeft, + child: Drawer( + key: const Key("Drawer"), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + //A material design Drawer header that identifies the app's user. + Expanded( + child: ListView( + children: [ + UserAccountsDrawerHeader( + currentAccountPicture: CustomAvatar( + isImageNull: model.selectedOrg?.image == null, + imageUrl: model.selectedOrg?.image, + firstAlphabet: + model.selectedOrg?.name!.substring(0, 1), + ), + accountName: Column( + key: MainScreenViewModel.keyDrawerCurOrg, + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + model.selectedOrg?.name! ?? "NULL", + ), + Text( + AppLocalizations.of(context)! + .strictTranslate("Selected Organization"), + ), + ], + ), + accountEmail: const SizedBox(), + ), + //Tile to Switch organizations + Column( + key: MainScreenViewModel.keyDrawerSwitchableOrg, + children: [ + Padding( + padding: const EdgeInsets.symmetric( + vertical: 5, + horizontal: 8.0, + ), + child: Text( + AppLocalizations.of(context)! + .strictTranslate("Switch Organization"), + style: Theme.of(context).textTheme.titleLarge, + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.41, + child: Scrollbar( + controller: model.controller, + thumbVisibility: true, + child: ListView.builder( + key: const Key("Switching Org"), + controller: model.controller, + padding: EdgeInsets.zero, + itemCount: model.switchAbleOrg.length, + // itemCount: 3, + itemBuilder: (BuildContext context, int index) { + return ListTile( + key: const Key("Org"), + 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!, + ), + ); + }, + ), + ), + ), + ], + ), + ], + ), + ), + // A Tile to join a new organization + Container( + child: Align( + alignment: FractionalOffset.bottomCenter, + child: Container( + child: Column( + children: [ + const Divider(), + ListTile( + key: MainScreenViewModel.keyDrawerJoinOrg, + onTap: () { + if (userConfig.loggedIn) { + navigationService.popAndPushScreen( + Routes.joinOrg, + arguments: '-1', + ); + } else { + navigationService.popAndPushScreen( + Routes.setUrlScreen, + arguments: '', + ); + } + }, + leading: const Icon( + Icons.add, + size: 30, + ), + title: Text( + AppLocalizations.of(context)! + .strictTranslate("Join new Organization"), + ), + ), + userConfig.loggedIn + ? ListTile( + key: MainScreenViewModel + .keyDrawerLeaveCurrentOrg, + onTap: () => navigationService + .pushDialog(model.exitAlertDialog()), + leading: const Icon(Icons.logout, size: 30), + title: Text( + AppLocalizations.of(context)! + .strictTranslate( + "Leave Current Organization", + ), + ), + ) + : Container(), + SizedBox( + key: const Key("Sized Box Drawer"), + height: SizeConfig.screenHeight! * 0.03, + ), + const FromPalisadoes(key: Key("From Palisadoes")), + SizedBox( + key: const Key("Sized BottomBox Drawer"), + height: SizeConfig.screenHeight! * 0.03, + ), + ], + ), + ), + ), + ), + ], + ), + ), + ); + }, + ); + } +} diff --git a/lib/widgets/custom_list_tile.dart b/lib/widgets/custom_list_tile.dart new file mode 100644 index 000000000..9b0e9114a --- /dev/null +++ b/lib/widgets/custom_list_tile.dart @@ -0,0 +1,195 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/models/options/options.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; + +/// Returns a widget for rendering Customized tiles. +/// +/// A Tile shows the org info, user info, options that on tap user & org info. +class CustomListTile extends StatelessWidget { + const CustomListTile({ + required Key key, + required this.index, + required this.type, + this.showIcon = false, + this.orgInfo, + this.userInfo, + this.attendeeInfo, + this.option, + this.onTapOrgInfo, + this.onTapUserInfo, + this.onTapAttendeeInfo, + this.onTapOption, + }) : super(key: key); + + /// Index int of tiles. + final int index; + + /// Tiletype object to specify tle type. + final TileType type; + + /// Object containing all the necessary info regarding the org. + final OrgInfo? orgInfo; + + /// Object containing all the necessary info regarding the user. + final User? userInfo; + + /// Object containing all the necessary info regarding the Attendee. + final Attendee? attendeeInfo; + + /// Object containing all the necessary info regarding the options. + final Options? option; + + /// Object containing all the necessary info regarding the onTapOption. + final Function()? onTapOption; + + /// Function to handle the tap on user info. + final Function()? onTapUserInfo; + + /// Function to handle the tap on attendee info. + final Function()? onTapAttendeeInfo; + + /// Function to handle the tap on org info. + final Function(OrgInfo)? onTapOrgInfo; + + /// Flag to determine whether thge Icons should be shown. + final bool showIcon; + + @override + Widget build(BuildContext context) { + Function()? onTap; + + switch (type) { + case TileType.org: + onTap = () => onTapOrgInfo!(orgInfo!); + break; + case TileType.user: + onTap = onTapUserInfo; + break; + case TileType.attendee: + onTap = onTapAttendeeInfo; + break; + default: + onTap = onTapOption; + break; + } + + return InkWell( + // checking whether the tapped tile is of user or org. + onTap: onTap, + child: Padding( + padding: const EdgeInsets.all(18.0), + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + boxShadow: [ + BoxShadow( + color: Colors.grey.withOpacity(0.5), + spreadRadius: 1, + blurRadius: 6, + offset: const Offset(0, 3), + ), + ], + ), + height: 70, + child: Row( + children: [ + Expanded( + flex: 6, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 25, + ), + child: type == TileType.org + ? RichText( + key: const Key('OrgNamewithOrgAddress'), + text: TextSpan( + text: orgInfo!.name, + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith( + fontSize: 19, + color: Colors.black, + ), + children: [ + if (orgInfo!.address != null) ...[ + const TextSpan(text: ' '), + TextSpan( + text: + '(${orgInfo!.address!.city}, ${orgInfo!.address!.countryCode})', + style: Theme.of(context) + .textTheme + .bodySmall! + .copyWith( + fontSize: 14, + color: const Color.fromARGB( + 255, + 112, + 112, + 112, + ), + ), + ), + ], + ], + ), + ) + : Text( + type == TileType.user + ? '${userInfo!.firstName!} ${userInfo!.lastName!}' + : type == TileType.attendee + ? '${attendeeInfo!.firstName!} ${attendeeInfo!.lastName!}' + : option!.title, + style: + type == TileType.user || type == TileType.attendee + ? Theme.of(context) + .textTheme + .titleLarge! + .copyWith( + fontSize: 18, + color: Colors.black, + ) + : option!.trailingIconButton == null + ? Theme.of(context) + .textTheme + .bodyMedium! + .copyWith( + fontSize: 18, + color: Colors.black, + ) + : Theme.of(context) + .textTheme + .headlineSmall! + .copyWith( + fontSize: 18, + color: Colors.black, + ), + ), + ), + ), + Expanded( + flex: 1, + child: type != TileType.user && type != TileType.attendee + ? type == TileType.org + ? Icon( + !orgInfo!.userRegistrationRequired! + ? Icons.lock_open + : Icons.lock, + color: !orgInfo!.userRegistrationRequired! + ? const Color(0xFF34AD64) + : const Color(0xffFABC57), + ) + : 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..f8e8b53b5 --- /dev/null +++ b/lib/widgets/custom_progress_dialog.dart @@ -0,0 +1,64 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/cupertino.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'; + +/// A progress dialogue which shows an activity indicator +/// spinning clockwise if there is internet connectivity. +/// Otherwise, it shows no-internet image and text. +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.titleLarge!.color, + borderRadius: BorderRadius.circular(15), + ), + child: model.connectivityPresent + ? Center( + //An iOS-style activity indicator that spins clockwise. + + child: CupertinoActivityIndicator( + radius: SizeConfig.screenWidth! * 0.065, + ), + ) + // Shows no-internet image and text on no connectivity + : 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.headlineSmall, + ), + ], + ), + ); + }, + ); + } +} diff --git a/lib/widgets/custom_weekday_selector.dart b/lib/widgets/custom_weekday_selector.dart new file mode 100644 index 000000000..6f6069664 --- /dev/null +++ b/lib/widgets/custom_weekday_selector.dart @@ -0,0 +1,93 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/constants/recurrence_values.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart'; + +/// Custom Widget to select weekdays. +class CustomWeekDaySelector extends StatefulWidget { + const CustomWeekDaySelector({required this.model}); + + /// instance of create event view model. + final CreateEventViewModel model; + + @override + _CustomWeekDaySelectorState createState() => _CustomWeekDaySelectorState(); +} + +class _CustomWeekDaySelectorState extends State { + @override + Widget build(BuildContext context) { + final Set weekdays = widget.model.weekdays; + return Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: List.generate(7, (index) { + final weekday = _getWeekdayAbbreviation(index); + return GestureDetector( + onTap: () { + setState(() { + if (weekdays.contains(weekday)) { + weekdays.remove(weekday); + } else { + weekdays.add(weekday); + } + }); + }, + child: Container( + width: 30, + height: 30, + decoration: BoxDecoration( + color: weekdays.contains(weekday) + ? Theme.of(context).colorScheme.primary.withOpacity(0.5) + : Colors.transparent, + border: Border.all( + width: weekdays.contains(weekday) ? 2 : 1, + color: weekdays.contains(weekday) + ? Theme.of(context).colorScheme.primary + : Theme.of(context).dividerColor, + ), + borderRadius: BorderRadius.circular(15), + ), + child: Center( + child: Text( + weekday[0], + style: TextStyle( + color: Theme.of(context).dividerColor, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ); + }), + ), + ); + } + + /// Maps isSelected index to weekday. + /// + /// **params**: + /// * `index`: of isSelected list. + /// + /// **returns**: + /// * `String`: Weekday as string. + String _getWeekdayAbbreviation(int index) { + switch (index) { + case 0: + return Recurrance.weekdaySunday; + case 1: + return Recurrance.weekdayMonday; + case 2: + return Recurrance.weekdayTuesday; + case 3: + return Recurrance.weekdayWednesday; + case 4: + return Recurrance.weekdayThursday; + case 5: + return Recurrance.weekdayFriday; + case 6: + return Recurrance.weekdaySaturday; + default: + return ''; + } + } +} diff --git a/lib/widgets/date_time_picker.dart b/lib/widgets/date_time_picker.dart new file mode 100644 index 000000000..916a56ebc --- /dev/null +++ b/lib/widgets/date_time_picker.dart @@ -0,0 +1,41 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:talawa/locator.dart'; + +/// Shows a dialog containing a Material Design date picker. +/// +/// The returned Future resolves to the date selected by the user when the user confirms the dialog. +/// If the user cancels the dialog, null is returned. +Future customDatePicker({required DateTime initialDate}) async { + // showDatePicker which shows a material design date range picker used to select a range of dates. + 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; +} + +/// Shows a dialog containing a material design time picker. +/// +/// The returned Future resolves to the time selected by the user when the user closes the dialog. +/// If the user cancels the dialog, null is returned. +Future customTimePicker({required TimeOfDay initialTime}) async { + // showTimePicker which shows a material design time range picker used to select a range of times. + // Click ![here](https://api.flutter.dev/flutter/material/showTimePicker.html) to know more. + 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..676e24b6a --- /dev/null +++ b/lib/widgets/event_card.dart @@ -0,0 +1,295 @@ +import 'dart:math'; +import 'dart:ui'; +import 'package:flutter/material.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'; + +/// This class returns the EventCard widget. +class EventCard extends StatelessWidget { + const EventCard({ + super.key, + required this.event, + this.eventTitleHighlightedText, + this.eventTitleNormalText, + required this.isSearchItem, + }); + + /// instance of an event. + final Event event; + + /// Highlighted text of the event. + final String? eventTitleHighlightedText; + + /// Eventtile normal text. + final String? eventTitleNormalText; + + /// This flag indicates that if this event is searchable. + final bool isSearchItem; + + @override + Widget build(BuildContext context) { + final bool isRegistered = event.isRegistered ?? false; + return Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Stack( + children: [ + Card( + shape: RoundedRectangleBorder( + side: + isRegistered && userConfig.currentUser.id != event.creator!.id + ? BorderSide( + color: Theme.of(context).colorScheme.secondary, + width: SizeConfig.screenWidth! * 0.008, + ) + : BorderSide.none, + ), + elevation: 3, + color: Theme.of(context).primaryColor, + child: Column( + children: [ + AspectRatio( + aspectRatio: 2.5, + child: Container( + height: SizeConfig.screenHeight! * 0.11, + width: double.infinity, + decoration: BoxDecoration( + color: Colors.grey.withOpacity(0.3), + image: const DecorationImage( + fit: BoxFit.fitWidth, + alignment: FractionalOffset.topCenter, + image: AssetImage('assets/images/pfp2.png'), + ), + ), + child: ClipRRect( + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), + child: Container( + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.0), + ), + ), + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(10), + child: Column( + children: [ + Row( + children: [ + SizedBox( + width: SizeConfig.screenWidth! * 0.48, + child: isSearchItem + ? RichText( + text: TextSpan( + text: eventTitleHighlightedText, + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith( + fontWeight: FontWeight.bold, + ), + children: [ + TextSpan( + text: eventTitleNormalText, + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith( + color: Colors.grey, + ), + ), + ], + ), + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + ) + : Text( + event.title!, + style: Theme.of(context) + .textTheme + .headlineSmall, + ), + ), + const Spacer(), + const Icon( + Icons.calendar_today, + size: 13, + ), + const Spacer(), + Expanded( + child: Text( + "${event.startDate!} - ${event.endDate!}", + style: Theme.of(context).textTheme.bodySmall, + ), + ), + ], + ), + 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.bodySmall, + ), + 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.bodySmall, + ), + ), + ], + ), + 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.bodySmall, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + maxLines: 3, + ), + ), + const Icon( + Icons.chevron_right, + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.007, + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + userConfig.currentUser.id == event.creator!.id + ? Row( + children: [ + Icon( + Icons.verified, + size: 13, + color: Theme.of(context) + .colorScheme + .secondary, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.013, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate('Created'), + style: + Theme.of(context).textTheme.bodySmall, + ), + ], + ) + : const SizedBox(), + const Spacer(), + 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.bodySmall, + ) + : Text( + AppLocalizations.of(context)! + .strictTranslate('private'), + style: Theme.of(context).textTheme.bodySmall, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.027, + ), + const Icon( + Icons.people_outline, + size: 13, + color: Color(0xff4285F4), + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.013, + ), + Text( + (event.attendees?.length ?? 0).toString(), + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ), + ], + ), + ), + ], + ), + ), + Positioned( + top: SizeConfig.screenHeight! * 0.007, + right: SizeConfig.screenWidth! * 0.013, + child: isRegistered && + userConfig.currentUser.id != event.creator!.id + ? DecoratedBox( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.secondary, + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(15), + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Center( + child: Text( + AppLocalizations.of(context)! + .strictTranslate("Registered"), + style: + Theme.of(context).textTheme.titleLarge!.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..09a86b220 --- /dev/null +++ b/lib/widgets/event_date_time_tile.dart @@ -0,0 +1,79 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/services/size_config.dart'; + +/// Returns a widget tile(item) for displaying date and time. +class DateTimeTile extends StatelessWidget { + const DateTimeTile({ + super.key, + required this.date, + required this.time, + required this.setDate, + required this.setTime, + }); + + /// Represents a date in string format. + final String date; + + /// Represents a time in string format. + final String time; + + /// Function that sets the date. + final Function() setDate; + + /// Function that sets the time. + final Function() setTime; + + @override + Widget build(BuildContext context) { + return Container( + color: Theme.of(context).colorScheme.primaryContainer, + height: SizeConfig.screenHeight! * 0.068, + width: double.infinity, + child: Padding( + padding: + EdgeInsets.symmetric(horizontal: SizeConfig.screenWidth! * 0.083), + child: Row( + children: [ + const Icon( + Icons.calendar_today, + color: Color(0xff524F4F), + size: 19, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.045, + ), + InkWell( + key: const Key('EventDateTimeTileDate'), + onTap: () async { + setDate(); + }, + child: Text( + date, + style: const TextStyle(fontSize: 16), + ), + ), + const Spacer(), + const Icon( + Icons.schedule, + color: Color(0xff524F4F), + size: 19, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.045, + ), + InkWell( + key: const Key('EventDateTimeTileTime'), + onTap: () async { + setTime(); + }, + child: Text( + time, + style: const TextStyle(fontSize: 16), + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/event_search_delegate.dart b/lib/widgets/event_search_delegate.dart new file mode 100644 index 000000000..d2e877924 --- /dev/null +++ b/lib/widgets/event_search_delegate.dart @@ -0,0 +1,101 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/explore_events_view_model.dart'; +import 'package:talawa/widgets/event_card.dart'; + +/// This class returns a list of the events which match the search query. +class EventSearch extends SearchDelegate { + EventSearch({required this.eventList, required this.exploreEventsViewModel}); + ExploreEventsViewModel exploreEventsViewModel; + + final List eventList; + + @override + List buildActions(BuildContext context) { + /// Returns an icon button which closes the search page and returns + /// to the underlying route if the query is empty. Otherwise it sets the + /// query empty. + return [ + IconButton( + onPressed: () { + query.isNotEmpty ? query = '' : close(context, eventList.first); + }, + icon: const Icon(Icons.clear), + ), + ]; + } + + @override + Widget buildLeading(BuildContext context) { + /// Returns an icon button which closes the search page and returns + /// to the underlying route + return IconButton( + onPressed: () { + close(context, eventList.first); + }, + icon: const Icon(Icons.arrow_back), + ); + } + + @override + Widget buildResults(BuildContext context) { + return Container(); + } + + @override + Widget buildSuggestions(BuildContext context) { + /// Returns a scrollable list through "buildSuggestionsSuccess" function. + /// where() method Returns a new lazy Iterable with all elements that satisfy the predicate test. + /// toList( ) method is used to convert an Iterable to a List. + /// toLowerCase() converts all characters in a string to lower case. + final suggestions = eventList.where((event) { + final eventLowerCase = event.title!.toLowerCase(); + final queryLowerCase = query.toLowerCase(); + return eventLowerCase.startsWith(queryLowerCase); + }).toList(); + return buildSuggestionsSucess(suggestions); + } + + Widget buildSuggestionsSucess(List suggestions) { + /// Takes a List of Events as parameter which is passed by the "buildSuggestions" function. + /// Returns a SingleChildScrollView of the events from the list. + /// SingleChildScrollView is box in which a single widget can be scrolled. + return SingleChildScrollView( + child: ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: suggestions.length, + itemBuilder: (BuildContext context, int index) { + final highlightedText = + suggestions[index].title!.substring(0, query.length); + final normalText = suggestions[index].title!.substring(query.length); + + /// Returns a widget that detects gestures. + /// Defers to its child for its sizing behavior. + /// Navigates to the screen with the event information. + return GestureDetector( + onTap: () { + navigationService.pushScreen( + "/eventInfo", + arguments: { + "event": suggestions[index], + "exploreEventViewModel": exploreEventsViewModel, + }, + ); + }, + child: EventCard( + event: suggestions[index], + isSearchItem: true, + eventTitleHighlightedText: highlightedText, + eventTitleNormalText: normalText, + ), + ); + }, + ), + ); + } +} diff --git a/lib/widgets/from_palisadoes.dart b/lib/widgets/from_palisadoes.dart new file mode 100644 index 000000000..212d2b496 --- /dev/null +++ b/lib/widgets/from_palisadoes.dart @@ -0,0 +1,51 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; + +/// This class generates the text "From Palisadoes" in a custom way. +class FromPalisadoes extends StatelessWidget { + const FromPalisadoes({super.key}); + + @override + Widget build(BuildContext context) { + return Column( + children: [ + // Customizing the word "from". + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + // This method is called for localized text. + AppLocalizations.of(context)!.strictTranslate('from'), + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ), + SizedBox( + height: SizeConfig.blockSizeHorizontal, + ), + // Customizing the word "Palisadoes". + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'PALISADOES', + style: Theme.of(context) + .textTheme + .titleSmall! + .copyWith(fontWeight: FontWeight.w700), + ), + ], + ), + SizedBox( + height: SizeConfig.blockSizeHorizontal! * 5, + ), + ], + ); + } +} diff --git a/lib/widgets/invite_child.dart b/lib/widgets/invite_child.dart new file mode 100644 index 000000000..4e0e84e4c --- /dev/null +++ b/lib/widgets/invite_child.dart @@ -0,0 +1,126 @@ +import 'package:flutter/material.dart'; +import 'package:qr_flutter/qr_flutter.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; + +/// Creating an instance of AppLangauge() to set up localized values for each locale that our app supports. +final _appLanguageService = locator(); + +/// We can use QR code scanner, social media platforms like twitter, whatsapp, telegram and many more.. +/// +/// more_info_if_required +/// +/// **params**: +/// * `context`: Build Context +/// +/// **returns**: +/// * `Widget`: Returns Column with QR Code +Widget invite(BuildContext context) { + _appLanguageService.initialize(); + + // final String url = + // 'https://cyberwake.github.io/applink/invite?selectLang=${_appLanguageService.appLocal.languageCode}&setUrl=${GraphqlConfig.orgURI}&selectOrg=${userConfig.currentOrg.id!}'; + const String qrData = + 'https://github.com/PalisadoesFoundation/talawa/releases/download/automated/app-release.apk'; + + // print(url); + // print(qrData); + + return Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + //Scan the below given QR code to join the organization. + QrImageView( + key: const Key("QRcode"), + data: qrData, + version: QrVersions.auto, + size: 200.0, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.08, + ), + Text( + 'Scan the QR to join ${userConfig.currentOrg.name}', + style: const TextStyle(color: Colors.black), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.02, + ), + //Tap on the Twitter icon to join the organization through Twitter. + // Row( + // mainAxisAlignment: MainAxisAlignment.spaceEvenly, + // mainAxisSize: MainAxisSize.min, + // children: [ + // iconButton( + // "Twitter", + // const FaIcon( + // FontAwesomeIcons.twitter, + // size: 35, + // color: Color(0xFF1DA1F2), + // ), + // () async => SocialShare.shareTwitter('Join us', url: url), + // ), + // //Tap on the Whatsapp icon to join the organization through Whatsapp. + // iconButton( + // "WhatsApp", + // CustomPaint( + // size: const Size( + // 50, + // 50 * 1.004, + // ), //You can Replace [WIDTH] with your desired width for Custom Paint and height will be calculated automatically + // painter: WhatsappLogo(), + // ), + // () async => SocialShare.shareWhatsapp(url), + // ), + // iconButton( + // "Telegram", + // CustomPaint( + // size: Size( + // 45, + // (45 * 1).toDouble(), + // ), //You can Replace [WIDTH] with your desired width for Custom Paint and height will be calculated automatically + // painter: TelegramLogo(), + // ), + // () async => SocialShare.shareTelegram(url), + // ), + // iconButton( + // "Alt", + // const FaIcon( + // FontAwesomeIcons.shareNodes, + // size: 30, + // color: Color(0xff40c351), + // ), + // () async => SocialShare.shareOptions(url), + // ), + // ], + // ), + ], + ); +} + +/// It prints "tapped" in the console for the developer to know that the button was tapped. +/// +/// **params**: +/// * `key`: Key of the Widget +/// * `icon`: Icon to be displayed +/// * `onTap`: on tap function +/// +/// **returns**: +/// * `Widget`: returns IconButton. +Widget iconButton(String key, Widget icon, void Function() onTap) { + return Stack( + children: [ + IconButton( + key: Key(key), + onPressed: () { + print('tapped'); + onTap(); + }, + icon: icon, + ), + ], + ); +} diff --git a/lib/widgets/lang_switch.dart b/lib/widgets/lang_switch.dart new file mode 100644 index 000000000..2ffa67209 --- /dev/null +++ b/lib/widgets/lang_switch.dart @@ -0,0 +1,46 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:talawa/constants/constants.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/language/language_model.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; + +/// This widget enables language switch for "internationalizing our app". +class LanguageTile extends StatelessWidget { + const LanguageTile({super.key}); + + @override + Widget build(BuildContext context) { + //AppLanguage enables to set up localized values for each locale that our app supports. + //A locale is an identifier used to select a user's language and formatting preferences. + //This represents a Unicode Language Identifier (i.e. without Locale extensions), + //except variants are not supported. + return Consumer( + builder: (context, appLang, _) { + final Language userLanguage = languages.firstWhere( + (element) => element.langCode == appLang.appLocal.languageCode, + ); + return ListTile( + key: const Key('LanguageTile'), + contentPadding: EdgeInsets.symmetric( + horizontal: SizeConfig.blockSizeHorizontal!, + ), + title: + Text(AppLocalizations.of(context)!.strictTranslate("Language")), + trailing: TextButton( + key: const Key('LanguageSelector'), + onPressed: () { + navigationService.pushReplacementScreen( + '/selectLang', + arguments: '0', + ); + }, + child: Text(userLanguage.langName), + ), + ); + }, + ); + } +} diff --git a/lib/widgets/member_name_tile.dart b/lib/widgets/member_name_tile.dart new file mode 100644 index 000000000..643b13b00 --- /dev/null +++ b/lib/widgets/member_name_tile.dart @@ -0,0 +1,80 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/services/size_config.dart'; + +/// This widget returns a tile containing the name of the member. +/// +/// Along with the name, there is a circle avatar which +/// either contains the image uploaded by the user or the +/// first character of his/her name in uppercase. +class MemberNameTile extends StatelessWidget { + const MemberNameTile({ + super.key, + required this.userName, + this.userImage, + required this.onDelete, + }); + + /// Represents the user's name. + final String userName; + + /// Triggers the deletion of the user. + final Function() onDelete; + + /// Represents the URL or path to the user's image. + final String? userImage; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 10, right: 5), + child: Container( + width: SizeConfig.screenWidth! * (0.3 + userName.length / 50), + height: SizeConfig.screenHeight! * 0.04, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(SizeConfig.screenHeight! * 0.02), + color: Theme.of(context).colorScheme.primaryContainer, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // Background is set with the image uploaded by the user. + userImage != null + ? CircleAvatar( + radius: SizeConfig.screenHeight! * 0.0201, + backgroundImage: NetworkImage(userImage!), + ) + // If the user has not uploaded his/her image, + // then a circle avatar is created. + // It has the first character of the user's name + //in uppercase and the default background color. + : CircleAvatar( + radius: SizeConfig.screenHeight! * 0.0201, + backgroundColor: Theme.of(context).colorScheme.secondary, + child: Text( + userName.substring(0, 1).toUpperCase(), + style: const TextStyle(color: Colors.white), + ), + ), + // The name of the member in text form. + Padding( + padding: const EdgeInsets.only(left: 5), + child: Text( + userName, + ), + ), + IconButton( + padding: EdgeInsets.zero, + onPressed: () => onDelete(), + icon: const Icon( + Icons.cancel_rounded, + color: Color(0xff524F4F), + size: 19, + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/multi_reaction.dart b/lib/widgets/multi_reaction.dart new file mode 100644 index 000000000..2abec4d95 --- /dev/null +++ b/lib/widgets/multi_reaction.dart @@ -0,0 +1,120 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_reaction_button/flutter_reaction_button.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + +/// Reaction Button with multiple Emojis. +class MultiReactButton extends StatefulWidget { + const MultiReactButton({super.key, required this.toggle}); + + /// Toggle Function for react Button. + final VoidCallback toggle; + + @override + State createState() => _MultiReactionButtonState(); +} + +class _MultiReactionButtonState extends State { + @override + Widget build(BuildContext context) { + return ReactionButton( + itemSize: const Size.square(35), + onReactionChanged: (value) { + // ignore: unnecessary_statements + widget.toggle(); + }, + selectedReaction: Reaction( + icon: Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + height: (MediaQuery.sizeOf(context).width / 392) * 35, + width: (MediaQuery.sizeOf(context).width / 392) * 35, + child: SvgPicture.asset( + 'assets/images/🦆 icon _like_.svg', + ), + ), + ), + value: 12, + ), + reactions: [ + Reaction( + icon: Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + height: (MediaQuery.sizeOf(context).width / 392) * 35, + width: (MediaQuery.sizeOf(context).width / 392) * 35, + child: SvgPicture.asset( + 'assets/icons/angel.svg', + ), + ), + ), + value: 1, + ), + Reaction( + icon: Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + height: (MediaQuery.sizeOf(context).width / 392) * 35, + width: (MediaQuery.sizeOf(context).width / 392) * 35, + child: SvgPicture.asset( + 'assets/icons/happy.svg', + ), + ), + ), + value: 3, + ), + Reaction( + icon: Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + height: (MediaQuery.sizeOf(context).width / 392) * 35, + width: (MediaQuery.sizeOf(context).width / 392) * 35, + child: SvgPicture.asset( + 'assets/icons/laugh.svg', + ), + ), + ), + value: 4, + ), + Reaction( + icon: Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + height: (MediaQuery.sizeOf(context).width / 392) * 35, + width: (MediaQuery.sizeOf(context).width / 392) * 35, + child: SvgPicture.asset( + 'assets/icons/love.svg', + ), + ), + ), + value: 1, + ), + Reaction( + icon: Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + height: (MediaQuery.sizeOf(context).width / 392) * 35, + width: (MediaQuery.sizeOf(context).width / 392) * 35, + child: SvgPicture.asset( + 'assets/icons/tear.svg', + ), + ), + ), + value: 1, + ), + Reaction( + icon: Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + height: (MediaQuery.sizeOf(context).width / 392) * 35, + width: (MediaQuery.sizeOf(context).width / 392) * 35, + child: SvgPicture.asset( + 'assets/icons/angry.svg', + ), + ), + ), + value: 2, + ), + ], + ); + } +} diff --git a/lib/widgets/organization_list.dart b/lib/widgets/organization_list.dart new file mode 100644 index 000000000..1f8183e1c --- /dev/null +++ b/lib/widgets/organization_list.dart @@ -0,0 +1,152 @@ +import 'dart:async'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:talawa/constants/timeout.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/services/navigation_service.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/widgets/custom_list_tile.dart'; +import 'package:visibility_detector/visibility_detector.dart'; + +/// This class returns the OrganizationList widget. +/// +/// which shows the list of all organizations exists in the URL. +/// This widget is used after the authentication. +class OrganizationList extends StatelessWidget { + const OrganizationList({required this.model, super.key}); + + /// [model] is a type of [SelectOrganizationViewModel] which provides methods to handle the data for this component. + final SelectOrganizationViewModel model; + @override + Widget build(BuildContext context) { + final navigationServiceLocal = locator(); + model.organizations = []; + int noOfRefetch = 0; + return GraphQLProvider( + client: ValueNotifier(graphqlConfig.clientToQuery()), + child: Query( + options: QueryOptions( + document: gql(queries.fetchJoinInOrg), + variables: { + // fetch 15 items only, will fetch more when scrolling index is at the 3rd last item! + 'first': 15, + 'skip': 0, + }, + ), + builder: ( + QueryResult result, { + Future Function(FetchMoreOptions)? fetchMore, + Future Function()? refetch, + }) { + // checking for any errors, if true fetch again! + if (result.hasException) { + final isException = databaseFunctions.encounteredExceptionOrError( + result.exception!, + showSnackBar: noOfRefetch == 0, + ); + if (isException != null) { + if (isException) { + refetch!(); + noOfRefetch++; + } else { + refetch!(); + noOfRefetch++; + } + } + } else { + // If the result is still loading! + if (!result.isLoading) { + // print(result.data!['organizationsConnection']); + model.organizations = OrgInfo().fromJsonToList( + result.data!['organizationsConnection'], + ); + } + + Timer(const Duration(seconds: TimeOuts.small), () { + if (model.organizations.isEmpty) { + navigationServiceLocal.showTalawaErrorDialog( + "No organizations found Please contact your admin", + MessageType.error, + ); + } + }); + return Scrollbar( + thumbVisibility: true, + interactive: true, + controller: model.allOrgController, + // Listview is a scrollable list of widgets arranged linearly. + child: ListView.separated( + controller: model.allOrgController, + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: result.isLoading + ? model.organizations.length + 1 + : model.organizations.length, + itemBuilder: (BuildContext context, int index) { + // If the index is at the end of the list! + if (index == model.organizations.length) { + // return the ListTile showing the loading icon! + return ListTile( + title: Center( + child: CupertinoActivityIndicator( + radius: SizeConfig.screenWidth! * 0.065, + ), + ), + ); + } + // If the index is at the 3rd last item in the organization list. + if (index == model.organizations.length - 3) { + // return VisibilityDetector and fetch more items in the list to show up! + return VisibilityDetector( + key: const Key('OrgSelItem'), + onVisibilityChanged: (VisibilityInfo info) { + if (info.visibleFraction > 0) { + model.fetchMoreHelper( + fetchMore!, + model.organizations, + ); + } + }, + child: CustomListTile( + index: index, + type: TileType.org, + orgInfo: model.organizations[index], + onTapOrgInfo: (item) => Navigator.pushNamed( + context, + '/OrganisationInfoScreen', + arguments: model.organizations[index], + ), + key: Key('OrgSelItem$index'), + ), + ); + } + // return CustomeTile that shows a particular item in the list! + return CustomListTile( + index: index, + type: TileType.org, + orgInfo: model.organizations[index], + onTapOrgInfo: (item) => Navigator.pushNamed( + context, + '/OrganisationInfoScreen', + arguments: model.organizations[index], + ), + key: Key('OrgSelItem$index'), + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Container(); + }, + ), + ); + } + return Container(); + }, + ), + ); + } +} diff --git a/lib/widgets/organization_search_list.dart b/lib/widgets/organization_search_list.dart new file mode 100644 index 000000000..7b432b1bd --- /dev/null +++ b/lib/widgets/organization_search_list.dart @@ -0,0 +1,135 @@ +import 'package:flutter/cupertino.dart'; +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/services/size_config.dart'; +import 'package:talawa/utils/queries.dart'; +import 'package:talawa/view_model/pre_auth_view_models/select_organization_view_model.dart'; +import 'package:talawa/widgets/custom_list_tile.dart'; +import 'package:visibility_detector/visibility_detector.dart'; + +/// This class returns the widget that shows all the matching orgs searched in the search bar. +class OrganizationSearchList extends StatelessWidget { + const OrganizationSearchList({required this.model, super.key}); + + /// model constructor for the selectOrganisation widget. + final SelectOrganizationViewModel model; + + @override + Widget build(BuildContext context) { + return GraphQLProvider( + client: ValueNotifier(graphqlConfig.authClient()), + child: Query( + options: QueryOptions( + document: gql(Queries().fetchJoinInOrgByName), + variables: { + 'nameStartsWith': model.searchController.text, + // fetch 30 items only, will fetch more when scrolling index is at the 3rd last item! + 'first': 30, + 'skip': 0, + }, + ), + builder: ( + QueryResult result, { + Future Function(FetchMoreOptions)? fetchMore, + Future Function()? refetch, + }) { + // checking for any errors, if true fetch again! + if (result.hasException) { + final isException = databaseFunctions.encounteredExceptionOrError( + result.exception!, + showSnackBar: false, + ); + if (isException!) { + refetch!(); + } else { + refetch!(); + } + } else { + // If the result is still loading! + if (!result.isLoading) { + model.organizations = OrgInfo().fromJsonToList( + result.data!['organizationsConnection'], + ); + } + // return the Scroll bar widget for scrolling down the organizations. + return Scrollbar( + thumbVisibility: true, + interactive: true, + controller: model.controller, + // Listview is a scrollable list of widgets arranged linearly. + child: ListView.separated( + controller: model.controller, + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: result.isLoading + ? model.organizations.length + 1 + : model.organizations.length, + itemBuilder: (BuildContext context, int index) { + // If the index is at the end of the list! + if (index == model.organizations.length) { + // return the ListTile showing the loading icon! + return ListTile( + title: Center( + child: CupertinoActivityIndicator( + radius: SizeConfig.screenWidth! * 0.065, + ), + ), + ); + } + // If the index is at the 3rd last item in the organization list. + if (index == model.organizations.length - 3) { + // return VisibilityDetector and fetch more items in the list to show up! + return VisibilityDetector( + key: const Key('OrgSelItem'), + onVisibilityChanged: (VisibilityInfo info) { + if (info.visibleFraction > 0) { + print(model.organizations.length); + model.fetchMoreHelper( + fetchMore!, + model.organizations, + ); + print(model.organizations.length); + } + }, + child: CustomListTile( + index: index, + type: TileType.org, + orgInfo: model.organizations[index], + onTapOrgInfo: (item) => model.selectOrg(item), + key: Key('OrgSelItem$index'), + ), + ); + } + // return CustomeTile that shows a particular item in the list! + return CustomListTile( + index: index, + type: TileType.org, + orgInfo: model.organizations[index], + onTapOrgInfo: (item) => model.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(); + }, + ), + ); + } +} diff --git a/lib/widgets/pinned_carousel_widget.dart b/lib/widgets/pinned_carousel_widget.dart new file mode 100644 index 000000000..b4f5bcf58 --- /dev/null +++ b/lib/widgets/pinned_carousel_widget.dart @@ -0,0 +1,185 @@ +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'; + +/// Generates carousel for pinned posts on the Home Screen's top. +/// +/// Tapping on a post will redirect you to the respective post screen. +class PinnedPostCarousel extends StatelessWidget { + const PinnedPostCarousel({ + super.key, + required this.pinnedPosts, + required this.navigateToPinnedPostPage, + required this.navigateToIndividualPostPage, + }); + + /// List of 'Post' objects representing pinned posts. + final List pinnedPosts; + + /// Function that navigates to a page displaying pinned posts. + final Function() navigateToPinnedPostPage; + + /// Function that navigates to an individual post page. + final Function navigateToIndividualPostPage; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Container( + height: 220, + color: + Theme.of(context).colorScheme.primaryContainer.withOpacity(0.5), + child: CustomCarouselScroller( + pinnedPosts: pinnedPosts, + key: const Key('Carousel'), + navigateToIndividualPostPage: navigateToIndividualPostPage, + ), + ), + // Gesture Detector in Flutter is used to detect + // the user's gestures on the application. + // It is a non-visual widget. Inside the gesture detector, + // another widget is placed and + // the gesture detector will capture all these + // events (gestures) and execute the tasks accordingly. + GestureDetector( + onTap: () => navigateToPinnedPostPage(), + child: Container( + height: 50, + width: SizeConfig.screenWidth, + padding: const EdgeInsets.symmetric(horizontal: 16.0), + color: Theme.of(context).colorScheme.primaryContainer, + child: Row( + children: [ + Expanded( + flex: 1, + child: Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Icon( + Icons.article, + color: Theme.of(context).colorScheme.secondary, + ), + ), + ), + Expanded( + flex: 8, + child: Text( + AppLocalizations.of(context)! + .strictTranslate("See all Pinned news"), + style: Theme.of(context).textTheme.titleLarge, + ), + ), + const Expanded(flex: 1, child: Icon(Icons.arrow_forward_ios)), + ], + ), + ), + ), + ], + ); + } +} + +/// Class defining custom carousel. +@visibleForTesting +class CustomCarouselScroller extends StatefulWidget { + const CustomCarouselScroller({ + super.key, + required this.pinnedPosts, + required this.navigateToIndividualPostPage, + }); + + /// List of pinnedposts. + final List pinnedPosts; + + /// function to navigate to IndividualPostPage. + final Function navigateToIndividualPostPage; + + @override + CustomCarouselScrollerState createState() => CustomCarouselScrollerState(); +} + +@visibleForTesting +class CustomCarouselScrollerState extends State { + /// pageController. + final PageController controller = PageController(initialPage: 0); + + /// pageIndex. + int pindex = 0; + + @override + Widget build(BuildContext context) { + // Stack is a widget that positions its + // children relative to the edges of its box. + 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 + .bodyLarge! + .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/pinned_post.dart b/lib/widgets/pinned_post.dart new file mode 100644 index 000000000..878df09a9 --- /dev/null +++ b/lib/widgets/pinned_post.dart @@ -0,0 +1,141 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/after_auth_screens/feed/pinned_post_screen.dart'; + +/// PinnedPost returns a widget that shows the pinned post. +class PinnedPost extends StatelessWidget { + const PinnedPost({super.key, required this.pinnedPost, required this.model}); + + /// contains the pinned post. + final List pinnedPost; + + /// gives access mainScreenViewModel's attributes. + final MainScreenViewModel model; + + @override + Widget build(BuildContext context) { + return Container( + key: const Key('hello'), + child: pinnedPost.isNotEmpty + ? SizedBox( + height: SizeConfig.screenHeight! * 0.28, + child: ListView.builder( + itemCount: pinnedPost.length, + shrinkWrap: true, + scrollDirection: Axis.horizontal, + itemBuilder: (context, index) => Padding( + key: index == 0 ? model.keySHPinnedPost : const Key(''), + padding: const EdgeInsets.only( + left: 10, + top: 7, + ), + child: GestureDetector( + onTap: () { + // final Map arg = {"index": "$index","post": pinnedPost}; + Navigator.of(context).push( + MaterialPageRoute( + builder: (context) => PinnedPostScreen( + post: toMap(index), + ), + ), + ); + }, + child: SizedBox( + width: SizeConfig.screenWidth! / 4.1, + child: Column( + children: [ + Expanded( + child: CachedNetworkImage( + cacheKey: pinnedPost[index].sId, + imageUrl: + (pinnedPost[index].imageUrl ?? '').isEmpty + ? 'placeHolderUrl' + : pinnedPost[index].imageUrl!, + errorWidget: (context, url, error) { + print(error); + return const SizedBox( + child: Center( + child: CircularProgressIndicator(), + ), + ); + }, + height: SizeConfig.screenHeight! * 0.15, + fit: BoxFit.cover, + ), + ), + const SizedBox(height: 5), + Row( + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.all(1.0), + child: Text( + getTimeDifferenceInHours( + pinnedPost[index] + .createdAt! + .toIso8601String(), + ), + style: const TextStyle( + color: Colors.grey, + fontWeight: FontWeight.w200, + ), + ), + ), + ), + ], + ), + const SizedBox(height: 5), + Text( + pinnedPost[index].description!, + maxLines: 2, + overflow: TextOverflow.ellipsis, + ), + ], + ), + ), + ), + ), + ), + ) + : Container( + key: const Key('hi'), + ), + ); + } + + /// Function returns the time difference in hours. + /// + /// **params**: + /// * `createdAtString`: the time from post + /// + /// **returns**: + /// * `String`: return a string + String getTimeDifferenceInHours(String createdAtString) { + final DateTime now = DateTime.now(); + final DateTime createdAt = DateTime.parse(createdAtString).toLocal(); + final Duration difference = now.difference(createdAt); + final int hours = difference.inHours; + return '$hours hrs'; + } + + /// converts post to mapped string. + /// + /// **params**: + /// * `index`: current index + /// + /// **returns**: + /// * `Map`: returns a map + Map toMap(int index) { + return { + 'title': this.pinnedPost[index].description!, + 'postId': this.pinnedPost[index].sId, + 'imageUrl': this.pinnedPost[index].imageUrl!, + 'time': getTimeDifferenceInHours( + this.pinnedPost[index].createdAt!.toIso8601String(), + ), + }; + } +} diff --git a/lib/widgets/post_container.dart b/lib/widgets/post_container.dart new file mode 100644 index 000000000..0ac3defa3 --- /dev/null +++ b/lib/widgets/post_container.dart @@ -0,0 +1,65 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:visibility_detector/visibility_detector.dart'; + +/// the widget which contains the actual image. +/// +class PostContainer extends StatefulWidget { + const PostContainer({ + super.key, + required this.photoUrl, + }); + + /// image url. + /// + final String? photoUrl; + + @override + PostContainerState createState() => PostContainerState(); +} + +class PostContainerState extends State { + /// video was removed for mvp. + /// + bool startedPlaying = false; + + /// same as above. + /// + bool inView = true; + + @override + void initState() { + super.initState(); + } + + @override + void dispose() { + controller.dispose(); + super.dispose(); + } + + /// manage the carousel. + /// + + final PageController controller = PageController(initialPage: 0); + + /// to manage the image index in carousel. + /// + int pindex = 0; + @override + Widget build(BuildContext context) { + return VisibilityDetector( + key: Key(Random().nextInt(1000).toString()), + onVisibilityChanged: (info) { + info.visibleFraction > 0.5 ? inView = true : inView = false; + if (mounted) setState(() {}); + }, + child: Center( + child: widget.photoUrl != null + ? Image.network(widget.photoUrl!) + : Container(), + ), + ); + } +} diff --git a/lib/widgets/post_detailed_page.dart b/lib/widgets/post_detailed_page.dart new file mode 100644 index 000000000..aad904c8d --- /dev/null +++ b/lib/widgets/post_detailed_page.dart @@ -0,0 +1,126 @@ +// ignore_for_file: talawa_good_doc_comments, talawa_api_doc +import 'package:flutter/material.dart'; +import 'package:talawa/utils/app_localization.dart'; + +/// This class sets up the post page. +/// +/// To implement the "show less" and "show more" functions for the text, +/// we divide the text into two parts: firstHalf and secondHalf. A flag is set to +/// track whether to display either the firstHalf or both(the entire text). +class DescriptionTextWidget extends StatefulWidget { + const DescriptionTextWidget({required this.text}); + + /// actual description to be displayed. + /// + final String text; + + @override + _DescriptionTextWidgetState createState() => _DescriptionTextWidgetState(); +} + +class _DescriptionTextWidgetState extends State { + /// before clicking show more. + /// + /// + late String firstHalf; + + /// After the show more. + /// + /// + late String secondHalf; + + /// tags in the post. + /// + late String tag; + + //setting the flag to true initially + /// is show more turned on. + /// + /// + bool flag = true; + + @override + void initState() { + super.initState(); + // If the length of the text is greater than 150, we divide it into two parts: firstHalf and secondHalf. + if (widget.text.length > 150) { + firstHalf = widget.text.substring(0, 150); + secondHalf = widget.text.substring(150, widget.text.length); + tag = ""; + } else { + if (widget.text.split("#").length == 2) { + firstHalf = widget.text.split("#")[0]; + tag = widget.text.split("#")[1]; + } else if (widget.text.split("#").length == 1) { + firstHalf = widget.text; + tag = ""; + } else { + firstHalf = widget.text.split("#")[0]; + tag = ""; + } + secondHalf = ""; + } + } + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.symmetric(horizontal: 10.0, vertical: 5.0), + child: secondHalf.isEmpty + ? Column( + children: [ + Text( + firstHalf, + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(fontFamily: 'open-sans', color: Colors.black38), + ), + tag != "" + ? Text( + "# $tag", + style: Theme.of(context).textTheme.bodyMedium!.copyWith( + fontFamily: 'open-sans', + color: Colors.black38, + ), + ) + : Container(), + ], + ) + : Column( + children: [ + Text( + // If the flag is true, we only display the firstHalf. + // If it is false, we display the entire text. + flag ? ("$firstHalf...") : (firstHalf + secondHalf), + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(fontFamily: 'open-sans'), + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + InkWell( + onTap: () { + setState(() { + //Setting the flag to false on tapping the "show more" text. + 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..5f0cd08b7 --- /dev/null +++ b/lib/widgets/post_list_widget.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/widgets/post_widget.dart'; + +/// This class receives a List of all the Post widgets and returns a ListView. +class PostListWidget extends StatelessWidget { + const PostListWidget({ + super.key, + required this.posts, + this.function, + this.deletePost, + }); + + /// lis of all the post. + /// + final List posts; + + /// This function is passed for the handling the action to be performed when the comment button is clicked. + /// + /// to see the function check the place where the widget is called. + final Function(Post)? function; + + /// Function the deleting the post. + /// + final Function(Post)? deletePost; + + @override + Widget build(BuildContext context) { + return ListView.builder( + scrollDirection: Axis.vertical, + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: posts.length, + itemBuilder: (BuildContext context, int index) { + return Column( + children: [ + NewsPost( + key: ValueKey(posts[index].sId), + post: posts[index], + function: function, + deletePost: deletePost, + ), + ], + ); + }, + ); + } +} diff --git a/lib/widgets/post_modal.dart b/lib/widgets/post_modal.dart new file mode 100644 index 000000000..6a47c9e00 --- /dev/null +++ b/lib/widgets/post_modal.dart @@ -0,0 +1,131 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/post/post_model.dart'; + +/// To add options to the bottom nav bar, increase the height too. +/// +/// +class PostBottomModal extends StatelessWidget { + const PostBottomModal({ + super.key, + this.function, + this.deletePost, + required this.post, + }); + + /// This function is passed for the handling the action to be performed when the comment button is clicked. + /// + /// to see the function check the place where the widget is called. + final Function(Post)? function; + + /// To delete the post if user can. + /// + /// only work if the post is made by the user + final Function(Post)? deletePost; + + /// Post object containing all the data related to the post. + /// + /// see the post model to get more information regarding this + final Post post; + + @override + Widget build(BuildContext context) { + return Column( + children: [ + Center( + child: Row( + children: [ + const Padding( + padding: EdgeInsets.fromLTRB(20, 0, 0, 0), + child: Icon( + Icons.report_gmailerrorred_outlined, + color: Colors.black38, + ), + ), + TextButton( + key: const Key('reportPost'), + onPressed: () { + navigationService.showTalawaErrorSnackBar( + 'Your Report has been sent to the Admin', + MessageType.info, + ); + Navigator.pop(context); + }, + child: const Text( + 'Report the post to the Admin', + style: TextStyle( + color: Colors.black38, + fontSize: 20, + fontFamily: 'open-sans', + ), + ), + ), + ], + ), + ), + Center( + child: Row( + children: [ + const Padding( + padding: EdgeInsets.fromLTRB(20, 0, 0, 0), + child: Icon( + Icons.delete, + color: Colors.black38, + ), + ), + TextButton( + key: const Key('deletePost'), + onPressed: () { + deletePost != null + ? deletePost!(post) + // ignore: unnecessary_statements + : {}; + showDialog( + context: context, + builder: (BuildContext builder) { + return AlertDialog( + title: const Text("Warning"), + content: const Text( + "Do you really want to delete the post?", + ), + actions: [ + TextButton( + key: const Key('alert_dialog_yes_btn'), + onPressed: () { + navigationService.showTalawaErrorSnackBar( + 'Post was deleted if you had the rights!', + MessageType.info, + ); + Navigator.pop(context); + }, + child: const Text("Yes"), + ), + TextButton( + key: const Key('alert_dialog_no_btn'), + onPressed: () { + Navigator.pop(context); + }, + child: const Text("No"), + ), + ], + ); + }, + ); + }, + child: const Text( + 'The post was deleted', + style: TextStyle( + color: Colors.black38, + fontSize: 20, + fontFamily: 'open-sans', + ), + ), + ), + ], + ), + ), + ], + ); + } +} diff --git a/lib/widgets/post_widget.dart b/lib/widgets/post_widget.dart new file mode 100644 index 000000000..7ec420a3a --- /dev/null +++ b/lib/widgets/post_widget.dart @@ -0,0 +1,233 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/services/graphql_config.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/multi_reaction.dart'; +import 'package:talawa/widgets/post_container.dart'; +import 'package:talawa/widgets/post_detailed_page.dart'; +import 'package:talawa/widgets/post_modal.dart'; + +/// Stateless class to show the fetched post. +/// +/// entirely ui based widget +class NewsPost extends StatelessWidget { + const NewsPost({ + super.key, + required this.post, + this.function, + this.deletePost, + }); + + /// Post object containing all the data related to the post. + /// + /// see the post model to get more information regarding this + final Post post; + + /// This function is passed for the handling the action to be performed when the comment button is clicked. + /// + /// to see the function check the place where the widget is called. + final Function(Post)? function; + + /// To delete the post if user can. + /// + /// only work if the post is made by the user + final Function(Post)? deletePost; + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(16)), + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + ListTile( + leading: CustomAvatar( + isImageNull: post.creator!.image == null, + firstAlphabet: + post.creator!.firstName!.substring(0, 1).toUpperCase(), + imageUrl: + "${'${GraphqlConfig.orgURI}'.replaceFirst('/graphql', '')}/${post.creator!.image}", + fontSize: 20, + ), + title: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + "${post.creator!.firstName} ${post.creator!.lastName}", + style: const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w400, + color: Colors.black38, + ), + ), + IconButton( + onPressed: () { + showModalBottomSheet( + context: context, + builder: (BuildContext context1) { + return Container( + height: 120, + decoration: const BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.only( + topRight: Radius.circular(16), + topLeft: Radius.circular(16), + ), + ), + child: PostBottomModal( + post: post, + deletePost: deletePost, + function: function, + ), + ); + }, + ); + }, + icon: const Icon( + Icons.report_gmailerrorred_outlined, + color: Colors.black38, + ), + ), + ], + ), + ), + post.imageUrl == null + ? DescriptionTextWidget(text: post.description!) + : Container(), + post.imageUrl != null + ? Container( + height: 380, + color: Colors.white, + child: PostContainer(photoUrl: post.imageUrl), + ) + : Container(), + BaseView( + onModelReady: (model) { + model.initialize(post.likedBy ?? [], post.sId); + }, + builder: (context, model, child) => Column( + children: [ + Padding( + padding: + const EdgeInsets.symmetric(horizontal: 16, vertical: 5), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Container( + child: Column( + children: [ + MultiReactButton( + toggle: () { + model.toggleIsLiked(); + }, + ), + Text( + "${model.likedBy.length}", + style: const TextStyle( + fontFamily: 'open-sans', + color: Colors.black38, + ), + ), + ], + ), + ), + const SizedBox( + width: 20, + ), + Container( + child: Column( + children: [ + GestureDetector( + onTap: () => + function != null ? function!(post) : {}, + child: Padding( + padding: const EdgeInsets.all(8.0), + child: SizedBox( + height: (MediaQuery.sizeOf(context).width / + 392) * + 35, + width: (MediaQuery.sizeOf(context).width / + 392) * + 35, + child: SvgPicture.asset( + 'assets/images/comment.svg', + ), + ), + ), + ), + Text( + "${post.comments!.length}", + style: const TextStyle( + color: Colors.black38, + ), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.fromLTRB(120, 0, 0, 0), + child: Text( + ' ${post.getPostCreatedDuration()}', + style: const TextStyle( + color: Colors.black38, + fontSize: 12, + ), + ), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 16, + vertical: 0, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + GestureDetector( + onTap: () => function != null ? function!(post) : {}, + child: Text( + //TODO: Currently the Liked Model contain on SID of USER who liked the post, thus my name here + "${AppLocalizations.of(context)!.strictTranslate("Liked")} by ...", + style: const TextStyle( + fontFamily: 'open-sans', + color: Colors.black38, + ), + ), + ), + ], + ), + ), + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 6, + vertical: 5, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + post.imageUrl != null + ? DescriptionTextWidget(text: post.description!) + : Container(), + ], + ), + ), + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/widgets/raised_round_edge_button.dart b/lib/widgets/raised_round_edge_button.dart new file mode 100644 index 000000000..0ce734066 --- /dev/null +++ b/lib/widgets/raised_round_edge_button.dart @@ -0,0 +1,99 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:talawa/services/size_config.dart'; + +/// This class returns a widget for a raised rounded button, +/// for example: login button in login screen. +class RaisedRoundedButton extends StatefulWidget { + // variables + 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) { + // Gesture Detector in Flutter is used to detect the user's gestures on the application. + 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, + ), + // If the widget.showArrow is true then show Row wrapper else FittedBox wrapper. + // By default it is false. The showArrow are true for some buttons like login & Sign up button in + // Organization URL Screen. + child: widget.showArrow + ? Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + children: [ + //unused + const Expanded( + child: Icon( + Icons.arrow_forward, + color: Colors.transparent, + ), + ), + Expanded( + child: Text( + widget.buttonLabel, + textAlign: TextAlign.center, + style: TextStyle( + fontWeight: FontWeight.w400, + fontSize: 18, + color: widget.textColor, + ), + ), + ), + Expanded( + child: Icon( + Icons.arrow_forward, + color: widget.textColor, + ), + ), + ], + ) + : FittedBox( + // FittedBox restricts its child widgets from growing its size beyond a certain limit + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 5.0), + child: Text( + widget.buttonLabel, + style: TextStyle( + fontWeight: FontWeight.w400, + fontSize: 18, + color: widget.textColor, + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/widgets/recurrence_dialog.dart b/lib/widgets/recurrence_dialog.dart new file mode 100644 index 000000000..348460a9f --- /dev/null +++ b/lib/widgets/recurrence_dialog.dart @@ -0,0 +1,86 @@ +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/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart'; + +/// Dialog for showing recurrence options. +class ShowRecurrenceDialog extends StatefulWidget { + const ShowRecurrenceDialog({ + super.key, + required this.model, + required this.initialRecurrence, + }); + + final CreateEventViewModel model; + final String initialRecurrence; + + @override + State createState() => _ShowRecurrenceDialogState(); +} + +class _ShowRecurrenceDialogState extends State { + static const donotRepeat = "Does not repeat"; + static const dialy = "Every day"; + static const weekly = "Every week"; + static const monthly = "Every month"; + static const yearly = "Every year"; + static const custom = "Custom..."; + + static const List _frequencies = [ + donotRepeat, + dialy, + weekly, + monthly, + yearly, + custom, + ]; + + late String _frequency; + @override + Widget build(BuildContext context) { + _frequency = widget.initialRecurrence; + print('widget built'); + return Dialog( + child: SizedBox( + height: SizeConfig.screenHeight! * 0.5, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + radioButton(_frequencies[0]), + radioButton(_frequencies[1]), + radioButton(_frequencies[2]), + radioButton(_frequencies[3]), + radioButton(_frequencies[4]), + radioButton(_frequencies[5]), + ], + ), + ), + ); + } + + // custom radio list tile. + RadioListTile radioButton( + String frequency, + ) { + return RadioListTile( + title: Text(frequency), + value: frequency, + groupValue: _frequency, + onChanged: (value) async { + // navigate to custom recurrence page when pressed custom... button. + widget.model.recurrance = widget.model.getRecurrance(value!); + if (value == _frequencies[5]) { + await navigationService.pushScreen( + Routes.customRecurrencePage, + arguments: widget.model, + ); + } + setState(() { + _frequency = value; + Navigator.pop(context, _frequency); + }); + }, + ); + } +} diff --git a/lib/widgets/rich_text.dart b/lib/widgets/rich_text.dart new file mode 100644 index 000000000..673634696 --- /dev/null +++ b/lib/widgets/rich_text.dart @@ -0,0 +1,32 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/cupertino.dart'; +import 'package:talawa/utils/app_localization.dart'; + +/// CustomRichText class returns a widget for customized rich/bold text. +/// These rich text are being used in form for changing the password. +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)!.strictTranslate(words[0]['text'].toString().trim())} ", + style: words[0]['textStyle'] as TextStyle, + children: List.generate( + words.length - 1, + (index) => TextSpan( + text: + "${AppLocalizations.of(context)!.strictTranslate(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..63322830e --- /dev/null +++ b/lib/widgets/signup_progress_indicator.dart @@ -0,0 +1,74 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:timelines/timelines.dart'; + +/// This class returns a widget for showing the +/// progress indicator/flow while Signing Up/ Registration. +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.bodyMedium!.copyWith( + // If the flow index is greater than currentPageIndex then + // show green(visited) color else show fade(not visited) color. + color: index <= currentPageIndex + ? const Color(0xFF008A37) + : const Color(0xFF737373), + ), + textAlign: TextAlign.center, + ), + connectorBuilder: (_, index, __) { + return SolidLineConnector( + space: 30, + // If the flow index is greater than currentPageIndex then + // show green(visited) color else show fade(not visited) color. + 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/lib/widgets/talawa_error_dialog.dart b/lib/widgets/talawa_error_dialog.dart new file mode 100644 index 000000000..f7a252467 --- /dev/null +++ b/lib/widgets/talawa_error_dialog.dart @@ -0,0 +1,127 @@ +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; + +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; + +/// Common Error Dialog box for the whole talawa app. +class TalawaErrorDialog extends StatelessWidget { + const TalawaErrorDialog( + this.errorMessage, { + super.key, + required this.messageType, + }); + + /// error message for the talawaDialogBox. + final String errorMessage; + + /// enum to what is the type of error message. + final MessageType messageType; + + @override + Widget build(BuildContext context) { + final screenWidth = MediaQuery.of(context).size.width; + return SizedBox( + width: screenWidth * 0.8, // Adjust the width based on screen size + child: AlertDialog( + content: SizedBox( + width: SizeConfig.screenWidth! * 0.65, + height: SizeConfig.screenWidth! * 0.38, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SvgPicture.asset( + messageType == MessageType.error + ? 'assets/images/Vector.svg' + : messageType == MessageType.warning + ? 'assets/images/Vector.svg' + : messageType == MessageType.info + ? 'assets/icons/Info.svg' + : 'assets/images/Vector.svg', + colorFilter: ColorFilter.mode( + messageType == MessageType.error + ? Colors.red + : messageType == MessageType.warning + ? Colors.yellow + : messageType == MessageType.info + ? Colors.green + : Colors.red, + BlendMode.srcIn, + ), + ), + const SizedBox( + height: 5, + ), + Text( + messageType == MessageType.error + ? AppLocalizations.of(context)!.strictTranslate('Error') + : messageType == MessageType.warning + ? AppLocalizations.of(context)! + .strictTranslate('Warning') + : messageType == MessageType.info + ? AppLocalizations.of(context)! + .strictTranslate('Information') + : AppLocalizations.of(context)! + .strictTranslate('Error'), + style: TextStyle( + color: messageType == MessageType.error + ? Colors.red + : messageType == MessageType.warning + ? Colors.yellow + : messageType == MessageType.info + ? Colors.green + : Colors.red, + fontSize: screenWidth * + 0.04, // Adjust the font size based on screen width + ), + textAlign: TextAlign.center, + ), + const SizedBox( + height: 5, + ), + Expanded( + child: AutoSizeText( + AppLocalizations.of(context)!.strictTranslate(errorMessage), + style: const TextStyle(fontSize: 16), + maxLines: 3, + ), + ), + const SizedBox( + height: 19, + ), + ], + ), + ), + actions: [ + TextButton( + style: TextButton.styleFrom( + backgroundColor: messageType == MessageType.error + ? Colors.red + : messageType == MessageType.warning + ? Colors.red + : messageType == MessageType.info + ? Colors.black26 + : Colors.red, + foregroundColor: Colors.red, + ), + child: Text( + messageType == MessageType.error + ? 'Dismiss' + : messageType == MessageType.warning + ? 'Dismiss' + : messageType == MessageType.info + ? 'Close' + : 'Dismiss', + style: const TextStyle(color: Color.fromRGBO(202, 202, 202, 1)), + ), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + ], + ), + ); + } +} diff --git a/lib/widgets/talawa_error_snackbar.dart b/lib/widgets/talawa_error_snackbar.dart new file mode 100644 index 000000000..2a981b110 --- /dev/null +++ b/lib/widgets/talawa_error_snackbar.dart @@ -0,0 +1,88 @@ +import 'package:flutter/material.dart'; +import 'package:talawa/enums/enums.dart'; + +import 'package:talawa/utils/app_localization.dart'; + +/// Common Error Snack Bar for the whole talawa app. +class TalawaErrorSnackBar extends StatelessWidget { + const TalawaErrorSnackBar({ + super.key, + required this.duration, + required this.errorMessage, + required this.messageType, + }); + + /// Duration the snack bar is visible. + final Duration duration; + + /// error message for the talawa Snack Bar. + final String errorMessage; + + /// enum for the type of error message. + final MessageType messageType; + @override + Widget build(BuildContext context) { + final ScrollController scrollController = ScrollController(); + + WidgetsBinding.instance.addPostFrameCallback((_) { + scrollController.animateTo( + scrollController.position.maxScrollExtent, + duration: duration, + curve: Curves.linear, + ); + }); + + return Row( + children: [ + Container( + width: 20, + height: 80, + decoration: BoxDecoration( + color: messageType == MessageType.error + ? Colors.red + : messageType == MessageType.warning + ? Colors.yellow + : messageType == MessageType.info + ? Colors.green + : Colors.red, + ), + ), + const SizedBox( + width: 10, + ), + Icon( + messageType == MessageType.error + ? Icons.error + : messageType == MessageType.warning + ? Icons.error + : messageType == MessageType.info + ? Icons.info_outline + : Icons.error, + // Icons.error, + color: messageType == MessageType.error + ? Colors.red + : messageType == MessageType.warning + ? Colors.yellow + : messageType == MessageType.info + ? Colors.green + : Colors.red, + size: 35, + ), + const SizedBox( + width: 10, + ), + Expanded( + flex: 1, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + controller: scrollController, + child: Text( + AppLocalizations.of(context)!.strictTranslate(errorMessage), + style: const TextStyle(color: Colors.white), + ), + ), + ), + ], + ); + } +} diff --git a/lib/widgets/theme_switch.dart b/lib/widgets/theme_switch.dart new file mode 100644 index 000000000..4df56a15c --- /dev/null +++ b/lib/widgets/theme_switch.dart @@ -0,0 +1,32 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/theme_view_model.dart'; + +/// This class enables theme switch. +class ChangeThemeTile extends StatelessWidget { + const ChangeThemeTile({super.key}); + + @override + Widget build(BuildContext context) { + final themeProvider = Provider.of(context); + return ListTile( + key: const Key('ThemeSwitch'), + contentPadding: EdgeInsets.symmetric( + horizontal: SizeConfig.blockSizeHorizontal!, + ), + title: Text(AppLocalizations.of(context)!.strictTranslate("Dark Theme")), + trailing: Switch( + key: const Key('ToggleTheme'), + autofocus: true, + activeColor: Theme.of(context).colorScheme.primary, + value: themeProvider.isdarkTheme, + onChanged: (value) { + final provider = Provider.of(context, listen: false); + provider.switchTheme(isOn: value); + }, + ), + ); + } +} diff --git a/lib/widgets/video_widget.dart b/lib/widgets/video_widget.dart new file mode 100644 index 000000000..688f7c766 --- /dev/null +++ b/lib/widgets/video_widget.dart @@ -0,0 +1,114 @@ +import 'package:flutter/material.dart'; +import 'package:video_player/video_player.dart'; + +/// currently not part of MVP. +/// +/// This class creates a video widget. +class VideoWidget extends StatefulWidget { + const VideoWidget({super.key, required this.url, required this.play}); + + /// a_line_ending_with_end_punctuation. + /// + /// more_info_if_required + final String url; + + /// Is the video playing. + /// + final bool play; + + @override + _VideoWidgetState createState() => _VideoWidgetState(); +} + +class _VideoWidgetState extends State { + //Controls a platform video player, and provides updates when the state is changing + late VideoPlayerController _controller; + late Future _initializeVideoPlayerFuture; + //setting the mute variable to true initially + /// Is the Video muted. + /// + bool mute = true; + + @override + void initState() { + super.initState(); + //Constructs a [VideoPlayerController] playing a video from obtained from the network. + _controller = VideoPlayerController.networkUrl(widget.url as Uri); + _initializeVideoPlayerFuture = _controller.initialize().then((_) { + // Ensure the first frame is shown after the video is initialized, even before the play button has been pressed. + if (widget.play) { + _controller.play(); + _controller.setLooping(true); + _controller.setVolume(0.0); + } + setState(() {}); + }); + } + + @override + void didUpdateWidget(VideoWidget oldWidget) { + if (oldWidget.play != widget.play) { + if (widget.play) { + _controller.play(); + _controller.setLooping(true); + } else { + _controller.pause(); + } + } + super.didUpdateWidget(oldWidget); + } + + @override + void dispose() { + _controller.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + /// This function returns a GestureDetector for controlling the volume. + ///On tap, the volume is either set to 1 or 0 depending on the previous value. + return FutureBuilder( + future: _initializeVideoPlayerFuture, + builder: (context, snapshot) { + if (snapshot.connectionState == ConnectionState.done) { + return GestureDetector( + onTap: () { + _controller + .setVolume(_controller.value.volume == 1.0 ? 0.0 : 1.0); + setState(() { + if (_controller.value.volume == 1.0) { + // Set mute variable as false when the volume is increased to 1. + mute = false; + } else { + mute = true; + } + }); + }, + child: Stack( + children: [ + VideoPlayer(_controller), + Positioned( + bottom: 10.0, + right: 10.0, + child: CircleAvatar( + backgroundColor: Colors.black, + radius: 15.0, + child: Icon( + mute ? Icons.volume_off : Icons.volume_up, + color: Colors.white, + ), + ), + ), + ], + ), + ); + } else { + return const Center( + child: CircularProgressIndicator(), + ); + } + }, + ); + } +} diff --git a/pubspec.lock b/pubspec.lock new file mode 100644 index 000000000..93c585333 --- /dev/null +++ b/pubspec.lock @@ -0,0 +1,1718 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: eb376e9acf6938204f90eb3b1f00b578640d3188b4c8a8ec054f9f479af8d051 + url: "https://pub.dev" + source: hosted + version: "64.0.0" + analyzer: + dependency: transitive + description: + name: analyzer + sha256: "69f54f967773f6c26c7dcb13e93d7ccee8b17a641689da39e878d5cf13b06893" + url: "https://pub.dev" + source: hosted + version: "6.2.0" + analyzer_plugin: + dependency: transitive + description: + name: analyzer_plugin + sha256: "9661b30b13a685efaee9f02e5d01ed9f2b423bd889d28a304d02d704aee69161" + url: "https://pub.dev" + source: hosted + version: "0.11.3" + args: + dependency: transitive + description: + name: args + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + auto_size_text: + dependency: "direct main" + description: + name: auto_size_text + sha256: "3f5261cd3fb5f2a9ab4e2fc3fba84fd9fcaac8821f20a1d4e71f557521b22599" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + build: + dependency: transitive + description: + name: build + sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + build_config: + dependency: transitive + description: + name: build_config + sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + url: "https://pub.dev" + source: hosted + version: "1.1.1" + build_daemon: + dependency: transitive + description: + name: build_daemon + sha256: "0343061a33da9c5810b2d6cee51945127d8f4c060b7fbdd9d54917f0a3feaaa1" + url: "https://pub.dev" + source: hosted + version: "4.0.1" + build_resolvers: + dependency: transitive + description: + name: build_resolvers + sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + url: "https://pub.dev" + source: hosted + version: "2.4.2" + build_runner: + dependency: "direct dev" + description: + name: build_runner + sha256: "3ac61a79bfb6f6cc11f693591063a7f19a7af628dc52f141743edac5c16e8c22" + url: "https://pub.dev" + source: hosted + version: "2.4.9" + build_runner_core: + dependency: transitive + description: + name: build_runner_core + sha256: c9e32d21dd6626b5c163d48b037ce906bbe428bc23ab77bcd77bb21e593b6185 + url: "https://pub.dev" + source: hosted + version: "7.2.11" + built_collection: + dependency: transitive + description: + name: built_collection + sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" + url: "https://pub.dev" + source: hosted + version: "5.1.1" + built_value: + dependency: transitive + description: + name: built_value + sha256: c9aabae0718ec394e5bc3c7272e6bb0dc0b32201a08fe185ec1d8401d3e39309 + url: "https://pub.dev" + source: hosted + version: "8.8.1" + cached_network_image: + dependency: "direct main" + description: + name: cached_network_image + sha256: "28ea9690a8207179c319965c13cd8df184d5ee721ae2ce60f398ced1219cea1f" + url: "https://pub.dev" + source: hosted + version: "3.3.1" + cached_network_image_platform_interface: + dependency: transitive + description: + name: cached_network_image_platform_interface + sha256: "9e90e78ae72caa874a323d78fa6301b3fb8fa7ea76a8f96dc5b5bf79f283bf2f" + url: "https://pub.dev" + source: hosted + version: "4.0.0" + cached_network_image_web: + dependency: transitive + description: + name: cached_network_image_web + sha256: "42a835caa27c220d1294311ac409a43361088625a4f23c820b006dd9bffb3316" + url: "https://pub.dev" + source: hosted + version: "1.1.1" + characters: + dependency: transitive + description: + name: characters + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" + source: hosted + version: "1.3.0" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + ci: + dependency: transitive + description: + name: ci + sha256: "145d095ce05cddac4d797a158bc4cf3b6016d1fe63d8c3d2fbd7212590adca13" + url: "https://pub.dev" + source: hosted + version: "0.1.0" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 + url: "https://pub.dev" + source: hosted + version: "0.4.1" + clock: + dependency: transitive + description: + name: clock + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" + source: hosted + version: "1.1.1" + code_builder: + dependency: transitive + description: + name: code_builder + sha256: f692079e25e7869c14132d39f223f8eec9830eb76131925143b2129c4bb01b37 + url: "https://pub.dev" + source: hosted + version: "4.10.0" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + connectivity_plus: + dependency: "direct main" + description: + name: connectivity_plus + sha256: "224a77051d52a11fbad53dd57827594d3bd24f945af28bd70bab376d68d437f0" + url: "https://pub.dev" + source: hosted + version: "5.0.2" + connectivity_plus_platform_interface: + dependency: transitive + description: + name: connectivity_plus_platform_interface + sha256: cf1d1c28f4416f8c654d7dc3cd638ec586076255d407cef3ddbdaf178272a71a + url: "https://pub.dev" + source: hosted + version: "1.2.4" + contained_tab_bar_view: + dependency: "direct main" + description: + name: contained_tab_bar_view + sha256: "87e35f47992764e45ab6205493f2f90c1e3fac4ad84f2b2285b73414727b756e" + url: "https://pub.dev" + source: hosted + version: "0.8.0" + container_tab_indicator: + dependency: transitive + description: + name: container_tab_indicator + sha256: b0bdd73bb495c31c5711cefa363511b10bb3ebcfc007b603a2599401ebe6b2d9 + url: "https://pub.dev" + source: hosted + version: "0.3.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + cross_file: + dependency: transitive + description: + name: cross_file + sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" + url: "https://pub.dev" + source: hosted + version: "0.3.4+1" + crypto: + dependency: "direct main" + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + csslib: + dependency: transitive + description: + name: csslib + sha256: "706b5707578e0c1b4b7550f64078f0a0f19dec3f50a178ffae7006b0a9ca58fb" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d + url: "https://pub.dev" + source: hosted + version: "1.0.6" + currency_picker: + dependency: "direct main" + description: + name: currency_picker + sha256: c9ab5c0da8ae4dcc6421064dccde072b44f5b44914691b967ea4cf45a266a658 + url: "https://pub.dev" + source: hosted + version: "2.0.21" + custom_lint: + dependency: "direct dev" + description: + name: custom_lint + sha256: dfb893ff17c83cf08676c6b64df11d3e53d80590978d7c1fb242afff3ba6dedb + url: "https://pub.dev" + source: hosted + version: "0.5.8" + custom_lint_builder: + dependency: transitive + description: + name: custom_lint_builder + sha256: "8df6634b38a36a6c6cb74a9c0eb02e9ba0b0ab89b29e38e6daa86e8ed2c6288d" + url: "https://pub.dev" + source: hosted + version: "0.5.8" + custom_lint_core: + dependency: transitive + description: + name: custom_lint_core + sha256: "2b235be098d157e244f18ea905a15a18c16a205e30553888fac6544bbf52f03f" + url: "https://pub.dev" + source: hosted + version: "0.5.8" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "40ae61a5d43feea6d24bd22c0537a6629db858963b99b4bc1c3db80676f32368" + url: "https://pub.dev" + source: hosted + version: "2.3.4" + dbus: + dependency: transitive + description: + name: dbus + sha256: "365c771ac3b0e58845f39ec6deebc76e3276aa9922b0cc60840712094d9047ac" + url: "https://pub.dev" + source: hosted + version: "0.7.10" + device_info_plus: + dependency: transitive + description: + name: device_info_plus + sha256: "093b02a284b4969bb641a6236bbb8e626e4035c6ec9e30c20b65d505c24b3080" + url: "https://pub.dev" + source: hosted + version: "10.0.0" + device_info_plus_platform_interface: + dependency: transitive + description: + name: device_info_plus_platform_interface + sha256: d3b01d5868b50ae571cd1dc6e502fc94d956b665756180f7b16ead09e836fd64 + url: "https://pub.dev" + source: hosted + version: "7.0.0" + fake_async: + dependency: "direct dev" + description: + name: fake_async + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" + source: hosted + version: "1.3.1" + ffi: + dependency: transitive + description: + name: ffi + sha256: "7bf0adc28a23d395f19f3f1eb21dd7cfd1dd9f8e1c50051c069122e6853bc878" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + file: + dependency: "direct main" + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + file_selector_linux: + dependency: transitive + description: + name: file_selector_linux + sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" + url: "https://pub.dev" + source: hosted + version: "0.9.2+1" + file_selector_macos: + dependency: transitive + description: + name: file_selector_macos + sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6 + url: "https://pub.dev" + source: hosted + version: "0.9.3+3" + file_selector_platform_interface: + dependency: transitive + description: + name: file_selector_platform_interface + sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b + url: "https://pub.dev" + source: hosted + version: "2.6.2" + file_selector_windows: + dependency: transitive + description: + name: file_selector_windows + sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0 + url: "https://pub.dev" + source: hosted + version: "0.9.3+1" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_braintree: + dependency: "direct main" + description: + name: flutter_braintree + sha256: d58a91212c21f97aa1e8fcbcbb394744eb5997c7ba929274daf3cf903ceef8db + url: "https://pub.dev" + source: hosted + version: "4.0.0" + flutter_cache_manager: + dependency: "direct main" + description: + name: flutter_cache_manager + sha256: "8207f27539deb83732fdda03e259349046a39a4c767269285f449ade355d54ba" + url: "https://pub.dev" + source: hosted + version: "3.3.1" + flutter_hooks: + dependency: transitive + description: + name: flutter_hooks + sha256: "09f64db63fee3b2ab8b9038a1346be7d8986977fae3fec601275bf32455ccfc0" + url: "https://pub.dev" + source: hosted + version: "0.20.4" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + sha256: "8cdc719114ab1c86c64bb7a86d3a679674c3637edd229e3a994797d4a1504ce4" + url: "https://pub.dev" + source: hosted + version: "17.1.0" + flutter_local_notifications_linux: + dependency: transitive + description: + name: flutter_local_notifications_linux + sha256: "33f741ef47b5f63cc7f78fe75eeeac7e19f171ff3c3df054d84c1e38bedb6a03" + url: "https://pub.dev" + source: hosted + version: "4.0.0+1" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + sha256: "340abf67df238f7f0ef58f4a26d2a83e1ab74c77ab03cd2b2d5018ac64db30b7" + url: "https://pub.dev" + source: hosted + version: "7.1.0" + flutter_localizations: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_plugin_android_lifecycle: + dependency: transitive + description: + name: flutter_plugin_android_lifecycle + sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da + url: "https://pub.dev" + source: hosted + version: "2.0.17" + flutter_reaction_button: + dependency: "direct main" + description: + name: flutter_reaction_button + sha256: "9fe67f6e6dac65c5ee864c2ab03550b25e7fc82b9a800c885a87f85abe2c03c6" + url: "https://pub.dev" + source: hosted + version: "3.0.0+3" + flutter_speed_dial: + dependency: "direct main" + description: + name: flutter_speed_dial + sha256: "698a037274a66dbae8697c265440e6acb6ab6cae9ac5f95c749e7944d8f28d41" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + flutter_svg: + dependency: "direct main" + description: + name: flutter_svg + sha256: "7b4ca6cf3304575fe9c8ec64813c8d02ee41d2afe60bcfe0678bcb5375d596a2" + url: "https://pub.dev" + source: hosted + version: "2.0.10+1" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + flutter_web_plugins: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + font_awesome_flutter: + dependency: "direct main" + description: + name: font_awesome_flutter + sha256: "275ff26905134bcb59417cf60ad979136f1f8257f2f449914b2c3e05bbb4cd6f" + url: "https://pub.dev" + source: hosted + version: "10.7.0" + freezed_annotation: + dependency: transitive + description: + name: freezed_annotation + sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d + url: "https://pub.dev" + source: hosted + version: "2.4.1" + frontend_server_client: + dependency: transitive + description: + name: frontend_server_client + sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" + url: "https://pub.dev" + source: hosted + version: "3.2.0" + get_it: + dependency: "direct main" + description: + name: get_it + sha256: ae30b28cc73053f79fd46b15f430db16cae22a0554e6cd25333c840b310b0270 + url: "https://pub.dev" + source: hosted + version: "7.6.9" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + gql: + dependency: transitive + description: + name: gql + sha256: "0bdd22c3a9464970ae590559e4f0568769b219dda9e94cb10c4cf999a3e263f7" + url: "https://pub.dev" + source: hosted + version: "1.0.1-alpha+1705114622973" + gql_dedupe_link: + dependency: transitive + description: + name: gql_dedupe_link + sha256: e5359dd0c7a38f95e2b12f6ab305989a4e30028e4032825c8e9f610150999c69 + url: "https://pub.dev" + source: hosted + version: "2.0.4-alpha+1705114623057" + gql_error_link: + dependency: transitive + description: + name: gql_error_link + sha256: "93901458f3c050e33386dedb0ca7173e08cebd7078e4e0deca4bf23ab7a71f63" + url: "https://pub.dev" + source: hosted + version: "1.0.0+1" + gql_exec: + dependency: transitive + description: + name: gql_exec + sha256: "394944626fae900f1d34343ecf2d62e44eb984826189c8979d305f0ae5846e38" + url: "https://pub.dev" + source: hosted + version: "1.1.1-alpha+1699813812660" + gql_http_link: + dependency: transitive + description: + name: gql_http_link + sha256: "1f922eed1b7078fdbfd602187663026f9f659fe9a9499e2207b5d5e01617f658" + url: "https://pub.dev" + source: hosted + version: "1.0.1+1" + gql_link: + dependency: transitive + description: + name: gql_link + sha256: "63941513a688d856546f0c3218e7ad94d47fc6e04662dcdb06de92a4cde2d7db" + url: "https://pub.dev" + source: hosted + version: "1.0.1-alpha+1705114622987" + gql_transform_link: + dependency: transitive + description: + name: gql_transform_link + sha256: "0645fdd874ca1be695fd327271fdfb24c0cd6fa40774a64b946062f321a59709" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + graphql: + dependency: transitive + description: + name: graphql + sha256: d066e53446166c12537458386b507f7426f2b8801ebafc184576aab3cbc64d56 + url: "https://pub.dev" + source: hosted + version: "5.2.0-beta.7" + graphql_flutter: + dependency: "direct main" + description: + name: graphql_flutter + sha256: "39b5e830bc654ab02c5b776c31675841d1a8c95840fdd284efba713b1d47e65d" + url: "https://pub.dev" + source: hosted + version: "5.2.0-beta.6" + graphs: + dependency: transitive + description: + name: graphs + sha256: aedc5a15e78fc65a6e23bcd927f24c64dd995062bcd1ca6eda65a3cff92a4d19 + url: "https://pub.dev" + source: hosted + version: "2.3.1" + hive: + dependency: "direct main" + description: + name: hive + sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" + url: "https://pub.dev" + source: hosted + version: "2.2.3" + hive_generator: + dependency: "direct dev" + description: + name: hive_generator + sha256: "06cb8f58ace74de61f63500564931f9505368f45f98958bd7a6c35ba24159db4" + url: "https://pub.dev" + source: hosted + version: "2.0.1" + hotreloader: + dependency: transitive + description: + name: hotreloader + sha256: ed56fdc1f3a8ac924e717257621d09e9ec20e308ab6352a73a50a1d7a4d9158e + url: "https://pub.dev" + source: hosted + version: "4.2.0" + html: + dependency: transitive + description: + name: html + sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" + url: "https://pub.dev" + source: hosted + version: "0.15.4" + http: + dependency: "direct main" + description: + name: http + sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" + url: "https://pub.dev" + source: hosted + version: "1.2.1" + http_multi_server: + dependency: transitive + description: + name: http_multi_server + sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + url: "https://pub.dev" + source: hosted + version: "3.2.1" + http_parser: + dependency: transitive + description: + name: http_parser + sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" + url: "https://pub.dev" + source: hosted + version: "4.0.2" + image_cropper: + dependency: "direct main" + description: + name: image_cropper + sha256: f4bad5ed2dfff5a7ce0dfbad545b46a945c702bb6182a921488ef01ba7693111 + url: "https://pub.dev" + source: hosted + version: "5.0.1" + image_cropper_for_web: + dependency: transitive + description: + name: image_cropper_for_web + sha256: "865d798b5c9d826f1185b32e5d0018c4183ddb77b7b82a931e1a06aa3b74974e" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + image_cropper_platform_interface: + dependency: transitive + description: + name: image_cropper_platform_interface + sha256: ee160d686422272aa306125f3b6fb1c1894d9b87a5e20ed33fa008e7285da11e + url: "https://pub.dev" + source: hosted + version: "5.0.0" + image_picker: + dependency: "direct main" + description: + name: image_picker + sha256: "26222b01a0c9a2c8fe02fc90b8208bd3325da5ed1f4a2acabf75939031ac0bdd" + url: "https://pub.dev" + source: hosted + version: "1.0.7" + image_picker_android: + dependency: transitive + description: + name: image_picker_android + sha256: "39f2bfe497e495450c81abcd44b62f56c2a36a37a175da7d137b4454977b51b1" + url: "https://pub.dev" + source: hosted + version: "0.8.9+3" + image_picker_for_web: + dependency: transitive + description: + name: image_picker_for_web + sha256: e2423c53a68b579a7c37a1eda967b8ae536c3d98518e5db95ca1fe5719a730a3 + url: "https://pub.dev" + source: hosted + version: "3.0.2" + image_picker_ios: + dependency: transitive + description: + name: image_picker_ios + sha256: fadafce49e8569257a0cad56d24438a6fa1f0cbd7ee0af9b631f7492818a4ca3 + url: "https://pub.dev" + source: hosted + version: "0.8.9+1" + image_picker_linux: + dependency: transitive + description: + name: image_picker_linux + sha256: "4ed1d9bb36f7cd60aa6e6cd479779cc56a4cb4e4de8f49d487b1aaad831300fa" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_macos: + dependency: transitive + description: + name: image_picker_macos + sha256: "3f5ad1e8112a9a6111c46d0b57a7be2286a9a07fc6e1976fdf5be2bd31d4ff62" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + image_picker_platform_interface: + dependency: transitive + description: + name: image_picker_platform_interface + sha256: fa4e815e6fcada50e35718727d83ba1c92f1edf95c0b4436554cec301b56233b + url: "https://pub.dev" + source: hosted + version: "2.9.3" + image_picker_windows: + dependency: transitive + description: + name: image_picker_windows + sha256: "6ad07afc4eb1bc25f3a01084d28520496c4a3bb0cb13685435838167c9dcedeb" + url: "https://pub.dev" + source: hosted + version: "0.2.1+1" + intl: + dependency: "direct main" + description: + name: intl + sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" + url: "https://pub.dev" + source: hosted + version: "0.18.1" + io: + dependency: transitive + description: + name: io + sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" + json_annotation: + dependency: "direct main" + description: + name: json_annotation + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + url: "https://pub.dev" + source: hosted + version: "4.8.1" + json_serializable: + dependency: "direct dev" + description: + name: json_serializable + sha256: aa1f5a8912615733e0fdc7a02af03308933c93235bdc8d50d0b0c8a8ccb0b969 + url: "https://pub.dev" + source: hosted + version: "6.7.1" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" + url: "https://pub.dev" + source: hosted + version: "10.0.0" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 + url: "https://pub.dev" + source: hosted + version: "2.0.1" + lint: + dependency: "direct dev" + description: + name: lint + sha256: d758a5211fce7fd3f5e316f804daefecdc34c7e53559716125e6da7388ae8565 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" + url: "https://pub.dev" + source: hosted + version: "0.8.0" + meta: + dependency: transitive + description: + name: meta + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + url: "https://pub.dev" + source: hosted + version: "1.11.0" + mime: + dependency: transitive + description: + name: mime + sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e + url: "https://pub.dev" + source: hosted + version: "1.0.4" + mockito: + dependency: "direct main" + description: + name: mockito + sha256: "6841eed20a7befac0ce07df8116c8b8233ed1f4486a7647c7fc5a02ae6163917" + url: "https://pub.dev" + source: hosted + version: "5.4.4" + mocktail: + dependency: transitive + description: + name: mocktail + sha256: f603ebd85a576e5914870b02e5839fc5d0243b867bf710651cf239a28ebb365e + url: "https://pub.dev" + source: hosted + version: "1.0.2" + mocktail_image_network: + dependency: "direct dev" + description: + name: mocktail_image_network + sha256: "498726e24dd0aaf84329e6acf027549b292e9b782126f78406c25eeee70a0b9b" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + network_image_mock: + dependency: "direct main" + description: + name: network_image_mock + sha256: "855cdd01d42440e0cffee0d6c2370909fc31b3bcba308a59829f24f64be42db7" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + nm: + dependency: transitive + description: + name: nm + sha256: "2c9aae4127bdc8993206464fcc063611e0e36e72018696cd9631023a31b24254" + url: "https://pub.dev" + source: hosted + version: "0.5.0" + normalize: + dependency: transitive + description: + name: normalize + sha256: "8a60e37de5b608eeaf9b839273370c71ebba445e9f73b08eee7725e0d92dbc43" + url: "https://pub.dev" + source: hosted + version: "0.8.2+1" + octo_image: + dependency: transitive + description: + name: octo_image + sha256: "45b40f99622f11901238e18d48f5f12ea36426d8eced9f4cbf58479c7aa2430d" + url: "https://pub.dev" + source: hosted + version: "2.0.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf + url: "https://pub.dev" + source: hosted + version: "1.0.1" + path_provider: + dependency: "direct main" + description: + name: path_provider + sha256: c9e7d3a4cd1410877472158bee69963a4579f78b68c65a2b7d40d1a7a88bb161 + url: "https://pub.dev" + source: hosted + version: "2.1.3" + path_provider_android: + dependency: transitive + description: + name: path_provider_android + sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" + url: "https://pub.dev" + source: hosted + version: "2.2.2" + path_provider_foundation: + dependency: transitive + description: + name: path_provider_foundation + sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + path_provider_linux: + dependency: transitive + description: + name: path_provider_linux + sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 + url: "https://pub.dev" + source: hosted + version: "2.2.1" + path_provider_platform_interface: + dependency: transitive + description: + name: path_provider_platform_interface + sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + path_provider_windows: + dependency: transitive + description: + name: path_provider_windows + sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + permission_handler: + dependency: "direct main" + description: + name: permission_handler + sha256: "18bf33f7fefbd812f37e72091a15575e72d5318854877e0e4035a24ac1113ecb" + url: "https://pub.dev" + source: hosted + version: "11.3.1" + permission_handler_android: + dependency: transitive + description: + name: permission_handler_android + sha256: "758284a0976772f9c744d6384fc5dc4834aa61e3f7aa40492927f244767374eb" + url: "https://pub.dev" + source: hosted + version: "12.0.3" + permission_handler_apple: + dependency: transitive + description: + name: permission_handler_apple + sha256: e9ad66020b89ff1b63908f247c2c6f931c6e62699b756ef8b3c4569350cd8662 + url: "https://pub.dev" + source: hosted + version: "9.4.4" + permission_handler_html: + dependency: transitive + description: + name: permission_handler_html + sha256: "54bf176b90f6eddd4ece307e2c06cf977fb3973719c35a93b85cc7093eb6070d" + url: "https://pub.dev" + source: hosted + version: "0.1.1" + permission_handler_platform_interface: + dependency: transitive + description: + name: permission_handler_platform_interface + sha256: "23dfba8447c076ab5be3dee9ceb66aad345c4a648f0cac292c77b1eb0e800b78" + url: "https://pub.dev" + source: hosted + version: "4.2.0" + permission_handler_windows: + dependency: transitive + description: + name: permission_handler_windows + sha256: "1a790728016f79a41216d88672dbc5df30e686e811ad4e698bfc51f76ad91f1e" + url: "https://pub.dev" + source: hosted + version: "0.2.1" + petitparser: + dependency: transitive + description: + name: petitparser + sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 + url: "https://pub.dev" + source: hosted + version: "6.0.2" + platform: + dependency: transitive + description: + name: platform + sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" + url: "https://pub.dev" + source: hosted + version: "3.1.4" + plugin_platform_interface: + dependency: "direct main" + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + pointycastle: + dependency: "direct main" + description: + name: pointycastle + sha256: "79fbafed02cfdbe85ef3fd06c7f4bc2cbcba0177e61b765264853d4253b21744" + url: "https://pub.dev" + source: hosted + version: "3.9.0" + pool: + dependency: transitive + description: + name: pool + sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" + url: "https://pub.dev" + source: hosted + version: "1.5.1" + provider: + dependency: "direct main" + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + qr: + dependency: transitive + description: + name: qr + sha256: "64957a3930367bf97cc211a5af99551d630f2f4625e38af10edd6b19131b64b3" + url: "https://pub.dev" + source: hosted + version: "3.0.1" + qr_code_scanner: + dependency: "direct main" + description: + name: qr_code_scanner + sha256: f23b68d893505a424f0bd2e324ebea71ed88465d572d26bb8d2e78a4749591fd + url: "https://pub.dev" + source: hosted + version: "1.0.1" + qr_flutter: + dependency: "direct main" + description: + name: qr_flutter + sha256: "5095f0fc6e3f71d08adef8feccc8cea4f12eec18a2e31c2e8d82cb6019f4b097" + url: "https://pub.dev" + source: hosted + version: "4.1.0" + quick_actions: + dependency: "direct main" + description: + name: quick_actions + sha256: b17da113df7a7005977f64adfa58ccc49c829d3ccc6e8e770079a8c7fbf2da9e + url: "https://pub.dev" + source: hosted + version: "1.0.7" + quick_actions_android: + dependency: transitive + description: + name: quick_actions_android + sha256: adb42f20a46b22fee4caef421c00ff9eb209f9d441010bc5d6e9afa824288cf6 + url: "https://pub.dev" + source: hosted + version: "1.0.10" + quick_actions_ios: + dependency: transitive + description: + name: quick_actions_ios + sha256: dd355101d0e9fef6176fa2ae2bf738bcafa8df09a1e17057fcb56475719793de + url: "https://pub.dev" + source: hosted + version: "1.0.10" + quick_actions_platform_interface: + dependency: transitive + description: + name: quick_actions_platform_interface + sha256: "81a1e40c519bb3cacfec38b3008b13cef665a75bd270da94f40091b57f0f9236" + url: "https://pub.dev" + source: hosted + version: "1.0.6" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + url: "https://pub.dev" + source: hosted + version: "0.27.7" + shared_preferences: + dependency: "direct main" + description: + name: shared_preferences + sha256: d3bbe5553a986e83980916ded2f0b435ef2e1893dfaa29d5a7a790d0eca12180 + url: "https://pub.dev" + source: hosted + version: "2.2.3" + shared_preferences_android: + dependency: transitive + description: + name: shared_preferences_android + sha256: "8568a389334b6e83415b6aae55378e158fbc2314e074983362d20c562780fb06" + url: "https://pub.dev" + source: hosted + version: "2.2.1" + shared_preferences_foundation: + dependency: transitive + description: + name: shared_preferences_foundation + sha256: "7708d83064f38060c7b39db12aefe449cb8cdc031d6062280087bc4cdb988f5c" + url: "https://pub.dev" + source: hosted + version: "2.3.5" + shared_preferences_linux: + dependency: transitive + description: + name: shared_preferences_linux + sha256: "9f2cbcf46d4270ea8be39fa156d86379077c8a5228d9dfdb1164ae0bb93f1faa" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_platform_interface: + dependency: transitive + description: + name: shared_preferences_platform_interface + sha256: "22e2ecac9419b4246d7c22bfbbda589e3acf5c0351137d87dd2939d984d37c3b" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shared_preferences_web: + dependency: transitive + description: + name: shared_preferences_web + sha256: "9aee1089b36bd2aafe06582b7d7817fd317ef05fc30e6ba14bff247d0933042a" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + shared_preferences_windows: + dependency: transitive + description: + name: shared_preferences_windows + sha256: "841ad54f3c8381c480d0c9b508b89a34036f512482c407e6df7a9c4aa2ef8f59" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + shelf: + dependency: transitive + description: + name: shelf + sha256: ad29c505aee705f41a4d8963641f91ac4cee3c8fad5947e033390a7bd8180fa4 + url: "https://pub.dev" + source: hosted + version: "1.4.1" + shelf_web_socket: + dependency: transitive + description: + name: shelf_web_socket + sha256: "9ca081be41c60190ebcb4766b2486a7d50261db7bd0f5d9615f2d653637a84c1" + url: "https://pub.dev" + source: hosted + version: "1.0.4" + shimmer: + dependency: "direct main" + description: + name: shimmer + sha256: "5f88c883a22e9f9f299e5ba0e4f7e6054857224976a5d9f839d4ebdc94a14ac9" + url: "https://pub.dev" + source: hosted + version: "3.0.0" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.99" + social_share: + dependency: "direct main" + description: + name: social_share + sha256: eb19a0f6f5a29c7bb71e5bb1991145eb52472184363b6e2da70695befd8be041 + url: "https://pub.dev" + source: hosted + version: "2.3.1" + source_gen: + dependency: transitive + description: + name: source_gen + sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" + url: "https://pub.dev" + source: hosted + version: "1.5.0" + source_helper: + dependency: transitive + description: + name: source_helper + sha256: "6adebc0006c37dd63fe05bca0a929b99f06402fc95aa35bf36d67f5c06de01fd" + url: "https://pub.dev" + source: hosted + version: "1.3.4" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + sqflite: + dependency: transitive + description: + name: sqflite + sha256: "591f1602816e9c31377d5f008c2d9ef7b8aca8941c3f89cc5fd9d84da0c38a9a" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: bb4738f15b23352822f4c42a531677e5c6f522e079461fd240ead29d8d8a54a6 + url: "https://pub.dev" + source: hosted + version: "2.5.0+2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + syncfusion_flutter_calendar: + dependency: "direct main" + description: + name: syncfusion_flutter_calendar + sha256: "24070f4ca1558d994e8232b250a2ce3edc920845c8b0f3597895afc8338c901e" + url: "https://pub.dev" + source: hosted + version: "25.1.40" + syncfusion_flutter_core: + dependency: transitive + description: + name: syncfusion_flutter_core + sha256: "8e19260d292ed77e1cbd4ee1baafb3c9486079cad856e7891478131d25076039" + url: "https://pub.dev" + source: hosted + version: "25.1.40" + syncfusion_flutter_datepicker: + dependency: "direct main" + description: + name: syncfusion_flutter_datepicker + sha256: "04e7cc46b2c0ebfcd76e6082284f7daaf4731df37ddcc876d3073159a6e55d25" + url: "https://pub.dev" + source: hosted + version: "25.1.40" + synchronized: + dependency: transitive + description: + name: synchronized + sha256: "539ef412b170d65ecdafd780f924e5be3f60032a1128df156adad6c5b373d558" + url: "https://pub.dev" + source: hosted + version: "3.1.0+1" + talawa_lint: + dependency: "direct dev" + description: + path: talawa_lint + relative: true + source: path + version: "0.0.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" + url: "https://pub.dev" + source: hosted + version: "0.6.1" + timelines: + dependency: "direct main" + description: + name: timelines + sha256: "40214f5ab772ff45459cb8c15e5f60505a6828af0c0eb1eec6f29ed911a4c1c5" + url: "https://pub.dev" + source: hosted + version: "0.1.0" + timezone: + dependency: transitive + description: + name: timezone + sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" + url: "https://pub.dev" + source: hosted + version: "0.9.2" + timing: + dependency: transitive + description: + name: timing + sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + url: "https://pub.dev" + source: hosted + version: "1.0.1" + tutorial_coach_mark: + dependency: "direct main" + description: + name: tutorial_coach_mark + sha256: "1f1fd234790afb929dec7391a4d90aa54ffe8c8e4d278d9283df8e3f5ac5d63e" + url: "https://pub.dev" + source: hosted + version: "1.2.11" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + uni_links: + dependency: "direct main" + description: + name: uni_links + sha256: "051098acfc9e26a9fde03b487bef5d3d228ca8f67693480c6f33fd4fbb8e2b6e" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + uni_links_platform_interface: + dependency: "direct main" + description: + name: uni_links_platform_interface + sha256: "929cf1a71b59e3b7c2d8a2605a9cf7e0b125b13bc858e55083d88c62722d4507" + url: "https://pub.dev" + source: hosted + version: "1.0.0" + uni_links_web: + dependency: transitive + description: + name: uni_links_web + sha256: "7539db908e25f67de2438e33cc1020b30ab94e66720b5677ba6763b25f6394df" + url: "https://pub.dev" + source: hosted + version: "0.1.0" + url_launcher: + dependency: "direct main" + description: + name: url_launcher + sha256: "6ce1e04375be4eed30548f10a315826fd933c1e493206eab82eed01f438c8d2e" + url: "https://pub.dev" + source: hosted + version: "6.2.6" + url_launcher_android: + dependency: transitive + description: + name: url_launcher_android + sha256: "507dc655b1d9cb5ebc756032eb785f114e415f91557b73bf60b7e201dfedeb2f" + url: "https://pub.dev" + source: hosted + version: "6.2.2" + url_launcher_ios: + dependency: transitive + description: + name: url_launcher_ios + sha256: "75bb6fe3f60070407704282a2d295630cab232991eb52542b18347a8a941df03" + url: "https://pub.dev" + source: hosted + version: "6.2.4" + url_launcher_linux: + dependency: transitive + description: + name: url_launcher_linux + sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + url_launcher_macos: + dependency: transitive + description: + name: url_launcher_macos + sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 + url: "https://pub.dev" + source: hosted + version: "3.1.0" + url_launcher_platform_interface: + dependency: "direct dev" + description: + name: url_launcher_platform_interface + sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" + url: "https://pub.dev" + source: hosted + version: "2.3.2" + url_launcher_web: + dependency: transitive + description: + name: url_launcher_web + sha256: "3692a459204a33e04bc94f5fb91158faf4f2c8903281ddd82915adecdb1a901d" + url: "https://pub.dev" + source: hosted + version: "2.3.0" + url_launcher_windows: + dependency: transitive + description: + name: url_launcher_windows + sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 + url: "https://pub.dev" + source: hosted + version: "3.1.1" + uuid: + dependency: transitive + description: + name: uuid + sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8 + url: "https://pub.dev" + source: hosted + version: "4.3.3" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "32c3c684e02f9bc0afb0ae0aa653337a2fe022e8ab064bcd7ffda27a74e288e3" + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: c86987475f162fadff579e7320c7ddda04cd2fdeffbe1129227a85d9ac9e03da + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "12faff3f73b1741a36ca7e31b292ddeb629af819ca9efe9953b70bd63fc8cd81" + url: "https://pub.dev" + source: hosted + version: "1.1.11+1" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + vibration: + dependency: "direct main" + description: + name: vibration + sha256: "778ace40e84852e6cf6017cdbaf6790a837d73ff3dd50b27da9ac232a19de8fc" + url: "https://pub.dev" + source: hosted + version: "1.8.4" + video_player: + dependency: "direct main" + description: + name: video_player + sha256: db6a72d8f4fd155d0189845678f55ad2fd54b02c10dcafd11c068dbb631286c0 + url: "https://pub.dev" + source: hosted + version: "2.8.6" + video_player_android: + dependency: transitive + description: + name: video_player_android + sha256: "7f8f25d7ad56819a82b2948357f3c3af071f6a678db33833b26ec36bbc221316" + url: "https://pub.dev" + source: hosted + version: "2.4.11" + video_player_avfoundation: + dependency: transitive + description: + name: video_player_avfoundation + sha256: "309e3962795e761be010869bae65c0b0e45b5230c5cee1bec72197ca7db040ed" + url: "https://pub.dev" + source: hosted + version: "2.5.6" + video_player_platform_interface: + dependency: transitive + description: + name: video_player_platform_interface + sha256: "236454725fafcacf98f0f39af0d7c7ab2ce84762e3b63f2cbb3ef9a7e0550bc6" + url: "https://pub.dev" + source: hosted + version: "6.2.2" + video_player_web: + dependency: transitive + description: + name: video_player_web + sha256: "34beb3a07d4331a24f7e7b2f75b8e2b103289038e07e65529699a671b6a6e2cb" + url: "https://pub.dev" + source: hosted + version: "2.1.3" + visibility_detector: + dependency: "direct main" + description: + name: visibility_detector + sha256: dd5cc11e13494f432d15939c3aa8ae76844c42b723398643ce9addb88a5ed420 + url: "https://pub.dev" + source: hosted + version: "0.4.0+2" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + url: "https://pub.dev" + source: hosted + version: "13.0.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + web: + dependency: transitive + description: + name: web + sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" + url: "https://pub.dev" + source: hosted + version: "0.5.1" + web_socket_channel: + dependency: transitive + description: + name: web_socket_channel + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b + url: "https://pub.dev" + source: hosted + version: "2.4.0" + win32: + dependency: transitive + description: + name: win32 + sha256: "464f5674532865248444b4c3daca12bd9bf2d7c47f759ce2617986e7229494a8" + url: "https://pub.dev" + source: hosted + version: "5.2.0" + win32_registry: + dependency: transitive + description: + name: win32_registry + sha256: "41fd8a189940d8696b1b810efb9abcf60827b6cbfab90b0c43e8439e3a39d85a" + url: "https://pub.dev" + source: hosted + version: "1.1.2" + xdg_directories: + dependency: transitive + description: + name: xdg_directories + sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d + url: "https://pub.dev" + source: hosted + version: "1.0.4" + xml: + dependency: transitive + description: + name: xml + sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 + url: "https://pub.dev" + source: hosted + version: "6.5.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.3.0 <3.19.0" + flutter: ">=3.19.0" diff --git a/pubspec.yaml b/pubspec.yaml new file mode 100644 index 000000000..fcdf5540d --- /dev/null +++ b/pubspec.yaml @@ -0,0 +1,116 @@ +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.17.0 <3.19.0" + +dependencies: + ############# Remove ########### + # _fe_analyzer_shared: ^60.0.0 + # analyzer: + # analyzer_plugin: + ################################ + + auto_size_text: ^3.0.0 + cached_network_image: ^3.3.1 + connectivity_plus: ^5.0.2 + contained_tab_bar_view: ^0.8.0 + + crypto: ^3.0.3 + cupertino_icons: ^1.0.3 + currency_picker: ^2.0.21 + ############## Remove ########## + + # custom_lint_builder: ^0.4.0 + ################################ + file: ^7.0.0 + + flutter: + sdk: flutter + flutter_braintree: ^4.0.0 + flutter_cache_manager: ^3.3.1 + flutter_local_notifications: ^17.1.0 + flutter_localizations: + sdk: flutter + flutter_reaction_button: ^3.0.0+3 + flutter_speed_dial: ^7.0.0 + flutter_svg: ^2.0.10+1 + font_awesome_flutter: ^10.7.0 + get_it: ^7.6.9 + graphql_flutter: ^5.1.2 + hive: ^2.2.3 + http: ^1.2.1 + image_cropper: ^5.0.1 + image_picker: ^1.0.6 + intl: ^0.18.1 + json_annotation: ^4.7.0 + mockito: ^5.4.4 + network_image_mock: ^2.1.1 + path_provider: ^2.1.3 + permission_handler: 11.3.1 + plugin_platform_interface: ^2.1.7 + pointycastle: ^3.9.0 + provider: ^6.1.2 + qr_code_scanner: ^1.0.0 + qr_flutter: 4.1.0 + quick_actions: ^1.0.6 + shared_preferences: ^2.2.3 + shimmer: ^3.0.0 + social_share: ^2.2.1 + syncfusion_flutter_calendar: ^25.1.40 + syncfusion_flutter_datepicker: ^25.1.39 + timelines: ^0.1.0 + tutorial_coach_mark: ^1.2.11 + uni_links: ^0.5.1 + uni_links_platform_interface: ^1.0.0 + url_launcher: ^6.2.6 + vibration: ^1.8.4 + video_player: ^2.8.6 + visibility_detector: ^0.4.0+2 + +dev_dependencies: + build_runner: ^2.4.9 + custom_lint: 0.5.8 + fake_async: ^1.3.1 + flutter_test: + sdk: flutter + hive_generator: ^2.0.1 + + json_serializable: ^6.7.1 + lint: ^2.3.0 + + mocktail_image_network: ^1.1.0 + talawa_lint: + path: talawa_lint/ + + url_launcher_platform_interface: 2.3.2 + +flutter: + uses-material-design: true + assets: + - assets/images/ + - assets/icons/ + - lang/ + 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 diff --git a/talawa-mobile-docs/TalawaAdmin.md b/talawa-mobile-docs/TalawaAdmin.md new file mode 100644 index 000000000..757a15bf4 --- /dev/null +++ b/talawa-mobile-docs/TalawaAdmin.md @@ -0,0 +1 @@ +file will be overwritten. \ No newline at end of file diff --git a/talawa-mobile-docs/__404error.md b/talawa-mobile-docs/__404error.md new file mode 100644 index 000000000..0fedbdcfd --- /dev/null +++ b/talawa-mobile-docs/__404error.md @@ -0,0 +1,6 @@ +# 404 + +Oops, something's gone wrong :-( + +You've tried to visit a page that doesn't exist. Luckily this site has other +[pages](index.md). diff --git a/talawa-mobile-docs/apptheme/AppTheme-class.md b/talawa-mobile-docs/apptheme/AppTheme-class.md new file mode 100644 index 000000000..517eacb47 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme-class.md @@ -0,0 +1,347 @@ + + + +# AppTheme class + + + + + + + + + + + + + +## Constructors + +[AppTheme](../apptheme/AppTheme/AppTheme.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + +## Static Properties + +##### [bodyText1](../apptheme/AppTheme/bodyText1.md) ↔ [TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) + + + + +_read / write_ + + + +##### [bodyText2](../apptheme/AppTheme/bodyText2.md) ↔ [TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) + + + + +_read / write_ + + + +##### [bodyText3](../apptheme/AppTheme/bodyText3.md) ↔ [TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) + + + + +_read / write_ + + + +##### [button](../apptheme/AppTheme/button.md) ↔ [TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) + + + + +_read / write_ + + + +##### [headline1](../apptheme/AppTheme/headline1.md) ↔ [TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) + + + + +_read / write_ + + + +##### [headline2](../apptheme/AppTheme/headline2.md) ↔ [TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) + + + + +_read / write_ + + + +##### [headline3](../apptheme/AppTheme/headline3.md) ↔ [TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) + + + + +_read / write_ + + + +##### [headline4](../apptheme/AppTheme/headline4.md) ↔ [TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) + + + + +_read / write_ + + + +##### [headline5](../apptheme/AppTheme/headline5.md) ↔ [TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) + + + + +_read / write_ + + + +##### [headline6](../apptheme/AppTheme/headline6.md) ↔ [TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) + + + + +_read / write_ + + + +##### [overline](../apptheme/AppTheme/overline.md) ↔ [TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) + + + + +_read / write_ + + + +##### [subtitle1](../apptheme/AppTheme/subtitle1.md) ↔ [TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) + + + + +_read / write_ + + + +##### [subtitle2](../apptheme/AppTheme/subtitle2.md) ↔ [TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) + + + + +_read / write_ + + + +##### [title](../apptheme/AppTheme/title.md) ↔ [TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) + + + + +_read / write_ + + + + + + + + +## Constants + +##### [blackPrimary](../apptheme/AppTheme/blackPrimary-constant.md) const [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + + + + + +##### [blackSecondary](../apptheme/AppTheme/blackSecondary-constant.md) const [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + + + + + +##### [blackTertiary](../apptheme/AppTheme/blackTertiary-constant.md) const [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + + + + + +##### [blue](../apptheme/AppTheme/blue-constant.md) const [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + + + + + +##### [green](../apptheme/AppTheme/green-constant.md) const [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + + + + + +##### [grey](../apptheme/AppTheme/grey-constant.md) const [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + + + + + +##### [lightGrey](../apptheme/AppTheme/lightGrey-constant.md) const [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + + + + + +##### [primary](../apptheme/AppTheme/primary-constant.md) const [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + + + + + +##### [red](../apptheme/AppTheme/red-constant.md) const [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + + + + + +##### [secondary](../apptheme/AppTheme/secondary-constant.md) const [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + + + + + +##### [shadow](../apptheme/AppTheme/shadow-constant.md) const [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + + + + + +##### [tertiary](../apptheme/AppTheme/tertiary-constant.md) const [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + + + + + +##### [white](../apptheme/AppTheme/white-constant.md) const [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + + + + + +##### [yellow](../apptheme/AppTheme/yellow-constant.md) const [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/AppTheme.md b/talawa-mobile-docs/apptheme/AppTheme/AppTheme.md new file mode 100644 index 000000000..4e8b04727 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/AppTheme.md @@ -0,0 +1,24 @@ + + + +# AppTheme constructor + + + + + + + +AppTheme() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/blackPrimary-constant.md b/talawa-mobile-docs/apptheme/AppTheme/blackPrimary-constant.md new file mode 100644 index 000000000..19a5f3026 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/blackPrimary-constant.md @@ -0,0 +1,32 @@ + + + +# blackPrimary constant + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) const blackPrimary + + + + + + + + +## Implementation + +```dart +static const Color blackPrimary = Color(0xFF3E3E3E); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/blackSecondary-constant.md b/talawa-mobile-docs/apptheme/AppTheme/blackSecondary-constant.md new file mode 100644 index 000000000..df8a790e6 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/blackSecondary-constant.md @@ -0,0 +1,32 @@ + + + +# blackSecondary constant + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) const blackSecondary + + + + + + + + +## Implementation + +```dart +static const Color blackSecondary = Color(0xFF636363); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/blackTertiary-constant.md b/talawa-mobile-docs/apptheme/AppTheme/blackTertiary-constant.md new file mode 100644 index 000000000..67e61ccee --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/blackTertiary-constant.md @@ -0,0 +1,32 @@ + + + +# blackTertiary constant + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) const blackTertiary + + + + + + + + +## Implementation + +```dart +static const Color blackTertiary = Color(0xFFAEAEAE); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/blue-constant.md b/talawa-mobile-docs/apptheme/AppTheme/blue-constant.md new file mode 100644 index 000000000..3b83107b8 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/blue-constant.md @@ -0,0 +1,32 @@ + + + +# blue constant + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) const blue + + + + + + + + +## Implementation + +```dart +static const Color blue = Color(0xFF2196F3); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/bodyText1.md b/talawa-mobile-docs/apptheme/AppTheme/bodyText1.md new file mode 100644 index 000000000..1319aea9a --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/bodyText1.md @@ -0,0 +1,37 @@ + + + +# bodyText1 property + + + + + + + +[TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) bodyText1 + +_read / write_ + + + + + + +## Implementation + +```dart +static TextStyle bodyText1 = const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w400, + color: blackSecondary, + fontFamily: 'OpenSans', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/bodyText2.md b/talawa-mobile-docs/apptheme/AppTheme/bodyText2.md new file mode 100644 index 000000000..447738bd6 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/bodyText2.md @@ -0,0 +1,37 @@ + + + +# bodyText2 property + + + + + + + +[TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) bodyText2 + +_read / write_ + + + + + + +## Implementation + +```dart +static TextStyle bodyText2 = const TextStyle( + fontSize: 8, + fontWeight: FontWeight.w400, + color: blackSecondary, + fontFamily: 'OpenSans', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/bodyText3.md b/talawa-mobile-docs/apptheme/AppTheme/bodyText3.md new file mode 100644 index 000000000..f5b908271 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/bodyText3.md @@ -0,0 +1,37 @@ + + + +# bodyText3 property + + + + + + + +[TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) bodyText3 + +_read / write_ + + + + + + +## Implementation + +```dart +static TextStyle bodyText3 = const TextStyle( + fontSize: 10, + fontWeight: FontWeight.w400, + color: blackSecondary, + fontFamily: 'OpenSans', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/button.md b/talawa-mobile-docs/apptheme/AppTheme/button.md new file mode 100644 index 000000000..21a7c237e --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/button.md @@ -0,0 +1,37 @@ + + + +# button property + + + + + + + +[TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) button + +_read / write_ + + + + + + +## Implementation + +```dart +static TextStyle button = const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: primary, + fontFamily: 'OpenSans', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/green-constant.md b/talawa-mobile-docs/apptheme/AppTheme/green-constant.md new file mode 100644 index 000000000..c5b360b4e --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/green-constant.md @@ -0,0 +1,32 @@ + + + +# green constant + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) const green + + + + + + + + +## Implementation + +```dart +static const Color green = Color(0xFF2ACC00); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/grey-constant.md b/talawa-mobile-docs/apptheme/AppTheme/grey-constant.md new file mode 100644 index 000000000..782396813 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/grey-constant.md @@ -0,0 +1,32 @@ + + + +# grey constant + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) const grey + + + + + + + + +## Implementation + +```dart +static const Color grey = Color(0xFFD2D2D2); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/headline1.md b/talawa-mobile-docs/apptheme/AppTheme/headline1.md new file mode 100644 index 000000000..37af53874 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/headline1.md @@ -0,0 +1,37 @@ + + + +# headline1 property + + + + + + + +[TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) headline1 + +_read / write_ + + + + + + +## Implementation + +```dart +static TextStyle headline1 = const TextStyle( + fontSize: 24, + fontWeight: FontWeight.w600, + color: blackPrimary, + fontFamily: 'OpenSans', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/headline2.md b/talawa-mobile-docs/apptheme/AppTheme/headline2.md new file mode 100644 index 000000000..66e649046 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/headline2.md @@ -0,0 +1,37 @@ + + + +# headline2 property + + + + + + + +[TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) headline2 + +_read / write_ + + + + + + +## Implementation + +```dart +static TextStyle headline2 = const TextStyle( + fontSize: 18, + fontWeight: FontWeight.w600, + color: blackPrimary, + fontFamily: 'OpenSans', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/headline3.md b/talawa-mobile-docs/apptheme/AppTheme/headline3.md new file mode 100644 index 000000000..c76880892 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/headline3.md @@ -0,0 +1,37 @@ + + + +# headline3 property + + + + + + + +[TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) headline3 + +_read / write_ + + + + + + +## Implementation + +```dart +static TextStyle headline3 = const TextStyle( + fontSize: 16, + fontWeight: FontWeight.w600, + color: blackPrimary, + fontFamily: 'OpenSans', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/headline4.md b/talawa-mobile-docs/apptheme/AppTheme/headline4.md new file mode 100644 index 000000000..003c36282 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/headline4.md @@ -0,0 +1,37 @@ + + + +# headline4 property + + + + + + + +[TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) headline4 + +_read / write_ + + + + + + +## Implementation + +```dart +static TextStyle headline4 = const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w600, + color: blackPrimary, + fontFamily: 'OpenSans', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/headline5.md b/talawa-mobile-docs/apptheme/AppTheme/headline5.md new file mode 100644 index 000000000..ef7db3e53 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/headline5.md @@ -0,0 +1,37 @@ + + + +# headline5 property + + + + + + + +[TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) headline5 + +_read / write_ + + + + + + +## Implementation + +```dart +static TextStyle headline5 = const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w600, + color: blackPrimary, + fontFamily: 'OpenSans', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/headline6.md b/talawa-mobile-docs/apptheme/AppTheme/headline6.md new file mode 100644 index 000000000..2928a6d0f --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/headline6.md @@ -0,0 +1,37 @@ + + + +# headline6 property + + + + + + + +[TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) headline6 + +_read / write_ + + + + + + +## Implementation + +```dart +static TextStyle headline6 = const TextStyle( + fontSize: 10, + fontWeight: FontWeight.w600, + color: blackPrimary, + fontFamily: 'OpenSans', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/lightGrey-constant.md b/talawa-mobile-docs/apptheme/AppTheme/lightGrey-constant.md new file mode 100644 index 000000000..2eb849d4d --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/lightGrey-constant.md @@ -0,0 +1,32 @@ + + + +# lightGrey constant + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) const lightGrey + + + + + + + + +## Implementation + +```dart +static const Color lightGrey = Color(0xFFECECEC); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/overline.md b/talawa-mobile-docs/apptheme/AppTheme/overline.md new file mode 100644 index 000000000..8e21f35cf --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/overline.md @@ -0,0 +1,37 @@ + + + +# overline property + + + + + + + +[TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) overline + +_read / write_ + + + + + + +## Implementation + +```dart +static TextStyle overline = const TextStyle( + fontSize: 6, + fontWeight: FontWeight.w400, + color: blackSecondary, + fontFamily: 'OpenSans', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/primary-constant.md b/talawa-mobile-docs/apptheme/AppTheme/primary-constant.md new file mode 100644 index 000000000..038d130c5 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/primary-constant.md @@ -0,0 +1,32 @@ + + + +# primary constant + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) const primary + + + + + + + + +## Implementation + +```dart +static const Color primary = Color(0xFFFFC107); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/red-constant.md b/talawa-mobile-docs/apptheme/AppTheme/red-constant.md new file mode 100644 index 000000000..372e2ea7c --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/red-constant.md @@ -0,0 +1,32 @@ + + + +# red constant + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) const red + + + + + + + + +## Implementation + +```dart +static const Color red = Color(0xFFEB5757); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/secondary-constant.md b/talawa-mobile-docs/apptheme/AppTheme/secondary-constant.md new file mode 100644 index 000000000..1f36d46c9 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/secondary-constant.md @@ -0,0 +1,32 @@ + + + +# secondary constant + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) const secondary + + + + + + + + +## Implementation + +```dart +static const Color secondary = Color(0xFF795548); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/shadow-constant.md b/talawa-mobile-docs/apptheme/AppTheme/shadow-constant.md new file mode 100644 index 000000000..28767a56f --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/shadow-constant.md @@ -0,0 +1,32 @@ + + + +# shadow constant + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) const shadow + + + + + + + + +## Implementation + +```dart +static const Color shadow = Color(0x408E8E8E); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/subtitle1.md b/talawa-mobile-docs/apptheme/AppTheme/subtitle1.md new file mode 100644 index 000000000..7aa5a306d --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/subtitle1.md @@ -0,0 +1,37 @@ + + + +# subtitle1 property + + + + + + + +[TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) subtitle1 + +_read / write_ + + + + + + +## Implementation + +```dart +static TextStyle subtitle1 = const TextStyle( + fontSize: 14, + fontWeight: FontWeight.w500, + color: blackSecondary, + fontFamily: 'OpenSans', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/subtitle2.md b/talawa-mobile-docs/apptheme/AppTheme/subtitle2.md new file mode 100644 index 000000000..cb3d34fad --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/subtitle2.md @@ -0,0 +1,37 @@ + + + +# subtitle2 property + + + + + + + +[TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) subtitle2 + +_read / write_ + + + + + + +## Implementation + +```dart +static TextStyle subtitle2 = const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w500, + color: blackSecondary, + fontFamily: 'OpenSans', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/tertiary-constant.md b/talawa-mobile-docs/apptheme/AppTheme/tertiary-constant.md new file mode 100644 index 000000000..020d4a1c3 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/tertiary-constant.md @@ -0,0 +1,32 @@ + + + +# tertiary constant + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) const tertiary + + + + + + + + +## Implementation + +```dart +static const Color tertiary = Color(0xFFA16938); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/title.md b/talawa-mobile-docs/apptheme/AppTheme/title.md new file mode 100644 index 000000000..21377023f --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/title.md @@ -0,0 +1,37 @@ + + + +# title property + + + + + + + +[TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html) title + +_read / write_ + + + + + + +## Implementation + +```dart +static TextStyle title = const TextStyle( + fontSize: 20, + fontWeight: FontWeight.w600, + color: blackPrimary, + fontFamily: 'OpenSans', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/white-constant.md b/talawa-mobile-docs/apptheme/AppTheme/white-constant.md new file mode 100644 index 000000000..40ddf426a --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/white-constant.md @@ -0,0 +1,32 @@ + + + +# white constant + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) const white + + + + + + + + +## Implementation + +```dart +static const Color white = Color(0xFFFFFFFF); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/AppTheme/yellow-constant.md b/talawa-mobile-docs/apptheme/AppTheme/yellow-constant.md new file mode 100644 index 000000000..19aedaf74 --- /dev/null +++ b/talawa-mobile-docs/apptheme/AppTheme/yellow-constant.md @@ -0,0 +1,32 @@ + + + +# yellow constant + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) const yellow + + + + + + + + +## Implementation + +```dart +static const Color yellow = Color(0xffF6BA18); +``` + + + + + + + diff --git a/talawa-mobile-docs/apptheme/apptheme-library.md b/talawa-mobile-docs/apptheme/apptheme-library.md new file mode 100644 index 000000000..c5efcd9ed --- /dev/null +++ b/talawa-mobile-docs/apptheme/apptheme-library.md @@ -0,0 +1,38 @@ + + + + +# apptheme library + + + + + + + + + + + +## Classes + +##### [AppTheme](../apptheme/AppTheme-class.md) + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/categories.json b/talawa-mobile-docs/categories.json new file mode 100644 index 000000000..fe51488c7 --- /dev/null +++ b/talawa-mobile-docs/categories.json @@ -0,0 +1 @@ +[] diff --git a/talawa-mobile-docs/constants_constants/constants_constants-library.md b/talawa-mobile-docs/constants_constants/constants_constants-library.md new file mode 100644 index 000000000..0281be84b --- /dev/null +++ b/talawa-mobile-docs/constants_constants/constants_constants-library.md @@ -0,0 +1,49 @@ + + + + +# constants library + + + + + + + + + + + + + + + +## Properties + +##### [languages](../constants_constants/languages.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Language](../models_language_language_model/Language-class.md)> + + + +This file contains the prototypes of all the languages available and supported currencies. +_read / write_ + + + +##### [supportedCurrencies](../constants_constants/supportedCurrencies.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html)> + + + + +_read / write_ + + + + + + + + + + + + diff --git a/talawa-mobile-docs/constants_constants/languages.md b/talawa-mobile-docs/constants_constants/languages.md new file mode 100644 index 000000000..eb6fa823a --- /dev/null +++ b/talawa-mobile-docs/constants_constants/languages.md @@ -0,0 +1,85 @@ + + + +# languages top-level property + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Language](../models_language_language_model/Language-class.md)> languages + +_read / write_ + + + +

This file contains the prototypes of all the languages available and supported currencies.

+ + + +## Implementation + +```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', + ), + Language( + countryCode: 'JP', + langCode: 'ja', + langName: '日本', + langSample: 'ようこそユーザー', + ), + Language( + countryCode: 'GE', + langCode: 'de', + langName: 'Deutsch', + langSample: 'Willkommen Benutzer', + ), + Language( + countryCode: 'PE', + langCode: 'pt', + langName: 'português', + langSample: 'Bem-vindo, usuário', + ), +]; +``` + + + + + + + + diff --git a/talawa-mobile-docs/constants_constants/supportedCurrencies.md b/talawa-mobile-docs/constants_constants/supportedCurrencies.md new file mode 100644 index 000000000..74339c224 --- /dev/null +++ b/talawa-mobile-docs/constants_constants/supportedCurrencies.md @@ -0,0 +1,129 @@ + + + +# supportedCurrencies top-level property + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html)> supportedCurrencies + +_read / write_ + + + + + + +## Implementation + +```dart +List supportedCurrencies = [ + 'AED', + 'ALL', + 'AMD', + 'ARS', + 'AUD', + 'AWG', + 'BBD', + 'BDT', + 'BMD', + 'BND', + 'BOB', + 'BSD', + 'BWP', + 'BZD', + 'CAD', + 'CHF', + 'CNY', + 'COP', + 'CRC', + 'CUP', + 'CZK', + 'DKK', + 'DOP', + 'DZD', + 'EGP', + 'ETB', + 'EUR', + 'FJD', + 'GBP', + 'GHS', + 'GIP', + 'GMD', + 'GTQ', + 'GYD', + 'HKD', + 'HNL', + 'HRK', + 'HTG', + 'HUF', + 'IDR', + 'ILS', + 'INR', + 'JMD', + 'KES', + 'KGS', + 'KHR', + 'KYD', + 'KZT', + 'LAK', + 'LBP', + 'LKR', + 'LRD', + 'LSL', + 'MAD', + 'MDL', + 'MKD', + 'MMK', + 'MNT', + 'MOP', + 'MUR', + 'MVR', + 'MWK', + 'MXN', + 'MYR', + 'NAD', + 'NGN', + 'NIO', + 'NOK', + 'NPR', + 'NZD', + 'PEN', + 'PGK', + 'PHP', + 'PKR', + 'QAR', + 'RUB', + 'SAR', + 'SCR', + 'SEK', + 'SGD', + 'SLL', + 'SOS', + 'SSP', + 'SVC', + 'SZL', + 'THB', + 'TTD', + 'TZS', + 'USD', + 'UYU', + 'UZS', + 'YER', + 'ZAR', +]; +``` + + + + + + + + diff --git a/talawa-mobile-docs/constants_custom_theme/TalawaTheme-class.md b/talawa-mobile-docs/constants_custom_theme/TalawaTheme-class.md new file mode 100644 index 000000000..256b87993 --- /dev/null +++ b/talawa-mobile-docs/constants_custom_theme/TalawaTheme-class.md @@ -0,0 +1,114 @@ + + + +# TalawaTheme class + + + + + + + + + +

This file contains various custom themes. +For instance, lightTheme, darkTheme, _lightTextTheme, _darkTextTheme, etc. +These are imported to other files/widgets to apply the required themes.

+ + + + +## Constructors + +[TalawaTheme](../constants_custom_theme/TalawaTheme/TalawaTheme.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + +## Static Properties + +##### [darkTheme](../constants_custom_theme/TalawaTheme/darkTheme.md) → [ThemeData](https://api.flutter.dev/flutter/material/ThemeData-class.html) + + + + +_final_ + + + +##### [lightTheme](../constants_custom_theme/TalawaTheme/lightTheme.md) → [ThemeData](https://api.flutter.dev/flutter/material/ThemeData-class.html) + + + + +_final_ + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/constants_custom_theme/TalawaTheme/TalawaTheme.md b/talawa-mobile-docs/constants_custom_theme/TalawaTheme/TalawaTheme.md new file mode 100644 index 000000000..6e0ab5ca7 --- /dev/null +++ b/talawa-mobile-docs/constants_custom_theme/TalawaTheme/TalawaTheme.md @@ -0,0 +1,24 @@ + + + +# TalawaTheme constructor + + + + + + + +TalawaTheme() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/constants_custom_theme/TalawaTheme/darkTheme.md b/talawa-mobile-docs/constants_custom_theme/TalawaTheme/darkTheme.md new file mode 100644 index 000000000..dba6e0b10 --- /dev/null +++ b/talawa-mobile-docs/constants_custom_theme/TalawaTheme/darkTheme.md @@ -0,0 +1,50 @@ + + + +# darkTheme property + + + + + + + +[ThemeData](https://api.flutter.dev/flutter/material/ThemeData-class.html) darkTheme + +_final_ + + + + + + +## Implementation + +```dart +static final darkTheme = ThemeData( + textSelectionTheme: const TextSelectionThemeData( + cursorColor: _darkCursorColor, + ), + scaffoldBackgroundColor: _darkScaffoldColor, + primaryColor: _darkPrimaryColor, + iconTheme: const IconThemeData( + color: _darkIconColor, + ), + fontFamily: 'product-sans', + textTheme: _darkTextTheme, + inputDecorationTheme: _darkInputDecor, + colorScheme: const ColorScheme.dark( + primaryContainer: _darkPrimaryVariantColor, + primary: _darkColorSchemePrimary, + secondary: Colors.black, + secondaryContainer: _lightScaffoldColor, + ).copyWith(secondary: _darkAccentColor), +); +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_custom_theme/TalawaTheme/lightTheme.md b/talawa-mobile-docs/constants_custom_theme/TalawaTheme/lightTheme.md new file mode 100644 index 000000000..e47787d49 --- /dev/null +++ b/talawa-mobile-docs/constants_custom_theme/TalawaTheme/lightTheme.md @@ -0,0 +1,50 @@ + + + +# lightTheme property + + + + + + + +[ThemeData](https://api.flutter.dev/flutter/material/ThemeData-class.html) lightTheme + +_final_ + + + + + + +## Implementation + +```dart +static final lightTheme = ThemeData( + scaffoldBackgroundColor: _lightScaffoldColor, + textSelectionTheme: const TextSelectionThemeData( + cursorColor: _lightCursorColor, + ), + primaryColor: _lightPrimaryColor, + iconTheme: const IconThemeData( + color: _lightIconColor, + ), + fontFamily: 'product-sans', + textTheme: _lightTextTheme, + inputDecorationTheme: _lightInputDecor, + colorScheme: const ColorScheme.light( + primaryContainer: _lightPrimaryVariantColor, + primary: _lightColorSchemePrimary, + secondary: Color(0xffF5F5F5), + secondaryContainer: _darkScaffoldColor, + ).copyWith(secondary: _lightAccentColor), +); +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_custom_theme/constants_custom_theme-library.md b/talawa-mobile-docs/constants_custom_theme/constants_custom_theme-library.md new file mode 100644 index 000000000..6c16bab5e --- /dev/null +++ b/talawa-mobile-docs/constants_custom_theme/constants_custom_theme-library.md @@ -0,0 +1,40 @@ + + + + +# custom_theme library + + + + + + + + + + + +## Classes + +##### [TalawaTheme](../constants_custom_theme/TalawaTheme-class.md) + + + +This file contains various custom themes. +For instance, lightTheme, darkTheme, _lightTextTheme, _darkTextTheme, etc. +These are imported to other files/widgets to apply the required themes. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/constants_quick_actions/ShortCutMenu-class.md b/talawa-mobile-docs/constants_quick_actions/ShortCutMenu-class.md new file mode 100644 index 000000000..b573a68b7 --- /dev/null +++ b/talawa-mobile-docs/constants_quick_actions/ShortCutMenu-class.md @@ -0,0 +1,133 @@ + + + +# ShortCutMenu class + + + + + + + + + +

This file contains the shortcuts by which user can manage and interact with the +application. quick_actions package is used for this purpose.

+ + + + +## Constructors + +[ShortCutMenu](../constants_quick_actions/ShortCutMenu/ShortCutMenu.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + +## Static Properties + +##### [quickActionsList](../constants_quick_actions/ShortCutMenu/quickActionsList.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ShortcutItem](https://pub.dev/documentation/quick_actions_platform_interface/1.0.4/types_types/ShortcutItem-class.html)> + + + + +_final_ + + + + + + + + +## Constants + +##### [chatAction](../constants_quick_actions/ShortCutMenu/chatAction-constant.md) const [ShortcutItem](https://pub.dev/documentation/quick_actions_platform_interface/1.0.4/types_types/ShortcutItem-class.html) + + + + + + + + +##### [eventAction](../constants_quick_actions/ShortCutMenu/eventAction-constant.md) const [ShortcutItem](https://pub.dev/documentation/quick_actions_platform_interface/1.0.4/types_types/ShortcutItem-class.html) + + + + + + + + +##### [feedAction](../constants_quick_actions/ShortCutMenu/feedAction-constant.md) const [ShortcutItem](https://pub.dev/documentation/quick_actions_platform_interface/1.0.4/types_types/ShortcutItem-class.html) + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/constants_quick_actions/ShortCutMenu/ShortCutMenu.md b/talawa-mobile-docs/constants_quick_actions/ShortCutMenu/ShortCutMenu.md new file mode 100644 index 000000000..68d13d357 --- /dev/null +++ b/talawa-mobile-docs/constants_quick_actions/ShortCutMenu/ShortCutMenu.md @@ -0,0 +1,24 @@ + + + +# ShortCutMenu constructor + + + + + + + +ShortCutMenu() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/constants_quick_actions/ShortCutMenu/chatAction-constant.md b/talawa-mobile-docs/constants_quick_actions/ShortCutMenu/chatAction-constant.md new file mode 100644 index 000000000..2ae5a9506 --- /dev/null +++ b/talawa-mobile-docs/constants_quick_actions/ShortCutMenu/chatAction-constant.md @@ -0,0 +1,36 @@ + + + +# chatAction constant + + + + + + + +[ShortcutItem](https://pub.dev/documentation/quick_actions_platform_interface/1.0.4/types_types/ShortcutItem-class.html) const chatAction + + + + + + + + +## Implementation + +```dart +static const chatAction = ShortcutItem( + type: "chat_action", + localizedTitle: "Messages", + icon: "chat_icon", +); +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_quick_actions/ShortCutMenu/eventAction-constant.md b/talawa-mobile-docs/constants_quick_actions/ShortCutMenu/eventAction-constant.md new file mode 100644 index 000000000..a01744fc6 --- /dev/null +++ b/talawa-mobile-docs/constants_quick_actions/ShortCutMenu/eventAction-constant.md @@ -0,0 +1,36 @@ + + + +# eventAction constant + + + + + + + +[ShortcutItem](https://pub.dev/documentation/quick_actions_platform_interface/1.0.4/types_types/ShortcutItem-class.html) const eventAction + + + + + + + + +## Implementation + +```dart +static const eventAction = ShortcutItem( + type: "events_action", + localizedTitle: "Events", + icon: "event_icon", +); +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_quick_actions/ShortCutMenu/feedAction-constant.md b/talawa-mobile-docs/constants_quick_actions/ShortCutMenu/feedAction-constant.md new file mode 100644 index 000000000..e0417a7af --- /dev/null +++ b/talawa-mobile-docs/constants_quick_actions/ShortCutMenu/feedAction-constant.md @@ -0,0 +1,36 @@ + + + +# feedAction constant + + + + + + + +[ShortcutItem](https://pub.dev/documentation/quick_actions_platform_interface/1.0.4/types_types/ShortcutItem-class.html) const feedAction + + + + + + + + +## Implementation + +```dart +static const feedAction = ShortcutItem( + type: "feed_action", + localizedTitle: "NewsFeed", + icon: "newsfeed_icon", +); +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_quick_actions/ShortCutMenu/quickActionsList.md b/talawa-mobile-docs/constants_quick_actions/ShortCutMenu/quickActionsList.md new file mode 100644 index 000000000..bc8848948 --- /dev/null +++ b/talawa-mobile-docs/constants_quick_actions/ShortCutMenu/quickActionsList.md @@ -0,0 +1,36 @@ + + + +# quickActionsList property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ShortcutItem](https://pub.dev/documentation/quick_actions_platform_interface/1.0.4/types_types/ShortcutItem-class.html)> quickActionsList + +_final_ + + + + + + +## Implementation + +```dart +static final quickActionsList = [ + eventAction, + feedAction, + chatAction +]; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_quick_actions/constants_quick_actions-library.md b/talawa-mobile-docs/constants_quick_actions/constants_quick_actions-library.md new file mode 100644 index 000000000..edab8824a --- /dev/null +++ b/talawa-mobile-docs/constants_quick_actions/constants_quick_actions-library.md @@ -0,0 +1,39 @@ + + + + +# quick_actions library + + + + + + + + + + + +## Classes + +##### [ShortCutMenu](../constants_quick_actions/ShortCutMenu-class.md) + + + +This file contains the shortcuts by which user can manage and interact with the +application. quick_actions package is used for this purpose. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes-class.md b/talawa-mobile-docs/constants_routing_constants/Routes-class.md new file mode 100644 index 000000000..50814616d --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes-class.md @@ -0,0 +1,382 @@ + + + +# Routes class + + + + + + + + + +

This file contains the routes. These can be used to make push screen call via Routes.splashScreen to access these string.

+ + + + +## Constructors + +[Routes](../constants_routing_constants/Routes/Routes.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + +## Constants + +##### [addTask](../constants_routing_constants/Routes/addTask-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [appSettings](../constants_routing_constants/Routes/appSettings-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [calendar](../constants_routing_constants/Routes/calendar-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [chatMessageScreen](../constants_routing_constants/Routes/chatMessageScreen-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [createEventPage](../constants_routing_constants/Routes/createEventPage-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [demoPageViewRoute](../constants_routing_constants/Routes/demoPageViewRoute-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [editEventPage](../constants_routing_constants/Routes/editEventPage-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [editProfilePage](../constants_routing_constants/Routes/editProfilePage-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [editTask](../constants_routing_constants/Routes/editTask-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [eventInfoPage](../constants_routing_constants/Routes/eventInfoPage-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [eventTasks](../constants_routing_constants/Routes/eventTasks-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [exploreEventsScreen](../constants_routing_constants/Routes/exploreEventsScreen-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [homeScreen](../constants_routing_constants/Routes/homeScreen-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [individualPost](../constants_routing_constants/Routes/individualPost-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [joinOrg](../constants_routing_constants/Routes/joinOrg-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [languageSelectionRoute](../constants_routing_constants/Routes/languageSelectionRoute-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [loginScreen](../constants_routing_constants/Routes/loginScreen-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [mainScreen](../constants_routing_constants/Routes/mainScreen-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [mapScreen](../constants_routing_constants/Routes/mapScreen-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [pinnedPostPage](../constants_routing_constants/Routes/pinnedPostPage-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [profilePage](../constants_routing_constants/Routes/profilePage-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [progressDialog](../constants_routing_constants/Routes/progressDialog-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [recoverScreen](../constants_routing_constants/Routes/recoverScreen-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [requestAccess](../constants_routing_constants/Routes/requestAccess-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [selectContact](../constants_routing_constants/Routes/selectContact-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [selectOrgScreen](../constants_routing_constants/Routes/selectOrgScreen-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [setUrlScreen](../constants_routing_constants/Routes/setUrlScreen-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [signupDetailScreen](../constants_routing_constants/Routes/signupDetailScreen-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [splashScreen](../constants_routing_constants/Routes/splashScreen-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [updateScreen](../constants_routing_constants/Routes/updateScreen-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [userTasks](../constants_routing_constants/Routes/userTasks-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + +##### [waitingScreen](../constants_routing_constants/Routes/waitingScreen-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +static variables. + + + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/Routes.md b/talawa-mobile-docs/constants_routing_constants/Routes/Routes.md new file mode 100644 index 000000000..94fcce69f --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/Routes.md @@ -0,0 +1,24 @@ + + + +# Routes constructor + + + + + + + +Routes() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/addTask-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/addTask-constant.md new file mode 100644 index 000000000..769130815 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/addTask-constant.md @@ -0,0 +1,33 @@ + + + +# addTask constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const addTask + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String addTask = '/addTask'; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/appSettings-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/appSettings-constant.md new file mode 100644 index 000000000..055c9cc61 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/appSettings-constant.md @@ -0,0 +1,33 @@ + + + +# appSettings constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const appSettings + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String appSettings = '/appSettingsPage'; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/calendar-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/calendar-constant.md new file mode 100644 index 000000000..e68f3aef8 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/calendar-constant.md @@ -0,0 +1,33 @@ + + + +# calendar constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const calendar + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String calendar = '/calendar'; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/chatMessageScreen-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/chatMessageScreen-constant.md new file mode 100644 index 000000000..143ffb1c3 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/chatMessageScreen-constant.md @@ -0,0 +1,33 @@ + + + +# chatMessageScreen constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const chatMessageScreen + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String chatMessageScreen = '/chatMessageScreen'; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/createEventPage-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/createEventPage-constant.md new file mode 100644 index 000000000..cbc75f3c3 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/createEventPage-constant.md @@ -0,0 +1,33 @@ + + + +# createEventPage constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const createEventPage + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String createEventPage = "/createEventPage"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/demoPageViewRoute-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/demoPageViewRoute-constant.md new file mode 100644 index 000000000..4872c8cc5 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/demoPageViewRoute-constant.md @@ -0,0 +1,33 @@ + + + +# demoPageViewRoute constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const demoPageViewRoute + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String demoPageViewRoute = "/demoPageViewRoute"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/editEventPage-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/editEventPage-constant.md new file mode 100644 index 000000000..37189f536 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/editEventPage-constant.md @@ -0,0 +1,33 @@ + + + +# editEventPage constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const editEventPage + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String editEventPage = "/editEventPage"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/editProfilePage-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/editProfilePage-constant.md new file mode 100644 index 000000000..eeb2fae24 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/editProfilePage-constant.md @@ -0,0 +1,33 @@ + + + +# editProfilePage constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const editProfilePage + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String editProfilePage = "/editProfilePage"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/editTask-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/editTask-constant.md new file mode 100644 index 000000000..8dce26712 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/editTask-constant.md @@ -0,0 +1,33 @@ + + + +# editTask constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const editTask + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String editTask = '/editTask'; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/eventInfoPage-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/eventInfoPage-constant.md new file mode 100644 index 000000000..d40a818cc --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/eventInfoPage-constant.md @@ -0,0 +1,33 @@ + + + +# eventInfoPage constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const eventInfoPage + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String eventInfoPage = "/eventInfo"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/eventTasks-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/eventTasks-constant.md new file mode 100644 index 000000000..5f1ae4565 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/eventTasks-constant.md @@ -0,0 +1,33 @@ + + + +# eventTasks constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const eventTasks + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String eventTasks = '/event_tasks'; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/exploreEventsScreen-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/exploreEventsScreen-constant.md new file mode 100644 index 000000000..49d7f4b78 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/exploreEventsScreen-constant.md @@ -0,0 +1,33 @@ + + + +# exploreEventsScreen constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const exploreEventsScreen + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String exploreEventsScreen = "/exploreEvents"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/homeScreen-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/homeScreen-constant.md new file mode 100644 index 000000000..2e5038d9b --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/homeScreen-constant.md @@ -0,0 +1,33 @@ + + + +# homeScreen constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const homeScreen + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String homeScreen = "/homeScreen"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/individualPost-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/individualPost-constant.md new file mode 100644 index 000000000..8e90b10af --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/individualPost-constant.md @@ -0,0 +1,33 @@ + + + +# individualPost constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const individualPost + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String individualPost = "/individualPost"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/joinOrg-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/joinOrg-constant.md new file mode 100644 index 000000000..b15ae1443 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/joinOrg-constant.md @@ -0,0 +1,33 @@ + + + +# joinOrg constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const joinOrg + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String joinOrg = '/joinOrg'; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/languageSelectionRoute-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/languageSelectionRoute-constant.md new file mode 100644 index 000000000..c44d80fa2 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/languageSelectionRoute-constant.md @@ -0,0 +1,33 @@ + + + +# languageSelectionRoute constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const languageSelectionRoute + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String languageSelectionRoute = "/selectLang"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/loginScreen-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/loginScreen-constant.md new file mode 100644 index 000000000..8fec21cdf --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/loginScreen-constant.md @@ -0,0 +1,33 @@ + + + +# loginScreen constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const loginScreen + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String loginScreen = "/login"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/mainScreen-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/mainScreen-constant.md new file mode 100644 index 000000000..ea0792a53 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/mainScreen-constant.md @@ -0,0 +1,33 @@ + + + +# mainScreen constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const mainScreen + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String mainScreen = "/mainScreen"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/mapScreen-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/mapScreen-constant.md new file mode 100644 index 000000000..b4e93a646 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/mapScreen-constant.md @@ -0,0 +1,33 @@ + + + +# mapScreen constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const mapScreen + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String mapScreen = '/mapScreen'; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/pinnedPostPage-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/pinnedPostPage-constant.md new file mode 100644 index 000000000..c818d6e26 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/pinnedPostPage-constant.md @@ -0,0 +1,33 @@ + + + +# pinnedPostPage constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const pinnedPostPage + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String pinnedPostPage = "/pinnedPostPage"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/profilePage-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/profilePage-constant.md new file mode 100644 index 000000000..c81e48b56 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/profilePage-constant.md @@ -0,0 +1,33 @@ + + + +# profilePage constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const profilePage + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String profilePage = "/profilePage"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/progressDialog-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/progressDialog-constant.md new file mode 100644 index 000000000..9b8fc0437 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/progressDialog-constant.md @@ -0,0 +1,33 @@ + + + +# progressDialog constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const progressDialog + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String progressDialog = "/progress"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/recoverScreen-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/recoverScreen-constant.md new file mode 100644 index 000000000..ec709fd38 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/recoverScreen-constant.md @@ -0,0 +1,33 @@ + + + +# recoverScreen constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const recoverScreen + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String recoverScreen = "/recover"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/requestAccess-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/requestAccess-constant.md new file mode 100644 index 000000000..1107d1e0b --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/requestAccess-constant.md @@ -0,0 +1,33 @@ + + + +# requestAccess constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const requestAccess + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String requestAccess = '/requestAccess'; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/selectContact-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/selectContact-constant.md new file mode 100644 index 000000000..7f8f9c69e --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/selectContact-constant.md @@ -0,0 +1,33 @@ + + + +# selectContact constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const selectContact + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String selectContact = '/selectContact'; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/selectOrgScreen-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/selectOrgScreen-constant.md new file mode 100644 index 000000000..23c3b5949 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/selectOrgScreen-constant.md @@ -0,0 +1,33 @@ + + + +# selectOrgScreen constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const selectOrgScreen + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String selectOrgScreen = "/selectOrg"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/setUrlScreen-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/setUrlScreen-constant.md new file mode 100644 index 000000000..e3231e3ac --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/setUrlScreen-constant.md @@ -0,0 +1,33 @@ + + + +# setUrlScreen constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const setUrlScreen + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String setUrlScreen = "/setUrl"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/signupDetailScreen-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/signupDetailScreen-constant.md new file mode 100644 index 000000000..1d2c87467 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/signupDetailScreen-constant.md @@ -0,0 +1,33 @@ + + + +# signupDetailScreen constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const signupDetailScreen + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String signupDetailScreen = "/signupDetails"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/splashScreen-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/splashScreen-constant.md new file mode 100644 index 000000000..b2fdcfbfa --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/splashScreen-constant.md @@ -0,0 +1,33 @@ + + + +# splashScreen constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const splashScreen + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String splashScreen = "/"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/updateScreen-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/updateScreen-constant.md new file mode 100644 index 000000000..5264a460f --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/updateScreen-constant.md @@ -0,0 +1,33 @@ + + + +# updateScreen constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const updateScreen + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String updateScreen = "/update"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/userTasks-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/userTasks-constant.md new file mode 100644 index 000000000..13241dbaf --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/userTasks-constant.md @@ -0,0 +1,33 @@ + + + +# userTasks constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const userTasks + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String userTasks = '/user_tasks'; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/Routes/waitingScreen-constant.md b/talawa-mobile-docs/constants_routing_constants/Routes/waitingScreen-constant.md new file mode 100644 index 000000000..14dea52eb --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/Routes/waitingScreen-constant.md @@ -0,0 +1,33 @@ + + + +# waitingScreen constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const waitingScreen + + + + + +

static variables.

+ + + +## Implementation + +```dart +static const String waitingScreen = "/waiting"; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_routing_constants/constants_routing_constants-library.md b/talawa-mobile-docs/constants_routing_constants/constants_routing_constants-library.md new file mode 100644 index 000000000..f0958e272 --- /dev/null +++ b/talawa-mobile-docs/constants_routing_constants/constants_routing_constants-library.md @@ -0,0 +1,38 @@ + + + + +# routing_constants library + + + + + + + + + + + +## Classes + +##### [Routes](../constants_routing_constants/Routes-class.md) + + + +This file contains the routes. These can be used to make push screen call via Routes.splashScreen to access these string. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/constants_timeout/TimeOuts-class.md b/talawa-mobile-docs/constants_timeout/TimeOuts-class.md new file mode 100644 index 000000000..b85d9801e --- /dev/null +++ b/talawa-mobile-docs/constants_timeout/TimeOuts-class.md @@ -0,0 +1,121 @@ + + + +# TimeOuts class + + + + + + + + + +

Class to define constant timeout to bring consistency in the code.

+ + + + +## Constructors + +[TimeOuts](../constants_timeout/TimeOuts/TimeOuts.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + +## Constants + +##### [large](../constants_timeout/TimeOuts/large-constant.md) const [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +For large timeout, used for large data fetch. + + + + +##### [mediums](../constants_timeout/TimeOuts/mediums-constant.md) const [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +For medium timeout, used for medium data fetch. + + + + +##### [small](../constants_timeout/TimeOuts/small-constant.md) const [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +For small timeout, used for small data fetch. + + + + + + + + + diff --git a/talawa-mobile-docs/constants_timeout/TimeOuts/TimeOuts.md b/talawa-mobile-docs/constants_timeout/TimeOuts/TimeOuts.md new file mode 100644 index 000000000..75d16c8cb --- /dev/null +++ b/talawa-mobile-docs/constants_timeout/TimeOuts/TimeOuts.md @@ -0,0 +1,24 @@ + + + +# TimeOuts constructor + + + + + + + +TimeOuts() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/constants_timeout/TimeOuts/large-constant.md b/talawa-mobile-docs/constants_timeout/TimeOuts/large-constant.md new file mode 100644 index 000000000..06ea1ae78 --- /dev/null +++ b/talawa-mobile-docs/constants_timeout/TimeOuts/large-constant.md @@ -0,0 +1,33 @@ + + + +# large constant + + + + + + + +[int](https://api.flutter.dev/flutter/dart-core/int-class.html) const large + + + + + +

For large timeout, used for large data fetch.

+ + + +## Implementation + +```dart +static const large = 300; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_timeout/TimeOuts/mediums-constant.md b/talawa-mobile-docs/constants_timeout/TimeOuts/mediums-constant.md new file mode 100644 index 000000000..c481d6b87 --- /dev/null +++ b/talawa-mobile-docs/constants_timeout/TimeOuts/mediums-constant.md @@ -0,0 +1,33 @@ + + + +# mediums constant + + + + + + + +[int](https://api.flutter.dev/flutter/dart-core/int-class.html) const mediums + + + + + +

For medium timeout, used for medium data fetch.

+ + + +## Implementation + +```dart +static const mediums = 100; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_timeout/TimeOuts/small-constant.md b/talawa-mobile-docs/constants_timeout/TimeOuts/small-constant.md new file mode 100644 index 000000000..3fce2b606 --- /dev/null +++ b/talawa-mobile-docs/constants_timeout/TimeOuts/small-constant.md @@ -0,0 +1,33 @@ + + + +# small constant + + + + + + + +[int](https://api.flutter.dev/flutter/dart-core/int-class.html) const small + + + + + +

For small timeout, used for small data fetch.

+ + + +## Implementation + +```dart +static const small = 5; +``` + + + + + + + diff --git a/talawa-mobile-docs/constants_timeout/constants_timeout-library.md b/talawa-mobile-docs/constants_timeout/constants_timeout-library.md new file mode 100644 index 000000000..68fa60665 --- /dev/null +++ b/talawa-mobile-docs/constants_timeout/constants_timeout-library.md @@ -0,0 +1,38 @@ + + + + +# timeout library + + + + + + + + + + + +## Classes + +##### [TimeOuts](../constants_timeout/TimeOuts-class.md) + + + +Class to define constant timeout to bring consistency in the code. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_language_icon/LanguageIcon-class.md b/talawa-mobile-docs/custom_painters_language_icon/LanguageIcon-class.md new file mode 100644 index 000000000..a05ca02ba --- /dev/null +++ b/talawa-mobile-docs/custom_painters_language_icon/LanguageIcon-class.md @@ -0,0 +1,183 @@ + + + +# LanguageIcon class + + + + + + + + + +

This class draws the language icon using custom paint. +CustomPaint is a widget from the Flutter SDK, which enables +you to use a canvas to draw different shapes.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [Listenable](https://api.flutter.dev/flutter/foundation/Listenable-class.html) +- [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) +- LanguageIcon + + + + + + + + +## Constructors + +[LanguageIcon](../custom_painters_language_icon/LanguageIcon/LanguageIcon.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [semanticsBuilder](https://api.flutter.dev/flutter/rendering/CustomPainter/semanticsBuilder.html) → [SemanticsBuilderCallback](https://api.flutter.dev/flutter/rendering/SemanticsBuilderCallback.html)? + + + +Returns a function that builds semantic information for the picture drawn +by this painter. +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/rendering/CustomPainter/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be notified when it is time to repaint. +_inherited_ + + + +##### [hitTest](https://api.flutter.dev/flutter/rendering/CustomPainter/hitTest.html)([Offset](https://api.flutter.dev/flutter/dart-ui/Offset-class.html) position) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? + + + +Called whenever a hit test is being performed on an object that is using +this custom paint delegate. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [paint](../custom_painters_language_icon/LanguageIcon/paint.md)([Canvas](https://api.flutter.dev/flutter/dart-ui/Canvas-class.html) canvas, [Size](https://api.flutter.dev/flutter/dart-ui/Size-class.html) size) void + + + +Called whenever the object needs to paint. The given
Canvas has its +coordinate space configured such that the origin is at the top left of the +box. The area of the box is the size of the size argument. +_override_ + + + +##### [removeListener](https://api.flutter.dev/flutter/rendering/CustomPainter/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that the +object notifies when it is time to repaint. +_inherited_ + + + +##### [shouldRebuildSemantics](https://api.flutter.dev/flutter/rendering/CustomPainter/shouldRebuildSemantics.html)(covariant [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) oldDelegate) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Called whenever a new instance of the custom painter delegate class is +provided to the RenderCustomPaint object, or any time that a new +CustomPaint object is created with a new instance of the custom painter +delegate class (which amounts to the same thing, because the latter is +implemented in terms of the former). +_inherited_ + + + +##### [shouldRepaint](../custom_painters_language_icon/LanguageIcon/shouldRepaint.md)(covariant [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) oldDelegate) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Called whenever a new instance of the custom painter delegate class is +provided to the RenderCustomPaint object, or any time that a new +CustomPaint object is created with a new instance of the custom painter +delegate class (which amounts to the same thing, because the latter is +implemented in terms of the former). +_override_ + + + +##### [toString](https://api.flutter.dev/flutter/rendering/CustomPainter/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_language_icon/LanguageIcon/LanguageIcon.md b/talawa-mobile-docs/custom_painters_language_icon/LanguageIcon/LanguageIcon.md new file mode 100644 index 000000000..65d824c57 --- /dev/null +++ b/talawa-mobile-docs/custom_painters_language_icon/LanguageIcon/LanguageIcon.md @@ -0,0 +1,24 @@ + + + +# LanguageIcon constructor + + + + + + + +LanguageIcon() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_language_icon/LanguageIcon/paint.md b/talawa-mobile-docs/custom_painters_language_icon/LanguageIcon/paint.md new file mode 100644 index 000000000..ef9042c71 --- /dev/null +++ b/talawa-mobile-docs/custom_painters_language_icon/LanguageIcon/paint.md @@ -0,0 +1,382 @@ + + + +# paint method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +void paint +([Canvas](https://api.flutter.dev/flutter/dart-ui/Canvas-class.html) canvas, [Size](https://api.flutter.dev/flutter/dart-ui/Size-class.html) size) + +_override_ + + + +

Called whenever the object needs to paint. The given Canvas has its +coordinate space configured such that the origin is at the top left of the +box. The area of the box is the size of the size argument.

+

Paint operations should remain inside the given area. Graphical +operations outside the bounds may be silently ignored, clipped, or not +clipped. It may sometimes be difficult to guarantee that a certain +operation is inside the bounds (e.g., drawing a rectangle whose size is +determined by user inputs). In that case, consider calling +Canvas.clipRect at the beginning of paint so everything that follows +will be guaranteed to only draw within the clipped area.

+

Implementations should be wary of correctly pairing any calls to +Canvas.save/Canvas.saveLayer and Canvas.restore, otherwise all +subsequent painting on this canvas may be affected, with potentially +hilarious but confusing results.

+

To paint text on a Canvas, use a TextPainter.

+

To paint an image on a Canvas:

+
    +
  1. +

    Obtain an ImageStream, for example by calling ImageProvider.resolve +on an AssetImage or NetworkImage object.

    +
  2. +
  3. +

    Whenever the ImageStream's underlying ImageInfo object changes +(see ImageStream.addListener), create a new instance of your custom +paint delegate, giving it the new ImageInfo object.

    +
  4. +
  5. +

    In your delegate's paint method, call the Canvas.drawImage, +Canvas.drawImageRect, or Canvas.drawImageNine methods to paint the +ImageInfo.image object, applying the ImageInfo.scale value to +obtain the correct rendering size.

    +
  6. +
+ + + +## Implementation + +```dart +@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); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_language_icon/LanguageIcon/shouldRepaint.md b/talawa-mobile-docs/custom_painters_language_icon/LanguageIcon/shouldRepaint.md new file mode 100644 index 000000000..a74a9cec4 --- /dev/null +++ b/talawa-mobile-docs/custom_painters_language_icon/LanguageIcon/shouldRepaint.md @@ -0,0 +1,58 @@ + + + +# shouldRepaint method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) shouldRepaint +(covariant [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) oldDelegate) + +_override_ + + + +

Called whenever a new instance of the custom painter delegate class is +provided to the RenderCustomPaint object, or any time that a new +CustomPaint object is created with a new instance of the custom painter +delegate class (which amounts to the same thing, because the latter is +implemented in terms of the former).

+

If the new instance represents different information than the old +instance, then the method should return true, otherwise it should return +false.

+

If the method returns false, then the paint call might be optimized +away.

+

It's possible that the paint method will get called even if +shouldRepaint returns false (e.g. if an ancestor or descendant needed to +be repainted). It's also possible that the paint method will get called +without shouldRepaint being called at all (e.g. if the box changes +size).

+

If a custom delegate has a particularly expensive paint function such that +repaints should be avoided as much as possible, a RepaintBoundary or +RenderRepaintBoundary (or other render object with +RenderObject.isRepaintBoundary set to true) might be helpful.

+

The oldDelegate argument will never be null.

+ + + +## Implementation + +```dart +@override +bool shouldRepaint(covariant CustomPainter oldDelegate) { + return true; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_language_icon/custom_painters_language_icon-library.md b/talawa-mobile-docs/custom_painters_language_icon/custom_painters_language_icon-library.md new file mode 100644 index 000000000..f987bcce8 --- /dev/null +++ b/talawa-mobile-docs/custom_painters_language_icon/custom_painters_language_icon-library.md @@ -0,0 +1,40 @@ + + + + +# language_icon library + + + + + + + + + + + +## Classes + +##### [LanguageIcon](../custom_painters_language_icon/LanguageIcon-class.md) + + + +This class draws the language icon using custom paint. +CustomPaint is a widget from the Flutter SDK, which enables +you to use a canvas to draw different shapes. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_talawa_logo/AppLogo-class.md b/talawa-mobile-docs/custom_painters_talawa_logo/AppLogo-class.md new file mode 100644 index 000000000..baaa311d6 --- /dev/null +++ b/talawa-mobile-docs/custom_painters_talawa_logo/AppLogo-class.md @@ -0,0 +1,183 @@ + + + +# AppLogo class + + + + + + + + + +

This class draws the app logo using custom paint. +CustomPaint is a widget from the Flutter SDK, which enables +you to use a canvas to draw different shapes.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [Listenable](https://api.flutter.dev/flutter/foundation/Listenable-class.html) +- [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) +- AppLogo + + + + + + + + +## Constructors + +[AppLogo](../custom_painters_talawa_logo/AppLogo/AppLogo.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [semanticsBuilder](https://api.flutter.dev/flutter/rendering/CustomPainter/semanticsBuilder.html) → [SemanticsBuilderCallback](https://api.flutter.dev/flutter/rendering/SemanticsBuilderCallback.html)? + + + +Returns a function that builds semantic information for the picture drawn +by this painter. +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/rendering/CustomPainter/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be notified when it is time to repaint. +_inherited_ + + + +##### [hitTest](https://api.flutter.dev/flutter/rendering/CustomPainter/hitTest.html)([Offset](https://api.flutter.dev/flutter/dart-ui/Offset-class.html) position) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? + + + +Called whenever a hit test is being performed on an object that is using +this custom paint delegate. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [paint](../custom_painters_talawa_logo/AppLogo/paint.md)([Canvas](https://api.flutter.dev/flutter/dart-ui/Canvas-class.html) canvas, [Size](https://api.flutter.dev/flutter/dart-ui/Size-class.html) size) void + + + +Called whenever the object needs to paint. The given Canvas has its +coordinate space configured such that the origin is at the top left of the +box. The area of the box is the size of the size argument. +_override_ + + + +##### [removeListener](https://api.flutter.dev/flutter/rendering/CustomPainter/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that the +object notifies when it is time to repaint. +_inherited_ + + + +##### [shouldRebuildSemantics](https://api.flutter.dev/flutter/rendering/CustomPainter/shouldRebuildSemantics.html)(covariant [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) oldDelegate) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Called whenever a new instance of the custom painter delegate class is +provided to the RenderCustomPaint object, or any time that a new +CustomPaint object is created with a new instance of the custom painter +delegate class (which amounts to the same thing, because the latter is +implemented in terms of the former). +_inherited_ + + + +##### [shouldRepaint](../custom_painters_talawa_logo/AppLogo/shouldRepaint.md)(covariant [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) oldDelegate) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Called whenever a new instance of the custom painter delegate class is +provided to the RenderCustomPaint object, or any time that a new +CustomPaint object is created with a new instance of the custom painter +delegate class (which amounts to the same thing, because the latter is +implemented in terms of the former). +_override_ + + + +##### [toString](https://api.flutter.dev/flutter/rendering/CustomPainter/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_talawa_logo/AppLogo/AppLogo.md b/talawa-mobile-docs/custom_painters_talawa_logo/AppLogo/AppLogo.md new file mode 100644 index 000000000..8dad793f7 --- /dev/null +++ b/talawa-mobile-docs/custom_painters_talawa_logo/AppLogo/AppLogo.md @@ -0,0 +1,24 @@ + + + +# AppLogo constructor + + + + + + + +AppLogo() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_talawa_logo/AppLogo/paint.md b/talawa-mobile-docs/custom_painters_talawa_logo/AppLogo/paint.md new file mode 100644 index 000000000..0dc5d6056 --- /dev/null +++ b/talawa-mobile-docs/custom_painters_talawa_logo/AppLogo/paint.md @@ -0,0 +1,485 @@ + + + +# paint method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +void paint +([Canvas](https://api.flutter.dev/flutter/dart-ui/Canvas-class.html) canvas, [Size](https://api.flutter.dev/flutter/dart-ui/Size-class.html) size) + +_override_ + + + +

Called whenever the object needs to paint. The given Canvas has its +coordinate space configured such that the origin is at the top left of the +box. The area of the box is the size of the size argument.

+

Paint operations should remain inside the given area. Graphical +operations outside the bounds may be silently ignored, clipped, or not +clipped. It may sometimes be difficult to guarantee that a certain +operation is inside the bounds (e.g., drawing a rectangle whose size is +determined by user inputs). In that case, consider calling +Canvas.clipRect at the beginning of paint so everything that follows +will be guaranteed to only draw within the clipped area.

+

Implementations should be wary of correctly pairing any calls to +Canvas.save/Canvas.saveLayer and Canvas.restore, otherwise all +subsequent painting on this canvas may be affected, with potentially +hilarious but confusing results.

+

To paint text on a Canvas, use a TextPainter.

+

To paint an image on a Canvas:

+
    +
  1. +

    Obtain an ImageStream, for example by calling ImageProvider.resolve +on an AssetImage or NetworkImage object.

    +
  2. +
  3. +

    Whenever the ImageStream's underlying ImageInfo object changes +(see ImageStream.addListener), create a new instance of your custom +paint delegate, giving it the new ImageInfo object.

    +
  4. +
  5. +

    In your delegate's paint method, call the Canvas.drawImage, +Canvas.drawImageRect, or Canvas.drawImageNine methods to paint the +ImageInfo.image object, applying the ImageInfo.scale value to +obtain the correct rendering size.

    +
  6. +
+ + + +## Implementation + +```dart +@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); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_talawa_logo/AppLogo/shouldRepaint.md b/talawa-mobile-docs/custom_painters_talawa_logo/AppLogo/shouldRepaint.md new file mode 100644 index 000000000..bbd772e40 --- /dev/null +++ b/talawa-mobile-docs/custom_painters_talawa_logo/AppLogo/shouldRepaint.md @@ -0,0 +1,58 @@ + + + +# shouldRepaint method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) shouldRepaint +(covariant [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) oldDelegate) + +_override_ + + + +

Called whenever a new instance of the custom painter delegate class is +provided to the RenderCustomPaint object, or any time that a new +CustomPaint object is created with a new instance of the custom painter +delegate class (which amounts to the same thing, because the latter is +implemented in terms of the former).

+

If the new instance represents different information than the old +instance, then the method should return true, otherwise it should return +false.

+

If the method returns false, then the paint call might be optimized +away.

+

It's possible that the paint method will get called even if +shouldRepaint returns false (e.g. if an ancestor or descendant needed to +be repainted). It's also possible that the paint method will get called +without shouldRepaint being called at all (e.g. if the box changes +size).

+

If a custom delegate has a particularly expensive paint function such that +repaints should be avoided as much as possible, a RepaintBoundary or +RenderRepaintBoundary (or other render object with +RenderObject.isRepaintBoundary set to true) might be helpful.

+

The oldDelegate argument will never be null.

+ + + +## Implementation + +```dart +@override +bool shouldRepaint(covariant CustomPainter oldDelegate) { + return true; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_talawa_logo/custom_painters_talawa_logo-library.md b/talawa-mobile-docs/custom_painters_talawa_logo/custom_painters_talawa_logo-library.md new file mode 100644 index 000000000..5c5e7aba1 --- /dev/null +++ b/talawa-mobile-docs/custom_painters_talawa_logo/custom_painters_talawa_logo-library.md @@ -0,0 +1,40 @@ + + + + +# talawa_logo library + + + + + + + + + + + +## Classes + +##### [AppLogo](../custom_painters_talawa_logo/AppLogo-class.md) + + + +This class draws the app logo using custom paint. +CustomPaint is a widget from the Flutter SDK, which enables +you to use a canvas to draw different shapes. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo-class.md b/talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo-class.md new file mode 100644 index 000000000..12b1a1e0a --- /dev/null +++ b/talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo-class.md @@ -0,0 +1,183 @@ + + + +# TelegramLogo class + + + + + + + + + +

This class draws the telegram logo using custom paint. +CustomPaint is a widget from the Flutter SDK, which enables +you to use a canvas to draw different shapes.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [Listenable](https://api.flutter.dev/flutter/foundation/Listenable-class.html) +- [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) +- TelegramLogo + + + + + + + + +## Constructors + +[TelegramLogo](../custom_painters_telegram_logo/TelegramLogo/TelegramLogo.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [semanticsBuilder](https://api.flutter.dev/flutter/rendering/CustomPainter/semanticsBuilder.html) → [SemanticsBuilderCallback](https://api.flutter.dev/flutter/rendering/SemanticsBuilderCallback.html)? + + + +Returns a function that builds semantic information for the picture drawn +by this painter. +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/rendering/CustomPainter/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be notified when it is time to repaint. +_inherited_ + + + +##### [hitTest](https://api.flutter.dev/flutter/rendering/CustomPainter/hitTest.html)([Offset](https://api.flutter.dev/flutter/dart-ui/Offset-class.html) position) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? + + + +Called whenever a hit test is being performed on an object that is using +this custom paint delegate. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [paint](../custom_painters_telegram_logo/TelegramLogo/paint.md)([Canvas](https://api.flutter.dev/flutter/dart-ui/Canvas-class.html) canvas, [Size](https://api.flutter.dev/flutter/dart-ui/Size-class.html) size) void + + + +Called whenever the object needs to paint. The given Canvas has its +coordinate space configured such that the origin is at the top left of the +box. The area of the box is the size of the size argument. +_override_ + + + +##### [removeListener](https://api.flutter.dev/flutter/rendering/CustomPainter/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that the +object notifies when it is time to repaint. +_inherited_ + + + +##### [shouldRebuildSemantics](https://api.flutter.dev/flutter/rendering/CustomPainter/shouldRebuildSemantics.html)(covariant [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) oldDelegate) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Called whenever a new instance of the custom painter delegate class is +provided to the RenderCustomPaint object, or any time that a new +CustomPaint object is created with a new instance of the custom painter +delegate class (which amounts to the same thing, because the latter is +implemented in terms of the former). +_inherited_ + + + +##### [shouldRepaint](../custom_painters_telegram_logo/TelegramLogo/shouldRepaint.md)(covariant [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) oldDelegate) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Called whenever a new instance of the custom painter delegate class is +provided to the RenderCustomPaint object, or any time that a new +CustomPaint object is created with a new instance of the custom painter +delegate class (which amounts to the same thing, because the latter is +implemented in terms of the former). +_override_ + + + +##### [toString](https://api.flutter.dev/flutter/rendering/CustomPainter/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo/TelegramLogo.md b/talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo/TelegramLogo.md new file mode 100644 index 000000000..4d5cfd037 --- /dev/null +++ b/talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo/TelegramLogo.md @@ -0,0 +1,24 @@ + + + +# TelegramLogo constructor + + + + + + + +TelegramLogo() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo/paint.md b/talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo/paint.md new file mode 100644 index 000000000..fdec6895d --- /dev/null +++ b/talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo/paint.md @@ -0,0 +1,171 @@ + + + +# paint method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +void paint +([Canvas](https://api.flutter.dev/flutter/dart-ui/Canvas-class.html) canvas, [Size](https://api.flutter.dev/flutter/dart-ui/Size-class.html) size) + +_override_ + + + +

Called whenever the object needs to paint. The given Canvas has its +coordinate space configured such that the origin is at the top left of the +box. The area of the box is the size of the size argument.

+

Paint operations should remain inside the given area. Graphical +operations outside the bounds may be silently ignored, clipped, or not +clipped. It may sometimes be difficult to guarantee that a certain +operation is inside the bounds (e.g., drawing a rectangle whose size is +determined by user inputs). In that case, consider calling +Canvas.clipRect at the beginning of paint so everything that follows +will be guaranteed to only draw within the clipped area.

+

Implementations should be wary of correctly pairing any calls to +Canvas.save/Canvas.saveLayer and Canvas.restore, otherwise all +subsequent painting on this canvas may be affected, with potentially +hilarious but confusing results.

+

To paint text on a Canvas, use a TextPainter.

+

To paint an image on a Canvas:

+
    +
  1. +

    Obtain an ImageStream, for example by calling ImageProvider.resolve +on an AssetImage or NetworkImage object.

    +
  2. +
  3. +

    Whenever the ImageStream's underlying ImageInfo object changes +(see ImageStream.addListener), create a new instance of your custom +paint delegate, giving it the new ImageInfo object.

    +
  4. +
  5. +

    In your delegate's paint method, call the Canvas.drawImage, +Canvas.drawImageRect, or Canvas.drawImageNine methods to paint the +ImageInfo.image object, applying the ImageInfo.scale value to +obtain the correct rendering size.

    +
  6. +
+ + + +## Implementation + +```dart +@override +void paint(Canvas canvas, Size size) { + final Paint paint0Fill = Paint()..style = PaintingStyle.fill; + paint0Fill.shader = ui.Gradient.linear( + Offset(size.width * 0.6670000, size.height * 0.1670000), + Offset(size.width * 0.4170000, size.height * 0.7500000), [ + const Color(0xff37aee2).withOpacity(1), + const Color(0xff1e96c8).withOpacity(1) + ], [ + 0, + 1 + ]); + canvas.drawCircle( + Offset(size.width * 0.5000000, size.height * 0.5000000), + size.width * 0.5000000, + paint0Fill, + ); + + final Path path_1 = Path(); + path_1.moveTo(size.width * 0.4083333, size.height * 0.7291667); + path_1.cubicTo( + size.width * 0.3921333, + size.height * 0.7291667, + size.width * 0.3948875, + size.height * 0.7230500, + size.width * 0.3893000, + size.height * 0.7076250, + ); + path_1.lineTo(size.width * 0.3416667, size.height * 0.5508625); + path_1.lineTo(size.width * 0.7083333, size.height * 0.3333333); + + final Paint paint1Fill = Paint()..style = PaintingStyle.fill; + paint1Fill.color = const Color(0xffc8daea).withOpacity(1.0); + canvas.drawPath(path_1, paint1Fill); + + final Path path_2 = Path(); + path_2.moveTo(size.width * 0.4083333, size.height * 0.7291667); + path_2.cubicTo( + size.width * 0.4208333, + size.height * 0.7291667, + size.width * 0.4263542, + size.height * 0.7234500, + size.width * 0.4333333, + size.height * 0.7166667, + ); + path_2.lineTo(size.width * 0.5000000, size.height * 0.6518417); + path_2.lineTo(size.width * 0.4168417, size.height * 0.6016958); + + final Paint paint2Fill = Paint()..style = PaintingStyle.fill; + paint2Fill.color = const Color(0xffa9c9dd).withOpacity(1.0); + canvas.drawPath(path_2, paint2Fill); + + final Path path_3 = Path(); + path_3.moveTo(size.width * 0.4168333, size.height * 0.6017083); + path_3.lineTo(size.width * 0.6183333, size.height * 0.7505792); + path_3.cubicTo( + size.width * 0.6413292, + size.height * 0.7632667, + size.width * 0.6579208, + size.height * 0.7566958, + size.width * 0.6636500, + size.height * 0.7292333, + ); + path_3.lineTo(size.width * 0.7456708, size.height * 0.3427208); + path_3.cubicTo( + size.width * 0.7540667, + size.height * 0.3090542, + size.width * 0.7328375, + size.height * 0.2937792, + size.width * 0.7108375, + size.height * 0.3037667, + ); + path_3.lineTo(size.width * 0.2292125, size.height * 0.4894792); + path_3.cubicTo( + size.width * 0.1963375, + size.height * 0.5026667, + size.width * 0.1965333, + size.height * 0.5210083, + size.width * 0.2232208, + size.height * 0.5291792, + ); + path_3.lineTo(size.width * 0.3468167, size.height * 0.5677583); + path_3.lineTo(size.width * 0.6329542, size.height * 0.3872375); + path_3.cubicTo( + size.width * 0.6464625, + size.height * 0.3790458, + size.width * 0.6588625, + size.height * 0.3834458, + size.width * 0.6486875, + size.height * 0.3924792, + ); + + final Paint paint3Fill = Paint()..style = PaintingStyle.fill; + paint3Fill.shader = ui.Gradient.linear( + Offset(size.width * 0.6600000, size.height * 0.4370000), + Offset(size.width * 0.8510000, size.height * 0.8020000), [ + const Color(0xffeff7fc).withOpacity(1), + const Color(0xffffffff).withOpacity(1) + ], [ + 0, + 1 + ]); + canvas.drawPath(path_3, paint3Fill); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo/shouldRepaint.md b/talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo/shouldRepaint.md new file mode 100644 index 000000000..255d4828a --- /dev/null +++ b/talawa-mobile-docs/custom_painters_telegram_logo/TelegramLogo/shouldRepaint.md @@ -0,0 +1,58 @@ + + + +# shouldRepaint method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) shouldRepaint +(covariant [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) oldDelegate) + +_override_ + + + +

Called whenever a new instance of the custom painter delegate class is +provided to the RenderCustomPaint object, or any time that a new +CustomPaint object is created with a new instance of the custom painter +delegate class (which amounts to the same thing, because the latter is +implemented in terms of the former).

+

If the new instance represents different information than the old +instance, then the method should return true, otherwise it should return +false.

+

If the method returns false, then the paint call might be optimized +away.

+

It's possible that the paint method will get called even if +shouldRepaint returns false (e.g. if an ancestor or descendant needed to +be repainted). It's also possible that the paint method will get called +without shouldRepaint being called at all (e.g. if the box changes +size).

+

If a custom delegate has a particularly expensive paint function such that +repaints should be avoided as much as possible, a RepaintBoundary or +RenderRepaintBoundary (or other render object with +RenderObject.isRepaintBoundary set to true) might be helpful.

+

The oldDelegate argument will never be null.

+ + + +## Implementation + +```dart +@override +bool shouldRepaint(covariant CustomPainter oldDelegate) { + return true; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_telegram_logo/custom_painters_telegram_logo-library.md b/talawa-mobile-docs/custom_painters_telegram_logo/custom_painters_telegram_logo-library.md new file mode 100644 index 000000000..4dad766a1 --- /dev/null +++ b/talawa-mobile-docs/custom_painters_telegram_logo/custom_painters_telegram_logo-library.md @@ -0,0 +1,40 @@ + + + + +# telegram_logo library + + + + + + + + + + + +## Classes + +##### [TelegramLogo](../custom_painters_telegram_logo/TelegramLogo-class.md) + + + +This class draws the telegram logo using custom paint. +CustomPaint is a widget from the Flutter SDK, which enables +you to use a canvas to draw different shapes. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo-class.md b/talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo-class.md new file mode 100644 index 000000000..71a314a26 --- /dev/null +++ b/talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo-class.md @@ -0,0 +1,183 @@ + + + +# WhatsappLogo class + + + + + + + + + +

This class draws the whatsapp logo using custom paint. +CustomPaint is a widget from the Flutter SDK, which enables +you to use a canvas to draw different shapes.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [Listenable](https://api.flutter.dev/flutter/foundation/Listenable-class.html) +- [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) +- WhatsappLogo + + + + + + + + +## Constructors + +[WhatsappLogo](../custom_painters_whatsapp_logo/WhatsappLogo/WhatsappLogo.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [semanticsBuilder](https://api.flutter.dev/flutter/rendering/CustomPainter/semanticsBuilder.html) → [SemanticsBuilderCallback](https://api.flutter.dev/flutter/rendering/SemanticsBuilderCallback.html)? + + + +Returns a function that builds semantic information for the picture drawn +by this painter. +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/rendering/CustomPainter/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be notified when it is time to repaint. +_inherited_ + + + +##### [hitTest](https://api.flutter.dev/flutter/rendering/CustomPainter/hitTest.html)([Offset](https://api.flutter.dev/flutter/dart-ui/Offset-class.html) position) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? + + + +Called whenever a hit test is being performed on an object that is using +this custom paint delegate. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [paint](../custom_painters_whatsapp_logo/WhatsappLogo/paint.md)([Canvas](https://api.flutter.dev/flutter/dart-ui/Canvas-class.html) canvas, [Size](https://api.flutter.dev/flutter/dart-ui/Size-class.html) size) void + + + +Called whenever the object needs to paint. The given Canvas has its +coordinate space configured such that the origin is at the top left of the +box. The area of the box is the size of the size argument. +_override_ + + + +##### [removeListener](https://api.flutter.dev/flutter/rendering/CustomPainter/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that the +object notifies when it is time to repaint. +_inherited_ + + + +##### [shouldRebuildSemantics](https://api.flutter.dev/flutter/rendering/CustomPainter/shouldRebuildSemantics.html)(covariant [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) oldDelegate) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Called whenever a new instance of the custom painter delegate class is +provided to the RenderCustomPaint object, or any time that a new +CustomPaint object is created with a new instance of the custom painter +delegate class (which amounts to the same thing, because the latter is +implemented in terms of the former). +_inherited_ + + + +##### [shouldRepaint](../custom_painters_whatsapp_logo/WhatsappLogo/shouldRepaint.md)(covariant [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) oldDelegate) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Called whenever a new instance of the custom painter delegate class is +provided to the RenderCustomPaint object, or any time that a new +CustomPaint object is created with a new instance of the custom painter +delegate class (which amounts to the same thing, because the latter is +implemented in terms of the former). +_override_ + + + +##### [toString](https://api.flutter.dev/flutter/rendering/CustomPainter/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo/WhatsappLogo.md b/talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo/WhatsappLogo.md new file mode 100644 index 000000000..e75ac5d53 --- /dev/null +++ b/talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo/WhatsappLogo.md @@ -0,0 +1,24 @@ + + + +# WhatsappLogo constructor + + + + + + + +WhatsappLogo() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo/paint.md b/talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo/paint.md new file mode 100644 index 000000000..ff1a5a712 --- /dev/null +++ b/talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo/paint.md @@ -0,0 +1,485 @@ + + + +# paint method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +void paint +([Canvas](https://api.flutter.dev/flutter/dart-ui/Canvas-class.html) canvas, [Size](https://api.flutter.dev/flutter/dart-ui/Size-class.html) size) + +_override_ + + + +

Called whenever the object needs to paint. The given Canvas has its +coordinate space configured such that the origin is at the top left of the +box. The area of the box is the size of the size argument.

+

Paint operations should remain inside the given area. Graphical +operations outside the bounds may be silently ignored, clipped, or not +clipped. It may sometimes be difficult to guarantee that a certain +operation is inside the bounds (e.g., drawing a rectangle whose size is +determined by user inputs). In that case, consider calling +Canvas.clipRect at the beginning of paint so everything that follows +will be guaranteed to only draw within the clipped area.

+

Implementations should be wary of correctly pairing any calls to +Canvas.save/Canvas.saveLayer and Canvas.restore, otherwise all +subsequent painting on this canvas may be affected, with potentially +hilarious but confusing results.

+

To paint text on a Canvas, use a TextPainter.

+

To paint an image on a Canvas:

+
    +
  1. +

    Obtain an ImageStream, for example by calling ImageProvider.resolve +on an AssetImage or NetworkImage object.

    +
  2. +
  3. +

    Whenever the ImageStream's underlying ImageInfo object changes +(see ImageStream.addListener), create a new instance of your custom +paint delegate, giving it the new ImageInfo object.

    +
  4. +
  5. +

    In your delegate's paint method, call the Canvas.drawImage, +Canvas.drawImageRect, or Canvas.drawImageNine methods to paint the +ImageInfo.image object, applying the ImageInfo.scale value to +obtain the correct rendering size.

    +
  6. +
+ + + +## Implementation + +```dart +@override +void paint(Canvas canvas, Size size) { + final Path path_0 = Path(); + path_0.moveTo(size.width * 0.3580000, size.height * 0.1673307); + path_0.cubicTo( + size.width * 0.4170000, + size.height * 0.1406375, + size.width * 0.4836000, + size.height * 0.1314741, + size.width * 0.5480000, + size.height * 0.1400398, + ); + path_0.cubicTo( + size.width * 0.6134000, + size.height * 0.1486056, + size.width * 0.6760000, + size.height * 0.1764940, + size.width * 0.7260000, + size.height * 0.2193227, + ); + path_0.cubicTo( + size.width * 0.7740000, + size.height * 0.2595618, + size.width * 0.8106000, + size.height * 0.3129482, + size.width * 0.8308000, + size.height * 0.3719124, + ); + path_0.cubicTo( + size.width * 0.8540000, + size.height * 0.4390438, + size.width * 0.8558000, + size.height * 0.5133466, + size.width * 0.8360000, + size.height * 0.5810757, + ); + path_0.arcToPoint( + Offset(size.width * 0.7034000, size.height * 0.7677291), + radius: + Radius.elliptical(size.width * 0.3520000, size.height * 0.3505976), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_0.arcToPoint( + Offset(size.width * 0.5662000, size.height * 0.8264940), + radius: + Radius.elliptical(size.width * 0.3500000, size.height * 0.3486056), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_0.cubicTo( + size.width * 0.4822000, + size.height * 0.8424303, + size.width * 0.3930000, + size.height * 0.8268924, + size.width * 0.3202000, + size.height * 0.7826693, + ); + path_0.cubicTo( + size.width * 0.3156000, + size.height * 0.7806773, + size.width * 0.3112000, + size.height * 0.7756972, + size.width * 0.3058000, + size.height * 0.7778884, + ); + path_0.lineTo(size.width * 0.1780000, size.height * 0.8107570); + path_0.lineTo(size.width * 0.2120000, size.height * 0.6864542); + path_0.cubicTo( + size.width * 0.2140000, + size.height * 0.6820717, + size.width * 0.2100000, + size.height * 0.6784861, + size.width * 0.2080000, + size.height * 0.6745020, + ); + path_0.cubicTo( + size.width * 0.1694000, + size.height * 0.6159363, + size.width * 0.1494000, + size.height * 0.5454183, + size.width * 0.1514000, + size.height * 0.4752988, + ); + path_0.cubicTo( + size.width * 0.1534000, + size.height * 0.3318725, + size.width * 0.2454000, + size.height * 0.2183267, + size.width * 0.3574000, + size.height * 0.1665339, + ); + + final Paint paint0Fill = Paint()..style = PaintingStyle.fill; + paint0Fill.color = const Color(0xff40c351).withOpacity(1.0); + canvas.drawPath(path_0, paint0Fill); + + final Path path_1 = Path(); + path_1.moveTo(size.width * 0.3760000, size.height * 0.2908367); + path_1.cubicTo( + size.width * 0.3854000, + size.height * 0.2910359, + size.width * 0.3916000, + size.height * 0.2994024, + size.width * 0.3952000, + size.height * 0.3067729, + ); + path_1.cubicTo( + size.width * 0.4072000, + size.height * 0.3326693, + size.width * 0.4168000, + size.height * 0.3593625, + size.width * 0.4282000, + size.height * 0.3854582, + ); + path_1.cubicTo( + size.width * 0.4306000, + size.height * 0.3908367, + size.width * 0.4322000, + size.height * 0.3968127, + size.width * 0.4302000, + size.height * 0.4025896, + ); + path_1.cubicTo( + size.width * 0.4242000, + size.height * 0.4195219, + size.width * 0.4102000, + size.height * 0.4316733, + size.width * 0.3990000, + size.height * 0.4452191, + ); + path_1.cubicTo( + size.width * 0.3950000, + size.height * 0.4498008, + size.width * 0.3954000, + size.height * 0.4563745, + size.width * 0.3986000, + size.height * 0.4611554, + ); + path_1.arcToPoint( + Offset(size.width * 0.5456000, size.height * 0.5876494), + radius: + Radius.elliptical(size.width * 0.2600000, size.height * 0.2589641), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.cubicTo( + size.width * 0.5516000, + size.height * 0.5902390, + size.width * 0.5588000, + size.height * 0.5896414, + size.width * 0.5630000, + size.height * 0.5844622, + ); + path_1.arcToPoint( + Offset(size.width * 0.5970000, size.height * 0.5428287), + radius: + Radius.elliptical(size.width * 0.5640000, size.height * 0.5617530), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.cubicTo( + size.width * 0.6062000, + size.height * 0.5308765, + size.width * 0.6142000, + size.height * 0.5342629, + size.width * 0.6262000, + size.height * 0.5392430, + ); + path_1.lineTo(size.width * 0.7030000, size.height * 0.5760956); + path_1.cubicTo( + size.width * 0.7090000, + size.height * 0.5786853, + size.width * 0.7150000, + size.height * 0.5830677, + size.width * 0.7144000, + size.height * 0.5900398, + ); + path_1.cubicTo( + size.width * 0.7184000, + size.height * 0.6418327, + size.width * 0.6718000, + size.height * 0.6820717, + size.width * 0.6230000, + size.height * 0.6836653, + ); + path_1.cubicTo( + size.width * 0.4970000, + size.height * 0.6745020, + size.width * 0.4110000, + size.height * 0.6047809, + size.width * 0.3490000, + size.height * 0.5243028, + ); + path_1.cubicTo( + size.width * 0.3286000, + size.height * 0.4960159, + size.width * 0.3070000, + size.height * 0.4675299, + size.width * 0.2958000, + size.height * 0.4338645, + ); + path_1.cubicTo( + size.width * 0.2852000, + size.height * 0.4043825, + size.width * 0.2848000, + size.height * 0.3707171, + size.width * 0.2974000, + size.height * 0.3416335, + ); + path_1.cubicTo( + size.width * 0.3168000, + size.height * 0.3027888, + size.width * 0.3338000, + size.height * 0.2878486, + size.width * 0.3766000, + size.height * 0.2902390, + ); + path_1.close(); + path_1.moveTo(size.width * 0.2580000, size.height * 0.1422311); + path_1.cubicTo( + size.width * 0.3504000, + size.height * 0.07649402, + size.width * 0.4700000, + size.height * 0.05139442, + size.width * 0.5820000, + size.height * 0.07370518, + ); + path_1.arcToPoint( + Offset(size.width * 0.7774000, size.height * 0.1699203), + radius: + Radius.elliptical(size.width * 0.4180000, size.height * 0.4163347), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_1.arcToPoint( + Offset(size.width * 0.9178000, size.height * 0.4368526), + radius: + Radius.elliptical(size.width * 0.4200000, size.height * 0.4183267), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_1.arcToPoint( + Offset(size.width * 0.8918000, size.height * 0.6380478), + radius: + Radius.elliptical(size.width * 0.4220000, size.height * 0.4203187), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_1.cubicTo( + size.width * 0.8622000, + size.height * 0.7137450, + size.width * 0.8098000, + size.height * 0.7802789, + size.width * 0.7434000, + size.height * 0.8272908, + ); + path_1.arcToPoint( + Offset(size.width * 0.5254000, size.height * 0.9039841), + radius: + Radius.elliptical(size.width * 0.4180000, size.height * 0.4163347), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_1.arcToPoint( + Offset(size.width * 0.2994000, size.height * 0.8541833), + radius: + Radius.elliptical(size.width * 0.4200000, size.height * 0.4183267), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_1.lineTo(size.width * 0.07540000, size.height * 0.9119522); + path_1.lineTo(size.width * 0.1344000, size.height * 0.6968127); + path_1.cubicTo( + size.width * 0.1356000, + size.height * 0.6942231, + size.width * 0.1338000, + size.height * 0.6920319, + size.width * 0.1324000, + size.height * 0.6900398, + ); + path_1.arcToPoint( + Offset(size.width * 0.08240000, size.height * 0.4310757), + radius: + Radius.elliptical(size.width * 0.4200000, size.height * 0.4183267), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_1.arcToPoint( + Offset(size.width * 0.2574000, size.height * 0.1422311), + radius: + Radius.elliptical(size.width * 0.4260000, size.height * 0.4243028), + rotation: 0, + largeArc: false, + clockwise: true, + ); + path_1.moveTo(size.width * 0.3568000, size.height * 0.1673307); + path_1.cubicTo( + size.width * 0.2898000, + size.height * 0.1972112, + size.width * 0.2328000, + size.height * 0.2486056, + size.width * 0.1964000, + size.height * 0.3121514, + ); + path_1.cubicTo( + size.width * 0.1676000, + size.height * 0.3619522, + size.width * 0.1516000, + size.height * 0.4187251, + size.width * 0.1504000, + size.height * 0.4760956, + ); + path_1.cubicTo( + size.width * 0.1484000, + size.height * 0.5462151, + size.width * 0.1684000, + size.height * 0.6165339, + size.width * 0.2070000, + size.height * 0.6752988, + ); + path_1.cubicTo( + size.width * 0.2090000, + size.height * 0.6788845, + size.width * 0.2126000, + size.height * 0.6826693, + size.width * 0.2110000, + size.height * 0.6872510, + ); + path_1.lineTo(size.width * 0.1770000, size.height * 0.8115538); + path_1.cubicTo( + size.width * 0.2196000, + size.height * 0.8007968, + size.width * 0.2622000, + size.height * 0.7892430, + size.width * 0.3050000, + size.height * 0.7784861, + ); + path_1.cubicTo( + size.width * 0.3104000, + size.height * 0.7764940, + size.width * 0.3150000, + size.height * 0.7808765, + size.width * 0.3194000, + size.height * 0.7832669, + ); + path_1.arcToPoint( + Offset(size.width * 0.5654000, size.height * 0.8272908), + radius: + Radius.elliptical(size.width * 0.3500000, size.height * 0.3486056), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.arcToPoint( + Offset(size.width * 0.7026000, size.height * 0.7685259), + radius: + Radius.elliptical(size.width * 0.3460000, size.height * 0.3446215), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.arcToPoint( + Offset(size.width * 0.8352000, size.height * 0.5818725), + radius: + Radius.elliptical(size.width * 0.3520000, size.height * 0.3505976), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.arcToPoint( + Offset(size.width * 0.8300000, size.height * 0.3727092), + radius: + Radius.elliptical(size.width * 0.3500000, size.height * 0.3486056), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.arcToPoint( + Offset(size.width * 0.7252000, size.height * 0.2201195), + radius: + Radius.elliptical(size.width * 0.3500000, size.height * 0.3486056), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.arcToPoint( + Offset(size.width * 0.5470000, size.height * 0.1408367), + radius: + Radius.elliptical(size.width * 0.3480000, size.height * 0.3466135), + rotation: 0, + largeArc: false, + clockwise: false, + ); + path_1.cubicTo( + size.width * 0.4830000, + size.height * 0.1322709, + size.width * 0.4162000, + size.height * 0.1414343, + size.width * 0.3570000, + size.height * 0.1681275, + ); + path_1.close(); + + final Paint paint1fill = Paint()..style = PaintingStyle.fill; + paint1fill.color = const Color(0xfffcfcfc).withOpacity(1.0); + canvas.drawPath(path_1, paint1fill); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo/shouldRepaint.md b/talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo/shouldRepaint.md new file mode 100644 index 000000000..886f0bbbb --- /dev/null +++ b/talawa-mobile-docs/custom_painters_whatsapp_logo/WhatsappLogo/shouldRepaint.md @@ -0,0 +1,58 @@ + + + +# shouldRepaint method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) shouldRepaint +(covariant [CustomPainter](https://api.flutter.dev/flutter/rendering/CustomPainter-class.html) oldDelegate) + +_override_ + + + +

Called whenever a new instance of the custom painter delegate class is +provided to the RenderCustomPaint object, or any time that a new +CustomPaint object is created with a new instance of the custom painter +delegate class (which amounts to the same thing, because the latter is +implemented in terms of the former).

+

If the new instance represents different information than the old +instance, then the method should return true, otherwise it should return +false.

+

If the method returns false, then the paint call might be optimized +away.

+

It's possible that the paint method will get called even if +shouldRepaint returns false (e.g. if an ancestor or descendant needed to +be repainted). It's also possible that the paint method will get called +without shouldRepaint being called at all (e.g. if the box changes +size).

+

If a custom delegate has a particularly expensive paint function such that +repaints should be avoided as much as possible, a RepaintBoundary or +RenderRepaintBoundary (or other render object with +RenderObject.isRepaintBoundary set to true) might be helpful.

+

The oldDelegate argument will never be null.

+ + + +## Implementation + +```dart +@override +bool shouldRepaint(covariant CustomPainter oldDelegate) { + return true; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/custom_painters_whatsapp_logo/custom_painters_whatsapp_logo-library.md b/talawa-mobile-docs/custom_painters_whatsapp_logo/custom_painters_whatsapp_logo-library.md new file mode 100644 index 000000000..9c4646508 --- /dev/null +++ b/talawa-mobile-docs/custom_painters_whatsapp_logo/custom_painters_whatsapp_logo-library.md @@ -0,0 +1,40 @@ + + + + +# whatsapp_logo library + + + + + + + + + + + +## Classes + +##### [WhatsappLogo](../custom_painters_whatsapp_logo/WhatsappLogo-class.md) + + + +This class draws the whatsapp logo using custom paint. +CustomPaint is a widget from the Flutter SDK, which enables +you to use a canvas to draw different shapes. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/demo_server_data_direct_chat_demo_data/demo_server_data_direct_chat_demo_data-library.md b/talawa-mobile-docs/demo_server_data_direct_chat_demo_data/demo_server_data_direct_chat_demo_data-library.md new file mode 100644 index 000000000..5a7cd4e32 --- /dev/null +++ b/talawa-mobile-docs/demo_server_data_direct_chat_demo_data/demo_server_data_direct_chat_demo_data-library.md @@ -0,0 +1,40 @@ + + + + +# direct_chat_demo_data library + + + + + + + + + + + + + + +## Constants + +##### [directChatDemoData](../demo_server_data_direct_chat_demo_data/directChatDemoData-constant.md) const [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)>> + + + +This file contains demo data. + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/demo_server_data_direct_chat_demo_data/directChatDemoData-constant.md b/talawa-mobile-docs/demo_server_data_direct_chat_demo_data/directChatDemoData-constant.md new file mode 100644 index 000000000..213ffe978 --- /dev/null +++ b/talawa-mobile-docs/demo_server_data_direct_chat_demo_data/directChatDemoData-constant.md @@ -0,0 +1,200 @@ + + + +# directChatDemoData top-level constant + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)>> const directChatDemoData + + + + + +

This file contains demo data.

+

It contains a list of type Map<String, Object> and sample data of chats.

+ + + +## Implementation + +```dart +const directChatDemoData = [ + { + "sender": { + "name": "Sender 1", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url" + }, + "lastMessage": { + "sender": { + "name": "Sender Name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url" + }, + "messageID": "asdasdfasdfgasdf", + "text": "Last message from the sender.", + "bool": "True" + }, + "unreadCount": 6, + }, + { + "sender": { + "name": "Sender 2", + "id": "sadiufghbasdqwuibnnads", + "image": "sender_profile_inmage_url" + }, + "lastMessage": { + "sender": { + "name": "Sender name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url" + }, + "messageID": "asdasdfasdfgasdf", + "text": "Last message from the sender.", + "bool": "True" + }, + "unreadCount": 6, + }, + { + "sender": { + "name": "Sender 8", + "id": "sadiusfgafghbasdqwuibnuads", + "image": "sender_profile_inmage_url" + }, + "lastMessage": { + "sender": { + "name": "Sender Name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url" + }, + "messageID": "asdasdfasdfgasdf", + "text": "Latest message", + "bool": "True" + }, + "unreadCount": 3, + }, + { + "sender": { + "name": "Sender 7", + "id": "sasdasddiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url" + }, + "lastMessage": { + "sender": { + "name": "Sender Name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url" + }, + "messageID": "asdasdfasdfgasdf", + "text": "Latest message", + "bool": "True" + }, + "unreadCount": 3, + }, + { + "sender": { + "name": "Sender 6", + "id": "sadiufghbassadasddqwuibnuads", + "image": "sender_profile_inmage_url" + }, + "lastMessage": { + "sender": { + "name": "Sender Name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url" + }, + "messageID": "asdasdfasdfgasdf", + "text": "Latest message", + "bool": "True" + }, + "unreadCount": 3, + }, + { + "sender": { + "name": "Sender 5", + "id": "sadiufghbasdqwsaduibnuads", + "image": "sender_profile_inmage_url" + }, + "lastMessage": { + "sender": { + "name": "Sender 5", + "id": "sadiufghbasdqwdfdibnuads", + "image": "sender_profile_inmage_url" + }, + "messageID": "asdasdfasdfgasdf", + "text": "Latest message", + "bool": "True" + }, + "unreadCount": 3, + }, + { + "sender": { + "name": "Sender 4", + "id": "sadiufghbsdasdqwuibnuads", + "image": "sender_profile_inmage_url" + }, + "lastMessage": { + "sender": { + "name": "Sender Name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url" + }, + "messageID": "asdasdfasdfgasdf", + "text": "Latest message", + "bool": "True" + }, + "unreadCount": 3, + }, + { + "sender": { + "name": "Sender 41", + "id": "sadiufghbadgsdqwuibnuads", + "image": "sender_profile_inmage_url" + }, + "lastMessage": { + "sender": { + "name": "Sender Name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url" + }, + "messageID": "asdasdfasdfgasdf", + "text": "Latest message", + "bool": "True" + }, + "unreadCount": 1, + }, + { + "sender": { + "name": "Sender 13", + "id": "sadiufghbadsfsdqwuibnuads", + "image": "sender_profile_inmage_url" + }, + "lastMessage": { + "sender": { + "name": "Sender Name", + "id": "sadiufghbasdqwuibnuads", + "image": "sender_profile_inmage_url" + }, + "messageID": "asdasdfasdfgasdf", + "text": "Latest message", + "bool": "True" + }, + "unreadCount": 8, + }, +]; +``` + + + + + + + + diff --git a/talawa-mobile-docs/demo_server_data_events_demo_data/demo_server_data_events_demo_data-library.md b/talawa-mobile-docs/demo_server_data_events_demo_data/demo_server_data_events_demo_data-library.md new file mode 100644 index 000000000..64a23f76d --- /dev/null +++ b/talawa-mobile-docs/demo_server_data_events_demo_data/demo_server_data_events_demo_data-library.md @@ -0,0 +1,41 @@ + + + + +# events_demo_data library + + + + + + + + + + + + + + +## Constants + +##### [eventsDemoData](../demo_server_data_events_demo_data/eventsDemoData-constant.md) const [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)>> + + + +This file contains demo data. It contains a list of type Map<String, Object> +and sample data of events. + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/demo_server_data_events_demo_data/eventsDemoData-constant.md b/talawa-mobile-docs/demo_server_data_events_demo_data/eventsDemoData-constant.md new file mode 100644 index 000000000..72455cde7 --- /dev/null +++ b/talawa-mobile-docs/demo_server_data_events_demo_data/eventsDemoData-constant.md @@ -0,0 +1,229 @@ + + + +# eventsDemoData top-level constant + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)>> const eventsDemoData + + + + + +

This file contains demo data. It contains a list of type Map<String, Object> +and sample data of events.

+ + + +## Implementation + +```dart +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/talawa-mobile-docs/demo_server_data_pinned_post_demo_data/demo_server_data_pinned_post_demo_data-library.md b/talawa-mobile-docs/demo_server_data_pinned_post_demo_data/demo_server_data_pinned_post_demo_data-library.md new file mode 100644 index 000000000..90c5b02d0 --- /dev/null +++ b/talawa-mobile-docs/demo_server_data_pinned_post_demo_data/demo_server_data_pinned_post_demo_data-library.md @@ -0,0 +1,40 @@ + + + + +# pinned_post_demo_data library + + + + + + + + + + + + + + +## Constants + +##### [pinnedPostsDemoData](../demo_server_data_pinned_post_demo_data/pinnedPostsDemoData-constant.md) const [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)>> + + + +This file contains demo data for pinned posts. It contains a list of type Map<String, Object> and sample data. + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/demo_server_data_pinned_post_demo_data/pinnedPostsDemoData-constant.md b/talawa-mobile-docs/demo_server_data_pinned_post_demo_data/pinnedPostsDemoData-constant.md new file mode 100644 index 000000000..e932c9d7e --- /dev/null +++ b/talawa-mobile-docs/demo_server_data_pinned_post_demo_data/pinnedPostsDemoData-constant.md @@ -0,0 +1,193 @@ + + + +# pinnedPostsDemoData top-level constant + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)>> const pinnedPostsDemoData + + + + + +

This file contains demo data for pinned posts. It contains a list of type Map<String, Object> and sample data.

+ + + +## Implementation + +```dart +const pinnedPostsDemoData = [ + { + "_id": "1", + "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": "2023-03-15T15:28:52.122Z", + "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"} + }, + ] + }, + { + "_id": "2", + "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": "2023-03-15T15:28:52.122Z", + "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"} + }, + ] + }, + { + "_id": "3", + "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": "2023-03-15T15:28:52.122Z", + "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"} + }, + ] + }, + { + "_id": "4", + "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": "2023-03-15T15:28:52.122Z", + "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/talawa-mobile-docs/demo_server_data_post_demo_data/demo_server_data_post_demo_data-library.md b/talawa-mobile-docs/demo_server_data_post_demo_data/demo_server_data_post_demo_data-library.md new file mode 100644 index 000000000..2e26a035a --- /dev/null +++ b/talawa-mobile-docs/demo_server_data_post_demo_data/demo_server_data_post_demo_data-library.md @@ -0,0 +1,41 @@ + + + + +# post_demo_data library + + + + + + + + + + + + + + +## Constants + +##### [postsDemoData](../demo_server_data_post_demo_data/postsDemoData-constant.md) const [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)>> + + + +This file contains demo data for posts. It contains a list of type Map<String, Object> +and sample data of posts. + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/demo_server_data_post_demo_data/postsDemoData-constant.md b/talawa-mobile-docs/demo_server_data_post_demo_data/postsDemoData-constant.md new file mode 100644 index 000000000..aa96891f7 --- /dev/null +++ b/talawa-mobile-docs/demo_server_data_post_demo_data/postsDemoData-constant.md @@ -0,0 +1,214 @@ + + + +# postsDemoData top-level constant + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)>> const postsDemoData + + + + + +

This file contains demo data for posts. It contains a list of type Map<String, Object> +and sample data of posts.

+ + + +## Implementation + +```dart +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/talawa-mobile-docs/enums_enums/CallFor.md b/talawa-mobile-docs/enums_enums/CallFor.md new file mode 100644 index 000000000..c508c6110 --- /dev/null +++ b/talawa-mobile-docs/enums_enums/CallFor.md @@ -0,0 +1,149 @@ + + + +# CallFor enum + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [Enum](https://api.flutter.dev/flutter/dart-core/Enum-class.html) +- CallFor + + + + + + +## Constructors + +[CallFor](../enums_enums/CallFor/CallFor.md) () + + _const_ + + +## Values + +##### [login](../enums_enums/CallFor.md) const [CallFor](../enums_enums/CallFor.md) + + + + + + + + +##### [signup](../enums_enums/CallFor.md) const [CallFor](../enums_enums/CallFor.md) + + + + + + + + +##### [joinPublicOrg](../enums_enums/CallFor.md) const [CallFor](../enums_enums/CallFor.md) + + + + + + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [index](https://api.flutter.dev/flutter/dart-core/Enum/index.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +A numeric identifier for the enumerated value. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + +## Constants + +##### [values](../enums_enums/CallFor/values-constant.md) const [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[CallFor](../enums_enums/CallFor.md)> + + + +A constant List of the values in this enum, in order of their declaration. + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/CallFor/CallFor.md b/talawa-mobile-docs/enums_enums/CallFor/CallFor.md new file mode 100644 index 000000000..1f869b15f --- /dev/null +++ b/talawa-mobile-docs/enums_enums/CallFor/CallFor.md @@ -0,0 +1,24 @@ + + + +# CallFor constructor + + + + + + +const +CallFor() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/CallFor/values-constant.md b/talawa-mobile-docs/enums_enums/CallFor/values-constant.md new file mode 100644 index 000000000..cff3cf6c2 --- /dev/null +++ b/talawa-mobile-docs/enums_enums/CallFor/values-constant.md @@ -0,0 +1,28 @@ + + + +# values constant + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[CallFor](../../enums_enums/CallFor.md)> const values + + + + + +

A constant List of the values in this enum, in order of their declaration.

+ + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/ChatState.md b/talawa-mobile-docs/enums_enums/ChatState.md new file mode 100644 index 000000000..739acc025 --- /dev/null +++ b/talawa-mobile-docs/enums_enums/ChatState.md @@ -0,0 +1,150 @@ + + + +# ChatState enum + + + + + + + +

Represents the state of the chat

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [Enum](https://api.flutter.dev/flutter/dart-core/Enum-class.html) +- ChatState + + + + + + +## Constructors + +[ChatState](../enums_enums/ChatState/ChatState.md) () + + _const_ + + +## Values + +##### [initial](../enums_enums/ChatState.md) const [ChatState](../enums_enums/ChatState.md) + + + + + + + + +##### [loading](../enums_enums/ChatState.md) const [ChatState](../enums_enums/ChatState.md) + + + + + + + + +##### [complete](../enums_enums/ChatState.md) const [ChatState](../enums_enums/ChatState.md) + + + + + + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [index](https://api.flutter.dev/flutter/dart-core/Enum/index.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +A numeric identifier for the enumerated value. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + +## Constants + +##### [values](../enums_enums/ChatState/values-constant.md) const [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ChatState](../enums_enums/ChatState.md)> + + + +A constant List of the values in this enum, in order of their declaration. + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/ChatState/ChatState.md b/talawa-mobile-docs/enums_enums/ChatState/ChatState.md new file mode 100644 index 000000000..1d0a6f303 --- /dev/null +++ b/talawa-mobile-docs/enums_enums/ChatState/ChatState.md @@ -0,0 +1,24 @@ + + + +# ChatState constructor + + + + + + +const +ChatState() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/ChatState/values-constant.md b/talawa-mobile-docs/enums_enums/ChatState/values-constant.md new file mode 100644 index 000000000..8d2ba60b5 --- /dev/null +++ b/talawa-mobile-docs/enums_enums/ChatState/values-constant.md @@ -0,0 +1,28 @@ + + + +# values constant + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ChatState](../../enums_enums/ChatState.md)> const values + + + + + +

A constant List of the values in this enum, in order of their declaration.

+ + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/MessageType.md b/talawa-mobile-docs/enums_enums/MessageType.md new file mode 100644 index 000000000..5bc119ab1 --- /dev/null +++ b/talawa-mobile-docs/enums_enums/MessageType.md @@ -0,0 +1,159 @@ + + + +# MessageType enum + + + + + + + +

Represents the type of the Message

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [Enum](https://api.flutter.dev/flutter/dart-core/Enum-class.html) +- MessageType + + + + + + +## Constructors + +[MessageType](../enums_enums/MessageType/MessageType.md) () + + _const_ + + +## Values + +##### [error](../enums_enums/MessageType.md) const [MessageType](../enums_enums/MessageType.md) + + + + + + + + +##### [warning](../enums_enums/MessageType.md) const [MessageType](../enums_enums/MessageType.md) + + + + + + + + +##### [info](../enums_enums/MessageType.md) const [MessageType](../enums_enums/MessageType.md) + + + + + + + + +##### [random](../enums_enums/MessageType.md) const [MessageType](../enums_enums/MessageType.md) + + + + + + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [index](https://api.flutter.dev/flutter/dart-core/Enum/index.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +A numeric identifier for the enumerated value. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + +## Constants + +##### [values](../enums_enums/MessageType/values-constant.md) const [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[MessageType](../enums_enums/MessageType.md)> + + + +A constant List of the values in this enum, in order of their declaration. + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/MessageType/MessageType.md b/talawa-mobile-docs/enums_enums/MessageType/MessageType.md new file mode 100644 index 000000000..cfa1c55e6 --- /dev/null +++ b/talawa-mobile-docs/enums_enums/MessageType/MessageType.md @@ -0,0 +1,24 @@ + + + +# MessageType constructor + + + + + + +const +MessageType() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/MessageType/values-constant.md b/talawa-mobile-docs/enums_enums/MessageType/values-constant.md new file mode 100644 index 000000000..d6a40b624 --- /dev/null +++ b/talawa-mobile-docs/enums_enums/MessageType/values-constant.md @@ -0,0 +1,28 @@ + + + +# values constant + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[MessageType](../../enums_enums/MessageType.md)> const values + + + + + +

A constant List of the values in this enum, in order of their declaration.

+ + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/ModalSheet.md b/talawa-mobile-docs/enums_enums/ModalSheet.md new file mode 100644 index 000000000..ddfe171d2 --- /dev/null +++ b/talawa-mobile-docs/enums_enums/ModalSheet.md @@ -0,0 +1,140 @@ + + + +# ModalSheet enum + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [Enum](https://api.flutter.dev/flutter/dart-core/Enum-class.html) +- ModalSheet + + + + + + +## Constructors + +[ModalSheet](../enums_enums/ModalSheet/ModalSheet.md) () + + _const_ + + +## Values + +##### [donation](../enums_enums/ModalSheet.md) const [ModalSheet](../enums_enums/ModalSheet.md) + + + + + + + + +##### [invite](../enums_enums/ModalSheet.md) const [ModalSheet](../enums_enums/ModalSheet.md) + + + + + + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [index](https://api.flutter.dev/flutter/dart-core/Enum/index.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +A numeric identifier for the enumerated value. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + +## Constants + +##### [values](../enums_enums/ModalSheet/values-constant.md) const [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ModalSheet](../enums_enums/ModalSheet.md)> + + + +A constant List of the values in this enum, in order of their declaration. + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/ModalSheet/ModalSheet.md b/talawa-mobile-docs/enums_enums/ModalSheet/ModalSheet.md new file mode 100644 index 000000000..28f3e9e6e --- /dev/null +++ b/talawa-mobile-docs/enums_enums/ModalSheet/ModalSheet.md @@ -0,0 +1,24 @@ + + + +# ModalSheet constructor + + + + + + +const +ModalSheet() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/ModalSheet/values-constant.md b/talawa-mobile-docs/enums_enums/ModalSheet/values-constant.md new file mode 100644 index 000000000..b1da27eac --- /dev/null +++ b/talawa-mobile-docs/enums_enums/ModalSheet/values-constant.md @@ -0,0 +1,28 @@ + + + +# values constant + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ModalSheet](../../enums_enums/ModalSheet.md)> const values + + + + + +

A constant List of the values in this enum, in order of their declaration.

+ + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/TileType.md b/talawa-mobile-docs/enums_enums/TileType.md new file mode 100644 index 000000000..006412868 --- /dev/null +++ b/talawa-mobile-docs/enums_enums/TileType.md @@ -0,0 +1,150 @@ + + + +# TileType enum + + + + + + + +

Represents the type of the tile

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [Enum](https://api.flutter.dev/flutter/dart-core/Enum-class.html) +- TileType + + + + + + +## Constructors + +[TileType](../enums_enums/TileType/TileType.md) () + + _const_ + + +## Values + +##### [user](../enums_enums/TileType.md) const [TileType](../enums_enums/TileType.md) + + + + + + + + +##### [org](../enums_enums/TileType.md) const [TileType](../enums_enums/TileType.md) + + + + + + + + +##### [option](../enums_enums/TileType.md) const [TileType](../enums_enums/TileType.md) + + + + + + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [index](https://api.flutter.dev/flutter/dart-core/Enum/index.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +A numeric identifier for the enumerated value. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + +## Constants + +##### [values](../enums_enums/TileType/values-constant.md) const [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[TileType](../enums_enums/TileType.md)> + + + +A constant List of the values in this enum, in order of their declaration. + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/TileType/TileType.md b/talawa-mobile-docs/enums_enums/TileType/TileType.md new file mode 100644 index 000000000..b9500b131 --- /dev/null +++ b/talawa-mobile-docs/enums_enums/TileType/TileType.md @@ -0,0 +1,24 @@ + + + +# TileType constructor + + + + + + +const +TileType() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/TileType/values-constant.md b/talawa-mobile-docs/enums_enums/TileType/values-constant.md new file mode 100644 index 000000000..383d264e8 --- /dev/null +++ b/talawa-mobile-docs/enums_enums/TileType/values-constant.md @@ -0,0 +1,28 @@ + + + +# values constant + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[TileType](../../enums_enums/TileType.md)> const values + + + + + +

A constant List of the values in this enum, in order of their declaration.

+ + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/ViewState.md b/talawa-mobile-docs/enums_enums/ViewState.md new file mode 100644 index 000000000..d0cb942eb --- /dev/null +++ b/talawa-mobile-docs/enums_enums/ViewState.md @@ -0,0 +1,144 @@ + + + +# ViewState enum + + + + + + + +

This file contains different enums. +The enum keyword is used to define an enumeration type in Dart. +The use case of enumeration is to store finite data members under the same type definition. +Represents the state of the view

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [Enum](https://api.flutter.dev/flutter/dart-core/Enum-class.html) +- ViewState + + + + + + +## Constructors + +[ViewState](../enums_enums/ViewState/ViewState.md) () + + _const_ + + +## Values + +##### [idle](../enums_enums/ViewState.md) const [ViewState](../enums_enums/ViewState.md) + + + + + + + + +##### [busy](../enums_enums/ViewState.md) const [ViewState](../enums_enums/ViewState.md) + + + + + + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [index](https://api.flutter.dev/flutter/dart-core/Enum/index.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +A numeric identifier for the enumerated value. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + +## Constants + +##### [values](../enums_enums/ViewState/values-constant.md) const [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ViewState](../enums_enums/ViewState.md)> + + + +A constant List of the values in this enum, in order of their declaration. + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/ViewState/ViewState.md b/talawa-mobile-docs/enums_enums/ViewState/ViewState.md new file mode 100644 index 000000000..a491a741c --- /dev/null +++ b/talawa-mobile-docs/enums_enums/ViewState/ViewState.md @@ -0,0 +1,24 @@ + + + +# ViewState constructor + + + + + + +const +ViewState() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/ViewState/values-constant.md b/talawa-mobile-docs/enums_enums/ViewState/values-constant.md new file mode 100644 index 000000000..6360c8b8d --- /dev/null +++ b/talawa-mobile-docs/enums_enums/ViewState/values-constant.md @@ -0,0 +1,28 @@ + + + +# values constant + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ViewState](../../enums_enums/ViewState.md)> const values + + + + + +

A constant List of the values in this enum, in order of their declaration.

+ + + + + + + + + + diff --git a/talawa-mobile-docs/enums_enums/enums_enums-library.md b/talawa-mobile-docs/enums_enums/enums_enums-library.md new file mode 100644 index 000000000..3760572ad --- /dev/null +++ b/talawa-mobile-docs/enums_enums/enums_enums-library.md @@ -0,0 +1,76 @@ + + + + +# enums library + + + + + + + + + + + + + + + + + +## Enums + +##### [CallFor](../enums_enums/CallFor.md) + + + + + + +##### [ChatState](../enums_enums/ChatState.md) + + + +Represents the state of the chat + + +##### [MessageType](../enums_enums/MessageType.md) + + + +Represents the type of the Message + + +##### [ModalSheet](../enums_enums/ModalSheet.md) + + + + + + +##### [TileType](../enums_enums/TileType.md) + + + +Represents the type of the tile + + +##### [ViewState](../enums_enums/ViewState.md) + + + +This file contains different enums. +The enum keyword is used to define an enumeration type in Dart. +The use case of enumeration is to store finite data members under the same type definition. +Represents the state of the view + + + + + + + + + diff --git a/talawa-mobile-docs/firebase_options/DefaultFirebaseOptions-class.md b/talawa-mobile-docs/firebase_options/DefaultFirebaseOptions-class.md new file mode 100644 index 000000000..f8bb745e4 --- /dev/null +++ b/talawa-mobile-docs/firebase_options/DefaultFirebaseOptions-class.md @@ -0,0 +1,128 @@ + + + +# DefaultFirebaseOptions class + + + + + + + + + +

Default FirebaseOptions for use with your Firebase apps.

+

Example:

+
import 'firebase_options.dart';
+// ...
+await Firebase.initializeApp(
+  options: DefaultFirebaseOptions.currentPlatform,
+);
+
+ + + + +## Constructors + +[DefaultFirebaseOptions](../firebase_options/DefaultFirebaseOptions/DefaultFirebaseOptions.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + +## Static Methods + +##### [android](../firebase_options/DefaultFirebaseOptions/android.md)([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> androidFirebaseOptions) [FirebaseOptions](https://pub.dev/documentation/firebase_core_platform_interface/4.8.0/firebase_core_platform_interface/FirebaseOptions-class.html) + + + +Scaffolds androidFirebaseOptions around FirebaseOptions. + + + + +##### [currentPlatform](../firebase_options/DefaultFirebaseOptions/currentPlatform.md)([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> androidFirebaseOptions, [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> iosFirebaseOptions) [FirebaseOptions](https://pub.dev/documentation/firebase_core_platform_interface/4.8.0/firebase_core_platform_interface/FirebaseOptions-class.html) + + + +Builds and returns FirebaseOptions based on the current platform. + + + + +##### [ios](../firebase_options/DefaultFirebaseOptions/ios.md)([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> iosFirebaseOptions) [FirebaseOptions](https://pub.dev/documentation/firebase_core_platform_interface/4.8.0/firebase_core_platform_interface/FirebaseOptions-class.html) + + + +Scaffolds iosFirebaseOptions around FirebaseOptions. + + + + + + + + + + + + diff --git a/talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/DefaultFirebaseOptions.md b/talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/DefaultFirebaseOptions.md new file mode 100644 index 000000000..b07fd7df2 --- /dev/null +++ b/talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/DefaultFirebaseOptions.md @@ -0,0 +1,24 @@ + + + +# DefaultFirebaseOptions constructor + + + + + + + +DefaultFirebaseOptions() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/android.md b/talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/android.md new file mode 100644 index 000000000..8ca043804 --- /dev/null +++ b/talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/android.md @@ -0,0 +1,51 @@ + + + +# android method + + + + + + + + +[FirebaseOptions](https://pub.dev/documentation/firebase_core_platform_interface/4.8.0/firebase_core_platform_interface/FirebaseOptions-class.html) android +([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> androidFirebaseOptions) + + + + + +

Scaffolds androidFirebaseOptions around FirebaseOptions.

+

params:

+
    +
  • androidFirebaseOptions: The options which we want to scaffold
  • +
+

returns:

+
    +
  • FirebaseOptions: Scaffolded FirebaseOptions
  • +
+ + + +## Implementation + +```dart +static FirebaseOptions android(Map androidFirebaseOptions) => + FirebaseOptions( + apiKey: androidFirebaseOptions['apiKey'] as String, + appId: androidFirebaseOptions['appId'] as String, + messagingSenderId: + androidFirebaseOptions['messagingSenderId'] as String, + projectId: androidFirebaseOptions['projectId'] as String, + storageBucket: androidFirebaseOptions['storageBucket'] as String, + ); +``` + + + + + + + diff --git a/talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/currentPlatform.md b/talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/currentPlatform.md new file mode 100644 index 000000000..29bbbf15d --- /dev/null +++ b/talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/currentPlatform.md @@ -0,0 +1,72 @@ + + + +# currentPlatform method + + + + + + + + +[FirebaseOptions](https://pub.dev/documentation/firebase_core_platform_interface/4.8.0/firebase_core_platform_interface/FirebaseOptions-class.html) currentPlatform +([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> androidFirebaseOptions, [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> iosFirebaseOptions) + + + + + +

Builds and returns FirebaseOptions based on the current platform.

+

Switches on the current platform and calls android or iOS +methods accordingly to build the FirebaseOptions. Throws +UnsupportedError if the platform is other than these two.

+

params:

+
    +
  • androidFirebaseOptions: Firebase Options for Android
  • +
  • iosFirebaseOptions: Firebase Options for iOS
  • +
+

returns:

+ + + + +## Implementation + +```dart +static FirebaseOptions currentPlatform( + Map androidFirebaseOptions, + Map iosFirebaseOptions, +) { + if (kIsWeb) { + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for web - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + } + switch (defaultTargetPlatform) { + case TargetPlatform.android: + return android(androidFirebaseOptions); + case TargetPlatform.iOS: + return ios(iosFirebaseOptions); + case TargetPlatform.macOS: + throw UnsupportedError( + 'DefaultFirebaseOptions have not been configured for macos - ' + 'you can reconfigure this by running the FlutterFire CLI again.', + ); + default: + throw UnsupportedError( + 'DefaultFirebaseOptions are not supported for this platform.', + ); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/ios.md b/talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/ios.md new file mode 100644 index 000000000..e6845082b --- /dev/null +++ b/talawa-mobile-docs/firebase_options/DefaultFirebaseOptions/ios.md @@ -0,0 +1,53 @@ + + + +# ios method + + + + + + + + +[FirebaseOptions](https://pub.dev/documentation/firebase_core_platform_interface/4.8.0/firebase_core_platform_interface/FirebaseOptions-class.html) ios +([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> iosFirebaseOptions) + + + + + +

Scaffolds iosFirebaseOptions around FirebaseOptions.

+

more_info_if_required

+

params:

+
    +
  • iosFirebaseOptions: The options which we want to scaffold
  • +
+

returns:

+
    +
  • FirebaseOptions: Scaffolded FirebaseOptions
  • +
+ + + +## Implementation + +```dart +static FirebaseOptions ios(Map iosFirebaseOptions) => + FirebaseOptions( + apiKey: iosFirebaseOptions['apiKey'] as String, + appId: iosFirebaseOptions['appId'] as String, + messagingSenderId: iosFirebaseOptions['messagingSenderId'] as String, + projectId: iosFirebaseOptions['projectId'] as String, + storageBucket: iosFirebaseOptions['storageBucket'] as String, + iosClientId: iosFirebaseOptions['iosClientId'] as String, + iosBundleId: iosFirebaseOptions['iosBundleId'] as String, + ); +``` + + + + + + + diff --git a/talawa-mobile-docs/firebase_options/firebase_options-library.md b/talawa-mobile-docs/firebase_options/firebase_options-library.md new file mode 100644 index 000000000..8d7486d18 --- /dev/null +++ b/talawa-mobile-docs/firebase_options/firebase_options-library.md @@ -0,0 +1,38 @@ + + + + +# firebase_options library + + + + + + + + + + + +## Classes + +##### [DefaultFirebaseOptions](../firebase_options/DefaultFirebaseOptions-class.md) + + + +Default FirebaseOptions for use with your Firebase apps. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/generated_plugin_registrant/generated_plugin_registrant-library.md b/talawa-mobile-docs/generated_plugin_registrant/generated_plugin_registrant-library.md new file mode 100644 index 000000000..866146259 --- /dev/null +++ b/talawa-mobile-docs/generated_plugin_registrant/generated_plugin_registrant-library.md @@ -0,0 +1,40 @@ + + + + +# generated_plugin_registrant library + + + + + + + + + + + + + + + + +## Functions + +##### [registerPlugins](../generated_plugin_registrant/registerPlugins.md)([Registrar](https://api.flutter.dev/flutter/flutter_web_plugins/Registrar-class.html) registrar) void + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/generated_plugin_registrant/registerPlugins.md b/talawa-mobile-docs/generated_plugin_registrant/registerPlugins.md new file mode 100644 index 000000000..0614534bc --- /dev/null +++ b/talawa-mobile-docs/generated_plugin_registrant/registerPlugins.md @@ -0,0 +1,42 @@ + + + +# registerPlugins function + + + + + + + + + + +void registerPlugins +([Registrar](https://api.flutter.dev/flutter/flutter_web_plugins/Registrar-class.html) registrar) + + + + + + + + +## Implementation + +```dart +void registerPlugins(Registrar registrar) { + ConnectivityPlusPlugin.registerWith(registrar); + SharedPreferencesPlugin.registerWith(registrar); + UniLinksPlugin.registerWith(registrar); + VibrationWebPlugin.registerWith(registrar); + registrar.registerMessageHandler(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/index.json b/talawa-mobile-docs/index.json new file mode 100644 index 000000000..0ff4d0217 --- /dev/null +++ b/talawa-mobile-docs/index.json @@ -0,0 +1 @@ +[{"name":"access_request_screen","qualifiedName":"access_request_screen","href":"views_after_auth_screens_join_org_after_auth_access_request_screen/views_after_auth_screens_join_org_after_auth_access_request_screen-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"SendAccessRequest","qualifiedName":"access_request_screen.SendAccessRequest","href":"views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"requestAccess","enclosedBy":{"name":"access_request_screen","type":"library","href":"views_after_auth_screens_join_org_after_auth_access_request_screen/views_after_auth_screens_join_org_after_auth_access_request_screen-library.md"}},{"name":"SendAccessRequest","qualifiedName":"access_request_screen.SendAccessRequest.SendAccessRequest","href":"views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/SendAccessRequest.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SendAccessRequest","type":"class","href":"views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest-class.md"}},{"name":"build","qualifiedName":"access_request_screen.SendAccessRequest.build","href":"views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"SendAccessRequest","type":"class","href":"views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest-class.md"}},{"name":"org","qualifiedName":"access_request_screen.SendAccessRequest.org","href":"views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/org.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SendAccessRequest","type":"class","href":"views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest-class.md"}},{"name":"access_request_view_model","qualifiedName":"access_request_view_model","href":"view_model_access_request_view_model/view_model_access_request_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"AccessScreenViewModel","qualifiedName":"access_request_view_model.AccessScreenViewModel","href":"view_model_access_request_view_model/AccessScreenViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"access_request_view_model","type":"library","href":"view_model_access_request_view_model/view_model_access_request_view_model-library.md"}},{"name":"AccessScreenViewModel","qualifiedName":"access_request_view_model.AccessScreenViewModel.AccessScreenViewModel","href":"view_model_access_request_view_model/AccessScreenViewModel/AccessScreenViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AccessScreenViewModel","type":"class","href":"view_model_access_request_view_model/AccessScreenViewModel-class.md"}},{"name":"initialise","qualifiedName":"access_request_view_model.AccessScreenViewModel.initialise","href":"view_model_access_request_view_model/AccessScreenViewModel/initialise.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AccessScreenViewModel","type":"class","href":"view_model_access_request_view_model/AccessScreenViewModel-class.md"}},{"name":"optionalMessageController","qualifiedName":"access_request_view_model.AccessScreenViewModel.optionalMessageController","href":"view_model_access_request_view_model/AccessScreenViewModel/optionalMessageController.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AccessScreenViewModel","type":"class","href":"view_model_access_request_view_model/AccessScreenViewModel-class.md"}},{"name":"orgId","qualifiedName":"access_request_view_model.AccessScreenViewModel.orgId","href":"view_model_access_request_view_model/AccessScreenViewModel/orgId.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AccessScreenViewModel","type":"class","href":"view_model_access_request_view_model/AccessScreenViewModel-class.md"}},{"name":"organizations","qualifiedName":"access_request_view_model.AccessScreenViewModel.organizations","href":"view_model_access_request_view_model/AccessScreenViewModel/organizations.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AccessScreenViewModel","type":"class","href":"view_model_access_request_view_model/AccessScreenViewModel-class.md"}},{"name":"selectedOrganization","qualifiedName":"access_request_view_model.AccessScreenViewModel.selectedOrganization","href":"view_model_access_request_view_model/AccessScreenViewModel/selectedOrganization.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AccessScreenViewModel","type":"class","href":"view_model_access_request_view_model/AccessScreenViewModel-class.md"}},{"name":"sendMembershipRequest","qualifiedName":"access_request_view_model.AccessScreenViewModel.sendMembershipRequest","href":"view_model_access_request_view_model/AccessScreenViewModel/sendMembershipRequest.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AccessScreenViewModel","type":"class","href":"view_model_access_request_view_model/AccessScreenViewModel-class.md"}},{"name":"add_members_bottom_sheet","qualifiedName":"add_members_bottom_sheet","href":"widgets_add_members_bottom_sheet/widgets_add_members_bottom_sheet-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EventBottomSheet","qualifiedName":"add_members_bottom_sheet.EventBottomSheet","href":"widgets_add_members_bottom_sheet/EventBottomSheet-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"Adds members to an event.","enclosedBy":{"name":"add_members_bottom_sheet","type":"library","href":"widgets_add_members_bottom_sheet/widgets_add_members_bottom_sheet-library.md"}},{"name":"EventBottomSheet","qualifiedName":"add_members_bottom_sheet.EventBottomSheet.EventBottomSheet","href":"widgets_add_members_bottom_sheet/EventBottomSheet/EventBottomSheet.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventBottomSheet","type":"class","href":"widgets_add_members_bottom_sheet/EventBottomSheet-class.md"}},{"name":"addUserBottomSheet","qualifiedName":"add_members_bottom_sheet.EventBottomSheet.addUserBottomSheet","href":"widgets_add_members_bottom_sheet/EventBottomSheet/addUserBottomSheet.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function creates a modal material design bottom sheet.","enclosedBy":{"name":"EventBottomSheet","type":"class","href":"widgets_add_members_bottom_sheet/EventBottomSheet-class.md"}},{"name":"add_post_page","qualifiedName":"add_post_page","href":"views_after_auth_screens_add_post_page/views_after_auth_screens_add_post_page-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"AddPost","qualifiedName":"add_post_page.AddPost","href":"views_after_auth_screens_add_post_page/AddPost-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"AddPost returns a widget to add(upload) the post.","enclosedBy":{"name":"add_post_page","type":"library","href":"views_after_auth_screens_add_post_page/views_after_auth_screens_add_post_page-library.md"}},{"name":"AddPost","qualifiedName":"add_post_page.AddPost.AddPost","href":"views_after_auth_screens_add_post_page/AddPost/AddPost.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AddPost","type":"class","href":"views_after_auth_screens_add_post_page/AddPost-class.md"}},{"name":"build","qualifiedName":"add_post_page.AddPost.build","href":"views_after_auth_screens_add_post_page/AddPost/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"AddPost","type":"class","href":"views_after_auth_screens_add_post_page/AddPost-class.md"}},{"name":"drawerKey","qualifiedName":"add_post_page.AddPost.drawerKey","href":"views_after_auth_screens_add_post_page/AddPost/drawerKey.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"DrawerKey.","enclosedBy":{"name":"AddPost","type":"class","href":"views_after_auth_screens_add_post_page/AddPost-class.md"}},{"name":"model","qualifiedName":"add_post_page.model","href":"views_after_auth_screens_add_post_page/model.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"Add Post View Model.","enclosedBy":{"name":"add_post_page","type":"library","href":"views_after_auth_screens_add_post_page/views_after_auth_screens_add_post_page-library.md"}},{"name":"add_post_view_model","qualifiedName":"add_post_view_model","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/view_model_after_auth_view_models_add_post_view_models_add_post_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"AddPostViewModel","qualifiedName":"add_post_view_model.AddPostViewModel","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"AddPostViewModel class have different functions that are used.","enclosedBy":{"name":"add_post_view_model","type":"library","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/view_model_after_auth_view_models_add_post_view_models_add_post_view_model-library.md"}},{"name":"AddPostViewModel","qualifiedName":"add_post_view_model.AddPostViewModel.AddPostViewModel","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/AddPostViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AddPostViewModel","type":"class","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md"}},{"name":"controller","qualifiedName":"add_post_view_model.AddPostViewModel.controller","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/controller.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Post body text controller.","enclosedBy":{"name":"AddPostViewModel","type":"class","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md"}},{"name":"getImageFromGallery","qualifiedName":"add_post_view_model.AddPostViewModel.getImageFromGallery","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/getImageFromGallery.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to get the image from gallery.","enclosedBy":{"name":"AddPostViewModel","type":"class","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md"}},{"name":"imageFile","qualifiedName":"add_post_view_model.AddPostViewModel.imageFile","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/imageFile.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"The image file that is to be uploaded.","enclosedBy":{"name":"AddPostViewModel","type":"class","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md"}},{"name":"initialise","qualifiedName":"add_post_view_model.AddPostViewModel.initialise","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/initialise.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is usedto do initialisation of stuff in the view model.","enclosedBy":{"name":"AddPostViewModel","type":"class","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md"}},{"name":"orgName","qualifiedName":"add_post_view_model.AddPostViewModel.orgName","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/orgName.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"The organisation name.","enclosedBy":{"name":"AddPostViewModel","type":"class","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md"}},{"name":"removeImage","qualifiedName":"add_post_view_model.AddPostViewModel.removeImage","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/removeImage.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function removes the image selected.","enclosedBy":{"name":"AddPostViewModel","type":"class","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md"}},{"name":"titleController","qualifiedName":"add_post_view_model.AddPostViewModel.titleController","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/titleController.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Post title text controller.","enclosedBy":{"name":"AddPostViewModel","type":"class","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md"}},{"name":"uploadPost","qualifiedName":"add_post_view_model.AddPostViewModel.uploadPost","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/uploadPost.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function uploads the post finally, and navigate the success message or error message in Snack Bar.","enclosedBy":{"name":"AddPostViewModel","type":"class","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md"}},{"name":"userName","qualifiedName":"add_post_view_model.AddPostViewModel.userName","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/userName.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"The Username.","enclosedBy":{"name":"AddPostViewModel","type":"class","href":"view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md"}},{"name":"app_localization","qualifiedName":"app_localization","href":"utils_app_localization/utils_app_localization-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"AppLocalizations","qualifiedName":"app_localization.AppLocalizations","href":"utils_app_localization/AppLocalizations-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class provides methods to localize the application so that it can be available\nto users with different languages.","enclosedBy":{"name":"app_localization","type":"library","href":"utils_app_localization/utils_app_localization-library.md"}},{"name":"AppLocalizations","qualifiedName":"app_localization.AppLocalizations.AppLocalizations","href":"utils_app_localization/AppLocalizations/AppLocalizations.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLocalizations","type":"class","href":"utils_app_localization/AppLocalizations-class.md"}},{"name":"delegate","qualifiedName":"app_localization.AppLocalizations.delegate","href":"utils_app_localization/AppLocalizations/delegate-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLocalizations","type":"class","href":"utils_app_localization/AppLocalizations-class.md"}},{"name":"isTest","qualifiedName":"app_localization.AppLocalizations.isTest","href":"utils_app_localization/AppLocalizations/isTest.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLocalizations","type":"class","href":"utils_app_localization/AppLocalizations-class.md"}},{"name":"load","qualifiedName":"app_localization.AppLocalizations.load","href":"utils_app_localization/AppLocalizations/load.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLocalizations","type":"class","href":"utils_app_localization/AppLocalizations-class.md"}},{"name":"loadTest","qualifiedName":"app_localization.AppLocalizations.loadTest","href":"utils_app_localization/AppLocalizations/loadTest.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLocalizations","type":"class","href":"utils_app_localization/AppLocalizations-class.md"}},{"name":"locale","qualifiedName":"app_localization.AppLocalizations.locale","href":"utils_app_localization/AppLocalizations/locale.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLocalizations","type":"class","href":"utils_app_localization/AppLocalizations-class.md"}},{"name":"of","qualifiedName":"app_localization.AppLocalizations.of","href":"utils_app_localization/AppLocalizations/of.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLocalizations","type":"class","href":"utils_app_localization/AppLocalizations-class.md"}},{"name":"strictTranslate","qualifiedName":"app_localization.AppLocalizations.strictTranslate","href":"utils_app_localization/AppLocalizations/strictTranslate.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLocalizations","type":"class","href":"utils_app_localization/AppLocalizations-class.md"}},{"name":"translate","qualifiedName":"app_localization.AppLocalizations.translate","href":"utils_app_localization/AppLocalizations/translate.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLocalizations","type":"class","href":"utils_app_localization/AppLocalizations-class.md"}},{"name":"AppLocalizationsDelegate","qualifiedName":"app_localization.AppLocalizationsDelegate","href":"utils_app_localization/AppLocalizationsDelegate-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"app_localization","type":"library","href":"utils_app_localization/utils_app_localization-library.md"}},{"name":"AppLocalizationsDelegate","qualifiedName":"app_localization.AppLocalizationsDelegate.AppLocalizationsDelegate","href":"utils_app_localization/AppLocalizationsDelegate/AppLocalizationsDelegate.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLocalizationsDelegate","type":"class","href":"utils_app_localization/AppLocalizationsDelegate-class.md"}},{"name":"isSupported","qualifiedName":"app_localization.AppLocalizationsDelegate.isSupported","href":"utils_app_localization/AppLocalizationsDelegate/isSupported.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Whether resources for the given locale can be loaded by this delegate.","enclosedBy":{"name":"AppLocalizationsDelegate","type":"class","href":"utils_app_localization/AppLocalizationsDelegate-class.md"}},{"name":"isTest","qualifiedName":"app_localization.AppLocalizationsDelegate.isTest","href":"utils_app_localization/AppLocalizationsDelegate/isTest.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLocalizationsDelegate","type":"class","href":"utils_app_localization/AppLocalizationsDelegate-class.md"}},{"name":"load","qualifiedName":"app_localization.AppLocalizationsDelegate.load","href":"utils_app_localization/AppLocalizationsDelegate/load.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Start loading the resources for locale. The returned future completes\nwhen the resources have finished loading.","enclosedBy":{"name":"AppLocalizationsDelegate","type":"class","href":"utils_app_localization/AppLocalizationsDelegate-class.md"}},{"name":"shouldReload","qualifiedName":"app_localization.AppLocalizationsDelegate.shouldReload","href":"utils_app_localization/AppLocalizationsDelegate/shouldReload.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Returns true if the resources for this delegate should be loaded\nagain by calling the load method.","enclosedBy":{"name":"AppLocalizationsDelegate","type":"class","href":"utils_app_localization/AppLocalizationsDelegate-class.md"}},{"name":"app_settings_page","qualifiedName":"app_settings_page","href":"views_after_auth_screens_app_settings_app_settings_page/views_after_auth_screens_app_settings_app_settings_page-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"AppSettingsPage","qualifiedName":"app_settings_page.AppSettingsPage","href":"views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"AppSettingsPage is a widget that has mutable state _AppSettingsPageState.","enclosedBy":{"name":"app_settings_page","type":"library","href":"views_after_auth_screens_app_settings_app_settings_page/views_after_auth_screens_app_settings_app_settings_page-library.md"}},{"name":"AppSettingsPage","qualifiedName":"app_settings_page.AppSettingsPage.AppSettingsPage","href":"views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage/AppSettingsPage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppSettingsPage","type":"class","href":"views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage-class.md"}},{"name":"createState","qualifiedName":"app_settings_page.AppSettingsPage.createState","href":"views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"AppSettingsPage","type":"class","href":"views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage-class.md"}},{"name":"apptheme","qualifiedName":"apptheme","href":"apptheme/apptheme-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"AppTheme","qualifiedName":"apptheme.AppTheme","href":"apptheme/AppTheme-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"apptheme","type":"library","href":"apptheme/apptheme-library.md"}},{"name":"AppTheme","qualifiedName":"apptheme.AppTheme.AppTheme","href":"apptheme/AppTheme/AppTheme.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"blackPrimary","qualifiedName":"apptheme.AppTheme.blackPrimary","href":"apptheme/AppTheme/blackPrimary-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"blackSecondary","qualifiedName":"apptheme.AppTheme.blackSecondary","href":"apptheme/AppTheme/blackSecondary-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"blackTertiary","qualifiedName":"apptheme.AppTheme.blackTertiary","href":"apptheme/AppTheme/blackTertiary-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"blue","qualifiedName":"apptheme.AppTheme.blue","href":"apptheme/AppTheme/blue-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"bodyText1","qualifiedName":"apptheme.AppTheme.bodyText1","href":"apptheme/AppTheme/bodyText1.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"bodyText2","qualifiedName":"apptheme.AppTheme.bodyText2","href":"apptheme/AppTheme/bodyText2.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"bodyText3","qualifiedName":"apptheme.AppTheme.bodyText3","href":"apptheme/AppTheme/bodyText3.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"button","qualifiedName":"apptheme.AppTheme.button","href":"apptheme/AppTheme/button.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"green","qualifiedName":"apptheme.AppTheme.green","href":"apptheme/AppTheme/green-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"grey","qualifiedName":"apptheme.AppTheme.grey","href":"apptheme/AppTheme/grey-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"headline1","qualifiedName":"apptheme.AppTheme.headline1","href":"apptheme/AppTheme/headline1.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"headline2","qualifiedName":"apptheme.AppTheme.headline2","href":"apptheme/AppTheme/headline2.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"headline3","qualifiedName":"apptheme.AppTheme.headline3","href":"apptheme/AppTheme/headline3.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"headline4","qualifiedName":"apptheme.AppTheme.headline4","href":"apptheme/AppTheme/headline4.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"headline5","qualifiedName":"apptheme.AppTheme.headline5","href":"apptheme/AppTheme/headline5.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"headline6","qualifiedName":"apptheme.AppTheme.headline6","href":"apptheme/AppTheme/headline6.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"lightGrey","qualifiedName":"apptheme.AppTheme.lightGrey","href":"apptheme/AppTheme/lightGrey-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"overline","qualifiedName":"apptheme.AppTheme.overline","href":"apptheme/AppTheme/overline.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"primary","qualifiedName":"apptheme.AppTheme.primary","href":"apptheme/AppTheme/primary-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"red","qualifiedName":"apptheme.AppTheme.red","href":"apptheme/AppTheme/red-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"secondary","qualifiedName":"apptheme.AppTheme.secondary","href":"apptheme/AppTheme/secondary-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"shadow","qualifiedName":"apptheme.AppTheme.shadow","href":"apptheme/AppTheme/shadow-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"subtitle1","qualifiedName":"apptheme.AppTheme.subtitle1","href":"apptheme/AppTheme/subtitle1.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"subtitle2","qualifiedName":"apptheme.AppTheme.subtitle2","href":"apptheme/AppTheme/subtitle2.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"tertiary","qualifiedName":"apptheme.AppTheme.tertiary","href":"apptheme/AppTheme/tertiary-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"title","qualifiedName":"apptheme.AppTheme.title","href":"apptheme/AppTheme/title.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"white","qualifiedName":"apptheme.AppTheme.white","href":"apptheme/AppTheme/white-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"yellow","qualifiedName":"apptheme.AppTheme.yellow","href":"apptheme/AppTheme/yellow-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"apptheme/AppTheme-class.md"}},{"name":"base_view","qualifiedName":"base_view","href":"views_base_view/views_base_view-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"BaseView","qualifiedName":"base_view.BaseView","href":"views_base_view/BaseView-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"base_view","type":"library","href":"views_base_view/views_base_view-library.md"}},{"name":"BaseView","qualifiedName":"base_view.BaseView.BaseView","href":"views_base_view/BaseView/BaseView.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"BaseView","type":"class","href":"views_base_view/BaseView-class.md"}},{"name":"builder","qualifiedName":"base_view.BaseView.builder","href":"views_base_view/BaseView/builder.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"BaseView","type":"class","href":"views_base_view/BaseView-class.md"}},{"name":"createState","qualifiedName":"base_view.BaseView.createState","href":"views_base_view/BaseView/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"BaseView","type":"class","href":"views_base_view/BaseView-class.md"}},{"name":"onModelReady","qualifiedName":"base_view.BaseView.onModelReady","href":"views_base_view/BaseView/onModelReady.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"BaseView","type":"class","href":"views_base_view/BaseView-class.md"}},{"name":"base_view_model","qualifiedName":"base_view_model","href":"view_model_base_view_model/view_model_base_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"BaseModel","qualifiedName":"base_view_model.BaseModel","href":"view_model_base_view_model/BaseModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"base_view_model","type":"library","href":"view_model_base_view_model/view_model_base_view_model-library.md"}},{"name":"BaseModel","qualifiedName":"base_view_model.BaseModel.BaseModel","href":"view_model_base_view_model/BaseModel/BaseModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"BaseModel","type":"class","href":"view_model_base_view_model/BaseModel-class.md"}},{"name":"isBusy","qualifiedName":"base_view_model.BaseModel.isBusy","href":"view_model_base_view_model/BaseModel/isBusy.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"BaseModel","type":"class","href":"view_model_base_view_model/BaseModel-class.md"}},{"name":"setState","qualifiedName":"base_view_model.BaseModel.setState","href":"view_model_base_view_model/BaseModel/setState.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"BaseModel","type":"class","href":"view_model_base_view_model/BaseModel-class.md"}},{"name":"state","qualifiedName":"base_view_model.BaseModel.state","href":"view_model_base_view_model/BaseModel/state.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"BaseModel","type":"class","href":"view_model_base_view_model/BaseModel-class.md"}},{"name":"change_password","qualifiedName":"change_password","href":"views_pre_auth_screens_change_password/views_pre_auth_screens_change_password-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ChangePass","qualifiedName":"change_password.ChangePass","href":"views_pre_auth_screens_change_password/ChangePass-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This widget lets the user change his/her password.\nThere are two input fields. The first one is for entering the new password, and the\nsecond one is for re-entering the password for verification.\nThere is a raised button which finally updates the password when pressed.","enclosedBy":{"name":"change_password","type":"library","href":"views_pre_auth_screens_change_password/views_pre_auth_screens_change_password-library.md"}},{"name":"ChangePass","qualifiedName":"change_password.ChangePass.ChangePass","href":"views_pre_auth_screens_change_password/ChangePass/ChangePass.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChangePass","type":"class","href":"views_pre_auth_screens_change_password/ChangePass-class.md"}},{"name":"createState","qualifiedName":"change_password.ChangePass.createState","href":"views_pre_auth_screens_change_password/ChangePass/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"ChangePass","type":"class","href":"views_pre_auth_screens_change_password/ChangePass-class.md"}},{"name":"chat_input_field","qualifiedName":"chat_input_field","href":"views_after_auth_screens_chat_widgets_chat_input_field/views_after_auth_screens_chat_widgets_chat_input_field-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ChatInputField","qualifiedName":"chat_input_field.ChatInputField","href":"views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"ChatInputField returns a widget that has mutable state _ChatInputFieldState.","enclosedBy":{"name":"chat_input_field","type":"library","href":"views_after_auth_screens_chat_widgets_chat_input_field/views_after_auth_screens_chat_widgets_chat_input_field-library.md"}},{"name":"ChatInputField","qualifiedName":"chat_input_field.ChatInputField.ChatInputField","href":"views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/ChatInputField.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatInputField","type":"class","href":"views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField-class.md"}},{"name":"chatId","qualifiedName":"chat_input_field.ChatInputField.chatId","href":"views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/chatId.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"ChatId.","enclosedBy":{"name":"ChatInputField","type":"class","href":"views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField-class.md"}},{"name":"createState","qualifiedName":"chat_input_field.ChatInputField.createState","href":"views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"ChatInputField","type":"class","href":"views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField-class.md"}},{"name":"model","qualifiedName":"chat_input_field.ChatInputField.model","href":"views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/model.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"DirectChatViewModel instance.","enclosedBy":{"name":"ChatInputField","type":"class","href":"views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField-class.md"}},{"name":"chat_list_screen","qualifiedName":"chat_list_screen","href":"views_after_auth_screens_chat_chat_list_screen/views_after_auth_screens_chat_chat_list_screen-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ChatPage","qualifiedName":"chat_list_screen.ChatPage","href":"views_after_auth_screens_chat_chat_list_screen/ChatPage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"ChatPage returns a stateless widget for current user Chat Page which renders\nthe list of all the users that the current user has chat with.","enclosedBy":{"name":"chat_list_screen","type":"library","href":"views_after_auth_screens_chat_chat_list_screen/views_after_auth_screens_chat_chat_list_screen-library.md"}},{"name":"ChatPage","qualifiedName":"chat_list_screen.ChatPage.ChatPage","href":"views_after_auth_screens_chat_chat_list_screen/ChatPage/ChatPage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatPage","type":"class","href":"views_after_auth_screens_chat_chat_list_screen/ChatPage-class.md"}},{"name":"build","qualifiedName":"chat_list_screen.ChatPage.build","href":"views_after_auth_screens_chat_chat_list_screen/ChatPage/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"ChatPage","type":"class","href":"views_after_auth_screens_chat_chat_list_screen/ChatPage-class.md"}},{"name":"chat_list_tile_data_model","qualifiedName":"chat_list_tile_data_model","href":"models_chats_chat_list_tile_data_model/models_chats_chat_list_tile_data_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ChatListTileDataModel","qualifiedName":"chat_list_tile_data_model.ChatListTileDataModel","href":"models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creates JSON code using the JsonSerializable package.","enclosedBy":{"name":"chat_list_tile_data_model","type":"library","href":"models_chats_chat_list_tile_data_model/models_chats_chat_list_tile_data_model-library.md"}},{"name":"ChatListTileDataModel","qualifiedName":"chat_list_tile_data_model.ChatListTileDataModel.ChatListTileDataModel","href":"models_chats_chat_list_tile_data_model/ChatListTileDataModel/ChatListTileDataModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatListTileDataModel","type":"class","href":"models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md"}},{"name":"ChatListTileDataModel.fromJson","qualifiedName":"chat_list_tile_data_model.ChatListTileDataModel.fromJson","href":"models_chats_chat_list_tile_data_model/ChatListTileDataModel/ChatListTileDataModel.fromJson.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatListTileDataModel","type":"class","href":"models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md"}},{"name":"id","qualifiedName":"chat_list_tile_data_model.ChatListTileDataModel.id","href":"models_chats_chat_list_tile_data_model/ChatListTileDataModel/id.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatListTileDataModel","type":"class","href":"models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md"}},{"name":"toJson","qualifiedName":"chat_list_tile_data_model.ChatListTileDataModel.toJson","href":"models_chats_chat_list_tile_data_model/ChatListTileDataModel/toJson.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatListTileDataModel","type":"class","href":"models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md"}},{"name":"users","qualifiedName":"chat_list_tile_data_model.ChatListTileDataModel.users","href":"models_chats_chat_list_tile_data_model/ChatListTileDataModel/users.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatListTileDataModel","type":"class","href":"models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md"}},{"name":"chat_message","qualifiedName":"chat_message","href":"models_chats_chat_message/models_chats_chat_message-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ChatMessage","qualifiedName":"chat_message.ChatMessage","href":"models_chats_chat_message/ChatMessage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creates JSON code for chat message using the JsonSerializable package.","enclosedBy":{"name":"chat_message","type":"library","href":"models_chats_chat_message/models_chats_chat_message-library.md"}},{"name":"ChatMessage","qualifiedName":"chat_message.ChatMessage.ChatMessage","href":"models_chats_chat_message/ChatMessage/ChatMessage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatMessage","type":"class","href":"models_chats_chat_message/ChatMessage-class.md"}},{"name":"ChatMessage.fromJson","qualifiedName":"chat_message.ChatMessage.fromJson","href":"models_chats_chat_message/ChatMessage/ChatMessage.fromJson.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatMessage","type":"class","href":"models_chats_chat_message/ChatMessage-class.md"}},{"name":"id","qualifiedName":"chat_message.ChatMessage.id","href":"models_chats_chat_message/ChatMessage/id.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatMessage","type":"class","href":"models_chats_chat_message/ChatMessage-class.md"}},{"name":"messageContent","qualifiedName":"chat_message.ChatMessage.messageContent","href":"models_chats_chat_message/ChatMessage/messageContent.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatMessage","type":"class","href":"models_chats_chat_message/ChatMessage-class.md"}},{"name":"receiver","qualifiedName":"chat_message.ChatMessage.receiver","href":"models_chats_chat_message/ChatMessage/receiver.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatMessage","type":"class","href":"models_chats_chat_message/ChatMessage-class.md"}},{"name":"sender","qualifiedName":"chat_message.ChatMessage.sender","href":"models_chats_chat_message/ChatMessage/sender.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatMessage","type":"class","href":"models_chats_chat_message/ChatMessage-class.md"}},{"name":"toJson","qualifiedName":"chat_message.ChatMessage.toJson","href":"models_chats_chat_message/ChatMessage/toJson.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatMessage","type":"class","href":"models_chats_chat_message/ChatMessage-class.md"}},{"name":"chat_message_bubble","qualifiedName":"chat_message_bubble","href":"views_after_auth_screens_chat_widgets_chat_message_bubble/views_after_auth_screens_chat_widgets_chat_message_bubble-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"Message","qualifiedName":"chat_message_bubble.Message","href":"views_after_auth_screens_chat_widgets_chat_message_bubble/Message-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"Message returns a widget for chat message in the bubble form.","enclosedBy":{"name":"chat_message_bubble","type":"library","href":"views_after_auth_screens_chat_widgets_chat_message_bubble/views_after_auth_screens_chat_widgets_chat_message_bubble-library.md"}},{"name":"Message","qualifiedName":"chat_message_bubble.Message.Message","href":"views_after_auth_screens_chat_widgets_chat_message_bubble/Message/Message.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Message","type":"class","href":"views_after_auth_screens_chat_widgets_chat_message_bubble/Message-class.md"}},{"name":"build","qualifiedName":"chat_message_bubble.Message.build","href":"views_after_auth_screens_chat_widgets_chat_message_bubble/Message/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"Message","type":"class","href":"views_after_auth_screens_chat_widgets_chat_message_bubble/Message-class.md"}},{"name":"chat_message_screen","qualifiedName":"chat_message_screen","href":"views_after_auth_screens_chat_chat_message_screen/views_after_auth_screens_chat_chat_message_screen-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ChatMessageScreen","qualifiedName":"chat_message_screen.ChatMessageScreen","href":"views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"ChatMessageScreen returns a StatelessWidget for showing the chat message screen.","enclosedBy":{"name":"chat_message_screen","type":"library","href":"views_after_auth_screens_chat_chat_message_screen/views_after_auth_screens_chat_chat_message_screen-library.md"}},{"name":"ChatMessageScreen","qualifiedName":"chat_message_screen.ChatMessageScreen.ChatMessageScreen","href":"views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/ChatMessageScreen.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatMessageScreen","type":"class","href":"views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen-class.md"}},{"name":"build","qualifiedName":"chat_message_screen.ChatMessageScreen.build","href":"views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"ChatMessageScreen","type":"class","href":"views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen-class.md"}},{"name":"chatId","qualifiedName":"chat_message_screen.ChatMessageScreen.chatId","href":"views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/chatId.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatMessageScreen","type":"class","href":"views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen-class.md"}},{"name":"model","qualifiedName":"chat_message_screen.ChatMessageScreen.model","href":"views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/model.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatMessageScreen","type":"class","href":"views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen-class.md"}},{"name":"chat_queries","qualifiedName":"chat_queries","href":"utils_chat_queries/utils_chat_queries-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ChatQueries","qualifiedName":"chat_queries.ChatQueries","href":"utils_chat_queries/ChatQueries-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creates the queries dealing with chats.","enclosedBy":{"name":"chat_queries","type":"library","href":"utils_chat_queries/utils_chat_queries-library.md"}},{"name":"ChatQueries","qualifiedName":"chat_queries.ChatQueries.ChatQueries","href":"utils_chat_queries/ChatQueries/ChatQueries.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatQueries","type":"class","href":"utils_chat_queries/ChatQueries-class.md"}},{"name":"fetchDirectChatMessagesByChatId","qualifiedName":"chat_queries.ChatQueries.fetchDirectChatMessagesByChatId","href":"utils_chat_queries/ChatQueries/fetchDirectChatMessagesByChatId.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatQueries","type":"class","href":"utils_chat_queries/ChatQueries-class.md"}},{"name":"fetchDirectChatsByUserId","qualifiedName":"chat_queries.ChatQueries.fetchDirectChatsByUserId","href":"utils_chat_queries/ChatQueries/fetchDirectChatsByUserId.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatQueries","type":"class","href":"utils_chat_queries/ChatQueries-class.md"}},{"name":"messageSentToDirectChatsubscription","qualifiedName":"chat_queries.ChatQueries.messageSentToDirectChatsubscription","href":"utils_chat_queries/ChatQueries/messageSentToDirectChatsubscription.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatQueries","type":"class","href":"utils_chat_queries/ChatQueries-class.md"}},{"name":"sendMessageToDirectChat","qualifiedName":"chat_queries.ChatQueries.sendMessageToDirectChat","href":"utils_chat_queries/ChatQueries/sendMessageToDirectChat.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatQueries","type":"class","href":"utils_chat_queries/ChatQueries-class.md"}},{"name":"chat_service","qualifiedName":"chat_service","href":"services_chat_service/services_chat_service-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ChatService","qualifiedName":"chat_service.ChatService","href":"services_chat_service/ChatService-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"ChatService class provides different services for direct chats of the user.","enclosedBy":{"name":"chat_service","type":"library","href":"services_chat_service/services_chat_service-library.md"}},{"name":"ChatService","qualifiedName":"chat_service.ChatService.ChatService","href":"services_chat_service/ChatService/ChatService.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatService","type":"class","href":"services_chat_service/ChatService-class.md"}},{"name":"chatListStream","qualifiedName":"chat_service.ChatService.chatListStream","href":"services_chat_service/ChatService/chatListStream.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatService","type":"class","href":"services_chat_service/ChatService-class.md"}},{"name":"chatMessagesStream","qualifiedName":"chat_service.ChatService.chatMessagesStream","href":"services_chat_service/ChatService/chatMessagesStream.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatService","type":"class","href":"services_chat_service/ChatService-class.md"}},{"name":"chatStream","qualifiedName":"chat_service.ChatService.chatStream","href":"services_chat_service/ChatService/chatStream.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatService","type":"class","href":"services_chat_service/ChatService-class.md"}},{"name":"getDirectChatMessagesByChatId","qualifiedName":"chat_service.ChatService.getDirectChatMessagesByChatId","href":"services_chat_service/ChatService/getDirectChatMessagesByChatId.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to get all the chat messages of a particular chat by the user.","enclosedBy":{"name":"ChatService","type":"class","href":"services_chat_service/ChatService-class.md"}},{"name":"getDirectChatsByUserId","qualifiedName":"chat_service.ChatService.getDirectChatsByUserId","href":"services_chat_service/ChatService/getDirectChatsByUserId.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to get all the chats by the user.","enclosedBy":{"name":"ChatService","type":"class","href":"services_chat_service/ChatService-class.md"}},{"name":"sendMessageToDirectChat","qualifiedName":"chat_service.ChatService.sendMessageToDirectChat","href":"services_chat_service/ChatService/sendMessageToDirectChat.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to send the message in the direct chats.","enclosedBy":{"name":"ChatService","type":"class","href":"services_chat_service/ChatService-class.md"}},{"name":"chat_user","qualifiedName":"chat_user","href":"models_chats_chat_user/models_chats_chat_user-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ChatUser","qualifiedName":"chat_user.ChatUser","href":"models_chats_chat_user/ChatUser-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creates JSON code for chat user using the JsonSerializable package.","enclosedBy":{"name":"chat_user","type":"library","href":"models_chats_chat_user/models_chats_chat_user-library.md"}},{"name":"ChatUser","qualifiedName":"chat_user.ChatUser.ChatUser","href":"models_chats_chat_user/ChatUser/ChatUser.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatUser","type":"class","href":"models_chats_chat_user/ChatUser-class.md"}},{"name":"firstName","qualifiedName":"chat_user.ChatUser.firstName","href":"models_chats_chat_user/ChatUser/firstName.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatUser","type":"class","href":"models_chats_chat_user/ChatUser-class.md"}},{"name":"ChatUser.fromJson","qualifiedName":"chat_user.ChatUser.fromJson","href":"models_chats_chat_user/ChatUser/ChatUser.fromJson.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatUser","type":"class","href":"models_chats_chat_user/ChatUser-class.md"}},{"name":"id","qualifiedName":"chat_user.ChatUser.id","href":"models_chats_chat_user/ChatUser/id.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatUser","type":"class","href":"models_chats_chat_user/ChatUser-class.md"}},{"name":"image","qualifiedName":"chat_user.ChatUser.image","href":"models_chats_chat_user/ChatUser/image.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatUser","type":"class","href":"models_chats_chat_user/ChatUser-class.md"}},{"name":"toJson","qualifiedName":"chat_user.ChatUser.toJson","href":"models_chats_chat_user/ChatUser/toJson.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatUser","type":"class","href":"models_chats_chat_user/ChatUser-class.md"}},{"name":"comment_model","qualifiedName":"comment_model","href":"models_comment_comment_model/models_comment_comment_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"Comment","qualifiedName":"comment_model.Comment","href":"models_comment_comment_model/Comment-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class returns a Comment instance.","enclosedBy":{"name":"comment_model","type":"library","href":"models_comment_comment_model/models_comment_comment_model-library.md"}},{"name":"Comment","qualifiedName":"comment_model.Comment.Comment","href":"models_comment_comment_model/Comment/Comment.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Comment","type":"class","href":"models_comment_comment_model/Comment-class.md"}},{"name":"createdAt","qualifiedName":"comment_model.Comment.createdAt","href":"models_comment_comment_model/Comment/createdAt.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Comment","type":"class","href":"models_comment_comment_model/Comment-class.md"}},{"name":"creator","qualifiedName":"comment_model.Comment.creator","href":"models_comment_comment_model/Comment/creator.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Comment","type":"class","href":"models_comment_comment_model/Comment-class.md"}},{"name":"Comment.fromJson","qualifiedName":"comment_model.Comment.fromJson","href":"models_comment_comment_model/Comment/Comment.fromJson.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Comment","type":"class","href":"models_comment_comment_model/Comment-class.md"}},{"name":"likeCount","qualifiedName":"comment_model.Comment.likeCount","href":"models_comment_comment_model/Comment/likeCount.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Comment","type":"class","href":"models_comment_comment_model/Comment-class.md"}},{"name":"post","qualifiedName":"comment_model.Comment.post","href":"models_comment_comment_model/Comment/post.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Comment","type":"class","href":"models_comment_comment_model/Comment-class.md"}},{"name":"text","qualifiedName":"comment_model.Comment.text","href":"models_comment_comment_model/Comment/text.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Comment","type":"class","href":"models_comment_comment_model/Comment-class.md"}},{"name":"comment_queries","qualifiedName":"comment_queries","href":"utils_comment_queries/utils_comment_queries-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CommentQueries","qualifiedName":"comment_queries.CommentQueries","href":"utils_comment_queries/CommentQueries-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creates the queries dealing with comments.","enclosedBy":{"name":"comment_queries","type":"library","href":"utils_comment_queries/utils_comment_queries-library.md"}},{"name":"CommentQueries","qualifiedName":"comment_queries.CommentQueries.CommentQueries","href":"utils_comment_queries/CommentQueries/CommentQueries.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CommentQueries","type":"class","href":"utils_comment_queries/CommentQueries-class.md"}},{"name":"createComment","qualifiedName":"comment_queries.CommentQueries.createComment","href":"utils_comment_queries/CommentQueries/createComment.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CommentQueries","type":"class","href":"utils_comment_queries/CommentQueries-class.md"}},{"name":"getPostsComments","qualifiedName":"comment_queries.CommentQueries.getPostsComments","href":"utils_comment_queries/CommentQueries/getPostsComments.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CommentQueries","type":"class","href":"utils_comment_queries/CommentQueries-class.md"}},{"name":"comment_service","qualifiedName":"comment_service","href":"services_comment_service/services_comment_service-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CommentService","qualifiedName":"comment_service.CommentService","href":"services_comment_service/CommentService-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"CommentService class have different member functions which provides service in the context of commenting.","enclosedBy":{"name":"comment_service","type":"library","href":"services_comment_service/services_comment_service-library.md"}},{"name":"CommentService","qualifiedName":"comment_service.CommentService.CommentService","href":"services_comment_service/CommentService/CommentService.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CommentService","type":"class","href":"services_comment_service/CommentService-class.md"}},{"name":"createComments","qualifiedName":"comment_service.CommentService.createComments","href":"services_comment_service/CommentService/createComments.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to add comment on the post.","enclosedBy":{"name":"CommentService","type":"class","href":"services_comment_service/CommentService-class.md"}},{"name":"getCommentsForPost","qualifiedName":"comment_service.CommentService.getCommentsForPost","href":"services_comment_service/CommentService/getCommentsForPost.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to fetch all comments on the post.","enclosedBy":{"name":"CommentService","type":"class","href":"services_comment_service/CommentService-class.md"}},{"name":"comments_view_model","qualifiedName":"comments_view_model","href":"view_model_widgets_view_models_comments_view_model/view_model_widgets_view_models_comments_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CommentsViewModel","qualifiedName":"comments_view_model.CommentsViewModel","href":"view_model_widgets_view_models_comments_view_model/CommentsViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"CommentsViewModel class helps to serve the data from model\nand to react to user's input for Comment Widget.","enclosedBy":{"name":"comments_view_model","type":"library","href":"view_model_widgets_view_models_comments_view_model/view_model_widgets_view_models_comments_view_model-library.md"}},{"name":"CommentsViewModel","qualifiedName":"comments_view_model.CommentsViewModel.CommentsViewModel","href":"view_model_widgets_view_models_comments_view_model/CommentsViewModel/CommentsViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CommentsViewModel","type":"class","href":"view_model_widgets_view_models_comments_view_model/CommentsViewModel-class.md"}},{"name":"addCommentLocally","qualifiedName":"comments_view_model.CommentsViewModel.addCommentLocally","href":"view_model_widgets_view_models_comments_view_model/CommentsViewModel/addCommentLocally.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CommentsViewModel","type":"class","href":"view_model_widgets_view_models_comments_view_model/CommentsViewModel-class.md"}},{"name":"commentList","qualifiedName":"comments_view_model.CommentsViewModel.commentList","href":"view_model_widgets_view_models_comments_view_model/CommentsViewModel/commentList.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CommentsViewModel","type":"class","href":"view_model_widgets_view_models_comments_view_model/CommentsViewModel-class.md"}},{"name":"createComment","qualifiedName":"comments_view_model.CommentsViewModel.createComment","href":"view_model_widgets_view_models_comments_view_model/CommentsViewModel/createComment.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function add comment on the post.\nThe function uses createComments method provided by Comment Service.","enclosedBy":{"name":"CommentsViewModel","type":"class","href":"view_model_widgets_view_models_comments_view_model/CommentsViewModel-class.md"}},{"name":"getComments","qualifiedName":"comments_view_model.CommentsViewModel.getComments","href":"view_model_widgets_view_models_comments_view_model/CommentsViewModel/getComments.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This methods fetch all comments on the post.\nThe function uses getCommentsForPost method by Comment Service.","enclosedBy":{"name":"CommentsViewModel","type":"class","href":"view_model_widgets_view_models_comments_view_model/CommentsViewModel-class.md"}},{"name":"initialise","qualifiedName":"comments_view_model.CommentsViewModel.initialise","href":"view_model_widgets_view_models_comments_view_model/CommentsViewModel/initialise.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CommentsViewModel","type":"class","href":"view_model_widgets_view_models_comments_view_model/CommentsViewModel-class.md"}},{"name":"postId","qualifiedName":"comments_view_model.CommentsViewModel.postId","href":"view_model_widgets_view_models_comments_view_model/CommentsViewModel/postId.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CommentsViewModel","type":"class","href":"view_model_widgets_view_models_comments_view_model/CommentsViewModel-class.md"}},{"name":"constants","qualifiedName":"constants","href":"constants_constants/constants_constants-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"languages","qualifiedName":"constants.languages","href":"constants_constants/languages.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"This file contains the prototypes of all the languages available and supported currencies.","enclosedBy":{"name":"constants","type":"library","href":"constants_constants/constants_constants-library.md"}},{"name":"supportedCurrencies","qualifiedName":"constants.supportedCurrencies","href":"constants_constants/supportedCurrencies.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"constants","type":"library","href":"constants_constants/constants_constants-library.md"}},{"name":"create_event_form","qualifiedName":"create_event_form","href":"views_after_auth_screens_events_create_event_form/views_after_auth_screens_events_create_event_form-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CreateEventForm","qualifiedName":"create_event_form.CreateEventForm","href":"views_after_auth_screens_events_create_event_form/CreateEventForm-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"CreateEventForm returns a widget of a Form for creating events in the organization.\nThis widget is used in CreateEventPage widget.","enclosedBy":{"name":"create_event_form","type":"library","href":"views_after_auth_screens_events_create_event_form/views_after_auth_screens_events_create_event_form-library.md"}},{"name":"CreateEventForm","qualifiedName":"create_event_form.CreateEventForm.CreateEventForm","href":"views_after_auth_screens_events_create_event_form/CreateEventForm/CreateEventForm.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CreateEventForm","type":"class","href":"views_after_auth_screens_events_create_event_form/CreateEventForm-class.md"}},{"name":"build","qualifiedName":"create_event_form.CreateEventForm.build","href":"views_after_auth_screens_events_create_event_form/CreateEventForm/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"CreateEventForm","type":"class","href":"views_after_auth_screens_events_create_event_form/CreateEventForm-class.md"}},{"name":"model","qualifiedName":"create_event_form.CreateEventForm.model","href":"views_after_auth_screens_events_create_event_form/CreateEventForm/model.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CreateEventForm","type":"class","href":"views_after_auth_screens_events_create_event_form/CreateEventForm-class.md"}},{"name":"create_event_page","qualifiedName":"create_event_page","href":"views_after_auth_screens_events_create_event_page/views_after_auth_screens_events_create_event_page-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CreateEventPage","qualifiedName":"create_event_page.CreateEventPage","href":"views_after_auth_screens_events_create_event_page/CreateEventPage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"CreateEventPage returns a widget that has mutable state _CreateEventPageState.","enclosedBy":{"name":"create_event_page","type":"library","href":"views_after_auth_screens_events_create_event_page/views_after_auth_screens_events_create_event_page-library.md"}},{"name":"CreateEventPage","qualifiedName":"create_event_page.CreateEventPage.CreateEventPage","href":"views_after_auth_screens_events_create_event_page/CreateEventPage/CreateEventPage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CreateEventPage","type":"class","href":"views_after_auth_screens_events_create_event_page/CreateEventPage-class.md"}},{"name":"createState","qualifiedName":"create_event_page.CreateEventPage.createState","href":"views_after_auth_screens_events_create_event_page/CreateEventPage/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"CreateEventPage","type":"class","href":"views_after_auth_screens_events_create_event_page/CreateEventPage-class.md"}},{"name":"create_event_view_model","qualifiedName":"create_event_view_model","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/view_model_after_auth_view_models_event_view_models_create_event_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CreateEventViewModel","qualifiedName":"create_event_view_model.CreateEventViewModel","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"CreateEventViewModel class have methods to interact with model in.","enclosedBy":{"name":"create_event_view_model","type":"library","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/view_model_after_auth_view_models_event_view_models_create_event_view_model-library.md"}},{"name":"CreateEventViewModel","qualifiedName":"create_event_view_model.CreateEventViewModel.CreateEventViewModel","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/CreateEventViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"buildUserList","qualifiedName":"create_event_view_model.CreateEventViewModel.buildUserList","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/buildUserList.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function build the user list.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"createEvent","qualifiedName":"create_event_view_model.CreateEventViewModel.createEvent","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/createEvent.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to create the event for the organization.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"descriptionFocus","qualifiedName":"create_event_view_model.CreateEventViewModel.descriptionFocus","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/descriptionFocus.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"DescriptionFocus FocusNode.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"eventDescriptionTextController","qualifiedName":"create_event_view_model.CreateEventViewModel.eventDescriptionTextController","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventDescriptionTextController.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Event Description Text Controller.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"eventEndDate","qualifiedName":"create_event_view_model.CreateEventViewModel.eventEndDate","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventEndDate.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Event End Date.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"eventEndTime","qualifiedName":"create_event_view_model.CreateEventViewModel.eventEndTime","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventEndTime.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Event End Time.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"eventLocationTextController","qualifiedName":"create_event_view_model.CreateEventViewModel.eventLocationTextController","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventLocationTextController.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Event Location Text Controller.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"eventStartDate","qualifiedName":"create_event_view_model.CreateEventViewModel.eventStartDate","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventStartDate.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Event Start Date.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"eventStartTime","qualifiedName":"create_event_view_model.CreateEventViewModel.eventStartTime","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventStartTime.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Event Start Time.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"eventTitleTextController","qualifiedName":"create_event_view_model.CreateEventViewModel.eventTitleTextController","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventTitleTextController.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Event Title Text Controller.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"formKey","qualifiedName":"create_event_view_model.CreateEventViewModel.formKey","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/formKey.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Global FormKey.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"getCurrentOrgUsersList","qualifiedName":"create_event_view_model.CreateEventViewModel.getCurrentOrgUsersList","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/getCurrentOrgUsersList.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function fetch all the users in the current organization and return List.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"getImageFromGallery","qualifiedName":"create_event_view_model.CreateEventViewModel.getImageFromGallery","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/getImageFromGallery.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to get the image from gallery.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"imageFile","qualifiedName":"create_event_view_model.CreateEventViewModel.imageFile","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/imageFile.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Getter to return imageFile.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"initialize","qualifiedName":"create_event_view_model.CreateEventViewModel.initialize","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/initialize.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Function To Initialize.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"isPublicSwitch","qualifiedName":"create_event_view_model.CreateEventViewModel.isPublicSwitch","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/isPublicSwitch.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Public Event or Not.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"isRegisterableSwitch","qualifiedName":"create_event_view_model.CreateEventViewModel.isRegisterableSwitch","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/isRegisterableSwitch.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"If event is registerable after creation.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"latitude","qualifiedName":"create_event_view_model.CreateEventViewModel.latitude","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/latitude.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Latitude store.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"locationFocus","qualifiedName":"create_event_view_model.CreateEventViewModel.locationFocus","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/locationFocus.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"LocationFocus FocusNode.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"longitude","qualifiedName":"create_event_view_model.CreateEventViewModel.longitude","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/longitude.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Longitude store.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"memberCheckedMap","qualifiedName":"create_event_view_model.CreateEventViewModel.memberCheckedMap","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/memberCheckedMap.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Getter to return members map.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"orgMembersList","qualifiedName":"create_event_view_model.CreateEventViewModel.orgMembersList","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/orgMembersList.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Organisation Members List.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"removeImage","qualifiedName":"create_event_view_model.CreateEventViewModel.removeImage","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/removeImage.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function remove the selected image.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"removeUserFromList","qualifiedName":"create_event_view_model.CreateEventViewModel.removeUserFromList","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/removeUserFromList.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to remove a user from user's list.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"selectedMembers","qualifiedName":"create_event_view_model.CreateEventViewModel.selectedMembers","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/selectedMembers.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Getter to return selected members.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"titleFocus","qualifiedName":"create_event_view_model.CreateEventViewModel.titleFocus","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/titleFocus.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"TitleFocus FocusNode.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"validate","qualifiedName":"create_event_view_model.CreateEventViewModel.validate","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/validate.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"AutoValidateMode default to disabled.","enclosedBy":{"name":"CreateEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md"}},{"name":"create_task_page","qualifiedName":"create_task_page","href":"views_after_auth_screens_tasks_create_task_page/views_after_auth_screens_tasks_create_task_page-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CreateTaskPage","qualifiedName":"create_task_page.CreateTaskPage","href":"views_after_auth_screens_tasks_create_task_page/CreateTaskPage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"CreateTaskPage returns a widget for page to create task for the user.","enclosedBy":{"name":"create_task_page","type":"library","href":"views_after_auth_screens_tasks_create_task_page/views_after_auth_screens_tasks_create_task_page-library.md"}},{"name":"CreateTaskPage","qualifiedName":"create_task_page.CreateTaskPage.CreateTaskPage","href":"views_after_auth_screens_tasks_create_task_page/CreateTaskPage/CreateTaskPage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CreateTaskPage","type":"class","href":"views_after_auth_screens_tasks_create_task_page/CreateTaskPage-class.md"}},{"name":"build","qualifiedName":"create_task_page.CreateTaskPage.build","href":"views_after_auth_screens_tasks_create_task_page/CreateTaskPage/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"CreateTaskPage","type":"class","href":"views_after_auth_screens_tasks_create_task_page/CreateTaskPage-class.md"}},{"name":"eventId","qualifiedName":"create_task_page.CreateTaskPage.eventId","href":"views_after_auth_screens_tasks_create_task_page/CreateTaskPage/eventId.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CreateTaskPage","type":"class","href":"views_after_auth_screens_tasks_create_task_page/CreateTaskPage-class.md"}},{"name":"create_task_view_model","qualifiedName":"create_task_view_model","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/view_model_after_auth_view_models_task_view_models_create_task_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CreateTaskViewModel","qualifiedName":"create_task_view_model.CreateTaskViewModel","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"CreateTaskViewModel class helps to interact with model to serve data\nand react to user's input in Create Task view.","enclosedBy":{"name":"create_task_view_model","type":"library","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/view_model_after_auth_view_models_task_view_models_create_task_view_model-library.md"}},{"name":"CreateTaskViewModel","qualifiedName":"create_task_view_model.CreateTaskViewModel.CreateTaskViewModel","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/CreateTaskViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CreateTaskViewModel","type":"class","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md"}},{"name":"createTask","qualifiedName":"create_task_view_model.CreateTaskViewModel.createTask","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/createTask.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function creates a new task for an event.\nThe function uses createTask method provided by Task Services.","enclosedBy":{"name":"CreateTaskViewModel","type":"class","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md"}},{"name":"dispose","qualifiedName":"create_task_view_model.CreateTaskViewModel.dispose","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/dispose.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Discards any resources used by the object. After this is called, the\nobject is not in a usable state and should be discarded (calls to\naddListener will throw after the object is disposed).","enclosedBy":{"name":"CreateTaskViewModel","type":"class","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md"}},{"name":"editTask","qualifiedName":"create_task_view_model.CreateTaskViewModel.editTask","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/editTask.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function updates the task.\nThe function uses editTask method provided by Task Services.","enclosedBy":{"name":"CreateTaskViewModel","type":"class","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md"}},{"name":"fillTask","qualifiedName":"create_task_view_model.CreateTaskViewModel.fillTask","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/fillTask.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This functions fills the task controller data.","enclosedBy":{"name":"CreateTaskViewModel","type":"class","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md"}},{"name":"taskDescriptionTextController","qualifiedName":"create_task_view_model.CreateTaskViewModel.taskDescriptionTextController","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskDescriptionTextController.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CreateTaskViewModel","type":"class","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md"}},{"name":"taskEndDate","qualifiedName":"create_task_view_model.CreateTaskViewModel.taskEndDate","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskEndDate.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CreateTaskViewModel","type":"class","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md"}},{"name":"taskEndTime","qualifiedName":"create_task_view_model.CreateTaskViewModel.taskEndTime","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskEndTime.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CreateTaskViewModel","type":"class","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md"}},{"name":"taskTitleTextController","qualifiedName":"create_task_view_model.CreateTaskViewModel.taskTitleTextController","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskTitleTextController.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CreateTaskViewModel","type":"class","href":"view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md"}},{"name":"custom_alert_dialog","qualifiedName":"custom_alert_dialog","href":"widgets_custom_alert_dialog/widgets_custom_alert_dialog-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CustomAlertDialog","qualifiedName":"custom_alert_dialog.CustomAlertDialog","href":"widgets_custom_alert_dialog/CustomAlertDialog-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This Class returns CustomAlertDialog widget. Custom Alert Dialog is a popup\nthat appeared in the screen showing Alert message along with the event buttons.\nThis extends stateless widget that means it cannot change its state during the\nruntime of a application.","enclosedBy":{"name":"custom_alert_dialog","type":"library","href":"widgets_custom_alert_dialog/widgets_custom_alert_dialog-library.md"}},{"name":"CustomAlertDialog","qualifiedName":"custom_alert_dialog.CustomAlertDialog.CustomAlertDialog","href":"widgets_custom_alert_dialog/CustomAlertDialog/CustomAlertDialog.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomAlertDialog","type":"class","href":"widgets_custom_alert_dialog/CustomAlertDialog-class.md"}},{"name":"build","qualifiedName":"custom_alert_dialog.CustomAlertDialog.build","href":"widgets_custom_alert_dialog/CustomAlertDialog/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"CustomAlertDialog","type":"class","href":"widgets_custom_alert_dialog/CustomAlertDialog-class.md"}},{"name":"dialogSubTitle","qualifiedName":"custom_alert_dialog.CustomAlertDialog.dialogSubTitle","href":"widgets_custom_alert_dialog/CustomAlertDialog/dialogSubTitle.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomAlertDialog","type":"class","href":"widgets_custom_alert_dialog/CustomAlertDialog-class.md"}},{"name":"dialogTitle","qualifiedName":"custom_alert_dialog.CustomAlertDialog.dialogTitle","href":"widgets_custom_alert_dialog/CustomAlertDialog/dialogTitle.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomAlertDialog","type":"class","href":"widgets_custom_alert_dialog/CustomAlertDialog-class.md"}},{"name":"reverse","qualifiedName":"custom_alert_dialog.CustomAlertDialog.reverse","href":"widgets_custom_alert_dialog/CustomAlertDialog/reverse.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomAlertDialog","type":"class","href":"widgets_custom_alert_dialog/CustomAlertDialog-class.md"}},{"name":"secondaryButtonTap","qualifiedName":"custom_alert_dialog.CustomAlertDialog.secondaryButtonTap","href":"widgets_custom_alert_dialog/CustomAlertDialog/secondaryButtonTap.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomAlertDialog","type":"class","href":"widgets_custom_alert_dialog/CustomAlertDialog-class.md"}},{"name":"secondaryButtonText","qualifiedName":"custom_alert_dialog.CustomAlertDialog.secondaryButtonText","href":"widgets_custom_alert_dialog/CustomAlertDialog/secondaryButtonText.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomAlertDialog","type":"class","href":"widgets_custom_alert_dialog/CustomAlertDialog-class.md"}},{"name":"success","qualifiedName":"custom_alert_dialog.CustomAlertDialog.success","href":"widgets_custom_alert_dialog/CustomAlertDialog/success.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomAlertDialog","type":"class","href":"widgets_custom_alert_dialog/CustomAlertDialog-class.md"}},{"name":"successText","qualifiedName":"custom_alert_dialog.CustomAlertDialog.successText","href":"widgets_custom_alert_dialog/CustomAlertDialog/successText.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomAlertDialog","type":"class","href":"widgets_custom_alert_dialog/CustomAlertDialog-class.md"}},{"name":"custom_avatar","qualifiedName":"custom_avatar","href":"widgets_custom_avatar/widgets_custom_avatar-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CustomAvatar","qualifiedName":"custom_avatar.CustomAvatar","href":"widgets_custom_avatar/CustomAvatar-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"Creates a custom avatar.\nThe avatar is created using the image provided,\nor the first alphabet with a standard background color.","enclosedBy":{"name":"custom_avatar","type":"library","href":"widgets_custom_avatar/widgets_custom_avatar-library.md"}},{"name":"CustomAvatar","qualifiedName":"custom_avatar.CustomAvatar.CustomAvatar","href":"widgets_custom_avatar/CustomAvatar/CustomAvatar.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomAvatar","type":"class","href":"widgets_custom_avatar/CustomAvatar-class.md"}},{"name":"build","qualifiedName":"custom_avatar.CustomAvatar.build","href":"widgets_custom_avatar/CustomAvatar/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"CustomAvatar","type":"class","href":"widgets_custom_avatar/CustomAvatar-class.md"}},{"name":"cacheManager","qualifiedName":"custom_avatar.CustomAvatar.cacheManager","href":"widgets_custom_avatar/CustomAvatar/cacheManager.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomAvatar","type":"class","href":"widgets_custom_avatar/CustomAvatar-class.md"}},{"name":"firstAlphabet","qualifiedName":"custom_avatar.CustomAvatar.firstAlphabet","href":"widgets_custom_avatar/CustomAvatar/firstAlphabet.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomAvatar","type":"class","href":"widgets_custom_avatar/CustomAvatar-class.md"}},{"name":"fontSize","qualifiedName":"custom_avatar.CustomAvatar.fontSize","href":"widgets_custom_avatar/CustomAvatar/fontSize.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomAvatar","type":"class","href":"widgets_custom_avatar/CustomAvatar-class.md"}},{"name":"imageUrl","qualifiedName":"custom_avatar.CustomAvatar.imageUrl","href":"widgets_custom_avatar/CustomAvatar/imageUrl.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomAvatar","type":"class","href":"widgets_custom_avatar/CustomAvatar-class.md"}},{"name":"isImageNull","qualifiedName":"custom_avatar.CustomAvatar.isImageNull","href":"widgets_custom_avatar/CustomAvatar/isImageNull.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomAvatar","type":"class","href":"widgets_custom_avatar/CustomAvatar-class.md"}},{"name":"custom_drawer","qualifiedName":"custom_drawer","href":"widgets_custom_drawer/widgets_custom_drawer-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CustomDrawer","qualifiedName":"custom_drawer.CustomDrawer","href":"widgets_custom_drawer/CustomDrawer-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"Creates a custom drawer for switching organizations.","enclosedBy":{"name":"custom_drawer","type":"library","href":"widgets_custom_drawer/widgets_custom_drawer-library.md"}},{"name":"CustomDrawer","qualifiedName":"custom_drawer.CustomDrawer.CustomDrawer","href":"widgets_custom_drawer/CustomDrawer/CustomDrawer.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomDrawer","type":"class","href":"widgets_custom_drawer/CustomDrawer-class.md"}},{"name":"build","qualifiedName":"custom_drawer.CustomDrawer.build","href":"widgets_custom_drawer/CustomDrawer/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"CustomDrawer","type":"class","href":"widgets_custom_drawer/CustomDrawer-class.md"}},{"name":"exitButton","qualifiedName":"custom_drawer.CustomDrawer.exitButton","href":"widgets_custom_drawer/CustomDrawer/exitButton.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Button to exit the organization.","enclosedBy":{"name":"CustomDrawer","type":"class","href":"widgets_custom_drawer/CustomDrawer-class.md"}},{"name":"homeModel","qualifiedName":"custom_drawer.CustomDrawer.homeModel","href":"widgets_custom_drawer/CustomDrawer/homeModel.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"home model.","enclosedBy":{"name":"CustomDrawer","type":"class","href":"widgets_custom_drawer/CustomDrawer-class.md"}},{"name":"custom_drawer_view_model","qualifiedName":"custom_drawer_view_model","href":"view_model_widgets_view_models_custom_drawer_view_model/view_model_widgets_view_models_custom_drawer_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CustomDrawerViewModel","qualifiedName":"custom_drawer_view_model.CustomDrawerViewModel","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"CustomDrawerViewModel class helps to serve the data and\nto react to user's input for Custom Dialog Widget.","enclosedBy":{"name":"custom_drawer_view_model","type":"library","href":"view_model_widgets_view_models_custom_drawer_view_model/view_model_widgets_view_models_custom_drawer_view_model-library.md"}},{"name":"CustomDrawerViewModel","qualifiedName":"custom_drawer_view_model.CustomDrawerViewModel.CustomDrawerViewModel","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/CustomDrawerViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomDrawerViewModel","type":"class","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md"}},{"name":"controller","qualifiedName":"custom_drawer_view_model.CustomDrawerViewModel.controller","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/controller.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomDrawerViewModel","type":"class","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md"}},{"name":"dispose","qualifiedName":"custom_drawer_view_model.CustomDrawerViewModel.dispose","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/dispose.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Discards any resources used by the object. After this is called, the\nobject is not in a usable state and should be discarded (calls to\naddListener will throw after the object is disposed).","enclosedBy":{"name":"CustomDrawerViewModel","type":"class","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md"}},{"name":"initialize","qualifiedName":"custom_drawer_view_model.CustomDrawerViewModel.initialize","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/initialize.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomDrawerViewModel","type":"class","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md"}},{"name":"isPresentinSwitchableOrg","qualifiedName":"custom_drawer_view_model.CustomDrawerViewModel.isPresentinSwitchableOrg","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/isPresentinSwitchableOrg.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function checks switchOrg is present in the switchAbleOrg.","enclosedBy":{"name":"CustomDrawerViewModel","type":"class","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md"}},{"name":"notifyListeners","qualifiedName":"custom_drawer_view_model.CustomDrawerViewModel.notifyListeners","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/notifyListeners.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Call all the registered listeners.","enclosedBy":{"name":"CustomDrawerViewModel","type":"class","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md"}},{"name":"selectedOrg","qualifiedName":"custom_drawer_view_model.CustomDrawerViewModel.selectedOrg","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/selectedOrg.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomDrawerViewModel","type":"class","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md"}},{"name":"setSelectedOrganizationName","qualifiedName":"custom_drawer_view_model.CustomDrawerViewModel.setSelectedOrganizationName","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/setSelectedOrganizationName.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function switches the current organization to new organization.","enclosedBy":{"name":"CustomDrawerViewModel","type":"class","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md"}},{"name":"switchAbleOrg","qualifiedName":"custom_drawer_view_model.CustomDrawerViewModel.switchAbleOrg","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/switchAbleOrg.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomDrawerViewModel","type":"class","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md"}},{"name":"switchOrg","qualifiedName":"custom_drawer_view_model.CustomDrawerViewModel.switchOrg","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/switchOrg.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function switch the current organization to another organization,\nif the organization(want switch to) is present.","enclosedBy":{"name":"CustomDrawerViewModel","type":"class","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md"}},{"name":"targets","qualifiedName":"custom_drawer_view_model.CustomDrawerViewModel.targets","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/targets.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomDrawerViewModel","type":"class","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md"}},{"name":"tutorialCoachMark","qualifiedName":"custom_drawer_view_model.CustomDrawerViewModel.tutorialCoachMark","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/tutorialCoachMark.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomDrawerViewModel","type":"class","href":"view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md"}},{"name":"custom_list_tile","qualifiedName":"custom_list_tile","href":"widgets_custom_list_tile/widgets_custom_list_tile-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CustomListTile","qualifiedName":"custom_list_tile.CustomListTile","href":"widgets_custom_list_tile/CustomListTile-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"Returns a widget for rendering Customized tiles.\nA Tile shows the org info, user info, options that on tap user & org info.","enclosedBy":{"name":"custom_list_tile","type":"library","href":"widgets_custom_list_tile/widgets_custom_list_tile-library.md"}},{"name":"CustomListTile","qualifiedName":"custom_list_tile.CustomListTile.CustomListTile","href":"widgets_custom_list_tile/CustomListTile/CustomListTile.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomListTile","type":"class","href":"widgets_custom_list_tile/CustomListTile-class.md"}},{"name":"build","qualifiedName":"custom_list_tile.CustomListTile.build","href":"widgets_custom_list_tile/CustomListTile/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"CustomListTile","type":"class","href":"widgets_custom_list_tile/CustomListTile-class.md"}},{"name":"index","qualifiedName":"custom_list_tile.CustomListTile.index","href":"widgets_custom_list_tile/CustomListTile/index.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomListTile","type":"class","href":"widgets_custom_list_tile/CustomListTile-class.md"}},{"name":"onTapOption","qualifiedName":"custom_list_tile.CustomListTile.onTapOption","href":"widgets_custom_list_tile/CustomListTile/onTapOption.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomListTile","type":"class","href":"widgets_custom_list_tile/CustomListTile-class.md"}},{"name":"onTapOrgInfo","qualifiedName":"custom_list_tile.CustomListTile.onTapOrgInfo","href":"widgets_custom_list_tile/CustomListTile/onTapOrgInfo.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomListTile","type":"class","href":"widgets_custom_list_tile/CustomListTile-class.md"}},{"name":"onTapUserInfo","qualifiedName":"custom_list_tile.CustomListTile.onTapUserInfo","href":"widgets_custom_list_tile/CustomListTile/onTapUserInfo.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomListTile","type":"class","href":"widgets_custom_list_tile/CustomListTile-class.md"}},{"name":"option","qualifiedName":"custom_list_tile.CustomListTile.option","href":"widgets_custom_list_tile/CustomListTile/option.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomListTile","type":"class","href":"widgets_custom_list_tile/CustomListTile-class.md"}},{"name":"orgInfo","qualifiedName":"custom_list_tile.CustomListTile.orgInfo","href":"widgets_custom_list_tile/CustomListTile/orgInfo.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomListTile","type":"class","href":"widgets_custom_list_tile/CustomListTile-class.md"}},{"name":"showIcon","qualifiedName":"custom_list_tile.CustomListTile.showIcon","href":"widgets_custom_list_tile/CustomListTile/showIcon.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomListTile","type":"class","href":"widgets_custom_list_tile/CustomListTile-class.md"}},{"name":"type","qualifiedName":"custom_list_tile.CustomListTile.type","href":"widgets_custom_list_tile/CustomListTile/type.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomListTile","type":"class","href":"widgets_custom_list_tile/CustomListTile-class.md"}},{"name":"userInfo","qualifiedName":"custom_list_tile.CustomListTile.userInfo","href":"widgets_custom_list_tile/CustomListTile/userInfo.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomListTile","type":"class","href":"widgets_custom_list_tile/CustomListTile-class.md"}},{"name":"custom_progress_dialog","qualifiedName":"custom_progress_dialog","href":"widgets_custom_progress_dialog/widgets_custom_progress_dialog-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CustomProgressDialog","qualifiedName":"custom_progress_dialog.CustomProgressDialog","href":"widgets_custom_progress_dialog/CustomProgressDialog-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"A progress dialogue which shows an activity indicator\nspinning clockwise if there is internet connectivity.\nOtherwise, it shows no-internet image and text.","enclosedBy":{"name":"custom_progress_dialog","type":"library","href":"widgets_custom_progress_dialog/widgets_custom_progress_dialog-library.md"}},{"name":"CustomProgressDialog","qualifiedName":"custom_progress_dialog.CustomProgressDialog.CustomProgressDialog","href":"widgets_custom_progress_dialog/CustomProgressDialog/CustomProgressDialog.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomProgressDialog","type":"class","href":"widgets_custom_progress_dialog/CustomProgressDialog-class.md"}},{"name":"build","qualifiedName":"custom_progress_dialog.CustomProgressDialog.build","href":"widgets_custom_progress_dialog/CustomProgressDialog/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"CustomProgressDialog","type":"class","href":"widgets_custom_progress_dialog/CustomProgressDialog-class.md"}},{"name":"custom_theme","qualifiedName":"custom_theme","href":"constants_custom_theme/constants_custom_theme-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"TalawaTheme","qualifiedName":"custom_theme.TalawaTheme","href":"constants_custom_theme/TalawaTheme-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This file contains various custom themes.\nFor instance, lightTheme, darkTheme, _lightTextTheme, _darkTextTheme, etc.\nThese are imported to other files/widgets to apply the required themes.","enclosedBy":{"name":"custom_theme","type":"library","href":"constants_custom_theme/constants_custom_theme-library.md"}},{"name":"TalawaTheme","qualifiedName":"custom_theme.TalawaTheme.TalawaTheme","href":"constants_custom_theme/TalawaTheme/TalawaTheme.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TalawaTheme","type":"class","href":"constants_custom_theme/TalawaTheme-class.md"}},{"name":"darkTheme","qualifiedName":"custom_theme.TalawaTheme.darkTheme","href":"constants_custom_theme/TalawaTheme/darkTheme.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TalawaTheme","type":"class","href":"constants_custom_theme/TalawaTheme-class.md"}},{"name":"lightTheme","qualifiedName":"custom_theme.TalawaTheme.lightTheme","href":"constants_custom_theme/TalawaTheme/lightTheme.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TalawaTheme","type":"class","href":"constants_custom_theme/TalawaTheme-class.md"}},{"name":"database_mutation_functions","qualifiedName":"database_mutation_functions","href":"services_database_mutation_functions/services_database_mutation_functions-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"DataBaseMutationFunctions","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"DataBaseMutationFunctions class provides different services that are under the context of graphQL mutations and queries.","enclosedBy":{"name":"database_mutation_functions","type":"library","href":"services_database_mutation_functions/services_database_mutation_functions-library.md"}},{"name":"DataBaseMutationFunctions","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.DataBaseMutationFunctions","href":"services_database_mutation_functions/DataBaseMutationFunctions/DataBaseMutationFunctions.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"clientAuth","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.clientAuth","href":"services_database_mutation_functions/DataBaseMutationFunctions/clientAuth.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Client Auth for handling authenticated request.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"clientNonAuth","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.clientNonAuth","href":"services_database_mutation_functions/DataBaseMutationFunctions/clientNonAuth.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Client Auth for handling non-authenticated request.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"emailAccountPresent","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.emailAccountPresent","href":"services_database_mutation_functions/DataBaseMutationFunctions/emailAccountPresent.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Graphql error for handling.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"encounteredExceptionOrError","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.encounteredExceptionOrError","href":"services_database_mutation_functions/DataBaseMutationFunctions/encounteredExceptionOrError.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to check if any exceptions or error encountered. The return type is boolean.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"fetchOrgById","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.fetchOrgById","href":"services_database_mutation_functions/DataBaseMutationFunctions/fetchOrgById.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function fetch the organization using the id passed.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"gqlAuthMutation","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.gqlAuthMutation","href":"services_database_mutation_functions/DataBaseMutationFunctions/gqlAuthMutation.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to run the graph-ql mutation for authenticated user.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"gqlAuthQuery","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.gqlAuthQuery","href":"services_database_mutation_functions/DataBaseMutationFunctions/gqlAuthQuery.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to run the graph-ql query for authentication.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"gqlNonAuthMutation","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.gqlNonAuthMutation","href":"services_database_mutation_functions/DataBaseMutationFunctions/gqlNonAuthMutation.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to run the graph-ql mutation to authenticate the non signed-in user.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"gqlNonAuthQuery","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.gqlNonAuthQuery","href":"services_database_mutation_functions/DataBaseMutationFunctions/gqlNonAuthQuery.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to run the graph-ql query for the non signed-in user.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"init","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.init","href":"services_database_mutation_functions/DataBaseMutationFunctions/init.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"initialization function.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"memberRequestExist","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.memberRequestExist","href":"services_database_mutation_functions/DataBaseMutationFunctions/memberRequestExist.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Graphql error for handling.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"notifFeatureNotInstalled","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.notifFeatureNotInstalled","href":"services_database_mutation_functions/DataBaseMutationFunctions/notifFeatureNotInstalled.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Graphql error for handling.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"organizationNotFound","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.organizationNotFound","href":"services_database_mutation_functions/DataBaseMutationFunctions/organizationNotFound.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Graphql error for handling.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"refreshAccessToken","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.refreshAccessToken","href":"services_database_mutation_functions/DataBaseMutationFunctions/refreshAccessToken.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to refresh the Authenication token to access the application.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"refreshAccessTokenExpiredException","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.refreshAccessTokenExpiredException","href":"services_database_mutation_functions/DataBaseMutationFunctions/refreshAccessTokenExpiredException.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Graphql error for handling.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"userNotAuthenticated","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.userNotAuthenticated","href":"services_database_mutation_functions/DataBaseMutationFunctions/userNotAuthenticated.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Graphql error for handling.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"userNotFound","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.userNotFound","href":"services_database_mutation_functions/DataBaseMutationFunctions/userNotFound.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Graphql error for handling.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"wrongCredentials","qualifiedName":"database_mutation_functions.DataBaseMutationFunctions.wrongCredentials","href":"services_database_mutation_functions/DataBaseMutationFunctions/wrongCredentials.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Graphql error for handling.","enclosedBy":{"name":"DataBaseMutationFunctions","type":"class","href":"services_database_mutation_functions/DataBaseMutationFunctions-class.md"}},{"name":"date_time_picker","qualifiedName":"date_time_picker","href":"widgets_date_time_picker/widgets_date_time_picker-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"customDatePicker","qualifiedName":"date_time_picker.customDatePicker","href":"widgets_date_time_picker/customDatePicker.md","type":"function","overriddenDepth":0,"packageName":"talawa","desc":"Shows a dialog containing a Material Design date picker.","enclosedBy":{"name":"date_time_picker","type":"library","href":"widgets_date_time_picker/widgets_date_time_picker-library.md"}},{"name":"customTimePicker","qualifiedName":"date_time_picker.customTimePicker","href":"widgets_date_time_picker/customTimePicker.md","type":"function","overriddenDepth":0,"packageName":"talawa","desc":"Shows a dialog containing a material design time picker.","enclosedBy":{"name":"date_time_picker","type":"library","href":"widgets_date_time_picker/widgets_date_time_picker-library.md"}},{"name":"direct_chat_demo_data","qualifiedName":"direct_chat_demo_data","href":"demo_server_data_direct_chat_demo_data/demo_server_data_direct_chat_demo_data-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"directChatDemoData","qualifiedName":"direct_chat_demo_data.directChatDemoData","href":"demo_server_data_direct_chat_demo_data/directChatDemoData-constant.md","type":"top-level constant","overriddenDepth":0,"packageName":"talawa","desc":"This file contains demo data.","enclosedBy":{"name":"direct_chat_demo_data","type":"library","href":"demo_server_data_direct_chat_demo_data/demo_server_data_direct_chat_demo_data-library.md"}},{"name":"direct_chat_view_model","qualifiedName":"direct_chat_view_model","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"DirectChatViewModel","qualifiedName":"direct_chat_view_model.DirectChatViewModel","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This ViewModel class have different functions that are used interact with model in the context of Direct Chat.","enclosedBy":{"name":"direct_chat_view_model","type":"library","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model-library.md"}},{"name":"DirectChatViewModel","qualifiedName":"direct_chat_view_model.DirectChatViewModel.DirectChatViewModel","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/DirectChatViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DirectChatViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md"}},{"name":"chatMessagesByUser","qualifiedName":"direct_chat_view_model.DirectChatViewModel.chatMessagesByUser","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatMessagesByUser.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DirectChatViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md"}},{"name":"chatName","qualifiedName":"direct_chat_view_model.DirectChatViewModel.chatName","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatName.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DirectChatViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md"}},{"name":"chatState","qualifiedName":"direct_chat_view_model.DirectChatViewModel.chatState","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatState.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DirectChatViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md"}},{"name":"chats","qualifiedName":"direct_chat_view_model.DirectChatViewModel.chats","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chats.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DirectChatViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md"}},{"name":"dispose","qualifiedName":"direct_chat_view_model.DirectChatViewModel.dispose","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/dispose.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Discards any resources used by the object. After this is called, the\nobject is not in a usable state and should be discarded (calls to\naddListener will throw after the object is disposed).","enclosedBy":{"name":"DirectChatViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md"}},{"name":"getChatMessages","qualifiedName":"direct_chat_view_model.DirectChatViewModel.getChatMessages","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/getChatMessages.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function get all messages for a chat.","enclosedBy":{"name":"DirectChatViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md"}},{"name":"initialise","qualifiedName":"direct_chat_view_model.DirectChatViewModel.initialise","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/initialise.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DirectChatViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md"}},{"name":"listKey","qualifiedName":"direct_chat_view_model.DirectChatViewModel.listKey","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/listKey.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DirectChatViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md"}},{"name":"name","qualifiedName":"direct_chat_view_model.DirectChatViewModel.name","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/name.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DirectChatViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md"}},{"name":"refreshChats","qualifiedName":"direct_chat_view_model.DirectChatViewModel.refreshChats","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/refreshChats.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function refresh the chats.","enclosedBy":{"name":"DirectChatViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md"}},{"name":"sendMessageToDirectChat","qualifiedName":"direct_chat_view_model.DirectChatViewModel.sendMessageToDirectChat","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/sendMessageToDirectChat.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function send the message to Direct Chat.","enclosedBy":{"name":"DirectChatViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md"}},{"name":"direct_chats","qualifiedName":"direct_chats","href":"views_after_auth_screens_chat_direct_chats/views_after_auth_screens_chat_direct_chats-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ChatTile","qualifiedName":"direct_chats.ChatTile","href":"views_after_auth_screens_chat_direct_chats/ChatTile-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"ChatTile return a widget for a tile in the list of Direct Chats in the Chat List Screen.","enclosedBy":{"name":"direct_chats","type":"library","href":"views_after_auth_screens_chat_direct_chats/views_after_auth_screens_chat_direct_chats-library.md"}},{"name":"ChatTile","qualifiedName":"direct_chats.ChatTile.ChatTile","href":"views_after_auth_screens_chat_direct_chats/ChatTile/ChatTile.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatTile","type":"class","href":"views_after_auth_screens_chat_direct_chats/ChatTile-class.md"}},{"name":"build","qualifiedName":"direct_chats.ChatTile.build","href":"views_after_auth_screens_chat_direct_chats/ChatTile/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"ChatTile","type":"class","href":"views_after_auth_screens_chat_direct_chats/ChatTile-class.md"}},{"name":"chat","qualifiedName":"direct_chats.ChatTile.chat","href":"views_after_auth_screens_chat_direct_chats/ChatTile/chat.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatTile","type":"class","href":"views_after_auth_screens_chat_direct_chats/ChatTile-class.md"}},{"name":"model","qualifiedName":"direct_chats.ChatTile.model","href":"views_after_auth_screens_chat_direct_chats/ChatTile/model.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatTile","type":"class","href":"views_after_auth_screens_chat_direct_chats/ChatTile-class.md"}},{"name":"DirectChats","qualifiedName":"direct_chats.DirectChats","href":"views_after_auth_screens_chat_direct_chats/DirectChats-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"DirectChats return a statelessWidget for rendering all the directs\nchats of the current user in the Chat List Screen","enclosedBy":{"name":"direct_chats","type":"library","href":"views_after_auth_screens_chat_direct_chats/views_after_auth_screens_chat_direct_chats-library.md"}},{"name":"DirectChats","qualifiedName":"direct_chats.DirectChats.DirectChats","href":"views_after_auth_screens_chat_direct_chats/DirectChats/DirectChats.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DirectChats","type":"class","href":"views_after_auth_screens_chat_direct_chats/DirectChats-class.md"}},{"name":"build","qualifiedName":"direct_chats.DirectChats.build","href":"views_after_auth_screens_chat_direct_chats/DirectChats/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"DirectChats","type":"class","href":"views_after_auth_screens_chat_direct_chats/DirectChats-class.md"}},{"name":"edit_event_page","qualifiedName":"edit_event_page","href":"views_after_auth_screens_events_edit_event_page/views_after_auth_screens_events_edit_event_page-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EditEventPage","qualifiedName":"edit_event_page.EditEventPage","href":"views_after_auth_screens_events_edit_event_page/EditEventPage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"EditEventPage returns a widget that has mutable state _EditEventPageState.","enclosedBy":{"name":"edit_event_page","type":"library","href":"views_after_auth_screens_events_edit_event_page/views_after_auth_screens_events_edit_event_page-library.md"}},{"name":"EditEventPage","qualifiedName":"edit_event_page.EditEventPage.EditEventPage","href":"views_after_auth_screens_events_edit_event_page/EditEventPage/EditEventPage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventPage","type":"class","href":"views_after_auth_screens_events_edit_event_page/EditEventPage-class.md"}},{"name":"createState","qualifiedName":"edit_event_page.EditEventPage.createState","href":"views_after_auth_screens_events_edit_event_page/EditEventPage/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"EditEventPage","type":"class","href":"views_after_auth_screens_events_edit_event_page/EditEventPage-class.md"}},{"name":"event","qualifiedName":"edit_event_page.EditEventPage.event","href":"views_after_auth_screens_events_edit_event_page/EditEventPage/event.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventPage","type":"class","href":"views_after_auth_screens_events_edit_event_page/EditEventPage-class.md"}},{"name":"edit_event_view_model","qualifiedName":"edit_event_view_model","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/view_model_after_auth_view_models_event_view_models_edit_event_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EditEventViewModel","qualifiedName":"edit_event_view_model.EditEventViewModel","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"EditEventViewModel class have methods to interact with model in\nthe context of editing the event in the organization.","enclosedBy":{"name":"edit_event_view_model","type":"library","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/view_model_after_auth_view_models_event_view_models_edit_event_view_model-library.md"}},{"name":"EditEventViewModel","qualifiedName":"edit_event_view_model.EditEventViewModel.EditEventViewModel","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/EditEventViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"descriptionFocus","qualifiedName":"edit_event_view_model.EditEventViewModel.descriptionFocus","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/descriptionFocus.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"eventDescriptionTextController","qualifiedName":"edit_event_view_model.EditEventViewModel.eventDescriptionTextController","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventDescriptionTextController.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"eventEndDate","qualifiedName":"edit_event_view_model.EditEventViewModel.eventEndDate","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventEndDate.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"eventEndTime","qualifiedName":"edit_event_view_model.EditEventViewModel.eventEndTime","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventEndTime.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"eventLocationTextController","qualifiedName":"edit_event_view_model.EditEventViewModel.eventLocationTextController","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventLocationTextController.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"eventStartDate","qualifiedName":"edit_event_view_model.EditEventViewModel.eventStartDate","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventStartDate.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"eventStartTime","qualifiedName":"edit_event_view_model.EditEventViewModel.eventStartTime","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventStartTime.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"eventTitleTextController","qualifiedName":"edit_event_view_model.EditEventViewModel.eventTitleTextController","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventTitleTextController.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"formKey","qualifiedName":"edit_event_view_model.EditEventViewModel.formKey","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/formKey.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"initialize","qualifiedName":"edit_event_view_model.EditEventViewModel.initialize","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/initialize.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"isPublicSwitch","qualifiedName":"edit_event_view_model.EditEventViewModel.isPublicSwitch","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/isPublicSwitch.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"isRegisterableSwitch","qualifiedName":"edit_event_view_model.EditEventViewModel.isRegisterableSwitch","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/isRegisterableSwitch.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"locationFocus","qualifiedName":"edit_event_view_model.EditEventViewModel.locationFocus","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/locationFocus.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"titleFocus","qualifiedName":"edit_event_view_model.EditEventViewModel.titleFocus","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/titleFocus.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"updateEvent","qualifiedName":"edit_event_view_model.EditEventViewModel.updateEvent","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/updateEvent.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to update an event.\nThe function uses editEvent function provided by eventService service.","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"validate","qualifiedName":"edit_event_view_model.EditEventViewModel.validate","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/validate.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md"}},{"name":"edit_events_form","qualifiedName":"edit_events_form","href":"views_after_auth_screens_events_edit_events_form/views_after_auth_screens_events_edit_events_form-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EditEventForm","qualifiedName":"edit_events_form.EditEventForm","href":"views_after_auth_screens_events_edit_events_form/EditEventForm-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"EditEventForm returns a widget of a Form for editing an event.\nThis widget is used in EditEventPage widget.","enclosedBy":{"name":"edit_events_form","type":"library","href":"views_after_auth_screens_events_edit_events_form/views_after_auth_screens_events_edit_events_form-library.md"}},{"name":"EditEventForm","qualifiedName":"edit_events_form.EditEventForm.EditEventForm","href":"views_after_auth_screens_events_edit_events_form/EditEventForm/EditEventForm.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventForm","type":"class","href":"views_after_auth_screens_events_edit_events_form/EditEventForm-class.md"}},{"name":"build","qualifiedName":"edit_events_form.EditEventForm.build","href":"views_after_auth_screens_events_edit_events_form/EditEventForm/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"EditEventForm","type":"class","href":"views_after_auth_screens_events_edit_events_form/EditEventForm-class.md"}},{"name":"model","qualifiedName":"edit_events_form.EditEventForm.model","href":"views_after_auth_screens_events_edit_events_form/EditEventForm/model.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditEventForm","type":"class","href":"views_after_auth_screens_events_edit_events_form/EditEventForm-class.md"}},{"name":"edit_profile_page","qualifiedName":"edit_profile_page","href":"views_after_auth_screens_profile_edit_profile_page/views_after_auth_screens_profile_edit_profile_page-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EditProfilePage","qualifiedName":"edit_profile_page.EditProfilePage","href":"views_after_auth_screens_profile_edit_profile_page/EditProfilePage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"EditProfilePage returns a widget that has mutable state _EditProfilePageState.","enclosedBy":{"name":"edit_profile_page","type":"library","href":"views_after_auth_screens_profile_edit_profile_page/views_after_auth_screens_profile_edit_profile_page-library.md"}},{"name":"EditProfilePage","qualifiedName":"edit_profile_page.EditProfilePage.EditProfilePage","href":"views_after_auth_screens_profile_edit_profile_page/EditProfilePage/EditProfilePage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditProfilePage","type":"class","href":"views_after_auth_screens_profile_edit_profile_page/EditProfilePage-class.md"}},{"name":"createState","qualifiedName":"edit_profile_page.EditProfilePage.createState","href":"views_after_auth_screens_profile_edit_profile_page/EditProfilePage/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"EditProfilePage","type":"class","href":"views_after_auth_screens_profile_edit_profile_page/EditProfilePage-class.md"}},{"name":"edit_profile_view_model","qualifiedName":"edit_profile_view_model","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EditProfilePageViewModel","qualifiedName":"edit_profile_view_model.EditProfilePageViewModel","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"EditProfilePageViewModel class helps to interact with model to serve data to edit profile views.","enclosedBy":{"name":"edit_profile_view_model","type":"library","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model-library.md"}},{"name":"EditProfilePageViewModel","qualifiedName":"edit_profile_view_model.EditProfilePageViewModel.EditProfilePageViewModel","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/EditProfilePageViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md"}},{"name":"databaseService","qualifiedName":"edit_profile_view_model.EditProfilePageViewModel.databaseService","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/databaseService.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md"}},{"name":"firstNameFocus","qualifiedName":"edit_profile_view_model.EditProfilePageViewModel.firstNameFocus","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/firstNameFocus.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md"}},{"name":"firstNameTextController","qualifiedName":"edit_profile_view_model.EditProfilePageViewModel.firstNameTextController","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/firstNameTextController.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md"}},{"name":"getImageFromGallery","qualifiedName":"edit_profile_view_model.EditProfilePageViewModel.getImageFromGallery","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/getImageFromGallery.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to get the image from gallery.\nThe function uses the _multiMediaPickerService services.","enclosedBy":{"name":"EditProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md"}},{"name":"imageFile","qualifiedName":"edit_profile_view_model.EditProfilePageViewModel.imageFile","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/imageFile.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md"}},{"name":"initialize","qualifiedName":"edit_profile_view_model.EditProfilePageViewModel.initialize","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/initialize.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md"}},{"name":"lastNameFocus","qualifiedName":"edit_profile_view_model.EditProfilePageViewModel.lastNameFocus","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/lastNameFocus.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md"}},{"name":"lastNameTextController","qualifiedName":"edit_profile_view_model.EditProfilePageViewModel.lastNameTextController","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/lastNameTextController.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md"}},{"name":"removeImage","qualifiedName":"edit_profile_view_model.EditProfilePageViewModel.removeImage","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/removeImage.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function remove the selected image.","enclosedBy":{"name":"EditProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md"}},{"name":"user","qualifiedName":"edit_profile_view_model.EditProfilePageViewModel.user","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/user.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md"}},{"name":"edit_task_page","qualifiedName":"edit_task_page","href":"views_after_auth_screens_tasks_edit_task_page/views_after_auth_screens_tasks_edit_task_page-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EditTaskPage","qualifiedName":"edit_task_page.EditTaskPage","href":"views_after_auth_screens_tasks_edit_task_page/EditTaskPage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"EditTaskPage returns a widget for page to edit the task for the user.","enclosedBy":{"name":"edit_task_page","type":"library","href":"views_after_auth_screens_tasks_edit_task_page/views_after_auth_screens_tasks_edit_task_page-library.md"}},{"name":"EditTaskPage","qualifiedName":"edit_task_page.EditTaskPage.EditTaskPage","href":"views_after_auth_screens_tasks_edit_task_page/EditTaskPage/EditTaskPage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditTaskPage","type":"class","href":"views_after_auth_screens_tasks_edit_task_page/EditTaskPage-class.md"}},{"name":"build","qualifiedName":"edit_task_page.EditTaskPage.build","href":"views_after_auth_screens_tasks_edit_task_page/EditTaskPage/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"EditTaskPage","type":"class","href":"views_after_auth_screens_tasks_edit_task_page/EditTaskPage-class.md"}},{"name":"task","qualifiedName":"edit_task_page.EditTaskPage.task","href":"views_after_auth_screens_tasks_edit_task_page/EditTaskPage/task.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EditTaskPage","type":"class","href":"views_after_auth_screens_tasks_edit_task_page/EditTaskPage-class.md"}},{"name":"enums","qualifiedName":"enums","href":"enums_enums/enums_enums-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CallFor","qualifiedName":"enums.CallFor","href":"enums_enums/CallFor.md","type":"enum","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"enums","type":"library","href":"enums_enums/enums_enums-library.md"}},{"name":"CallFor","qualifiedName":"enums.CallFor.CallFor","href":"enums_enums/CallFor/CallFor.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CallFor","type":"enum","href":"enums_enums/CallFor.md"}},{"name":"values","qualifiedName":"enums.CallFor.values","href":"enums_enums/CallFor/values-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"A constant List of the values in this enum, in order of their declaration.","enclosedBy":{"name":"CallFor","type":"enum","href":"enums_enums/CallFor.md"}},{"name":"ChatState","qualifiedName":"enums.ChatState","href":"enums_enums/ChatState.md","type":"enum","overriddenDepth":0,"packageName":"talawa","desc":"Represents the state of the chat","enclosedBy":{"name":"enums","type":"library","href":"enums_enums/enums_enums-library.md"}},{"name":"ChatState","qualifiedName":"enums.ChatState.ChatState","href":"enums_enums/ChatState/ChatState.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChatState","type":"enum","href":"enums_enums/ChatState.md"}},{"name":"values","qualifiedName":"enums.ChatState.values","href":"enums_enums/ChatState/values-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"A constant List of the values in this enum, in order of their declaration.","enclosedBy":{"name":"ChatState","type":"enum","href":"enums_enums/ChatState.md"}},{"name":"MessageType","qualifiedName":"enums.MessageType","href":"enums_enums/MessageType.md","type":"enum","overriddenDepth":0,"packageName":"talawa","desc":"Represents the type of the Message","enclosedBy":{"name":"enums","type":"library","href":"enums_enums/enums_enums-library.md"}},{"name":"MessageType","qualifiedName":"enums.MessageType.MessageType","href":"enums_enums/MessageType/MessageType.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MessageType","type":"enum","href":"enums_enums/MessageType.md"}},{"name":"values","qualifiedName":"enums.MessageType.values","href":"enums_enums/MessageType/values-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"A constant List of the values in this enum, in order of their declaration.","enclosedBy":{"name":"MessageType","type":"enum","href":"enums_enums/MessageType.md"}},{"name":"ModalSheet","qualifiedName":"enums.ModalSheet","href":"enums_enums/ModalSheet.md","type":"enum","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"enums","type":"library","href":"enums_enums/enums_enums-library.md"}},{"name":"ModalSheet","qualifiedName":"enums.ModalSheet.ModalSheet","href":"enums_enums/ModalSheet/ModalSheet.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ModalSheet","type":"enum","href":"enums_enums/ModalSheet.md"}},{"name":"values","qualifiedName":"enums.ModalSheet.values","href":"enums_enums/ModalSheet/values-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"A constant List of the values in this enum, in order of their declaration.","enclosedBy":{"name":"ModalSheet","type":"enum","href":"enums_enums/ModalSheet.md"}},{"name":"TileType","qualifiedName":"enums.TileType","href":"enums_enums/TileType.md","type":"enum","overriddenDepth":0,"packageName":"talawa","desc":"Represents the type of the tile","enclosedBy":{"name":"enums","type":"library","href":"enums_enums/enums_enums-library.md"}},{"name":"TileType","qualifiedName":"enums.TileType.TileType","href":"enums_enums/TileType/TileType.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TileType","type":"enum","href":"enums_enums/TileType.md"}},{"name":"values","qualifiedName":"enums.TileType.values","href":"enums_enums/TileType/values-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"A constant List of the values in this enum, in order of their declaration.","enclosedBy":{"name":"TileType","type":"enum","href":"enums_enums/TileType.md"}},{"name":"ViewState","qualifiedName":"enums.ViewState","href":"enums_enums/ViewState.md","type":"enum","overriddenDepth":0,"packageName":"talawa","desc":"This file contains different enums.\nThe enum keyword is used to define an enumeration type in Dart.\nThe use case of enumeration is to store finite data members under the same type definition.\nRepresents the state of the view","enclosedBy":{"name":"enums","type":"library","href":"enums_enums/enums_enums-library.md"}},{"name":"ViewState","qualifiedName":"enums.ViewState.ViewState","href":"enums_enums/ViewState/ViewState.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ViewState","type":"enum","href":"enums_enums/ViewState.md"}},{"name":"values","qualifiedName":"enums.ViewState.values","href":"enums_enums/ViewState/values-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"A constant List of the values in this enum, in order of their declaration.","enclosedBy":{"name":"ViewState","type":"enum","href":"enums_enums/ViewState.md"}},{"name":"event_calendar","qualifiedName":"event_calendar","href":"views_after_auth_screens_events_event_calendar/views_after_auth_screens_events_event_calendar-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EventCalendar","qualifiedName":"event_calendar.EventCalendar","href":"views_after_auth_screens_events_event_calendar/EventCalendar-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"EventCalendar returns a widget that has mutable state _EventCalendarState.","enclosedBy":{"name":"event_calendar","type":"library","href":"views_after_auth_screens_events_event_calendar/views_after_auth_screens_events_event_calendar-library.md"}},{"name":"EventCalendar","qualifiedName":"event_calendar.EventCalendar.EventCalendar","href":"views_after_auth_screens_events_event_calendar/EventCalendar/EventCalendar.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventCalendar","type":"class","href":"views_after_auth_screens_events_event_calendar/EventCalendar-class.md"}},{"name":"createState","qualifiedName":"event_calendar.EventCalendar.createState","href":"views_after_auth_screens_events_event_calendar/EventCalendar/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"EventCalendar","type":"class","href":"views_after_auth_screens_events_event_calendar/EventCalendar-class.md"}},{"name":"eventList","qualifiedName":"event_calendar.EventCalendar.eventList","href":"views_after_auth_screens_events_event_calendar/EventCalendar/eventList.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventCalendar","type":"class","href":"views_after_auth_screens_events_event_calendar/EventCalendar-class.md"}},{"name":"event_card","qualifiedName":"event_card","href":"widgets_event_card/widgets_event_card-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EventCard","qualifiedName":"event_card.EventCard","href":"widgets_event_card/EventCard-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class returns the EventCard widget.","enclosedBy":{"name":"event_card","type":"library","href":"widgets_event_card/widgets_event_card-library.md"}},{"name":"EventCard","qualifiedName":"event_card.EventCard.EventCard","href":"widgets_event_card/EventCard/EventCard.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventCard","type":"class","href":"widgets_event_card/EventCard-class.md"}},{"name":"build","qualifiedName":"event_card.EventCard.build","href":"widgets_event_card/EventCard/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"EventCard","type":"class","href":"widgets_event_card/EventCard-class.md"}},{"name":"event","qualifiedName":"event_card.EventCard.event","href":"widgets_event_card/EventCard/event.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventCard","type":"class","href":"widgets_event_card/EventCard-class.md"}},{"name":"eventTitleHighlightedText","qualifiedName":"event_card.EventCard.eventTitleHighlightedText","href":"widgets_event_card/EventCard/eventTitleHighlightedText.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventCard","type":"class","href":"widgets_event_card/EventCard-class.md"}},{"name":"eventTitleNormalText","qualifiedName":"event_card.EventCard.eventTitleNormalText","href":"widgets_event_card/EventCard/eventTitleNormalText.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventCard","type":"class","href":"widgets_event_card/EventCard-class.md"}},{"name":"isSearchItem","qualifiedName":"event_card.EventCard.isSearchItem","href":"widgets_event_card/EventCard/isSearchItem.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventCard","type":"class","href":"widgets_event_card/EventCard-class.md"}},{"name":"event_card_view_model","qualifiedName":"event_card_view_model","href":"view_model_widgets_view_models_event_card_view_model/view_model_widgets_view_models_event_card_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"event_chats","qualifiedName":"event_chats","href":"views_after_auth_screens_chat_event_chats/views_after_auth_screens_chat_event_chats-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EventChats","qualifiedName":"event_chats.EventChats","href":"views_after_auth_screens_chat_event_chats/EventChats-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"EventChats return a statelessWidget for rendering all the events\nchats of the current user in the Chat List Screen","enclosedBy":{"name":"event_chats","type":"library","href":"views_after_auth_screens_chat_event_chats/views_after_auth_screens_chat_event_chats-library.md"}},{"name":"EventChats","qualifiedName":"event_chats.EventChats.EventChats","href":"views_after_auth_screens_chat_event_chats/EventChats/EventChats.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventChats","type":"class","href":"views_after_auth_screens_chat_event_chats/EventChats-class.md"}},{"name":"build","qualifiedName":"event_chats.EventChats.build","href":"views_after_auth_screens_chat_event_chats/EventChats/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"EventChats","type":"class","href":"views_after_auth_screens_chat_event_chats/EventChats-class.md"}},{"name":"event_date_time_tile","qualifiedName":"event_date_time_tile","href":"widgets_event_date_time_tile/widgets_event_date_time_tile-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"DateTimeTile","qualifiedName":"event_date_time_tile.DateTimeTile","href":"widgets_event_date_time_tile/DateTimeTile-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"Returns a widget tile(item) for displaying date and time.","enclosedBy":{"name":"event_date_time_tile","type":"library","href":"widgets_event_date_time_tile/widgets_event_date_time_tile-library.md"}},{"name":"DateTimeTile","qualifiedName":"event_date_time_tile.DateTimeTile.DateTimeTile","href":"widgets_event_date_time_tile/DateTimeTile/DateTimeTile.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DateTimeTile","type":"class","href":"widgets_event_date_time_tile/DateTimeTile-class.md"}},{"name":"build","qualifiedName":"event_date_time_tile.DateTimeTile.build","href":"widgets_event_date_time_tile/DateTimeTile/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"DateTimeTile","type":"class","href":"widgets_event_date_time_tile/DateTimeTile-class.md"}},{"name":"date","qualifiedName":"event_date_time_tile.DateTimeTile.date","href":"widgets_event_date_time_tile/DateTimeTile/date.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DateTimeTile","type":"class","href":"widgets_event_date_time_tile/DateTimeTile-class.md"}},{"name":"setDate","qualifiedName":"event_date_time_tile.DateTimeTile.setDate","href":"widgets_event_date_time_tile/DateTimeTile/setDate.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DateTimeTile","type":"class","href":"widgets_event_date_time_tile/DateTimeTile-class.md"}},{"name":"setTime","qualifiedName":"event_date_time_tile.DateTimeTile.setTime","href":"widgets_event_date_time_tile/DateTimeTile/setTime.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DateTimeTile","type":"class","href":"widgets_event_date_time_tile/DateTimeTile-class.md"}},{"name":"time","qualifiedName":"event_date_time_tile.DateTimeTile.time","href":"widgets_event_date_time_tile/DateTimeTile/time.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DateTimeTile","type":"class","href":"widgets_event_date_time_tile/DateTimeTile-class.md"}},{"name":"event_info_body","qualifiedName":"event_info_body","href":"views_after_auth_screens_events_event_info_body/views_after_auth_screens_events_event_info_body-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EventInfoBody","qualifiedName":"event_info_body.EventInfoBody","href":"views_after_auth_screens_events_event_info_body/EventInfoBody-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"EventInfoBody returns a stateless widget which describes the body of a particular event.","enclosedBy":{"name":"event_info_body","type":"library","href":"views_after_auth_screens_events_event_info_body/views_after_auth_screens_events_event_info_body-library.md"}},{"name":"EventInfoBody","qualifiedName":"event_info_body.EventInfoBody.EventInfoBody","href":"views_after_auth_screens_events_event_info_body/EventInfoBody/EventInfoBody.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventInfoBody","type":"class","href":"views_after_auth_screens_events_event_info_body/EventInfoBody-class.md"}},{"name":"build","qualifiedName":"event_info_body.EventInfoBody.build","href":"views_after_auth_screens_events_event_info_body/EventInfoBody/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"EventInfoBody","type":"class","href":"views_after_auth_screens_events_event_info_body/EventInfoBody-class.md"}},{"name":"event_info_page","qualifiedName":"event_info_page","href":"views_after_auth_screens_events_event_info_page/views_after_auth_screens_events_event_info_page-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EventInfoPage","qualifiedName":"event_info_page.EventInfoPage","href":"views_after_auth_screens_events_event_info_page/EventInfoPage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"EventInfoPage returns a widget that has mutable state _EventInfoPageState.","enclosedBy":{"name":"event_info_page","type":"library","href":"views_after_auth_screens_events_event_info_page/views_after_auth_screens_events_event_info_page-library.md"}},{"name":"EventInfoPage","qualifiedName":"event_info_page.EventInfoPage.EventInfoPage","href":"views_after_auth_screens_events_event_info_page/EventInfoPage/EventInfoPage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventInfoPage","type":"class","href":"views_after_auth_screens_events_event_info_page/EventInfoPage-class.md"}},{"name":"args","qualifiedName":"event_info_page.EventInfoPage.args","href":"views_after_auth_screens_events_event_info_page/EventInfoPage/args.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventInfoPage","type":"class","href":"views_after_auth_screens_events_event_info_page/EventInfoPage-class.md"}},{"name":"createState","qualifiedName":"event_info_page.EventInfoPage.createState","href":"views_after_auth_screens_events_event_info_page/EventInfoPage/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"EventInfoPage","type":"class","href":"views_after_auth_screens_events_event_info_page/EventInfoPage-class.md"}},{"name":"event_info_view_model","qualifiedName":"event_info_view_model","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/view_model_after_auth_view_models_event_view_models_event_info_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EventInfoViewModel","qualifiedName":"event_info_view_model.EventInfoViewModel","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"EventInfoViewModel class helps interacting with model to serve view with the event information data.'","enclosedBy":{"name":"event_info_view_model","type":"library","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/view_model_after_auth_view_models_event_view_models_event_info_view_model-library.md"}},{"name":"EventInfoViewModel","qualifiedName":"event_info_view_model.EventInfoViewModel.EventInfoViewModel","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/EventInfoViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventInfoViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel-class.md"}},{"name":"event","qualifiedName":"event_info_view_model.EventInfoViewModel.event","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/event.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventInfoViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel-class.md"}},{"name":"exploreEventsInstance","qualifiedName":"event_info_view_model.EventInfoViewModel.exploreEventsInstance","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/exploreEventsInstance.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventInfoViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel-class.md"}},{"name":"fabTitle","qualifiedName":"event_info_view_model.EventInfoViewModel.fabTitle","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/fabTitle.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventInfoViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel-class.md"}},{"name":"getFabTitle","qualifiedName":"event_info_view_model.EventInfoViewModel.getFabTitle","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/getFabTitle.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function returns String type for the event registration status.","enclosedBy":{"name":"EventInfoViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel-class.md"}},{"name":"initialize","qualifiedName":"event_info_view_model.EventInfoViewModel.initialize","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/initialize.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"initialise with the event data fetched from the model.","enclosedBy":{"name":"EventInfoViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel-class.md"}},{"name":"registerForEvent","qualifiedName":"event_info_view_model.EventInfoViewModel.registerForEvent","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/registerForEvent.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function helps the user to register for an event.","enclosedBy":{"name":"EventInfoViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel-class.md"}},{"name":"registrants","qualifiedName":"event_info_view_model.EventInfoViewModel.registrants","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/registrants.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventInfoViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel-class.md"}},{"name":"event_model","qualifiedName":"event_model","href":"models_events_event_model/models_events_event_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"Event","qualifiedName":"event_model.Event","href":"models_events_event_model/Event-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creates an event model and returns an Event instance.","enclosedBy":{"name":"event_model","type":"library","href":"models_events_event_model/models_events_event_model-library.md"}},{"name":"Event","qualifiedName":"event_model.Event.Event","href":"models_events_event_model/Event/Event.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"admins","qualifiedName":"event_model.Event.admins","href":"models_events_event_model/Event/admins.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"allDay","qualifiedName":"event_model.Event.allDay","href":"models_events_event_model/Event/allDay.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"attendees","qualifiedName":"event_model.Event.attendees","href":"models_events_event_model/Event/attendees.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"creator","qualifiedName":"event_model.Event.creator","href":"models_events_event_model/Event/creator.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"description","qualifiedName":"event_model.Event.description","href":"models_events_event_model/Event/description.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"endDate","qualifiedName":"event_model.Event.endDate","href":"models_events_event_model/Event/endDate.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"endTime","qualifiedName":"event_model.Event.endTime","href":"models_events_event_model/Event/endTime.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"Event.fromJson","qualifiedName":"event_model.Event.fromJson","href":"models_events_event_model/Event/Event.fromJson.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"id","qualifiedName":"event_model.Event.id","href":"models_events_event_model/Event/id.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"isPublic","qualifiedName":"event_model.Event.isPublic","href":"models_events_event_model/Event/isPublic.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"isRegisterable","qualifiedName":"event_model.Event.isRegisterable","href":"models_events_event_model/Event/isRegisterable.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"isRegistered","qualifiedName":"event_model.Event.isRegistered","href":"models_events_event_model/Event/isRegistered.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"latitude","qualifiedName":"event_model.Event.latitude","href":"models_events_event_model/Event/latitude.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"location","qualifiedName":"event_model.Event.location","href":"models_events_event_model/Event/location.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"longitude","qualifiedName":"event_model.Event.longitude","href":"models_events_event_model/Event/longitude.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"organization","qualifiedName":"event_model.Event.organization","href":"models_events_event_model/Event/organization.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"recurrence","qualifiedName":"event_model.Event.recurrence","href":"models_events_event_model/Event/recurrence.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"recurring","qualifiedName":"event_model.Event.recurring","href":"models_events_event_model/Event/recurring.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"registrants","qualifiedName":"event_model.Event.registrants","href":"models_events_event_model/Event/registrants.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"startDate","qualifiedName":"event_model.Event.startDate","href":"models_events_event_model/Event/startDate.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"startTime","qualifiedName":"event_model.Event.startTime","href":"models_events_event_model/Event/startTime.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"title","qualifiedName":"event_model.Event.title","href":"models_events_event_model/Event/title.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Event","type":"class","href":"models_events_event_model/Event-class.md"}},{"name":"event_queries","qualifiedName":"event_queries","href":"utils_event_queries/utils_event_queries-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EventQueries","qualifiedName":"event_queries.EventQueries","href":"utils_event_queries/EventQueries-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creates queries related to the events.","enclosedBy":{"name":"event_queries","type":"library","href":"utils_event_queries/utils_event_queries-library.md"}},{"name":"EventQueries","qualifiedName":"event_queries.EventQueries.EventQueries","href":"utils_event_queries/EventQueries/EventQueries.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventQueries","type":"class","href":"utils_event_queries/EventQueries-class.md"}},{"name":"addEvent","qualifiedName":"event_queries.EventQueries.addEvent","href":"utils_event_queries/EventQueries/addEvent.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventQueries","type":"class","href":"utils_event_queries/EventQueries-class.md"}},{"name":"deleteEvent","qualifiedName":"event_queries.EventQueries.deleteEvent","href":"utils_event_queries/EventQueries/deleteEvent.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventQueries","type":"class","href":"utils_event_queries/EventQueries-class.md"}},{"name":"fetchOrgEvents","qualifiedName":"event_queries.EventQueries.fetchOrgEvents","href":"utils_event_queries/EventQueries/fetchOrgEvents.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventQueries","type":"class","href":"utils_event_queries/EventQueries-class.md"}},{"name":"registerForEvent","qualifiedName":"event_queries.EventQueries.registerForEvent","href":"utils_event_queries/EventQueries/registerForEvent.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventQueries","type":"class","href":"utils_event_queries/EventQueries-class.md"}},{"name":"registrantsByEvent","qualifiedName":"event_queries.EventQueries.registrantsByEvent","href":"utils_event_queries/EventQueries/registrantsByEvent.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventQueries","type":"class","href":"utils_event_queries/EventQueries-class.md"}},{"name":"updateEvent","qualifiedName":"event_queries.EventQueries.updateEvent","href":"utils_event_queries/EventQueries/updateEvent.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventQueries","type":"class","href":"utils_event_queries/EventQueries-class.md"}},{"name":"event_search_delegate","qualifiedName":"event_search_delegate","href":"widgets_event_search_delegate/widgets_event_search_delegate-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EventSearch","qualifiedName":"event_search_delegate.EventSearch","href":"widgets_event_search_delegate/EventSearch-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class returns a list of the events which match the search query.","enclosedBy":{"name":"event_search_delegate","type":"library","href":"widgets_event_search_delegate/widgets_event_search_delegate-library.md"}},{"name":"EventSearch","qualifiedName":"event_search_delegate.EventSearch.EventSearch","href":"widgets_event_search_delegate/EventSearch/EventSearch.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventSearch","type":"class","href":"widgets_event_search_delegate/EventSearch-class.md"}},{"name":"buildActions","qualifiedName":"event_search_delegate.EventSearch.buildActions","href":"widgets_event_search_delegate/EventSearch/buildActions.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Widgets to display after the search query in the AppBar.","enclosedBy":{"name":"EventSearch","type":"class","href":"widgets_event_search_delegate/EventSearch-class.md"}},{"name":"buildLeading","qualifiedName":"event_search_delegate.EventSearch.buildLeading","href":"widgets_event_search_delegate/EventSearch/buildLeading.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"A widget to display before the current query in the AppBar.","enclosedBy":{"name":"EventSearch","type":"class","href":"widgets_event_search_delegate/EventSearch-class.md"}},{"name":"buildResults","qualifiedName":"event_search_delegate.EventSearch.buildResults","href":"widgets_event_search_delegate/EventSearch/buildResults.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"The results shown after the user submits a search from the search page.","enclosedBy":{"name":"EventSearch","type":"class","href":"widgets_event_search_delegate/EventSearch-class.md"}},{"name":"buildSuggestions","qualifiedName":"event_search_delegate.EventSearch.buildSuggestions","href":"widgets_event_search_delegate/EventSearch/buildSuggestions.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Suggestions shown in the body of the search page while the user types a\nquery into the search field.","enclosedBy":{"name":"EventSearch","type":"class","href":"widgets_event_search_delegate/EventSearch-class.md"}},{"name":"buildSuggestionsSucess","qualifiedName":"event_search_delegate.EventSearch.buildSuggestionsSucess","href":"widgets_event_search_delegate/EventSearch/buildSuggestionsSucess.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventSearch","type":"class","href":"widgets_event_search_delegate/EventSearch-class.md"}},{"name":"eventList","qualifiedName":"event_search_delegate.EventSearch.eventList","href":"widgets_event_search_delegate/EventSearch/eventList.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventSearch","type":"class","href":"widgets_event_search_delegate/EventSearch-class.md"}},{"name":"exploreEventsViewModel","qualifiedName":"event_search_delegate.EventSearch.exploreEventsViewModel","href":"widgets_event_search_delegate/EventSearch/exploreEventsViewModel.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventSearch","type":"class","href":"widgets_event_search_delegate/EventSearch-class.md"}},{"name":"event_service","qualifiedName":"event_service","href":"services_event_service/services_event_service-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EventService","qualifiedName":"event_service.EventService","href":"services_event_service/EventService-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"EventService class provides different services in the context of Event.","enclosedBy":{"name":"event_service","type":"library","href":"services_event_service/services_event_service-library.md"}},{"name":"EventService","qualifiedName":"event_service.EventService.EventService","href":"services_event_service/EventService/EventService.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventService","type":"class","href":"services_event_service/EventService-class.md"}},{"name":"deleteEvent","qualifiedName":"event_service.EventService.deleteEvent","href":"services_event_service/EventService/deleteEvent.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to delete the event.","enclosedBy":{"name":"EventService","type":"class","href":"services_event_service/EventService-class.md"}},{"name":"dispose","qualifiedName":"event_service.EventService.dispose","href":"services_event_service/EventService/dispose.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to cancel the stream subscription of an organization.","enclosedBy":{"name":"EventService","type":"class","href":"services_event_service/EventService-class.md"}},{"name":"editEvent","qualifiedName":"event_service.EventService.editEvent","href":"services_event_service/EventService/editEvent.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to edit an event.","enclosedBy":{"name":"EventService","type":"class","href":"services_event_service/EventService-class.md"}},{"name":"eventStream","qualifiedName":"event_service.EventService.eventStream","href":"services_event_service/EventService/eventStream.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"The event stream.","enclosedBy":{"name":"EventService","type":"class","href":"services_event_service/EventService-class.md"}},{"name":"fetchRegistrantsByEvent","qualifiedName":"event_service.EventService.fetchRegistrantsByEvent","href":"services_event_service/EventService/fetchRegistrantsByEvent.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to fetch all registrants of an event.","enclosedBy":{"name":"EventService","type":"class","href":"services_event_service/EventService-class.md"}},{"name":"getEvents","qualifiedName":"event_service.EventService.getEvents","href":"services_event_service/EventService/getEvents.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to fetch all the events of an organization.","enclosedBy":{"name":"EventService","type":"class","href":"services_event_service/EventService-class.md"}},{"name":"registerForAnEvent","qualifiedName":"event_service.EventService.registerForAnEvent","href":"services_event_service/EventService/registerForAnEvent.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to register user for an event.","enclosedBy":{"name":"EventService","type":"class","href":"services_event_service/EventService-class.md"}},{"name":"setOrgStreamSubscription","qualifiedName":"event_service.EventService.setOrgStreamSubscription","href":"services_event_service/EventService/setOrgStreamSubscription.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to set stream subscription for an organization.","enclosedBy":{"name":"EventService","type":"class","href":"services_event_service/EventService-class.md"}},{"name":"event_tasks_page","qualifiedName":"event_tasks_page","href":"views_after_auth_screens_tasks_event_tasks_page/views_after_auth_screens_tasks_event_tasks_page-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"EventTasksPage","qualifiedName":"event_tasks_page.EventTasksPage","href":"views_after_auth_screens_tasks_event_tasks_page/EventTasksPage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"EventTasksPage return a widget for Event Task Page that is created by event creator.","enclosedBy":{"name":"event_tasks_page","type":"library","href":"views_after_auth_screens_tasks_event_tasks_page/views_after_auth_screens_tasks_event_tasks_page-library.md"}},{"name":"EventTasksPage","qualifiedName":"event_tasks_page.EventTasksPage.EventTasksPage","href":"views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/EventTasksPage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventTasksPage","type":"class","href":"views_after_auth_screens_tasks_event_tasks_page/EventTasksPage-class.md"}},{"name":"build","qualifiedName":"event_tasks_page.EventTasksPage.build","href":"views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"EventTasksPage","type":"class","href":"views_after_auth_screens_tasks_event_tasks_page/EventTasksPage-class.md"}},{"name":"eventId","qualifiedName":"event_tasks_page.EventTasksPage.eventId","href":"views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/eventId.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"EventTasksPage","type":"class","href":"views_after_auth_screens_tasks_event_tasks_page/EventTasksPage-class.md"}},{"name":"events_demo_data","qualifiedName":"events_demo_data","href":"demo_server_data_events_demo_data/demo_server_data_events_demo_data-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"eventsDemoData","qualifiedName":"events_demo_data.eventsDemoData","href":"demo_server_data_events_demo_data/eventsDemoData-constant.md","type":"top-level constant","overriddenDepth":0,"packageName":"talawa","desc":"This file contains demo data. It contains a list of type Map<String, Object>\nand sample data of events.","enclosedBy":{"name":"events_demo_data","type":"library","href":"demo_server_data_events_demo_data/demo_server_data_events_demo_data-library.md"}},{"name":"explore_event_dialogue","qualifiedName":"explore_event_dialogue","href":"views_after_auth_screens_events_explore_event_dialogue/views_after_auth_screens_events_explore_event_dialogue-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ExploreEventDialog","qualifiedName":"explore_event_dialogue.ExploreEventDialog","href":"views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"ExploreEventDialog returns a widget that has mutable state _ExploreEventDialogState.","enclosedBy":{"name":"explore_event_dialogue","type":"library","href":"views_after_auth_screens_events_explore_event_dialogue/views_after_auth_screens_events_explore_event_dialogue-library.md"}},{"name":"ExploreEventDialog","qualifiedName":"explore_event_dialogue.ExploreEventDialog.ExploreEventDialog","href":"views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog/ExploreEventDialog.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ExploreEventDialog","type":"class","href":"views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog-class.md"}},{"name":"createState","qualifiedName":"explore_event_dialogue.ExploreEventDialog.createState","href":"views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"ExploreEventDialog","type":"class","href":"views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog-class.md"}},{"name":"explore_events","qualifiedName":"explore_events","href":"views_after_auth_screens_events_explore_events/views_after_auth_screens_events_explore_events-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ExploreEvents","qualifiedName":"explore_events.ExploreEvents","href":"views_after_auth_screens_events_explore_events/ExploreEvents-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"Shows the list of events with options to categorize them.","enclosedBy":{"name":"explore_events","type":"library","href":"views_after_auth_screens_events_explore_events/views_after_auth_screens_events_explore_events-library.md"}},{"name":"ExploreEvents","qualifiedName":"explore_events.ExploreEvents.ExploreEvents","href":"views_after_auth_screens_events_explore_events/ExploreEvents/ExploreEvents.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ExploreEvents","type":"class","href":"views_after_auth_screens_events_explore_events/ExploreEvents-class.md"}},{"name":"build","qualifiedName":"explore_events.ExploreEvents.build","href":"views_after_auth_screens_events_explore_events/ExploreEvents/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"ExploreEvents","type":"class","href":"views_after_auth_screens_events_explore_events/ExploreEvents-class.md"}},{"name":"dropDownList","qualifiedName":"explore_events.ExploreEvents.dropDownList","href":"views_after_auth_screens_events_explore_events/ExploreEvents/dropDownList.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Shows a list of dropdown taken from model and context.","enclosedBy":{"name":"ExploreEvents","type":"class","href":"views_after_auth_screens_events_explore_events/ExploreEvents-class.md"}},{"name":"homeModel","qualifiedName":"explore_events.ExploreEvents.homeModel","href":"views_after_auth_screens_events_explore_events/ExploreEvents/homeModel.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"homeModal is a type of MainScreenViewModel which provides methods to handle the data for this component.","enclosedBy":{"name":"ExploreEvents","type":"class","href":"views_after_auth_screens_events_explore_events/ExploreEvents-class.md"}},{"name":"explore_events_view_model","qualifiedName":"explore_events_view_model","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/view_model_after_auth_view_models_event_view_models_explore_events_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ExploreEventsViewModel","qualifiedName":"explore_events_view_model.ExploreEventsViewModel","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"ExploreEventsViewModel class helps to interact with model to serve data to view for event explore section.","enclosedBy":{"name":"explore_events_view_model","type":"library","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/view_model_after_auth_view_models_event_view_models_explore_events_view_model-library.md"}},{"name":"ExploreEventsViewModel","qualifiedName":"explore_events_view_model.ExploreEventsViewModel.ExploreEventsViewModel","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/ExploreEventsViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ExploreEventsViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md"}},{"name":"checkIfExistsAndAddNewEvent","qualifiedName":"explore_events_view_model.ExploreEventsViewModel.checkIfExistsAndAddNewEvent","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/checkIfExistsAndAddNewEvent.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function add a new event if the event not exist.","enclosedBy":{"name":"ExploreEventsViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md"}},{"name":"choseValueFromDropdown","qualifiedName":"explore_events_view_model.ExploreEventsViewModel.choseValueFromDropdown","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/choseValueFromDropdown.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function takes the choosen value from dropdown and\nreturn the filter events, if empty list then return relevant message.","enclosedBy":{"name":"ExploreEventsViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md"}},{"name":"chosenValue","qualifiedName":"explore_events_view_model.ExploreEventsViewModel.chosenValue","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/chosenValue.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ExploreEventsViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md"}},{"name":"deleteEvent","qualifiedName":"explore_events_view_model.ExploreEventsViewModel.deleteEvent","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/deleteEvent.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function deletes the event.","enclosedBy":{"name":"ExploreEventsViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md"}},{"name":"dispose","qualifiedName":"explore_events_view_model.ExploreEventsViewModel.dispose","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/dispose.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Discards any resources used by the object. After this is called, the\nobject is not in a usable state and should be discarded (calls to\naddListener will throw after the object is disposed).","enclosedBy":{"name":"ExploreEventsViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md"}},{"name":"emptyListMessage","qualifiedName":"explore_events_view_model.ExploreEventsViewModel.emptyListMessage","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/emptyListMessage.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ExploreEventsViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md"}},{"name":"eventService","qualifiedName":"explore_events_view_model.ExploreEventsViewModel.eventService","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/eventService.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ExploreEventsViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md"}},{"name":"events","qualifiedName":"explore_events_view_model.ExploreEventsViewModel.events","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/events.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ExploreEventsViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md"}},{"name":"fetchNewEvents","qualifiedName":"explore_events_view_model.ExploreEventsViewModel.fetchNewEvents","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/fetchNewEvents.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to fetch new events in the organization.\nThe function uses getEvents method from EventService.","enclosedBy":{"name":"ExploreEventsViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md"}},{"name":"initialise","qualifiedName":"explore_events_view_model.ExploreEventsViewModel.initialise","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/initialise.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ExploreEventsViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md"}},{"name":"refreshEvents","qualifiedName":"explore_events_view_model.ExploreEventsViewModel.refreshEvents","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/refreshEvents.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to refresh the events in the organization.\nThe function uses getEvents method from EventService.","enclosedBy":{"name":"ExploreEventsViewModel","type":"class","href":"view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md"}},{"name":"explore_tasks_view_model","qualifiedName":"explore_tasks_view_model","href":"view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ExploreTasksViewModel","qualifiedName":"explore_tasks_view_model.ExploreTasksViewModel","href":"view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"ExploreTasksViewModel class helps to interact with model to serve data\nand react to user's input in Explore Task section.","enclosedBy":{"name":"explore_tasks_view_model","type":"library","href":"view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model-library.md"}},{"name":"ExploreTasksViewModel","qualifiedName":"explore_tasks_view_model.ExploreTasksViewModel.ExploreTasksViewModel","href":"view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/ExploreTasksViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ExploreTasksViewModel","type":"class","href":"view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel-class.md"}},{"name":"deleteTask","qualifiedName":"explore_tasks_view_model.ExploreTasksViewModel.deleteTask","href":"view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/deleteTask.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function deletes the task for an event.\nThe function uses deleteTask method of Task Service.","enclosedBy":{"name":"ExploreTasksViewModel","type":"class","href":"view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel-class.md"}},{"name":"fetchTasks","qualifiedName":"explore_tasks_view_model.ExploreTasksViewModel.fetchTasks","href":"view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/fetchTasks.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function fetch all the task for an event.\nThe function uses getTasksForEvent method of Task Service.","enclosedBy":{"name":"ExploreTasksViewModel","type":"class","href":"view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel-class.md"}},{"name":"fetchTasksByUser","qualifiedName":"explore_tasks_view_model.ExploreTasksViewModel.fetchTasksByUser","href":"view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/fetchTasksByUser.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function fetch tasks created by the current user for an event.\nThe function uses getTasksByUser method of Task Service.","enclosedBy":{"name":"ExploreTasksViewModel","type":"class","href":"view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel-class.md"}},{"name":"tasks","qualifiedName":"explore_tasks_view_model.ExploreTasksViewModel.tasks","href":"view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/tasks.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ExploreTasksViewModel","type":"class","href":"view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel-class.md"}},{"name":"fetch_plugin_list","qualifiedName":"fetch_plugin_list","href":"plugins_fetch_plugin_list/plugins_fetch_plugin_list-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"FetchPluginList","qualifiedName":"fetch_plugin_list.FetchPluginList","href":"plugins_fetch_plugin_list/FetchPluginList-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class fetch plugins list.","enclosedBy":{"name":"fetch_plugin_list","type":"library","href":"plugins_fetch_plugin_list/plugins_fetch_plugin_list-library.md"}},{"name":"FetchPluginList","qualifiedName":"fetch_plugin_list.FetchPluginList.FetchPluginList","href":"plugins_fetch_plugin_list/FetchPluginList/FetchPluginList.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"Constructor of the class.","enclosedBy":{"name":"FetchPluginList","type":"class","href":"plugins_fetch_plugin_list/FetchPluginList-class.md"}},{"name":"box","qualifiedName":"fetch_plugin_list.FetchPluginList.box","href":"plugins_fetch_plugin_list/FetchPluginList/box.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"late initialize the box.","enclosedBy":{"name":"FetchPluginList","type":"class","href":"plugins_fetch_plugin_list/FetchPluginList-class.md"}},{"name":"fetchList","qualifiedName":"fetch_plugin_list.FetchPluginList.fetchList","href":"plugins_fetch_plugin_list/FetchPluginList/fetchList.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Fetches plugins from server and stores them in Hive pluginBox.","enclosedBy":{"name":"FetchPluginList","type":"class","href":"plugins_fetch_plugin_list/FetchPluginList-class.md"}},{"name":"firebase_options","qualifiedName":"firebase_options","href":"firebase_options/firebase_options-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"DefaultFirebaseOptions","qualifiedName":"firebase_options.DefaultFirebaseOptions","href":"firebase_options/DefaultFirebaseOptions-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"Default FirebaseOptions for use with your Firebase apps.","enclosedBy":{"name":"firebase_options","type":"library","href":"firebase_options/firebase_options-library.md"}},{"name":"DefaultFirebaseOptions","qualifiedName":"firebase_options.DefaultFirebaseOptions.DefaultFirebaseOptions","href":"firebase_options/DefaultFirebaseOptions/DefaultFirebaseOptions.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DefaultFirebaseOptions","type":"class","href":"firebase_options/DefaultFirebaseOptions-class.md"}},{"name":"android","qualifiedName":"firebase_options.DefaultFirebaseOptions.android","href":"firebase_options/DefaultFirebaseOptions/android.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Scaffolds androidFirebaseOptions around FirebaseOptions.","enclosedBy":{"name":"DefaultFirebaseOptions","type":"class","href":"firebase_options/DefaultFirebaseOptions-class.md"}},{"name":"currentPlatform","qualifiedName":"firebase_options.DefaultFirebaseOptions.currentPlatform","href":"firebase_options/DefaultFirebaseOptions/currentPlatform.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Builds and returns FirebaseOptions based on the current platform.","enclosedBy":{"name":"DefaultFirebaseOptions","type":"class","href":"firebase_options/DefaultFirebaseOptions-class.md"}},{"name":"ios","qualifiedName":"firebase_options.DefaultFirebaseOptions.ios","href":"firebase_options/DefaultFirebaseOptions/ios.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Scaffolds iosFirebaseOptions around FirebaseOptions.","enclosedBy":{"name":"DefaultFirebaseOptions","type":"class","href":"firebase_options/DefaultFirebaseOptions-class.md"}},{"name":"from_palisadoes","qualifiedName":"from_palisadoes","href":"widgets_from_palisadoes/widgets_from_palisadoes-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"FromPalisadoes","qualifiedName":"from_palisadoes.FromPalisadoes","href":"widgets_from_palisadoes/FromPalisadoes-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class generates the text \"From Palisadoes\" in a custom way.","enclosedBy":{"name":"from_palisadoes","type":"library","href":"widgets_from_palisadoes/widgets_from_palisadoes-library.md"}},{"name":"FromPalisadoes","qualifiedName":"from_palisadoes.FromPalisadoes.FromPalisadoes","href":"widgets_from_palisadoes/FromPalisadoes/FromPalisadoes.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"FromPalisadoes","type":"class","href":"widgets_from_palisadoes/FromPalisadoes-class.md"}},{"name":"build","qualifiedName":"from_palisadoes.FromPalisadoes.build","href":"widgets_from_palisadoes/FromPalisadoes/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"FromPalisadoes","type":"class","href":"widgets_from_palisadoes/FromPalisadoes-class.md"}},{"name":"generated_plugin_registrant","qualifiedName":"generated_plugin_registrant","href":"generated_plugin_registrant/generated_plugin_registrant-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"registerPlugins","qualifiedName":"generated_plugin_registrant.registerPlugins","href":"generated_plugin_registrant/registerPlugins.md","type":"function","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"generated_plugin_registrant","type":"library","href":"generated_plugin_registrant/generated_plugin_registrant-library.md"}},{"name":"graphql_config","qualifiedName":"graphql_config","href":"services_graphql_config/services_graphql_config-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"GraphqlConfig","qualifiedName":"graphql_config.GraphqlConfig","href":"services_graphql_config/GraphqlConfig-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data.\nTalawa uses graphQL for the integrating with the API's.\nYou can go through talawa-api, here.\nGraphqlConfig class provides service to configure graph ql API with talawa mobile-app.","enclosedBy":{"name":"graphql_config","type":"library","href":"services_graphql_config/services_graphql_config-library.md"}},{"name":"GraphqlConfig","qualifiedName":"graphql_config.GraphqlConfig.GraphqlConfig","href":"services_graphql_config/GraphqlConfig/GraphqlConfig.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"GraphqlConfig","type":"class","href":"services_graphql_config/GraphqlConfig-class.md"}},{"name":"authClient","qualifiedName":"graphql_config.GraphqlConfig.authClient","href":"services_graphql_config/GraphqlConfig/authClient.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"GraphqlConfig","type":"class","href":"services_graphql_config/GraphqlConfig-class.md"}},{"name":"clientToQuery","qualifiedName":"graphql_config.GraphqlConfig.clientToQuery","href":"services_graphql_config/GraphqlConfig/clientToQuery.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"GraphqlConfig","type":"class","href":"services_graphql_config/GraphqlConfig-class.md"}},{"name":"displayImgRoute","qualifiedName":"graphql_config.GraphqlConfig.displayImgRoute","href":"services_graphql_config/GraphqlConfig/displayImgRoute.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"GraphqlConfig","type":"class","href":"services_graphql_config/GraphqlConfig-class.md"}},{"name":"getOrgUrl","qualifiedName":"graphql_config.GraphqlConfig.getOrgUrl","href":"services_graphql_config/GraphqlConfig/getOrgUrl.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to get the organization URL.","enclosedBy":{"name":"GraphqlConfig","type":"class","href":"services_graphql_config/GraphqlConfig-class.md"}},{"name":"getToken","qualifiedName":"graphql_config.GraphqlConfig.getToken","href":"services_graphql_config/GraphqlConfig/getToken.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to get user the access token.","enclosedBy":{"name":"GraphqlConfig","type":"class","href":"services_graphql_config/GraphqlConfig-class.md"}},{"name":"httpLink","qualifiedName":"graphql_config.GraphqlConfig.httpLink","href":"services_graphql_config/GraphqlConfig/httpLink.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"GraphqlConfig","type":"class","href":"services_graphql_config/GraphqlConfig-class.md"}},{"name":"imageUrlKey","qualifiedName":"graphql_config.GraphqlConfig.imageUrlKey","href":"services_graphql_config/GraphqlConfig/imageUrlKey-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"GraphqlConfig","type":"class","href":"services_graphql_config/GraphqlConfig-class.md"}},{"name":"orgURI","qualifiedName":"graphql_config.GraphqlConfig.orgURI","href":"services_graphql_config/GraphqlConfig/orgURI.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"GraphqlConfig","type":"class","href":"services_graphql_config/GraphqlConfig-class.md"}},{"name":"test","qualifiedName":"graphql_config.GraphqlConfig.test","href":"services_graphql_config/GraphqlConfig/test.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"GraphqlConfig","type":"class","href":"services_graphql_config/GraphqlConfig-class.md"}},{"name":"token","qualifiedName":"graphql_config.GraphqlConfig.token","href":"services_graphql_config/GraphqlConfig/token.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"GraphqlConfig","type":"class","href":"services_graphql_config/GraphqlConfig-class.md"}},{"name":"urlKey","qualifiedName":"graphql_config.GraphqlConfig.urlKey","href":"services_graphql_config/GraphqlConfig/urlKey-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"GraphqlConfig","type":"class","href":"services_graphql_config/GraphqlConfig-class.md"}},{"name":"webSocketLink","qualifiedName":"graphql_config.GraphqlConfig.webSocketLink","href":"services_graphql_config/GraphqlConfig/webSocketLink.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"GraphqlConfig","type":"class","href":"services_graphql_config/GraphqlConfig-class.md"}},{"name":"MockHttpClient","qualifiedName":"graphql_config.MockHttpClient","href":"services_graphql_config/MockHttpClient-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"A mock HTTP client designed for use when testing code that uses BaseClient.","enclosedBy":{"name":"graphql_config","type":"library","href":"services_graphql_config/services_graphql_config-library.md"}},{"name":"MockHttpClient","qualifiedName":"graphql_config.MockHttpClient.MockHttpClient","href":"services_graphql_config/MockHttpClient/MockHttpClient.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MockHttpClient","type":"class","href":"services_graphql_config/MockHttpClient-class.md"}},{"name":"send","qualifiedName":"graphql_config.MockHttpClient.send","href":"services_graphql_config/MockHttpClient/send.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Sends an HTTP request and asynchronously returns the response.","enclosedBy":{"name":"MockHttpClient","type":"class","href":"services_graphql_config/MockHttpClient-class.md"}},{"name":"individual_post","qualifiedName":"individual_post","href":"views_after_auth_screens_feed_individual_post/views_after_auth_screens_feed_individual_post-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CommentTemplate","qualifiedName":"individual_post.CommentTemplate","href":"views_after_auth_screens_feed_individual_post/CommentTemplate-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"CommentTemplate returns a widget of the individual user commented on the post.","enclosedBy":{"name":"individual_post","type":"library","href":"views_after_auth_screens_feed_individual_post/views_after_auth_screens_feed_individual_post-library.md"}},{"name":"CommentTemplate","qualifiedName":"individual_post.CommentTemplate.CommentTemplate","href":"views_after_auth_screens_feed_individual_post/CommentTemplate/CommentTemplate.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CommentTemplate","type":"class","href":"views_after_auth_screens_feed_individual_post/CommentTemplate-class.md"}},{"name":"build","qualifiedName":"individual_post.CommentTemplate.build","href":"views_after_auth_screens_feed_individual_post/CommentTemplate/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"CommentTemplate","type":"class","href":"views_after_auth_screens_feed_individual_post/CommentTemplate-class.md"}},{"name":"comment","qualifiedName":"individual_post.CommentTemplate.comment","href":"views_after_auth_screens_feed_individual_post/CommentTemplate/comment.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CommentTemplate","type":"class","href":"views_after_auth_screens_feed_individual_post/CommentTemplate-class.md"}},{"name":"IndividualPageLikeSection","qualifiedName":"individual_post.IndividualPageLikeSection","href":"views_after_auth_screens_feed_individual_post/IndividualPageLikeSection-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"IndividualPageLikeSection returns a widget that show the list of all the users liked the post.","enclosedBy":{"name":"individual_post","type":"library","href":"views_after_auth_screens_feed_individual_post/views_after_auth_screens_feed_individual_post-library.md"}},{"name":"IndividualPageLikeSection","qualifiedName":"individual_post.IndividualPageLikeSection.IndividualPageLikeSection","href":"views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/IndividualPageLikeSection.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"IndividualPageLikeSection","type":"class","href":"views_after_auth_screens_feed_individual_post/IndividualPageLikeSection-class.md"}},{"name":"build","qualifiedName":"individual_post.IndividualPageLikeSection.build","href":"views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"IndividualPageLikeSection","type":"class","href":"views_after_auth_screens_feed_individual_post/IndividualPageLikeSection-class.md"}},{"name":"usersLiked","qualifiedName":"individual_post.IndividualPageLikeSection.usersLiked","href":"views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/usersLiked.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"IndividualPageLikeSection","type":"class","href":"views_after_auth_screens_feed_individual_post/IndividualPageLikeSection-class.md"}},{"name":"IndividualPostCommentSection","qualifiedName":"individual_post.IndividualPostCommentSection","href":"views_after_auth_screens_feed_individual_post/IndividualPostCommentSection-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"IndividualPostCommentSection returns a widget that show the list of all the users commented on the post.","enclosedBy":{"name":"individual_post","type":"library","href":"views_after_auth_screens_feed_individual_post/views_after_auth_screens_feed_individual_post-library.md"}},{"name":"IndividualPostCommentSection","qualifiedName":"individual_post.IndividualPostCommentSection.IndividualPostCommentSection","href":"views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/IndividualPostCommentSection.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"IndividualPostCommentSection","type":"class","href":"views_after_auth_screens_feed_individual_post/IndividualPostCommentSection-class.md"}},{"name":"build","qualifiedName":"individual_post.IndividualPostCommentSection.build","href":"views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"IndividualPostCommentSection","type":"class","href":"views_after_auth_screens_feed_individual_post/IndividualPostCommentSection-class.md"}},{"name":"comments","qualifiedName":"individual_post.IndividualPostCommentSection.comments","href":"views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/comments.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"IndividualPostCommentSection","type":"class","href":"views_after_auth_screens_feed_individual_post/IndividualPostCommentSection-class.md"}},{"name":"postID","qualifiedName":"individual_post.IndividualPostCommentSection.postID","href":"views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/postID.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"IndividualPostCommentSection","type":"class","href":"views_after_auth_screens_feed_individual_post/IndividualPostCommentSection-class.md"}},{"name":"IndividualPostView","qualifiedName":"individual_post.IndividualPostView","href":"views_after_auth_screens_feed_individual_post/IndividualPostView-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"IndividualPostView returns a widget that has mutable state _IndividualPostViewState.","enclosedBy":{"name":"individual_post","type":"library","href":"views_after_auth_screens_feed_individual_post/views_after_auth_screens_feed_individual_post-library.md"}},{"name":"IndividualPostView","qualifiedName":"individual_post.IndividualPostView.IndividualPostView","href":"views_after_auth_screens_feed_individual_post/IndividualPostView/IndividualPostView.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"IndividualPostView","type":"class","href":"views_after_auth_screens_feed_individual_post/IndividualPostView-class.md"}},{"name":"createState","qualifiedName":"individual_post.IndividualPostView.createState","href":"views_after_auth_screens_feed_individual_post/IndividualPostView/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"IndividualPostView","type":"class","href":"views_after_auth_screens_feed_individual_post/IndividualPostView-class.md"}},{"name":"post","qualifiedName":"individual_post.IndividualPostView.post","href":"views_after_auth_screens_feed_individual_post/IndividualPostView/post.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"IndividualPostView","type":"class","href":"views_after_auth_screens_feed_individual_post/IndividualPostView-class.md"}},{"name":"buildPadding","qualifiedName":"individual_post.buildPadding","href":"views_after_auth_screens_feed_individual_post/buildPadding.md","type":"function","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"individual_post","type":"library","href":"views_after_auth_screens_feed_individual_post/views_after_auth_screens_feed_individual_post-library.md"}},{"name":"likedUserCircleAvatar","qualifiedName":"individual_post.likedUserCircleAvatar","href":"views_after_auth_screens_feed_individual_post/likedUserCircleAvatar.md","type":"function","overriddenDepth":0,"packageName":"talawa","desc":"likedUserCircleAvatar returns a widget of the individual user liked the post.","enclosedBy":{"name":"individual_post","type":"library","href":"views_after_auth_screens_feed_individual_post/views_after_auth_screens_feed_individual_post-library.md"}},{"name":"invite_child","qualifiedName":"invite_child","href":"widgets_invite_child/widgets_invite_child-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"iconButton","qualifiedName":"invite_child.iconButton","href":"widgets_invite_child/iconButton.md","type":"function","overriddenDepth":0,"packageName":"talawa","desc":"This function is for debugging purposes.\nIt prints \"tapped\" in the console for the developer to know that the button was tapped.","enclosedBy":{"name":"invite_child","type":"library","href":"widgets_invite_child/widgets_invite_child-library.md"}},{"name":"invite","qualifiedName":"invite_child.invite","href":"widgets_invite_child/invite.md","type":"function","overriddenDepth":0,"packageName":"talawa","desc":"This widget gives us various options to invite someone to an organization.\nWe can use QR code scanner, social media platforms like twitter, whatsapp, telegram and many more.","enclosedBy":{"name":"invite_child","type":"library","href":"widgets_invite_child/widgets_invite_child-library.md"}},{"name":"join_organisation_after_auth","qualifiedName":"join_organisation_after_auth","href":"views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"JoinOrganisationAfterAuth","qualifiedName":"join_organisation_after_auth.JoinOrganisationAfterAuth","href":"views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"JoinOrganisationAfterAuth returns a widget for page to join the organization just after user authentication.","enclosedBy":{"name":"join_organisation_after_auth","type":"library","href":"views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth-library.md"}},{"name":"JoinOrganisationAfterAuth","qualifiedName":"join_organisation_after_auth.JoinOrganisationAfterAuth.JoinOrganisationAfterAuth","href":"views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/JoinOrganisationAfterAuth.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"JoinOrganisationAfterAuth","type":"class","href":"views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth-class.md"}},{"name":"build","qualifiedName":"join_organisation_after_auth.JoinOrganisationAfterAuth.build","href":"views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"JoinOrganisationAfterAuth","type":"class","href":"views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth-class.md"}},{"name":"orgId","qualifiedName":"join_organisation_after_auth.JoinOrganisationAfterAuth.orgId","href":"views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/orgId.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"JoinOrganisationAfterAuth","type":"class","href":"views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth-class.md"}},{"name":"scanQR","qualifiedName":"join_organisation_after_auth.JoinOrganisationAfterAuth.scanQR","href":"views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/scanQR.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"scanQR returns a widget that is use in joining the organization via the QR code.","enclosedBy":{"name":"JoinOrganisationAfterAuth","type":"class","href":"views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth-class.md"}},{"name":"lang_switch","qualifiedName":"lang_switch","href":"widgets_lang_switch/widgets_lang_switch-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"LanguageTile","qualifiedName":"lang_switch.LanguageTile","href":"widgets_lang_switch/LanguageTile-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This widget enables language switch for \"internationalizing our app\".","enclosedBy":{"name":"lang_switch","type":"library","href":"widgets_lang_switch/widgets_lang_switch-library.md"}},{"name":"LanguageTile","qualifiedName":"lang_switch.LanguageTile.LanguageTile","href":"widgets_lang_switch/LanguageTile/LanguageTile.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LanguageTile","type":"class","href":"widgets_lang_switch/LanguageTile-class.md"}},{"name":"build","qualifiedName":"lang_switch.LanguageTile.build","href":"widgets_lang_switch/LanguageTile/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"LanguageTile","type":"class","href":"widgets_lang_switch/LanguageTile-class.md"}},{"name":"lang_view_model","qualifiedName":"lang_view_model","href":"view_model_lang_view_model/view_model_lang_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"AppLanguage","qualifiedName":"lang_view_model.AppLanguage","href":"view_model_lang_view_model/AppLanguage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"AppLanguage view model class interact with modal in the context of the App Language.\nThe class provides methods that set's the language, change the language in the modal.","enclosedBy":{"name":"lang_view_model","type":"library","href":"view_model_lang_view_model/view_model_lang_view_model-library.md"}},{"name":"AppLanguage","qualifiedName":"lang_view_model.AppLanguage.AppLanguage","href":"view_model_lang_view_model/AppLanguage/AppLanguage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLanguage","type":"class","href":"view_model_lang_view_model/AppLanguage-class.md"}},{"name":"appLanguageQuery","qualifiedName":"lang_view_model.AppLanguage.appLanguageQuery","href":"view_model_lang_view_model/AppLanguage/appLanguageQuery.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function perform graphQL query to check the app language.\nThe function uses gqlAuthQuery method provided by Database Functions Services.","enclosedBy":{"name":"AppLanguage","type":"class","href":"view_model_lang_view_model/AppLanguage-class.md"}},{"name":"appLocal","qualifiedName":"lang_view_model.AppLanguage.appLocal","href":"view_model_lang_view_model/AppLanguage/appLocal.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLanguage","type":"class","href":"view_model_lang_view_model/AppLanguage-class.md"}},{"name":"changeLanguage","qualifiedName":"lang_view_model.AppLanguage.changeLanguage","href":"view_model_lang_view_model/AppLanguage/changeLanguage.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function change the app default language.","enclosedBy":{"name":"AppLanguage","type":"class","href":"view_model_lang_view_model/AppLanguage-class.md"}},{"name":"databaseFunctions","qualifiedName":"lang_view_model.AppLanguage.databaseFunctions","href":"view_model_lang_view_model/AppLanguage/databaseFunctions.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLanguage","type":"class","href":"view_model_lang_view_model/AppLanguage-class.md"}},{"name":"dbLanguageUpdate","qualifiedName":"lang_view_model.AppLanguage.dbLanguageUpdate","href":"view_model_lang_view_model/AppLanguage/dbLanguageUpdate.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function updates the Database Language by running the graphQL mutations.","enclosedBy":{"name":"AppLanguage","type":"class","href":"view_model_lang_view_model/AppLanguage-class.md"}},{"name":"fetchLocale","qualifiedName":"lang_view_model.AppLanguage.fetchLocale","href":"view_model_lang_view_model/AppLanguage/fetchLocale.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function fetch the language of the user's app.","enclosedBy":{"name":"AppLanguage","type":"class","href":"view_model_lang_view_model/AppLanguage-class.md"}},{"name":"initialize","qualifiedName":"lang_view_model.AppLanguage.initialize","href":"view_model_lang_view_model/AppLanguage/initialize.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLanguage","type":"class","href":"view_model_lang_view_model/AppLanguage-class.md"}},{"name":"isTest","qualifiedName":"lang_view_model.AppLanguage.isTest","href":"view_model_lang_view_model/AppLanguage/isTest.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLanguage","type":"class","href":"view_model_lang_view_model/AppLanguage-class.md"}},{"name":"navigationService","qualifiedName":"lang_view_model.AppLanguage.navigationService","href":"view_model_lang_view_model/AppLanguage/navigationService.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLanguage","type":"class","href":"view_model_lang_view_model/AppLanguage-class.md"}},{"name":"selectLanguagePress","qualifiedName":"lang_view_model.AppLanguage.selectLanguagePress","href":"view_model_lang_view_model/AppLanguage/selectLanguagePress.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function navigate user to /appSettingsPage route if the user is authenticated\nelse navigate to /setUrl route.","enclosedBy":{"name":"AppLanguage","type":"class","href":"view_model_lang_view_model/AppLanguage-class.md"}},{"name":"userLanguageQuery","qualifiedName":"lang_view_model.AppLanguage.userLanguageQuery","href":"view_model_lang_view_model/AppLanguage/userLanguageQuery.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function perform graphQL query to check the user's language in the database.\nThe function uses gqlAuthQuery method provided by Database Functions Services.","enclosedBy":{"name":"AppLanguage","type":"class","href":"view_model_lang_view_model/AppLanguage-class.md"}},{"name":"language_icon","qualifiedName":"language_icon","href":"custom_painters_language_icon/custom_painters_language_icon-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"LanguageIcon","qualifiedName":"language_icon.LanguageIcon","href":"custom_painters_language_icon/LanguageIcon-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class draws the language icon using custom paint.\nCustomPaint is a widget from the Flutter SDK, which enables\nyou to use a canvas to draw different shapes.","enclosedBy":{"name":"language_icon","type":"library","href":"custom_painters_language_icon/custom_painters_language_icon-library.md"}},{"name":"LanguageIcon","qualifiedName":"language_icon.LanguageIcon.LanguageIcon","href":"custom_painters_language_icon/LanguageIcon/LanguageIcon.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LanguageIcon","type":"class","href":"custom_painters_language_icon/LanguageIcon-class.md"}},{"name":"paint","qualifiedName":"language_icon.LanguageIcon.paint","href":"custom_painters_language_icon/LanguageIcon/paint.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Called whenever the object needs to paint. The given Canvas has its\ncoordinate space configured such that the origin is at the top left of the\nbox. The area of the box is the size of the size argument.","enclosedBy":{"name":"LanguageIcon","type":"class","href":"custom_painters_language_icon/LanguageIcon-class.md"}},{"name":"shouldRepaint","qualifiedName":"language_icon.LanguageIcon.shouldRepaint","href":"custom_painters_language_icon/LanguageIcon/shouldRepaint.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Called whenever a new instance of the custom painter delegate class is\nprovided to the RenderCustomPaint object, or any time that a new\nCustomPaint object is created with a new instance of the custom painter\ndelegate class (which amounts to the same thing, because the latter is\nimplemented in terms of the former).","enclosedBy":{"name":"LanguageIcon","type":"class","href":"custom_painters_language_icon/LanguageIcon-class.md"}},{"name":"language_model","qualifiedName":"language_model","href":"models_language_language_model/models_language_language_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"Language","qualifiedName":"language_model.Language","href":"models_language_language_model/Language-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creates an langauge model.","enclosedBy":{"name":"language_model","type":"library","href":"models_language_language_model/models_language_language_model-library.md"}},{"name":"Language","qualifiedName":"language_model.Language.Language","href":"models_language_language_model/Language/Language.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Language","type":"class","href":"models_language_language_model/Language-class.md"}},{"name":"countryCode","qualifiedName":"language_model.Language.countryCode","href":"models_language_language_model/Language/countryCode.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Language","type":"class","href":"models_language_language_model/Language-class.md"}},{"name":"langCode","qualifiedName":"language_model.Language.langCode","href":"models_language_language_model/Language/langCode.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Language","type":"class","href":"models_language_language_model/Language-class.md"}},{"name":"langName","qualifiedName":"language_model.Language.langName","href":"models_language_language_model/Language/langName.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Language","type":"class","href":"models_language_language_model/Language-class.md"}},{"name":"langSample","qualifiedName":"language_model.Language.langSample","href":"models_language_language_model/Language/langSample.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Language","type":"class","href":"models_language_language_model/Language-class.md"}},{"name":"like_button_view_model","qualifiedName":"like_button_view_model","href":"view_model_widgets_view_models_like_button_view_model/view_model_widgets_view_models_like_button_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"LikeButtonViewModel","qualifiedName":"like_button_view_model.LikeButtonViewModel","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"LikeButtonViewModel class helps to serve the data and\nto react to user's input for Like Button Widget.","enclosedBy":{"name":"like_button_view_model","type":"library","href":"view_model_widgets_view_models_like_button_view_model/view_model_widgets_view_models_like_button_view_model-library.md"}},{"name":"LikeButtonViewModel","qualifiedName":"like_button_view_model.LikeButtonViewModel.LikeButtonViewModel","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/LikeButtonViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LikeButtonViewModel","type":"class","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md"}},{"name":"checkAndSetTheIsLiked","qualifiedName":"like_button_view_model.LikeButtonViewModel.checkAndSetTheIsLiked","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/checkAndSetTheIsLiked.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LikeButtonViewModel","type":"class","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md"}},{"name":"dispose","qualifiedName":"like_button_view_model.LikeButtonViewModel.dispose","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/dispose.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Discards any resources used by the object. After this is called, the\nobject is not in a usable state and should be discarded (calls to\naddListener will throw after the object is disposed).","enclosedBy":{"name":"LikeButtonViewModel","type":"class","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md"}},{"name":"initialize","qualifiedName":"like_button_view_model.LikeButtonViewModel.initialize","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/initialize.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LikeButtonViewModel","type":"class","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md"}},{"name":"isLiked","qualifiedName":"like_button_view_model.LikeButtonViewModel.isLiked","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/isLiked.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LikeButtonViewModel","type":"class","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md"}},{"name":"likedBy","qualifiedName":"like_button_view_model.LikeButtonViewModel.likedBy","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/likedBy.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LikeButtonViewModel","type":"class","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md"}},{"name":"likesCount","qualifiedName":"like_button_view_model.LikeButtonViewModel.likesCount","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/likesCount.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LikeButtonViewModel","type":"class","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md"}},{"name":"setIsLiked","qualifiedName":"like_button_view_model.LikeButtonViewModel.setIsLiked","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/setIsLiked.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function set _isLike to true.","enclosedBy":{"name":"LikeButtonViewModel","type":"class","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md"}},{"name":"toggleIsLiked","qualifiedName":"like_button_view_model.LikeButtonViewModel.toggleIsLiked","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/toggleIsLiked.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function add like to the post if not liked and\nremove the like from the post if liked.","enclosedBy":{"name":"LikeButtonViewModel","type":"class","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md"}},{"name":"updatePost","qualifiedName":"like_button_view_model.LikeButtonViewModel.updatePost","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/updatePost.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function updates the Post.","enclosedBy":{"name":"LikeButtonViewModel","type":"class","href":"view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md"}},{"name":"locator","qualifiedName":"locator","href":"locator/locator-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"connectivity","qualifiedName":"locator.connectivity","href":"locator/connectivity.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"creating GetIt for Connectivity.","enclosedBy":{"name":"locator","type":"library","href":"locator/locator-library.md"}},{"name":"databaseFunctions","qualifiedName":"locator.databaseFunctions","href":"locator/databaseFunctions.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"creating GetIt for DataBaseMutationFunctions.","enclosedBy":{"name":"locator","type":"library","href":"locator/locator-library.md"}},{"name":"graphqlConfig","qualifiedName":"locator.graphqlConfig","href":"locator/graphqlConfig.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"creating GetIt for GraphqlConfig.","enclosedBy":{"name":"locator","type":"library","href":"locator/locator-library.md"}},{"name":"imageCropper","qualifiedName":"locator.imageCropper","href":"locator/imageCropper.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"creating GetIt for ImageCropper.","enclosedBy":{"name":"locator","type":"library","href":"locator/locator-library.md"}},{"name":"imagePicker","qualifiedName":"locator.imagePicker","href":"locator/imagePicker.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"creating GetIt for ImagePicker.","enclosedBy":{"name":"locator","type":"library","href":"locator/locator-library.md"}},{"name":"locator","qualifiedName":"locator.locator","href":"locator/locator.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"Intializaing the locator.","enclosedBy":{"name":"locator","type":"library","href":"locator/locator-library.md"}},{"name":"navigationService","qualifiedName":"locator.navigationService","href":"locator/navigationService.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"creating GetIt for NavigationService.","enclosedBy":{"name":"locator","type":"library","href":"locator/locator-library.md"}},{"name":"organizationService","qualifiedName":"locator.organizationService","href":"locator/organizationService.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"creating GetIt for OrganizationService.","enclosedBy":{"name":"locator","type":"library","href":"locator/locator-library.md"}},{"name":"queries","qualifiedName":"locator.queries","href":"locator/queries.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"creating GetIt for Queries.","enclosedBy":{"name":"locator","type":"library","href":"locator/locator-library.md"}},{"name":"setupLocator","qualifiedName":"locator.setupLocator","href":"locator/setupLocator.md","type":"function","overriddenDepth":0,"packageName":"talawa","desc":"This function registers the widgets/objects in \"GetIt\".","enclosedBy":{"name":"locator","type":"library","href":"locator/locator-library.md"}},{"name":"sizeConfig","qualifiedName":"locator.sizeConfig","href":"locator/sizeConfig.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"creating GetIt for SizeConfig.","enclosedBy":{"name":"locator","type":"library","href":"locator/locator-library.md"}},{"name":"userConfig","qualifiedName":"locator.userConfig","href":"locator/userConfig.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"creating GetIt for UserConfig.","enclosedBy":{"name":"locator","type":"library","href":"locator/locator-library.md"}},{"name":"login","qualifiedName":"login","href":"views_pre_auth_screens_login/views_pre_auth_screens_login-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"Login","qualifiedName":"login.Login","href":"views_pre_auth_screens_login/Login-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This is the login widget.\nThere are two input fiels. The first one takes in the email and\nthe second one takes in the password of the user.\nThere is also a \"Forgot Password\" text button, which directs to\nthe \"recover password\" screen when pressed.\nAt the bottom, there is a login button to initiate the login.","enclosedBy":{"name":"login","type":"library","href":"views_pre_auth_screens_login/views_pre_auth_screens_login-library.md"}},{"name":"Login","qualifiedName":"login.Login.Login","href":"views_pre_auth_screens_login/Login/Login.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Login","type":"class","href":"views_pre_auth_screens_login/Login-class.md"}},{"name":"createState","qualifiedName":"login.Login.createState","href":"views_pre_auth_screens_login/Login/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"Login","type":"class","href":"views_pre_auth_screens_login/Login-class.md"}},{"name":"login_view_model","qualifiedName":"login_view_model","href":"view_model_pre_auth_view_models_login_view_model/view_model_pre_auth_view_models_login_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"LoginViewModel","qualifiedName":"login_view_model.LoginViewModel","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"LoginViewModel class helps to interact with model to serve data\nand react to user's input in Login View.","enclosedBy":{"name":"login_view_model","type":"library","href":"view_model_pre_auth_view_models_login_view_model/view_model_pre_auth_view_models_login_view_model-library.md"}},{"name":"LoginViewModel","qualifiedName":"login_view_model.LoginViewModel.LoginViewModel","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel/LoginViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LoginViewModel","type":"class","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md"}},{"name":"email","qualifiedName":"login_view_model.LoginViewModel.email","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel/email.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LoginViewModel","type":"class","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md"}},{"name":"emailFocus","qualifiedName":"login_view_model.LoginViewModel.emailFocus","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel/emailFocus.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LoginViewModel","type":"class","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md"}},{"name":"formKey","qualifiedName":"login_view_model.LoginViewModel.formKey","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel/formKey.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LoginViewModel","type":"class","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md"}},{"name":"greeting","qualifiedName":"login_view_model.LoginViewModel.greeting","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel/greeting.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LoginViewModel","type":"class","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md"}},{"name":"hidePassword","qualifiedName":"login_view_model.LoginViewModel.hidePassword","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel/hidePassword.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LoginViewModel","type":"class","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md"}},{"name":"initialize","qualifiedName":"login_view_model.LoginViewModel.initialize","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel/initialize.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LoginViewModel","type":"class","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md"}},{"name":"login","qualifiedName":"login_view_model.LoginViewModel.login","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel/login.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to sign-in the user into application.","enclosedBy":{"name":"LoginViewModel","type":"class","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md"}},{"name":"password","qualifiedName":"login_view_model.LoginViewModel.password","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel/password.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LoginViewModel","type":"class","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md"}},{"name":"passwordFocus","qualifiedName":"login_view_model.LoginViewModel.passwordFocus","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel/passwordFocus.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LoginViewModel","type":"class","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md"}},{"name":"validate","qualifiedName":"login_view_model.LoginViewModel.validate","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel/validate.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LoginViewModel","type":"class","href":"view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md"}},{"name":"main","qualifiedName":"main","href":"main/main-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"DemoPageView","qualifiedName":"main.DemoPageView","href":"main/DemoPageView-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"PageView is a scrollable list that works page by page.","enclosedBy":{"name":"main","type":"library","href":"main/main-library.md"}},{"name":"DemoPageView","qualifiedName":"main.DemoPageView.DemoPageView","href":"main/DemoPageView/DemoPageView.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DemoPageView","type":"class","href":"main/DemoPageView-class.md"}},{"name":"build","qualifiedName":"main.DemoPageView.build","href":"main/DemoPageView/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"DemoPageView","type":"class","href":"main/DemoPageView-class.md"}},{"name":"DemoViewModel","qualifiedName":"main.DemoViewModel","href":"main/DemoViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"ViewModel uses property-based data binding to establish a connection.","enclosedBy":{"name":"main","type":"library","href":"main/main-library.md"}},{"name":"DemoViewModel","qualifiedName":"main.DemoViewModel.DemoViewModel","href":"main/DemoViewModel/DemoViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DemoViewModel","type":"class","href":"main/DemoViewModel-class.md"}},{"name":"title","qualifiedName":"main.DemoViewModel.title","href":"main/DemoViewModel/title.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Getter function of the title.","enclosedBy":{"name":"DemoViewModel","type":"class","href":"main/DemoViewModel-class.md"}},{"name":"MyApp","qualifiedName":"main.MyApp","href":"main/MyApp-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"Main widget that sets up the quick actions, internationalization, routing , notifications.","enclosedBy":{"name":"main","type":"library","href":"main/main-library.md"}},{"name":"MyApp","qualifiedName":"main.MyApp.MyApp","href":"main/MyApp/MyApp.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MyApp","type":"class","href":"main/MyApp-class.md"}},{"name":"createState","qualifiedName":"main.MyApp.createState","href":"main/MyApp/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"MyApp","type":"class","href":"main/MyApp-class.md"}},{"name":"androidFirebaseOptions","qualifiedName":"main.androidFirebaseOptions","href":"main/androidFirebaseOptions.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"HashMap of Firebase options for android.","enclosedBy":{"name":"main","type":"library","href":"main/main-library.md"}},{"name":"channel","qualifiedName":"main.channel","href":"main/channel.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"Create a AndroidNotificationChannel for heads up notifications.","enclosedBy":{"name":"main","type":"library","href":"main/main-library.md"}},{"name":"flutterLocalNotificationsPlugin","qualifiedName":"main.flutterLocalNotificationsPlugin","href":"main/flutterLocalNotificationsPlugin.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"Initialize the FlutterLocalNotificationsPlugin package.","enclosedBy":{"name":"main","type":"library","href":"main/main-library.md"}},{"name":"iosFirebaseOptions","qualifiedName":"main.iosFirebaseOptions","href":"main/iosFirebaseOptions.md","type":"top-level property","overriddenDepth":0,"packageName":"talawa","desc":"HashMap of Firebase options for android.","enclosedBy":{"name":"main","type":"library","href":"main/main-library.md"}},{"name":"main","qualifiedName":"main.main","href":"main/main.md","type":"function","overriddenDepth":0,"packageName":"talawa","desc":"First function to initialize the application, invoked automatically.","enclosedBy":{"name":"main","type":"library","href":"main/main-library.md"}},{"name":"setUpFirebase","qualifiedName":"main.setUpFirebase","href":"main/setUpFirebase.md","type":"function","overriddenDepth":0,"packageName":"talawa","desc":"Initializes the firebase in the app according to the userplatform (android/iOS).","enclosedBy":{"name":"main","type":"library","href":"main/main-library.md"}},{"name":"setUpFirebaseKeys","qualifiedName":"main.setUpFirebaseKeys","href":"main/setUpFirebaseKeys.md","type":"function","overriddenDepth":0,"packageName":"talawa","desc":"Initializes the firebase keys in the app according to the userplatform (android/iOS).","enclosedBy":{"name":"main","type":"library","href":"main/main-library.md"}},{"name":"setUpFirebaseMessaging","qualifiedName":"main.setUpFirebaseMessaging","href":"main/setUpFirebaseMessaging.md","type":"function","overriddenDepth":0,"packageName":"talawa","desc":"Set up firebase instance, enbables messaging,listens to icoming messages.","enclosedBy":{"name":"main","type":"library","href":"main/main-library.md"}},{"name":"main_screen","qualifiedName":"main_screen","href":"views_main_screen/views_main_screen-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"MainScreen","qualifiedName":"main_screen.MainScreen","href":"views_main_screen/MainScreen-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"main_screen","type":"library","href":"views_main_screen/views_main_screen-library.md"}},{"name":"MainScreen","qualifiedName":"main_screen.MainScreen.MainScreen","href":"views_main_screen/MainScreen/MainScreen.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MainScreen","type":"class","href":"views_main_screen/MainScreen-class.md"}},{"name":"createState","qualifiedName":"main_screen.MainScreen.createState","href":"views_main_screen/MainScreen/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"MainScreen","type":"class","href":"views_main_screen/MainScreen-class.md"}},{"name":"mainScreenArgs","qualifiedName":"main_screen.MainScreen.mainScreenArgs","href":"views_main_screen/MainScreen/mainScreenArgs.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MainScreen","type":"class","href":"views_main_screen/MainScreen-class.md"}},{"name":"main_screen_view_model","qualifiedName":"main_screen_view_model","href":"view_model_main_screen_view_model/view_model_main_screen_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"MainScreenViewModel","qualifiedName":"main_screen_view_model.MainScreenViewModel","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"MainScreenViewModel class provide methods to interact with the modal to serve data in user's action in Main Screen Views.","enclosedBy":{"name":"main_screen_view_model","type":"library","href":"view_model_main_screen_view_model/view_model_main_screen_view_model-library.md"}},{"name":"MainScreenViewModel","qualifiedName":"main_screen_view_model.MainScreenViewModel.MainScreenViewModel","href":"view_model_main_screen_view_model/MainScreenViewModel/MainScreenViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"context","qualifiedName":"main_screen_view_model.MainScreenViewModel.context","href":"view_model_main_screen_view_model/MainScreenViewModel/context.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"context consist of parent info.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"currentPageIndex","qualifiedName":"main_screen_view_model.MainScreenViewModel.currentPageIndex","href":"view_model_main_screen_view_model/MainScreenViewModel/currentPageIndex.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"var for current page in index.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"fetchAndAddPlugins","qualifiedName":"main_screen_view_model.MainScreenViewModel.fetchAndAddPlugins","href":"view_model_main_screen_view_model/MainScreenViewModel/fetchAndAddPlugins.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Dynamically adds BottomNavigationBarItems in BottomNavigationBar.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"focusTarget","qualifiedName":"main_screen_view_model.MainScreenViewModel.focusTarget","href":"view_model_main_screen_view_model/MainScreenViewModel/focusTarget.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This returns a widget for a step in a tutorial.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"initialise","qualifiedName":"main_screen_view_model.MainScreenViewModel.initialise","href":"view_model_main_screen_view_model/MainScreenViewModel/initialise.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Initalizing function.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keyBNChat","qualifiedName":"main_screen_view_model.MainScreenViewModel.keyBNChat","href":"view_model_main_screen_view_model/MainScreenViewModel/keyBNChat.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keyBNEvents","qualifiedName":"main_screen_view_model.MainScreenViewModel.keyBNEvents","href":"view_model_main_screen_view_model/MainScreenViewModel/keyBNEvents.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keyBNHome","qualifiedName":"main_screen_view_model.MainScreenViewModel.keyBNHome","href":"view_model_main_screen_view_model/MainScreenViewModel/keyBNHome.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keyBNPost","qualifiedName":"main_screen_view_model.MainScreenViewModel.keyBNPost","href":"view_model_main_screen_view_model/MainScreenViewModel/keyBNPost.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keyBNProfile","qualifiedName":"main_screen_view_model.MainScreenViewModel.keyBNProfile","href":"view_model_main_screen_view_model/MainScreenViewModel/keyBNProfile.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keyDrawerCurOrg","qualifiedName":"main_screen_view_model.MainScreenViewModel.keyDrawerCurOrg","href":"view_model_main_screen_view_model/MainScreenViewModel/keyDrawerCurOrg.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keyDrawerJoinOrg","qualifiedName":"main_screen_view_model.MainScreenViewModel.keyDrawerJoinOrg","href":"view_model_main_screen_view_model/MainScreenViewModel/keyDrawerJoinOrg.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keyDrawerLeaveCurrentOrg","qualifiedName":"main_screen_view_model.MainScreenViewModel.keyDrawerLeaveCurrentOrg","href":"view_model_main_screen_view_model/MainScreenViewModel/keyDrawerLeaveCurrentOrg.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keyDrawerSwitchableOrg","qualifiedName":"main_screen_view_model.MainScreenViewModel.keyDrawerSwitchableOrg","href":"view_model_main_screen_view_model/MainScreenViewModel/keyDrawerSwitchableOrg.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keySEAdd","qualifiedName":"main_screen_view_model.MainScreenViewModel.keySEAdd","href":"view_model_main_screen_view_model/MainScreenViewModel/keySEAdd.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keySECard","qualifiedName":"main_screen_view_model.MainScreenViewModel.keySECard","href":"view_model_main_screen_view_model/MainScreenViewModel/keySECard.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keySECategoryMenu","qualifiedName":"main_screen_view_model.MainScreenViewModel.keySECategoryMenu","href":"view_model_main_screen_view_model/MainScreenViewModel/keySECategoryMenu.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keySEDateFilter","qualifiedName":"main_screen_view_model.MainScreenViewModel.keySEDateFilter","href":"view_model_main_screen_view_model/MainScreenViewModel/keySEDateFilter.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keySHMenuIcon","qualifiedName":"main_screen_view_model.MainScreenViewModel.keySHMenuIcon","href":"view_model_main_screen_view_model/MainScreenViewModel/keySHMenuIcon.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keySHOrgName","qualifiedName":"main_screen_view_model.MainScreenViewModel.keySHOrgName","href":"view_model_main_screen_view_model/MainScreenViewModel/keySHOrgName.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keySHPinnedPost","qualifiedName":"main_screen_view_model.MainScreenViewModel.keySHPinnedPost","href":"view_model_main_screen_view_model/MainScreenViewModel/keySHPinnedPost.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keySHPost","qualifiedName":"main_screen_view_model.MainScreenViewModel.keySHPost","href":"view_model_main_screen_view_model/MainScreenViewModel/keySHPost.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keySPAppSetting","qualifiedName":"main_screen_view_model.MainScreenViewModel.keySPAppSetting","href":"view_model_main_screen_view_model/MainScreenViewModel/keySPAppSetting.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keySPDonateUs","qualifiedName":"main_screen_view_model.MainScreenViewModel.keySPDonateUs","href":"view_model_main_screen_view_model/MainScreenViewModel/keySPDonateUs.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keySPEditProfile","qualifiedName":"main_screen_view_model.MainScreenViewModel.keySPEditProfile","href":"view_model_main_screen_view_model/MainScreenViewModel/keySPEditProfile.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keySPHelp","qualifiedName":"main_screen_view_model.MainScreenViewModel.keySPHelp","href":"view_model_main_screen_view_model/MainScreenViewModel/keySPHelp.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keySPInvite","qualifiedName":"main_screen_view_model.MainScreenViewModel.keySPInvite","href":"view_model_main_screen_view_model/MainScreenViewModel/keySPInvite.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keySPLogout","qualifiedName":"main_screen_view_model.MainScreenViewModel.keySPLogout","href":"view_model_main_screen_view_model/MainScreenViewModel/keySPLogout.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"keySPPalisadoes","qualifiedName":"main_screen_view_model.MainScreenViewModel.keySPPalisadoes","href":"view_model_main_screen_view_model/MainScreenViewModel/keySPPalisadoes.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"navBarItems","qualifiedName":"main_screen_view_model.MainScreenViewModel.navBarItems","href":"view_model_main_screen_view_model/MainScreenViewModel/navBarItems.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Actual BottomNavigationBarItems that show up on the screen.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"onTabTapped","qualifiedName":"main_screen_view_model.MainScreenViewModel.onTabTapped","href":"view_model_main_screen_view_model/MainScreenViewModel/onTabTapped.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Handles click on BottomNavigationBarItem.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"pages","qualifiedName":"main_screen_view_model.MainScreenViewModel.pages","href":"view_model_main_screen_view_model/MainScreenViewModel/pages.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Contains the Widgets to be rendered for corresponding navbar items.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"pluginList","qualifiedName":"main_screen_view_model.MainScreenViewModel.pluginList","href":"view_model_main_screen_view_model/MainScreenViewModel/pluginList.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"list of all the pluginList.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"pluginPrototypeData","qualifiedName":"main_screen_view_model.MainScreenViewModel.pluginPrototypeData","href":"view_model_main_screen_view_model/MainScreenViewModel/pluginPrototypeData.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Maps the feature names with their proper Icon and Page.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"scaffoldKey","qualifiedName":"main_screen_view_model.MainScreenViewModel.scaffoldKey","href":"view_model_main_screen_view_model/MainScreenViewModel/scaffoldKey.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"showAppTour","qualifiedName":"main_screen_view_model.MainScreenViewModel.showAppTour","href":"view_model_main_screen_view_model/MainScreenViewModel/showAppTour.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"bool to determine if we wanna show the apptour.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"showHome","qualifiedName":"main_screen_view_model.MainScreenViewModel.showHome","href":"view_model_main_screen_view_model/MainScreenViewModel/showHome.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function shows the Home screen.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"showTutorial","qualifiedName":"main_screen_view_model.MainScreenViewModel.showTutorial","href":"view_model_main_screen_view_model/MainScreenViewModel/showTutorial.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function show tutorial to user.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"targets","qualifiedName":"main_screen_view_model.MainScreenViewModel.targets","href":"view_model_main_screen_view_model/MainScreenViewModel/targets.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"array of target.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"tourAddPost","qualifiedName":"main_screen_view_model.MainScreenViewModel.tourAddPost","href":"view_model_main_screen_view_model/MainScreenViewModel/tourAddPost.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function show the tutorial to add Post in the organization.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"tourChat","qualifiedName":"main_screen_view_model.MainScreenViewModel.tourChat","href":"view_model_main_screen_view_model/MainScreenViewModel/tourChat.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function show the tour of chats.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"tourComplete","qualifiedName":"main_screen_view_model.MainScreenViewModel.tourComplete","href":"view_model_main_screen_view_model/MainScreenViewModel/tourComplete.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"bool to determine if apptour is complete.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"tourEventTargets","qualifiedName":"main_screen_view_model.MainScreenViewModel.tourEventTargets","href":"view_model_main_screen_view_model/MainScreenViewModel/tourEventTargets.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function show the tutorial for Events.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"tourHomeTargets","qualifiedName":"main_screen_view_model.MainScreenViewModel.tourHomeTargets","href":"view_model_main_screen_view_model/MainScreenViewModel/tourHomeTargets.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"this functions starts the tour and info to be displayed is mentioned in this functions.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"tourProfile","qualifiedName":"main_screen_view_model.MainScreenViewModel.tourProfile","href":"view_model_main_screen_view_model/MainScreenViewModel/tourProfile.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function show the tutorial for the profile page.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"tourSkipped","qualifiedName":"main_screen_view_model.MainScreenViewModel.tourSkipped","href":"view_model_main_screen_view_model/MainScreenViewModel/tourSkipped.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"bool to determine if apptour is skipped.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"tutorialCoachMark","qualifiedName":"main_screen_view_model.MainScreenViewModel.tutorialCoachMark","href":"view_model_main_screen_view_model/MainScreenViewModel/tutorialCoachMark.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"tutorialCoachMark consist of coach used to give tutorial.","enclosedBy":{"name":"MainScreenViewModel","type":"class","href":"view_model_main_screen_view_model/MainScreenViewModel-class.md"}},{"name":"mainscreen_navigation_args","qualifiedName":"mainscreen_navigation_args","href":"models_mainscreen_navigation_args/models_mainscreen_navigation_args-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"MainScreenArgs","qualifiedName":"mainscreen_navigation_args.MainScreenArgs","href":"models_mainscreen_navigation_args/MainScreenArgs-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"mainscreen_navigation_args","type":"library","href":"models_mainscreen_navigation_args/models_mainscreen_navigation_args-library.md"}},{"name":"MainScreenArgs","qualifiedName":"mainscreen_navigation_args.MainScreenArgs.MainScreenArgs","href":"models_mainscreen_navigation_args/MainScreenArgs/MainScreenArgs.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MainScreenArgs","type":"class","href":"models_mainscreen_navigation_args/MainScreenArgs-class.md"}},{"name":"fromSignUp","qualifiedName":"mainscreen_navigation_args.MainScreenArgs.fromSignUp","href":"models_mainscreen_navigation_args/MainScreenArgs/fromSignUp.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MainScreenArgs","type":"class","href":"models_mainscreen_navigation_args/MainScreenArgs-class.md"}},{"name":"mainScreenIndex","qualifiedName":"mainscreen_navigation_args.MainScreenArgs.mainScreenIndex","href":"models_mainscreen_navigation_args/MainScreenArgs/mainScreenIndex.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MainScreenArgs","type":"class","href":"models_mainscreen_navigation_args/MainScreenArgs-class.md"}},{"name":"map_screen","qualifiedName":"map_screen","href":"views_after_auth_screens_venue_map_screen/views_after_auth_screens_venue_map_screen-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"MapScreen","qualifiedName":"map_screen.MapScreen","href":"views_after_auth_screens_venue_map_screen/MapScreen-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"MapScreen returns a widget that has mutable state _MapScreenState.","enclosedBy":{"name":"map_screen","type":"library","href":"views_after_auth_screens_venue_map_screen/views_after_auth_screens_venue_map_screen-library.md"}},{"name":"MapScreen","qualifiedName":"map_screen.MapScreen.MapScreen","href":"views_after_auth_screens_venue_map_screen/MapScreen/MapScreen.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MapScreen","type":"class","href":"views_after_auth_screens_venue_map_screen/MapScreen-class.md"}},{"name":"createState","qualifiedName":"map_screen.MapScreen.createState","href":"views_after_auth_screens_venue_map_screen/MapScreen/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"MapScreen","type":"class","href":"views_after_auth_screens_venue_map_screen/MapScreen-class.md"}},{"name":"latitude","qualifiedName":"map_screen.MapScreen.latitude","href":"views_after_auth_screens_venue_map_screen/MapScreen/latitude.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MapScreen","type":"class","href":"views_after_auth_screens_venue_map_screen/MapScreen-class.md"}},{"name":"longitude","qualifiedName":"map_screen.MapScreen.longitude","href":"views_after_auth_screens_venue_map_screen/MapScreen/longitude.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MapScreen","type":"class","href":"views_after_auth_screens_venue_map_screen/MapScreen-class.md"}},{"name":"model","qualifiedName":"map_screen.MapScreen.model","href":"views_after_auth_screens_venue_map_screen/MapScreen/model.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MapScreen","type":"class","href":"views_after_auth_screens_venue_map_screen/MapScreen-class.md"}},{"name":"member_name_tile","qualifiedName":"member_name_tile","href":"widgets_member_name_tile/widgets_member_name_tile-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"MemberNameTile","qualifiedName":"member_name_tile.MemberNameTile","href":"widgets_member_name_tile/MemberNameTile-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This widget returns a tile containing the name of the member.\nAlong with the name, there is a circle avatar which either contains\nthe image uploaded by the user or the first character of his/her name in\nuppercase.","enclosedBy":{"name":"member_name_tile","type":"library","href":"widgets_member_name_tile/widgets_member_name_tile-library.md"}},{"name":"MemberNameTile","qualifiedName":"member_name_tile.MemberNameTile.MemberNameTile","href":"widgets_member_name_tile/MemberNameTile/MemberNameTile.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MemberNameTile","type":"class","href":"widgets_member_name_tile/MemberNameTile-class.md"}},{"name":"build","qualifiedName":"member_name_tile.MemberNameTile.build","href":"widgets_member_name_tile/MemberNameTile/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"MemberNameTile","type":"class","href":"widgets_member_name_tile/MemberNameTile-class.md"}},{"name":"onDelete","qualifiedName":"member_name_tile.MemberNameTile.onDelete","href":"widgets_member_name_tile/MemberNameTile/onDelete.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MemberNameTile","type":"class","href":"widgets_member_name_tile/MemberNameTile-class.md"}},{"name":"userImage","qualifiedName":"member_name_tile.MemberNameTile.userImage","href":"widgets_member_name_tile/MemberNameTile/userImage.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MemberNameTile","type":"class","href":"widgets_member_name_tile/MemberNameTile-class.md"}},{"name":"userName","qualifiedName":"member_name_tile.MemberNameTile.userName","href":"widgets_member_name_tile/MemberNameTile/userName.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MemberNameTile","type":"class","href":"widgets_member_name_tile/MemberNameTile-class.md"}},{"name":"multi_media_pick_service","qualifiedName":"multi_media_pick_service","href":"services_third_party_service_multi_media_pick_service/services_third_party_service_multi_media_pick_service-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"MultiMediaPickerService","qualifiedName":"multi_media_pick_service.MultiMediaPickerService","href":"services_third_party_service_multi_media_pick_service/MultiMediaPickerService-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This is a third party service which provide the service to select the image from.","enclosedBy":{"name":"multi_media_pick_service","type":"library","href":"services_third_party_service_multi_media_pick_service/services_third_party_service_multi_media_pick_service-library.md"}},{"name":"MultiMediaPickerService","qualifiedName":"multi_media_pick_service.MultiMediaPickerService.MultiMediaPickerService","href":"services_third_party_service_multi_media_pick_service/MultiMediaPickerService/MultiMediaPickerService.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"MultiMediaPickerService","type":"class","href":"services_third_party_service_multi_media_pick_service/MultiMediaPickerService-class.md"}},{"name":"cropImage","qualifiedName":"multi_media_pick_service.MultiMediaPickerService.cropImage","href":"services_third_party_service_multi_media_pick_service/MultiMediaPickerService/cropImage.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to crop the image selected by the user.","enclosedBy":{"name":"MultiMediaPickerService","type":"class","href":"services_third_party_service_multi_media_pick_service/MultiMediaPickerService-class.md"}},{"name":"fileStream","qualifiedName":"multi_media_pick_service.MultiMediaPickerService.fileStream","href":"services_third_party_service_multi_media_pick_service/MultiMediaPickerService/fileStream.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"This function returns the stream of files.","enclosedBy":{"name":"MultiMediaPickerService","type":"class","href":"services_third_party_service_multi_media_pick_service/MultiMediaPickerService-class.md"}},{"name":"getPhotoFromGallery","qualifiedName":"multi_media_pick_service.MultiMediaPickerService.getPhotoFromGallery","href":"services_third_party_service_multi_media_pick_service/MultiMediaPickerService/getPhotoFromGallery.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to pick the image from gallery or to click the image from user's camera.","enclosedBy":{"name":"MultiMediaPickerService","type":"class","href":"services_third_party_service_multi_media_pick_service/MultiMediaPickerService-class.md"}},{"name":"navigation_service","qualifiedName":"navigation_service","href":"services_navigation_service/services_navigation_service-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"NavigationService","qualifiedName":"navigation_service.NavigationService","href":"services_navigation_service/NavigationService-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"NavigationService class provides different functions as service in the context of navigation.","enclosedBy":{"name":"navigation_service","type":"library","href":"services_navigation_service/services_navigation_service-library.md"}},{"name":"NavigationService","qualifiedName":"navigation_service.NavigationService.NavigationService","href":"services_navigation_service/NavigationService/NavigationService.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"NavigationService","type":"class","href":"services_navigation_service/NavigationService-class.md"}},{"name":"fromInviteLink","qualifiedName":"navigation_service.NavigationService.fromInviteLink","href":"services_navigation_service/NavigationService/fromInviteLink.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"NavigationService","type":"class","href":"services_navigation_service/NavigationService-class.md"}},{"name":"navigatorKey","qualifiedName":"navigation_service.NavigationService.navigatorKey","href":"services_navigation_service/NavigationService/navigatorKey.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"NavigationService","type":"class","href":"services_navigation_service/NavigationService-class.md"}},{"name":"pop","qualifiedName":"navigation_service.NavigationService.pop","href":"services_navigation_service/NavigationService/pop.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function pops the current state.","enclosedBy":{"name":"NavigationService","type":"class","href":"services_navigation_service/NavigationService-class.md"}},{"name":"popAndPushScreen","qualifiedName":"navigation_service.NavigationService.popAndPushScreen","href":"services_navigation_service/NavigationService/popAndPushScreen.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function pop the initial route and push the new route to the navigator.","enclosedBy":{"name":"NavigationService","type":"class","href":"services_navigation_service/NavigationService-class.md"}},{"name":"pushDialog","qualifiedName":"navigation_service.NavigationService.pushDialog","href":"services_navigation_service/NavigationService/pushDialog.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to show the custom Dialog.","enclosedBy":{"name":"NavigationService","type":"class","href":"services_navigation_service/NavigationService-class.md"}},{"name":"pushReplacementScreen","qualifiedName":"navigation_service.NavigationService.pushReplacementScreen","href":"services_navigation_service/NavigationService/pushReplacementScreen.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function push the route and replace the screen.","enclosedBy":{"name":"NavigationService","type":"class","href":"services_navigation_service/NavigationService-class.md"}},{"name":"pushScreen","qualifiedName":"navigation_service.NavigationService.pushScreen","href":"services_navigation_service/NavigationService/pushScreen.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function push the route to the navigator.","enclosedBy":{"name":"NavigationService","type":"class","href":"services_navigation_service/NavigationService-class.md"}},{"name":"removeAllAndPush","qualifiedName":"navigation_service.NavigationService.removeAllAndPush","href":"services_navigation_service/NavigationService/removeAllAndPush.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function remove all the routes till the particular route and add new route.","enclosedBy":{"name":"NavigationService","type":"class","href":"services_navigation_service/NavigationService-class.md"}},{"name":"showSnackBar","qualifiedName":"navigation_service.NavigationService.showSnackBar","href":"services_navigation_service/NavigationService/showSnackBar.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This is used for the quick alert of duration: 2 seconds with text message(passed).","enclosedBy":{"name":"NavigationService","type":"class","href":"services_navigation_service/NavigationService-class.md"}},{"name":"showTalawaErrorDialog","qualifiedName":"navigation_service.NavigationService.showTalawaErrorDialog","href":"services_navigation_service/NavigationService/showTalawaErrorDialog.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"NavigationService","type":"class","href":"services_navigation_service/NavigationService-class.md"}},{"name":"showTalawaErrorSnackBar","qualifiedName":"navigation_service.NavigationService.showTalawaErrorSnackBar","href":"services_navigation_service/NavigationService/showTalawaErrorSnackBar.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"NavigationService","type":"class","href":"services_navigation_service/NavigationService-class.md"}},{"name":"options","qualifiedName":"options","href":"models_options_options/models_options_options-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"Options","qualifiedName":"options.Options","href":"models_options_options/Options-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creates a Option model.","enclosedBy":{"name":"options","type":"library","href":"models_options_options/models_options_options-library.md"}},{"name":"Options","qualifiedName":"options.Options.Options","href":"models_options_options/Options/Options.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Options","type":"class","href":"models_options_options/Options-class.md"}},{"name":"icon","qualifiedName":"options.Options.icon","href":"models_options_options/Options/icon.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Options","type":"class","href":"models_options_options/Options-class.md"}},{"name":"subtitle","qualifiedName":"options.Options.subtitle","href":"models_options_options/Options/subtitle.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Options","type":"class","href":"models_options_options/Options-class.md"}},{"name":"title","qualifiedName":"options.Options.title","href":"models_options_options/Options/title.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Options","type":"class","href":"models_options_options/Options-class.md"}},{"name":"trailingIconButton","qualifiedName":"options.Options.trailingIconButton","href":"models_options_options/Options/trailingIconButton.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Options","type":"class","href":"models_options_options/Options-class.md"}},{"name":"org_info","qualifiedName":"org_info","href":"models_organization_org_info/models_organization_org_info-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"OrgInfo","qualifiedName":"org_info.OrgInfo","href":"models_organization_org_info/OrgInfo-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creates an organization-information model and returns an OrgInfo instance.","enclosedBy":{"name":"org_info","type":"library","href":"models_organization_org_info/models_organization_org_info-library.md"}},{"name":"OrgInfo","qualifiedName":"org_info.OrgInfo.OrgInfo","href":"models_organization_org_info/OrgInfo/OrgInfo.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrgInfo","type":"class","href":"models_organization_org_info/OrgInfo-class.md"}},{"name":"admins","qualifiedName":"org_info.OrgInfo.admins","href":"models_organization_org_info/OrgInfo/admins.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrgInfo","type":"class","href":"models_organization_org_info/OrgInfo-class.md"}},{"name":"creatorInfo","qualifiedName":"org_info.OrgInfo.creatorInfo","href":"models_organization_org_info/OrgInfo/creatorInfo.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrgInfo","type":"class","href":"models_organization_org_info/OrgInfo-class.md"}},{"name":"description","qualifiedName":"org_info.OrgInfo.description","href":"models_organization_org_info/OrgInfo/description.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrgInfo","type":"class","href":"models_organization_org_info/OrgInfo-class.md"}},{"name":"OrgInfo.fromJson","qualifiedName":"org_info.OrgInfo.fromJson","href":"models_organization_org_info/OrgInfo/OrgInfo.fromJson.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrgInfo","type":"class","href":"models_organization_org_info/OrgInfo-class.md"}},{"name":"fromJsonToList","qualifiedName":"org_info.OrgInfo.fromJsonToList","href":"models_organization_org_info/OrgInfo/fromJsonToList.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrgInfo","type":"class","href":"models_organization_org_info/OrgInfo-class.md"}},{"name":"id","qualifiedName":"org_info.OrgInfo.id","href":"models_organization_org_info/OrgInfo/id.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrgInfo","type":"class","href":"models_organization_org_info/OrgInfo-class.md"}},{"name":"image","qualifiedName":"org_info.OrgInfo.image","href":"models_organization_org_info/OrgInfo/image.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrgInfo","type":"class","href":"models_organization_org_info/OrgInfo-class.md"}},{"name":"isPublic","qualifiedName":"org_info.OrgInfo.isPublic","href":"models_organization_org_info/OrgInfo/isPublic.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrgInfo","type":"class","href":"models_organization_org_info/OrgInfo-class.md"}},{"name":"members","qualifiedName":"org_info.OrgInfo.members","href":"models_organization_org_info/OrgInfo/members.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrgInfo","type":"class","href":"models_organization_org_info/OrgInfo-class.md"}},{"name":"name","qualifiedName":"org_info.OrgInfo.name","href":"models_organization_org_info/OrgInfo/name.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrgInfo","type":"class","href":"models_organization_org_info/OrgInfo-class.md"}},{"name":"OrgInfoAdapter","qualifiedName":"org_info.OrgInfoAdapter","href":"models_organization_org_info/OrgInfoAdapter-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"org_info","type":"library","href":"models_organization_org_info/models_organization_org_info-library.md"}},{"name":"operator ==","qualifiedName":"org_info.OrgInfoAdapter.==","href":"models_organization_org_info/OrgInfoAdapter/operator_equals.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"The equality operator.","enclosedBy":{"name":"OrgInfoAdapter","type":"class","href":"models_organization_org_info/OrgInfoAdapter-class.md"}},{"name":"OrgInfoAdapter","qualifiedName":"org_info.OrgInfoAdapter.OrgInfoAdapter","href":"models_organization_org_info/OrgInfoAdapter/OrgInfoAdapter.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrgInfoAdapter","type":"class","href":"models_organization_org_info/OrgInfoAdapter-class.md"}},{"name":"hashCode","qualifiedName":"org_info.OrgInfoAdapter.hashCode","href":"models_organization_org_info/OrgInfoAdapter/hashCode.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"The hash code for this object.","enclosedBy":{"name":"OrgInfoAdapter","type":"class","href":"models_organization_org_info/OrgInfoAdapter-class.md"}},{"name":"read","qualifiedName":"org_info.OrgInfoAdapter.read","href":"models_organization_org_info/OrgInfoAdapter/read.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Is called when a value has to be decoded.","enclosedBy":{"name":"OrgInfoAdapter","type":"class","href":"models_organization_org_info/OrgInfoAdapter-class.md"}},{"name":"typeId","qualifiedName":"org_info.OrgInfoAdapter.typeId","href":"models_organization_org_info/OrgInfoAdapter/typeId.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Called for type registration","enclosedBy":{"name":"OrgInfoAdapter","type":"class","href":"models_organization_org_info/OrgInfoAdapter-class.md"}},{"name":"write","qualifiedName":"org_info.OrgInfoAdapter.write","href":"models_organization_org_info/OrgInfoAdapter/write.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Is called when a value has to be encoded.","enclosedBy":{"name":"OrgInfoAdapter","type":"class","href":"models_organization_org_info/OrgInfoAdapter-class.md"}},{"name":"org_service","qualifiedName":"org_service","href":"services_org_service/services_org_service-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"OrganizationService","qualifiedName":"org_service.OrganizationService","href":"services_org_service/OrganizationService-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"OrganizationService class provides the in the context of organizations.","enclosedBy":{"name":"org_service","type":"library","href":"services_org_service/services_org_service-library.md"}},{"name":"OrganizationService","qualifiedName":"org_service.OrganizationService.OrganizationService","href":"services_org_service/OrganizationService/OrganizationService.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrganizationService","type":"class","href":"services_org_service/OrganizationService-class.md"}},{"name":"getOrgMembersList","qualifiedName":"org_service.OrganizationService.getOrgMembersList","href":"services_org_service/OrganizationService/getOrgMembersList.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function fetch and returns the list of organization members.","enclosedBy":{"name":"OrganizationService","type":"class","href":"services_org_service/OrganizationService-class.md"}},{"name":"organization_feed","qualifiedName":"organization_feed","href":"views_after_auth_screens_feed_organization_feed/views_after_auth_screens_feed_organization_feed-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"OrganizationFeed","qualifiedName":"organization_feed.OrganizationFeed","href":"views_after_auth_screens_feed_organization_feed/OrganizationFeed-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"OrganizationFeed returns a widget that shows the feed of the organization.","enclosedBy":{"name":"organization_feed","type":"library","href":"views_after_auth_screens_feed_organization_feed/views_after_auth_screens_feed_organization_feed-library.md"}},{"name":"OrganizationFeed","qualifiedName":"organization_feed.OrganizationFeed.OrganizationFeed","href":"views_after_auth_screens_feed_organization_feed/OrganizationFeed/OrganizationFeed.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrganizationFeed","type":"class","href":"views_after_auth_screens_feed_organization_feed/OrganizationFeed-class.md"}},{"name":"build","qualifiedName":"organization_feed.OrganizationFeed.build","href":"views_after_auth_screens_feed_organization_feed/OrganizationFeed/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"OrganizationFeed","type":"class","href":"views_after_auth_screens_feed_organization_feed/OrganizationFeed-class.md"}},{"name":"forTest","qualifiedName":"organization_feed.OrganizationFeed.forTest","href":"views_after_auth_screens_feed_organization_feed/OrganizationFeed/forTest.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrganizationFeed","type":"class","href":"views_after_auth_screens_feed_organization_feed/OrganizationFeed-class.md"}},{"name":"homeModel","qualifiedName":"organization_feed.OrganizationFeed.homeModel","href":"views_after_auth_screens_feed_organization_feed/OrganizationFeed/homeModel.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrganizationFeed","type":"class","href":"views_after_auth_screens_feed_organization_feed/OrganizationFeed-class.md"}},{"name":"organization_feed_view_model","qualifiedName":"organization_feed_view_model","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"OrganizationFeedViewModel","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"OrganizationFeedViewModel class helps to interact with model to serve data to view for organization feed section.","enclosedBy":{"name":"organization_feed_view_model","type":"library","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model-library.md"}},{"name":"OrganizationFeedViewModel","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel.OrganizationFeedViewModel","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/OrganizationFeedViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrganizationFeedViewModel","type":"class","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md"}},{"name":"addNewPost","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel.addNewPost","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/addNewPost.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function adds new Post.","enclosedBy":{"name":"OrganizationFeedViewModel","type":"class","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md"}},{"name":"buildNewPosts","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel.buildNewPosts","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/buildNewPosts.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function initialise _posts with newPosts.","enclosedBy":{"name":"OrganizationFeedViewModel","type":"class","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md"}},{"name":"currentOrgName","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel.currentOrgName","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/currentOrgName.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrganizationFeedViewModel","type":"class","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md"}},{"name":"dispose","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel.dispose","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/dispose.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Discards any resources used by the object. After this is called, the\nobject is not in a usable state and should be discarded (calls to\naddListener will throw after the object is disposed).","enclosedBy":{"name":"OrganizationFeedViewModel","type":"class","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md"}},{"name":"fetchNewPosts","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel.fetchNewPosts","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/fetchNewPosts.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function fetches new posts in the organization.","enclosedBy":{"name":"OrganizationFeedViewModel","type":"class","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md"}},{"name":"initialise","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel.initialise","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/initialise.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrganizationFeedViewModel","type":"class","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md"}},{"name":"initializeWithDemoData","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel.initializeWithDemoData","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/initializeWithDemoData.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrganizationFeedViewModel","type":"class","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md"}},{"name":"istest","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel.istest","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/istest.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrganizationFeedViewModel","type":"class","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md"}},{"name":"navigateToIndividualPage","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel.navigateToIndividualPage","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/navigateToIndividualPage.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function navigate to individual post page.","enclosedBy":{"name":"OrganizationFeedViewModel","type":"class","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md"}},{"name":"navigateToPinnedPostPage","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel.navigateToPinnedPostPage","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/navigateToPinnedPostPage.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function navigate to pinned post page.","enclosedBy":{"name":"OrganizationFeedViewModel","type":"class","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md"}},{"name":"pinnedPosts","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel.pinnedPosts","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/pinnedPosts.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrganizationFeedViewModel","type":"class","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md"}},{"name":"posts","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel.posts","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/posts.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrganizationFeedViewModel","type":"class","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md"}},{"name":"setCurrentOrganizationName","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel.setCurrentOrganizationName","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/setCurrentOrganizationName.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function sets the organization name after update.","enclosedBy":{"name":"OrganizationFeedViewModel","type":"class","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md"}},{"name":"updatedPost","qualifiedName":"organization_feed_view_model.OrganizationFeedViewModel.updatedPost","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/updatedPost.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function updates the post.","enclosedBy":{"name":"OrganizationFeedViewModel","type":"class","href":"view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md"}},{"name":"organization_list","qualifiedName":"organization_list","href":"widgets_organization_list/widgets_organization_list-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"OrganizationList","qualifiedName":"organization_list.OrganizationList","href":"widgets_organization_list/OrganizationList-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class returns the OrganizationList widget.","enclosedBy":{"name":"organization_list","type":"library","href":"widgets_organization_list/widgets_organization_list-library.md"}},{"name":"OrganizationList","qualifiedName":"organization_list.OrganizationList.OrganizationList","href":"widgets_organization_list/OrganizationList/OrganizationList.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrganizationList","type":"class","href":"widgets_organization_list/OrganizationList-class.md"}},{"name":"build","qualifiedName":"organization_list.OrganizationList.build","href":"widgets_organization_list/OrganizationList/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"OrganizationList","type":"class","href":"widgets_organization_list/OrganizationList-class.md"}},{"name":"model","qualifiedName":"organization_list.OrganizationList.model","href":"widgets_organization_list/OrganizationList/model.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"model is a type of SelectOrganizationViewModel which provides methods to handle the data for this component.","enclosedBy":{"name":"OrganizationList","type":"class","href":"widgets_organization_list/OrganizationList-class.md"}},{"name":"organization_search_list","qualifiedName":"organization_search_list","href":"widgets_organization_search_list/widgets_organization_search_list-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"OrganizationSearchList","qualifiedName":"organization_search_list.OrganizationSearchList","href":"widgets_organization_search_list/OrganizationSearchList-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"OrganizationSearchList class return a widget that shows all\nthe matching organizations searched on the search bar.","enclosedBy":{"name":"organization_search_list","type":"library","href":"widgets_organization_search_list/widgets_organization_search_list-library.md"}},{"name":"OrganizationSearchList","qualifiedName":"organization_search_list.OrganizationSearchList.OrganizationSearchList","href":"widgets_organization_search_list/OrganizationSearchList/OrganizationSearchList.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrganizationSearchList","type":"class","href":"widgets_organization_search_list/OrganizationSearchList-class.md"}},{"name":"build","qualifiedName":"organization_search_list.OrganizationSearchList.build","href":"widgets_organization_search_list/OrganizationSearchList/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"OrganizationSearchList","type":"class","href":"widgets_organization_search_list/OrganizationSearchList-class.md"}},{"name":"model","qualifiedName":"organization_search_list.OrganizationSearchList.model","href":"widgets_organization_search_list/OrganizationSearchList/model.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"OrganizationSearchList","type":"class","href":"widgets_organization_search_list/OrganizationSearchList-class.md"}},{"name":"pinned_carousel_widget","qualifiedName":"pinned_carousel_widget","href":"widgets_pinned_carousel_widget/widgets_pinned_carousel_widget-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CustomCarouselScroller","qualifiedName":"pinned_carousel_widget.CustomCarouselScroller","href":"widgets_pinned_carousel_widget/CustomCarouselScroller-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"pinned_carousel_widget","type":"library","href":"widgets_pinned_carousel_widget/widgets_pinned_carousel_widget-library.md"}},{"name":"CustomCarouselScroller","qualifiedName":"pinned_carousel_widget.CustomCarouselScroller.CustomCarouselScroller","href":"widgets_pinned_carousel_widget/CustomCarouselScroller/CustomCarouselScroller.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomCarouselScroller","type":"class","href":"widgets_pinned_carousel_widget/CustomCarouselScroller-class.md"}},{"name":"createState","qualifiedName":"pinned_carousel_widget.CustomCarouselScroller.createState","href":"widgets_pinned_carousel_widget/CustomCarouselScroller/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"CustomCarouselScroller","type":"class","href":"widgets_pinned_carousel_widget/CustomCarouselScroller-class.md"}},{"name":"navigateToIndividualPostPage","qualifiedName":"pinned_carousel_widget.CustomCarouselScroller.navigateToIndividualPostPage","href":"widgets_pinned_carousel_widget/CustomCarouselScroller/navigateToIndividualPostPage.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomCarouselScroller","type":"class","href":"widgets_pinned_carousel_widget/CustomCarouselScroller-class.md"}},{"name":"pinnedPosts","qualifiedName":"pinned_carousel_widget.CustomCarouselScroller.pinnedPosts","href":"widgets_pinned_carousel_widget/CustomCarouselScroller/pinnedPosts.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomCarouselScroller","type":"class","href":"widgets_pinned_carousel_widget/CustomCarouselScroller-class.md"}},{"name":"CustomCarouselScrollerState","qualifiedName":"pinned_carousel_widget.CustomCarouselScrollerState","href":"widgets_pinned_carousel_widget/CustomCarouselScrollerState-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"CustomCarouselScrollerState class return a widget that is\nused to generate slider for pinned post on the top of the Home Screen.","enclosedBy":{"name":"pinned_carousel_widget","type":"library","href":"widgets_pinned_carousel_widget/widgets_pinned_carousel_widget-library.md"}},{"name":"CustomCarouselScrollerState","qualifiedName":"pinned_carousel_widget.CustomCarouselScrollerState.CustomCarouselScrollerState","href":"widgets_pinned_carousel_widget/CustomCarouselScrollerState/CustomCarouselScrollerState.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomCarouselScrollerState","type":"class","href":"widgets_pinned_carousel_widget/CustomCarouselScrollerState-class.md"}},{"name":"build","qualifiedName":"pinned_carousel_widget.CustomCarouselScrollerState.build","href":"widgets_pinned_carousel_widget/CustomCarouselScrollerState/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"CustomCarouselScrollerState","type":"class","href":"widgets_pinned_carousel_widget/CustomCarouselScrollerState-class.md"}},{"name":"controller","qualifiedName":"pinned_carousel_widget.CustomCarouselScrollerState.controller","href":"widgets_pinned_carousel_widget/CustomCarouselScrollerState/controller.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomCarouselScrollerState","type":"class","href":"widgets_pinned_carousel_widget/CustomCarouselScrollerState-class.md"}},{"name":"pindex","qualifiedName":"pinned_carousel_widget.CustomCarouselScrollerState.pindex","href":"widgets_pinned_carousel_widget/CustomCarouselScrollerState/pindex.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomCarouselScrollerState","type":"class","href":"widgets_pinned_carousel_widget/CustomCarouselScrollerState-class.md"}},{"name":"PinnedPostCarousel","qualifiedName":"pinned_carousel_widget.PinnedPostCarousel","href":"widgets_pinned_carousel_widget/PinnedPostCarousel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"PinnedPostCarousel class returns a widget for pinned posts in\nthe slider/carousel on the top of the Home Screen.\nTapping on a post will redirect you to the respective post screen.","enclosedBy":{"name":"pinned_carousel_widget","type":"library","href":"widgets_pinned_carousel_widget/widgets_pinned_carousel_widget-library.md"}},{"name":"PinnedPostCarousel","qualifiedName":"pinned_carousel_widget.PinnedPostCarousel.PinnedPostCarousel","href":"widgets_pinned_carousel_widget/PinnedPostCarousel/PinnedPostCarousel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PinnedPostCarousel","type":"class","href":"widgets_pinned_carousel_widget/PinnedPostCarousel-class.md"}},{"name":"build","qualifiedName":"pinned_carousel_widget.PinnedPostCarousel.build","href":"widgets_pinned_carousel_widget/PinnedPostCarousel/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"PinnedPostCarousel","type":"class","href":"widgets_pinned_carousel_widget/PinnedPostCarousel-class.md"}},{"name":"navigateToIndividualPostPage","qualifiedName":"pinned_carousel_widget.PinnedPostCarousel.navigateToIndividualPostPage","href":"widgets_pinned_carousel_widget/PinnedPostCarousel/navigateToIndividualPostPage.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PinnedPostCarousel","type":"class","href":"widgets_pinned_carousel_widget/PinnedPostCarousel-class.md"}},{"name":"navigateToPinnedPostPage","qualifiedName":"pinned_carousel_widget.PinnedPostCarousel.navigateToPinnedPostPage","href":"widgets_pinned_carousel_widget/PinnedPostCarousel/navigateToPinnedPostPage.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PinnedPostCarousel","type":"class","href":"widgets_pinned_carousel_widget/PinnedPostCarousel-class.md"}},{"name":"pinnedPosts","qualifiedName":"pinned_carousel_widget.PinnedPostCarousel.pinnedPosts","href":"widgets_pinned_carousel_widget/PinnedPostCarousel/pinnedPosts.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PinnedPostCarousel","type":"class","href":"widgets_pinned_carousel_widget/PinnedPostCarousel-class.md"}},{"name":"pinned_post_demo_data","qualifiedName":"pinned_post_demo_data","href":"demo_server_data_pinned_post_demo_data/demo_server_data_pinned_post_demo_data-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"pinnedPostsDemoData","qualifiedName":"pinned_post_demo_data.pinnedPostsDemoData","href":"demo_server_data_pinned_post_demo_data/pinnedPostsDemoData-constant.md","type":"top-level constant","overriddenDepth":0,"packageName":"talawa","desc":"This file contains demo data for pinned posts. It contains a list of type Map<String, Object> and sample data.","enclosedBy":{"name":"pinned_post_demo_data","type":"library","href":"demo_server_data_pinned_post_demo_data/demo_server_data_pinned_post_demo_data-library.md"}},{"name":"pinned_post_page","qualifiedName":"pinned_post_page","href":"views_after_auth_screens_feed_pinned_post_page/views_after_auth_screens_feed_pinned_post_page-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"PinnedPostPage","qualifiedName":"pinned_post_page.PinnedPostPage","href":"views_after_auth_screens_feed_pinned_post_page/PinnedPostPage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"PinnedPostPage returns a widget that shows the list of all the pinned post.","enclosedBy":{"name":"pinned_post_page","type":"library","href":"views_after_auth_screens_feed_pinned_post_page/views_after_auth_screens_feed_pinned_post_page-library.md"}},{"name":"PinnedPostPage","qualifiedName":"pinned_post_page.PinnedPostPage.PinnedPostPage","href":"views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/PinnedPostPage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PinnedPostPage","type":"class","href":"views_after_auth_screens_feed_pinned_post_page/PinnedPostPage-class.md"}},{"name":"build","qualifiedName":"pinned_post_page.PinnedPostPage.build","href":"views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"PinnedPostPage","type":"class","href":"views_after_auth_screens_feed_pinned_post_page/PinnedPostPage-class.md"}},{"name":"pinnedPosts","qualifiedName":"pinned_post_page.PinnedPostPage.pinnedPosts","href":"views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/pinnedPosts.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PinnedPostPage","type":"class","href":"views_after_auth_screens_feed_pinned_post_page/PinnedPostPage-class.md"}},{"name":"post_demo_data","qualifiedName":"post_demo_data","href":"demo_server_data_post_demo_data/demo_server_data_post_demo_data-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"postsDemoData","qualifiedName":"post_demo_data.postsDemoData","href":"demo_server_data_post_demo_data/postsDemoData-constant.md","type":"top-level constant","overriddenDepth":0,"packageName":"talawa","desc":"This file contains demo data for posts. It contains a list of type Map<String, Object>\nand sample data of posts.","enclosedBy":{"name":"post_demo_data","type":"library","href":"demo_server_data_post_demo_data/demo_server_data_post_demo_data-library.md"}},{"name":"post_detailed_page","qualifiedName":"post_detailed_page","href":"widgets_post_detailed_page/widgets_post_detailed_page-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"DescriptionTextWidget","qualifiedName":"post_detailed_page.DescriptionTextWidget","href":"widgets_post_detailed_page/DescriptionTextWidget-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class sets up the post page.\nTo implement the \"show less\" and \"show more\" functions for the text,\nwe divide the text into two parts: firstHalf and secondHalf. A flag is set to\ntrack whether to display either the firstHalf or both(the entire text).","enclosedBy":{"name":"post_detailed_page","type":"library","href":"widgets_post_detailed_page/widgets_post_detailed_page-library.md"}},{"name":"DescriptionTextWidget","qualifiedName":"post_detailed_page.DescriptionTextWidget.DescriptionTextWidget","href":"widgets_post_detailed_page/DescriptionTextWidget/DescriptionTextWidget.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DescriptionTextWidget","type":"class","href":"widgets_post_detailed_page/DescriptionTextWidget-class.md"}},{"name":"createState","qualifiedName":"post_detailed_page.DescriptionTextWidget.createState","href":"widgets_post_detailed_page/DescriptionTextWidget/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"DescriptionTextWidget","type":"class","href":"widgets_post_detailed_page/DescriptionTextWidget-class.md"}},{"name":"text","qualifiedName":"post_detailed_page.DescriptionTextWidget.text","href":"widgets_post_detailed_page/DescriptionTextWidget/text.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DescriptionTextWidget","type":"class","href":"widgets_post_detailed_page/DescriptionTextWidget-class.md"}},{"name":"post_list_widget","qualifiedName":"post_list_widget","href":"widgets_post_list_widget/widgets_post_list_widget-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"PostListWidget","qualifiedName":"post_list_widget.PostListWidget","href":"widgets_post_list_widget/PostListWidget-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class receives a List of all the Post widgets and returns a ListView.","enclosedBy":{"name":"post_list_widget","type":"library","href":"widgets_post_list_widget/widgets_post_list_widget-library.md"}},{"name":"PostListWidget","qualifiedName":"post_list_widget.PostListWidget.PostListWidget","href":"widgets_post_list_widget/PostListWidget/PostListWidget.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostListWidget","type":"class","href":"widgets_post_list_widget/PostListWidget-class.md"}},{"name":"build","qualifiedName":"post_list_widget.PostListWidget.build","href":"widgets_post_list_widget/PostListWidget/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"PostListWidget","type":"class","href":"widgets_post_list_widget/PostListWidget-class.md"}},{"name":"function","qualifiedName":"post_list_widget.PostListWidget.function","href":"widgets_post_list_widget/PostListWidget/function.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostListWidget","type":"class","href":"widgets_post_list_widget/PostListWidget-class.md"}},{"name":"posts","qualifiedName":"post_list_widget.PostListWidget.posts","href":"widgets_post_list_widget/PostListWidget/posts.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostListWidget","type":"class","href":"widgets_post_list_widget/PostListWidget-class.md"}},{"name":"post_model","qualifiedName":"post_model","href":"models_post_post_model/models_post_post_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"Comments","qualifiedName":"post_model.Comments","href":"models_post_post_model/Comments-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class convert between json and object for comments.","enclosedBy":{"name":"post_model","type":"library","href":"models_post_post_model/models_post_post_model-library.md"}},{"name":"Comments","qualifiedName":"post_model.Comments.Comments","href":"models_post_post_model/Comments/Comments.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Comments","type":"class","href":"models_post_post_model/Comments-class.md"}},{"name":"Comments.fromJson","qualifiedName":"post_model.Comments.fromJson","href":"models_post_post_model/Comments/Comments.fromJson.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"Convert json to dart object.","enclosedBy":{"name":"Comments","type":"class","href":"models_post_post_model/Comments-class.md"}},{"name":"sId","qualifiedName":"post_model.Comments.sId","href":"models_post_post_model/Comments/sId.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"these are dart object.","enclosedBy":{"name":"Comments","type":"class","href":"models_post_post_model/Comments-class.md"}},{"name":"toJson","qualifiedName":"post_model.Comments.toJson","href":"models_post_post_model/Comments/toJson.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Convert dart object to json.","enclosedBy":{"name":"Comments","type":"class","href":"models_post_post_model/Comments-class.md"}},{"name":"LikedBy","qualifiedName":"post_model.LikedBy","href":"models_post_post_model/LikedBy-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class convert between json and object for likedby.","enclosedBy":{"name":"post_model","type":"library","href":"models_post_post_model/models_post_post_model-library.md"}},{"name":"LikedBy","qualifiedName":"post_model.LikedBy.LikedBy","href":"models_post_post_model/LikedBy/LikedBy.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"LikedBy","type":"class","href":"models_post_post_model/LikedBy-class.md"}},{"name":"LikedBy.fromJson","qualifiedName":"post_model.LikedBy.fromJson","href":"models_post_post_model/LikedBy/LikedBy.fromJson.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"JSON factory constructor.","enclosedBy":{"name":"LikedBy","type":"class","href":"models_post_post_model/LikedBy-class.md"}},{"name":"sId","qualifiedName":"post_model.LikedBy.sId","href":"models_post_post_model/LikedBy/sId.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"These are dart object.","enclosedBy":{"name":"LikedBy","type":"class","href":"models_post_post_model/LikedBy-class.md"}},{"name":"toJson","qualifiedName":"post_model.LikedBy.toJson","href":"models_post_post_model/LikedBy/toJson.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Convert dart object to json.","enclosedBy":{"name":"LikedBy","type":"class","href":"models_post_post_model/LikedBy-class.md"}},{"name":"Post","qualifiedName":"post_model.Post","href":"models_post_post_model/Post-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creates a Post model.","enclosedBy":{"name":"post_model","type":"library","href":"models_post_post_model/models_post_post_model-library.md"}},{"name":"Post","qualifiedName":"post_model.Post.Post","href":"models_post_post_model/Post/Post.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Post","type":"class","href":"models_post_post_model/Post-class.md"}},{"name":"comments","qualifiedName":"post_model.Post.comments","href":"models_post_post_model/Post/comments.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"comments for post.","enclosedBy":{"name":"Post","type":"class","href":"models_post_post_model/Post-class.md"}},{"name":"createdAt","qualifiedName":"post_model.Post.createdAt","href":"models_post_post_model/Post/createdAt.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"createdAt for post.","enclosedBy":{"name":"Post","type":"class","href":"models_post_post_model/Post-class.md"}},{"name":"creator","qualifiedName":"post_model.Post.creator","href":"models_post_post_model/Post/creator.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"creator for post.","enclosedBy":{"name":"Post","type":"class","href":"models_post_post_model/Post-class.md"}},{"name":"description","qualifiedName":"post_model.Post.description","href":"models_post_post_model/Post/description.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"description for post.","enclosedBy":{"name":"Post","type":"class","href":"models_post_post_model/Post-class.md"}},{"name":"Post.fromJson","qualifiedName":"post_model.Post.fromJson","href":"models_post_post_model/Post/Post.fromJson.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"Creating a new Post instance from a map structure.","enclosedBy":{"name":"Post","type":"class","href":"models_post_post_model/Post-class.md"}},{"name":"getPostCreatedDuration","qualifiedName":"post_model.Post.getPostCreatedDuration","href":"models_post_post_model/Post/getPostCreatedDuration.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"this is to get duration of post.","enclosedBy":{"name":"Post","type":"class","href":"models_post_post_model/Post-class.md"}},{"name":"imageUrl","qualifiedName":"post_model.Post.imageUrl","href":"models_post_post_model/Post/imageUrl.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"imageUrl for post.","enclosedBy":{"name":"Post","type":"class","href":"models_post_post_model/Post-class.md"}},{"name":"likedBy","qualifiedName":"post_model.Post.likedBy","href":"models_post_post_model/Post/likedBy.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"likedBy for post.","enclosedBy":{"name":"Post","type":"class","href":"models_post_post_model/Post-class.md"}},{"name":"organization","qualifiedName":"post_model.Post.organization","href":"models_post_post_model/Post/organization.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"organization for post.","enclosedBy":{"name":"Post","type":"class","href":"models_post_post_model/Post-class.md"}},{"name":"sId","qualifiedName":"post_model.Post.sId","href":"models_post_post_model/Post/sId.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"unique identifier for post.","enclosedBy":{"name":"Post","type":"class","href":"models_post_post_model/Post-class.md"}},{"name":"videoUrl","qualifiedName":"post_model.Post.videoUrl","href":"models_post_post_model/Post/videoUrl.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"videoUrl for post.","enclosedBy":{"name":"Post","type":"class","href":"models_post_post_model/Post-class.md"}},{"name":"post_queries","qualifiedName":"post_queries","href":"utils_post_queries/utils_post_queries-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"PostQueries","qualifiedName":"post_queries.PostQueries","href":"utils_post_queries/PostQueries-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creates queries related to posts.","enclosedBy":{"name":"post_queries","type":"library","href":"utils_post_queries/utils_post_queries-library.md"}},{"name":"PostQueries","qualifiedName":"post_queries.PostQueries.PostQueries","href":"utils_post_queries/PostQueries/PostQueries.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostQueries","type":"class","href":"utils_post_queries/PostQueries-class.md"}},{"name":"addLike","qualifiedName":"post_queries.PostQueries.addLike","href":"utils_post_queries/PostQueries/addLike.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Add Like to a post.","enclosedBy":{"name":"PostQueries","type":"class","href":"utils_post_queries/PostQueries-class.md"}},{"name":"getPostsById","qualifiedName":"post_queries.PostQueries.getPostsById","href":"utils_post_queries/PostQueries/getPostsById.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Getting Posts by Id.","enclosedBy":{"name":"PostQueries","type":"class","href":"utils_post_queries/PostQueries-class.md"}},{"name":"removeLike","qualifiedName":"post_queries.PostQueries.removeLike","href":"utils_post_queries/PostQueries/removeLike.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Remove Like from a post.","enclosedBy":{"name":"PostQueries","type":"class","href":"utils_post_queries/PostQueries-class.md"}},{"name":"uploadPost","qualifiedName":"post_queries.PostQueries.uploadPost","href":"utils_post_queries/PostQueries/uploadPost.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"Upload a post to database.","enclosedBy":{"name":"PostQueries","type":"class","href":"utils_post_queries/PostQueries-class.md"}},{"name":"post_service","qualifiedName":"post_service","href":"services_post_service/services_post_service-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"PostService","qualifiedName":"post_service.PostService","href":"services_post_service/PostService-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"PostService class provides functions in the context of a Post.","enclosedBy":{"name":"post_service","type":"library","href":"services_post_service/services_post_service-library.md"}},{"name":"PostService","qualifiedName":"post_service.PostService.PostService","href":"services_post_service/PostService/PostService.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostService","type":"class","href":"services_post_service/PostService-class.md"}},{"name":"addCommentLocally","qualifiedName":"post_service.PostService.addCommentLocally","href":"services_post_service/PostService/addCommentLocally.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostService","type":"class","href":"services_post_service/PostService-class.md"}},{"name":"addLike","qualifiedName":"post_service.PostService.addLike","href":"services_post_service/PostService/addLike.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to add Like to the Post.","enclosedBy":{"name":"PostService","type":"class","href":"services_post_service/PostService-class.md"}},{"name":"getPosts","qualifiedName":"post_service.PostService.getPosts","href":"services_post_service/PostService/getPosts.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function used to get all posts of an organization.\nThe function reference the organization Id from _currentOrg.","enclosedBy":{"name":"PostService","type":"class","href":"services_post_service/PostService-class.md"}},{"name":"postStream","qualifiedName":"post_service.PostService.postStream","href":"services_post_service/PostService/postStream.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostService","type":"class","href":"services_post_service/PostService-class.md"}},{"name":"removeLike","qualifiedName":"post_service.PostService.removeLike","href":"services_post_service/PostService/removeLike.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to remove like from the Post.","enclosedBy":{"name":"PostService","type":"class","href":"services_post_service/PostService-class.md"}},{"name":"setOrgStreamSubscription","qualifiedName":"post_service.PostService.setOrgStreamSubscription","href":"services_post_service/PostService/setOrgStreamSubscription.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostService","type":"class","href":"services_post_service/PostService-class.md"}},{"name":"updatedPostStream","qualifiedName":"post_service.PostService.updatedPostStream","href":"services_post_service/PostService/updatedPostStream.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostService","type":"class","href":"services_post_service/PostService-class.md"}},{"name":"post_widget","qualifiedName":"post_widget","href":"widgets_post_widget/widgets_post_widget-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"NewsPost","qualifiedName":"post_widget.NewsPost","href":"widgets_post_widget/NewsPost-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"post_widget","type":"library","href":"widgets_post_widget/widgets_post_widget-library.md"}},{"name":"NewsPost","qualifiedName":"post_widget.NewsPost.NewsPost","href":"widgets_post_widget/NewsPost/NewsPost.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"NewsPost","type":"class","href":"widgets_post_widget/NewsPost-class.md"}},{"name":"build","qualifiedName":"post_widget.NewsPost.build","href":"widgets_post_widget/NewsPost/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"NewsPost","type":"class","href":"widgets_post_widget/NewsPost-class.md"}},{"name":"function","qualifiedName":"post_widget.NewsPost.function","href":"widgets_post_widget/NewsPost/function.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"NewsPost","type":"class","href":"widgets_post_widget/NewsPost-class.md"}},{"name":"post","qualifiedName":"post_widget.NewsPost.post","href":"widgets_post_widget/NewsPost/post.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"NewsPost","type":"class","href":"widgets_post_widget/NewsPost-class.md"}},{"name":"PostContainer","qualifiedName":"post_widget.PostContainer","href":"widgets_post_widget/PostContainer-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"post_widget","type":"library","href":"widgets_post_widget/widgets_post_widget-library.md"}},{"name":"PostContainer","qualifiedName":"post_widget.PostContainer.PostContainer","href":"widgets_post_widget/PostContainer/PostContainer.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostContainer","type":"class","href":"widgets_post_widget/PostContainer-class.md"}},{"name":"createState","qualifiedName":"post_widget.PostContainer.createState","href":"widgets_post_widget/PostContainer/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"PostContainer","type":"class","href":"widgets_post_widget/PostContainer-class.md"}},{"name":"id","qualifiedName":"post_widget.PostContainer.id","href":"widgets_post_widget/PostContainer/id.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostContainer","type":"class","href":"widgets_post_widget/PostContainer-class.md"}},{"name":"PostContainerState","qualifiedName":"post_widget.PostContainerState","href":"widgets_post_widget/PostContainerState-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"post_widget","type":"library","href":"widgets_post_widget/widgets_post_widget-library.md"}},{"name":"PostContainerState","qualifiedName":"post_widget.PostContainerState.PostContainerState","href":"widgets_post_widget/PostContainerState/PostContainerState.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostContainerState","type":"class","href":"widgets_post_widget/PostContainerState-class.md"}},{"name":"build","qualifiedName":"post_widget.PostContainerState.build","href":"widgets_post_widget/PostContainerState/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"PostContainerState","type":"class","href":"widgets_post_widget/PostContainerState-class.md"}},{"name":"controller","qualifiedName":"post_widget.PostContainerState.controller","href":"widgets_post_widget/PostContainerState/controller.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostContainerState","type":"class","href":"widgets_post_widget/PostContainerState-class.md"}},{"name":"dispose","qualifiedName":"post_widget.PostContainerState.dispose","href":"widgets_post_widget/PostContainerState/dispose.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Called when this object is removed from the tree permanently.","enclosedBy":{"name":"PostContainerState","type":"class","href":"widgets_post_widget/PostContainerState-class.md"}},{"name":"inView","qualifiedName":"post_widget.PostContainerState.inView","href":"widgets_post_widget/PostContainerState/inView.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostContainerState","type":"class","href":"widgets_post_widget/PostContainerState-class.md"}},{"name":"initState","qualifiedName":"post_widget.PostContainerState.initState","href":"widgets_post_widget/PostContainerState/initState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Called when this object is inserted into the tree.","enclosedBy":{"name":"PostContainerState","type":"class","href":"widgets_post_widget/PostContainerState-class.md"}},{"name":"pindex","qualifiedName":"post_widget.PostContainerState.pindex","href":"widgets_post_widget/PostContainerState/pindex.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostContainerState","type":"class","href":"widgets_post_widget/PostContainerState-class.md"}},{"name":"startedPlaying","qualifiedName":"post_widget.PostContainerState.startedPlaying","href":"widgets_post_widget/PostContainerState/startedPlaying.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"PostContainerState","type":"class","href":"widgets_post_widget/PostContainerState-class.md"}},{"name":"profile_page","qualifiedName":"profile_page","href":"views_after_auth_screens_profile_profile_page/views_after_auth_screens_profile_profile_page-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ProfilePage","qualifiedName":"profile_page.ProfilePage","href":"views_after_auth_screens_profile_profile_page/ProfilePage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"ProfilePage returns a widget that renders a page of user's profile.","enclosedBy":{"name":"profile_page","type":"library","href":"views_after_auth_screens_profile_profile_page/views_after_auth_screens_profile_profile_page-library.md"}},{"name":"ProfilePage","qualifiedName":"profile_page.ProfilePage.ProfilePage","href":"views_after_auth_screens_profile_profile_page/ProfilePage/ProfilePage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePage","type":"class","href":"views_after_auth_screens_profile_profile_page/ProfilePage-class.md"}},{"name":"build","qualifiedName":"profile_page.ProfilePage.build","href":"views_after_auth_screens_profile_profile_page/ProfilePage/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"ProfilePage","type":"class","href":"views_after_auth_screens_profile_profile_page/ProfilePage-class.md"}},{"name":"donate","qualifiedName":"profile_page.ProfilePage.donate","href":"views_after_auth_screens_profile_profile_page/ProfilePage/donate.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePage","type":"class","href":"views_after_auth_screens_profile_profile_page/ProfilePage-class.md"}},{"name":"homeModel","qualifiedName":"profile_page.ProfilePage.homeModel","href":"views_after_auth_screens_profile_profile_page/ProfilePage/homeModel.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePage","type":"class","href":"views_after_auth_screens_profile_profile_page/ProfilePage-class.md"}},{"name":"profile_page_view_model","qualifiedName":"profile_page_view_model","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/view_model_after_auth_view_models_profile_view_models_profile_page_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ProfilePageViewModel","qualifiedName":"profile_page_view_model.ProfilePageViewModel","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"ProfilePageViewModel class helps to interact with model to serve data\nand react to user's input in Profile Page view.","enclosedBy":{"name":"profile_page_view_model","type":"library","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/view_model_after_auth_view_models_profile_view_models_profile_page_view_model-library.md"}},{"name":"ProfilePageViewModel","qualifiedName":"profile_page_view_model.ProfilePageViewModel.ProfilePageViewModel","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/ProfilePageViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"attachListener","qualifiedName":"profile_page_view_model.ProfilePageViewModel.attachListener","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/attachListener.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"bottomSheetHeight","qualifiedName":"profile_page_view_model.ProfilePageViewModel.bottomSheetHeight","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/bottomSheetHeight.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"changeCurrency","qualifiedName":"profile_page_view_model.ProfilePageViewModel.changeCurrency","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/changeCurrency.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This method changes the currency of the user for donation purpose.","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"currentOrg","qualifiedName":"profile_page_view_model.ProfilePageViewModel.currentOrg","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/currentOrg.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"currentUser","qualifiedName":"profile_page_view_model.ProfilePageViewModel.currentUser","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/currentUser.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"denomination","qualifiedName":"profile_page_view_model.ProfilePageViewModel.denomination","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/denomination.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"dominationButton","qualifiedName":"profile_page_view_model.ProfilePageViewModel.dominationButton","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/dominationButton.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This widget returns button for domination.","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"donationAmount","qualifiedName":"profile_page_view_model.ProfilePageViewModel.donationAmount","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationAmount.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"donationCurrency","qualifiedName":"profile_page_view_model.ProfilePageViewModel.donationCurrency","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationCurrency.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"donationCurrencySymbol","qualifiedName":"profile_page_view_model.ProfilePageViewModel.donationCurrencySymbol","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationCurrencySymbol.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"donationField","qualifiedName":"profile_page_view_model.ProfilePageViewModel.donationField","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationField.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"iconButton","qualifiedName":"profile_page_view_model.ProfilePageViewModel.iconButton","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/iconButton.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This widget returns the button for social media sharing option.","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"initialize","qualifiedName":"profile_page_view_model.ProfilePageViewModel.initialize","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/initialize.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"invite","qualifiedName":"profile_page_view_model.ProfilePageViewModel.invite","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/invite.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function generates the organization invitation link in a Dialog Box.\nDialog box contains the QR-code of organization invite link and social media sharing options.","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"logout","qualifiedName":"profile_page_view_model.ProfilePageViewModel.logout","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/logout.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This method destroys the user's session or sign out the user from app.\nThe function asks for the confimation in Custom Alert Dialog.","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"organisation","qualifiedName":"profile_page_view_model.ProfilePageViewModel.organisation","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/organisation.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"popBottomSheet","qualifiedName":"profile_page_view_model.ProfilePageViewModel.popBottomSheet","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/popBottomSheet.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"scaffoldKey","qualifiedName":"profile_page_view_model.ProfilePageViewModel.scaffoldKey","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/scaffoldKey.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"showSnackBar","qualifiedName":"profile_page_view_model.ProfilePageViewModel.showSnackBar","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/showSnackBar.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"updateSheetHeight","qualifiedName":"profile_page_view_model.ProfilePageViewModel.updateSheetHeight","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/updateSheetHeight.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"url","qualifiedName":"profile_page_view_model.ProfilePageViewModel.url","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/url.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"user","qualifiedName":"profile_page_view_model.ProfilePageViewModel.user","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/user.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProfilePageViewModel","type":"class","href":"view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md"}},{"name":"progress_dialog_view_model","qualifiedName":"progress_dialog_view_model","href":"view_model_widgets_view_models_progress_dialog_view_model/view_model_widgets_view_models_progress_dialog_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ProgressDialogViewModel","qualifiedName":"progress_dialog_view_model.ProgressDialogViewModel","href":"view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"ProgressDialogViewModel class helps to serve the data and\nto react to user's input for Progress Dialog Widget.","enclosedBy":{"name":"progress_dialog_view_model","type":"library","href":"view_model_widgets_view_models_progress_dialog_view_model/view_model_widgets_view_models_progress_dialog_view_model-library.md"}},{"name":"ProgressDialogViewModel","qualifiedName":"progress_dialog_view_model.ProgressDialogViewModel.ProgressDialogViewModel","href":"view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/ProgressDialogViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProgressDialogViewModel","type":"class","href":"view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel-class.md"}},{"name":"connectivityPresent","qualifiedName":"progress_dialog_view_model.ProgressDialogViewModel.connectivityPresent","href":"view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/connectivityPresent.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProgressDialogViewModel","type":"class","href":"view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel-class.md"}},{"name":"connectivityResult","qualifiedName":"progress_dialog_view_model.ProgressDialogViewModel.connectivityResult","href":"view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/connectivityResult.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProgressDialogViewModel","type":"class","href":"view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel-class.md"}},{"name":"initialise","qualifiedName":"progress_dialog_view_model.ProgressDialogViewModel.initialise","href":"view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/initialise.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ProgressDialogViewModel","type":"class","href":"view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel-class.md"}},{"name":"queries","qualifiedName":"queries","href":"utils_queries/utils_queries-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"Queries","qualifiedName":"queries.Queries","href":"utils_queries/Queries-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class returns some queries for the application.","enclosedBy":{"name":"queries","type":"library","href":"utils_queries/utils_queries-library.md"}},{"name":"Queries","qualifiedName":"queries.Queries.Queries","href":"utils_queries/Queries/Queries.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"createDonation","qualifiedName":"queries.Queries.createDonation","href":"utils_queries/Queries/createDonation.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"createDonation creates a new donation transaction by taking the userId ,orgId ,nameOfOrg ,nameOfUser as parameters","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"fetchJoinInOrg","qualifiedName":"queries.Queries.fetchJoinInOrg","href":"utils_queries/Queries/fetchJoinInOrg.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"fetchJoinInOrgByName","qualifiedName":"queries.Queries.fetchJoinInOrgByName","href":"utils_queries/Queries/fetchJoinInOrgByName.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"fetchOrgById","qualifiedName":"queries.Queries.fetchOrgById","href":"utils_queries/Queries/fetchOrgById.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"fetchOrgDetailsById","qualifiedName":"queries.Queries.fetchOrgDetailsById","href":"utils_queries/Queries/fetchOrgDetailsById.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"fetchUserInfo","qualifiedName":"queries.Queries.fetchUserInfo","href":"utils_queries/Queries/fetchUserInfo.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"getPluginsList","qualifiedName":"queries.Queries.getPluginsList","href":"utils_queries/Queries/getPluginsList.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"getPluginList queries all properties of pluginList from the server","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"joinOrgById","qualifiedName":"queries.Queries.joinOrgById","href":"utils_queries/Queries/joinOrgById.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"loginUser","qualifiedName":"queries.Queries.loginUser","href":"utils_queries/Queries/loginUser.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"logout","qualifiedName":"queries.Queries.logout","href":"utils_queries/Queries/logout.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"newUserLanguage","qualifiedName":"queries.Queries.newUserLanguage","href":"utils_queries/Queries/newUserLanguage.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"refreshToken","qualifiedName":"queries.Queries.refreshToken","href":"utils_queries/Queries/refreshToken.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"registerUser","qualifiedName":"queries.Queries.registerUser","href":"utils_queries/Queries/registerUser.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"saveFcmToken","qualifiedName":"queries.Queries.saveFcmToken","href":"utils_queries/Queries/saveFcmToken.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"sendMembershipRequest","qualifiedName":"queries.Queries.sendMembershipRequest","href":"utils_queries/Queries/sendMembershipRequest.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"updateLanguage","qualifiedName":"queries.Queries.updateLanguage","href":"utils_queries/Queries/updateLanguage.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"userLanguage","qualifiedName":"queries.Queries.userLanguage","href":"utils_queries/Queries/userLanguage.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Queries","type":"class","href":"utils_queries/Queries-class.md"}},{"name":"quick_actions","qualifiedName":"quick_actions","href":"constants_quick_actions/constants_quick_actions-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ShortCutMenu","qualifiedName":"quick_actions.ShortCutMenu","href":"constants_quick_actions/ShortCutMenu-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This file contains the shortcuts by which user can manage and interact with the\napplication. quick_actions package is used for this purpose.","enclosedBy":{"name":"quick_actions","type":"library","href":"constants_quick_actions/constants_quick_actions-library.md"}},{"name":"ShortCutMenu","qualifiedName":"quick_actions.ShortCutMenu.ShortCutMenu","href":"constants_quick_actions/ShortCutMenu/ShortCutMenu.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ShortCutMenu","type":"class","href":"constants_quick_actions/ShortCutMenu-class.md"}},{"name":"chatAction","qualifiedName":"quick_actions.ShortCutMenu.chatAction","href":"constants_quick_actions/ShortCutMenu/chatAction-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ShortCutMenu","type":"class","href":"constants_quick_actions/ShortCutMenu-class.md"}},{"name":"eventAction","qualifiedName":"quick_actions.ShortCutMenu.eventAction","href":"constants_quick_actions/ShortCutMenu/eventAction-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ShortCutMenu","type":"class","href":"constants_quick_actions/ShortCutMenu-class.md"}},{"name":"feedAction","qualifiedName":"quick_actions.ShortCutMenu.feedAction","href":"constants_quick_actions/ShortCutMenu/feedAction-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ShortCutMenu","type":"class","href":"constants_quick_actions/ShortCutMenu-class.md"}},{"name":"quickActionsList","qualifiedName":"quick_actions.ShortCutMenu.quickActionsList","href":"constants_quick_actions/ShortCutMenu/quickActionsList.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ShortCutMenu","type":"class","href":"constants_quick_actions/ShortCutMenu-class.md"}},{"name":"raised_round_edge_button","qualifiedName":"raised_round_edge_button","href":"widgets_raised_round_edge_button/widgets_raised_round_edge_button-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"RaisedRoundedButton","qualifiedName":"raised_round_edge_button.RaisedRoundedButton","href":"widgets_raised_round_edge_button/RaisedRoundedButton-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class returns a widget for a raised rounded button,\nfor example: login button in login screen.","enclosedBy":{"name":"raised_round_edge_button","type":"library","href":"widgets_raised_round_edge_button/widgets_raised_round_edge_button-library.md"}},{"name":"RaisedRoundedButton","qualifiedName":"raised_round_edge_button.RaisedRoundedButton.RaisedRoundedButton","href":"widgets_raised_round_edge_button/RaisedRoundedButton/RaisedRoundedButton.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"RaisedRoundedButton","type":"class","href":"widgets_raised_round_edge_button/RaisedRoundedButton-class.md"}},{"name":"backgroundColor","qualifiedName":"raised_round_edge_button.RaisedRoundedButton.backgroundColor","href":"widgets_raised_round_edge_button/RaisedRoundedButton/backgroundColor.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"RaisedRoundedButton","type":"class","href":"widgets_raised_round_edge_button/RaisedRoundedButton-class.md"}},{"name":"buttonLabel","qualifiedName":"raised_round_edge_button.RaisedRoundedButton.buttonLabel","href":"widgets_raised_round_edge_button/RaisedRoundedButton/buttonLabel.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"RaisedRoundedButton","type":"class","href":"widgets_raised_round_edge_button/RaisedRoundedButton-class.md"}},{"name":"createState","qualifiedName":"raised_round_edge_button.RaisedRoundedButton.createState","href":"widgets_raised_round_edge_button/RaisedRoundedButton/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"RaisedRoundedButton","type":"class","href":"widgets_raised_round_edge_button/RaisedRoundedButton-class.md"}},{"name":"height","qualifiedName":"raised_round_edge_button.RaisedRoundedButton.height","href":"widgets_raised_round_edge_button/RaisedRoundedButton/height.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"RaisedRoundedButton","type":"class","href":"widgets_raised_round_edge_button/RaisedRoundedButton-class.md"}},{"name":"onTap","qualifiedName":"raised_round_edge_button.RaisedRoundedButton.onTap","href":"widgets_raised_round_edge_button/RaisedRoundedButton/onTap.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"RaisedRoundedButton","type":"class","href":"widgets_raised_round_edge_button/RaisedRoundedButton-class.md"}},{"name":"showArrow","qualifiedName":"raised_round_edge_button.RaisedRoundedButton.showArrow","href":"widgets_raised_round_edge_button/RaisedRoundedButton/showArrow.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"RaisedRoundedButton","type":"class","href":"widgets_raised_round_edge_button/RaisedRoundedButton-class.md"}},{"name":"textColor","qualifiedName":"raised_round_edge_button.RaisedRoundedButton.textColor","href":"widgets_raised_round_edge_button/RaisedRoundedButton/textColor.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"RaisedRoundedButton","type":"class","href":"widgets_raised_round_edge_button/RaisedRoundedButton-class.md"}},{"name":"width","qualifiedName":"raised_round_edge_button.RaisedRoundedButton.width","href":"widgets_raised_round_edge_button/RaisedRoundedButton/width.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"RaisedRoundedButton","type":"class","href":"widgets_raised_round_edge_button/RaisedRoundedButton-class.md"}},{"name":"recover","qualifiedName":"recover","href":"views_pre_auth_screens_recover/views_pre_auth_screens_recover-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"Recover","qualifiedName":"recover.Recover","href":"views_pre_auth_screens_recover/Recover-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class recovers the users password.\nThe users needs to enter his/her email and press on the button at the bottom to recover his/her password.","enclosedBy":{"name":"recover","type":"library","href":"views_pre_auth_screens_recover/views_pre_auth_screens_recover-library.md"}},{"name":"Recover","qualifiedName":"recover.Recover.Recover","href":"views_pre_auth_screens_recover/Recover/Recover.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Recover","type":"class","href":"views_pre_auth_screens_recover/Recover-class.md"}},{"name":"createState","qualifiedName":"recover.Recover.createState","href":"views_pre_auth_screens_recover/Recover/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"Recover","type":"class","href":"views_pre_auth_screens_recover/Recover-class.md"}},{"name":"rich_text","qualifiedName":"rich_text","href":"widgets_rich_text/widgets_rich_text-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"CustomRichText","qualifiedName":"rich_text.CustomRichText","href":"widgets_rich_text/CustomRichText-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"CustomRichText class returns a widget for customized rich/bold text.\nThese rich text are being used in form for changing the password.","enclosedBy":{"name":"rich_text","type":"library","href":"widgets_rich_text/widgets_rich_text-library.md"}},{"name":"CustomRichText","qualifiedName":"rich_text.CustomRichText.CustomRichText","href":"widgets_rich_text/CustomRichText/CustomRichText.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomRichText","type":"class","href":"widgets_rich_text/CustomRichText-class.md"}},{"name":"build","qualifiedName":"rich_text.CustomRichText.build","href":"widgets_rich_text/CustomRichText/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"CustomRichText","type":"class","href":"widgets_rich_text/CustomRichText-class.md"}},{"name":"words","qualifiedName":"rich_text.CustomRichText.words","href":"widgets_rich_text/CustomRichText/words.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"CustomRichText","type":"class","href":"widgets_rich_text/CustomRichText-class.md"}},{"name":"router","qualifiedName":"router","href":"router/router-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"generateRoute","qualifiedName":"router.generateRoute","href":"router/generateRoute.md","type":"function","overriddenDepth":0,"packageName":"talawa","desc":"The MaterialApp provides us with a property called generateRoute where\nwe can pass in a Function that returns a Route and takes in RouteSettings","enclosedBy":{"name":"router","type":"library","href":"router/router-library.md"}},{"name":"routing_constants","qualifiedName":"routing_constants","href":"constants_routing_constants/constants_routing_constants-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"Routes","qualifiedName":"routing_constants.Routes","href":"constants_routing_constants/Routes-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This file contains the routes. These can be used to make push screen call via Routes.splashScreen to access these string.","enclosedBy":{"name":"routing_constants","type":"library","href":"constants_routing_constants/constants_routing_constants-library.md"}},{"name":"Routes","qualifiedName":"routing_constants.Routes.Routes","href":"constants_routing_constants/Routes/Routes.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"addTask","qualifiedName":"routing_constants.Routes.addTask","href":"constants_routing_constants/Routes/addTask-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"appSettings","qualifiedName":"routing_constants.Routes.appSettings","href":"constants_routing_constants/Routes/appSettings-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"calendar","qualifiedName":"routing_constants.Routes.calendar","href":"constants_routing_constants/Routes/calendar-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"chatMessageScreen","qualifiedName":"routing_constants.Routes.chatMessageScreen","href":"constants_routing_constants/Routes/chatMessageScreen-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"createEventPage","qualifiedName":"routing_constants.Routes.createEventPage","href":"constants_routing_constants/Routes/createEventPage-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"demoPageViewRoute","qualifiedName":"routing_constants.Routes.demoPageViewRoute","href":"constants_routing_constants/Routes/demoPageViewRoute-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"editEventPage","qualifiedName":"routing_constants.Routes.editEventPage","href":"constants_routing_constants/Routes/editEventPage-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"editProfilePage","qualifiedName":"routing_constants.Routes.editProfilePage","href":"constants_routing_constants/Routes/editProfilePage-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"editTask","qualifiedName":"routing_constants.Routes.editTask","href":"constants_routing_constants/Routes/editTask-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"eventInfoPage","qualifiedName":"routing_constants.Routes.eventInfoPage","href":"constants_routing_constants/Routes/eventInfoPage-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"eventTasks","qualifiedName":"routing_constants.Routes.eventTasks","href":"constants_routing_constants/Routes/eventTasks-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"exploreEventsScreen","qualifiedName":"routing_constants.Routes.exploreEventsScreen","href":"constants_routing_constants/Routes/exploreEventsScreen-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"homeScreen","qualifiedName":"routing_constants.Routes.homeScreen","href":"constants_routing_constants/Routes/homeScreen-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"individualPost","qualifiedName":"routing_constants.Routes.individualPost","href":"constants_routing_constants/Routes/individualPost-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"joinOrg","qualifiedName":"routing_constants.Routes.joinOrg","href":"constants_routing_constants/Routes/joinOrg-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"languageSelectionRoute","qualifiedName":"routing_constants.Routes.languageSelectionRoute","href":"constants_routing_constants/Routes/languageSelectionRoute-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"loginScreen","qualifiedName":"routing_constants.Routes.loginScreen","href":"constants_routing_constants/Routes/loginScreen-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"mainScreen","qualifiedName":"routing_constants.Routes.mainScreen","href":"constants_routing_constants/Routes/mainScreen-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"mapScreen","qualifiedName":"routing_constants.Routes.mapScreen","href":"constants_routing_constants/Routes/mapScreen-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"pinnedPostPage","qualifiedName":"routing_constants.Routes.pinnedPostPage","href":"constants_routing_constants/Routes/pinnedPostPage-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"profilePage","qualifiedName":"routing_constants.Routes.profilePage","href":"constants_routing_constants/Routes/profilePage-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"progressDialog","qualifiedName":"routing_constants.Routes.progressDialog","href":"constants_routing_constants/Routes/progressDialog-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"recoverScreen","qualifiedName":"routing_constants.Routes.recoverScreen","href":"constants_routing_constants/Routes/recoverScreen-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"requestAccess","qualifiedName":"routing_constants.Routes.requestAccess","href":"constants_routing_constants/Routes/requestAccess-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"selectContact","qualifiedName":"routing_constants.Routes.selectContact","href":"constants_routing_constants/Routes/selectContact-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"selectOrgScreen","qualifiedName":"routing_constants.Routes.selectOrgScreen","href":"constants_routing_constants/Routes/selectOrgScreen-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"setUrlScreen","qualifiedName":"routing_constants.Routes.setUrlScreen","href":"constants_routing_constants/Routes/setUrlScreen-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"signupDetailScreen","qualifiedName":"routing_constants.Routes.signupDetailScreen","href":"constants_routing_constants/Routes/signupDetailScreen-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"splashScreen","qualifiedName":"routing_constants.Routes.splashScreen","href":"constants_routing_constants/Routes/splashScreen-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"updateScreen","qualifiedName":"routing_constants.Routes.updateScreen","href":"constants_routing_constants/Routes/updateScreen-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"userTasks","qualifiedName":"routing_constants.Routes.userTasks","href":"constants_routing_constants/Routes/userTasks-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"waitingScreen","qualifiedName":"routing_constants.Routes.waitingScreen","href":"constants_routing_constants/Routes/waitingScreen-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"static variables.","enclosedBy":{"name":"Routes","type":"class","href":"constants_routing_constants/Routes-class.md"}},{"name":"select_contact","qualifiedName":"select_contact","href":"views_after_auth_screens_chat_select_contact/views_after_auth_screens_chat_select_contact-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"SelectContact","qualifiedName":"select_contact.SelectContact","href":"views_after_auth_screens_chat_select_contact/SelectContact-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"SelectContact returns a widget that has mutable state _SelectContactState.","enclosedBy":{"name":"select_contact","type":"library","href":"views_after_auth_screens_chat_select_contact/views_after_auth_screens_chat_select_contact-library.md"}},{"name":"SelectContact","qualifiedName":"select_contact.SelectContact.SelectContact","href":"views_after_auth_screens_chat_select_contact/SelectContact/SelectContact.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectContact","type":"class","href":"views_after_auth_screens_chat_select_contact/SelectContact-class.md"}},{"name":"createState","qualifiedName":"select_contact.SelectContact.createState","href":"views_after_auth_screens_chat_select_contact/SelectContact/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"SelectContact","type":"class","href":"views_after_auth_screens_chat_select_contact/SelectContact-class.md"}},{"name":"select_contact_view_model","qualifiedName":"select_contact_view_model","href":"view_model_after_auth_view_models_chat_view_models_select_contact_view_model/view_model_after_auth_view_models_chat_view_models_select_contact_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"SelectContactViewModel","qualifiedName":"select_contact_view_model.SelectContactViewModel","href":"view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"SelectContactViewModel class have different functions to interact with model.","enclosedBy":{"name":"select_contact_view_model","type":"library","href":"view_model_after_auth_view_models_chat_view_models_select_contact_view_model/view_model_after_auth_view_models_chat_view_models_select_contact_view_model-library.md"}},{"name":"SelectContactViewModel","qualifiedName":"select_contact_view_model.SelectContactViewModel.SelectContactViewModel","href":"view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/SelectContactViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectContactViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel-class.md"}},{"name":"getCurrentOrgUsersList","qualifiedName":"select_contact_view_model.SelectContactViewModel.getCurrentOrgUsersList","href":"view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/getCurrentOrgUsersList.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to get all users list of an current organization.","enclosedBy":{"name":"SelectContactViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel-class.md"}},{"name":"initialise","qualifiedName":"select_contact_view_model.SelectContactViewModel.initialise","href":"view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/initialise.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectContactViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel-class.md"}},{"name":"orgMembersList","qualifiedName":"select_contact_view_model.SelectContactViewModel.orgMembersList","href":"view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/orgMembersList.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectContactViewModel","type":"class","href":"view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel-class.md"}},{"name":"select_language","qualifiedName":"select_language","href":"views_pre_auth_screens_select_language/views_pre_auth_screens_select_language-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"SelectLanguage","qualifiedName":"select_language.SelectLanguage","href":"views_pre_auth_screens_select_language/SelectLanguage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This widget enables us to select a different language.\nThe default language is English. We can choose among the options to switch the language.\nThere is a text button at the right bottom of the screen which changes the language when tapped.\nThe user finally gets redirected to the previous screen.","enclosedBy":{"name":"select_language","type":"library","href":"views_pre_auth_screens_select_language/views_pre_auth_screens_select_language-library.md"}},{"name":"SelectLanguage","qualifiedName":"select_language.SelectLanguage.SelectLanguage","href":"views_pre_auth_screens_select_language/SelectLanguage/SelectLanguage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectLanguage","type":"class","href":"views_pre_auth_screens_select_language/SelectLanguage-class.md"}},{"name":"createState","qualifiedName":"select_language.SelectLanguage.createState","href":"views_pre_auth_screens_select_language/SelectLanguage/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"SelectLanguage","type":"class","href":"views_pre_auth_screens_select_language/SelectLanguage-class.md"}},{"name":"select_organization","qualifiedName":"select_organization","href":"views_pre_auth_screens_select_organization/views_pre_auth_screens_select_organization-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"SelectOrganization","qualifiedName":"select_organization.SelectOrganization","href":"views_pre_auth_screens_select_organization/SelectOrganization-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This widget lets the user select new organizations.","enclosedBy":{"name":"select_organization","type":"library","href":"views_pre_auth_screens_select_organization/views_pre_auth_screens_select_organization-library.md"}},{"name":"SelectOrganization","qualifiedName":"select_organization.SelectOrganization.SelectOrganization","href":"views_pre_auth_screens_select_organization/SelectOrganization/SelectOrganization.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganization","type":"class","href":"views_pre_auth_screens_select_organization/SelectOrganization-class.md"}},{"name":"createState","qualifiedName":"select_organization.SelectOrganization.createState","href":"views_pre_auth_screens_select_organization/SelectOrganization/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"SelectOrganization","type":"class","href":"views_pre_auth_screens_select_organization/SelectOrganization-class.md"}},{"name":"selectedOrgId","qualifiedName":"select_organization.SelectOrganization.selectedOrgId","href":"views_pre_auth_screens_select_organization/SelectOrganization/selectedOrgId.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Contains Integer value for selected org id.","enclosedBy":{"name":"SelectOrganization","type":"class","href":"views_pre_auth_screens_select_organization/SelectOrganization-class.md"}},{"name":"select_organization_view_model","qualifiedName":"select_organization_view_model","href":"view_model_pre_auth_view_models_select_organization_view_model/view_model_pre_auth_view_models_select_organization_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"SelectOrganizationViewModel","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"SelectOrganizationViewModel class helps to interact with model to serve data\nand react to user's input in Select Organization View.","enclosedBy":{"name":"select_organization_view_model","type":"library","href":"view_model_pre_auth_view_models_select_organization_view_model/view_model_pre_auth_view_models_select_organization_view_model-library.md"}},{"name":"SelectOrganizationViewModel","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.SelectOrganizationViewModel","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/SelectOrganizationViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"allOrgController","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.allOrgController","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/allOrgController.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"controller","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.controller","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/controller.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"fetchMoreHelper","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.fetchMoreHelper","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/fetchMoreHelper.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function fetch more option.","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"initialise","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.initialise","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/initialise.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"onTapContinue","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.onTapContinue","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/onTapContinue.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"onTapJoin","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.onTapJoin","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/onTapJoin.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function make user to join the selected organization.\nThe function uses joinOrgById graph QL query.","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"orgId","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.orgId","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/orgId.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"organizations","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.organizations","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/organizations.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"qrKey","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.qrKey","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/qrKey.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"result","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.result","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/result.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"searchActive","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.searchActive","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchActive.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"searchController","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.searchController","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchController.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"searchFocus","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.searchFocus","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchFocus.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"searching","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.searching","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searching.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"selectOrg","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.selectOrg","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/selectOrg.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function select the organization.","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"selectedOrganization","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.selectedOrganization","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/selectedOrganization.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"showSearchOrgList","qualifiedName":"select_organization_view_model.SelectOrganizationViewModel.showSearchOrgList","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/showSearchOrgList.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SelectOrganizationViewModel","type":"class","href":"view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md"}},{"name":"set_url","qualifiedName":"set_url","href":"views_pre_auth_screens_set_url/views_pre_auth_screens_set_url-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"SetUrl","qualifiedName":"set_url.SetUrl","href":"views_pre_auth_screens_set_url/SetUrl-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This widget lets a user sign in/up with the organization url.","enclosedBy":{"name":"set_url","type":"library","href":"views_pre_auth_screens_set_url/views_pre_auth_screens_set_url-library.md"}},{"name":"SetUrl","qualifiedName":"set_url.SetUrl.SetUrl","href":"views_pre_auth_screens_set_url/SetUrl/SetUrl.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SetUrl","type":"class","href":"views_pre_auth_screens_set_url/SetUrl-class.md"}},{"name":"createState","qualifiedName":"set_url.SetUrl.createState","href":"views_pre_auth_screens_set_url/SetUrl/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"SetUrl","type":"class","href":"views_pre_auth_screens_set_url/SetUrl-class.md"}},{"name":"uri","qualifiedName":"set_url.SetUrl.uri","href":"views_pre_auth_screens_set_url/SetUrl/uri.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Variable.","enclosedBy":{"name":"SetUrl","type":"class","href":"views_pre_auth_screens_set_url/SetUrl-class.md"}},{"name":"set_url_view_model","qualifiedName":"set_url_view_model","href":"view_model_pre_auth_view_models_set_url_view_model/view_model_pre_auth_view_models_set_url_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"SetUrlViewModel","qualifiedName":"set_url_view_model.SetUrlViewModel","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"SetUrlViewModel class helps to interact with model to serve data.","enclosedBy":{"name":"set_url_view_model","type":"library","href":"view_model_pre_auth_view_models_set_url_view_model/view_model_pre_auth_view_models_set_url_view_model-library.md"}},{"name":"SetUrlViewModel","qualifiedName":"set_url_view_model.SetUrlViewModel.SetUrlViewModel","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/SetUrlViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SetUrlViewModel","type":"class","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md"}},{"name":"checkURLandNavigate","qualifiedName":"set_url_view_model.SetUrlViewModel.checkURLandNavigate","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/checkURLandNavigate.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function check the URL and navigate to the respective URL.","enclosedBy":{"name":"SetUrlViewModel","type":"class","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md"}},{"name":"checkURLandShowPopUp","qualifiedName":"set_url_view_model.SetUrlViewModel.checkURLandShowPopUp","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/checkURLandShowPopUp.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function check the URL and navigate to the respective URL.","enclosedBy":{"name":"SetUrlViewModel","type":"class","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md"}},{"name":"formKey","qualifiedName":"set_url_view_model.SetUrlViewModel.formKey","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/formKey.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"formKey.","enclosedBy":{"name":"SetUrlViewModel","type":"class","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md"}},{"name":"greeting","qualifiedName":"set_url_view_model.SetUrlViewModel.greeting","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/greeting.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"qrController.","enclosedBy":{"name":"SetUrlViewModel","type":"class","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md"}},{"name":"imageUrlKey","qualifiedName":"set_url_view_model.SetUrlViewModel.imageUrlKey","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/imageUrlKey-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"imageUrlKey.","enclosedBy":{"name":"SetUrlViewModel","type":"class","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md"}},{"name":"initialise","qualifiedName":"set_url_view_model.SetUrlViewModel.initialise","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/initialise.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function initialises the variables.","enclosedBy":{"name":"SetUrlViewModel","type":"class","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md"}},{"name":"orgId","qualifiedName":"set_url_view_model.SetUrlViewModel.orgId","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/orgId.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"organizationID.","enclosedBy":{"name":"SetUrlViewModel","type":"class","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md"}},{"name":"qrKey","qualifiedName":"set_url_view_model.SetUrlViewModel.qrKey","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/qrKey.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"qrKey.","enclosedBy":{"name":"SetUrlViewModel","type":"class","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md"}},{"name":"result","qualifiedName":"set_url_view_model.SetUrlViewModel.result","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/result.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"qrText.","enclosedBy":{"name":"SetUrlViewModel","type":"class","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md"}},{"name":"scanQR","qualifiedName":"set_url_view_model.SetUrlViewModel.scanQR","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/scanQR.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function create a widget which is used to scan the QR-code.","enclosedBy":{"name":"SetUrlViewModel","type":"class","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md"}},{"name":"url","qualifiedName":"set_url_view_model.SetUrlViewModel.url","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/url.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"url.","enclosedBy":{"name":"SetUrlViewModel","type":"class","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md"}},{"name":"urlFocus","qualifiedName":"set_url_view_model.SetUrlViewModel.urlFocus","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/urlFocus.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"urlFocus.","enclosedBy":{"name":"SetUrlViewModel","type":"class","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md"}},{"name":"urlKey","qualifiedName":"set_url_view_model.SetUrlViewModel.urlKey","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/urlKey-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"urlKey.","enclosedBy":{"name":"SetUrlViewModel","type":"class","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md"}},{"name":"validate","qualifiedName":"set_url_view_model.SetUrlViewModel.validate","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/validate.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"qrValidator.","enclosedBy":{"name":"SetUrlViewModel","type":"class","href":"view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md"}},{"name":"signup_details","qualifiedName":"signup_details","href":"views_pre_auth_screens_signup_details/views_pre_auth_screens_signup_details-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"SignUpDetails","qualifiedName":"signup_details.SignUpDetails","href":"views_pre_auth_screens_signup_details/SignUpDetails-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This widget takes the user details for signup. The form includes first name, last name, email, password, and password confirmation inputs.","enclosedBy":{"name":"signup_details","type":"library","href":"views_pre_auth_screens_signup_details/views_pre_auth_screens_signup_details-library.md"}},{"name":"SignUpDetails","qualifiedName":"signup_details.SignUpDetails.SignUpDetails","href":"views_pre_auth_screens_signup_details/SignUpDetails/SignUpDetails.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignUpDetails","type":"class","href":"views_pre_auth_screens_signup_details/SignUpDetails-class.md"}},{"name":"createState","qualifiedName":"signup_details.SignUpDetails.createState","href":"views_pre_auth_screens_signup_details/SignUpDetails/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"SignUpDetails","type":"class","href":"views_pre_auth_screens_signup_details/SignUpDetails-class.md"}},{"name":"selectedOrg","qualifiedName":"signup_details.SignUpDetails.selectedOrg","href":"views_pre_auth_screens_signup_details/SignUpDetails/selectedOrg.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignUpDetails","type":"class","href":"views_pre_auth_screens_signup_details/SignUpDetails-class.md"}},{"name":"signup_details_view_model","qualifiedName":"signup_details_view_model","href":"view_model_pre_auth_view_models_signup_details_view_model/view_model_pre_auth_view_models_signup_details_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"SignupDetailsViewModel","qualifiedName":"signup_details_view_model.SignupDetailsViewModel","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"SignupDetailsViewModel class helps to interact with model to serve data\nand react to user's input for Sign Up Details section.","enclosedBy":{"name":"signup_details_view_model","type":"library","href":"view_model_pre_auth_view_models_signup_details_view_model/view_model_pre_auth_view_models_signup_details_view_model-library.md"}},{"name":"SignupDetailsViewModel","qualifiedName":"signup_details_view_model.SignupDetailsViewModel.SignupDetailsViewModel","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/SignupDetailsViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupDetailsViewModel","type":"class","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md"}},{"name":"confirmFocus","qualifiedName":"signup_details_view_model.SignupDetailsViewModel.confirmFocus","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/confirmFocus.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupDetailsViewModel","type":"class","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md"}},{"name":"confirmPassword","qualifiedName":"signup_details_view_model.SignupDetailsViewModel.confirmPassword","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/confirmPassword.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupDetailsViewModel","type":"class","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md"}},{"name":"email","qualifiedName":"signup_details_view_model.SignupDetailsViewModel.email","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/email.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupDetailsViewModel","type":"class","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md"}},{"name":"firstName","qualifiedName":"signup_details_view_model.SignupDetailsViewModel.firstName","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/firstName.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupDetailsViewModel","type":"class","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md"}},{"name":"formKey","qualifiedName":"signup_details_view_model.SignupDetailsViewModel.formKey","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/formKey.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupDetailsViewModel","type":"class","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md"}},{"name":"greeting","qualifiedName":"signup_details_view_model.SignupDetailsViewModel.greeting","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/greeting.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupDetailsViewModel","type":"class","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md"}},{"name":"hidePassword","qualifiedName":"signup_details_view_model.SignupDetailsViewModel.hidePassword","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/hidePassword.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupDetailsViewModel","type":"class","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md"}},{"name":"initialise","qualifiedName":"signup_details_view_model.SignupDetailsViewModel.initialise","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/initialise.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupDetailsViewModel","type":"class","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md"}},{"name":"lastName","qualifiedName":"signup_details_view_model.SignupDetailsViewModel.lastName","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/lastName.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupDetailsViewModel","type":"class","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md"}},{"name":"password","qualifiedName":"signup_details_view_model.SignupDetailsViewModel.password","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/password.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupDetailsViewModel","type":"class","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md"}},{"name":"selectedOrganization","qualifiedName":"signup_details_view_model.SignupDetailsViewModel.selectedOrganization","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/selectedOrganization.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupDetailsViewModel","type":"class","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md"}},{"name":"signUp","qualifiedName":"signup_details_view_model.SignupDetailsViewModel.signUp","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/signUp.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to sign up the user into the application by passing the data to database query.\nThe function uses gqlNonAuthMutation method provided by databaseFunctions services.","enclosedBy":{"name":"SignupDetailsViewModel","type":"class","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md"}},{"name":"validate","qualifiedName":"signup_details_view_model.SignupDetailsViewModel.validate","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/validate.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupDetailsViewModel","type":"class","href":"view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md"}},{"name":"signup_progress_indicator","qualifiedName":"signup_progress_indicator","href":"widgets_signup_progress_indicator/widgets_signup_progress_indicator-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"SignupProgressIndicator","qualifiedName":"signup_progress_indicator.SignupProgressIndicator","href":"widgets_signup_progress_indicator/SignupProgressIndicator-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class returns a widget for showing the\nprogress indicator/flow while Signing Up/ Registration.","enclosedBy":{"name":"signup_progress_indicator","type":"library","href":"widgets_signup_progress_indicator/widgets_signup_progress_indicator-library.md"}},{"name":"SignupProgressIndicator","qualifiedName":"signup_progress_indicator.SignupProgressIndicator.SignupProgressIndicator","href":"widgets_signup_progress_indicator/SignupProgressIndicator/SignupProgressIndicator.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupProgressIndicator","type":"class","href":"widgets_signup_progress_indicator/SignupProgressIndicator-class.md"}},{"name":"build","qualifiedName":"signup_progress_indicator.SignupProgressIndicator.build","href":"widgets_signup_progress_indicator/SignupProgressIndicator/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"SignupProgressIndicator","type":"class","href":"widgets_signup_progress_indicator/SignupProgressIndicator-class.md"}},{"name":"currentPageIndex","qualifiedName":"signup_progress_indicator.SignupProgressIndicator.currentPageIndex","href":"widgets_signup_progress_indicator/SignupProgressIndicator/currentPageIndex.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupProgressIndicator","type":"class","href":"widgets_signup_progress_indicator/SignupProgressIndicator-class.md"}},{"name":"progressLabel","qualifiedName":"signup_progress_indicator.SignupProgressIndicator.progressLabel","href":"widgets_signup_progress_indicator/SignupProgressIndicator/progressLabel.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SignupProgressIndicator","type":"class","href":"widgets_signup_progress_indicator/SignupProgressIndicator-class.md"}},{"name":"size_config","qualifiedName":"size_config","href":"services_size_config/services_size_config-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"SizeConfig","qualifiedName":"size_config.SizeConfig","href":"services_size_config/SizeConfig-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"SizeConfig class is used to initialise the height and width of the media.","enclosedBy":{"name":"size_config","type":"library","href":"services_size_config/services_size_config-library.md"}},{"name":"SizeConfig","qualifiedName":"size_config.SizeConfig.SizeConfig","href":"services_size_config/SizeConfig/SizeConfig.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SizeConfig","type":"class","href":"services_size_config/SizeConfig-class.md"}},{"name":"blockSizeHorizontal","qualifiedName":"size_config.SizeConfig.blockSizeHorizontal","href":"services_size_config/SizeConfig/blockSizeHorizontal.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SizeConfig","type":"class","href":"services_size_config/SizeConfig-class.md"}},{"name":"blockSizeVertical","qualifiedName":"size_config.SizeConfig.blockSizeVertical","href":"services_size_config/SizeConfig/blockSizeVertical.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SizeConfig","type":"class","href":"services_size_config/SizeConfig-class.md"}},{"name":"init","qualifiedName":"size_config.SizeConfig.init","href":"services_size_config/SizeConfig/init.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SizeConfig","type":"class","href":"services_size_config/SizeConfig-class.md"}},{"name":"paddingTop","qualifiedName":"size_config.SizeConfig.paddingTop","href":"services_size_config/SizeConfig/paddingTop.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SizeConfig","type":"class","href":"services_size_config/SizeConfig-class.md"}},{"name":"safeBlockHorizontal","qualifiedName":"size_config.SizeConfig.safeBlockHorizontal","href":"services_size_config/SizeConfig/safeBlockHorizontal.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SizeConfig","type":"class","href":"services_size_config/SizeConfig-class.md"}},{"name":"safeBlockVertical","qualifiedName":"size_config.SizeConfig.safeBlockVertical","href":"services_size_config/SizeConfig/safeBlockVertical.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SizeConfig","type":"class","href":"services_size_config/SizeConfig-class.md"}},{"name":"screenHeight","qualifiedName":"size_config.SizeConfig.screenHeight","href":"services_size_config/SizeConfig/screenHeight.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SizeConfig","type":"class","href":"services_size_config/SizeConfig-class.md"}},{"name":"screenWidth","qualifiedName":"size_config.SizeConfig.screenWidth","href":"services_size_config/SizeConfig/screenWidth.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SizeConfig","type":"class","href":"services_size_config/SizeConfig-class.md"}},{"name":"test","qualifiedName":"size_config.SizeConfig.test","href":"services_size_config/SizeConfig/test.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SizeConfig","type":"class","href":"services_size_config/SizeConfig-class.md"}},{"name":"splash_screen","qualifiedName":"splash_screen","href":"splash_screen/splash_screen-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"SplashScreen","qualifiedName":"splash_screen.SplashScreen","href":"splash_screen/SplashScreen-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This widget return the SplashScreen. Splash Screen is the first screen that\nwe see when we run our application. It is also known as Launch Screen.","enclosedBy":{"name":"splash_screen","type":"library","href":"splash_screen/splash_screen-library.md"}},{"name":"SplashScreen","qualifiedName":"splash_screen.SplashScreen.SplashScreen","href":"splash_screen/SplashScreen/SplashScreen.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SplashScreen","type":"class","href":"splash_screen/SplashScreen-class.md"}},{"name":"createState","qualifiedName":"splash_screen.SplashScreen.createState","href":"splash_screen/SplashScreen/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"SplashScreen","type":"class","href":"splash_screen/SplashScreen-class.md"}},{"name":"mainScreenIndex","qualifiedName":"splash_screen.SplashScreen.mainScreenIndex","href":"splash_screen/SplashScreen/mainScreenIndex.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"SplashScreen","type":"class","href":"splash_screen/SplashScreen-class.md"}},{"name":"talawa_error_dialog","qualifiedName":"talawa_error_dialog","href":"widgets_talawa_error_dialog/widgets_talawa_error_dialog-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"TalawaErrorDialog","qualifiedName":"talawa_error_dialog.TalawaErrorDialog","href":"widgets_talawa_error_dialog/TalawaErrorDialog-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"talawa_error_dialog","type":"library","href":"widgets_talawa_error_dialog/widgets_talawa_error_dialog-library.md"}},{"name":"TalawaErrorDialog","qualifiedName":"talawa_error_dialog.TalawaErrorDialog.TalawaErrorDialog","href":"widgets_talawa_error_dialog/TalawaErrorDialog/TalawaErrorDialog.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TalawaErrorDialog","type":"class","href":"widgets_talawa_error_dialog/TalawaErrorDialog-class.md"}},{"name":"build","qualifiedName":"talawa_error_dialog.TalawaErrorDialog.build","href":"widgets_talawa_error_dialog/TalawaErrorDialog/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"TalawaErrorDialog","type":"class","href":"widgets_talawa_error_dialog/TalawaErrorDialog-class.md"}},{"name":"errorMessage","qualifiedName":"talawa_error_dialog.TalawaErrorDialog.errorMessage","href":"widgets_talawa_error_dialog/TalawaErrorDialog/errorMessage.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TalawaErrorDialog","type":"class","href":"widgets_talawa_error_dialog/TalawaErrorDialog-class.md"}},{"name":"messageType","qualifiedName":"talawa_error_dialog.TalawaErrorDialog.messageType","href":"widgets_talawa_error_dialog/TalawaErrorDialog/messageType.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TalawaErrorDialog","type":"class","href":"widgets_talawa_error_dialog/TalawaErrorDialog-class.md"}},{"name":"talawa_error_snackbar","qualifiedName":"talawa_error_snackbar","href":"widgets_talawa_error_snackbar/widgets_talawa_error_snackbar-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"TalawaErrorSnackBar","qualifiedName":"talawa_error_snackbar.TalawaErrorSnackBar","href":"widgets_talawa_error_snackbar/TalawaErrorSnackBar-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"talawa_error_snackbar","type":"library","href":"widgets_talawa_error_snackbar/widgets_talawa_error_snackbar-library.md"}},{"name":"TalawaErrorSnackBar","qualifiedName":"talawa_error_snackbar.TalawaErrorSnackBar.TalawaErrorSnackBar","href":"widgets_talawa_error_snackbar/TalawaErrorSnackBar/TalawaErrorSnackBar.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TalawaErrorSnackBar","type":"class","href":"widgets_talawa_error_snackbar/TalawaErrorSnackBar-class.md"}},{"name":"build","qualifiedName":"talawa_error_snackbar.TalawaErrorSnackBar.build","href":"widgets_talawa_error_snackbar/TalawaErrorSnackBar/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"TalawaErrorSnackBar","type":"class","href":"widgets_talawa_error_snackbar/TalawaErrorSnackBar-class.md"}},{"name":"errorMessage","qualifiedName":"talawa_error_snackbar.TalawaErrorSnackBar.errorMessage","href":"widgets_talawa_error_snackbar/TalawaErrorSnackBar/errorMessage.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TalawaErrorSnackBar","type":"class","href":"widgets_talawa_error_snackbar/TalawaErrorSnackBar-class.md"}},{"name":"messageType","qualifiedName":"talawa_error_snackbar.TalawaErrorSnackBar.messageType","href":"widgets_talawa_error_snackbar/TalawaErrorSnackBar/messageType.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TalawaErrorSnackBar","type":"class","href":"widgets_talawa_error_snackbar/TalawaErrorSnackBar-class.md"}},{"name":"talawa_logo","qualifiedName":"talawa_logo","href":"custom_painters_talawa_logo/custom_painters_talawa_logo-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"AppLogo","qualifiedName":"talawa_logo.AppLogo","href":"custom_painters_talawa_logo/AppLogo-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class draws the app logo using custom paint.\nCustomPaint is a widget from the Flutter SDK, which enables\nyou to use a canvas to draw different shapes.","enclosedBy":{"name":"talawa_logo","type":"library","href":"custom_painters_talawa_logo/custom_painters_talawa_logo-library.md"}},{"name":"AppLogo","qualifiedName":"talawa_logo.AppLogo.AppLogo","href":"custom_painters_talawa_logo/AppLogo/AppLogo.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppLogo","type":"class","href":"custom_painters_talawa_logo/AppLogo-class.md"}},{"name":"paint","qualifiedName":"talawa_logo.AppLogo.paint","href":"custom_painters_talawa_logo/AppLogo/paint.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Called whenever the object needs to paint. The given Canvas has its\ncoordinate space configured such that the origin is at the top left of the\nbox. The area of the box is the size of the size argument.","enclosedBy":{"name":"AppLogo","type":"class","href":"custom_painters_talawa_logo/AppLogo-class.md"}},{"name":"shouldRepaint","qualifiedName":"talawa_logo.AppLogo.shouldRepaint","href":"custom_painters_talawa_logo/AppLogo/shouldRepaint.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Called whenever a new instance of the custom painter delegate class is\nprovided to the RenderCustomPaint object, or any time that a new\nCustomPaint object is created with a new instance of the custom painter\ndelegate class (which amounts to the same thing, because the latter is\nimplemented in terms of the former).","enclosedBy":{"name":"AppLogo","type":"class","href":"custom_painters_talawa_logo/AppLogo-class.md"}},{"name":"talawa_plugin_provider","qualifiedName":"talawa_plugin_provider","href":"plugins_talawa_plugin_provider/plugins_talawa_plugin_provider-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"TalawaPluginProvider","qualifiedName":"talawa_plugin_provider.TalawaPluginProvider","href":"plugins_talawa_plugin_provider/TalawaPluginProvider-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"TalwaPluginProvider provides ability to implement features as plugins","enclosedBy":{"name":"talawa_plugin_provider","type":"library","href":"plugins_talawa_plugin_provider/plugins_talawa_plugin_provider-library.md"}},{"name":"TalawaPluginProvider","qualifiedName":"talawa_plugin_provider.TalawaPluginProvider.TalawaPluginProvider","href":"plugins_talawa_plugin_provider/TalawaPluginProvider/TalawaPluginProvider.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TalawaPluginProvider","type":"class","href":"plugins_talawa_plugin_provider/TalawaPluginProvider-class.md"}},{"name":"build","qualifiedName":"talawa_plugin_provider.TalawaPluginProvider.build","href":"plugins_talawa_plugin_provider/TalawaPluginProvider/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"build the Plugin combining local visibility property and serverVisible property","enclosedBy":{"name":"TalawaPluginProvider","type":"class","href":"plugins_talawa_plugin_provider/TalawaPluginProvider-class.md"}},{"name":"checkFromPluginList","qualifiedName":"talawa_plugin_provider.TalawaPluginProvider.checkFromPluginList","href":"plugins_talawa_plugin_provider/TalawaPluginProvider/checkFromPluginList.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"return bool decides the final visibility of the verifying from database and current OrgId","enclosedBy":{"name":"TalawaPluginProvider","type":"class","href":"plugins_talawa_plugin_provider/TalawaPluginProvider-class.md"}},{"name":"child","qualifiedName":"talawa_plugin_provider.TalawaPluginProvider.child","href":"plugins_talawa_plugin_provider/TalawaPluginProvider/child.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"child contains the widget for the plugin UI.","enclosedBy":{"name":"TalawaPluginProvider","type":"class","href":"plugins_talawa_plugin_provider/TalawaPluginProvider-class.md"}},{"name":"pluginName","qualifiedName":"talawa_plugin_provider.TalawaPluginProvider.pluginName","href":"plugins_talawa_plugin_provider/TalawaPluginProvider/pluginName.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"name of plugin preferred with underscores(_) instead of spaces","enclosedBy":{"name":"TalawaPluginProvider","type":"class","href":"plugins_talawa_plugin_provider/TalawaPluginProvider-class.md"}},{"name":"visible","qualifiedName":"talawa_plugin_provider.TalawaPluginProvider.visible","href":"plugins_talawa_plugin_provider/TalawaPluginProvider/visible.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"visible is the property that decides visibility of the UI.","enclosedBy":{"name":"TalawaPluginProvider","type":"class","href":"plugins_talawa_plugin_provider/TalawaPluginProvider-class.md"}},{"name":"task_form","qualifiedName":"task_form","href":"widgets_task_form/widgets_task_form-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"DescriptionField","qualifiedName":"task_form.DescriptionField","href":"widgets_task_form/DescriptionField-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"task_form","type":"library","href":"widgets_task_form/widgets_task_form-library.md"}},{"name":"DescriptionField","qualifiedName":"task_form.DescriptionField.DescriptionField","href":"widgets_task_form/DescriptionField/DescriptionField.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"DescriptionField","type":"class","href":"widgets_task_form/DescriptionField-class.md"}},{"name":"build","qualifiedName":"task_form.DescriptionField.build","href":"widgets_task_form/DescriptionField/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"DescriptionField","type":"class","href":"widgets_task_form/DescriptionField-class.md"}},{"name":"TaskForm","qualifiedName":"task_form.TaskForm","href":"widgets_task_form/TaskForm-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"task_form","type":"library","href":"widgets_task_form/widgets_task_form-library.md"}},{"name":"TaskForm","qualifiedName":"task_form.TaskForm.TaskForm","href":"widgets_task_form/TaskForm/TaskForm.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskForm","type":"class","href":"widgets_task_form/TaskForm-class.md"}},{"name":"actionText","qualifiedName":"task_form.TaskForm.actionText","href":"widgets_task_form/TaskForm/actionText.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskForm","type":"class","href":"widgets_task_form/TaskForm-class.md"}},{"name":"createState","qualifiedName":"task_form.TaskForm.createState","href":"widgets_task_form/TaskForm/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"TaskForm","type":"class","href":"widgets_task_form/TaskForm-class.md"}},{"name":"onSave","qualifiedName":"task_form.TaskForm.onSave","href":"widgets_task_form/TaskForm/onSave.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskForm","type":"class","href":"widgets_task_form/TaskForm-class.md"}},{"name":"title","qualifiedName":"task_form.TaskForm.title","href":"widgets_task_form/TaskForm/title.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskForm","type":"class","href":"widgets_task_form/TaskForm-class.md"}},{"name":"TitleField","qualifiedName":"task_form.TitleField","href":"widgets_task_form/TitleField-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"task_form","type":"library","href":"widgets_task_form/widgets_task_form-library.md"}},{"name":"TitleField","qualifiedName":"task_form.TitleField.TitleField","href":"widgets_task_form/TitleField/TitleField.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TitleField","type":"class","href":"widgets_task_form/TitleField-class.md"}},{"name":"build","qualifiedName":"task_form.TitleField.build","href":"widgets_task_form/TitleField/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"TitleField","type":"class","href":"widgets_task_form/TitleField-class.md"}},{"name":"task_model","qualifiedName":"task_model","href":"models_task_task_model/models_task_task_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"Task","qualifiedName":"task_model.Task","href":"models_task_task_model/Task-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"task_model","type":"library","href":"models_task_task_model/models_task_task_model-library.md"}},{"name":"Task","qualifiedName":"task_model.Task.Task","href":"models_task_task_model/Task/Task.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Task","type":"class","href":"models_task_task_model/Task-class.md"}},{"name":"createdAt","qualifiedName":"task_model.Task.createdAt","href":"models_task_task_model/Task/createdAt.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Task","type":"class","href":"models_task_task_model/Task-class.md"}},{"name":"creator","qualifiedName":"task_model.Task.creator","href":"models_task_task_model/Task/creator.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Task","type":"class","href":"models_task_task_model/Task-class.md"}},{"name":"deadline","qualifiedName":"task_model.Task.deadline","href":"models_task_task_model/Task/deadline.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Task","type":"class","href":"models_task_task_model/Task-class.md"}},{"name":"description","qualifiedName":"task_model.Task.description","href":"models_task_task_model/Task/description.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Task","type":"class","href":"models_task_task_model/Task-class.md"}},{"name":"event","qualifiedName":"task_model.Task.event","href":"models_task_task_model/Task/event.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Task","type":"class","href":"models_task_task_model/Task-class.md"}},{"name":"Task.fromJson","qualifiedName":"task_model.Task.fromJson","href":"models_task_task_model/Task/Task.fromJson.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"/Creating a new Task instance from a map structure.","enclosedBy":{"name":"Task","type":"class","href":"models_task_task_model/Task-class.md"}},{"name":"id","qualifiedName":"task_model.Task.id","href":"models_task_task_model/Task/id.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Task","type":"class","href":"models_task_task_model/Task-class.md"}},{"name":"title","qualifiedName":"task_model.Task.title","href":"models_task_task_model/Task/title.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Task","type":"class","href":"models_task_task_model/Task-class.md"}},{"name":"task_queries","qualifiedName":"task_queries","href":"utils_task_queries/utils_task_queries-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"TaskQueries","qualifiedName":"task_queries.TaskQueries","href":"utils_task_queries/TaskQueries-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creates queries for the tasks in the application.","enclosedBy":{"name":"task_queries","type":"library","href":"utils_task_queries/utils_task_queries-library.md"}},{"name":"TaskQueries","qualifiedName":"task_queries.TaskQueries.TaskQueries","href":"utils_task_queries/TaskQueries/TaskQueries.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskQueries","type":"class","href":"utils_task_queries/TaskQueries-class.md"}},{"name":"addTask","qualifiedName":"task_queries.TaskQueries.addTask","href":"utils_task_queries/TaskQueries/addTask.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskQueries","type":"class","href":"utils_task_queries/TaskQueries-class.md"}},{"name":"deleteTask","qualifiedName":"task_queries.TaskQueries.deleteTask","href":"utils_task_queries/TaskQueries/deleteTask.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskQueries","type":"class","href":"utils_task_queries/TaskQueries-class.md"}},{"name":"editTask","qualifiedName":"task_queries.TaskQueries.editTask","href":"utils_task_queries/TaskQueries/editTask.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskQueries","type":"class","href":"utils_task_queries/TaskQueries-class.md"}},{"name":"eventTasks","qualifiedName":"task_queries.TaskQueries.eventTasks","href":"utils_task_queries/TaskQueries/eventTasks.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskQueries","type":"class","href":"utils_task_queries/TaskQueries-class.md"}},{"name":"userTasks","qualifiedName":"task_queries.TaskQueries.userTasks","href":"utils_task_queries/TaskQueries/userTasks.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskQueries","type":"class","href":"utils_task_queries/TaskQueries-class.md"}},{"name":"task_schedule","qualifiedName":"task_schedule","href":"widgets_task_schedule/widgets_task_schedule-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"TaskCard","qualifiedName":"task_schedule.TaskCard","href":"widgets_task_schedule/TaskCard-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"task_schedule","type":"library","href":"widgets_task_schedule/widgets_task_schedule-library.md"}},{"name":"TaskCard","qualifiedName":"task_schedule.TaskCard.TaskCard","href":"widgets_task_schedule/TaskCard/TaskCard.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskCard","type":"class","href":"widgets_task_schedule/TaskCard-class.md"}},{"name":"appointment","qualifiedName":"task_schedule.TaskCard.appointment","href":"widgets_task_schedule/TaskCard/appointment.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskCard","type":"class","href":"widgets_task_schedule/TaskCard-class.md"}},{"name":"build","qualifiedName":"task_schedule.TaskCard.build","href":"widgets_task_schedule/TaskCard/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"TaskCard","type":"class","href":"widgets_task_schedule/TaskCard-class.md"}},{"name":"showMoreOptions","qualifiedName":"task_schedule.TaskCard.showMoreOptions","href":"widgets_task_schedule/TaskCard/showMoreOptions.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskCard","type":"class","href":"widgets_task_schedule/TaskCard-class.md"}},{"name":"task","qualifiedName":"task_schedule.TaskCard.task","href":"widgets_task_schedule/TaskCard/task.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskCard","type":"class","href":"widgets_task_schedule/TaskCard-class.md"}},{"name":"TaskSchedule","qualifiedName":"task_schedule.TaskSchedule","href":"widgets_task_schedule/TaskSchedule-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"task_schedule","type":"library","href":"widgets_task_schedule/widgets_task_schedule-library.md"}},{"name":"TaskSchedule","qualifiedName":"task_schedule.TaskSchedule.TaskSchedule","href":"widgets_task_schedule/TaskSchedule/TaskSchedule.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskSchedule","type":"class","href":"widgets_task_schedule/TaskSchedule-class.md"}},{"name":"build","qualifiedName":"task_schedule.TaskSchedule.build","href":"widgets_task_schedule/TaskSchedule/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"TaskSchedule","type":"class","href":"widgets_task_schedule/TaskSchedule-class.md"}},{"name":"calendarTapped","qualifiedName":"task_schedule.TaskSchedule.calendarTapped","href":"widgets_task_schedule/TaskSchedule/calendarTapped.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskSchedule","type":"class","href":"widgets_task_schedule/TaskSchedule-class.md"}},{"name":"showMoreOptions","qualifiedName":"task_schedule.TaskSchedule.showMoreOptions","href":"widgets_task_schedule/TaskSchedule/showMoreOptions.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskSchedule","type":"class","href":"widgets_task_schedule/TaskSchedule-class.md"}},{"name":"tasks","qualifiedName":"task_schedule.TaskSchedule.tasks","href":"widgets_task_schedule/TaskSchedule/tasks.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskSchedule","type":"class","href":"widgets_task_schedule/TaskSchedule-class.md"}},{"name":"task_service","qualifiedName":"task_service","href":"services_task_service/services_task_service-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"TaskService","qualifiedName":"task_service.TaskService","href":"services_task_service/TaskService-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"PostService class provides functions in the context of a Task.","enclosedBy":{"name":"task_service","type":"library","href":"services_task_service/services_task_service-library.md"}},{"name":"TaskService","qualifiedName":"task_service.TaskService.TaskService","href":"services_task_service/TaskService/TaskService.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskService","type":"class","href":"services_task_service/TaskService-class.md"}},{"name":"callbackNotifyListeners","qualifiedName":"task_service.TaskService.callbackNotifyListeners","href":"services_task_service/TaskService/callbackNotifyListeners.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskService","type":"class","href":"services_task_service/TaskService-class.md"}},{"name":"createTask","qualifiedName":"task_service.TaskService.createTask","href":"services_task_service/TaskService/createTask.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to create a new task for the event.","enclosedBy":{"name":"TaskService","type":"class","href":"services_task_service/TaskService-class.md"}},{"name":"deleteTask","qualifiedName":"task_service.TaskService.deleteTask","href":"services_task_service/TaskService/deleteTask.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to delete a task.","enclosedBy":{"name":"TaskService","type":"class","href":"services_task_service/TaskService-class.md"}},{"name":"editTask","qualifiedName":"task_service.TaskService.editTask","href":"services_task_service/TaskService/editTask.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to edit the task created by the user.","enclosedBy":{"name":"TaskService","type":"class","href":"services_task_service/TaskService-class.md"}},{"name":"getTasksByUser","qualifiedName":"task_service.TaskService.getTasksByUser","href":"services_task_service/TaskService/getTasksByUser.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to fetch and return all tasks added by the current user.","enclosedBy":{"name":"TaskService","type":"class","href":"services_task_service/TaskService-class.md"}},{"name":"getTasksForEvent","qualifiedName":"task_service.TaskService.getTasksForEvent","href":"services_task_service/TaskService/getTasksForEvent.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to get all the tasks for the event.","enclosedBy":{"name":"TaskService","type":"class","href":"services_task_service/TaskService-class.md"}},{"name":"tasks","qualifiedName":"task_service.TaskService.tasks","href":"services_task_service/TaskService/tasks.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TaskService","type":"class","href":"services_task_service/TaskService-class.md"}},{"name":"telegram_logo","qualifiedName":"telegram_logo","href":"custom_painters_telegram_logo/custom_painters_telegram_logo-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"TelegramLogo","qualifiedName":"telegram_logo.TelegramLogo","href":"custom_painters_telegram_logo/TelegramLogo-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class draws the telegram logo using custom paint.\nCustomPaint is a widget from the Flutter SDK, which enables\nyou to use a canvas to draw different shapes.","enclosedBy":{"name":"telegram_logo","type":"library","href":"custom_painters_telegram_logo/custom_painters_telegram_logo-library.md"}},{"name":"TelegramLogo","qualifiedName":"telegram_logo.TelegramLogo.TelegramLogo","href":"custom_painters_telegram_logo/TelegramLogo/TelegramLogo.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TelegramLogo","type":"class","href":"custom_painters_telegram_logo/TelegramLogo-class.md"}},{"name":"paint","qualifiedName":"telegram_logo.TelegramLogo.paint","href":"custom_painters_telegram_logo/TelegramLogo/paint.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Called whenever the object needs to paint. The given Canvas has its\ncoordinate space configured such that the origin is at the top left of the\nbox. The area of the box is the size of the size argument.","enclosedBy":{"name":"TelegramLogo","type":"class","href":"custom_painters_telegram_logo/TelegramLogo-class.md"}},{"name":"shouldRepaint","qualifiedName":"telegram_logo.TelegramLogo.shouldRepaint","href":"custom_painters_telegram_logo/TelegramLogo/shouldRepaint.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Called whenever a new instance of the custom painter delegate class is\nprovided to the RenderCustomPaint object, or any time that a new\nCustomPaint object is created with a new instance of the custom painter\ndelegate class (which amounts to the same thing, because the latter is\nimplemented in terms of the former).","enclosedBy":{"name":"TelegramLogo","type":"class","href":"custom_painters_telegram_logo/TelegramLogo-class.md"}},{"name":"theme_switch","qualifiedName":"theme_switch","href":"widgets_theme_switch/widgets_theme_switch-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"ChangeThemeTile","qualifiedName":"theme_switch.ChangeThemeTile","href":"widgets_theme_switch/ChangeThemeTile-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class enables theme switch.\nIt returns a ListTile which contains a Toggle button to switch between Dark and Light Themes.","enclosedBy":{"name":"theme_switch","type":"library","href":"widgets_theme_switch/widgets_theme_switch-library.md"}},{"name":"ChangeThemeTile","qualifiedName":"theme_switch.ChangeThemeTile.ChangeThemeTile","href":"widgets_theme_switch/ChangeThemeTile/ChangeThemeTile.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"ChangeThemeTile","type":"class","href":"widgets_theme_switch/ChangeThemeTile-class.md"}},{"name":"build","qualifiedName":"theme_switch.ChangeThemeTile.build","href":"widgets_theme_switch/ChangeThemeTile/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"ChangeThemeTile","type":"class","href":"widgets_theme_switch/ChangeThemeTile-class.md"}},{"name":"theme_view_model","qualifiedName":"theme_view_model","href":"view_model_theme_view_model/view_model_theme_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"AppTheme","qualifiedName":"theme_view_model.AppTheme","href":"view_model_theme_view_model/AppTheme-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"AppTheme class is a type of View Model to serve data from modal to views in the context of App Themes.","enclosedBy":{"name":"theme_view_model","type":"library","href":"view_model_theme_view_model/view_model_theme_view_model-library.md"}},{"name":"AppTheme","qualifiedName":"theme_view_model.AppTheme.AppTheme","href":"view_model_theme_view_model/AppTheme/AppTheme.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"view_model_theme_view_model/AppTheme-class.md"}},{"name":"initialize","qualifiedName":"theme_view_model.AppTheme.initialize","href":"view_model_theme_view_model/AppTheme/initialize.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"view_model_theme_view_model/AppTheme-class.md"}},{"name":"isdarkTheme","qualifiedName":"theme_view_model.AppTheme.isdarkTheme","href":"view_model_theme_view_model/AppTheme/isdarkTheme.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"view_model_theme_view_model/AppTheme-class.md"}},{"name":"key","qualifiedName":"theme_view_model.AppTheme.key","href":"view_model_theme_view_model/AppTheme/key.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"AppTheme","type":"class","href":"view_model_theme_view_model/AppTheme-class.md"}},{"name":"switchTheme","qualifiedName":"theme_view_model.AppTheme.switchTheme","href":"view_model_theme_view_model/AppTheme/switchTheme.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function switches the app theme.","enclosedBy":{"name":"AppTheme","type":"class","href":"view_model_theme_view_model/AppTheme-class.md"}},{"name":"timeout","qualifiedName":"timeout","href":"constants_timeout/constants_timeout-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"TimeOuts","qualifiedName":"timeout.TimeOuts","href":"constants_timeout/TimeOuts-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"Class to define constant timeout to bring consistency in the code.","enclosedBy":{"name":"timeout","type":"library","href":"constants_timeout/constants_timeout-library.md"}},{"name":"TimeOuts","qualifiedName":"timeout.TimeOuts.TimeOuts","href":"constants_timeout/TimeOuts/TimeOuts.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"TimeOuts","type":"class","href":"constants_timeout/TimeOuts-class.md"}},{"name":"large","qualifiedName":"timeout.TimeOuts.large","href":"constants_timeout/TimeOuts/large-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"For large timeout, used for large data fetch.","enclosedBy":{"name":"TimeOuts","type":"class","href":"constants_timeout/TimeOuts-class.md"}},{"name":"mediums","qualifiedName":"timeout.TimeOuts.mediums","href":"constants_timeout/TimeOuts/mediums-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"For medium timeout, used for medium data fetch.","enclosedBy":{"name":"TimeOuts","type":"class","href":"constants_timeout/TimeOuts-class.md"}},{"name":"small","qualifiedName":"timeout.TimeOuts.small","href":"constants_timeout/TimeOuts/small-constant.md","type":"constant","overriddenDepth":0,"packageName":"talawa","desc":"For small timeout, used for small data fetch.","enclosedBy":{"name":"TimeOuts","type":"class","href":"constants_timeout/TimeOuts-class.md"}},{"name":"user_config","qualifiedName":"user_config","href":"services_user_config/services_user_config-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"UserConfig","qualifiedName":"user_config.UserConfig","href":"services_user_config/UserConfig-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"UserConfig class provides different services in the context of the User.","enclosedBy":{"name":"user_config","type":"library","href":"services_user_config/services_user_config-library.md"}},{"name":"UserConfig","qualifiedName":"user_config.UserConfig.UserConfig","href":"services_user_config/UserConfig/UserConfig.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"currentOrg","qualifiedName":"user_config.UserConfig.currentOrg","href":"services_user_config/UserConfig/currentOrg.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"currentOrgInfoController","qualifiedName":"user_config.UserConfig.currentOrgInfoController","href":"services_user_config/UserConfig/currentOrgInfoController.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"currentOrgInfoStream","qualifiedName":"user_config.UserConfig.currentOrgInfoStream","href":"services_user_config/UserConfig/currentOrgInfoStream.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"currentOrgName","qualifiedName":"user_config.UserConfig.currentOrgName","href":"services_user_config/UserConfig/currentOrgName.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"currentUser","qualifiedName":"user_config.UserConfig.currentUser","href":"services_user_config/UserConfig/currentUser.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"initialiseStream","qualifiedName":"user_config.UserConfig.initialiseStream","href":"services_user_config/UserConfig/initialiseStream.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"saveCurrentOrgInHive","qualifiedName":"user_config.UserConfig.saveCurrentOrgInHive","href":"services_user_config/UserConfig/saveCurrentOrgInHive.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"saveUserInHive","qualifiedName":"user_config.UserConfig.saveUserInHive","href":"services_user_config/UserConfig/saveUserInHive.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"updateAccessToken","qualifiedName":"user_config.UserConfig.updateAccessToken","href":"services_user_config/UserConfig/updateAccessToken.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to updated the access token of the user.","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"updateUser","qualifiedName":"user_config.UserConfig.updateUser","href":"services_user_config/UserConfig/updateUser.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to update the user details.","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"updateUserAdminOrg","qualifiedName":"user_config.UserConfig.updateUserAdminOrg","href":"services_user_config/UserConfig/updateUserAdminOrg.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to update the organization admin.","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"updateUserCreatedOrg","qualifiedName":"user_config.UserConfig.updateUserCreatedOrg","href":"services_user_config/UserConfig/updateUserCreatedOrg.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to update the user created organization.","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"updateUserJoinedOrg","qualifiedName":"user_config.UserConfig.updateUserJoinedOrg","href":"services_user_config/UserConfig/updateUserJoinedOrg.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to update the user joined organization.","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"updateUserMemberRequestOrg","qualifiedName":"user_config.UserConfig.updateUserMemberRequestOrg","href":"services_user_config/UserConfig/updateUserMemberRequestOrg.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to update the user request to join the organization.","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"userLoggedIn","qualifiedName":"user_config.UserConfig.userLoggedIn","href":"services_user_config/UserConfig/userLoggedIn.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function is used to log in the user.","enclosedBy":{"name":"UserConfig","type":"class","href":"services_user_config/UserConfig-class.md"}},{"name":"user_info","qualifiedName":"user_info","href":"models_user_user_info/models_user_user_info-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"User","qualifiedName":"user_info.User","href":"models_user_user_info/User-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creates a User model and returns a user instance.","enclosedBy":{"name":"user_info","type":"library","href":"models_user_user_info/models_user_user_info-library.md"}},{"name":"User","qualifiedName":"user_info.User.User","href":"models_user_user_info/User/User.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"adminFor","qualifiedName":"user_info.User.adminFor","href":"models_user_user_info/User/adminFor.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"authToken","qualifiedName":"user_info.User.authToken","href":"models_user_user_info/User/authToken.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"createdOrganizations","qualifiedName":"user_info.User.createdOrganizations","href":"models_user_user_info/User/createdOrganizations.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"email","qualifiedName":"user_info.User.email","href":"models_user_user_info/User/email.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"firstName","qualifiedName":"user_info.User.firstName","href":"models_user_user_info/User/firstName.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"User.fromJson","qualifiedName":"user_info.User.fromJson","href":"models_user_user_info/User/User.fromJson.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"id","qualifiedName":"user_info.User.id","href":"models_user_user_info/User/id.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"image","qualifiedName":"user_info.User.image","href":"models_user_user_info/User/image.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"joinedOrganizations","qualifiedName":"user_info.User.joinedOrganizations","href":"models_user_user_info/User/joinedOrganizations.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"lastName","qualifiedName":"user_info.User.lastName","href":"models_user_user_info/User/lastName.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"membershipRequests","qualifiedName":"user_info.User.membershipRequests","href":"models_user_user_info/User/membershipRequests.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"print","qualifiedName":"user_info.User.print","href":"models_user_user_info/User/print.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"refreshToken","qualifiedName":"user_info.User.refreshToken","href":"models_user_user_info/User/refreshToken.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"update","qualifiedName":"user_info.User.update","href":"models_user_user_info/User/update.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"updateAdminFor","qualifiedName":"user_info.User.updateAdminFor","href":"models_user_user_info/User/updateAdminFor.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"updateCreatedOrg","qualifiedName":"user_info.User.updateCreatedOrg","href":"models_user_user_info/User/updateCreatedOrg.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"updateJoinedOrg","qualifiedName":"user_info.User.updateJoinedOrg","href":"models_user_user_info/User/updateJoinedOrg.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"updateMemberRequestOrg","qualifiedName":"user_info.User.updateMemberRequestOrg","href":"models_user_user_info/User/updateMemberRequestOrg.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"User","type":"class","href":"models_user_user_info/User-class.md"}},{"name":"UserAdapter","qualifiedName":"user_info.UserAdapter","href":"models_user_user_info/UserAdapter-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"user_info","type":"library","href":"models_user_user_info/models_user_user_info-library.md"}},{"name":"operator ==","qualifiedName":"user_info.UserAdapter.==","href":"models_user_user_info/UserAdapter/operator_equals.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"The equality operator.","enclosedBy":{"name":"UserAdapter","type":"class","href":"models_user_user_info/UserAdapter-class.md"}},{"name":"UserAdapter","qualifiedName":"user_info.UserAdapter.UserAdapter","href":"models_user_user_info/UserAdapter/UserAdapter.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"UserAdapter","type":"class","href":"models_user_user_info/UserAdapter-class.md"}},{"name":"hashCode","qualifiedName":"user_info.UserAdapter.hashCode","href":"models_user_user_info/UserAdapter/hashCode.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"The hash code for this object.","enclosedBy":{"name":"UserAdapter","type":"class","href":"models_user_user_info/UserAdapter-class.md"}},{"name":"read","qualifiedName":"user_info.UserAdapter.read","href":"models_user_user_info/UserAdapter/read.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Is called when a value has to be decoded.","enclosedBy":{"name":"UserAdapter","type":"class","href":"models_user_user_info/UserAdapter-class.md"}},{"name":"typeId","qualifiedName":"user_info.UserAdapter.typeId","href":"models_user_user_info/UserAdapter/typeId.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"Called for type registration","enclosedBy":{"name":"UserAdapter","type":"class","href":"models_user_user_info/UserAdapter-class.md"}},{"name":"write","qualifiedName":"user_info.UserAdapter.write","href":"models_user_user_info/UserAdapter/write.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Is called when a value has to be encoded.","enclosedBy":{"name":"UserAdapter","type":"class","href":"models_user_user_info/UserAdapter-class.md"}},{"name":"user_tasks_page","qualifiedName":"user_tasks_page","href":"views_after_auth_screens_tasks_user_tasks_page/views_after_auth_screens_tasks_user_tasks_page-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"UserTasksPage","qualifiedName":"user_tasks_page.UserTasksPage","href":"views_after_auth_screens_tasks_user_tasks_page/UserTasksPage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"UserTasksPage returns a widget for page of User Tasks.","enclosedBy":{"name":"user_tasks_page","type":"library","href":"views_after_auth_screens_tasks_user_tasks_page/views_after_auth_screens_tasks_user_tasks_page-library.md"}},{"name":"UserTasksPage","qualifiedName":"user_tasks_page.UserTasksPage.UserTasksPage","href":"views_after_auth_screens_tasks_user_tasks_page/UserTasksPage/UserTasksPage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"UserTasksPage","type":"class","href":"views_after_auth_screens_tasks_user_tasks_page/UserTasksPage-class.md"}},{"name":"build","qualifiedName":"user_tasks_page.UserTasksPage.build","href":"views_after_auth_screens_tasks_user_tasks_page/UserTasksPage/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"UserTasksPage","type":"class","href":"views_after_auth_screens_tasks_user_tasks_page/UserTasksPage-class.md"}},{"name":"validators","qualifiedName":"validators","href":"utils_validators/utils_validators-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"Validator","qualifiedName":"validators.Validator","href":"utils_validators/Validator-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creats various validator methods for the application.\nThey are used to validate information given by the users.","enclosedBy":{"name":"validators","type":"library","href":"utils_validators/utils_validators-library.md"}},{"name":"Validator","qualifiedName":"validators.Validator.Validator","href":"utils_validators/Validator/Validator.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Validator","type":"class","href":"utils_validators/Validator-class.md"}},{"name":"validateEmail","qualifiedName":"validators.Validator.validateEmail","href":"utils_validators/Validator/validateEmail.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Validator","type":"class","href":"utils_validators/Validator-class.md"}},{"name":"validateEventForm","qualifiedName":"validators.Validator.validateEventForm","href":"utils_validators/Validator/validateEventForm.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Validator","type":"class","href":"utils_validators/Validator-class.md"}},{"name":"validateFirstName","qualifiedName":"validators.Validator.validateFirstName","href":"utils_validators/Validator/validateFirstName.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Validator","type":"class","href":"utils_validators/Validator-class.md"}},{"name":"validateLastName","qualifiedName":"validators.Validator.validateLastName","href":"utils_validators/Validator/validateLastName.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Validator","type":"class","href":"utils_validators/Validator-class.md"}},{"name":"validatePassword","qualifiedName":"validators.Validator.validatePassword","href":"utils_validators/Validator/validatePassword.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Validator","type":"class","href":"utils_validators/Validator-class.md"}},{"name":"validatePasswordConfirm","qualifiedName":"validators.Validator.validatePasswordConfirm","href":"utils_validators/Validator/validatePasswordConfirm.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Validator","type":"class","href":"utils_validators/Validator-class.md"}},{"name":"validateURL","qualifiedName":"validators.Validator.validateURL","href":"utils_validators/Validator/validateURL.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Validator","type":"class","href":"utils_validators/Validator-class.md"}},{"name":"validateUrlExistence","qualifiedName":"validators.Validator.validateUrlExistence","href":"utils_validators/Validator/validateUrlExistence.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"Validator","type":"class","href":"utils_validators/Validator-class.md"}},{"name":"video_widget","qualifiedName":"video_widget","href":"widgets_video_widget/widgets_video_widget-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"VideoWidget","qualifiedName":"video_widget.VideoWidget","href":"widgets_video_widget/VideoWidget-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class creates a video widget.","enclosedBy":{"name":"video_widget","type":"library","href":"widgets_video_widget/widgets_video_widget-library.md"}},{"name":"VideoWidget","qualifiedName":"video_widget.VideoWidget.VideoWidget","href":"widgets_video_widget/VideoWidget/VideoWidget.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"VideoWidget","type":"class","href":"widgets_video_widget/VideoWidget-class.md"}},{"name":"createState","qualifiedName":"video_widget.VideoWidget.createState","href":"widgets_video_widget/VideoWidget/createState.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Creates the mutable state for this widget at a given location in the tree.","enclosedBy":{"name":"VideoWidget","type":"class","href":"widgets_video_widget/VideoWidget-class.md"}},{"name":"play","qualifiedName":"video_widget.VideoWidget.play","href":"widgets_video_widget/VideoWidget/play.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"VideoWidget","type":"class","href":"widgets_video_widget/VideoWidget-class.md"}},{"name":"url","qualifiedName":"video_widget.VideoWidget.url","href":"widgets_video_widget/VideoWidget/url.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"VideoWidget","type":"class","href":"widgets_video_widget/VideoWidget-class.md"}},{"name":"waiting_to_join_private_org","qualifiedName":"waiting_to_join_private_org","href":"views_pre_auth_screens_waiting_to_join_private_org/views_pre_auth_screens_waiting_to_join_private_org-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"WaitingPage","qualifiedName":"waiting_to_join_private_org.WaitingPage","href":"views_pre_auth_screens_waiting_to_join_private_org/WaitingPage-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class returns a widget which shows the request sent by the user to join a private organization.","enclosedBy":{"name":"waiting_to_join_private_org","type":"library","href":"views_pre_auth_screens_waiting_to_join_private_org/views_pre_auth_screens_waiting_to_join_private_org-library.md"}},{"name":"WaitingPage","qualifiedName":"waiting_to_join_private_org.WaitingPage.WaitingPage","href":"views_pre_auth_screens_waiting_to_join_private_org/WaitingPage/WaitingPage.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"WaitingPage","type":"class","href":"views_pre_auth_screens_waiting_to_join_private_org/WaitingPage-class.md"}},{"name":"build","qualifiedName":"waiting_to_join_private_org.WaitingPage.build","href":"views_pre_auth_screens_waiting_to_join_private_org/WaitingPage/build.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Describes the part of the user interface represented by this widget.","enclosedBy":{"name":"WaitingPage","type":"class","href":"views_pre_auth_screens_waiting_to_join_private_org/WaitingPage-class.md"}},{"name":"waiting_view_model","qualifiedName":"waiting_view_model","href":"view_model_pre_auth_view_models_waiting_view_model/view_model_pre_auth_view_models_waiting_view_model-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"WaitingViewModel","qualifiedName":"waiting_view_model.WaitingViewModel","href":"view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"WaitingViewModel class helps to interact with model to serve data\nand react to user's input for Waiting section.","enclosedBy":{"name":"waiting_view_model","type":"library","href":"view_model_pre_auth_view_models_waiting_view_model/view_model_pre_auth_view_models_waiting_view_model-library.md"}},{"name":"WaitingViewModel","qualifiedName":"waiting_view_model.WaitingViewModel.WaitingViewModel","href":"view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/WaitingViewModel.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"WaitingViewModel","type":"class","href":"view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel-class.md"}},{"name":"currentUser","qualifiedName":"waiting_view_model.WaitingViewModel.currentUser","href":"view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/currentUser.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"WaitingViewModel","type":"class","href":"view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel-class.md"}},{"name":"greeting","qualifiedName":"waiting_view_model.WaitingViewModel.greeting","href":"view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/greeting.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"WaitingViewModel","type":"class","href":"view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel-class.md"}},{"name":"initialise","qualifiedName":"waiting_view_model.WaitingViewModel.initialise","href":"view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/initialise.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"WaitingViewModel","type":"class","href":"view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel-class.md"}},{"name":"joinOrg","qualifiedName":"waiting_view_model.WaitingViewModel.joinOrg","href":"view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/joinOrg.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"WaitingViewModel","type":"class","href":"view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel-class.md"}},{"name":"logout","qualifiedName":"waiting_view_model.WaitingViewModel.logout","href":"view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/logout.md","type":"method","overriddenDepth":0,"packageName":"talawa","desc":"This function ends the session for the user or logout the user from the application.","enclosedBy":{"name":"WaitingViewModel","type":"class","href":"view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel-class.md"}},{"name":"pendingRequestOrg","qualifiedName":"waiting_view_model.WaitingViewModel.pendingRequestOrg","href":"view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/pendingRequestOrg.md","type":"property","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"WaitingViewModel","type":"class","href":"view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel-class.md"}},{"name":"whatsapp_logo","qualifiedName":"whatsapp_logo","href":"custom_painters_whatsapp_logo/custom_painters_whatsapp_logo-library.md","type":"library","overriddenDepth":0,"packageName":"talawa","desc":""},{"name":"WhatsappLogo","qualifiedName":"whatsapp_logo.WhatsappLogo","href":"custom_painters_whatsapp_logo/WhatsappLogo-class.md","type":"class","overriddenDepth":0,"packageName":"talawa","desc":"This class draws the whatsapp logo using custom paint.\nCustomPaint is a widget from the Flutter SDK, which enables\nyou to use a canvas to draw different shapes.","enclosedBy":{"name":"whatsapp_logo","type":"library","href":"custom_painters_whatsapp_logo/custom_painters_whatsapp_logo-library.md"}},{"name":"WhatsappLogo","qualifiedName":"whatsapp_logo.WhatsappLogo.WhatsappLogo","href":"custom_painters_whatsapp_logo/WhatsappLogo/WhatsappLogo.md","type":"constructor","overriddenDepth":0,"packageName":"talawa","desc":"","enclosedBy":{"name":"WhatsappLogo","type":"class","href":"custom_painters_whatsapp_logo/WhatsappLogo-class.md"}},{"name":"paint","qualifiedName":"whatsapp_logo.WhatsappLogo.paint","href":"custom_painters_whatsapp_logo/WhatsappLogo/paint.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Called whenever the object needs to paint. The given Canvas has its\ncoordinate space configured such that the origin is at the top left of the\nbox. The area of the box is the size of the size argument.","enclosedBy":{"name":"WhatsappLogo","type":"class","href":"custom_painters_whatsapp_logo/WhatsappLogo-class.md"}},{"name":"shouldRepaint","qualifiedName":"whatsapp_logo.WhatsappLogo.shouldRepaint","href":"custom_painters_whatsapp_logo/WhatsappLogo/shouldRepaint.md","type":"method","overriddenDepth":1,"packageName":"talawa","desc":"Called whenever a new instance of the custom painter delegate class is\nprovided to the RenderCustomPaint object, or any time that a new\nCustomPaint object is created with a new instance of the custom painter\ndelegate class (which amounts to the same thing, because the latter is\nimplemented in terms of the former).","enclosedBy":{"name":"WhatsappLogo","type":"class","href":"custom_painters_whatsapp_logo/WhatsappLogo-class.md"}}] diff --git a/talawa-mobile-docs/index.md b/talawa-mobile-docs/index.md new file mode 100644 index 000000000..a21691b89 --- /dev/null +++ b/talawa-mobile-docs/index.md @@ -0,0 +1,654 @@ + + + +# talawa - Dart API docs + + +

Talawa

+

💬 Join the community on Slack

+

talawa-logo-lite-200x200

+

License: GPL v3 +GitHub stars +GitHub forks +codecov

+

Talawa is a comprehensive platform that aims to revolutionize the way organizations manage and interact with their data and content. Talawa empowers administrators to access and manage content with ease through the Talawa Admin interface, ensuring that information remains up-to-date and accessible to the platform's members.

+

With the Talawa API facilitating smooth communication between all parts of the platform, Talawa offers a cohesive and exceptional user experience for both administrators and members, making it a powerful tool for data management and content delivery seamlessly. 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. +
  3. Groups management
  4. +
  5. Event registrations
  6. +
  7. Recurring meetings
  8. +
  9. Facilities registrations
  10. +
+

talawa is based on the original quito code created by the Palisadoes Foundation 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 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
  2. +
  3. talawa-api: An API providing access to user data and features
  4. +
  5. talawa-admin: A web based administrative portal
  6. +
  7. talawa-docs: The online documentation website
  8. +
+

Documentation

+

Get familiar with talawa:

+
    +
  1. Read our Talawa Mobile App installation guide to get setup quickly.
  2. +
  3. The complete talawa documentation set can be found here.
  4. +
  5. Want to contribute? Look at CONTRIBUTING.md to get started.
  6. +
  7. Visit the Talawa GitHub to see the code.
  8. +
+ + +## Libraries + +##### [access_request_screen](views_after_auth_screens_join_org_after_auth_access_request_screen/views_after_auth_screens_join_org_after_auth_access_request_screen-library.md) + + + +##### [access_request_view_model](view_model_access_request_view_model/view_model_access_request_view_model-library.md) + + + +##### [add_members_bottom_sheet](widgets_add_members_bottom_sheet/widgets_add_members_bottom_sheet-library.md) + + + +##### [add_post_page](views_after_auth_screens_add_post_page/views_after_auth_screens_add_post_page-library.md) + + + +##### [add_post_view_model](view_model_after_auth_view_models_add_post_view_models_add_post_view_model/view_model_after_auth_view_models_add_post_view_models_add_post_view_model-library.md) + + + +##### [app_localization](utils_app_localization/utils_app_localization-library.md) + + + +##### [app_settings_page](views_after_auth_screens_app_settings_app_settings_page/views_after_auth_screens_app_settings_app_settings_page-library.md) + + + +##### [apptheme](apptheme/apptheme-library.md) + + + +##### [base_view](views_base_view/views_base_view-library.md) + + + +##### [base_view_model](view_model_base_view_model/view_model_base_view_model-library.md) + + + +##### [change_password](views_pre_auth_screens_change_password/views_pre_auth_screens_change_password-library.md) + + + +##### [chat_input_field](views_after_auth_screens_chat_widgets_chat_input_field/views_after_auth_screens_chat_widgets_chat_input_field-library.md) + + + +##### [chat_list_screen](views_after_auth_screens_chat_chat_list_screen/views_after_auth_screens_chat_chat_list_screen-library.md) + + + +##### [chat_list_tile_data_model](models_chats_chat_list_tile_data_model/models_chats_chat_list_tile_data_model-library.md) + + + +##### [chat_message](models_chats_chat_message/models_chats_chat_message-library.md) + + + +##### [chat_message_bubble](views_after_auth_screens_chat_widgets_chat_message_bubble/views_after_auth_screens_chat_widgets_chat_message_bubble-library.md) + + + +##### [chat_message_screen](views_after_auth_screens_chat_chat_message_screen/views_after_auth_screens_chat_chat_message_screen-library.md) + + + +##### [chat_queries](utils_chat_queries/utils_chat_queries-library.md) + + + +##### [chat_service](services_chat_service/services_chat_service-library.md) + + + +##### [chat_user](models_chats_chat_user/models_chats_chat_user-library.md) + + + +##### [comment_model](models_comment_comment_model/models_comment_comment_model-library.md) + + + +##### [comment_queries](utils_comment_queries/utils_comment_queries-library.md) + + + +##### [comment_service](services_comment_service/services_comment_service-library.md) + + + +##### [comments_view_model](view_model_widgets_view_models_comments_view_model/view_model_widgets_view_models_comments_view_model-library.md) + + + +##### [constants](constants_constants/constants_constants-library.md) + + + +##### [create_event_form](views_after_auth_screens_events_create_event_form/views_after_auth_screens_events_create_event_form-library.md) + + + +##### [create_event_page](views_after_auth_screens_events_create_event_page/views_after_auth_screens_events_create_event_page-library.md) + + + +##### [create_event_view_model](view_model_after_auth_view_models_event_view_models_create_event_view_model/view_model_after_auth_view_models_event_view_models_create_event_view_model-library.md) + + + +##### [create_task_page](views_after_auth_screens_tasks_create_task_page/views_after_auth_screens_tasks_create_task_page-library.md) + + + +##### [create_task_view_model](view_model_after_auth_view_models_task_view_models_create_task_view_model/view_model_after_auth_view_models_task_view_models_create_task_view_model-library.md) + + + +##### [custom_alert_dialog](widgets_custom_alert_dialog/widgets_custom_alert_dialog-library.md) + + + +##### [custom_avatar](widgets_custom_avatar/widgets_custom_avatar-library.md) + + + +##### [custom_drawer](widgets_custom_drawer/widgets_custom_drawer-library.md) + + + +##### [custom_drawer_view_model](view_model_widgets_view_models_custom_drawer_view_model/view_model_widgets_view_models_custom_drawer_view_model-library.md) + + + +##### [custom_list_tile](widgets_custom_list_tile/widgets_custom_list_tile-library.md) + + + +##### [custom_progress_dialog](widgets_custom_progress_dialog/widgets_custom_progress_dialog-library.md) + + + +##### [custom_theme](constants_custom_theme/constants_custom_theme-library.md) + + + +##### [database_mutation_functions](services_database_mutation_functions/services_database_mutation_functions-library.md) + + + +##### [date_time_picker](widgets_date_time_picker/widgets_date_time_picker-library.md) + + + +##### [direct_chat_demo_data](demo_server_data_direct_chat_demo_data/demo_server_data_direct_chat_demo_data-library.md) + + + +##### [direct_chat_view_model](view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model-library.md) + + + +##### [direct_chats](views_after_auth_screens_chat_direct_chats/views_after_auth_screens_chat_direct_chats-library.md) + + + +##### [edit_event_page](views_after_auth_screens_events_edit_event_page/views_after_auth_screens_events_edit_event_page-library.md) + + + +##### [edit_event_view_model](view_model_after_auth_view_models_event_view_models_edit_event_view_model/view_model_after_auth_view_models_event_view_models_edit_event_view_model-library.md) + + + +##### [edit_events_form](views_after_auth_screens_events_edit_events_form/views_after_auth_screens_events_edit_events_form-library.md) + + + +##### [edit_profile_page](views_after_auth_screens_profile_edit_profile_page/views_after_auth_screens_profile_edit_profile_page-library.md) + + + +##### [edit_profile_view_model](view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model-library.md) + + + +##### [edit_task_page](views_after_auth_screens_tasks_edit_task_page/views_after_auth_screens_tasks_edit_task_page-library.md) + + + +##### [enums](enums_enums/enums_enums-library.md) + + + +##### [event_calendar](views_after_auth_screens_events_event_calendar/views_after_auth_screens_events_event_calendar-library.md) + + + +##### [event_card](widgets_event_card/widgets_event_card-library.md) + + + +##### [event_card_view_model](view_model_widgets_view_models_event_card_view_model/view_model_widgets_view_models_event_card_view_model-library.md) + + + +##### [event_chats](views_after_auth_screens_chat_event_chats/views_after_auth_screens_chat_event_chats-library.md) + + + +##### [event_date_time_tile](widgets_event_date_time_tile/widgets_event_date_time_tile-library.md) + + + +##### [event_info_body](views_after_auth_screens_events_event_info_body/views_after_auth_screens_events_event_info_body-library.md) + + + +##### [event_info_page](views_after_auth_screens_events_event_info_page/views_after_auth_screens_events_event_info_page-library.md) + + + +##### [event_info_view_model](view_model_after_auth_view_models_event_view_models_event_info_view_model/view_model_after_auth_view_models_event_view_models_event_info_view_model-library.md) + + + +##### [event_model](models_events_event_model/models_events_event_model-library.md) + + + +##### [event_queries](utils_event_queries/utils_event_queries-library.md) + + + +##### [event_search_delegate](widgets_event_search_delegate/widgets_event_search_delegate-library.md) + + + +##### [event_service](services_event_service/services_event_service-library.md) + + + +##### [event_tasks_page](views_after_auth_screens_tasks_event_tasks_page/views_after_auth_screens_tasks_event_tasks_page-library.md) + + + +##### [events_demo_data](demo_server_data_events_demo_data/demo_server_data_events_demo_data-library.md) + + + +##### [explore_event_dialogue](views_after_auth_screens_events_explore_event_dialogue/views_after_auth_screens_events_explore_event_dialogue-library.md) + + + +##### [explore_events](views_after_auth_screens_events_explore_events/views_after_auth_screens_events_explore_events-library.md) + + + +##### [explore_events_view_model](view_model_after_auth_view_models_event_view_models_explore_events_view_model/view_model_after_auth_view_models_event_view_models_explore_events_view_model-library.md) + + + +##### [explore_tasks_view_model](view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model-library.md) + + + +##### [fetch_plugin_list](plugins_fetch_plugin_list/plugins_fetch_plugin_list-library.md) + + + +##### [firebase_options](firebase_options/firebase_options-library.md) + + + +##### [from_palisadoes](widgets_from_palisadoes/widgets_from_palisadoes-library.md) + + + +##### [generated_plugin_registrant](generated_plugin_registrant/generated_plugin_registrant-library.md) + + + +##### [graphql_config](services_graphql_config/services_graphql_config-library.md) + + + +##### [individual_post](views_after_auth_screens_feed_individual_post/views_after_auth_screens_feed_individual_post-library.md) + + + +##### [invite_child](widgets_invite_child/widgets_invite_child-library.md) + + + +##### [join_organisation_after_auth](views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth-library.md) + + + +##### [lang_switch](widgets_lang_switch/widgets_lang_switch-library.md) + + + +##### [lang_view_model](view_model_lang_view_model/view_model_lang_view_model-library.md) + + + +##### [language_icon](custom_painters_language_icon/custom_painters_language_icon-library.md) + + + +##### [language_model](models_language_language_model/models_language_language_model-library.md) + + + +##### [like_button_view_model](view_model_widgets_view_models_like_button_view_model/view_model_widgets_view_models_like_button_view_model-library.md) + + + +##### [locator](locator/locator-library.md) + + + +##### [login](views_pre_auth_screens_login/views_pre_auth_screens_login-library.md) + + + +##### [login_view_model](view_model_pre_auth_view_models_login_view_model/view_model_pre_auth_view_models_login_view_model-library.md) + + + +##### [main](main/main-library.md) + + + +##### [main_screen](views_main_screen/views_main_screen-library.md) + + + +##### [main_screen_view_model](view_model_main_screen_view_model/view_model_main_screen_view_model-library.md) + + + +##### [mainscreen_navigation_args](models_mainscreen_navigation_args/models_mainscreen_navigation_args-library.md) + + + +##### [map_screen](views_after_auth_screens_venue_map_screen/views_after_auth_screens_venue_map_screen-library.md) + + + +##### [member_name_tile](widgets_member_name_tile/widgets_member_name_tile-library.md) + + + +##### [multi_media_pick_service](services_third_party_service_multi_media_pick_service/services_third_party_service_multi_media_pick_service-library.md) + + + +##### [navigation_service](services_navigation_service/services_navigation_service-library.md) + + + +##### [options](models_options_options/models_options_options-library.md) + + + +##### [org_info](models_organization_org_info/models_organization_org_info-library.md) + + + +##### [org_service](services_org_service/services_org_service-library.md) + + + +##### [organization_feed](views_after_auth_screens_feed_organization_feed/views_after_auth_screens_feed_organization_feed-library.md) + + + +##### [organization_feed_view_model](view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model-library.md) + + + +##### [organization_list](widgets_organization_list/widgets_organization_list-library.md) + + + +##### [organization_search_list](widgets_organization_search_list/widgets_organization_search_list-library.md) + + + +##### [pinned_carousel_widget](widgets_pinned_carousel_widget/widgets_pinned_carousel_widget-library.md) + + + +##### [pinned_post_demo_data](demo_server_data_pinned_post_demo_data/demo_server_data_pinned_post_demo_data-library.md) + + + +##### [pinned_post_page](views_after_auth_screens_feed_pinned_post_page/views_after_auth_screens_feed_pinned_post_page-library.md) + + + +##### [post_demo_data](demo_server_data_post_demo_data/demo_server_data_post_demo_data-library.md) + + + +##### [post_detailed_page](widgets_post_detailed_page/widgets_post_detailed_page-library.md) + + + +##### [post_list_widget](widgets_post_list_widget/widgets_post_list_widget-library.md) + + + +##### [post_model](models_post_post_model/models_post_post_model-library.md) + + + +##### [post_queries](utils_post_queries/utils_post_queries-library.md) + + + +##### [post_service](services_post_service/services_post_service-library.md) + + + +##### [post_widget](widgets_post_widget/widgets_post_widget-library.md) + + + +##### [profile_page](views_after_auth_screens_profile_profile_page/views_after_auth_screens_profile_profile_page-library.md) + + + +##### [profile_page_view_model](view_model_after_auth_view_models_profile_view_models_profile_page_view_model/view_model_after_auth_view_models_profile_view_models_profile_page_view_model-library.md) + + + +##### [progress_dialog_view_model](view_model_widgets_view_models_progress_dialog_view_model/view_model_widgets_view_models_progress_dialog_view_model-library.md) + + + +##### [queries](utils_queries/utils_queries-library.md) + + + +##### [quick_actions](constants_quick_actions/constants_quick_actions-library.md) + + + +##### [raised_round_edge_button](widgets_raised_round_edge_button/widgets_raised_round_edge_button-library.md) + + + +##### [recover](views_pre_auth_screens_recover/views_pre_auth_screens_recover-library.md) + + + +##### [rich_text](widgets_rich_text/widgets_rich_text-library.md) + + + +##### [router](router/router-library.md) + + + +##### [routing_constants](constants_routing_constants/constants_routing_constants-library.md) + + + +##### [select_contact](views_after_auth_screens_chat_select_contact/views_after_auth_screens_chat_select_contact-library.md) + + + +##### [select_contact_view_model](view_model_after_auth_view_models_chat_view_models_select_contact_view_model/view_model_after_auth_view_models_chat_view_models_select_contact_view_model-library.md) + + + +##### [select_language](views_pre_auth_screens_select_language/views_pre_auth_screens_select_language-library.md) + + + +##### [select_organization](views_pre_auth_screens_select_organization/views_pre_auth_screens_select_organization-library.md) + + + +##### [select_organization_view_model](view_model_pre_auth_view_models_select_organization_view_model/view_model_pre_auth_view_models_select_organization_view_model-library.md) + + + +##### [set_url](views_pre_auth_screens_set_url/views_pre_auth_screens_set_url-library.md) + + + +##### [set_url_view_model](view_model_pre_auth_view_models_set_url_view_model/view_model_pre_auth_view_models_set_url_view_model-library.md) + + + +##### [signup_details](views_pre_auth_screens_signup_details/views_pre_auth_screens_signup_details-library.md) + + + +##### [signup_details_view_model](view_model_pre_auth_view_models_signup_details_view_model/view_model_pre_auth_view_models_signup_details_view_model-library.md) + + + +##### [signup_progress_indicator](widgets_signup_progress_indicator/widgets_signup_progress_indicator-library.md) + + + +##### [size_config](services_size_config/services_size_config-library.md) + + + +##### [splash_screen](splash_screen/splash_screen-library.md) + + + +##### [talawa_error_dialog](widgets_talawa_error_dialog/widgets_talawa_error_dialog-library.md) + + + +##### [talawa_error_snackbar](widgets_talawa_error_snackbar/widgets_talawa_error_snackbar-library.md) + + + +##### [talawa_logo](custom_painters_talawa_logo/custom_painters_talawa_logo-library.md) + + + +##### [talawa_plugin_provider](plugins_talawa_plugin_provider/plugins_talawa_plugin_provider-library.md) + + + +##### [task_form](widgets_task_form/widgets_task_form-library.md) + + + +##### [task_model](models_task_task_model/models_task_task_model-library.md) + + + +##### [task_queries](utils_task_queries/utils_task_queries-library.md) + + + +##### [task_schedule](widgets_task_schedule/widgets_task_schedule-library.md) + + + +##### [task_service](services_task_service/services_task_service-library.md) + + + +##### [telegram_logo](custom_painters_telegram_logo/custom_painters_telegram_logo-library.md) + + + +##### [theme_switch](widgets_theme_switch/widgets_theme_switch-library.md) + + + +##### [theme_view_model](view_model_theme_view_model/view_model_theme_view_model-library.md) + + + +##### [timeout](constants_timeout/constants_timeout-library.md) + + + +##### [user_config](services_user_config/services_user_config-library.md) + + + +##### [user_info](models_user_user_info/models_user_user_info-library.md) + + + +##### [user_tasks_page](views_after_auth_screens_tasks_user_tasks_page/views_after_auth_screens_tasks_user_tasks_page-library.md) + + + +##### [validators](utils_validators/utils_validators-library.md) + + + +##### [video_widget](widgets_video_widget/widgets_video_widget-library.md) + + + +##### [waiting_to_join_private_org](views_pre_auth_screens_waiting_to_join_private_org/views_pre_auth_screens_waiting_to_join_private_org-library.md) + + + +##### [waiting_view_model](view_model_pre_auth_view_models_waiting_view_model/view_model_pre_auth_view_models_waiting_view_model-library.md) + + + +##### [whatsapp_logo](custom_painters_whatsapp_logo/custom_painters_whatsapp_logo-library.md) + + + + + + + + + diff --git a/talawa-mobile-docs/locator/connectivity.md b/talawa-mobile-docs/locator/connectivity.md new file mode 100644 index 000000000..07e3320df --- /dev/null +++ b/talawa-mobile-docs/locator/connectivity.md @@ -0,0 +1,36 @@ + + + +# connectivity top-level property + + + + + + + + + +[Connectivity](https://pub.dev/documentation/connectivity_plus/4.0.2/connectivity_plus/Connectivity-class.html) connectivity + +_final_ + + + +

creating GetIt for Connectivity.

+ + + +## Implementation + +```dart +final connectivity = locator(); +``` + + + + + + + + diff --git a/talawa-mobile-docs/locator/databaseFunctions.md b/talawa-mobile-docs/locator/databaseFunctions.md new file mode 100644 index 000000000..0c16f0a36 --- /dev/null +++ b/talawa-mobile-docs/locator/databaseFunctions.md @@ -0,0 +1,36 @@ + + + +# databaseFunctions top-level property + + + + + + + + + +[DataBaseMutationFunctions](../services_database_mutation_functions/DataBaseMutationFunctions-class.md) databaseFunctions + +_final_ + + + +

creating GetIt for DataBaseMutationFunctions.

+ + + +## Implementation + +```dart +final databaseFunctions = locator(); +``` + + + + + + + + diff --git a/talawa-mobile-docs/locator/graphqlConfig.md b/talawa-mobile-docs/locator/graphqlConfig.md new file mode 100644 index 000000000..68ae14fd6 --- /dev/null +++ b/talawa-mobile-docs/locator/graphqlConfig.md @@ -0,0 +1,36 @@ + + + +# graphqlConfig top-level property + + + + + + + + + +[GraphqlConfig](../services_graphql_config/GraphqlConfig-class.md) graphqlConfig + +_final_ + + + +

creating GetIt for GraphqlConfig.

+ + + +## Implementation + +```dart +final graphqlConfig = locator(); +``` + + + + + + + + diff --git a/talawa-mobile-docs/locator/imageCropper.md b/talawa-mobile-docs/locator/imageCropper.md new file mode 100644 index 000000000..19e98b7bf --- /dev/null +++ b/talawa-mobile-docs/locator/imageCropper.md @@ -0,0 +1,36 @@ + + + +# imageCropper top-level property + + + + + + + + + +[ImageCropper](https://pub.dev/documentation/image_cropper/4.0.1/image_cropper/ImageCropper-class.html) imageCropper + +_final_ + + + +

creating GetIt for ImageCropper.

+ + + +## Implementation + +```dart +final imageCropper = locator(); +``` + + + + + + + + diff --git a/talawa-mobile-docs/locator/imagePicker.md b/talawa-mobile-docs/locator/imagePicker.md new file mode 100644 index 000000000..a2c8b70a0 --- /dev/null +++ b/talawa-mobile-docs/locator/imagePicker.md @@ -0,0 +1,36 @@ + + + +# imagePicker top-level property + + + + + + + + + +[ImagePicker](https://pub.dev/documentation/image_picker/1.0.2/image_picker/ImagePicker-class.html) imagePicker + +_final_ + + + +

creating GetIt for ImagePicker.

+ + + +## Implementation + +```dart +final imagePicker = locator(); +``` + + + + + + + + diff --git a/talawa-mobile-docs/locator/locator-library.md b/talawa-mobile-docs/locator/locator-library.md new file mode 100644 index 000000000..0df1b4e88 --- /dev/null +++ b/talawa-mobile-docs/locator/locator-library.md @@ -0,0 +1,141 @@ + + + + +# locator library + + + + + + + + + + + + + + + +## Properties + +##### [connectivity](../locator/connectivity.md) → [Connectivity](https://pub.dev/documentation/connectivity_plus/4.0.2/connectivity_plus/Connectivity-class.html) + + + +creating GetIt for Connectivity. +_final_ + + + +##### [databaseFunctions](../locator/databaseFunctions.md) → [DataBaseMutationFunctions](../services_database_mutation_functions/DataBaseMutationFunctions-class.md) + + + +creating GetIt for DataBaseMutationFunctions. +_final_ + + + +##### [graphqlConfig](../locator/graphqlConfig.md) → [GraphqlConfig](../services_graphql_config/GraphqlConfig-class.md) + + + +creating GetIt for GraphqlConfig. +_final_ + + + +##### [imageCropper](../locator/imageCropper.md) → [ImageCropper](https://pub.dev/documentation/image_cropper/4.0.1/image_cropper/ImageCropper-class.html) + + + +creating GetIt for ImageCropper. +_final_ + + + +##### [imagePicker](../locator/imagePicker.md) → [ImagePicker](https://pub.dev/documentation/image_picker/1.0.2/image_picker/ImagePicker-class.html) + + + +creating GetIt for ImagePicker. +_final_ + + + +##### [locator](../locator/locator.md) ↔ [GetIt](https://pub.dev/documentation/get_it/7.6.0/get_it/GetIt-class.html) + + + +Intializaing the locator. +_read / write_ + + + +##### [navigationService](../locator/navigationService.md) → [NavigationService](../services_navigation_service/NavigationService-class.md) + + + +creating GetIt for NavigationService. +_final_ + + + +##### [organizationService](../locator/organizationService.md) → [OrganizationService](../services_org_service/OrganizationService-class.md) + + + +creating GetIt for OrganizationService. +_final_ + + + +##### [queries](../locator/queries.md) → [Queries](../utils_queries/Queries-class.md) + + + +creating GetIt for Queries. +_final_ + + + +##### [sizeConfig](../locator/sizeConfig.md) → [SizeConfig](../services_size_config/SizeConfig-class.md) + + + +creating GetIt for SizeConfig. +_final_ + + + +##### [userConfig](../locator/userConfig.md) → [UserConfig](../services_user_config/UserConfig-class.md) + + + +creating GetIt for UserConfig. +_final_ + + + + +## Functions + +##### [setupLocator](../locator/setupLocator.md)() void + + + +This function registers the widgets/objects in "GetIt". + + + + + + + + + + + + diff --git a/talawa-mobile-docs/locator/locator.md b/talawa-mobile-docs/locator/locator.md new file mode 100644 index 000000000..80b1db462 --- /dev/null +++ b/talawa-mobile-docs/locator/locator.md @@ -0,0 +1,36 @@ + + + +# locator top-level property + + + + + + + + + +[GetIt](https://pub.dev/documentation/get_it/7.6.0/get_it/GetIt-class.html) locator + +_read / write_ + + + +

Intializaing the locator.

+ + + +## Implementation + +```dart +GetIt locator = GetIt.instance; +``` + + + + + + + + diff --git a/talawa-mobile-docs/locator/navigationService.md b/talawa-mobile-docs/locator/navigationService.md new file mode 100644 index 000000000..2df4db664 --- /dev/null +++ b/talawa-mobile-docs/locator/navigationService.md @@ -0,0 +1,36 @@ + + + +# navigationService top-level property + + + + + + + + + +[NavigationService](../services_navigation_service/NavigationService-class.md) navigationService + +_final_ + + + +

creating GetIt for NavigationService.

+ + + +## Implementation + +```dart +final navigationService = locator(); +``` + + + + + + + + diff --git a/talawa-mobile-docs/locator/organizationService.md b/talawa-mobile-docs/locator/organizationService.md new file mode 100644 index 000000000..2ed728c6b --- /dev/null +++ b/talawa-mobile-docs/locator/organizationService.md @@ -0,0 +1,36 @@ + + + +# organizationService top-level property + + + + + + + + + +[OrganizationService](../services_org_service/OrganizationService-class.md) organizationService + +_final_ + + + +

creating GetIt for OrganizationService.

+ + + +## Implementation + +```dart +final organizationService = locator(); +``` + + + + + + + + diff --git a/talawa-mobile-docs/locator/queries.md b/talawa-mobile-docs/locator/queries.md new file mode 100644 index 000000000..5c95eaf58 --- /dev/null +++ b/talawa-mobile-docs/locator/queries.md @@ -0,0 +1,36 @@ + + + +# queries top-level property + + + + + + + + + +[Queries](../utils_queries/Queries-class.md) queries + +_final_ + + + +

creating GetIt for Queries.

+ + + +## Implementation + +```dart +final queries = locator(); +``` + + + + + + + + diff --git a/talawa-mobile-docs/locator/setupLocator.md b/talawa-mobile-docs/locator/setupLocator.md new file mode 100644 index 000000000..9fc6a16ec --- /dev/null +++ b/talawa-mobile-docs/locator/setupLocator.md @@ -0,0 +1,104 @@ + + + +# setupLocator function + + + + + + + + + + +void setupLocator +() + + + + + +

This function registers the widgets/objects in "GetIt".

+

params: + None

+

returns: + None

+ + + +## Implementation + +```dart +void setupLocator() { + //services + locator.registerSingleton(NavigationService()); + + //sizeConfig + locator.registerSingleton(SizeConfig()); + + locator.registerSingleton(Validator()); + + //userConfig + locator.registerSingleton(UserConfig()); + + //Services + locator.registerLazySingleton(() => PostService()); + locator.registerLazySingleton(() => EventService()); + locator.registerLazySingleton(() => TaskService()); + locator.registerLazySingleton(() => CommentService()); + locator.registerLazySingleton(() => OrganizationService()); + locator.registerLazySingleton(() => MultiMediaPickerService()); + locator.registerLazySingleton(() => Connectivity()); + locator.registerLazySingleton(() => ChatService()); + locator.registerLazySingleton(() => ImageCropper()); + locator.registerLazySingleton(() => ImagePicker()); + + //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(() => ExploreTasksViewModel()); + locator.registerFactory(() => CreateTaskViewModel()); + locator.registerFactory(() => MainScreenViewModel()); + locator.registerFactory(() => ProfilePageViewModel()); + locator.registerFactory(() => EditProfilePageViewModel()); + locator.registerFactory(() => CreateEventViewModel()); + locator.registerFactory(() => EditEventViewModel()); + locator.registerFactory(() => AddPostViewModel()); + locator.registerFactory(() => EventInfoViewModel()); + + //Widgets viewModels + locator.registerFactory(() => ProgressDialogViewModel()); + locator.registerFactory(() => CustomDrawerViewModel()); + locator.registerFactory(() => LikeButtonViewModel()); + locator.registerFactory(() => AppLanguage()); + locator.registerFactory(() => CommentsViewModel()); + locator.registerFactory(() => AppTheme()); + locator.registerFactory(() => DirectChatViewModel()); + locator.registerFactory(() => AccessScreenViewModel()); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/locator/sizeConfig.md b/talawa-mobile-docs/locator/sizeConfig.md new file mode 100644 index 000000000..413c9f786 --- /dev/null +++ b/talawa-mobile-docs/locator/sizeConfig.md @@ -0,0 +1,36 @@ + + + +# sizeConfig top-level property + + + + + + + + + +[SizeConfig](../services_size_config/SizeConfig-class.md) sizeConfig + +_final_ + + + +

creating GetIt for SizeConfig.

+ + + +## Implementation + +```dart +final sizeConfig = locator(); +``` + + + + + + + + diff --git a/talawa-mobile-docs/locator/userConfig.md b/talawa-mobile-docs/locator/userConfig.md new file mode 100644 index 000000000..cb96aca54 --- /dev/null +++ b/talawa-mobile-docs/locator/userConfig.md @@ -0,0 +1,36 @@ + + + +# userConfig top-level property + + + + + + + + + +[UserConfig](../services_user_config/UserConfig-class.md) userConfig + +_final_ + + + +

creating GetIt for UserConfig.

+ + + +## Implementation + +```dart +final userConfig = locator(); +``` + + + + + + + + diff --git a/talawa-mobile-docs/main/DemoPageView-class.md b/talawa-mobile-docs/main/DemoPageView-class.md new file mode 100644 index 000000000..08b2e0d15 --- /dev/null +++ b/talawa-mobile-docs/main/DemoPageView-class.md @@ -0,0 +1,190 @@ + + + +# DemoPageView class + + + + + + + + + +

PageView is a scrollable list that works page by page.

+

DemoPageView is demo PageView of Talawa Mobile App.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- DemoPageView + + + + + + + + +## Constructors + +[DemoPageView](../main/DemoPageView/DemoPageView.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../main/DemoPageView/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/main/DemoPageView/DemoPageView.md b/talawa-mobile-docs/main/DemoPageView/DemoPageView.md new file mode 100644 index 000000000..dbddcb13a --- /dev/null +++ b/talawa-mobile-docs/main/DemoPageView/DemoPageView.md @@ -0,0 +1,29 @@ + + + +# DemoPageView constructor + + + + + + +const +DemoPageView({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key}) + + + + + +## Implementation + +```dart +const DemoPageView({required Key key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/main/DemoPageView/build.md b/talawa-mobile-docs/main/DemoPageView/build.md new file mode 100644 index 000000000..9fd20f775 --- /dev/null +++ b/talawa-mobile-docs/main/DemoPageView/build.md @@ -0,0 +1,82 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + FetchPluginList(); + return BaseView( + builder: (context, model, child) => Scaffold( + appBar: AppBar( + title: + Text(AppLocalizations.of(context)!.strictTranslate('Demo Page')), + ), + body: Container( + child: Text(model.title), + ), + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/main/DemoViewModel-class.md b/talawa-mobile-docs/main/DemoViewModel-class.md new file mode 100644 index 000000000..3c395e0ad --- /dev/null +++ b/talawa-mobile-docs/main/DemoViewModel-class.md @@ -0,0 +1,191 @@ + + + +# DemoViewModel class + + + + + + + + + +

ViewModel uses property-based data binding to establish a connection.

+

between the ViewModel and the View, and drives the View changes +through the ViewModel. DemoViewModel is the ViewModel for DemoPageView.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- DemoViewModel + + + + + + + + +## Constructors + +[DemoViewModel](../main/DemoViewModel/DemoViewModel.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + +##### [title](../main/DemoViewModel/title.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Getter function of the title. +_read-only_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/main/DemoViewModel/DemoViewModel.md b/talawa-mobile-docs/main/DemoViewModel/DemoViewModel.md new file mode 100644 index 000000000..1295f2c65 --- /dev/null +++ b/talawa-mobile-docs/main/DemoViewModel/DemoViewModel.md @@ -0,0 +1,24 @@ + + + +# DemoViewModel constructor + + + + + + + +DemoViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/main/DemoViewModel/title.md b/talawa-mobile-docs/main/DemoViewModel/title.md new file mode 100644 index 000000000..0e5577801 --- /dev/null +++ b/talawa-mobile-docs/main/DemoViewModel/title.md @@ -0,0 +1,42 @@ + + + +# title property + + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) title + + + + + +

Getter function of the title.

+

params: +None +returns:

+
    +
  • String: title of the model
  • +
+ + + +## Implementation + +```dart +String get title => _title; +``` + + + + + + + + diff --git a/talawa-mobile-docs/main/MyApp-class.md b/talawa-mobile-docs/main/MyApp-class.md new file mode 100644 index 000000000..c76b3c6a3 --- /dev/null +++ b/talawa-mobile-docs/main/MyApp-class.md @@ -0,0 +1,189 @@ + + + +# MyApp class + + + + + + + + + +

Main widget that sets up the quick actions, internationalization, routing , notifications.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- MyApp + + + + + + + + +## Constructors + +[MyApp](../main/MyApp/MyApp.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../main/MyApp/createState.md)() _MyAppState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/main/MyApp/MyApp.md b/talawa-mobile-docs/main/MyApp/MyApp.md new file mode 100644 index 000000000..d0bf0fead --- /dev/null +++ b/talawa-mobile-docs/main/MyApp/MyApp.md @@ -0,0 +1,24 @@ + + + +# MyApp constructor + + + + + + + +MyApp() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/main/MyApp/createState.md b/talawa-mobile-docs/main/MyApp/createState.md new file mode 100644 index 000000000..b001fadad --- /dev/null +++ b/talawa-mobile-docs/main/MyApp/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_MyAppState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_MyAppState createState() => _MyAppState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/main/androidFirebaseOptions.md b/talawa-mobile-docs/main/androidFirebaseOptions.md new file mode 100644 index 000000000..268b1a3b4 --- /dev/null +++ b/talawa-mobile-docs/main/androidFirebaseOptions.md @@ -0,0 +1,36 @@ + + + +# androidFirebaseOptions top-level property + + + + + + + + + +[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> androidFirebaseOptions + +_read / write_ + + + +

HashMap of Firebase options for android.

+ + + +## Implementation + +```dart +late Map androidFirebaseOptions; +``` + + + + + + + + diff --git a/talawa-mobile-docs/main/channel.md b/talawa-mobile-docs/main/channel.md new file mode 100644 index 000000000..5f4cada3f --- /dev/null +++ b/talawa-mobile-docs/main/channel.md @@ -0,0 +1,36 @@ + + + +# channel top-level property + + + + + + + + + +[AndroidNotificationChannel](https://pub.dev/documentation/flutter_local_notifications/15.1.0+1/flutter_local_notifications/AndroidNotificationChannel-class.html) channel + +_read / write_ + + + +

Create a AndroidNotificationChannel for heads up notifications.

+ + + +## Implementation + +```dart +late AndroidNotificationChannel channel; +``` + + + + + + + + diff --git a/talawa-mobile-docs/main/flutterLocalNotificationsPlugin.md b/talawa-mobile-docs/main/flutterLocalNotificationsPlugin.md new file mode 100644 index 000000000..fb311aba4 --- /dev/null +++ b/talawa-mobile-docs/main/flutterLocalNotificationsPlugin.md @@ -0,0 +1,36 @@ + + + +# flutterLocalNotificationsPlugin top-level property + + + + + + + + + +[FlutterLocalNotificationsPlugin](https://pub.dev/documentation/flutter_local_notifications/15.1.0+1/flutter_local_notifications/FlutterLocalNotificationsPlugin-class.html) flutterLocalNotificationsPlugin + +_read / write_ + + + +

Initialize the FlutterLocalNotificationsPlugin package.

+ + + +## Implementation + +```dart +late FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin; +``` + + + + + + + + diff --git a/talawa-mobile-docs/main/iosFirebaseOptions.md b/talawa-mobile-docs/main/iosFirebaseOptions.md new file mode 100644 index 000000000..a92e5f8da --- /dev/null +++ b/talawa-mobile-docs/main/iosFirebaseOptions.md @@ -0,0 +1,36 @@ + + + +# iosFirebaseOptions top-level property + + + + + + + + + +[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> iosFirebaseOptions + +_read / write_ + + + +

HashMap of Firebase options for android.

+ + + +## Implementation + +```dart +late Map iosFirebaseOptions; +``` + + + + + + + + diff --git a/talawa-mobile-docs/main/main-library.md b/talawa-mobile-docs/main/main-library.md new file mode 100644 index 000000000..1041a7965 --- /dev/null +++ b/talawa-mobile-docs/main/main-library.md @@ -0,0 +1,128 @@ + + + + +# main library + + + + + + + + + + + +## Classes + +##### [DemoPageView](../main/DemoPageView-class.md) + + + +PageView is a scrollable list that works page by page. + + +##### [DemoViewModel](../main/DemoViewModel-class.md) + + + +ViewModel uses property-based data binding to establish a connection. + + +##### [MyApp](../main/MyApp-class.md) + + + +Main widget that sets up the quick actions, internationalization, routing , notifications. + + + + + + +## Properties + +##### [androidFirebaseOptions](../main/androidFirebaseOptions.md) ↔ [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> + + + +HashMap of Firebase options for android. +_read / write_ + + + +##### [channel](../main/channel.md) ↔ [AndroidNotificationChannel](https://pub.dev/documentation/flutter_local_notifications/15.1.0+1/flutter_local_notifications/AndroidNotificationChannel-class.html) + + + +Create a AndroidNotificationChannel for heads up notifications. +_read / write_ + + + +##### [flutterLocalNotificationsPlugin](../main/flutterLocalNotificationsPlugin.md) ↔ [FlutterLocalNotificationsPlugin](https://pub.dev/documentation/flutter_local_notifications/15.1.0+1/flutter_local_notifications/FlutterLocalNotificationsPlugin-class.html) + + + +Initialize the FlutterLocalNotificationsPlugin package. +_read / write_ + + + +##### [iosFirebaseOptions](../main/iosFirebaseOptions.md) ↔ [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> + + + +HashMap of Firebase options for android. +_read / write_ + + + + +## Functions + +##### [main](../main/main.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +First function to initialize the application, invoked automatically. + + + + +##### [setUpFirebase](../main/setUpFirebase.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +Initializes the firebase in the app according to the userplatform (android/iOS). + + + + +##### [setUpFirebaseKeys](../main/setUpFirebaseKeys.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +Initializes the firebase keys in the app according to the userplatform (android/iOS). + + + + +##### [setUpFirebaseMessaging](../main/setUpFirebaseMessaging.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +Set up firebase instance, enbables messaging,listens to icoming messages. + + + + + + + + + + + + diff --git a/talawa-mobile-docs/main/main.md b/talawa-mobile-docs/main/main.md new file mode 100644 index 000000000..457242910 --- /dev/null +++ b/talawa-mobile-docs/main/main.md @@ -0,0 +1,95 @@ + + + +# main function + + + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> main +() + + + + + +

First function to initialize the application, invoked automatically.

+

params: + None

+

returns:

+
    +
  • Future<void>: resolves if the application was successfully initialized.
  • +
+ + + +## Implementation + +```dart +Future main() async { + // Returns an instance of the binding that implements WidgetsBinding. + WidgetsFlutterBinding.ensureInitialized(); + + if (!kIsWeb) { + channel = const AndroidNotificationChannel( + 'high_importance_channel', // id + 'High Importance Notifications', // title + description: + 'This channel is used for important notifications.', // description + importance: Importance.high, + ); + + flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); + + // Create an Android Notification Channel. + // We use this channel in the `AndroidManifest.xml` file to override the + // default FCM channel to enable heads up notifications. + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>() + ?.createNotificationChannel(channel); + } + + 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('pluginBox'); + await Hive.openBox('url'); + + final urlBox = await Hive.openBox('url'); + + try { + if (urlBox.get('url') != null) { + await setUpFirebaseKeys(); + + await setUpFirebase(); + await setUpFirebaseMessaging(); + } + } catch (e) { + print("Firebase not working"); + } + + setupLocator(); + // The runApp() function takes the given Widget and makes it the root of the widget tree. + runApp(MyApp()); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/main/setUpFirebase.md b/talawa-mobile-docs/main/setUpFirebase.md new file mode 100644 index 000000000..91557e294 --- /dev/null +++ b/talawa-mobile-docs/main/setUpFirebase.md @@ -0,0 +1,50 @@ + + + +# setUpFirebase function + + + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> setUpFirebase +() + + + + + +

Initializes the firebase in the app according to the userplatform (android/iOS).

+

params: + None

+

returns:

+
    +
  • Future<void>: promise that will be fulfilled Firebase is setted up in app.
  • +
+ + + +## Implementation + +```dart +Future setUpFirebase() async { + await Firebase.initializeApp( + options: DefaultFirebaseOptions.currentPlatform( + androidFirebaseOptions, + iosFirebaseOptions, + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/main/setUpFirebaseKeys.md b/talawa-mobile-docs/main/setUpFirebaseKeys.md new file mode 100644 index 000000000..ca716d0d6 --- /dev/null +++ b/talawa-mobile-docs/main/setUpFirebaseKeys.md @@ -0,0 +1,62 @@ + + + +# setUpFirebaseKeys function + + + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> setUpFirebaseKeys +() + + + + + +

Initializes the firebase keys in the app according to the userplatform (android/iOS).

+

params: + None

+

returns:

+
    +
  • Future<void>: promise that will be fulfilled Firebase keys are setted up.
  • +
+ + + +## Implementation + +```dart +Future setUpFirebaseKeys() async { + final androidFirebaseOptionsBox = + await Hive.openBox('androidFirebaseOptions'); + final androidFirebaseOptionsMap = androidFirebaseOptionsBox + .get('androidFirebaseOptions') as Map?; + + final iosFirebaseOptionsBox = await Hive.openBox('iosFirebaseOptions'); + final iosFirebaseOptionsMap = + iosFirebaseOptionsBox.get('iosFirebaseOptions') as Map?; + if (androidFirebaseOptionsMap != null) { + androidFirebaseOptions = androidFirebaseOptionsMap.map((key, value) { + return MapEntry(key.toString(), value); + }); + } + if (iosFirebaseOptionsMap != null) { + iosFirebaseOptions = iosFirebaseOptionsMap.map((key, value) { + return MapEntry(key.toString(), value); + }); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/main/setUpFirebaseMessaging.md b/talawa-mobile-docs/main/setUpFirebaseMessaging.md new file mode 100644 index 000000000..d28c01b84 --- /dev/null +++ b/talawa-mobile-docs/main/setUpFirebaseMessaging.md @@ -0,0 +1,79 @@ + + + +# setUpFirebaseMessaging function + + + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> setUpFirebaseMessaging +() + + + + + +

Set up firebase instance, enbables messaging,listens to icoming messages.

+

params: + None

+

returns:

+
    +
  • Future<void>: promise that will be fulfilled Firebase is setted up.
  • +
+ + + +## Implementation + +```dart +Future setUpFirebaseMessaging() async { + /// Set the background messaging handler early on, as a named top-level function + FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler); + + // Update the iOS foreground notification presentation options to allow heads up notifications. + await FirebaseMessaging.instance.setForegroundNotificationPresentationOptions( + alert: true, + badge: true, + sound: true, + ); + + FirebaseMessaging.instance + .getInitialMessage() + .then((RemoteMessage? message) {}); + + FirebaseMessaging.onMessage.listen((RemoteMessage message) { + final RemoteNotification? notification = message.notification; + final AndroidNotification? android = message.notification?.android; + if (notification != null && android != null && !kIsWeb) { + flutterLocalNotificationsPlugin.show( + notification.hashCode, + notification.title, + notification.body, + NotificationDetails( + android: AndroidNotificationDetails( + channel.id, + channel.name, + channelDescription: channel.description, + icon: 'launch_background', + ), + ), + ); + } + }); + + FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {}); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md b/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md new file mode 100644 index 000000000..7a107b767 --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md @@ -0,0 +1,133 @@ + + + +# ChatListTileDataModel class + + + + + + + + + +

This class creates JSON code using the JsonSerializable package.

+ + + + + + + + + +**Annotations** + +- @[JsonSerializable](https://pub.dev/documentation/json_annotation/4.8.1/json_annotation/JsonSerializable-class.html)() + + +## Constructors + +[ChatListTileDataModel](../models_chats_chat_list_tile_data_model/ChatListTileDataModel/ChatListTileDataModel.md) ([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ChatUser](../models_chats_chat_user/ChatUser-class.md)>? users, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id) + + + +[ChatListTileDataModel.fromJson](../models_chats_chat_list_tile_data_model/ChatListTileDataModel/ChatListTileDataModel.fromJson.md) ([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + + _factory_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [id](../models_chats_chat_list_tile_data_model/ChatListTileDataModel/id.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [users](../models_chats_chat_list_tile_data_model/ChatListTileDataModel/users.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ChatUser](../models_chats_chat_user/ChatUser-class.md)>? + + + + +_read / write_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toJson](../models_chats_chat_list_tile_data_model/ChatListTileDataModel/toJson.md)() [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> + + + + + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/ChatListTileDataModel.fromJson.md b/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/ChatListTileDataModel.fromJson.md new file mode 100644 index 000000000..c969f9259 --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/ChatListTileDataModel.fromJson.md @@ -0,0 +1,30 @@ + + + +# ChatListTileDataModel.fromJson constructor + + + + + + + +ChatListTileDataModel.fromJson([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + + + + + +## Implementation + +```dart +factory ChatListTileDataModel.fromJson(Map json) => + _$ChatListTileDataModelFromJson(json); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/ChatListTileDataModel.md b/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/ChatListTileDataModel.md new file mode 100644 index 000000000..ee3832b37 --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/ChatListTileDataModel.md @@ -0,0 +1,29 @@ + + + +# ChatListTileDataModel constructor + + + + + + + +ChatListTileDataModel([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ChatUser](../../models_chats_chat_user/ChatUser-class.md)>? users, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id) + + + + + +## Implementation + +```dart +ChatListTileDataModel(this.users, this.id); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/id.md b/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/id.md new file mode 100644 index 000000000..833ed271b --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/id.md @@ -0,0 +1,32 @@ + + + +# id property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id + +_read / write_ + + + + + + +## Implementation + +```dart +String? id; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/toJson.md b/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/toJson.md new file mode 100644 index 000000000..8b766cc4e --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/toJson.md @@ -0,0 +1,34 @@ + + + +# toJson method + + + + + + + + +[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> toJson +() + + + + + + + + +## Implementation + +```dart +Map toJson() => _$ChatListTileDataModelToJson(this); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/users.md b/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/users.md new file mode 100644 index 000000000..58ed251cb --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_list_tile_data_model/ChatListTileDataModel/users.md @@ -0,0 +1,32 @@ + + + +# users property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ChatUser](../../models_chats_chat_user/ChatUser-class.md)>? users + +_read / write_ + + + + + + +## Implementation + +```dart +List? users; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_list_tile_data_model/models_chats_chat_list_tile_data_model-library.md b/talawa-mobile-docs/models_chats_chat_list_tile_data_model/models_chats_chat_list_tile_data_model-library.md new file mode 100644 index 000000000..796cc4e88 --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_list_tile_data_model/models_chats_chat_list_tile_data_model-library.md @@ -0,0 +1,38 @@ + + + + +# chat_list_tile_data_model library + + + + + + + + + + + +## Classes + +##### [ChatListTileDataModel](../models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md) + + + +This class creates JSON code using the JsonSerializable package. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_message/ChatMessage-class.md b/talawa-mobile-docs/models_chats_chat_message/ChatMessage-class.md new file mode 100644 index 000000000..4c38ab423 --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_message/ChatMessage-class.md @@ -0,0 +1,151 @@ + + + +# ChatMessage class + + + + + + + + + +

This class creates JSON code for chat message using the JsonSerializable package.

+ + + + + + + + + +**Annotations** + +- @[JsonSerializable](https://pub.dev/documentation/json_annotation/4.8.1/json_annotation/JsonSerializable-class.html)(explicitToJson: true) + + +## Constructors + +[ChatMessage](../models_chats_chat_message/ChatMessage/ChatMessage.md) ([String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id, [ChatUser](../models_chats_chat_user/ChatUser-class.md)? sender, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? messageContent, [ChatUser](../models_chats_chat_user/ChatUser-class.md)? receiver) + + + +[ChatMessage.fromJson](../models_chats_chat_message/ChatMessage/ChatMessage.fromJson.md) ([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + + _factory_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [id](../models_chats_chat_message/ChatMessage/id.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [messageContent](../models_chats_chat_message/ChatMessage/messageContent.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [receiver](../models_chats_chat_message/ChatMessage/receiver.md) ↔ [ChatUser](../models_chats_chat_user/ChatUser-class.md)? + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [sender](../models_chats_chat_message/ChatMessage/sender.md) ↔ [ChatUser](../models_chats_chat_user/ChatUser-class.md)? + + + + +_read / write_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toJson](../models_chats_chat_message/ChatMessage/toJson.md)() [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> + + + + + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_message/ChatMessage/ChatMessage.fromJson.md b/talawa-mobile-docs/models_chats_chat_message/ChatMessage/ChatMessage.fromJson.md new file mode 100644 index 000000000..514060af9 --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_message/ChatMessage/ChatMessage.fromJson.md @@ -0,0 +1,30 @@ + + + +# ChatMessage.fromJson constructor + + + + + + + +ChatMessage.fromJson([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + + + + + +## Implementation + +```dart +factory ChatMessage.fromJson(Map json) => + _$ChatMessageFromJson(json); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_message/ChatMessage/ChatMessage.md b/talawa-mobile-docs/models_chats_chat_message/ChatMessage/ChatMessage.md new file mode 100644 index 000000000..78e85c05d --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_message/ChatMessage/ChatMessage.md @@ -0,0 +1,34 @@ + + + +# ChatMessage constructor + + + + + + + +ChatMessage([String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id, [ChatUser](../../models_chats_chat_user/ChatUser-class.md)? sender, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? messageContent, [ChatUser](../../models_chats_chat_user/ChatUser-class.md)? receiver) + + + + + +## Implementation + +```dart +ChatMessage( + this.id, + this.sender, + this.messageContent, + this.receiver, +); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_message/ChatMessage/id.md b/talawa-mobile-docs/models_chats_chat_message/ChatMessage/id.md new file mode 100644 index 000000000..833ed271b --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_message/ChatMessage/id.md @@ -0,0 +1,32 @@ + + + +# id property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id + +_read / write_ + + + + + + +## Implementation + +```dart +String? id; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_message/ChatMessage/messageContent.md b/talawa-mobile-docs/models_chats_chat_message/ChatMessage/messageContent.md new file mode 100644 index 000000000..372a20d7a --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_message/ChatMessage/messageContent.md @@ -0,0 +1,32 @@ + + + +# messageContent property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? messageContent + +_read / write_ + + + + + + +## Implementation + +```dart +String? messageContent; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_message/ChatMessage/receiver.md b/talawa-mobile-docs/models_chats_chat_message/ChatMessage/receiver.md new file mode 100644 index 000000000..7887b8cf4 --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_message/ChatMessage/receiver.md @@ -0,0 +1,32 @@ + + + +# receiver property + + + + + + + +[ChatUser](../../models_chats_chat_user/ChatUser-class.md)? receiver + +_read / write_ + + + + + + +## Implementation + +```dart +ChatUser? receiver; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_message/ChatMessage/sender.md b/talawa-mobile-docs/models_chats_chat_message/ChatMessage/sender.md new file mode 100644 index 000000000..4b8806efb --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_message/ChatMessage/sender.md @@ -0,0 +1,32 @@ + + + +# sender property + + + + + + + +[ChatUser](../../models_chats_chat_user/ChatUser-class.md)? sender + +_read / write_ + + + + + + +## Implementation + +```dart +ChatUser? sender; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_message/ChatMessage/toJson.md b/talawa-mobile-docs/models_chats_chat_message/ChatMessage/toJson.md new file mode 100644 index 000000000..0f7c47e94 --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_message/ChatMessage/toJson.md @@ -0,0 +1,34 @@ + + + +# toJson method + + + + + + + + +[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> toJson +() + + + + + + + + +## Implementation + +```dart +Map toJson() => _$ChatMessageToJson(this); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_message/models_chats_chat_message-library.md b/talawa-mobile-docs/models_chats_chat_message/models_chats_chat_message-library.md new file mode 100644 index 000000000..b21336f76 --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_message/models_chats_chat_message-library.md @@ -0,0 +1,38 @@ + + + + +# chat_message library + + + + + + + + + + + +## Classes + +##### [ChatMessage](../models_chats_chat_message/ChatMessage-class.md) + + + +This class creates JSON code for chat message using the JsonSerializable package. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_user/ChatUser-class.md b/talawa-mobile-docs/models_chats_chat_user/ChatUser-class.md new file mode 100644 index 000000000..18020e727 --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_user/ChatUser-class.md @@ -0,0 +1,142 @@ + + + +# ChatUser class + + + + + + + + + +

This class creates JSON code for chat user using the JsonSerializable package.

+ + + + + + + + + +**Annotations** + +- @[JsonSerializable](https://pub.dev/documentation/json_annotation/4.8.1/json_annotation/JsonSerializable-class.html)() + + +## Constructors + +[ChatUser](../models_chats_chat_user/ChatUser/ChatUser.md) ({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? firstName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? image}) + + + +[ChatUser.fromJson](../models_chats_chat_user/ChatUser/ChatUser.fromJson.md) ([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + + _factory_ + + +## Properties + +##### [firstName](../models_chats_chat_user/ChatUser/firstName.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [id](../models_chats_chat_user/ChatUser/id.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [image](../models_chats_chat_user/ChatUser/image.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toJson](../models_chats_chat_user/ChatUser/toJson.md)() [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> + + + + + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_user/ChatUser/ChatUser.fromJson.md b/talawa-mobile-docs/models_chats_chat_user/ChatUser/ChatUser.fromJson.md new file mode 100644 index 000000000..4283c825f --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_user/ChatUser/ChatUser.fromJson.md @@ -0,0 +1,30 @@ + + + +# ChatUser.fromJson constructor + + + + + + + +ChatUser.fromJson([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + + + + + +## Implementation + +```dart +factory ChatUser.fromJson(Map json) => + _$ChatUserFromJson(json); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_user/ChatUser/ChatUser.md b/talawa-mobile-docs/models_chats_chat_user/ChatUser/ChatUser.md new file mode 100644 index 000000000..5b6db09b4 --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_user/ChatUser/ChatUser.md @@ -0,0 +1,29 @@ + + + +# ChatUser constructor + + + + + + + +ChatUser({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? firstName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? image}) + + + + + +## Implementation + +```dart +ChatUser({this.firstName, this.id, this.image}); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_user/ChatUser/firstName.md b/talawa-mobile-docs/models_chats_chat_user/ChatUser/firstName.md new file mode 100644 index 000000000..0fbc84727 --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_user/ChatUser/firstName.md @@ -0,0 +1,32 @@ + + + +# firstName property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? firstName + +_read / write_ + + + + + + +## Implementation + +```dart +String? firstName; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_user/ChatUser/id.md b/talawa-mobile-docs/models_chats_chat_user/ChatUser/id.md new file mode 100644 index 000000000..833ed271b --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_user/ChatUser/id.md @@ -0,0 +1,32 @@ + + + +# id property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id + +_read / write_ + + + + + + +## Implementation + +```dart +String? id; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_user/ChatUser/image.md b/talawa-mobile-docs/models_chats_chat_user/ChatUser/image.md new file mode 100644 index 000000000..db1007542 --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_user/ChatUser/image.md @@ -0,0 +1,32 @@ + + + +# image property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? image + +_read / write_ + + + + + + +## Implementation + +```dart +String? image; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_user/ChatUser/toJson.md b/talawa-mobile-docs/models_chats_chat_user/ChatUser/toJson.md new file mode 100644 index 000000000..8c0124f88 --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_user/ChatUser/toJson.md @@ -0,0 +1,34 @@ + + + +# toJson method + + + + + + + + +[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> toJson +() + + + + + + + + +## Implementation + +```dart +Map toJson() => _$ChatUserToJson(this); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_chats_chat_user/models_chats_chat_user-library.md b/talawa-mobile-docs/models_chats_chat_user/models_chats_chat_user-library.md new file mode 100644 index 000000000..793e8e89e --- /dev/null +++ b/talawa-mobile-docs/models_chats_chat_user/models_chats_chat_user-library.md @@ -0,0 +1,38 @@ + + + + +# chat_user library + + + + + + + + + + + +## Classes + +##### [ChatUser](../models_chats_chat_user/ChatUser-class.md) + + + +This class creates JSON code for chat user using the JsonSerializable package. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_comment_comment_model/Comment-class.md b/talawa-mobile-docs/models_comment_comment_model/Comment-class.md new file mode 100644 index 000000000..e00460d30 --- /dev/null +++ b/talawa-mobile-docs/models_comment_comment_model/Comment-class.md @@ -0,0 +1,141 @@ + + + +# Comment class + + + + + + + + + +

This class returns a Comment instance.

+ + + + +## Constructors + +[Comment](../models_comment_comment_model/Comment/Comment.md) ({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? text, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? createdAt, [User](../models_user_user_info/User-class.md)? creator, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? post, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? likeCount}) + + + +[Comment.fromJson](../models_comment_comment_model/Comment/Comment.fromJson.md) ([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + + _factory_ + + +## Properties + +##### [createdAt](../models_comment_comment_model/Comment/createdAt.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [creator](../models_comment_comment_model/Comment/creator.md) ↔ [User](../models_user_user_info/User-class.md)? + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [likeCount](../models_comment_comment_model/Comment/likeCount.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [post](../models_comment_comment_model/Comment/post.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [text](../models_comment_comment_model/Comment/text.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_comment_comment_model/Comment/Comment.fromJson.md b/talawa-mobile-docs/models_comment_comment_model/Comment/Comment.fromJson.md new file mode 100644 index 000000000..15a902170 --- /dev/null +++ b/talawa-mobile-docs/models_comment_comment_model/Comment/Comment.fromJson.md @@ -0,0 +1,43 @@ + + + +# Comment.fromJson constructor + + + + + + + +Comment.fromJson([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + + + + + +## Implementation + +```dart +factory Comment.fromJson(Map json) { + return Comment( + text: json['text'] as String?, + createdAt: json['createdAt'] as String?, + creator: json['creator'] == null + ? null + //Creating a new User instance from a map structure. + : User.fromJson( + json['creator'] as Map, + fromOrg: true, + ), + post: json['post'] as String?, + likeCount: json['likeCount'] as String?, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_comment_comment_model/Comment/Comment.md b/talawa-mobile-docs/models_comment_comment_model/Comment/Comment.md new file mode 100644 index 000000000..120962bcc --- /dev/null +++ b/talawa-mobile-docs/models_comment_comment_model/Comment/Comment.md @@ -0,0 +1,29 @@ + + + +# Comment constructor + + + + + + + +Comment({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? text, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? createdAt, [User](../../models_user_user_info/User-class.md)? creator, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? post, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? likeCount}) + + + + + +## Implementation + +```dart +Comment({this.text, this.createdAt, this.creator, this.post, this.likeCount}); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_comment_comment_model/Comment/createdAt.md b/talawa-mobile-docs/models_comment_comment_model/Comment/createdAt.md new file mode 100644 index 000000000..6f4a3a12e --- /dev/null +++ b/talawa-mobile-docs/models_comment_comment_model/Comment/createdAt.md @@ -0,0 +1,32 @@ + + + +# createdAt property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? createdAt + +_read / write_ + + + + + + +## Implementation + +```dart +String? createdAt; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_comment_comment_model/Comment/creator.md b/talawa-mobile-docs/models_comment_comment_model/Comment/creator.md new file mode 100644 index 000000000..8dcdc334b --- /dev/null +++ b/talawa-mobile-docs/models_comment_comment_model/Comment/creator.md @@ -0,0 +1,32 @@ + + + +# creator property + + + + + + + +[User](../../models_user_user_info/User-class.md)? creator + +_read / write_ + + + + + + +## Implementation + +```dart +User? creator; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_comment_comment_model/Comment/likeCount.md b/talawa-mobile-docs/models_comment_comment_model/Comment/likeCount.md new file mode 100644 index 000000000..d4ba33db5 --- /dev/null +++ b/talawa-mobile-docs/models_comment_comment_model/Comment/likeCount.md @@ -0,0 +1,32 @@ + + + +# likeCount property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? likeCount + +_read / write_ + + + + + + +## Implementation + +```dart +String? likeCount; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_comment_comment_model/Comment/post.md b/talawa-mobile-docs/models_comment_comment_model/Comment/post.md new file mode 100644 index 000000000..60ba62c80 --- /dev/null +++ b/talawa-mobile-docs/models_comment_comment_model/Comment/post.md @@ -0,0 +1,32 @@ + + + +# post property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? post + +_read / write_ + + + + + + +## Implementation + +```dart +String? post; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_comment_comment_model/Comment/text.md b/talawa-mobile-docs/models_comment_comment_model/Comment/text.md new file mode 100644 index 000000000..3e3c81333 --- /dev/null +++ b/talawa-mobile-docs/models_comment_comment_model/Comment/text.md @@ -0,0 +1,32 @@ + + + +# text property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? text + +_read / write_ + + + + + + +## Implementation + +```dart +String? text; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_comment_comment_model/models_comment_comment_model-library.md b/talawa-mobile-docs/models_comment_comment_model/models_comment_comment_model-library.md new file mode 100644 index 000000000..85d3df1ba --- /dev/null +++ b/talawa-mobile-docs/models_comment_comment_model/models_comment_comment_model-library.md @@ -0,0 +1,38 @@ + + + + +# comment_model library + + + + + + + + + + + +## Classes + +##### [Comment](../models_comment_comment_model/Comment-class.md) + + + +This class returns a Comment instance. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event-class.md b/talawa-mobile-docs/models_events_event_model/Event-class.md new file mode 100644 index 000000000..0ab22c2ff --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event-class.md @@ -0,0 +1,285 @@ + + + +# Event class + + + + + + + + + +

This class creates an event model and returns an Event instance.

+ + + + +## Constructors + +[Event](../models_events_event_model/Event/Event.md) ({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? title, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? description, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? attendees, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? location, [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? latitude, [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? longitude, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? recurring, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? allDay, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? startDate, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? endDate, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? startTime, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? endTime, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? recurrence, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? isPublic, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? isRegistered, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? isRegisterable, [User](../models_user_user_info/User-class.md)? creator, [OrgInfo](../models_organization_org_info/OrgInfo-class.md)? organization, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../models_user_user_info/User-class.md)>? admins, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../models_user_user_info/User-class.md)>? registrants}) + + + +[Event.fromJson](../models_events_event_model/Event/Event.fromJson.md) ([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + + _factory_ + + +## Properties + +##### [admins](../models_events_event_model/Event/admins.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../models_user_user_info/User-class.md)>? + + + + +_read / write_ + + + +##### [allDay](../models_events_event_model/Event/allDay.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? + + + + +_read / write_ + + + +##### [attendees](../models_events_event_model/Event/attendees.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [creator](../models_events_event_model/Event/creator.md) ↔ [User](../models_user_user_info/User-class.md)? + + + + +_read / write_ + + + +##### [description](../models_events_event_model/Event/description.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [endDate](../models_events_event_model/Event/endDate.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [endTime](../models_events_event_model/Event/endTime.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [id](../models_events_event_model/Event/id.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [isPublic](../models_events_event_model/Event/isPublic.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? + + + + +_read / write_ + + + +##### [isRegisterable](../models_events_event_model/Event/isRegisterable.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? + + + + +_read / write_ + + + +##### [isRegistered](../models_events_event_model/Event/isRegistered.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? + + + + +_read / write_ + + + +##### [latitude](../models_events_event_model/Event/latitude.md) ↔ [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? + + + + +_read / write_ + + + +##### [location](../models_events_event_model/Event/location.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [longitude](../models_events_event_model/Event/longitude.md) ↔ [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? + + + + +_read / write_ + + + +##### [organization](../models_events_event_model/Event/organization.md) ↔ [OrgInfo](../models_organization_org_info/OrgInfo-class.md)? + + + + +_read / write_ + + + +##### [recurrence](../models_events_event_model/Event/recurrence.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [recurring](../models_events_event_model/Event/recurring.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? + + + + +_read / write_ + + + +##### [registrants](../models_events_event_model/Event/registrants.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../models_user_user_info/User-class.md)>? + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [startDate](../models_events_event_model/Event/startDate.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [startTime](../models_events_event_model/Event/startTime.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [title](../models_events_event_model/Event/title.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/Event.fromJson.md b/talawa-mobile-docs/models_events_event_model/Event/Event.fromJson.md new file mode 100644 index 000000000..9a7ea61a0 --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/Event.fromJson.md @@ -0,0 +1,72 @@ + + + +# Event.fromJson constructor + + + + + + + +Event.fromJson([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + + + + + +## Implementation + +```dart +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?, + longitude: json['longitude'] as double?, + latitude: json['latitude'] as double?, + 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['isRegistered'] as bool?, + isRegisterable: json['isRegisterable'] as bool?, + creator: json['creator'] == null + ? null + //Creating a new User instance from a map structure. + : User.fromJson( + json['creator'] as Map, + fromOrg: true, + ), + organization: json['organization'] == null + ? null + //Creating a new OrgInfo instance from a map structure. + : 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: false)) + .toList(), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/Event.md b/talawa-mobile-docs/models_events_event_model/Event/Event.md new file mode 100644 index 000000000..399d73b89 --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/Event.md @@ -0,0 +1,51 @@ + + + +# Event constructor + + + + + + + +Event({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? title, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? description, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? attendees, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? location, [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? latitude, [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? longitude, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? recurring, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? allDay, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? startDate, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? endDate, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? startTime, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? endTime, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? recurrence, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? isPublic, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? isRegistered, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? isRegisterable, [User](../../models_user_user_info/User-class.md)? creator, [OrgInfo](../../models_organization_org_info/OrgInfo-class.md)? organization, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../../models_user_user_info/User-class.md)>? admins, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../../models_user_user_info/User-class.md)>? registrants}) + + + + + +## Implementation + +```dart +Event({ + this.id, + this.title, + this.description, + this.attendees, + this.location, + this.latitude, + this.longitude, + 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, +}); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/admins.md b/talawa-mobile-docs/models_events_event_model/Event/admins.md new file mode 100644 index 000000000..d97a3be09 --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/admins.md @@ -0,0 +1,32 @@ + + + +# admins property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../../models_user_user_info/User-class.md)>? admins + +_read / write_ + + + + + + +## Implementation + +```dart +List? admins; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/allDay.md b/talawa-mobile-docs/models_events_event_model/Event/allDay.md new file mode 100644 index 000000000..630774560 --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/allDay.md @@ -0,0 +1,32 @@ + + + +# allDay property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? allDay + +_read / write_ + + + + + + +## Implementation + +```dart +bool? allDay; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/attendees.md b/talawa-mobile-docs/models_events_event_model/Event/attendees.md new file mode 100644 index 000000000..203b6c667 --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/attendees.md @@ -0,0 +1,32 @@ + + + +# attendees property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? attendees + +_read / write_ + + + + + + +## Implementation + +```dart +String? attendees; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/creator.md b/talawa-mobile-docs/models_events_event_model/Event/creator.md new file mode 100644 index 000000000..8dcdc334b --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/creator.md @@ -0,0 +1,32 @@ + + + +# creator property + + + + + + + +[User](../../models_user_user_info/User-class.md)? creator + +_read / write_ + + + + + + +## Implementation + +```dart +User? creator; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/description.md b/talawa-mobile-docs/models_events_event_model/Event/description.md new file mode 100644 index 000000000..274483eb8 --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/description.md @@ -0,0 +1,32 @@ + + + +# description property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? description + +_read / write_ + + + + + + +## Implementation + +```dart +String? description; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/endDate.md b/talawa-mobile-docs/models_events_event_model/Event/endDate.md new file mode 100644 index 000000000..71cdad30e --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/endDate.md @@ -0,0 +1,32 @@ + + + +# endDate property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? endDate + +_read / write_ + + + + + + +## Implementation + +```dart +String? endDate; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/endTime.md b/talawa-mobile-docs/models_events_event_model/Event/endTime.md new file mode 100644 index 000000000..b494d8a61 --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/endTime.md @@ -0,0 +1,32 @@ + + + +# endTime property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? endTime + +_read / write_ + + + + + + +## Implementation + +```dart +String? endTime; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/id.md b/talawa-mobile-docs/models_events_event_model/Event/id.md new file mode 100644 index 000000000..833ed271b --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/id.md @@ -0,0 +1,32 @@ + + + +# id property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id + +_read / write_ + + + + + + +## Implementation + +```dart +String? id; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/isPublic.md b/talawa-mobile-docs/models_events_event_model/Event/isPublic.md new file mode 100644 index 000000000..115e149ff --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/isPublic.md @@ -0,0 +1,32 @@ + + + +# isPublic property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? isPublic + +_read / write_ + + + + + + +## Implementation + +```dart +bool? isPublic; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/isRegisterable.md b/talawa-mobile-docs/models_events_event_model/Event/isRegisterable.md new file mode 100644 index 000000000..80a87ac5d --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/isRegisterable.md @@ -0,0 +1,32 @@ + + + +# isRegisterable property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? isRegisterable + +_read / write_ + + + + + + +## Implementation + +```dart +bool? isRegisterable; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/isRegistered.md b/talawa-mobile-docs/models_events_event_model/Event/isRegistered.md new file mode 100644 index 000000000..0b7abce17 --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/isRegistered.md @@ -0,0 +1,32 @@ + + + +# isRegistered property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? isRegistered + +_read / write_ + + + + + + +## Implementation + +```dart +bool? isRegistered; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/latitude.md b/talawa-mobile-docs/models_events_event_model/Event/latitude.md new file mode 100644 index 000000000..0f6aa819f --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/latitude.md @@ -0,0 +1,32 @@ + + + +# latitude property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html)? latitude + +_read / write_ + + + + + + +## Implementation + +```dart +double? latitude; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/location.md b/talawa-mobile-docs/models_events_event_model/Event/location.md new file mode 100644 index 000000000..d2fde2690 --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/location.md @@ -0,0 +1,32 @@ + + + +# location property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? location + +_read / write_ + + + + + + +## Implementation + +```dart +String? location; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/longitude.md b/talawa-mobile-docs/models_events_event_model/Event/longitude.md new file mode 100644 index 000000000..0b3b00660 --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/longitude.md @@ -0,0 +1,32 @@ + + + +# longitude property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html)? longitude + +_read / write_ + + + + + + +## Implementation + +```dart +double? longitude; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/organization.md b/talawa-mobile-docs/models_events_event_model/Event/organization.md new file mode 100644 index 000000000..8138745ec --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/organization.md @@ -0,0 +1,32 @@ + + + +# organization property + + + + + + + +[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)? organization + +_read / write_ + + + + + + +## Implementation + +```dart +OrgInfo? organization; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/recurrence.md b/talawa-mobile-docs/models_events_event_model/Event/recurrence.md new file mode 100644 index 000000000..95763e6de --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/recurrence.md @@ -0,0 +1,32 @@ + + + +# recurrence property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? recurrence + +_read / write_ + + + + + + +## Implementation + +```dart +String? recurrence; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/recurring.md b/talawa-mobile-docs/models_events_event_model/Event/recurring.md new file mode 100644 index 000000000..b9223bf40 --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/recurring.md @@ -0,0 +1,32 @@ + + + +# recurring property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? recurring + +_read / write_ + + + + + + +## Implementation + +```dart +bool? recurring; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/registrants.md b/talawa-mobile-docs/models_events_event_model/Event/registrants.md new file mode 100644 index 000000000..77c0d2342 --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/registrants.md @@ -0,0 +1,32 @@ + + + +# registrants property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../../models_user_user_info/User-class.md)>? registrants + +_read / write_ + + + + + + +## Implementation + +```dart +List? registrants; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/startDate.md b/talawa-mobile-docs/models_events_event_model/Event/startDate.md new file mode 100644 index 000000000..a3a268368 --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/startDate.md @@ -0,0 +1,32 @@ + + + +# startDate property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? startDate + +_read / write_ + + + + + + +## Implementation + +```dart +String? startDate; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/startTime.md b/talawa-mobile-docs/models_events_event_model/Event/startTime.md new file mode 100644 index 000000000..45d78625a --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/startTime.md @@ -0,0 +1,32 @@ + + + +# startTime property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? startTime + +_read / write_ + + + + + + +## Implementation + +```dart +String? startTime; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/Event/title.md b/talawa-mobile-docs/models_events_event_model/Event/title.md new file mode 100644 index 000000000..79dd02590 --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/Event/title.md @@ -0,0 +1,32 @@ + + + +# title property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? title + +_read / write_ + + + + + + +## Implementation + +```dart +String? title; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_events_event_model/models_events_event_model-library.md b/talawa-mobile-docs/models_events_event_model/models_events_event_model-library.md new file mode 100644 index 000000000..2ccf09efa --- /dev/null +++ b/talawa-mobile-docs/models_events_event_model/models_events_event_model-library.md @@ -0,0 +1,38 @@ + + + + +# event_model library + + + + + + + + + + + +## Classes + +##### [Event](../models_events_event_model/Event-class.md) + + + +This class creates an event model and returns an Event instance. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_language_language_model/Language-class.md b/talawa-mobile-docs/models_language_language_model/Language-class.md new file mode 100644 index 000000000..b17705b6b --- /dev/null +++ b/talawa-mobile-docs/models_language_language_model/Language-class.md @@ -0,0 +1,128 @@ + + + +# Language class + + + + + + + + + +

This class creates an langauge model.

+ + + + +## Constructors + +[Language](../models_language_language_model/Language/Language.md) ({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) countryCode, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) langCode, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) langName, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) langSample}) + + + + +## Properties + +##### [countryCode](../models_language_language_model/Language/countryCode.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [langCode](../models_language_language_model/Language/langCode.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [langName](../models_language_language_model/Language/langName.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [langSample](../models_language_language_model/Language/langSample.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_language_language_model/Language/Language.md b/talawa-mobile-docs/models_language_language_model/Language/Language.md new file mode 100644 index 000000000..04c52d10b --- /dev/null +++ b/talawa-mobile-docs/models_language_language_model/Language/Language.md @@ -0,0 +1,34 @@ + + + +# Language constructor + + + + + + + +Language({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) countryCode, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) langCode, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) langName, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) langSample}) + + + + + +## Implementation + +```dart +Language({ + required this.countryCode, + required this.langCode, + required this.langName, + required this.langSample, +}); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_language_language_model/Language/countryCode.md b/talawa-mobile-docs/models_language_language_model/Language/countryCode.md new file mode 100644 index 000000000..c832d751b --- /dev/null +++ b/talawa-mobile-docs/models_language_language_model/Language/countryCode.md @@ -0,0 +1,32 @@ + + + +# countryCode property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) countryCode + +_final_ + + + + + + +## Implementation + +```dart +final String countryCode; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_language_language_model/Language/langCode.md b/talawa-mobile-docs/models_language_language_model/Language/langCode.md new file mode 100644 index 000000000..e6ca157cf --- /dev/null +++ b/talawa-mobile-docs/models_language_language_model/Language/langCode.md @@ -0,0 +1,32 @@ + + + +# langCode property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) langCode + +_final_ + + + + + + +## Implementation + +```dart +final String langCode; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_language_language_model/Language/langName.md b/talawa-mobile-docs/models_language_language_model/Language/langName.md new file mode 100644 index 000000000..95636992c --- /dev/null +++ b/talawa-mobile-docs/models_language_language_model/Language/langName.md @@ -0,0 +1,32 @@ + + + +# langName property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) langName + +_final_ + + + + + + +## Implementation + +```dart +final String langName; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_language_language_model/Language/langSample.md b/talawa-mobile-docs/models_language_language_model/Language/langSample.md new file mode 100644 index 000000000..0dbe17a12 --- /dev/null +++ b/talawa-mobile-docs/models_language_language_model/Language/langSample.md @@ -0,0 +1,32 @@ + + + +# langSample property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) langSample + +_final_ + + + + + + +## Implementation + +```dart +final String langSample; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_language_language_model/models_language_language_model-library.md b/talawa-mobile-docs/models_language_language_model/models_language_language_model-library.md new file mode 100644 index 000000000..72573e5ab --- /dev/null +++ b/talawa-mobile-docs/models_language_language_model/models_language_language_model-library.md @@ -0,0 +1,38 @@ + + + + +# language_model library + + + + + + + + + + + +## Classes + +##### [Language](../models_language_language_model/Language-class.md) + + + +This class creates an langauge model. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs-class.md b/talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs-class.md new file mode 100644 index 000000000..f6a0d3d74 --- /dev/null +++ b/talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs-class.md @@ -0,0 +1,109 @@ + + + +# MainScreenArgs class + + + + + + + + + + + + + +## Constructors + +[MainScreenArgs](../models_mainscreen_navigation_args/MainScreenArgs/MainScreenArgs.md) ({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) fromSignUp = false, required [int](https://api.flutter.dev/flutter/dart-core/int-class.html) mainScreenIndex}) + + + + +## Properties + +##### [fromSignUp](../models_mainscreen_navigation_args/MainScreenArgs/fromSignUp.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [mainScreenIndex](../models_mainscreen_navigation_args/MainScreenArgs/mainScreenIndex.md) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs/MainScreenArgs.md b/talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs/MainScreenArgs.md new file mode 100644 index 000000000..7e83ed6f2 --- /dev/null +++ b/talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs/MainScreenArgs.md @@ -0,0 +1,29 @@ + + + +# MainScreenArgs constructor + + + + + + + +MainScreenArgs({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) fromSignUp = false, required [int](https://api.flutter.dev/flutter/dart-core/int-class.html) mainScreenIndex}) + + + + + +## Implementation + +```dart +MainScreenArgs({this.fromSignUp = false, required this.mainScreenIndex}); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs/fromSignUp.md b/talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs/fromSignUp.md new file mode 100644 index 000000000..65dbae94c --- /dev/null +++ b/talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs/fromSignUp.md @@ -0,0 +1,32 @@ + + + +# fromSignUp property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) fromSignUp + +_final_ + + + + + + +## Implementation + +```dart +final bool fromSignUp; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs/mainScreenIndex.md b/talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs/mainScreenIndex.md new file mode 100644 index 000000000..570058a34 --- /dev/null +++ b/talawa-mobile-docs/models_mainscreen_navigation_args/MainScreenArgs/mainScreenIndex.md @@ -0,0 +1,32 @@ + + + +# mainScreenIndex property + + + + + + + +[int](https://api.flutter.dev/flutter/dart-core/int-class.html) mainScreenIndex + +_final_ + + + + + + +## Implementation + +```dart +final int mainScreenIndex; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_mainscreen_navigation_args/models_mainscreen_navigation_args-library.md b/talawa-mobile-docs/models_mainscreen_navigation_args/models_mainscreen_navigation_args-library.md new file mode 100644 index 000000000..d14163037 --- /dev/null +++ b/talawa-mobile-docs/models_mainscreen_navigation_args/models_mainscreen_navigation_args-library.md @@ -0,0 +1,38 @@ + + + + +# mainscreen_navigation_args library + + + + + + + + + + + +## Classes + +##### [MainScreenArgs](../models_mainscreen_navigation_args/MainScreenArgs-class.md) + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_options_options/Options-class.md b/talawa-mobile-docs/models_options_options/Options-class.md new file mode 100644 index 000000000..f5c9eabca --- /dev/null +++ b/talawa-mobile-docs/models_options_options/Options-class.md @@ -0,0 +1,128 @@ + + + +# Options class + + + + + + + + + +

This class creates a Option model.

+ + + + +## Constructors + +[Options](../models_options_options/Options/Options.md) ({required [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) icon, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) title, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) subtitle, [IconButton](https://api.flutter.dev/flutter/material/IconButton-class.html)? trailingIconButton}) + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [icon](../models_options_options/Options/icon.md) ↔ [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [subtitle](../models_options_options/Options/subtitle.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read / write_ + + + +##### [title](../models_options_options/Options/title.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read / write_ + + + +##### [trailingIconButton](../models_options_options/Options/trailingIconButton.md) ↔ [IconButton](https://api.flutter.dev/flutter/material/IconButton-class.html)? + + + + +_read / write_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_options_options/Options/Options.md b/talawa-mobile-docs/models_options_options/Options/Options.md new file mode 100644 index 000000000..ec36ee551 --- /dev/null +++ b/talawa-mobile-docs/models_options_options/Options/Options.md @@ -0,0 +1,34 @@ + + + +# Options constructor + + + + + + + +Options({required [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) icon, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) title, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) subtitle, [IconButton](https://api.flutter.dev/flutter/material/IconButton-class.html)? trailingIconButton}) + + + + + +## Implementation + +```dart +Options({ + required this.icon, + required this.title, + required this.subtitle, + this.trailingIconButton, +}); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_options_options/Options/icon.md b/talawa-mobile-docs/models_options_options/Options/icon.md new file mode 100644 index 000000000..4e9035472 --- /dev/null +++ b/talawa-mobile-docs/models_options_options/Options/icon.md @@ -0,0 +1,32 @@ + + + +# icon property + + + + + + + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) icon + +_read / write_ + + + + + + +## Implementation + +```dart +Widget icon; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_options_options/Options/subtitle.md b/talawa-mobile-docs/models_options_options/Options/subtitle.md new file mode 100644 index 000000000..49c653f7e --- /dev/null +++ b/talawa-mobile-docs/models_options_options/Options/subtitle.md @@ -0,0 +1,32 @@ + + + +# subtitle property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) subtitle + +_read / write_ + + + + + + +## Implementation + +```dart +String subtitle; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_options_options/Options/title.md b/talawa-mobile-docs/models_options_options/Options/title.md new file mode 100644 index 000000000..7f3fec8c9 --- /dev/null +++ b/talawa-mobile-docs/models_options_options/Options/title.md @@ -0,0 +1,32 @@ + + + +# title property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) title + +_read / write_ + + + + + + +## Implementation + +```dart +String title; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_options_options/Options/trailingIconButton.md b/talawa-mobile-docs/models_options_options/Options/trailingIconButton.md new file mode 100644 index 000000000..d9b9f553f --- /dev/null +++ b/talawa-mobile-docs/models_options_options/Options/trailingIconButton.md @@ -0,0 +1,32 @@ + + + +# trailingIconButton property + + + + + + + +[IconButton](https://api.flutter.dev/flutter/material/IconButton-class.html)? trailingIconButton + +_read / write_ + + + + + + +## Implementation + +```dart +IconButton? trailingIconButton; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_options_options/models_options_options-library.md b/talawa-mobile-docs/models_options_options/models_options_options-library.md new file mode 100644 index 000000000..259ad5747 --- /dev/null +++ b/talawa-mobile-docs/models_options_options/models_options_options-library.md @@ -0,0 +1,38 @@ + + + + +# options library + + + + + + + + + + + +## Classes + +##### [Options](../models_options_options/Options-class.md) + + + +This class creates a Option model. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfo-class.md b/talawa-mobile-docs/models_organization_org_info/OrgInfo-class.md new file mode 100644 index 000000000..2be8742b9 --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfo-class.md @@ -0,0 +1,187 @@ + + + +# OrgInfo class + + + + + + + + + +

This class creates an organization-information model and returns an OrgInfo instance.

+ + + + + + + + + +**Annotations** + +- @[HiveType](https://pub.dev/documentation/hive/2.2.3/hive/HiveType-class.html)(typeId: 2) + + +## Constructors + +[OrgInfo](../models_organization_org_info/OrgInfo/OrgInfo.md) ({[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../models_user_user_info/User-class.md)>? admins, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../models_user_user_info/User-class.md)>? members, [User](../models_user_user_info/User-class.md)? creatorInfo, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? description, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? image, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? isPublic, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name}) + + + +[OrgInfo.fromJson](../models_organization_org_info/OrgInfo/OrgInfo.fromJson.md) ([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json1, {[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) memberRequest = false}) + + _factory_ + + +## Properties + +##### [admins](../models_organization_org_info/OrgInfo/admins.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../models_user_user_info/User-class.md)>? + + + + +_read / write_ + + + +##### [creatorInfo](../models_organization_org_info/OrgInfo/creatorInfo.md) ↔ [User](../models_user_user_info/User-class.md)? + + + + +_read / write_ + + + +##### [description](../models_organization_org_info/OrgInfo/description.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [id](../models_organization_org_info/OrgInfo/id.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [image](../models_organization_org_info/OrgInfo/image.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [isPublic](../models_organization_org_info/OrgInfo/isPublic.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? + + + + +_read / write_ + + + +##### [members](../models_organization_org_info/OrgInfo/members.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../models_user_user_info/User-class.md)>? + + + + +_read / write_ + + + +##### [name](../models_organization_org_info/OrgInfo/name.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [fromJsonToList](../models_organization_org_info/OrgInfo/fromJsonToList.md)([List](https://api.flutter.dev/flutter/dart-core/List-class.html) json) [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfo/OrgInfo.fromJson.md b/talawa-mobile-docs/models_organization_org_info/OrgInfo/OrgInfo.fromJson.md new file mode 100644 index 000000000..45cbc5eae --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfo/OrgInfo.fromJson.md @@ -0,0 +1,67 @@ + + + +# OrgInfo.fromJson constructor + + + + + + + +OrgInfo.fromJson([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json1, {[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) memberRequest = false}) + + + + + +## Implementation + +```dart +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, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfo/OrgInfo.md b/talawa-mobile-docs/models_organization_org_info/OrgInfo/OrgInfo.md new file mode 100644 index 000000000..ec3cdccb2 --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfo/OrgInfo.md @@ -0,0 +1,38 @@ + + + +# OrgInfo constructor + + + + + + + +OrgInfo({[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../../models_user_user_info/User-class.md)>? admins, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../../models_user_user_info/User-class.md)>? members, [User](../../models_user_user_info/User-class.md)? creatorInfo, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? description, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? image, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? isPublic, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name}) + + + + + +## Implementation + +```dart +OrgInfo({ + this.admins, + this.members, + this.creatorInfo, + this.description, + this.id, + this.image, + this.isPublic, + this.name, +}); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfo/admins.md b/talawa-mobile-docs/models_organization_org_info/OrgInfo/admins.md new file mode 100644 index 000000000..ed855ec72 --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfo/admins.md @@ -0,0 +1,36 @@ + + + +# admins property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(3) +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../../models_user_user_info/User-class.md)>? admins + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(3) +List? admins; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfo/creatorInfo.md b/talawa-mobile-docs/models_organization_org_info/OrgInfo/creatorInfo.md new file mode 100644 index 000000000..96f589033 --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfo/creatorInfo.md @@ -0,0 +1,36 @@ + + + +# creatorInfo property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(7) +[User](../../models_user_user_info/User-class.md)? creatorInfo + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(7) +User? creatorInfo; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfo/description.md b/talawa-mobile-docs/models_organization_org_info/OrgInfo/description.md new file mode 100644 index 000000000..0dd524bef --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfo/description.md @@ -0,0 +1,36 @@ + + + +# description property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(5) +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? description + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(5) +String? description; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfo/fromJsonToList.md b/talawa-mobile-docs/models_organization_org_info/OrgInfo/fromJsonToList.md new file mode 100644 index 000000000..f675364e6 --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfo/fromJsonToList.md @@ -0,0 +1,41 @@ + + + +# fromJsonToList method + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> fromJsonToList +([List](https://api.flutter.dev/flutter/dart-core/List-class.html) json) + + + + + + + + +## Implementation + +```dart +List fromJsonToList(List json) { + final List orgList = []; + json.forEach((element) { + final OrgInfo org = OrgInfo.fromJson(element as Map); + orgList.add(org); + }); + return orgList; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfo/id.md b/talawa-mobile-docs/models_organization_org_info/OrgInfo/id.md new file mode 100644 index 000000000..41593eb6c --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfo/id.md @@ -0,0 +1,36 @@ + + + +# id property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(1) +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(1) +String? id; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfo/image.md b/talawa-mobile-docs/models_organization_org_info/OrgInfo/image.md new file mode 100644 index 000000000..307a6d894 --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfo/image.md @@ -0,0 +1,36 @@ + + + +# image property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(0) +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? image + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(0) +String? image; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfo/isPublic.md b/talawa-mobile-docs/models_organization_org_info/OrgInfo/isPublic.md new file mode 100644 index 000000000..2ab544f2a --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfo/isPublic.md @@ -0,0 +1,36 @@ + + + +# isPublic property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(6) +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? isPublic + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(6) +bool? isPublic; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfo/members.md b/talawa-mobile-docs/models_organization_org_info/OrgInfo/members.md new file mode 100644 index 000000000..0613169d6 --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfo/members.md @@ -0,0 +1,36 @@ + + + +# members property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(4) +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../../models_user_user_info/User-class.md)>? members + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(4) +List? members; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfo/name.md b/talawa-mobile-docs/models_organization_org_info/OrgInfo/name.md new file mode 100644 index 000000000..e69ccaed4 --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfo/name.md @@ -0,0 +1,36 @@ + + + +# name property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(2) +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(2) +String? name; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter-class.md b/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter-class.md new file mode 100644 index 000000000..159351022 --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter-class.md @@ -0,0 +1,130 @@ + + + +# OrgInfoAdapter class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [TypeAdapter](https://pub.dev/documentation/hive/2.2.3/hive/TypeAdapter-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> +- OrgInfoAdapter + + + + + + + + +## Constructors + +[OrgInfoAdapter](../models_organization_org_info/OrgInfoAdapter/OrgInfoAdapter.md) () + + + + +## Properties + +##### [hashCode](../models_organization_org_info/OrgInfoAdapter/hashCode.md) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyoverride_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [typeId](../models_organization_org_info/OrgInfoAdapter/typeId.md) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +Called for type registration +_final_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [read](../models_organization_org_info/OrgInfoAdapter/read.md)([BinaryReader](https://pub.dev/documentation/hive/2.2.3/hive/BinaryReader-class.html) reader) [OrgInfo](../models_organization_org_info/OrgInfo-class.md) + + + +Is called when a value has to be decoded. +_override_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [write](../models_organization_org_info/OrgInfoAdapter/write.md)([BinaryWriter](https://pub.dev/documentation/hive/2.2.3/hive/BinaryWriter-class.html) writer, [OrgInfo](../models_organization_org_info/OrgInfo-class.md) obj) void + + + +Is called when a value has to be encoded. +_override_ + + + + + +## Operators + +##### [operator ==](../models_organization_org_info/OrgInfoAdapter/operator_equals.md)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_override_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/OrgInfoAdapter.md b/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/OrgInfoAdapter.md new file mode 100644 index 000000000..82ac945fd --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/OrgInfoAdapter.md @@ -0,0 +1,24 @@ + + + +# OrgInfoAdapter constructor + + + + + + + +OrgInfoAdapter() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/hashCode.md b/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/hashCode.md new file mode 100644 index 000000000..3f59c03a5 --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/hashCode.md @@ -0,0 +1,65 @@ + + + +# hashCode property + + + + + + + + + +**Annotations** + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) +[int](https://api.flutter.dev/flutter/dart-core/int-class.html) hashCode + +_override_ + + + +

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+ + + +## Implementation + +```dart +@override +int get hashCode => typeId.hashCode; +``` + + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/operator_equals.md b/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/operator_equals.md new file mode 100644 index 000000000..5a89901e1 --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/operator_equals.md @@ -0,0 +1,67 @@ + + + +# operator == method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) operator == +([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) + +_override_ + + + +

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+ + + +## Implementation + +```dart +@override +bool operator ==(Object other) => + identical(this, other) || + other is OrgInfoAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/read.md b/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/read.md new file mode 100644 index 000000000..730b1101e --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/read.md @@ -0,0 +1,52 @@ + + + +# read method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[OrgInfo](../../models_organization_org_info/OrgInfo-class.md) read +([BinaryReader](https://pub.dev/documentation/hive/2.2.3/hive/BinaryReader-class.html) reader) + +_override_ + + + +

Is called when a value has to be decoded.

+ + + +## Implementation + +```dart +@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?, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/typeId.md b/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/typeId.md new file mode 100644 index 000000000..185e25a2c --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/typeId.md @@ -0,0 +1,37 @@ + + + +# typeId property + + + + + + + +**Annotations** + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) +[int](https://api.flutter.dev/flutter/dart-core/int-class.html) typeId + +_final_ + + + +

Called for type registration

+ + + +## Implementation + +```dart +@override +final int typeId = 2; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/write.md b/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/write.md new file mode 100644 index 000000000..65e6d9ac0 --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/OrgInfoAdapter/write.md @@ -0,0 +1,56 @@ + + + +# write method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +void write +([BinaryWriter](https://pub.dev/documentation/hive/2.2.3/hive/BinaryWriter-class.html) writer, [OrgInfo](../../models_organization_org_info/OrgInfo-class.md) obj) + +_override_ + + + +

Is called when a value has to be encoded.

+ + + +## Implementation + +```dart +@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); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_organization_org_info/models_organization_org_info-library.md b/talawa-mobile-docs/models_organization_org_info/models_organization_org_info-library.md new file mode 100644 index 000000000..1372e1194 --- /dev/null +++ b/talawa-mobile-docs/models_organization_org_info/models_organization_org_info-library.md @@ -0,0 +1,45 @@ + + + + +# org_info library + + + + + + + + + + + +## Classes + +##### [OrgInfo](../models_organization_org_info/OrgInfo-class.md) + + + +This class creates an organization-information model and returns an OrgInfo instance. + + +##### [OrgInfoAdapter](../models_organization_org_info/OrgInfoAdapter-class.md) + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Comments-class.md b/talawa-mobile-docs/models_post_post_model/Comments-class.md new file mode 100644 index 000000000..d23910940 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Comments-class.md @@ -0,0 +1,114 @@ + + + +# Comments class + + + + + + + + + +

This class convert between json and object for comments.

+ + + + +## Constructors + +[Comments](../models_post_post_model/Comments/Comments.md) ({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? sId}) + + + +[Comments.fromJson](../models_post_post_model/Comments/Comments.fromJson.md) ([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + +Convert json to dart object. + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [sId](../models_post_post_model/Comments/sId.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + +these are dart object. +_read / write_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toJson](../models_post_post_model/Comments/toJson.md)() [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> + + + +Convert dart object to json. + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Comments/Comments.fromJson.md b/talawa-mobile-docs/models_post_post_model/Comments/Comments.fromJson.md new file mode 100644 index 000000000..7edc28297 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Comments/Comments.fromJson.md @@ -0,0 +1,38 @@ + + + +# Comments.fromJson constructor + + + + + + + +Comments.fromJson([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + + +

Convert json to dart object.

+

params: +None +returns:

+
    +
  • Map<String, dynamic>: Dart object is returned.
  • +
+ + + +## Implementation + +```dart +Comments.fromJson(Map json) { + sId = json['_id'] as String?; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Comments/Comments.md b/talawa-mobile-docs/models_post_post_model/Comments/Comments.md new file mode 100644 index 000000000..ea2aab3be --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Comments/Comments.md @@ -0,0 +1,29 @@ + + + +# Comments constructor + + + + + + + +Comments({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? sId}) + + + + + +## Implementation + +```dart +Comments({this.sId}); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Comments/sId.md b/talawa-mobile-docs/models_post_post_model/Comments/sId.md new file mode 100644 index 000000000..398d78335 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Comments/sId.md @@ -0,0 +1,37 @@ + + + +# sId property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? sId + +_read / write_ + + + +

these are dart object.

+

params:

+
    +
  • sId : unique identifier for post
  • +
+ + + +## Implementation + +```dart +String? sId; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Comments/toJson.md b/talawa-mobile-docs/models_post_post_model/Comments/toJson.md new file mode 100644 index 000000000..41171d83c --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Comments/toJson.md @@ -0,0 +1,45 @@ + + + +# toJson method + + + + + + + + +[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> toJson +() + + + + + +

Convert dart object to json.

+

params: + None

+

returns:

+
    +
  • Map<String, dynamic>: json is returned.
  • +
+ + + +## Implementation + +```dart +Map toJson() { + final Map data = {}; + data['_id'] = this.sId; + return data; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/LikedBy-class.md b/talawa-mobile-docs/models_post_post_model/LikedBy-class.md new file mode 100644 index 000000000..414225f56 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/LikedBy-class.md @@ -0,0 +1,114 @@ + + + +# LikedBy class + + + + + + + + + +

This class convert between json and object for likedby.

+ + + + +## Constructors + +[LikedBy](../models_post_post_model/LikedBy/LikedBy.md) ({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? sId}) + + + +[LikedBy.fromJson](../models_post_post_model/LikedBy/LikedBy.fromJson.md) ([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + +JSON factory constructor. + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [sId](../models_post_post_model/LikedBy/sId.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + +These are dart object. +_read / write_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toJson](../models_post_post_model/LikedBy/toJson.md)() [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> + + + +Convert dart object to json. + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/LikedBy/LikedBy.fromJson.md b/talawa-mobile-docs/models_post_post_model/LikedBy/LikedBy.fromJson.md new file mode 100644 index 000000000..16f42a9a4 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/LikedBy/LikedBy.fromJson.md @@ -0,0 +1,32 @@ + + + +# LikedBy.fromJson constructor + + + + + + + +LikedBy.fromJson([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + + +

JSON factory constructor.

+ + + +## Implementation + +```dart +LikedBy.fromJson(Map json) { + sId = json['_id'] as String?; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/LikedBy/LikedBy.md b/talawa-mobile-docs/models_post_post_model/LikedBy/LikedBy.md new file mode 100644 index 000000000..81c5321ef --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/LikedBy/LikedBy.md @@ -0,0 +1,29 @@ + + + +# LikedBy constructor + + + + + + + +LikedBy({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? sId}) + + + + + +## Implementation + +```dart +LikedBy({this.sId}); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/LikedBy/sId.md b/talawa-mobile-docs/models_post_post_model/LikedBy/sId.md new file mode 100644 index 000000000..ecdee0591 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/LikedBy/sId.md @@ -0,0 +1,37 @@ + + + +# sId property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? sId + +_read / write_ + + + +

These are dart object.

+

params:

+
    +
  • sId : unique identifier for post
  • +
+ + + +## Implementation + +```dart +String? sId; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/LikedBy/toJson.md b/talawa-mobile-docs/models_post_post_model/LikedBy/toJson.md new file mode 100644 index 000000000..41171d83c --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/LikedBy/toJson.md @@ -0,0 +1,45 @@ + + + +# toJson method + + + + + + + + +[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> toJson +() + + + + + +

Convert dart object to json.

+

params: + None

+

returns:

+
    +
  • Map<String, dynamic>: json is returned.
  • +
+ + + +## Implementation + +```dart +Map toJson() { + final Map data = {}; + data['_id'] = this.sId; + return data; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Post-class.md b/talawa-mobile-docs/models_post_post_model/Post-class.md new file mode 100644 index 000000000..aed8de17d --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Post-class.md @@ -0,0 +1,186 @@ + + + +# Post class + + + + + + + + + +

This class creates a Post model.

+ + + + +## Constructors + +[Post](../models_post_post_model/Post/Post.md) ({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) sId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? description, [DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html)? createdAt, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? imageUrl, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? videoUrl, required [User](../models_user_user_info/User-class.md)? creator, [OrgInfo](../models_organization_org_info/OrgInfo-class.md)? organization, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[LikedBy](../models_post_post_model/LikedBy-class.md)>? likedBy, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Comments](../models_post_post_model/Comments-class.md)>? comments}) + + + +[Post.fromJson](../models_post_post_model/Post/Post.fromJson.md) ([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + +Creating a new Post instance from a map structure. + + +## Properties + +##### [comments](../models_post_post_model/Post/comments.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Comments](../models_post_post_model/Comments-class.md)>? + + + +comments for post. +_read / write_ + + + +##### [createdAt](../models_post_post_model/Post/createdAt.md) ↔ [DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html)? + + + +createdAt for post. +_read / write_ + + + +##### [creator](../models_post_post_model/Post/creator.md) ↔ [User](../models_user_user_info/User-class.md)? + + + +creator for post. +_read / write_ + + + +##### [description](../models_post_post_model/Post/description.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + +description for post. +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [imageUrl](../models_post_post_model/Post/imageUrl.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + +imageUrl for post. +_read / write_ + + + +##### [likedBy](../models_post_post_model/Post/likedBy.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[LikedBy](../models_post_post_model/LikedBy-class.md)>? + + + +likedBy for post. +_read / write_ + + + +##### [organization](../models_post_post_model/Post/organization.md) ↔ [OrgInfo](../models_organization_org_info/OrgInfo-class.md)? + + + +organization for post. +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [sId](../models_post_post_model/Post/sId.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +unique identifier for post. +_read / write_ + + + +##### [videoUrl](../models_post_post_model/Post/videoUrl.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + +videoUrl for post. +_read / write_ + + + + + +## Methods + +##### [getPostCreatedDuration](../models_post_post_model/Post/getPostCreatedDuration.md)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +this is to get duration of post. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Post/Post.fromJson.md b/talawa-mobile-docs/models_post_post_model/Post/Post.fromJson.md new file mode 100644 index 000000000..7dba822b4 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Post/Post.fromJson.md @@ -0,0 +1,65 @@ + + + +# Post.fromJson constructor + + + + + + + +Post.fromJson([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + + +

Creating a new Post instance from a map structure.

+

params: +None +returns:

+
    +
  • PostObject: Dart Object for posts
  • +
+ + + +## Implementation + +```dart +/// +/// params: +/// None +/// returns: +/// * `PostObject`: Dart Object for posts +Post.fromJson(Map json) { + sId = json['_id'] as String; + description = json['text'] as String?; + createdAt = DateTime.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)); + }); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Post/Post.md b/talawa-mobile-docs/models_post_post_model/Post/Post.md new file mode 100644 index 000000000..829c0b018 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Post/Post.md @@ -0,0 +1,39 @@ + + + +# Post constructor + + + + + + + +Post({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) sId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? description, [DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html)? createdAt, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? imageUrl, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? videoUrl, required [User](../../models_user_user_info/User-class.md)? creator, [OrgInfo](../../models_organization_org_info/OrgInfo-class.md)? organization, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[LikedBy](../../models_post_post_model/LikedBy-class.md)>? likedBy, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Comments](../../models_post_post_model/Comments-class.md)>? comments}) + + + + + +## Implementation + +```dart +Post({ + required this.sId, + this.description, + this.createdAt, + this.imageUrl, + this.videoUrl, + required this.creator, + this.organization, + this.likedBy, + this.comments, +}); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Post/comments.md b/talawa-mobile-docs/models_post_post_model/Post/comments.md new file mode 100644 index 000000000..ecf348966 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Post/comments.md @@ -0,0 +1,33 @@ + + + +# comments property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Comments](../../models_post_post_model/Comments-class.md)>? comments + +_read / write_ + + + +

comments for post.

+ + + +## Implementation + +```dart +List? comments; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Post/createdAt.md b/talawa-mobile-docs/models_post_post_model/Post/createdAt.md new file mode 100644 index 000000000..6238dfa3c --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Post/createdAt.md @@ -0,0 +1,33 @@ + + + +# createdAt property + + + + + + + +[DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html)? createdAt + +_read / write_ + + + +

createdAt for post.

+ + + +## Implementation + +```dart +DateTime? createdAt; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Post/creator.md b/talawa-mobile-docs/models_post_post_model/Post/creator.md new file mode 100644 index 000000000..a7a0a80a4 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Post/creator.md @@ -0,0 +1,33 @@ + + + +# creator property + + + + + + + +[User](../../models_user_user_info/User-class.md)? creator + +_read / write_ + + + +

creator for post.

+ + + +## Implementation + +```dart +User? creator; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Post/description.md b/talawa-mobile-docs/models_post_post_model/Post/description.md new file mode 100644 index 000000000..a34d1f7ab --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Post/description.md @@ -0,0 +1,33 @@ + + + +# description property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? description + +_read / write_ + + + +

description for post.

+ + + +## Implementation + +```dart +String? description; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Post/getPostCreatedDuration.md b/talawa-mobile-docs/models_post_post_model/Post/getPostCreatedDuration.md new file mode 100644 index 000000000..561e42567 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Post/getPostCreatedDuration.md @@ -0,0 +1,55 @@ + + + +# getPostCreatedDuration method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) getPostCreatedDuration +() + + + + + +

this is to get duration of post.

+

params: + None

+

returns:

+
    +
  • String: date is returned in ago form.
  • +
+ + + +## Implementation + +```dart +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'; + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Post/imageUrl.md b/talawa-mobile-docs/models_post_post_model/Post/imageUrl.md new file mode 100644 index 000000000..ccbaf0864 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Post/imageUrl.md @@ -0,0 +1,33 @@ + + + +# imageUrl property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? imageUrl + +_read / write_ + + + +

imageUrl for post.

+ + + +## Implementation + +```dart +String? imageUrl; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Post/likedBy.md b/talawa-mobile-docs/models_post_post_model/Post/likedBy.md new file mode 100644 index 000000000..3568e7dd8 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Post/likedBy.md @@ -0,0 +1,33 @@ + + + +# likedBy property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[LikedBy](../../models_post_post_model/LikedBy-class.md)>? likedBy + +_read / write_ + + + +

likedBy for post.

+ + + +## Implementation + +```dart +List? likedBy; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Post/organization.md b/talawa-mobile-docs/models_post_post_model/Post/organization.md new file mode 100644 index 000000000..87e5b3d75 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Post/organization.md @@ -0,0 +1,33 @@ + + + +# organization property + + + + + + + +[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)? organization + +_read / write_ + + + +

organization for post.

+ + + +## Implementation + +```dart +OrgInfo? organization; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Post/sId.md b/talawa-mobile-docs/models_post_post_model/Post/sId.md new file mode 100644 index 000000000..1a82d26e6 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Post/sId.md @@ -0,0 +1,33 @@ + + + +# sId property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) sId + +_read / write_ + + + +

unique identifier for post.

+ + + +## Implementation + +```dart +late String sId; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/Post/videoUrl.md b/talawa-mobile-docs/models_post_post_model/Post/videoUrl.md new file mode 100644 index 000000000..12fb954e3 --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/Post/videoUrl.md @@ -0,0 +1,33 @@ + + + +# videoUrl property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? videoUrl + +_read / write_ + + + +

videoUrl for post.

+ + + +## Implementation + +```dart +String? videoUrl; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_post_post_model/models_post_post_model-library.md b/talawa-mobile-docs/models_post_post_model/models_post_post_model-library.md new file mode 100644 index 000000000..6aa60a57a --- /dev/null +++ b/talawa-mobile-docs/models_post_post_model/models_post_post_model-library.md @@ -0,0 +1,52 @@ + + + + +# post_model library + + + + + + + + + + + +## Classes + +##### [Comments](../models_post_post_model/Comments-class.md) + + + +This class convert between json and object for comments. + + +##### [LikedBy](../models_post_post_model/LikedBy-class.md) + + + +This class convert between json and object for likedby. + + +##### [Post](../models_post_post_model/Post-class.md) + + + +This class creates a Post model. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_task_task_model/Task-class.md b/talawa-mobile-docs/models_task_task_model/Task-class.md new file mode 100644 index 000000000..622477968 --- /dev/null +++ b/talawa-mobile-docs/models_task_task_model/Task-class.md @@ -0,0 +1,158 @@ + + + +# Task class + + + + + + + + + + + + + +## Constructors + +[Task](../models_task_task_model/Task/Task.md) ({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) id, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) title, required [User](../models_user_user_info/User-class.md) creator, required [Event](../models_events_event_model/Event-class.md) event, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) createdAt, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? description, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? deadline}) + + _const_ + +[Task.fromJson](../models_task_task_model/Task/Task.fromJson.md) ([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + +/Creating a new Task instance from a map structure. _factory_ + + +## Properties + +##### [createdAt](../models_task_task_model/Task/createdAt.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [creator](../models_task_task_model/Task/creator.md) → [User](../models_user_user_info/User-class.md) + + + + +_final_ + + + +##### [deadline](../models_task_task_model/Task/deadline.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_final_ + + + +##### [description](../models_task_task_model/Task/description.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_final_ + + + +##### [event](../models_task_task_model/Task/event.md) → [Event](../models_events_event_model/Event-class.md) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [id](../models_task_task_model/Task/id.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [title](../models_task_task_model/Task/title.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_task_task_model/Task/Task.fromJson.md b/talawa-mobile-docs/models_task_task_model/Task/Task.fromJson.md new file mode 100644 index 000000000..f1c2c1fb0 --- /dev/null +++ b/talawa-mobile-docs/models_task_task_model/Task/Task.fromJson.md @@ -0,0 +1,47 @@ + + + +# Task.fromJson constructor + + + + + + + +Task.fromJson([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json) + + +

/Creating a new Task instance from a map structure.

+ + + +## Implementation + +```dart +factory Task.fromJson( + Map json, +) { + return Task( + id: json['_id'] as String, + title: json['title'] as String, + creator: User.fromJson( + json['creator'] as Map, + fromOrg: true, + ), + event: Event.fromJson( + json['event'] as Map, + ), + createdAt: json['createdAt'] as String, + description: json['description'] as String?, + deadline: json['deadline'] as String?, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_task_task_model/Task/Task.md b/talawa-mobile-docs/models_task_task_model/Task/Task.md new file mode 100644 index 000000000..ee67ef19e --- /dev/null +++ b/talawa-mobile-docs/models_task_task_model/Task/Task.md @@ -0,0 +1,37 @@ + + + +# Task constructor + + + + + + +const +Task({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) id, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) title, required [User](../../models_user_user_info/User-class.md) creator, required [Event](../../models_events_event_model/Event-class.md) event, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) createdAt, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? description, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? deadline}) + + + + + +## Implementation + +```dart +const Task({ + required this.id, + required this.title, + required this.creator, + required this.event, + required this.createdAt, + this.description, + this.deadline, +}); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_task_task_model/Task/createdAt.md b/talawa-mobile-docs/models_task_task_model/Task/createdAt.md new file mode 100644 index 000000000..84314f52c --- /dev/null +++ b/talawa-mobile-docs/models_task_task_model/Task/createdAt.md @@ -0,0 +1,32 @@ + + + +# createdAt property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) createdAt + +_final_ + + + + + + +## Implementation + +```dart +final String createdAt; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_task_task_model/Task/creator.md b/talawa-mobile-docs/models_task_task_model/Task/creator.md new file mode 100644 index 000000000..b5c8e0836 --- /dev/null +++ b/talawa-mobile-docs/models_task_task_model/Task/creator.md @@ -0,0 +1,32 @@ + + + +# creator property + + + + + + + +[User](../../models_user_user_info/User-class.md) creator + +_final_ + + + + + + +## Implementation + +```dart +final User creator; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_task_task_model/Task/deadline.md b/talawa-mobile-docs/models_task_task_model/Task/deadline.md new file mode 100644 index 000000000..21dd7e7e7 --- /dev/null +++ b/talawa-mobile-docs/models_task_task_model/Task/deadline.md @@ -0,0 +1,32 @@ + + + +# deadline property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? deadline + +_final_ + + + + + + +## Implementation + +```dart +final String? deadline; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_task_task_model/Task/description.md b/talawa-mobile-docs/models_task_task_model/Task/description.md new file mode 100644 index 000000000..ae3e97fef --- /dev/null +++ b/talawa-mobile-docs/models_task_task_model/Task/description.md @@ -0,0 +1,32 @@ + + + +# description property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? description + +_final_ + + + + + + +## Implementation + +```dart +final String? description; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_task_task_model/Task/event.md b/talawa-mobile-docs/models_task_task_model/Task/event.md new file mode 100644 index 000000000..9714bc41a --- /dev/null +++ b/talawa-mobile-docs/models_task_task_model/Task/event.md @@ -0,0 +1,32 @@ + + + +# event property + + + + + + + +[Event](../../models_events_event_model/Event-class.md) event + +_final_ + + + + + + +## Implementation + +```dart +final Event event; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_task_task_model/Task/id.md b/talawa-mobile-docs/models_task_task_model/Task/id.md new file mode 100644 index 000000000..672a052c2 --- /dev/null +++ b/talawa-mobile-docs/models_task_task_model/Task/id.md @@ -0,0 +1,32 @@ + + + +# id property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) id + +_final_ + + + + + + +## Implementation + +```dart +final String id; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_task_task_model/Task/title.md b/talawa-mobile-docs/models_task_task_model/Task/title.md new file mode 100644 index 000000000..7c14a3864 --- /dev/null +++ b/talawa-mobile-docs/models_task_task_model/Task/title.md @@ -0,0 +1,32 @@ + + + +# title property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) title + +_final_ + + + + + + +## Implementation + +```dart +final String title; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_task_task_model/models_task_task_model-library.md b/talawa-mobile-docs/models_task_task_model/models_task_task_model-library.md new file mode 100644 index 000000000..3aed89965 --- /dev/null +++ b/talawa-mobile-docs/models_task_task_model/models_task_task_model-library.md @@ -0,0 +1,38 @@ + + + + +# task_model library + + + + + + + + + + + +## Classes + +##### [Task](../models_task_task_model/Task-class.md) + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User-class.md b/talawa-mobile-docs/models_user_user_info/User-class.md new file mode 100644 index 000000000..2f8832131 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User-class.md @@ -0,0 +1,311 @@ + + + +# User class + + + + + + + + + +

This class creates a User model and returns a user instance.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [HiveObject](https://pub.dev/documentation/hive/2.2.3/hive/HiveObject-class.html) +- User + + + + + + +**Annotations** + +- @[HiveType](https://pub.dev/documentation/hive/2.2.3/hive/HiveType-class.html)(typeId: 1) + + +## Constructors + +[User](../models_user_user_info/User/User.md) ({[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)>? adminFor, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)>? createdOrganizations, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? email, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? firstName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? image, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)>? joinedOrganizations, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? lastName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? authToken, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? refreshToken, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)>? membershipRequests}) + + + +[User.fromJson](../models_user_user_info/User/User.fromJson.md) ([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json1, {[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) fromOrg = false}) + + _factory_ + + +## Properties + +##### [adminFor](../models_user_user_info/User/adminFor.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)>? + + + + +_read / write_ + + + +##### [authToken](../models_user_user_info/User/authToken.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [box](https://pub.dev/documentation/hive/2.2.3/hive/HiveObjectMixin/box.html) → [BoxBase](https://pub.dev/documentation/hive/2.2.3/hive/BoxBase-class.html)? + + + +Get the box in which this object is stored. Returns null if object has +not been added to a box yet. +_read-onlyinherited_ + + + +##### [createdOrganizations](../models_user_user_info/User/createdOrganizations.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)>? + + + + +_read / write_ + + + +##### [email](../models_user_user_info/User/email.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [firstName](../models_user_user_info/User/firstName.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [id](../models_user_user_info/User/id.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [image](../models_user_user_info/User/image.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [isInBox](https://pub.dev/documentation/hive/2.2.3/hive/HiveObjectMixin/isInBox.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Returns whether this object is currently stored in a box. +_read-onlyinherited_ + + + +##### [joinedOrganizations](../models_user_user_info/User/joinedOrganizations.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)>? + + + + +_read / write_ + + + +##### [key](https://pub.dev/documentation/hive/2.2.3/hive/HiveObjectMixin/key.html) → dynamic + + + +Get the key associated with this object. Returns null if object has +not been added to a box yet. +_read-onlyinherited_ + + + +##### [lastName](../models_user_user_info/User/lastName.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [membershipRequests](../models_user_user_info/User/membershipRequests.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)>? + + + + +_read / write_ + + + +##### [refreshToken](../models_user_user_info/User/refreshToken.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [delete](https://pub.dev/documentation/hive/2.2.3/hive/HiveObjectMixin/delete.html)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +Deletes this object from the box it is stored in. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [print](../models_user_user_info/User/print.md)() void + + + + + + + + +##### [save](https://pub.dev/documentation/hive/2.2.3/hive/HiveObjectMixin/save.html)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +Persists this object. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [update](../models_user_user_info/User/update.md)([User](../models_user_user_info/User-class.md) details) void + + + + + + + + +##### [updateAdminFor](../models_user_user_info/User/updateAdminFor.md)([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> orgList) void + + + + + + + + +##### [updateCreatedOrg](../models_user_user_info/User/updateCreatedOrg.md)([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> orgList) void + + + + + + + + +##### [updateJoinedOrg](../models_user_user_info/User/updateJoinedOrg.md)([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> orgList) void + + + + + + + + +##### [updateMemberRequestOrg](../models_user_user_info/User/updateMemberRequestOrg.md)([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> orgList) void + + + + + + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/User.fromJson.md b/talawa-mobile-docs/models_user_user_info/User/User.fromJson.md new file mode 100644 index 000000000..c568f69e4 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/User.fromJson.md @@ -0,0 +1,71 @@ + + + +# User.fromJson constructor + + + + + + + +User.fromJson([Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> json1, {[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) fromOrg = false}) + + + + + +## Implementation + +```dart +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, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/User.md b/talawa-mobile-docs/models_user_user_info/User/User.md new file mode 100644 index 000000000..2e34c1ed0 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/User.md @@ -0,0 +1,41 @@ + + + +# User constructor + + + + + + + +User({[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)>? adminFor, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)>? createdOrganizations, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? email, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? firstName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? image, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)>? joinedOrganizations, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? lastName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? authToken, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? refreshToken, [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)>? membershipRequests}) + + + + + +## Implementation + +```dart +User({ + this.adminFor, + this.createdOrganizations, + this.email, + this.firstName, + this.id, + this.image, + this.joinedOrganizations, + this.lastName, + this.authToken, + this.refreshToken, + this.membershipRequests, +}); +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/adminFor.md b/talawa-mobile-docs/models_user_user_info/User/adminFor.md new file mode 100644 index 000000000..f32ef5aca --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/adminFor.md @@ -0,0 +1,36 @@ + + + +# adminFor property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(9) +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)>? adminFor + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(9) +List? adminFor = []; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/authToken.md b/talawa-mobile-docs/models_user_user_info/User/authToken.md new file mode 100644 index 000000000..f378cbba3 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/authToken.md @@ -0,0 +1,36 @@ + + + +# authToken property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(0) +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? authToken + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(0) +String? authToken; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/createdOrganizations.md b/talawa-mobile-docs/models_user_user_info/User/createdOrganizations.md new file mode 100644 index 000000000..791251b39 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/createdOrganizations.md @@ -0,0 +1,36 @@ + + + +# createdOrganizations property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(8) +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)>? createdOrganizations + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(8) +List? createdOrganizations = []; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/email.md b/talawa-mobile-docs/models_user_user_info/User/email.md new file mode 100644 index 000000000..34b599f1b --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/email.md @@ -0,0 +1,36 @@ + + + +# email property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(5) +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? email + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(5) +String? email; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/firstName.md b/talawa-mobile-docs/models_user_user_info/User/firstName.md new file mode 100644 index 000000000..b782ee7af --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/firstName.md @@ -0,0 +1,36 @@ + + + +# firstName property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(3) +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? firstName + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(3) +String? firstName; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/id.md b/talawa-mobile-docs/models_user_user_info/User/id.md new file mode 100644 index 000000000..1f2e418e5 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/id.md @@ -0,0 +1,36 @@ + + + +# id property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(2) +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? id + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(2) +String? id; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/image.md b/talawa-mobile-docs/models_user_user_info/User/image.md new file mode 100644 index 000000000..ff44e85e0 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/image.md @@ -0,0 +1,36 @@ + + + +# image property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(6) +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? image + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(6) +String? image; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/joinedOrganizations.md b/talawa-mobile-docs/models_user_user_info/User/joinedOrganizations.md new file mode 100644 index 000000000..364ee575b --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/joinedOrganizations.md @@ -0,0 +1,36 @@ + + + +# joinedOrganizations property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(7) +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)>? joinedOrganizations + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(7) +List? joinedOrganizations = []; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/lastName.md b/talawa-mobile-docs/models_user_user_info/User/lastName.md new file mode 100644 index 000000000..b02f4c180 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/lastName.md @@ -0,0 +1,36 @@ + + + +# lastName property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(4) +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? lastName + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(4) +String? lastName; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/membershipRequests.md b/talawa-mobile-docs/models_user_user_info/User/membershipRequests.md new file mode 100644 index 000000000..483f6a9df --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/membershipRequests.md @@ -0,0 +1,36 @@ + + + +# membershipRequests property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(10) +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)>? membershipRequests + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(10) +List? membershipRequests = []; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/print.md b/talawa-mobile-docs/models_user_user_info/User/print.md new file mode 100644 index 000000000..9887d704a --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/print.md @@ -0,0 +1,46 @@ + + + +# print method + + + + + + + + +void print +() + + + + + + + + +## Implementation + +```dart +void 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}'); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/refreshToken.md b/talawa-mobile-docs/models_user_user_info/User/refreshToken.md new file mode 100644 index 000000000..87c25db04 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/refreshToken.md @@ -0,0 +1,36 @@ + + + +# refreshToken property + + + + + + + +**Annotations** + +- @[HiveField](https://pub.dev/documentation/hive/2.2.3/hive/HiveField-class.html)(1) +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? refreshToken + +_read / write_ + + + + + + +## Implementation + +```dart +@HiveField(1) +String? refreshToken; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/update.md b/talawa-mobile-docs/models_user_user_info/User/update.md new file mode 100644 index 000000000..a11d0f023 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/update.md @@ -0,0 +1,45 @@ + + + +# update method + + + + + + + + +void update +([User](../../models_user_user_info/User-class.md) details) + + + + + + + + +## Implementation + +```dart +void update(User details) { + this.firstName = details.firstName; + this.lastName = details.lastName; + this.email = details.email; + this.image = details.image; + 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/talawa-mobile-docs/models_user_user_info/User/updateAdminFor.md b/talawa-mobile-docs/models_user_user_info/User/updateAdminFor.md new file mode 100644 index 000000000..0d104cd52 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/updateAdminFor.md @@ -0,0 +1,36 @@ + + + +# updateAdminFor method + + + + + + + + +void updateAdminFor +([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> orgList) + + + + + + + + +## Implementation + +```dart +void updateAdminFor(List orgList) { + this.adminFor = orgList; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/updateCreatedOrg.md b/talawa-mobile-docs/models_user_user_info/User/updateCreatedOrg.md new file mode 100644 index 000000000..384f2a363 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/updateCreatedOrg.md @@ -0,0 +1,36 @@ + + + +# updateCreatedOrg method + + + + + + + + +void updateCreatedOrg +([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> orgList) + + + + + + + + +## Implementation + +```dart +void updateCreatedOrg(List orgList) { + this.createdOrganizations = orgList; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/updateJoinedOrg.md b/talawa-mobile-docs/models_user_user_info/User/updateJoinedOrg.md new file mode 100644 index 000000000..ce7eb1d64 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/updateJoinedOrg.md @@ -0,0 +1,36 @@ + + + +# updateJoinedOrg method + + + + + + + + +void updateJoinedOrg +([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> orgList) + + + + + + + + +## Implementation + +```dart +void updateJoinedOrg(List orgList) { + this.joinedOrganizations = orgList; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/User/updateMemberRequestOrg.md b/talawa-mobile-docs/models_user_user_info/User/updateMemberRequestOrg.md new file mode 100644 index 000000000..a64ede2dc --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/User/updateMemberRequestOrg.md @@ -0,0 +1,36 @@ + + + +# updateMemberRequestOrg method + + + + + + + + +void updateMemberRequestOrg +([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> orgList) + + + + + + + + +## Implementation + +```dart +void updateMemberRequestOrg(List orgList) { + this.membershipRequests = [...membershipRequests!, ...orgList]; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/UserAdapter-class.md b/talawa-mobile-docs/models_user_user_info/UserAdapter-class.md new file mode 100644 index 000000000..128bc0ea4 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/UserAdapter-class.md @@ -0,0 +1,130 @@ + + + +# UserAdapter class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [TypeAdapter](https://pub.dev/documentation/hive/2.2.3/hive/TypeAdapter-class.html)<[User](../models_user_user_info/User-class.md)> +- UserAdapter + + + + + + + + +## Constructors + +[UserAdapter](../models_user_user_info/UserAdapter/UserAdapter.md) () + + + + +## Properties + +##### [hashCode](../models_user_user_info/UserAdapter/hashCode.md) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyoverride_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [typeId](../models_user_user_info/UserAdapter/typeId.md) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +Called for type registration +_final_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [read](../models_user_user_info/UserAdapter/read.md)([BinaryReader](https://pub.dev/documentation/hive/2.2.3/hive/BinaryReader-class.html) reader) [User](../models_user_user_info/User-class.md) + + + +Is called when a value has to be decoded. +_override_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [write](../models_user_user_info/UserAdapter/write.md)([BinaryWriter](https://pub.dev/documentation/hive/2.2.3/hive/BinaryWriter-class.html) writer, [User](../models_user_user_info/User-class.md) obj) void + + + +Is called when a value has to be encoded. +_override_ + + + + + +## Operators + +##### [operator ==](../models_user_user_info/UserAdapter/operator_equals.md)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_override_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/UserAdapter/UserAdapter.md b/talawa-mobile-docs/models_user_user_info/UserAdapter/UserAdapter.md new file mode 100644 index 000000000..cd7b0178d --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/UserAdapter/UserAdapter.md @@ -0,0 +1,24 @@ + + + +# UserAdapter constructor + + + + + + + +UserAdapter() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/UserAdapter/hashCode.md b/talawa-mobile-docs/models_user_user_info/UserAdapter/hashCode.md new file mode 100644 index 000000000..8cc047694 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/UserAdapter/hashCode.md @@ -0,0 +1,65 @@ + + + +# hashCode property + + + + + + + + + +**Annotations** + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) +[int](https://api.flutter.dev/flutter/dart-core/int-class.html) hashCode + +_override_ + + + +

The hash code for this object.

+

A hash code is a single integer which represents the state of the object +that affects operator == comparisons.

+

All objects have hash codes. +The default hash code implemented by Object +represents only the identity of the object, +the same way as the default operator == implementation only considers objects +equal if they are identical (see identityHashCode).

+

If operator == is overridden to use the object state instead, +the hash code must also be changed to represent that state, +otherwise the object cannot be used in hash based data structures +like the default Set and Map implementations.

+

Hash codes must be the same for objects that are equal to each other +according to operator ==. +The hash code of an object should only change if the object changes +in a way that affects equality. +There are no further requirements for the hash codes. +They need not be consistent between executions of the same program +and there are no distribution guarantees.

+

Objects that are not equal are allowed to have the same hash code. +It is even technically allowed that all instances have the same hash code, +but if clashes happen too often, +it may reduce the efficiency of hash-based data structures +like HashSet or HashMap.

+

If a subclass overrides hashCode, it should override the +operator == operator as well to maintain consistency.

+ + + +## Implementation + +```dart +@override +int get hashCode => typeId.hashCode; +``` + + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/UserAdapter/operator_equals.md b/talawa-mobile-docs/models_user_user_info/UserAdapter/operator_equals.md new file mode 100644 index 000000000..2138164e9 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/UserAdapter/operator_equals.md @@ -0,0 +1,67 @@ + + + +# operator == method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) operator == +([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) + +_override_ + + + +

The equality operator.

+

The default behavior for all Objects is to return true if and +only if this object and other are the same object.

+

Override this method to specify a different equality relation on +a class. The overriding method must still be an equivalence relation. +That is, it must be:

+
    +
  • +

    Total: It must return a boolean for all arguments. It should never throw.

    +
  • +
  • +

    Reflexive: For all objects o, o == o must be true.

    +
  • +
  • +

    Symmetric: For all objects o1 and o2, o1 == o2 and o2 == o1 must +either both be true, or both be false.

    +
  • +
  • +

    Transitive: For all objects o1, o2, and o3, if o1 == o2 and +o2 == o3 are true, then o1 == o3 must be true.

    +
  • +
+

The method should also be consistent over time, +so whether two objects are equal should only change +if at least one of the objects was modified.

+

If a subclass overrides the equality operator, it should override +the hashCode method as well to maintain consistency.

+ + + +## Implementation + +```dart +@override +bool operator ==(Object other) => + identical(this, other) || + other is UserAdapter && + runtimeType == other.runtimeType && + typeId == other.typeId; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/UserAdapter/read.md b/talawa-mobile-docs/models_user_user_info/UserAdapter/read.md new file mode 100644 index 000000000..8431b02dd --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/UserAdapter/read.md @@ -0,0 +1,55 @@ + + + +# read method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[User](../../models_user_user_info/User-class.md) read +([BinaryReader](https://pub.dev/documentation/hive/2.2.3/hive/BinaryReader-class.html) reader) + +_override_ + + + +

Is called when a value has to be decoded.

+ + + +## Implementation + +```dart +@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(), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/UserAdapter/typeId.md b/talawa-mobile-docs/models_user_user_info/UserAdapter/typeId.md new file mode 100644 index 000000000..2fc04cff0 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/UserAdapter/typeId.md @@ -0,0 +1,37 @@ + + + +# typeId property + + + + + + + +**Annotations** + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) +[int](https://api.flutter.dev/flutter/dart-core/int-class.html) typeId + +_final_ + + + +

Called for type registration

+ + + +## Implementation + +```dart +@override +final int typeId = 1; +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/UserAdapter/write.md b/talawa-mobile-docs/models_user_user_info/UserAdapter/write.md new file mode 100644 index 000000000..5d2fbb7a7 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/UserAdapter/write.md @@ -0,0 +1,62 @@ + + + +# write method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +void write +([BinaryWriter](https://pub.dev/documentation/hive/2.2.3/hive/BinaryWriter-class.html) writer, [User](../../models_user_user_info/User-class.md) obj) + +_override_ + + + +

Is called when a value has to be encoded.

+ + + +## Implementation + +```dart +@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); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/models_user_user_info/models_user_user_info-library.md b/talawa-mobile-docs/models_user_user_info/models_user_user_info-library.md new file mode 100644 index 000000000..2f7570090 --- /dev/null +++ b/talawa-mobile-docs/models_user_user_info/models_user_user_info-library.md @@ -0,0 +1,45 @@ + + + + +# user_info library + + + + + + + + + + + +## Classes + +##### [User](../models_user_user_info/User-class.md) + + + +This class creates a User model and returns a user instance. + + +##### [UserAdapter](../models_user_user_info/UserAdapter-class.md) + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList-class.md b/talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList-class.md new file mode 100644 index 000000000..84893bd0b --- /dev/null +++ b/talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList-class.md @@ -0,0 +1,110 @@ + + + +# FetchPluginList class + + + + + + + + + +

This class fetch plugins list.

+ + + + +## Constructors + +[FetchPluginList](../plugins_fetch_plugin_list/FetchPluginList/FetchPluginList.md) () + +Constructor of the class. + + +## Properties + +##### [box](../plugins_fetch_plugin_list/FetchPluginList/box.md) ↔ [Box](https://pub.dev/documentation/hive/2.2.3/hive/Box-class.html) + + + +late initialize the box. +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [fetchList](../plugins_fetch_plugin_list/FetchPluginList/fetchList.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +Fetches plugins from server and stores them in Hive pluginBox. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList/FetchPluginList.md b/talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList/FetchPluginList.md new file mode 100644 index 000000000..55304e7c1 --- /dev/null +++ b/talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList/FetchPluginList.md @@ -0,0 +1,32 @@ + + + +# FetchPluginList constructor + + + + + + + +FetchPluginList() + + +

Constructor of the class.

+ + + +## Implementation + +```dart +FetchPluginList() { + fetchList(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList/box.md b/talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList/box.md new file mode 100644 index 000000000..a40276966 --- /dev/null +++ b/talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList/box.md @@ -0,0 +1,33 @@ + + + +# box property + + + + + + + +[Box](https://pub.dev/documentation/hive/2.2.3/hive/Box-class.html) box + +_read / write_ + + + +

late initialize the box.

+ + + +## Implementation + +```dart +late Box box; +``` + + + + + + + diff --git a/talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList/fetchList.md b/talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList/fetchList.md new file mode 100644 index 000000000..4a819919a --- /dev/null +++ b/talawa-mobile-docs/plugins_fetch_plugin_list/FetchPluginList/fetchList.md @@ -0,0 +1,50 @@ + + + +# fetchList method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> fetchList +() + + + + + +

Fetches plugins from server and stores them in Hive pluginBox.

+

params: + None

+

returns:

+
    +
  • Future<void>: it returns Future of void
  • +
+ + + +## Implementation + +```dart +Future fetchList() async { + late final GraphQLClient client = graphqlConfig.clientToQuery(); + final QueryResult result = await client.query( + QueryOptions( + document: gql(queries.getPluginsList()), + ), + ); + box = Hive.box('pluginBox'); + box.put('plugins', result.data!["getPlugins"]); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/plugins_fetch_plugin_list/plugins_fetch_plugin_list-library.md b/talawa-mobile-docs/plugins_fetch_plugin_list/plugins_fetch_plugin_list-library.md new file mode 100644 index 000000000..a2d80f3b5 --- /dev/null +++ b/talawa-mobile-docs/plugins_fetch_plugin_list/plugins_fetch_plugin_list-library.md @@ -0,0 +1,38 @@ + + + + +# fetch_plugin_list library + + + + + + + + + + + +## Classes + +##### [FetchPluginList](../plugins_fetch_plugin_list/FetchPluginList-class.md) + + + +This class fetch plugins list. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider-class.md b/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider-class.md new file mode 100644 index 000000000..85a8d898a --- /dev/null +++ b/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider-class.md @@ -0,0 +1,225 @@ + + + +# TalawaPluginProvider class + + + + + + + + + +

TalwaPluginProvider provides ability to implement features as plugins

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- TalawaPluginProvider + + + + + + + + +## Constructors + +[TalawaPluginProvider](../plugins_talawa_plugin_provider/TalawaPluginProvider/TalawaPluginProvider.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, @[required](https://pub.dev/documentation/meta/1.8.0/meta/required-constant.html) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html)? child, required [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) visible, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) pluginName}) + + _const_ + + +## Properties + +##### [child](../plugins_talawa_plugin_provider/TalawaPluginProvider/child.md) → [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html)? + + + +child contains the widget for the plugin UI. +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [pluginName](../plugins_talawa_plugin_provider/TalawaPluginProvider/pluginName.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +name of plugin preferred with underscores(_) instead of spaces +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [visible](../plugins_talawa_plugin_provider/TalawaPluginProvider/visible.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +visible is the property that decides visibility of the UI. +_final_ + + + + + +## Methods + +##### [build](../plugins_talawa_plugin_provider/TalawaPluginProvider/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +build the Plugin combining local visibility property and serverVisible property +_override_ + + + +##### [checkFromPluginList](../plugins_talawa_plugin_provider/TalawaPluginProvider/checkFromPluginList.md)() [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +return bool decides the final visibility of the verifying from database and current OrgId + + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/TalawaPluginProvider.md b/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/TalawaPluginProvider.md new file mode 100644 index 000000000..fc8bbf280 --- /dev/null +++ b/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/TalawaPluginProvider.md @@ -0,0 +1,34 @@ + + + +# TalawaPluginProvider constructor + + + + + + +const +TalawaPluginProvider({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, @[required](https://pub.dev/documentation/meta/1.8.0/meta/required-constant.html) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html)? child, required [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) visible, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) pluginName}) + + + + + +## Implementation + +```dart +const TalawaPluginProvider({ + Key? key, + @required this.child, + required this.visible, + required this.pluginName, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/build.md b/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/build.md new file mode 100644 index 000000000..1c71ed24b --- /dev/null +++ b/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/build.md @@ -0,0 +1,41 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

build the Plugin combining local visibility property and serverVisible property

+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + var serverVisible = false; + serverVisible = checkFromPluginList(); + return serverVisible || visible ? child! : Container(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/checkFromPluginList.md b/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/checkFromPluginList.md new file mode 100644 index 000000000..b432bce74 --- /dev/null +++ b/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/checkFromPluginList.md @@ -0,0 +1,60 @@ + + + +# checkFromPluginList method + + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) checkFromPluginList +() + + + + + +

return bool decides the final visibility of the verifying from database and current OrgId

+ + + +## Implementation + +```dart +bool checkFromPluginList() { + final UserConfig userConfig = locator(); + final Box box; + bool res = false; + box = Hive.box('pluginBox'); + var pluginList = box.get('plugins'); + pluginList ??= []; // if null then make it [] + + ///mapping over the list from the server + pluginList + .map( + (plugin) => { + if (plugin["pluginName"] == pluginName) + { + if (plugin["pluginInstallStatus"] as bool) + { + res = plugin["pluginInstallStatus"] as bool || + plugin["installedOrgs"] + .contains(userConfig.currentOrg.id) as bool + } + } + }, + ) + .toList(); + return res; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/child.md b/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/child.md new file mode 100644 index 000000000..35ec65b91 --- /dev/null +++ b/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/child.md @@ -0,0 +1,33 @@ + + + +# child property + + + + + + + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html)? child + +_final_ + + + +

child contains the widget for the plugin UI.

+ + + +## Implementation + +```dart +final Widget? child; +``` + + + + + + + diff --git a/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/pluginName.md b/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/pluginName.md new file mode 100644 index 000000000..9825d8933 --- /dev/null +++ b/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/pluginName.md @@ -0,0 +1,33 @@ + + + +# pluginName property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) pluginName + +_final_ + + + +

name of plugin preferred with underscores(_) instead of spaces

+ + + +## Implementation + +```dart +final String pluginName; +``` + + + + + + + diff --git a/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/visible.md b/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/visible.md new file mode 100644 index 000000000..bacba07b8 --- /dev/null +++ b/talawa-mobile-docs/plugins_talawa_plugin_provider/TalawaPluginProvider/visible.md @@ -0,0 +1,33 @@ + + + +# visible property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) visible + +_final_ + + + +

visible is the property that decides visibility of the UI.

+ + + +## Implementation + +```dart +final bool visible; +``` + + + + + + + diff --git a/talawa-mobile-docs/plugins_talawa_plugin_provider/plugins_talawa_plugin_provider-library.md b/talawa-mobile-docs/plugins_talawa_plugin_provider/plugins_talawa_plugin_provider-library.md new file mode 100644 index 000000000..e6d50cae7 --- /dev/null +++ b/talawa-mobile-docs/plugins_talawa_plugin_provider/plugins_talawa_plugin_provider-library.md @@ -0,0 +1,38 @@ + + + + +# talawa_plugin_provider library + + + + + + + + + + + +## Classes + +##### [TalawaPluginProvider](../plugins_talawa_plugin_provider/TalawaPluginProvider-class.md) + + + +TalwaPluginProvider provides ability to implement features as plugins + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/router/generateRoute.md b/talawa-mobile-docs/router/generateRoute.md new file mode 100644 index 000000000..cdb9d89fb --- /dev/null +++ b/talawa-mobile-docs/router/generateRoute.md @@ -0,0 +1,294 @@ + + + +# generateRoute function + + + + + + + + + + +[Route](https://api.flutter.dev/flutter/widgets/Route-class.html) generateRoute +([RouteSettings](https://api.flutter.dev/flutter/widgets/RouteSettings-class.html) settings) + + + + + +

The MaterialApp provides us with a property called generateRoute where +we can pass in a Function that returns a Route and takes in RouteSettings

+

Thus for this purpose, we create a function named generateRoute

+ + + +## Implementation + +```dart +Route generateRoute(RouteSettings settings) { + // The settings contains the route information of the requested route. + // It provides two key things to us: the name, and the arguments. + // We use the name to determine which view to return. + switch (settings.name) { + // Returns the SplashScreen + case Routes.splashScreen: + final int mainScreenIndex = settings.arguments! as int; + return MaterialPageRoute( + builder: (context) => SplashScreen( + key: const Key('SplashScreen'), + mainScreenIndex: mainScreenIndex, + ), + ); + + // Returns the SelectLanguage Widget + case Routes.languageSelectionRoute: + return MaterialPageRoute( + builder: (context) => const SelectLanguage(key: Key('SelectLanguage')), + ); + + // Returns the SetUrl Widget + case Routes.setUrlScreen: + final String uri = settings.arguments!.toString(); + return MaterialPageRoute( + builder: (context) => SetUrl( + key: const Key('SetUrl'), + uri: uri, + ), + ); + + // Returns the Login Widget + case Routes.loginScreen: + return MaterialPageRoute( + builder: (context) => const Login(key: Key('Login')), + ); + + // Returns the SelectOrganization Widget + case Routes.selectOrgScreen: + final String id = settings.arguments!.toString(); + return CupertinoPageRoute( + builder: (context) => SelectOrganization( + key: const Key('Signup'), + selectedOrgId: id, + ), + ); + + // Returns the SignUpDetails Widget + case Routes.signupDetailScreen: + final OrgInfo org = settings.arguments! as OrgInfo; + return CupertinoPageRoute( + builder: (context) => SignUpDetails( + key: const Key('Signup'), + selectedOrg: org, + ), + ); + + // Returns the WaitingPge Widget + case Routes.waitingScreen: + return CupertinoPageRoute( + builder: (context) => const WaitingPage(key: Key('Waiting')), + ); + + // Returns the Recover Widget + case Routes.recoverScreen: + return MaterialPageRoute( + builder: (context) => const Recover(key: Key('Recover')), + ); + + // Returns the ChangePass Widget + case Routes.updateScreen: + return MaterialPageRoute( + builder: (context) => const ChangePass(key: Key('Update')), + ); + + // Returns the OrganizationFeed Widget + case Routes.homeScreen: + return MaterialPageRoute( + builder: (context) => const OrganizationFeed(key: Key('HomeScreen')), + ); + + // Returns the MainScreen Widget + case Routes.mainScreen: + final MainScreenArgs mainScreenArgs = + settings.arguments! as MainScreenArgs; + // final bool fromSignUp = settings.arguments! as bool; + return MaterialPageRoute( + builder: (context) => MainScreen( + key: const Key('MainScreen'), + mainScreenArgs: mainScreenArgs, + ), + ); + + // Returns the IndividualPostView Widget + case Routes.individualPost: + final Post post = settings.arguments! as Post; + return MaterialPageRoute( + builder: (context) => IndividualPostView( + key: const Key('IndividualPost'), + post: post, + ), + ); + + // Returns the PinnedPostPgae Widget + case Routes.pinnedPostPage: + final List pinnedPosts = settings.arguments! as List; + return MaterialPageRoute( + builder: (context) => PinnedPostPage(pinnedPosts: pinnedPosts), + ); + + // Returns the ExploreEvents Widget + case Routes.exploreEventsScreen: + return MaterialPageRoute( + builder: (context) => const ExploreEvents(key: Key('ExploreEvents')), + ); + + // Returns the EventInfoPage Widget + case Routes.eventInfoPage: + final Map args = + settings.arguments! as Map; + return MaterialPageRoute( + builder: (context) => EventInfoPage( + key: const Key('EventInfo'), + args: args, + ), + ); + + // Returns the CreateEventPage Widget + case Routes.createEventPage: + return MaterialPageRoute( + builder: (context) => const CreateEventPage(key: Key('CreateEvent')), + ); + + // Returns the ProfilePage Widget + case Routes.profilePage: + return MaterialPageRoute( + builder: (context) => const ProfilePage(key: Key('Profile')), + ); + + // Returns the EditProfilePage Widget + case Routes.editProfilePage: + return MaterialPageRoute( + builder: (context) => const EditProfilePage(key: Key('EditProfile')), + ); + + // Returns the JoinOrganizationAfterAuth Widget + case Routes.joinOrg: + final String id = settings.arguments!.toString(); + return MaterialPageRoute( + builder: (context) => JoinOrganisationAfterAuth( + key: const Key('JoinOrganisationAfterAuth'), + orgId: id, + ), + ); + + case Routes.requestAccess: + final OrgInfo org = settings.arguments! as OrgInfo; + return CupertinoPageRoute( + builder: (context) => SendAccessRequest( + key: const Key('Signup'), + org: org, + ), + ); + // Returns the EditEventPage Widget + case Routes.editEventPage: + final Event event = settings.arguments! as Event; + return MaterialPageRoute( + builder: (context) => EditEventPage( + key: const Key('EditEvent'), + event: event, + ), + ); + + // Returns the AppSettingsPage Widget + case Routes.appSettings: + return MaterialPageRoute( + builder: (context) => const AppSettingsPage(key: Key('AppSettings')), + ); + + // Returns the ChatMessageScreen Widget + case Routes.chatMessageScreen: + final List arguments = settings.arguments! as List; + final String chatId = arguments[0] as String; + final DirectChatViewModel model = arguments[1] as DirectChatViewModel; + return MaterialPageRoute( + builder: (context) => ChatMessageScreen( + key: const Key('ChatMessageScreen'), + chatId: chatId, + model: model, + ), + ); + + // Returns the MapScreen Widget + case Routes.mapScreen: + final arguments = settings.arguments! as Map; + final model = arguments['model'] as CreateEventViewModel?; + final latitude = arguments['latitude'] as double; + final longitude = arguments['longitude'] as double; + return MaterialPageRoute( + builder: (context) => MapScreen( + model, + latitude, + longitude, + key: const Key('MapScreen'), + ), + ); + case Routes.calendar: + return MaterialPageRoute( + builder: (context) => EventCalendar( + settings.arguments! as List, + key: const Key('Calendar'), + ), + ); + case Routes.eventTasks: + final eventId = settings.arguments! as String; + return MaterialPageRoute( + builder: (context) => EventTasksPage( + eventId: eventId, + key: const Key('EventTasks'), + ), + ); + case Routes.userTasks: + return MaterialPageRoute( + builder: (context) => const UserTasksPage( + key: Key('UserTasks'), + ), + ); + case Routes.addTask: + final eventId = settings.arguments! as String; + return MaterialPageRoute( + builder: (context) => CreateTaskPage( + key: const Key('AddTask'), + eventId: eventId, + ), + ); + case Routes.editTask: + final task = settings.arguments! as Task; + return MaterialPageRoute( + builder: (context) => EditTaskPage( + key: const Key('EditTask'), + task: task, + ), + ); + // Returns the DemoPageView Widget by default + case Routes.selectContact: + return MaterialPageRoute( + builder: (context) => const SelectContact(key: Key('selectContact')), + ); + default: + return MaterialPageRoute( + builder: (context) => const DemoPageView( + key: Key("DemoPage"), + ), + ); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/router/router-library.md b/talawa-mobile-docs/router/router-library.md new file mode 100644 index 000000000..c8ba8c929 --- /dev/null +++ b/talawa-mobile-docs/router/router-library.md @@ -0,0 +1,41 @@ + + + + +# router library + + + + + + + + + + + + + + + + +## Functions + +##### [generateRoute](../router/generateRoute.md)([RouteSettings](https://api.flutter.dev/flutter/widgets/RouteSettings-class.html) settings) [Route](https://api.flutter.dev/flutter/widgets/Route-class.html) + + + +The MaterialApp provides us with a property called generateRoute where +we can pass in a Function that returns a Route and takes in RouteSettings + + + + + + + + + + + + diff --git a/talawa-mobile-docs/search.md b/talawa-mobile-docs/search.md new file mode 100644 index 000000000..0fedbdcfd --- /dev/null +++ b/talawa-mobile-docs/search.md @@ -0,0 +1,6 @@ +# 404 + +Oops, something's gone wrong :-( + +You've tried to visit a page that doesn't exist. Luckily this site has other +[pages](index.md). diff --git a/talawa-mobile-docs/services_chat_service/ChatService-class.md b/talawa-mobile-docs/services_chat_service/ChatService-class.md new file mode 100644 index 000000000..113930640 --- /dev/null +++ b/talawa-mobile-docs/services_chat_service/ChatService-class.md @@ -0,0 +1,152 @@ + + + +# ChatService class + + + + + + + + + +

ChatService class provides different services for direct chats of the user.

+

Services include:

+
    +
  • sendMessageToDirectChat - used to send messages.
  • +
  • getDirectChatsByUserId - used to get all chats by the user.
  • +
  • getDirectChatMessagesByChatId - used to get all chats of a user with another user.
  • +
+ + + + +## Constructors + +[ChatService](../services_chat_service/ChatService/ChatService.md) () + + + + +## Properties + +##### [chatListStream](../services_chat_service/ChatService/chatListStream.md) → [Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html)<[ChatListTileDataModel](../models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md)> + + + + +_read-only_ + + + +##### [chatMessagesStream](../services_chat_service/ChatService/chatMessagesStream.md) → [Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html)<[ChatMessage](../models_chats_chat_message/ChatMessage-class.md)> + + + + +_read-only_ + + + +##### [chatStream](../services_chat_service/ChatService/chatStream.md) ↔ [Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html)<[QueryResult](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/QueryResult-class.html)<[Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)?>> + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [getDirectChatMessagesByChatId](../services_chat_service/ChatService/getDirectChatMessagesByChatId.md)(dynamic chatId) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to get all the chat messages of a particular chat by the user. + + + + +##### [getDirectChatsByUserId](../services_chat_service/ChatService/getDirectChatsByUserId.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to get all the chats by the user. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [sendMessageToDirectChat](../services_chat_service/ChatService/sendMessageToDirectChat.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) chatId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) messageContent) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to send the message in the direct chats. + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_chat_service/ChatService/ChatService.md b/talawa-mobile-docs/services_chat_service/ChatService/ChatService.md new file mode 100644 index 000000000..3dfdea61a --- /dev/null +++ b/talawa-mobile-docs/services_chat_service/ChatService/ChatService.md @@ -0,0 +1,33 @@ + + + +# ChatService constructor + + + + + + + +ChatService() + + + + + +## Implementation + +```dart +ChatService() { + _dbFunctions = locator(); + _chatListStream = _chatController.stream.asBroadcastStream(); + _chatMessagesStream = _chatMessageController.stream.asBroadcastStream(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_chat_service/ChatService/chatListStream.md b/talawa-mobile-docs/services_chat_service/ChatService/chatListStream.md new file mode 100644 index 000000000..2f7d5759e --- /dev/null +++ b/talawa-mobile-docs/services_chat_service/ChatService/chatListStream.md @@ -0,0 +1,35 @@ + + + +# chatListStream property + + + + + + + + + +[Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html)<[ChatListTileDataModel](../../models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md)> chatListStream + + + + + + + + +## Implementation + +```dart +Stream get chatListStream => _chatListStream; +``` + + + + + + + + diff --git a/talawa-mobile-docs/services_chat_service/ChatService/chatMessagesStream.md b/talawa-mobile-docs/services_chat_service/ChatService/chatMessagesStream.md new file mode 100644 index 000000000..740897507 --- /dev/null +++ b/talawa-mobile-docs/services_chat_service/ChatService/chatMessagesStream.md @@ -0,0 +1,35 @@ + + + +# chatMessagesStream property + + + + + + + + + +[Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html)<[ChatMessage](../../models_chats_chat_message/ChatMessage-class.md)> chatMessagesStream + + + + + + + + +## Implementation + +```dart +Stream get chatMessagesStream => _chatMessagesStream; +``` + + + + + + + + diff --git a/talawa-mobile-docs/services_chat_service/ChatService/chatStream.md b/talawa-mobile-docs/services_chat_service/ChatService/chatStream.md new file mode 100644 index 000000000..be41fbc55 --- /dev/null +++ b/talawa-mobile-docs/services_chat_service/ChatService/chatStream.md @@ -0,0 +1,32 @@ + + + +# chatStream property + + + + + + + +[Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html)<[QueryResult](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/QueryResult-class.html)<[Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)?>> chatStream + +_read / write_ + + + + + + +## Implementation + +```dart +late Stream chatStream; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_chat_service/ChatService/getDirectChatMessagesByChatId.md b/talawa-mobile-docs/services_chat_service/ChatService/getDirectChatMessagesByChatId.md new file mode 100644 index 000000000..bf6686a9c --- /dev/null +++ b/talawa-mobile-docs/services_chat_service/ChatService/getDirectChatMessagesByChatId.md @@ -0,0 +1,52 @@ + + + +# getDirectChatMessagesByChatId method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> getDirectChatMessagesByChatId +(dynamic chatId) + + + + + +

This function is used to get all the chat messages of a particular chat by the user.

+

parameters required:

+
    +
  • chatId - id of the direct chat.
  • +
+ + + +## Implementation + +```dart +Future getDirectChatMessagesByChatId(chatId) async { + // trigger graphQL query to get all the chat messages of a particular chat using [chatId]. + final String query = + ChatQueries().fetchDirectChatMessagesByChatId(chatId as String); + + final result = await _dbFunctions.gqlAuthQuery(query); + + final messages = result.data['directChatsMessagesByChatID'] as List; + + messages.forEach((message) { + final chatMessage = ChatMessage.fromJson(message as Map); + _chatMessageController.add(chatMessage); + }); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_chat_service/ChatService/getDirectChatsByUserId.md b/talawa-mobile-docs/services_chat_service/ChatService/getDirectChatsByUserId.md new file mode 100644 index 000000000..0ae91a2ae --- /dev/null +++ b/talawa-mobile-docs/services_chat_service/ChatService/getDirectChatsByUserId.md @@ -0,0 +1,58 @@ + + + +# getDirectChatsByUserId method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> getDirectChatsByUserId +() + + + + + +

This function is used to get all the chats by the user.

+

parameters required:

+
    +
  • usedId - current user id, to get all the direct chats associated with this id.
  • +
+ + + +## Implementation + +```dart +Future getDirectChatsByUserId() async { + final userId = _userConfig.currentUser.id; + + // trigger graphQL query to get all the chats of the user using [userId]. + final String query = ChatQueries().fetchDirectChatsByUserId(userId!); + + final result = await _dbFunctions.gqlAuthQuery(query); + + final directMessageList = result.data['directChatsByUserID'] as List; + + // loop through the result [directMessageList] and append the element to the directChat. + directMessageList.forEach((chat) { + final directChat = + ChatListTileDataModel.fromJson(chat as Map); + + directChat.users!.forEach((element) { + if (element.id != userId) _chatController.add(directChat); + }); + }); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_chat_service/ChatService/sendMessageToDirectChat.md b/talawa-mobile-docs/services_chat_service/ChatService/sendMessageToDirectChat.md new file mode 100644 index 000000000..903348164 --- /dev/null +++ b/talawa-mobile-docs/services_chat_service/ChatService/sendMessageToDirectChat.md @@ -0,0 +1,57 @@ + + + +# sendMessageToDirectChat method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> sendMessageToDirectChat +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) chatId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) messageContent) + + + + + +

This function is used to send the message in the direct chats.

+

parameters required:

+
    +
  • chatId - id of the direct chat where message need to be send.
  • +
  • messageContent - the text that need to be send.
  • +
+ + + +## Implementation + +```dart +Future sendMessageToDirectChat( + String chatId, + String messageContent, +) async { + // trigger graphQL mutation to push the message in the Database. + final result = await _dbFunctions.gqlAuthMutation( + ChatQueries().sendMessageToDirectChat(), + variables: {"chatId": chatId, "messageContent": messageContent}, + ); + + final message = ChatMessage.fromJson( + result.data['sendMessageToDirectChat'] as Map, + ); + + _chatMessageController.add(message); + + debugPrint(result.data.toString()); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_chat_service/services_chat_service-library.md b/talawa-mobile-docs/services_chat_service/services_chat_service-library.md new file mode 100644 index 000000000..a59fdbcae --- /dev/null +++ b/talawa-mobile-docs/services_chat_service/services_chat_service-library.md @@ -0,0 +1,38 @@ + + + + +# chat_service library + + + + + + + + + + + +## Classes + +##### [ChatService](../services_chat_service/ChatService-class.md) + + + +ChatService class provides different services for direct chats of the user. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_comment_service/CommentService-class.md b/talawa-mobile-docs/services_comment_service/CommentService-class.md new file mode 100644 index 000000000..b3599d7f7 --- /dev/null +++ b/talawa-mobile-docs/services_comment_service/CommentService-class.md @@ -0,0 +1,115 @@ + + + +# CommentService class + + + + + + + + + +

CommentService class have different member functions which provides service in the context of commenting.

+

Services include:

+
    +
  • createComments - used to add comment on the post.
  • +
  • getCommentsForPost - used to get all comments on the post.
  • +
+ + + + +## Constructors + +[CommentService](../services_comment_service/CommentService/CommentService.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createComments](../services_comment_service/CommentService/createComments.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) postId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) text) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to add comment on the post. + + + + +##### [getCommentsForPost](../services_comment_service/CommentService/getCommentsForPost.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) postId) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function is used to fetch all comments on the post. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_comment_service/CommentService/CommentService.md b/talawa-mobile-docs/services_comment_service/CommentService/CommentService.md new file mode 100644 index 000000000..c59a7cc7e --- /dev/null +++ b/talawa-mobile-docs/services_comment_service/CommentService/CommentService.md @@ -0,0 +1,31 @@ + + + +# CommentService constructor + + + + + + + +CommentService() + + + + + +## Implementation + +```dart +CommentService() { + _dbFunctions = locator(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_comment_service/CommentService/createComments.md b/talawa-mobile-docs/services_comment_service/CommentService/createComments.md new file mode 100644 index 000000000..741c7348c --- /dev/null +++ b/talawa-mobile-docs/services_comment_service/CommentService/createComments.md @@ -0,0 +1,53 @@ + + + +# createComments method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> createComments +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) postId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) text) + + + + + +

This function is used to add comment on the post.

+

parameters:

+
    +
  • postId - Post id where comment need to be added.
  • +
  • text - content of the comment.
  • +
+ + + +## Implementation + +```dart +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; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_comment_service/CommentService/getCommentsForPost.md b/talawa-mobile-docs/services_comment_service/CommentService/getCommentsForPost.md new file mode 100644 index 000000000..956c67208 --- /dev/null +++ b/talawa-mobile-docs/services_comment_service/CommentService/getCommentsForPost.md @@ -0,0 +1,46 @@ + + + +# getCommentsForPost method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) getCommentsForPost +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) postId) + + + + + +

This function is used to fetch all comments on the post.

+

parameters:

+
    +
  • postId - Post id for which comments need to be fetched.
  • +
+ + + +## Implementation + +```dart +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/talawa-mobile-docs/services_comment_service/services_comment_service-library.md b/talawa-mobile-docs/services_comment_service/services_comment_service-library.md new file mode 100644 index 000000000..392683045 --- /dev/null +++ b/talawa-mobile-docs/services_comment_service/services_comment_service-library.md @@ -0,0 +1,38 @@ + + + + +# comment_service library + + + + + + + + + + + +## Classes + +##### [CommentService](../services_comment_service/CommentService-class.md) + + + +CommentService class have different member functions which provides service in the context of commenting. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions-class.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions-class.md new file mode 100644 index 000000000..90c047dce --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions-class.md @@ -0,0 +1,264 @@ + + + +# DataBaseMutationFunctions class + + + + + + + + + +

DataBaseMutationFunctions class provides different services that are under the context of graphQL mutations and queries.

+

Services include:

+
    +
  • encounteredExceptionOrError
  • +
  • gqlAuthQuery
  • +
  • gqlAuthMutation
  • +
  • gqlNonAuthMutation
  • +
  • gqlNonAuthQuery
  • +
  • refreshAccessToken
  • +
  • fetchOrgById
  • +
+ + + + +## Constructors + +[DataBaseMutationFunctions](../services_database_mutation_functions/DataBaseMutationFunctions/DataBaseMutationFunctions.md) () + + + + +## Properties + +##### [clientAuth](../services_database_mutation_functions/DataBaseMutationFunctions/clientAuth.md) ↔ [GraphQLClient](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/GraphQLClient-class.html) + + + +Client Auth for handling authenticated request. +_read / write_ + + + +##### [clientNonAuth](../services_database_mutation_functions/DataBaseMutationFunctions/clientNonAuth.md) ↔ [GraphQLClient](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/GraphQLClient-class.html) + + + +Client Auth for handling non-authenticated request. +_read / write_ + + + +##### [emailAccountPresent](../services_database_mutation_functions/DataBaseMutationFunctions/emailAccountPresent.md) ↔ [GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) + + + +Graphql error for handling. +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [memberRequestExist](../services_database_mutation_functions/DataBaseMutationFunctions/memberRequestExist.md) ↔ [GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) + + + +Graphql error for handling. +_read / write_ + + + +##### [notifFeatureNotInstalled](../services_database_mutation_functions/DataBaseMutationFunctions/notifFeatureNotInstalled.md) ↔ [GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) + + + +Graphql error for handling. +_read / write_ + + + +##### [organizationNotFound](../services_database_mutation_functions/DataBaseMutationFunctions/organizationNotFound.md) ↔ [GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) + + + +Graphql error for handling. +_read / write_ + + + +##### [refreshAccessTokenExpiredException](../services_database_mutation_functions/DataBaseMutationFunctions/refreshAccessTokenExpiredException.md) ↔ [GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) + + + +Graphql error for handling. +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [userNotAuthenticated](../services_database_mutation_functions/DataBaseMutationFunctions/userNotAuthenticated.md) ↔ [GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) + + + +Graphql error for handling. +_read / write_ + + + +##### [userNotFound](../services_database_mutation_functions/DataBaseMutationFunctions/userNotFound.md) ↔ [GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) + + + +Graphql error for handling. +_read / write_ + + + +##### [wrongCredentials](../services_database_mutation_functions/DataBaseMutationFunctions/wrongCredentials.md) ↔ [GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) + + + +Graphql error for handling. +_read / write_ + + + + + +## Methods + +##### [encounteredExceptionOrError](../services_database_mutation_functions/DataBaseMutationFunctions/encounteredExceptionOrError.md)([OperationException](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/OperationException-class.html) exception, {[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) showSnackBar = true}) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? + + + +This function is used to check if any exceptions or error encountered. The return type is boolean. + + + + +##### [fetchOrgById](../services_database_mutation_functions/DataBaseMutationFunctions/fetchOrgById.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) id) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function fetch the organization using the id passed. + + + + +##### [gqlAuthMutation](../services_database_mutation_functions/DataBaseMutationFunctions/gqlAuthMutation.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) mutation, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>? variables}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function is used to run the graph-ql mutation for authenticated user. + + + + +##### [gqlAuthQuery](../services_database_mutation_functions/DataBaseMutationFunctions/gqlAuthQuery.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) query, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>? variables}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function is used to run the graph-ql query for authentication. + + + + +##### [gqlNonAuthMutation](../services_database_mutation_functions/DataBaseMutationFunctions/gqlNonAuthMutation.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) mutation, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>? variables, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) reCall = true}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function is used to run the graph-ql mutation to authenticate the non signed-in user. + + + + +##### [gqlNonAuthQuery](../services_database_mutation_functions/DataBaseMutationFunctions/gqlNonAuthQuery.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) query, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>? variables}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[QueryResult](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/QueryResult-class.html)<[Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)?>?> + + + +This function is used to run the graph-ql query for the non signed-in user. + + + + +##### [init](../services_database_mutation_functions/DataBaseMutationFunctions/init.md)() void + + + +initialization function. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [refreshAccessToken](../services_database_mutation_functions/DataBaseMutationFunctions/refreshAccessToken.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) refreshToken) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> + + + +This function is used to refresh the Authenication token to access the application. + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/DataBaseMutationFunctions.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/DataBaseMutationFunctions.md new file mode 100644 index 000000000..cd5b61c64 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/DataBaseMutationFunctions.md @@ -0,0 +1,24 @@ + + + +# DataBaseMutationFunctions constructor + + + + + + + +DataBaseMutationFunctions() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/clientAuth.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/clientAuth.md new file mode 100644 index 000000000..4c673497f --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/clientAuth.md @@ -0,0 +1,33 @@ + + + +# clientAuth property + + + + + + + +[GraphQLClient](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/GraphQLClient-class.html) clientAuth + +_read / write_ + + + +

Client Auth for handling authenticated request.

+ + + +## Implementation + +```dart +late GraphQLClient clientAuth; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/clientNonAuth.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/clientNonAuth.md new file mode 100644 index 000000000..4b73d5782 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/clientNonAuth.md @@ -0,0 +1,33 @@ + + + +# clientNonAuth property + + + + + + + +[GraphQLClient](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/GraphQLClient-class.html) clientNonAuth + +_read / write_ + + + +

Client Auth for handling non-authenticated request.

+ + + +## Implementation + +```dart +late GraphQLClient clientNonAuth; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/emailAccountPresent.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/emailAccountPresent.md new file mode 100644 index 000000000..62e143ed2 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/emailAccountPresent.md @@ -0,0 +1,34 @@ + + + +# emailAccountPresent property + + + + + + + +[GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) emailAccountPresent + +_read / write_ + + + +

Graphql error for handling.

+ + + +## Implementation + +```dart +GraphQLError emailAccountPresent = + const GraphQLError(message: 'Email address already exists'); +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/encounteredExceptionOrError.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/encounteredExceptionOrError.md new file mode 100644 index 000000000..f08740a42 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/encounteredExceptionOrError.md @@ -0,0 +1,175 @@ + + + +# encounteredExceptionOrError method + + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)? encounteredExceptionOrError +([OperationException](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/OperationException-class.html) exception, {[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) showSnackBar = true}) + + + + + +

This function is used to check if any exceptions or error encountered. The return type is boolean.

+

params:

+
    +
  • exception: OperationException which occur when calling for graphql post request
  • +
  • showSnackBar: Tell if the the place where this function is called wants a SnackBar on error
  • +
+

returns:

+
    +
  • bool?: returns a bool whether or not their is error, can be null
  • +
+ + + +## Implementation + +```dart +bool? encounteredExceptionOrError( + OperationException exception, { + bool showSnackBar = true, +}) { + // if server link is wrong. + if (exception.linkException != null) { + // debugPrint(exception.linkException.toString()); + if (showSnackBar) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => navigationService.showTalawaErrorSnackBar( + "Server not running/wrong url", + MessageType.info, + ), + ); + } + return false; + } + + /// looping through graphQL errors. + debugPrint(exception.graphqlErrors.toString()); + for (int i = 0; i < exception.graphqlErrors.length; i++) { + // if the error message is "Access Token has expired. Please refresh session.: Undefined location" + 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; + } + + /// if the error message is "User is not authenticated" + if (exception.graphqlErrors[i].message == userNotAuthenticated.message) { + print('client refreshed'); + refreshAccessToken(userConfig.currentUser.refreshToken!).then( + (value) => graphqlConfig + .getToken() + .then((value) => databaseFunctions.init()), + ); + return true; + } + + /// if the error message is "User not found" + if (exception.graphqlErrors[i].message == userNotFound.message) { + if (showSnackBar) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => navigationService.showTalawaErrorDialog( + "No account registered with this email", + MessageType.error, + ), + ); + } + return false; + } + + /// if the error message is "Membership Request already exists" + if (exception.graphqlErrors[i].message == memberRequestExist.message) { + if (showSnackBar) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => navigationService.showTalawaErrorDialog( + "Membership request already exist", + MessageType.error, + ), + ); + } + return false; + } + + /// if the error message is "Invalid credentials" + if (exception.graphqlErrors[i].message == wrongCredentials.message) { + if (showSnackBar) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => navigationService.showTalawaErrorDialog( + "Enter a valid password", + MessageType.error, + ), + ); + } + return false; + } + + /// if the error message is "Organization not found" + if (exception.graphqlErrors[i].message == organizationNotFound.message) { + if (showSnackBar) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => navigationService.showTalawaErrorDialog( + "Organization Not Found", + MessageType.error, + ), + ); + } + return false; + } + + /// if the error message is "Email address already exists" + if (exception.graphqlErrors[i].message == emailAccountPresent.message) { + if (showSnackBar) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => navigationService.showTalawaErrorDialog( + "Account with this email already registered", + MessageType.error, + ), + ); + } + return false; + } + if (exception.graphqlErrors[i].message == + notifFeatureNotInstalled.message) { + if (showSnackBar) { + WidgetsBinding.instance.addPostFrameCallback( + (_) => navigationService.showTalawaErrorDialog( + "Notification Feature is not installed", + MessageType.error, + ), + ); + } + return false; + } + } + // if the error is unknown + + WidgetsBinding.instance.addPostFrameCallback( + (_) => navigationService.showTalawaErrorDialog( + "Something went wrong!", + MessageType.error, + ), + ); + return false; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/fetchOrgById.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/fetchOrgById.md new file mode 100644 index 000000000..8fb60f819 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/fetchOrgById.md @@ -0,0 +1,60 @@ + + + +# fetchOrgById method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) fetchOrgById +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) id) + + + + + +

This function fetch the organization using the id passed.

+

params:

+
    +
  • id: id that identifies a particular org
  • +
+

returns:

+
    +
  • Future<dynamic>: it returns Future of dynamic
  • +
+ + + +## Implementation + +```dart +Future fetchOrgById(String id) async { + final QueryResult result = await clientNonAuth + .mutate(MutationOptions(document: gql(_query.fetchOrgById(id)))); + // if there is an error or exception in [result] + if (result.hasException) { + final exception = encounteredExceptionOrError(result.exception!); + if (exception!) { + fetchOrgById(id); + } + } else if (result.data != null && result.isConcrete) { + return OrgInfo.fromJson( + // ignore: collection_methods_unrelated_type + (result.data!['organizations'] as Map)[0] + as Map, + ); + } + return false; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlAuthMutation.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlAuthMutation.md new file mode 100644 index 000000000..ea11a8fe9 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlAuthMutation.md @@ -0,0 +1,64 @@ + + + +# gqlAuthMutation method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) gqlAuthMutation +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) mutation, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>? variables}) + + + + + +

This function is used to run the graph-ql mutation for authenticated user.

+

params:

+
    +
  • mutation: mutation is used to change/add/delete data in graphql, for more info read graphql docs
  • +
  • variables: variables to be passed with mutation
  • +
+

returns:

+
    +
  • Future<dynamic>: it returns Future of dynamic
  • +
+ + + +## Implementation + +```dart +Future gqlAuthMutation( + String mutation, { + Map? variables, +}) async { + final QueryResult result = await clientAuth.mutate( + MutationOptions( + document: gql(mutation), + variables: variables ?? {}, + ), + ); + // if there is an error or exception in [result] + if (result.hasException) { + final exception = encounteredExceptionOrError(result.exception!); + if (exception!) { + gqlAuthMutation(mutation, variables: variables); + } + } else if (result.data != null && result.isConcrete) { + return result; + } + return null; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlAuthQuery.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlAuthQuery.md new file mode 100644 index 000000000..a90ff7cf5 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlAuthQuery.md @@ -0,0 +1,63 @@ + + + +# gqlAuthQuery method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) gqlAuthQuery +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) query, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>? variables}) + + + + + +

This function is used to run the graph-ql query for authentication.

+

params:

+
    +
  • query: query is used to fetch data in graphql, for more info read graphql docs
  • +
  • variables: variables to be passed with query
  • +
+

returns:

+
    +
  • Future<dynamic>: it returns Future of dynamic
  • +
+ + + +## Implementation + +```dart +Future gqlAuthQuery( + String query, { + Map? variables, +}) async { + final QueryOptions options = QueryOptions( + document: gql(query), + variables: variables ?? {}, + ); + final QueryResult result = await clientAuth.query(options); + // if there is an error or exception in [result] + if (result.hasException) { + final exception = encounteredExceptionOrError(result.exception!); + if (exception!) { + gqlAuthQuery(query, variables: variables); + } + } else if (result.data != null && result.isConcrete) { + return result; + } + return null; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlNonAuthMutation.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlNonAuthMutation.md new file mode 100644 index 000000000..8791e72a2 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlNonAuthMutation.md @@ -0,0 +1,66 @@ + + + +# gqlNonAuthMutation method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) gqlNonAuthMutation +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) mutation, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>? variables, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) reCall = true}) + + + + + +

This function is used to run the graph-ql mutation to authenticate the non signed-in user.

+

params:

+
    +
  • mutation: mutation is used to change/add/delete data in graphql, for more info read graphql docs
  • +
  • variables: variables to be passed with mutation
  • +
  • reCall: when not first fetch call
  • +
+

returns:

+
    +
  • Future<dynamic>: it returns Future of dynamic
  • +
+ + + +## Implementation + +```dart +Future gqlNonAuthMutation( + String mutation, { + Map? variables, + bool reCall = true, +}) async { + final QueryResult result = await clientNonAuth.mutate( + MutationOptions( + document: gql(mutation), + variables: variables ?? {}, + ), + ); + // if there is an error or exception in [result] + if (result.hasException) { + final exception = encounteredExceptionOrError(result.exception!); + if (exception! && reCall) { + gqlNonAuthMutation(mutation, variables: variables); + } + } else if (result.data != null && result.isConcrete) { + return result; + } + return null; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlNonAuthQuery.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlNonAuthQuery.md new file mode 100644 index 000000000..6f2ac2bdf --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/gqlNonAuthQuery.md @@ -0,0 +1,64 @@ + + + +# gqlNonAuthQuery method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[QueryResult](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/QueryResult-class.html)<[Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)?>?> gqlNonAuthQuery +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) query, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>? variables}) + + + + + +

This function is used to run the graph-ql query for the non signed-in user.

+

params:

+
    +
  • query: query is used to fetch data in graphql, for more info read graphql docs
  • +
  • variables: variables to be passed with query
  • +
+

returns:

+
    +
  • Future<QueryResult<Object?>?>: it returns Future of QueryResult, contains all data
  • +
+ + + +## Implementation + +```dart +Future?> gqlNonAuthQuery( + String query, { + Map? variables, +}) async { + final queryOptions = QueryOptions( + document: gql(query), + variables: variables ?? {}, + ); + final result = await clientNonAuth.query(queryOptions); + QueryResult? finalRes; + // if there is an error or exception in [result] + if (result.hasException) { + final exception = encounteredExceptionOrError(result.exception!); + if (exception!) { + finalRes = await gqlNonAuthQuery(query, variables: variables); + } + } else if (result.data != null && result.isConcrete) { + return result; + } + return finalRes; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/init.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/init.md new file mode 100644 index 000000000..c31b1aeb8 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/init.md @@ -0,0 +1,43 @@ + + + +# init method + + + + + + + + +void init +() + + + + + +

initialization function.

+

params: + None

+

returns: + None

+ + + +## Implementation + +```dart +void init() { + clientNonAuth = graphqlConfig.clientToQuery(); + clientAuth = graphqlConfig.authClient(); + _query = Queries(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/memberRequestExist.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/memberRequestExist.md new file mode 100644 index 000000000..ec1aaa4f9 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/memberRequestExist.md @@ -0,0 +1,34 @@ + + + +# memberRequestExist property + + + + + + + +[GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) memberRequestExist + +_read / write_ + + + +

Graphql error for handling.

+ + + +## Implementation + +```dart +GraphQLError memberRequestExist = + const GraphQLError(message: 'Membership Request already exists'); +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/notifFeatureNotInstalled.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/notifFeatureNotInstalled.md new file mode 100644 index 000000000..3047b0b22 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/notifFeatureNotInstalled.md @@ -0,0 +1,36 @@ + + + +# notifFeatureNotInstalled property + + + + + + + +[GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) notifFeatureNotInstalled + +_read / write_ + + + +

Graphql error for handling.

+ + + +## Implementation + +```dart +GraphQLError notifFeatureNotInstalled = const GraphQLError( + message: + 'Failed to determine project ID: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal. Error code: ENOTFOUND', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/organizationNotFound.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/organizationNotFound.md new file mode 100644 index 000000000..14aac023b --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/organizationNotFound.md @@ -0,0 +1,34 @@ + + + +# organizationNotFound property + + + + + + + +[GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) organizationNotFound + +_read / write_ + + + +

Graphql error for handling.

+ + + +## Implementation + +```dart +GraphQLError organizationNotFound = + const GraphQLError(message: 'Organization not found'); +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/refreshAccessToken.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/refreshAccessToken.md new file mode 100644 index 000000000..b89af5e64 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/refreshAccessToken.md @@ -0,0 +1,73 @@ + + + +# refreshAccessToken method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> refreshAccessToken +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) refreshToken) + + + + + +

This function is used to refresh the Authenication token to access the application.

+

params:

+
    +
  • refreshToken: Needed for authentication
  • +
+

returns:

+
    +
  • Future<bool>: it returns Future of dynamic
  • +
+ + + +## Implementation + +```dart +Future refreshAccessToken(String refreshToken) async { + // run the graphQL mutation + final QueryResult result = await clientNonAuth.mutate( + MutationOptions( + document: gql( + _query.refreshToken(refreshToken), + ), + ), + ); + // if there is an error or exception in [result] + if (result.hasException) { + final exception = encounteredExceptionOrError(result.exception!); + if (exception!) { + refreshAccessToken(refreshToken); + } else { + navigationService.pop(); + } + } else if (result.data != null && result.isConcrete) { + userConfig.updateAccessToken( + refreshToken: (result.data!['refreshToken'] + as Map)['refreshToken'] + .toString(), + accessToken: (result.data!['refreshToken'] + as Map)['accessToken'] + .toString(), + ); + databaseFunctions.init(); + return true; + } + return false; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/refreshAccessTokenExpiredException.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/refreshAccessTokenExpiredException.md new file mode 100644 index 000000000..6a2180548 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/refreshAccessTokenExpiredException.md @@ -0,0 +1,36 @@ + + + +# refreshAccessTokenExpiredException property + + + + + + + +[GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) refreshAccessTokenExpiredException + +_read / write_ + + + +

Graphql error for handling.

+ + + +## Implementation + +```dart +GraphQLError refreshAccessTokenExpiredException = const GraphQLError( + message: + 'Access Token has expired. Please refresh session.: Undefined location', +); +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/userNotAuthenticated.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/userNotAuthenticated.md new file mode 100644 index 000000000..a812e0ddc --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/userNotAuthenticated.md @@ -0,0 +1,34 @@ + + + +# userNotAuthenticated property + + + + + + + +[GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) userNotAuthenticated + +_read / write_ + + + +

Graphql error for handling.

+ + + +## Implementation + +```dart +GraphQLError userNotAuthenticated = + const GraphQLError(message: 'User is not authenticated'); +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/userNotFound.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/userNotFound.md new file mode 100644 index 000000000..032289659 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/userNotFound.md @@ -0,0 +1,33 @@ + + + +# userNotFound property + + + + + + + +[GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) userNotFound + +_read / write_ + + + +

Graphql error for handling.

+ + + +## Implementation + +```dart +GraphQLError userNotFound = const GraphQLError(message: 'User not found'); +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/wrongCredentials.md b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/wrongCredentials.md new file mode 100644 index 000000000..a0a4a26d5 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/DataBaseMutationFunctions/wrongCredentials.md @@ -0,0 +1,34 @@ + + + +# wrongCredentials property + + + + + + + +[GraphQLError](https://pub.dev/documentation/gql_exec/1.0.1-alpha+1690479830973/execution/GraphQLError-class.html) wrongCredentials + +_read / write_ + + + +

Graphql error for handling.

+ + + +## Implementation + +```dart +GraphQLError wrongCredentials = + const GraphQLError(message: 'Invalid credentials'); +``` + + + + + + + diff --git a/talawa-mobile-docs/services_database_mutation_functions/services_database_mutation_functions-library.md b/talawa-mobile-docs/services_database_mutation_functions/services_database_mutation_functions-library.md new file mode 100644 index 000000000..31230d7d5 --- /dev/null +++ b/talawa-mobile-docs/services_database_mutation_functions/services_database_mutation_functions-library.md @@ -0,0 +1,38 @@ + + + + +# database_mutation_functions library + + + + + + + + + + + +## Classes + +##### [DataBaseMutationFunctions](../services_database_mutation_functions/DataBaseMutationFunctions-class.md) + + + +DataBaseMutationFunctions class provides different services that are under the context of graphQL mutations and queries. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_event_service/EventService-class.md b/talawa-mobile-docs/services_event_service/EventService-class.md new file mode 100644 index 000000000..7a9e701c0 --- /dev/null +++ b/talawa-mobile-docs/services_event_service/EventService-class.md @@ -0,0 +1,174 @@ + + + +# EventService class + + + + + + + + + +

EventService class provides different services in the context of Event.

+

Services include:

+
    +
  • setOrgStreamSubscription : to set organization stream subscription for user.
  • +
  • getEvents : to get all events of the organization.
  • +
  • fetchRegistrantsByEvent : to fetch all registrants of an event.
  • +
  • registerForAnEvent : to register for an event.
  • +
  • deleteEvent : to delete an event.
  • +
  • editEvent : to edit the event.
  • +
  • dispose : to cancel the stream subscription of an organization.
  • +
+ + + + +## Constructors + +[EventService](../services_event_service/EventService/EventService.md) () + + + + +## Properties + +##### [eventStream](../services_event_service/EventService/eventStream.md) → [Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html)<[Event](../models_events_event_model/Event-class.md)> + + + +The event stream. +_read-only_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [deleteEvent](../services_event_service/EventService/deleteEvent.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function is used to delete the event. + + + + +##### [dispose](../services_event_service/EventService/dispose.md)() void + + + +This function is used to cancel the stream subscription of an organization. + + + + +##### [editEvent](../services_event_service/EventService/editEvent.md)({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId, required [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> variables}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to edit an event. + + + + +##### [fetchRegistrantsByEvent](../services_event_service/EventService/fetchRegistrantsByEvent.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function is used to fetch all registrants of an event. + + + + +##### [getEvents](../services_event_service/EventService/getEvents.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to fetch all the events of an organization. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [registerForAnEvent](../services_event_service/EventService/registerForAnEvent.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function is used to register user for an event. + + + + +##### [setOrgStreamSubscription](../services_event_service/EventService/setOrgStreamSubscription.md)() void + + + +This function is used to set stream subscription for an organization. + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_event_service/EventService/EventService.md b/talawa-mobile-docs/services_event_service/EventService/EventService.md new file mode 100644 index 000000000..8d9d30976 --- /dev/null +++ b/talawa-mobile-docs/services_event_service/EventService/EventService.md @@ -0,0 +1,34 @@ + + + +# EventService constructor + + + + + + + +EventService() + + + + + +## Implementation + +```dart +EventService() { + _eventStream = _eventStreamController.stream.asBroadcastStream(); + _currentOrg = _userConfig.currentOrg; + _userConfig.initialiseStream(); + setOrgStreamSubscription(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_event_service/EventService/deleteEvent.md b/talawa-mobile-docs/services_event_service/EventService/deleteEvent.md new file mode 100644 index 000000000..3c3c53776 --- /dev/null +++ b/talawa-mobile-docs/services_event_service/EventService/deleteEvent.md @@ -0,0 +1,55 @@ + + + +# deleteEvent method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) deleteEvent +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) + + + + + +

This function is used to delete the event.

+

params:

+
    +
  • eventId: id of an event
  • +
+

returns:

+
    +
  • Future<dynamic>: Information about the event deletion
  • +
+ + + +## Implementation + +```dart +Future deleteEvent(String eventId) async { + navigationService.pushDialog( + const CustomProgressDialog(key: Key('DeleteEventProgress')), + ); + final tokenResult = await _dbFunctions + .refreshAccessToken(userConfig.currentUser.refreshToken!); + debugPrint(tokenResult.toString()); + final result = await _dbFunctions.gqlAuthMutation( + EventQueries().deleteEvent(eventId), + ); + navigationService.pop(); + return result; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_event_service/EventService/dispose.md b/talawa-mobile-docs/services_event_service/EventService/dispose.md new file mode 100644 index 000000000..5eb528fee --- /dev/null +++ b/talawa-mobile-docs/services_event_service/EventService/dispose.md @@ -0,0 +1,41 @@ + + + +# dispose method + + + + + + + + +void dispose +() + + + + + +

This function is used to cancel the stream subscription of an organization.

+

params: + None

+

returns: + None

+ + + +## Implementation + +```dart +void dispose() { + _currentOrganizationStreamSubscription.cancel(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_event_service/EventService/editEvent.md b/talawa-mobile-docs/services_event_service/EventService/editEvent.md new file mode 100644 index 000000000..51f6f640e --- /dev/null +++ b/talawa-mobile-docs/services_event_service/EventService/editEvent.md @@ -0,0 +1,68 @@ + + + +# editEvent method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> editEvent +({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId, required [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> variables}) + + + + + +

This function is used to edit an event.

+

params:

+
    +
  • eventId: id of an event
  • +
  • variables: this will be map type and contain all the event details need to be update.
  • +
+

returns:

+
    +
  • Future<void>: void return
  • +
+ + + +## Implementation + +```dart +Future editEvent({ + required String eventId, + required Map variables, +}) async { + navigationService.pushDialog( + const CustomProgressDialog( + key: Key('EditEventProgress'), + ), + ); + final tokenResult = await _dbFunctions + .refreshAccessToken(userConfig.currentUser.refreshToken!); + debugPrint(tokenResult.toString()); + final result = await _dbFunctions.gqlAuthMutation( + EventQueries().updateEvent(eventId: eventId), + variables: variables, + ); + navigationService.pop(); + if (result != null) { + navigationService.removeAllAndPush( + Routes.exploreEventsScreen, + Routes.mainScreen, + arguments: MainScreenArgs(mainScreenIndex: 0, fromSignUp: false), + ); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_event_service/EventService/eventStream.md b/talawa-mobile-docs/services_event_service/EventService/eventStream.md new file mode 100644 index 000000000..e243c8385 --- /dev/null +++ b/talawa-mobile-docs/services_event_service/EventService/eventStream.md @@ -0,0 +1,42 @@ + + + +# eventStream property + + + + + + + + + +[Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html)<[Event](../../models_events_event_model/Event-class.md)> eventStream + + + + + +

The event stream.

+

params: +None +returns:

+
    +
  • Stream<Event>: returns the event stream
  • +
+ + + +## Implementation + +```dart +Stream get eventStream => _eventStream; +``` + + + + + + + + diff --git a/talawa-mobile-docs/services_event_service/EventService/fetchRegistrantsByEvent.md b/talawa-mobile-docs/services_event_service/EventService/fetchRegistrantsByEvent.md new file mode 100644 index 000000000..512594624 --- /dev/null +++ b/talawa-mobile-docs/services_event_service/EventService/fetchRegistrantsByEvent.md @@ -0,0 +1,49 @@ + + + +# fetchRegistrantsByEvent method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) fetchRegistrantsByEvent +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) + + + + + +

This function is used to fetch all registrants of an event.

+

params:

+
    +
  • eventId: id of an event.
  • +
+

returns:

+
    +
  • Future<dynamic>: Information about event registrants.
  • +
+ + + +## Implementation + +```dart +Future fetchRegistrantsByEvent(String eventId) async { + await _dbFunctions.refreshAccessToken(userConfig.currentUser.refreshToken!); + final result = await _dbFunctions.gqlAuthQuery( + EventQueries().registrantsByEvent(eventId), + ); + return result; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_event_service/EventService/getEvents.md b/talawa-mobile-docs/services_event_service/EventService/getEvents.md new file mode 100644 index 000000000..031bd6276 --- /dev/null +++ b/talawa-mobile-docs/services_event_service/EventService/getEvents.md @@ -0,0 +1,62 @@ + + + +# getEvents method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> getEvents +() + + + + + +

This function is used to fetch all the events of an organization.

+

params: + None

+

returns:

+
    +
  • Future<void>: void
  • +
+ + + +## Implementation + +```dart +Future getEvents() async { + // refresh user's access token + await _dbFunctions.refreshAccessToken(userConfig.currentUser.refreshToken!); + _dbFunctions.init(); + + // get current organization id + final String currentOrgID = _currentOrg.id!; + // mutation to fetch the events + final String mutation = EventQueries().fetchOrgEvents(currentOrgID); + final result = await _dbFunctions.gqlAuthMutation(mutation); + + if (result == null) return; + final List eventsJson = result.data!["eventsByOrganization"] as List; + eventsJson.forEach((eventJsonData) { + final Event event = Event.fromJson(eventJsonData as Map); + event.isRegistered = event.registrants?.any( + (registrant) => registrant.id == _userConfig.currentUser.id, + ) ?? + false; + _eventStreamController.add(event); + }); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_event_service/EventService/registerForAnEvent.md b/talawa-mobile-docs/services_event_service/EventService/registerForAnEvent.md new file mode 100644 index 000000000..d0714cd54 --- /dev/null +++ b/talawa-mobile-docs/services_event_service/EventService/registerForAnEvent.md @@ -0,0 +1,53 @@ + + + +# registerForAnEvent method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) registerForAnEvent +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) + + + + + +

This function is used to register user for an event.

+

params:

+
    +
  • eventId: id of an event.
  • +
+

returns:

+
    +
  • Future<dynamic>: Information about the event registration.
  • +
+ + + +## Implementation + +```dart +Future registerForAnEvent(String eventId) async { + final tokenResult = await _dbFunctions + .refreshAccessToken(userConfig.currentUser.refreshToken!); + debugPrint(tokenResult.toString()); + final Map variables = {'eventId': eventId}; + final result = await _dbFunctions.gqlAuthMutation( + EventQueries().registerForEvent(), + variables: variables, + ); + return result; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_event_service/EventService/setOrgStreamSubscription.md b/talawa-mobile-docs/services_event_service/EventService/setOrgStreamSubscription.md new file mode 100644 index 000000000..3aae01406 --- /dev/null +++ b/talawa-mobile-docs/services_event_service/EventService/setOrgStreamSubscription.md @@ -0,0 +1,44 @@ + + + +# setOrgStreamSubscription method + + + + + + + + +void setOrgStreamSubscription +() + + + + + +

This function is used to set stream subscription for an organization.

+

params: + None

+

returns: + None

+ + + +## Implementation + +```dart +void setOrgStreamSubscription() { + _currentOrganizationStreamSubscription = + _userConfig.currentOrgInfoStream.listen((updatedOrganization) { + _currentOrg = updatedOrganization; + }); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_event_service/services_event_service-library.md b/talawa-mobile-docs/services_event_service/services_event_service-library.md new file mode 100644 index 000000000..61682396c --- /dev/null +++ b/talawa-mobile-docs/services_event_service/services_event_service-library.md @@ -0,0 +1,38 @@ + + + + +# event_service library + + + + + + + + + + + +## Classes + +##### [EventService](../services_event_service/EventService-class.md) + + + +EventService class provides different services in the context of Event. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/GraphqlConfig-class.md b/talawa-mobile-docs/services_graphql_config/GraphqlConfig-class.md new file mode 100644 index 000000000..9d5a105a2 --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/GraphqlConfig-class.md @@ -0,0 +1,207 @@ + + + +# GraphqlConfig class + + + + + + + + + +

GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. +Talawa uses graphQL for the integrating with the API's. +You can go through talawa-api, here. +GraphqlConfig class provides service to configure graph ql API with talawa mobile-app.

+ + + + +## Constructors + +[GraphqlConfig](../services_graphql_config/GraphqlConfig/GraphqlConfig.md) () + + + + +## Properties + +##### [displayImgRoute](../services_graphql_config/GraphqlConfig/displayImgRoute.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [httpLink](../services_graphql_config/GraphqlConfig/httpLink.md) ↔ [HttpLink](https://pub.dev/documentation/gql_http_link/1.0.1/gql_http_link/HttpLink-class.html) + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [webSocketLink](../services_graphql_config/GraphqlConfig/webSocketLink.md) ↔ [WebSocketLink](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/WebSocketLink-class.html) + + + + +_read / write_ + + + + + +## Methods + +##### [authClient](../services_graphql_config/GraphqlConfig/authClient.md)() [GraphQLClient](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/GraphQLClient-class.html) + + + + + + + + +##### [clientToQuery](../services_graphql_config/GraphqlConfig/clientToQuery.md)() [GraphQLClient](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/GraphQLClient-class.html) + + + + + + + + +##### [getOrgUrl](../services_graphql_config/GraphqlConfig/getOrgUrl.md)() void + + + +This function is used to get the organization URL. + + + + +##### [getToken](../services_graphql_config/GraphqlConfig/getToken.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function is used to get user the access token. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [test](../services_graphql_config/GraphqlConfig/test.md)() void + + + + + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + +## Static Properties + +##### [orgURI](../services_graphql_config/GraphqlConfig/orgURI.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [token](../services_graphql_config/GraphqlConfig/token.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + + + + + + +## Constants + +##### [imageUrlKey](../services_graphql_config/GraphqlConfig/imageUrlKey-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [urlKey](../services_graphql_config/GraphqlConfig/urlKey-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/GraphqlConfig/GraphqlConfig.md b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/GraphqlConfig.md new file mode 100644 index 000000000..035b0463c --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/GraphqlConfig.md @@ -0,0 +1,24 @@ + + + +# GraphqlConfig constructor + + + + + + + +GraphqlConfig() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/GraphqlConfig/authClient.md b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/authClient.md new file mode 100644 index 000000000..aaacdd320 --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/authClient.md @@ -0,0 +1,41 @@ + + + +# authClient method + + + + + + + + +[GraphQLClient](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/GraphQLClient-class.html) authClient +() + + + + + + + + +## Implementation + +```dart +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, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/GraphqlConfig/clientToQuery.md b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/clientToQuery.md new file mode 100644 index 000000000..25b35a9ac --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/clientToQuery.md @@ -0,0 +1,42 @@ + + + +# clientToQuery method + + + + + + + + +[GraphQLClient](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/GraphQLClient-class.html) clientToQuery +() + + + + + + + + +## Implementation + +```dart +GraphQLClient clientToQuery() { + //TODO: Implement websocket link from OrgUrl + // final link = Link.split( + // (request) => request.isSubscription, webSocketLink, httpLink); + return GraphQLClient( + cache: GraphQLCache(partialDataPolicy: PartialDataCachePolicy.accept), + link: httpLink, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/GraphqlConfig/displayImgRoute.md b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/displayImgRoute.md new file mode 100644 index 000000000..0f5ca8520 --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/displayImgRoute.md @@ -0,0 +1,32 @@ + + + +# displayImgRoute property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? displayImgRoute + +_read / write_ + + + + + + +## Implementation + +```dart +String? displayImgRoute; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/GraphqlConfig/getOrgUrl.md b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/getOrgUrl.md new file mode 100644 index 000000000..fceac943c --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/getOrgUrl.md @@ -0,0 +1,44 @@ + + + +# getOrgUrl method + + + + + + + + +void getOrgUrl +() + + + + + +

This function is used to get the organization URL.

+ + + +## Implementation + +```dart +void 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(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/GraphqlConfig/getToken.md b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/getToken.md new file mode 100644 index 000000000..e2d6dda0d --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/getToken.md @@ -0,0 +1,40 @@ + + + +# getToken method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) getToken +() + + + + + +

This function is used to get user the access token.

+ + + +## Implementation + +```dart +Future getToken() async { + final authToken = userConfig.currentUser.authToken; + token = authToken; + getOrgUrl(); + return true; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/GraphqlConfig/httpLink.md b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/httpLink.md new file mode 100644 index 000000000..763c79612 --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/httpLink.md @@ -0,0 +1,32 @@ + + + +# httpLink property + + + + + + + +[HttpLink](https://pub.dev/documentation/gql_http_link/1.0.1/gql_http_link/HttpLink-class.html) httpLink + +_read / write_ + + + + + + +## Implementation + +```dart +late HttpLink httpLink; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/GraphqlConfig/imageUrlKey-constant.md b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/imageUrlKey-constant.md new file mode 100644 index 000000000..e12d339b1 --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/imageUrlKey-constant.md @@ -0,0 +1,32 @@ + + + +# imageUrlKey constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const imageUrlKey + + + + + + + + +## Implementation + +```dart +static const imageUrlKey = "imageUrl"; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/GraphqlConfig/orgURI.md b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/orgURI.md new file mode 100644 index 000000000..4c6dd0299 --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/orgURI.md @@ -0,0 +1,32 @@ + + + +# orgURI property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? orgURI + +_read / write_ + + + + + + +## Implementation + +```dart +static String? orgURI = ' '; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/GraphqlConfig/test.md b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/test.md new file mode 100644 index 000000000..8b19dcfa4 --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/test.md @@ -0,0 +1,39 @@ + + + +# test method + + + + + + + + +void test +() + + + + + + + + +## Implementation + +```dart +void test() { + httpLink = HttpLink( + 'https://talawa-graphql-api.herokuapp.com/graphql', + httpClient: MockHttpClient(), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/GraphqlConfig/token.md b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/token.md new file mode 100644 index 000000000..16321bc25 --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/token.md @@ -0,0 +1,32 @@ + + + +# token property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? token + +_read / write_ + + + + + + +## Implementation + +```dart +static String? token; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/GraphqlConfig/urlKey-constant.md b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/urlKey-constant.md new file mode 100644 index 000000000..d90752c59 --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/urlKey-constant.md @@ -0,0 +1,32 @@ + + + +# urlKey constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const urlKey + + + + + + + + +## Implementation + +```dart +static const urlKey = "url"; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/GraphqlConfig/webSocketLink.md b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/webSocketLink.md new file mode 100644 index 000000000..1284f5e82 --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/GraphqlConfig/webSocketLink.md @@ -0,0 +1,32 @@ + + + +# webSocketLink property + + + + + + + +[WebSocketLink](https://pub.dev/documentation/graphql/5.2.0-beta.4/graphql/WebSocketLink-class.html) webSocketLink + +_read / write_ + + + + + + +## Implementation + +```dart +late WebSocketLink webSocketLink; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/MockHttpClient-class.md b/talawa-mobile-docs/services_graphql_config/MockHttpClient-class.md new file mode 100644 index 000000000..44dbf5957 --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/MockHttpClient-class.md @@ -0,0 +1,203 @@ + + + +# MockHttpClient class + + + + + + + + + +

A mock HTTP client designed for use when testing code that uses BaseClient.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [Mock](https://pub.dev/documentation/mockito/5.4.0/mockito/Mock-class.html) +- MockHttpClient + +**Implemented types** + +- [Client](https://pub.dev/documentation/http/0.13.6/http/Client-class.html) + + + + + + + +## Constructors + +[MockHttpClient](../services_graphql_config/MockHttpClient/MockHttpClient.md) () + + + + +## Properties + +##### [hashCode](https://pub.dev/documentation/mockito/5.4.0/mockito/Mock/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [close](https://pub.dev/documentation/http/0.13.6/http/Client/close.html)() void + + + +Closes the client and cleans up any resources associated with it. +_inherited_ + + + +##### [delete](https://pub.dev/documentation/http/0.13.6/http/Client/delete.html)([Uri](https://api.flutter.dev/flutter/dart-core/Uri-class.html) url, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [String](https://api.flutter.dev/flutter/dart-core/String-class.html)>? headers, [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)? body, [Encoding](https://api.flutter.dev/flutter/dart-convert/Encoding-class.html)? encoding}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[Response](https://pub.dev/documentation/http/0.13.6/http/Response-class.html)> + + + +Sends an HTTP DELETE request with the given headers to the given URL. +_inherited_ + + + +##### [get](https://pub.dev/documentation/http/0.13.6/http/Client/get.html)([Uri](https://api.flutter.dev/flutter/dart-core/Uri-class.html) url, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [String](https://api.flutter.dev/flutter/dart-core/String-class.html)>? headers}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[Response](https://pub.dev/documentation/http/0.13.6/http/Response-class.html)> + + + +Sends an HTTP GET request with the given headers to the given URL. +_inherited_ + + + +##### [head](https://pub.dev/documentation/http/0.13.6/http/Client/head.html)([Uri](https://api.flutter.dev/flutter/dart-core/Uri-class.html) url, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [String](https://api.flutter.dev/flutter/dart-core/String-class.html)>? headers}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[Response](https://pub.dev/documentation/http/0.13.6/http/Response-class.html)> + + + +Sends an HTTP HEAD request with the given headers to the given URL. +_inherited_ + + + +##### [noSuchMethod](https://pub.dev/documentation/mockito/5.4.0/mockito/Mock/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation, {[Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)? returnValue, [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)? returnValueForMissingStub = deferToDefaultResponse}) dynamic + + + +Handles method stubbing, method call verification, and real method calls. +_inherited_ + + + +##### [patch](https://pub.dev/documentation/http/0.13.6/http/Client/patch.html)([Uri](https://api.flutter.dev/flutter/dart-core/Uri-class.html) url, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [String](https://api.flutter.dev/flutter/dart-core/String-class.html)>? headers, [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)? body, [Encoding](https://api.flutter.dev/flutter/dart-convert/Encoding-class.html)? encoding}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[Response](https://pub.dev/documentation/http/0.13.6/http/Response-class.html)> + + + +Sends an HTTP PATCH request with the given headers and body to the given +URL. +_inherited_ + + + +##### [post](https://pub.dev/documentation/http/0.13.6/http/Client/post.html)([Uri](https://api.flutter.dev/flutter/dart-core/Uri-class.html) url, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [String](https://api.flutter.dev/flutter/dart-core/String-class.html)>? headers, [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)? body, [Encoding](https://api.flutter.dev/flutter/dart-convert/Encoding-class.html)? encoding}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[Response](https://pub.dev/documentation/http/0.13.6/http/Response-class.html)> + + + +Sends an HTTP POST request with the given headers and body to the given +URL. +_inherited_ + + + +##### [put](https://pub.dev/documentation/http/0.13.6/http/Client/put.html)([Uri](https://api.flutter.dev/flutter/dart-core/Uri-class.html) url, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [String](https://api.flutter.dev/flutter/dart-core/String-class.html)>? headers, [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)? body, [Encoding](https://api.flutter.dev/flutter/dart-convert/Encoding-class.html)? encoding}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[Response](https://pub.dev/documentation/http/0.13.6/http/Response-class.html)> + + + +Sends an HTTP PUT request with the given headers and body to the given +URL. +_inherited_ + + + +##### [read](https://pub.dev/documentation/http/0.13.6/http/Client/read.html)([Uri](https://api.flutter.dev/flutter/dart-core/Uri-class.html) url, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [String](https://api.flutter.dev/flutter/dart-core/String-class.html)>? headers}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html)> + + + +Sends an HTTP GET request with the given headers to the given URL and +returns a Future that completes to the body of the response as a String. +_inherited_ + + + +##### [readBytes](https://pub.dev/documentation/http/0.13.6/http/Client/readBytes.html)([Uri](https://api.flutter.dev/flutter/dart-core/Uri-class.html) url, {[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [String](https://api.flutter.dev/flutter/dart-core/String-class.html)>? headers}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[Uint8List](https://api.flutter.dev/flutter/dart-typed_data/Uint8List-class.html)> + + + +Sends an HTTP GET request with the given headers to the given URL and +returns a Future that completes to the body of the response as a list of +bytes. +_inherited_ + + + +##### [send](../services_graphql_config/MockHttpClient/send.md)([BaseRequest](https://pub.dev/documentation/http/0.13.6/http/BaseRequest-class.html)? request) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[StreamedResponse](https://pub.dev/documentation/http/0.13.6/http/StreamedResponse-class.html)> + + + +Sends an HTTP request and asynchronously returns the response. +_override_ + + + +##### [toString](https://pub.dev/documentation/mockito/5.4.0/mockito/Mock/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://pub.dev/documentation/mockito/5.4.0/mockito/Mock/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/MockHttpClient/MockHttpClient.md b/talawa-mobile-docs/services_graphql_config/MockHttpClient/MockHttpClient.md new file mode 100644 index 000000000..e5de34c93 --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/MockHttpClient/MockHttpClient.md @@ -0,0 +1,24 @@ + + + +# MockHttpClient constructor + + + + + + + +MockHttpClient() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_graphql_config/MockHttpClient/send.md b/talawa-mobile-docs/services_graphql_config/MockHttpClient/send.md new file mode 100644 index 000000000..d2358b904 --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/MockHttpClient/send.md @@ -0,0 +1,47 @@ + + + +# send method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[StreamedResponse](https://pub.dev/documentation/http/0.13.6/http/StreamedResponse-class.html)> send +([BaseRequest](https://pub.dev/documentation/http/0.13.6/http/BaseRequest-class.html)? request) + +_override_ + + + +

Sends an HTTP request and asynchronously returns the response.

+ + + +## Implementation + +```dart +@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/talawa-mobile-docs/services_graphql_config/services_graphql_config-library.md b/talawa-mobile-docs/services_graphql_config/services_graphql_config-library.md new file mode 100644 index 000000000..ddc74cda1 --- /dev/null +++ b/talawa-mobile-docs/services_graphql_config/services_graphql_config-library.md @@ -0,0 +1,48 @@ + + + + +# graphql_config library + + + + + + + + + + + +## Classes + +##### [GraphqlConfig](../services_graphql_config/GraphqlConfig-class.md) + + + +GraphQL is a query language for APIs and a runtime for fulfilling those queries with your existing data. +Talawa uses graphQL for the integrating with the API's. +You can go through talawa-api, here. +GraphqlConfig class provides service to configure graph ql API with talawa mobile-app. + + +##### [MockHttpClient](../services_graphql_config/MockHttpClient-class.md) + + + +A mock HTTP client designed for use when testing code that uses BaseClient. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_navigation_service/NavigationService-class.md b/talawa-mobile-docs/services_navigation_service/NavigationService-class.md new file mode 100644 index 000000000..5485dfc4e --- /dev/null +++ b/talawa-mobile-docs/services_navigation_service/NavigationService-class.md @@ -0,0 +1,203 @@ + + + +# NavigationService class + + + + + + + + + +

NavigationService class provides different functions as service in the context of navigation.

+

Services include:

+
    +
  • pushScreen
  • +
  • popAndPushScreen
  • +
  • pushReplacementScreen
  • +
  • removeAllAndPush
  • +
  • showSnackBar
  • +
  • pushDialog
  • +
  • showTalawaErrorWidget
  • +
  • showTalawaErrorDialog
  • +
  • pop
  • +
+ + + + +## Constructors + +[NavigationService](../services_navigation_service/NavigationService/NavigationService.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [navigatorKey](../services_navigation_service/NavigationService/navigatorKey.md) ↔ [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[NavigatorState](https://api.flutter.dev/flutter/widgets/NavigatorState-class.html)> + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [fromInviteLink](../services_navigation_service/NavigationService/fromInviteLink.md)([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html)> routeNames, [List](https://api.flutter.dev/flutter/dart-core/List-class.html) arguments) void + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [pop](../services_navigation_service/NavigationService/pop.md)() void + + + +This function pops the current state. + + + + +##### [popAndPushScreen](../services_navigation_service/NavigationService/popAndPushScreen.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) routeName, {dynamic arguments}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function pop the initial route and push the new route to the navigator. + + + + +##### [pushDialog](../services_navigation_service/NavigationService/pushDialog.md)([Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) dialog) void + + + +This function is used to show the custom Dialog. + + + + +##### [pushReplacementScreen](../services_navigation_service/NavigationService/pushReplacementScreen.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) routeName, {dynamic arguments}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function push the route and replace the screen. + + + + +##### [pushScreen](../services_navigation_service/NavigationService/pushScreen.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) routeName, {dynamic arguments}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function push the route to the navigator. + + + + +##### [removeAllAndPush](../services_navigation_service/NavigationService/removeAllAndPush.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) routeName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) tillRoute, {dynamic arguments}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function remove all the routes till the particular route and add new route. + + + + +##### [showSnackBar](../services_navigation_service/NavigationService/showSnackBar.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) message, {[Duration](https://api.flutter.dev/flutter/dart-core/Duration-class.html) duration = const Duration(seconds: 2)}) void + + + +This is used for the quick alert of duration: 2 seconds with text message(passed). + + + + +##### [showTalawaErrorDialog](../services_navigation_service/NavigationService/showTalawaErrorDialog.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) errorMessage, [MessageType](../enums_enums/MessageType.md) messageType) void + + + + + + + + +##### [showTalawaErrorSnackBar](../services_navigation_service/NavigationService/showTalawaErrorSnackBar.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) errorMessage, [MessageType](../enums_enums/MessageType.md) messageType, {[Duration](https://api.flutter.dev/flutter/dart-core/Duration-class.html) duration = const Duration(seconds: 2)}) void + + + + + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_navigation_service/NavigationService/NavigationService.md b/talawa-mobile-docs/services_navigation_service/NavigationService/NavigationService.md new file mode 100644 index 000000000..e32f96455 --- /dev/null +++ b/talawa-mobile-docs/services_navigation_service/NavigationService/NavigationService.md @@ -0,0 +1,24 @@ + + + +# NavigationService constructor + + + + + + + +NavigationService() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_navigation_service/NavigationService/fromInviteLink.md b/talawa-mobile-docs/services_navigation_service/NavigationService/fromInviteLink.md new file mode 100644 index 000000000..e65d09b54 --- /dev/null +++ b/talawa-mobile-docs/services_navigation_service/NavigationService/fromInviteLink.md @@ -0,0 +1,40 @@ + + + +# fromInviteLink method + + + + + + + + +void fromInviteLink +([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html)> routeNames, [List](https://api.flutter.dev/flutter/dart-core/List-class.html) arguments) + + + + + + + + +## Implementation + +```dart +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]); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_navigation_service/NavigationService/navigatorKey.md b/talawa-mobile-docs/services_navigation_service/NavigationService/navigatorKey.md new file mode 100644 index 000000000..ba78b322e --- /dev/null +++ b/talawa-mobile-docs/services_navigation_service/NavigationService/navigatorKey.md @@ -0,0 +1,32 @@ + + + +# navigatorKey property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[NavigatorState](https://api.flutter.dev/flutter/widgets/NavigatorState-class.html)> navigatorKey + +_read / write_ + + + + + + +## Implementation + +```dart +GlobalKey navigatorKey = GlobalKey(); +``` + + + + + + + diff --git a/talawa-mobile-docs/services_navigation_service/NavigationService/pop.md b/talawa-mobile-docs/services_navigation_service/NavigationService/pop.md new file mode 100644 index 000000000..fcf90d6f1 --- /dev/null +++ b/talawa-mobile-docs/services_navigation_service/NavigationService/pop.md @@ -0,0 +1,37 @@ + + + +# pop method + + + + + + + + +void pop +() + + + + + +

This function pops the current state.

+ + + +## Implementation + +```dart +void pop() { + return navigatorKey.currentState!.pop(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_navigation_service/NavigationService/popAndPushScreen.md b/talawa-mobile-docs/services_navigation_service/NavigationService/popAndPushScreen.md new file mode 100644 index 000000000..2dd7b0e99 --- /dev/null +++ b/talawa-mobile-docs/services_navigation_service/NavigationService/popAndPushScreen.md @@ -0,0 +1,43 @@ + + + +# popAndPushScreen method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) popAndPushScreen +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) routeName, {dynamic arguments}) + + + + + +

This function pop the initial route and push the new route to the navigator.

+

params:

+
    +
  • routeName
  • +
  • arguments : necessary data for the route
  • +
+ + + +## Implementation + +```dart +Future popAndPushScreen(String routeName, {dynamic arguments}) { + navigatorKey.currentState!.pop(); + return pushScreen(routeName, arguments: arguments); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_navigation_service/NavigationService/pushDialog.md b/talawa-mobile-docs/services_navigation_service/NavigationService/pushDialog.md new file mode 100644 index 000000000..1c6f2e7e0 --- /dev/null +++ b/talawa-mobile-docs/services_navigation_service/NavigationService/pushDialog.md @@ -0,0 +1,44 @@ + + + +# pushDialog method + + + + + + + + +void pushDialog +([Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) dialog) + + + + + +

This function is used to show the custom Dialog.

+ + + +## Implementation + +```dart +void pushDialog(Widget dialog) { + showDialog( + context: navigatorKey.currentContext!, + barrierColor: Colors.transparent, + barrierDismissible: false, + builder: (BuildContext context) { + return dialog; + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_navigation_service/NavigationService/pushReplacementScreen.md b/talawa-mobile-docs/services_navigation_service/NavigationService/pushReplacementScreen.md new file mode 100644 index 000000000..d424e9278 --- /dev/null +++ b/talawa-mobile-docs/services_navigation_service/NavigationService/pushReplacementScreen.md @@ -0,0 +1,43 @@ + + + +# pushReplacementScreen method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) pushReplacementScreen +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) routeName, {dynamic arguments}) + + + + + +

This function push the route and replace the screen.

+

params:

+
    +
  • routeName
  • +
  • arguments : necessary data for the route
  • +
+ + + +## Implementation + +```dart +Future pushReplacementScreen(String routeName, {dynamic arguments}) { + return navigatorKey.currentState! + .pushReplacementNamed(routeName, arguments: arguments); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_navigation_service/NavigationService/pushScreen.md b/talawa-mobile-docs/services_navigation_service/NavigationService/pushScreen.md new file mode 100644 index 000000000..cee221613 --- /dev/null +++ b/talawa-mobile-docs/services_navigation_service/NavigationService/pushScreen.md @@ -0,0 +1,43 @@ + + + +# pushScreen method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) pushScreen +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) routeName, {dynamic arguments}) + + + + + +

This function push the route to the navigator.

+

params:

+
    +
  • routeName
  • +
  • arguments : necessary data for the route
  • +
+ + + +## Implementation + +```dart +Future pushScreen(String routeName, {dynamic arguments}) { + return navigatorKey.currentState! + .pushNamed(routeName, arguments: arguments); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_navigation_service/NavigationService/removeAllAndPush.md b/talawa-mobile-docs/services_navigation_service/NavigationService/removeAllAndPush.md new file mode 100644 index 000000000..675e9d430 --- /dev/null +++ b/talawa-mobile-docs/services_navigation_service/NavigationService/removeAllAndPush.md @@ -0,0 +1,51 @@ + + + +# removeAllAndPush method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) removeAllAndPush +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) routeName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) tillRoute, {dynamic arguments}) + + + + + +

This function remove all the routes till the particular route and add new route.

+

params:

+
    +
  • routeName : route that need to add
  • +
  • tillRoute : remove all route until this route.
  • +
  • arguments : necessary data for the route
  • +
+ + + +## Implementation + +```dart +Future removeAllAndPush( + String routeName, + String tillRoute, { + dynamic arguments, +}) { + return navigatorKey.currentState!.pushNamedAndRemoveUntil( + routeName, + ModalRoute.withName(tillRoute), + arguments: arguments, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_navigation_service/NavigationService/showSnackBar.md b/talawa-mobile-docs/services_navigation_service/NavigationService/showSnackBar.md new file mode 100644 index 000000000..26dee20c0 --- /dev/null +++ b/talawa-mobile-docs/services_navigation_service/NavigationService/showSnackBar.md @@ -0,0 +1,46 @@ + + + +# showSnackBar method + + + + + + + + +void showSnackBar +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) message, {[Duration](https://api.flutter.dev/flutter/dart-core/Duration-class.html) duration = const Duration(seconds: 2)}) + + + + + +

This is used for the quick alert of duration: 2 seconds with text message(passed).

+ + + +## Implementation + +```dart +void showSnackBar( + String message, { + Duration duration = const Duration(seconds: 2), +}) { + ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar( + SnackBar( + behavior: SnackBarBehavior.floating, + duration: duration, + content: Text(message), + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_navigation_service/NavigationService/showTalawaErrorDialog.md b/talawa-mobile-docs/services_navigation_service/NavigationService/showTalawaErrorDialog.md new file mode 100644 index 000000000..553dac12b --- /dev/null +++ b/talawa-mobile-docs/services_navigation_service/NavigationService/showTalawaErrorDialog.md @@ -0,0 +1,46 @@ + + + +# showTalawaErrorDialog method + + + + + + + + +void showTalawaErrorDialog +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) errorMessage, [MessageType](../../enums_enums/MessageType.md) messageType) + + + + + + + + +## Implementation + +```dart +void showTalawaErrorDialog(String errorMessage, MessageType messageType) { + showDialog( + context: navigatorKey.currentContext!, + barrierColor: Colors.transparent, + barrierDismissible: false, + builder: (BuildContext context) { + return TalawaErrorDialog( + errorMessage, + messageType: messageType, + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_navigation_service/NavigationService/showTalawaErrorSnackBar.md b/talawa-mobile-docs/services_navigation_service/NavigationService/showTalawaErrorSnackBar.md new file mode 100644 index 000000000..565c77500 --- /dev/null +++ b/talawa-mobile-docs/services_navigation_service/NavigationService/showTalawaErrorSnackBar.md @@ -0,0 +1,49 @@ + + + +# showTalawaErrorSnackBar method + + + + + + + + +void showTalawaErrorSnackBar +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) errorMessage, [MessageType](../../enums_enums/MessageType.md) messageType, {[Duration](https://api.flutter.dev/flutter/dart-core/Duration-class.html) duration = const Duration(seconds: 2)}) + + + + + + + + +## Implementation + +```dart +void showTalawaErrorSnackBar( + String errorMessage, + MessageType messageType, { + Duration duration = const Duration(seconds: 2), +}) { + ScaffoldMessenger.of(navigatorKey.currentContext!).showSnackBar( + SnackBar( + padding: EdgeInsets.zero, + content: TalawaErrorSnackBar( + messageType: messageType, + errorMessage: errorMessage, + ), + backgroundColor: const Color.fromRGBO(65, 65, 66, 1), + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_navigation_service/services_navigation_service-library.md b/talawa-mobile-docs/services_navigation_service/services_navigation_service-library.md new file mode 100644 index 000000000..5ce8587f9 --- /dev/null +++ b/talawa-mobile-docs/services_navigation_service/services_navigation_service-library.md @@ -0,0 +1,38 @@ + + + + +# navigation_service library + + + + + + + + + + + +## Classes + +##### [NavigationService](../services_navigation_service/NavigationService-class.md) + + + +NavigationService class provides different functions as service in the context of navigation. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_org_service/OrganizationService-class.md b/talawa-mobile-docs/services_org_service/OrganizationService-class.md new file mode 100644 index 000000000..dec422519 --- /dev/null +++ b/talawa-mobile-docs/services_org_service/OrganizationService-class.md @@ -0,0 +1,105 @@ + + + +# OrganizationService class + + + + + + + + + +

OrganizationService class provides the in the context of organizations.

+

Services include:

+
    +
  • getOrgMembersList : to get all organizations members
  • +
+ + + + +## Constructors + +[OrganizationService](../services_org_service/OrganizationService/OrganizationService.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [getOrgMembersList](../services_org_service/OrganizationService/getOrgMembersList.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../models_user_user_info/User-class.md)>> + + + +This function fetch and returns the list of organization members. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_org_service/OrganizationService/OrganizationService.md b/talawa-mobile-docs/services_org_service/OrganizationService/OrganizationService.md new file mode 100644 index 000000000..6827db76d --- /dev/null +++ b/talawa-mobile-docs/services_org_service/OrganizationService/OrganizationService.md @@ -0,0 +1,31 @@ + + + +# OrganizationService constructor + + + + + + + +OrganizationService() + + + + + +## Implementation + +```dart +OrganizationService() { + _dbFunctions = locator(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_org_service/OrganizationService/getOrgMembersList.md b/talawa-mobile-docs/services_org_service/OrganizationService/getOrgMembersList.md new file mode 100644 index 000000000..b44d1f1de --- /dev/null +++ b/talawa-mobile-docs/services_org_service/OrganizationService/getOrgMembersList.md @@ -0,0 +1,54 @@ + + + +# getOrgMembersList method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../../models_user_user_info/User-class.md)>> getOrgMembersList +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId) + + + + + +

This function fetch and returns the list of organization members.

+

params:

+
    +
  • orgId : id of the organization for which members list need be fetched.
  • +
+ + + +## Implementation + +```dart +Future> getOrgMembersList(String orgId) async { + final String query = Queries().fetchOrgDetailsById(orgId); + // fetching from database using graphQL mutations. + final result = await _dbFunctions.gqlAuthMutation(query); + final List orgMembersResult = + result.data['organizations'][0]['members'] as List; + final List orgMembersList = []; + orgMembersResult.forEach((jsonElement) { + final User member = + User.fromJson(jsonElement as Map, fromOrg: true); + orgMembersList.add(member); + }); + + // return list + return orgMembersList; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_org_service/services_org_service-library.md b/talawa-mobile-docs/services_org_service/services_org_service-library.md new file mode 100644 index 000000000..13bfece06 --- /dev/null +++ b/talawa-mobile-docs/services_org_service/services_org_service-library.md @@ -0,0 +1,38 @@ + + + + +# org_service library + + + + + + + + + + + +## Classes + +##### [OrganizationService](../services_org_service/OrganizationService-class.md) + + + +OrganizationService class provides the in the context of organizations. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_post_service/PostService-class.md b/talawa-mobile-docs/services_post_service/PostService-class.md new file mode 100644 index 000000000..41a1ca683 --- /dev/null +++ b/talawa-mobile-docs/services_post_service/PostService-class.md @@ -0,0 +1,162 @@ + + + +# PostService class + + + + + + + + + +

PostService class provides functions in the context of a Post.

+

Services include:

+
    +
  • getPosts : to get all posts of the organization.
  • +
  • addLike : to add like to the post.
  • +
  • removeLike : to remove the like from the post.
  • +
+ + + + +## Constructors + +[PostService](../services_post_service/PostService/PostService.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [postStream](../services_post_service/PostService/postStream.md) → [Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html)<[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../models_post_post_model/Post-class.md)>> + + + + +_read-only_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [updatedPostStream](../services_post_service/PostService/updatedPostStream.md) → [Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html)<[Post](../models_post_post_model/Post-class.md)> + + + + +_read-only_ + + + + + +## Methods + +##### [addCommentLocally](../services_post_service/PostService/addCommentLocally.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) postID) void + + + + + + + + +##### [addLike](../services_post_service/PostService/addLike.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) postID) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to add Like to the Post. + + + + +##### [getPosts](../services_post_service/PostService/getPosts.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function used to get all posts of an organization. +The function reference the organization Id from _currentOrg. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [removeLike](../services_post_service/PostService/removeLike.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) postID) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to remove like from the Post. + + + + +##### [setOrgStreamSubscription](../services_post_service/PostService/setOrgStreamSubscription.md)() void + + + + + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_post_service/PostService/PostService.md b/talawa-mobile-docs/services_post_service/PostService/PostService.md new file mode 100644 index 000000000..0ee01b0b6 --- /dev/null +++ b/talawa-mobile-docs/services_post_service/PostService/PostService.md @@ -0,0 +1,36 @@ + + + +# PostService constructor + + + + + + + +PostService() + + + + + +## Implementation + +```dart +PostService() { + _postStream = _postStreamController.stream.asBroadcastStream(); + _updatedPostStream = + _updatedPostStreamController.stream.asBroadcastStream(); + _currentOrg = _userConfig.currentOrg; + setOrgStreamSubscription(); + getPosts(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_post_service/PostService/addCommentLocally.md b/talawa-mobile-docs/services_post_service/PostService/addCommentLocally.md new file mode 100644 index 000000000..f2123c5d5 --- /dev/null +++ b/talawa-mobile-docs/services_post_service/PostService/addCommentLocally.md @@ -0,0 +1,41 @@ + + + +# addCommentLocally method + + + + + + + + +void addCommentLocally +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) postID) + + + + + + + + +## Implementation + +```dart +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/talawa-mobile-docs/services_post_service/PostService/addLike.md b/talawa-mobile-docs/services_post_service/PostService/addLike.md new file mode 100644 index 000000000..6e68fdc7f --- /dev/null +++ b/talawa-mobile-docs/services_post_service/PostService/addLike.md @@ -0,0 +1,48 @@ + + + +# addLike method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> addLike +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) postID) + + + + + +

This function is used to add Like to the Post.

+

params:

+
    +
  • postId : id of the post where like need to be added.
  • +
+ + + +## Implementation + +```dart +Future addLike(String postID) async { + _localAddLike(postID); + final String mutation = PostQueries().addLike(); + // run the graphQl mutation. + final result = await _dbFunctions + .gqlAuthMutation(mutation, variables: {"postID": postID}); + print(result); + // return result + return result; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_post_service/PostService/getPosts.md b/talawa-mobile-docs/services_post_service/PostService/getPosts.md new file mode 100644 index 000000000..84b9cdacb --- /dev/null +++ b/talawa-mobile-docs/services_post_service/PostService/getPosts.md @@ -0,0 +1,55 @@ + + + +# getPosts method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> getPosts +() + + + + + +

This function used to get all posts of an organization. +The function reference the organization Id from _currentOrg.

+ + + +## Implementation + +```dart +Future getPosts() async { + // variables + final String currentOrgID = _currentOrg.id!; + final String query = PostQueries().getPostsById(currentOrgID); + final result = await _dbFunctions.gqlAuthQuery(query); + + //Checking if the dbFunctions return the postJSON, if not return. + if (result.data!['postsByOrganization'] == null) return; + + final List postsJson = result.data!['postsByOrganization'] as List; + + postsJson.forEach((postJson) { + final Post post = Post.fromJson(postJson as Map); + if (!_renderedPostID.contains(post.sId)) { + _posts.insert(0, post); + _renderedPostID.add(post.sId); + } + }); + _postStreamController.add(_posts); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_post_service/PostService/postStream.md b/talawa-mobile-docs/services_post_service/PostService/postStream.md new file mode 100644 index 000000000..80065aede --- /dev/null +++ b/talawa-mobile-docs/services_post_service/PostService/postStream.md @@ -0,0 +1,35 @@ + + + +# postStream property + + + + + + + + + +[Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html)<[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../../models_post_post_model/Post-class.md)>> postStream + + + + + + + + +## Implementation + +```dart +Stream> get postStream => _postStream; +``` + + + + + + + + diff --git a/talawa-mobile-docs/services_post_service/PostService/removeLike.md b/talawa-mobile-docs/services_post_service/PostService/removeLike.md new file mode 100644 index 000000000..fed21d019 --- /dev/null +++ b/talawa-mobile-docs/services_post_service/PostService/removeLike.md @@ -0,0 +1,46 @@ + + + +# removeLike method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> removeLike +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) postID) + + + + + +

This function is used to remove like from the Post.

+

params:

+
    +
  • postId : id of the post where like need to be removed.
  • +
+ + + +## Implementation + +```dart +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; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_post_service/PostService/setOrgStreamSubscription.md b/talawa-mobile-docs/services_post_service/PostService/setOrgStreamSubscription.md new file mode 100644 index 000000000..f4ee899b4 --- /dev/null +++ b/talawa-mobile-docs/services_post_service/PostService/setOrgStreamSubscription.md @@ -0,0 +1,43 @@ + + + +# setOrgStreamSubscription method + + + + + + + + +void setOrgStreamSubscription +() + + + + + + + + +## Implementation + +```dart +void setOrgStreamSubscription() { + _userConfig.currentOrgInfoStream.listen((updatedOrganization) { + if (updatedOrganization != _currentOrg) { + print("org changes from post service"); + _renderedPostID.clear(); + _currentOrg = updatedOrganization; + getPosts(); + } + }); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_post_service/PostService/updatedPostStream.md b/talawa-mobile-docs/services_post_service/PostService/updatedPostStream.md new file mode 100644 index 000000000..3048a2fe6 --- /dev/null +++ b/talawa-mobile-docs/services_post_service/PostService/updatedPostStream.md @@ -0,0 +1,35 @@ + + + +# updatedPostStream property + + + + + + + + + +[Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html)<[Post](../../models_post_post_model/Post-class.md)> updatedPostStream + + + + + + + + +## Implementation + +```dart +Stream get updatedPostStream => _updatedPostStream; +``` + + + + + + + + diff --git a/talawa-mobile-docs/services_post_service/services_post_service-library.md b/talawa-mobile-docs/services_post_service/services_post_service-library.md new file mode 100644 index 000000000..4a739d0e2 --- /dev/null +++ b/talawa-mobile-docs/services_post_service/services_post_service-library.md @@ -0,0 +1,38 @@ + + + + +# post_service library + + + + + + + + + + + +## Classes + +##### [PostService](../services_post_service/PostService-class.md) + + + +PostService class provides functions in the context of a Post. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_size_config/SizeConfig-class.md b/talawa-mobile-docs/services_size_config/SizeConfig-class.md new file mode 100644 index 000000000..d0897bbeb --- /dev/null +++ b/talawa-mobile-docs/services_size_config/SizeConfig-class.md @@ -0,0 +1,175 @@ + + + +# SizeConfig class + + + + + + + + + +

SizeConfig class is used to initialise the height and width of the media.

+ + + + +## Constructors + +[SizeConfig](../services_size_config/SizeConfig/SizeConfig.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [init](../services_size_config/SizeConfig/init.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) void + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [test](../services_size_config/SizeConfig/test.md)() void + + + + + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + +## Static Properties + +##### [blockSizeHorizontal](../services_size_config/SizeConfig/blockSizeHorizontal.md) ↔ [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? + + + + +_read / write_ + + + +##### [blockSizeVertical](../services_size_config/SizeConfig/blockSizeVertical.md) ↔ [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? + + + + +_read / write_ + + + +##### [paddingTop](../services_size_config/SizeConfig/paddingTop.md) ↔ [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? + + + + +_read / write_ + + + +##### [safeBlockHorizontal](../services_size_config/SizeConfig/safeBlockHorizontal.md) ↔ [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? + + + + +_read / write_ + + + +##### [safeBlockVertical](../services_size_config/SizeConfig/safeBlockVertical.md) ↔ [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? + + + + +_read / write_ + + + +##### [screenHeight](../services_size_config/SizeConfig/screenHeight.md) ↔ [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? + + + + +_read / write_ + + + +##### [screenWidth](../services_size_config/SizeConfig/screenWidth.md) ↔ [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? + + + + +_read / write_ + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_size_config/SizeConfig/SizeConfig.md b/talawa-mobile-docs/services_size_config/SizeConfig/SizeConfig.md new file mode 100644 index 000000000..7a2926039 --- /dev/null +++ b/talawa-mobile-docs/services_size_config/SizeConfig/SizeConfig.md @@ -0,0 +1,24 @@ + + + +# SizeConfig constructor + + + + + + + +SizeConfig() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_size_config/SizeConfig/blockSizeHorizontal.md b/talawa-mobile-docs/services_size_config/SizeConfig/blockSizeHorizontal.md new file mode 100644 index 000000000..c497d83ad --- /dev/null +++ b/talawa-mobile-docs/services_size_config/SizeConfig/blockSizeHorizontal.md @@ -0,0 +1,32 @@ + + + +# blockSizeHorizontal property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html)? blockSizeHorizontal + +_read / write_ + + + + + + +## Implementation + +```dart +static double? blockSizeHorizontal; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_size_config/SizeConfig/blockSizeVertical.md b/talawa-mobile-docs/services_size_config/SizeConfig/blockSizeVertical.md new file mode 100644 index 000000000..1d691b2cf --- /dev/null +++ b/talawa-mobile-docs/services_size_config/SizeConfig/blockSizeVertical.md @@ -0,0 +1,32 @@ + + + +# blockSizeVertical property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html)? blockSizeVertical + +_read / write_ + + + + + + +## Implementation + +```dart +static double? blockSizeVertical; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_size_config/SizeConfig/init.md b/talawa-mobile-docs/services_size_config/SizeConfig/init.md new file mode 100644 index 000000000..793880339 --- /dev/null +++ b/talawa-mobile-docs/services_size_config/SizeConfig/init.md @@ -0,0 +1,49 @@ + + + +# init method + + + + + + + + +void init +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + + + + + + + + +## Implementation + +```dart +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"); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_size_config/SizeConfig/paddingTop.md b/talawa-mobile-docs/services_size_config/SizeConfig/paddingTop.md new file mode 100644 index 000000000..28987e0b3 --- /dev/null +++ b/talawa-mobile-docs/services_size_config/SizeConfig/paddingTop.md @@ -0,0 +1,32 @@ + + + +# paddingTop property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html)? paddingTop + +_read / write_ + + + + + + +## Implementation + +```dart +static double? paddingTop; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_size_config/SizeConfig/safeBlockHorizontal.md b/talawa-mobile-docs/services_size_config/SizeConfig/safeBlockHorizontal.md new file mode 100644 index 000000000..296f95581 --- /dev/null +++ b/talawa-mobile-docs/services_size_config/SizeConfig/safeBlockHorizontal.md @@ -0,0 +1,32 @@ + + + +# safeBlockHorizontal property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html)? safeBlockHorizontal + +_read / write_ + + + + + + +## Implementation + +```dart +static double? safeBlockHorizontal; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_size_config/SizeConfig/safeBlockVertical.md b/talawa-mobile-docs/services_size_config/SizeConfig/safeBlockVertical.md new file mode 100644 index 000000000..aa09b2ba7 --- /dev/null +++ b/talawa-mobile-docs/services_size_config/SizeConfig/safeBlockVertical.md @@ -0,0 +1,32 @@ + + + +# safeBlockVertical property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html)? safeBlockVertical + +_read / write_ + + + + + + +## Implementation + +```dart +static double? safeBlockVertical; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_size_config/SizeConfig/screenHeight.md b/talawa-mobile-docs/services_size_config/SizeConfig/screenHeight.md new file mode 100644 index 000000000..4aab01da1 --- /dev/null +++ b/talawa-mobile-docs/services_size_config/SizeConfig/screenHeight.md @@ -0,0 +1,32 @@ + + + +# screenHeight property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html)? screenHeight + +_read / write_ + + + + + + +## Implementation + +```dart +static double? screenHeight; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_size_config/SizeConfig/screenWidth.md b/talawa-mobile-docs/services_size_config/SizeConfig/screenWidth.md new file mode 100644 index 000000000..5f14d7c95 --- /dev/null +++ b/talawa-mobile-docs/services_size_config/SizeConfig/screenWidth.md @@ -0,0 +1,32 @@ + + + +# screenWidth property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html)? screenWidth + +_read / write_ + + + + + + +## Implementation + +```dart +static double? screenWidth; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_size_config/SizeConfig/test.md b/talawa-mobile-docs/services_size_config/SizeConfig/test.md new file mode 100644 index 000000000..1f2a3819e --- /dev/null +++ b/talawa-mobile-docs/services_size_config/SizeConfig/test.md @@ -0,0 +1,48 @@ + + + +# test method + + + + + + + + +void test +() + + + + + + + + +## Implementation + +```dart +void 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/talawa-mobile-docs/services_size_config/services_size_config-library.md b/talawa-mobile-docs/services_size_config/services_size_config-library.md new file mode 100644 index 000000000..040d2d32b --- /dev/null +++ b/talawa-mobile-docs/services_size_config/services_size_config-library.md @@ -0,0 +1,38 @@ + + + + +# size_config library + + + + + + + + + + + +## Classes + +##### [SizeConfig](../services_size_config/SizeConfig-class.md) + + + +SizeConfig class is used to initialise the height and width of the media. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_task_service/TaskService-class.md b/talawa-mobile-docs/services_task_service/TaskService-class.md new file mode 100644 index 000000000..12a51accd --- /dev/null +++ b/talawa-mobile-docs/services_task_service/TaskService-class.md @@ -0,0 +1,163 @@ + + + +# TaskService class + + + + + + + + + +

PostService class provides functions in the context of a Task.

+

Services include:

+
    +
  • getTasksForEvent : to get the task for the event.
  • +
  • getTasksByUser : to get the task added by the user.
  • +
  • editTask : to edit the task added by the user.
  • +
  • createTask : to create the task for the event.
  • +
  • deleteTask : to delete the task added by the user.
  • +
+ + + + +## Constructors + +[TaskService](../services_task_service/TaskService/TaskService.md) () + + + + +## Properties + +##### [callbackNotifyListeners](../services_task_service/TaskService/callbackNotifyListeners.md) ↔ [VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [tasks](../services_task_service/TaskService/tasks.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Task](../models_task_task_model/Task-class.md)> + + + + +_read-only_ + + + + + +## Methods + +##### [createTask](../services_task_service/TaskService/createTask.md)({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) title, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) description, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) deadline, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> + + + +This function is used to create a new task for the event. + + + + +##### [deleteTask](../services_task_service/TaskService/deleteTask.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) taskId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) creatorId) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to delete a task. + + + + +##### [editTask](../services_task_service/TaskService/editTask.md)({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) title, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) description, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) deadline, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) taskId}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> + + + +This function is used to edit the task created by the user. + + + + +##### [getTasksByUser](../services_task_service/TaskService/getTasksByUser.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to fetch and return all tasks added by the current user. + + + + +##### [getTasksForEvent](../services_task_service/TaskService/getTasksForEvent.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to get all the tasks for the event. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_task_service/TaskService/TaskService.md b/talawa-mobile-docs/services_task_service/TaskService/TaskService.md new file mode 100644 index 000000000..14f9eba9f --- /dev/null +++ b/talawa-mobile-docs/services_task_service/TaskService/TaskService.md @@ -0,0 +1,24 @@ + + + +# TaskService constructor + + + + + + + +TaskService() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_task_service/TaskService/callbackNotifyListeners.md b/talawa-mobile-docs/services_task_service/TaskService/callbackNotifyListeners.md new file mode 100644 index 000000000..13f1edc6f --- /dev/null +++ b/talawa-mobile-docs/services_task_service/TaskService/callbackNotifyListeners.md @@ -0,0 +1,32 @@ + + + +# callbackNotifyListeners property + + + + + + + +[VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) callbackNotifyListeners + +_read / write_ + + + + + + +## Implementation + +```dart +late VoidCallback callbackNotifyListeners; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_task_service/TaskService/createTask.md b/talawa-mobile-docs/services_task_service/TaskService/createTask.md new file mode 100644 index 000000000..3e08ed9d6 --- /dev/null +++ b/talawa-mobile-docs/services_task_service/TaskService/createTask.md @@ -0,0 +1,66 @@ + + + +# createTask method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> createTask +({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) title, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) description, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) deadline, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId}) + + + + + +

This function is used to create a new task for the event.

+

params:

+
    +
  • title : task title.
  • +
  • description : task description.
  • +
  • deadline : task deadline.
  • +
  • eventId : Event for which task need to be create.
  • +
+ + + +## Implementation + +```dart +Future createTask({ + required String title, + required String description, + required String deadline, + required String eventId, +}) async { + _databaseMutationFunctions + .refreshAccessToken(_userConfig.currentUser.refreshToken!); + final res = await _databaseMutationFunctions.gqlAuthMutation( + TaskQueries.addTask( + title: title, + description: description, + deadline: deadline, + eventId: eventId, + ), + ); + + if (res != null) { + final task = res.data!['createTask'] as Map; + _tasks.add(Task.fromJson(task)); + callbackNotifyListeners(); + return true; + } + return false; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_task_service/TaskService/deleteTask.md b/talawa-mobile-docs/services_task_service/TaskService/deleteTask.md new file mode 100644 index 000000000..2487482bc --- /dev/null +++ b/talawa-mobile-docs/services_task_service/TaskService/deleteTask.md @@ -0,0 +1,48 @@ + + + +# deleteTask method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> deleteTask +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) taskId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) creatorId) + + + + + +

This function is used to delete a task.

+

params:

+
    +
  • taskId : id of a task need to be deleted.
  • +
  • creatorId : id of the task creator.
  • +
+ + + +## Implementation + +```dart +Future deleteTask(String taskId, String creatorId) async { + if (creatorId == _userConfig.currentUser.id) { + await _databaseMutationFunctions + .refreshAccessToken(_userConfig.currentUser.refreshToken!); + final res = await _databaseMutationFunctions + .gqlAuthMutation(TaskQueries.deleteTask(taskId)); + if (res != null) _tasks.removeWhere((task) => task.id == taskId); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_task_service/TaskService/editTask.md b/talawa-mobile-docs/services_task_service/TaskService/editTask.md new file mode 100644 index 000000000..e0ff4bf2c --- /dev/null +++ b/talawa-mobile-docs/services_task_service/TaskService/editTask.md @@ -0,0 +1,72 @@ + + + +# editTask method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> editTask +({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) title, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) description, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) deadline, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) taskId}) + + + + + +

This function is used to edit the task created by the user.

+

params:

+
    +
  • title : task title.
  • +
  • description : task description.
  • +
  • deadline : task deadline.
  • +
  • taskId : task Id.
  • +
+ + + +## Implementation + +```dart +Future editTask({ + required String title, + required String description, + required String deadline, + required String taskId, +}) async { + _databaseMutationFunctions + .refreshAccessToken(_userConfig.currentUser.refreshToken!); + final res = await _databaseMutationFunctions.gqlAuthMutation( + TaskQueries.editTask( + title: title, + description: description, + deadline: deadline, + taskId: taskId, + ), + ); + + // if res is not null. + if (res != null) { + final updatedtaskJson = res.data!['updateTask'] as Map; + final index = _tasks.indexWhere((task) => task.id == taskId); + if (index == -1) return false; + final updatedtask = Task.fromJson(updatedtaskJson); + updatedtask.event.title = _tasks[index].event.title; + _tasks[index] = updatedtask; + callbackNotifyListeners(); + // if successfully updated then return true. + return true; + } + return false; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_task_service/TaskService/getTasksByUser.md b/talawa-mobile-docs/services_task_service/TaskService/getTasksByUser.md new file mode 100644 index 000000000..ce9e59af3 --- /dev/null +++ b/talawa-mobile-docs/services_task_service/TaskService/getTasksByUser.md @@ -0,0 +1,48 @@ + + + +# getTasksByUser method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> getTasksByUser +() + + + + + +

This function is used to fetch and return all tasks added by the current user.

+ + + +## Implementation + +```dart +Future getTasksByUser() async { + await _databaseMutationFunctions + .refreshAccessToken(_userConfig.currentUser.refreshToken!); + final res = await _databaseMutationFunctions + .gqlNonAuthQuery(TaskQueries.userTasks(_userConfig.currentUser.id!)); + + if (res != null) { + _tasks.clear(); + final tasksList = res.data!['tasksByUser'] as List; + tasksList.forEach((task) { + _tasks.add(Task.fromJson(task as Map)); + }); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_task_service/TaskService/getTasksForEvent.md b/talawa-mobile-docs/services_task_service/TaskService/getTasksForEvent.md new file mode 100644 index 000000000..21536bf75 --- /dev/null +++ b/talawa-mobile-docs/services_task_service/TaskService/getTasksForEvent.md @@ -0,0 +1,52 @@ + + + +# getTasksForEvent method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> getTasksForEvent +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) + + + + + +

This function is used to get all the tasks for the event.

+

params:

+
    +
  • eventId : id of an event for which tasks need to fetched,
  • +
+ + + +## Implementation + +```dart +Future getTasksForEvent(String eventId) async { + await _databaseMutationFunctions + .refreshAccessToken(_userConfig.currentUser.refreshToken!); + final res = await _databaseMutationFunctions + .gqlNonAuthQuery(TaskQueries.eventTasks(eventId)); + + if (res != null) { + _tasks.clear(); + final tasksList = res.data!['tasksByEvent'] as List; + tasksList.forEach((task) { + _tasks.add(Task.fromJson(task as Map)); + }); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_task_service/TaskService/tasks.md b/talawa-mobile-docs/services_task_service/TaskService/tasks.md new file mode 100644 index 000000000..aad6505b3 --- /dev/null +++ b/talawa-mobile-docs/services_task_service/TaskService/tasks.md @@ -0,0 +1,35 @@ + + + +# tasks property + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Task](../../models_task_task_model/Task-class.md)> tasks + + + + + + + + +## Implementation + +```dart +List get tasks => _tasks; +``` + + + + + + + + diff --git a/talawa-mobile-docs/services_task_service/services_task_service-library.md b/talawa-mobile-docs/services_task_service/services_task_service-library.md new file mode 100644 index 000000000..74a1bb179 --- /dev/null +++ b/talawa-mobile-docs/services_task_service/services_task_service-library.md @@ -0,0 +1,38 @@ + + + + +# task_service library + + + + + + + + + + + +## Classes + +##### [TaskService](../services_task_service/TaskService-class.md) + + + +PostService class provides functions in the context of a Task. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService-class.md b/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService-class.md new file mode 100644 index 000000000..318a00e23 --- /dev/null +++ b/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService-class.md @@ -0,0 +1,125 @@ + + + +# MultiMediaPickerService class + + + + + + + + + +

This is a third party service which provide the service to select the image from.

+

gallery and then image can be cropped as well.

+

Services include:

+
    +
  • getPhotoFromGallery - Used to select photo from gallery.
  • +
  • cropImage - Used to crop the selected image.
  • +
+ + + + +## Constructors + +[MultiMediaPickerService](../services_third_party_service_multi_media_pick_service/MultiMediaPickerService/MultiMediaPickerService.md) () + + + + +## Properties + +##### [fileStream](../services_third_party_service_multi_media_pick_service/MultiMediaPickerService/fileStream.md) → [Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html) + + + +This function returns the stream of files. +_read-only_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [cropImage](../services_third_party_service_multi_media_pick_service/MultiMediaPickerService/cropImage.md)({required [File](https://api.flutter.dev/flutter/dart-io/File-class.html) imageFile}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[File](https://api.flutter.dev/flutter/dart-io/File-class.html)?> + + + +This function is used to crop the image selected by the user. + + + + +##### [getPhotoFromGallery](../services_third_party_service_multi_media_pick_service/MultiMediaPickerService/getPhotoFromGallery.md)({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) camera = false}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[File](https://api.flutter.dev/flutter/dart-io/File-class.html)?> + + + +This function is used to pick the image from gallery or to click the image from user's camera. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/MultiMediaPickerService.md b/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/MultiMediaPickerService.md new file mode 100644 index 000000000..28c50264b --- /dev/null +++ b/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/MultiMediaPickerService.md @@ -0,0 +1,32 @@ + + + +# MultiMediaPickerService constructor + + + + + + + +MultiMediaPickerService() + + + + + +## Implementation + +```dart +MultiMediaPickerService() { + _picker = locator(); + _fileStream = _fileStreamController.stream.asBroadcastStream(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/cropImage.md b/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/cropImage.md new file mode 100644 index 000000000..fdff8f3c1 --- /dev/null +++ b/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/cropImage.md @@ -0,0 +1,77 @@ + + + +# cropImage method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[File](https://api.flutter.dev/flutter/dart-io/File-class.html)?> cropImage +({required [File](https://api.flutter.dev/flutter/dart-io/File-class.html) imageFile}) + + + + + +

This function is used to crop the image selected by the user.

+

The function accepts a File type image and returns File type of cropped image.

+

params:

+
    +
  • imageFile: the image file to be cropped.
  • +
+

returns:

+
    +
  • Future<File?>: the image after been cropped.
  • +
+ + + +## Implementation + +```dart +Future cropImage({required File imageFile}) async { + // try, to crop the image and returns a File with cropped image path. + try { + final CroppedFile? croppedImage = await locator().cropImage( + sourcePath: imageFile.path, + aspectRatioPresets: [ + CropAspectRatioPreset.square, + CropAspectRatioPreset.original, + ], + uiSettings: [ + AndroidUiSettings( + toolbarTitle: 'Crop Image', + toolbarColor: const Color(0xff18191A), + toolbarWidgetColor: Colors.white, + backgroundColor: Colors.black, + cropGridColor: Colors.white, + initAspectRatio: CropAspectRatioPreset.original, + lockAspectRatio: false, + ), + IOSUiSettings( + minimumAspectRatio: 1.0, + ) + ], + ); + if (croppedImage != null) { + return File(croppedImage.path); + } + } catch (e) { + print( + "MultiMediaPickerService : Exception occurred while cropping Image", + ); + } + return null; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/fileStream.md b/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/fileStream.md new file mode 100644 index 000000000..71d2ea7a2 --- /dev/null +++ b/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/fileStream.md @@ -0,0 +1,42 @@ + + + +# fileStream property + + + + + + + + + +[Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html) fileStream + + + + + +

This function returns the stream of files.

+

params: +None.

+

returns:

+
    +
  • Stream<dynamic>: Stream of files.
  • +
+ + + +## Implementation + +```dart +Stream get fileStream => _fileStream; +``` + + + + + + + + diff --git a/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/getPhotoFromGallery.md b/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/getPhotoFromGallery.md new file mode 100644 index 000000000..d97759f54 --- /dev/null +++ b/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/MultiMediaPickerService/getPhotoFromGallery.md @@ -0,0 +1,78 @@ + + + +# getPhotoFromGallery method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[File](https://api.flutter.dev/flutter/dart-io/File-class.html)?> getPhotoFromGallery +({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) camera = false}) + + + + + +

This function is used to pick the image from gallery or to click the image from user's camera.

+

The function first ask for the permission to access the camera, if denied then returns a message in.

+

custom Dialog Box. This function returns a File type for which camera variable is false by default.

+

params:

+
    +
  • camera: if true then open camera for image, else open gallery to select image.
  • +
+

returns:

+
    +
  • Future<File?>: the image the user choosed.
  • +
+ + + +## Implementation + +```dart +Future getPhotoFromGallery({bool camera = false}) async { + // asking for user's camera access permission. + try { + // checking for the image source, it could be camera or gallery. + final image = await _picker.pickImage( + source: camera ? ImageSource.camera : ImageSource.gallery, + ); + // if image is selected or not null, call the cropImage function that provide service to crop the selected image. + if (image != null) { + return await cropImage(imageFile: File(image.path)); + } + } catch (e) { + // if the permission denied or error occurs. + if (e is PlatformException && e.code == 'camera_access_denied') { + // push the dialog alert with the message. + locator().pushDialog( + CustomAlertDialog( + success: () { + locator().pop(); + openAppSettings(); + }, + dialogTitle: 'Permission Denied', + successText: 'SETTINGS', + dialogSubTitle: + "Camera permission is required, to use this feature, give permission from app settings", + ), + ); + } + print( + "MultiMediaPickerService : Exception occurred while choosing photo from the gallery $e", + ); + } + return null; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/services_third_party_service_multi_media_pick_service-library.md b/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/services_third_party_service_multi_media_pick_service-library.md new file mode 100644 index 000000000..5eecc0aa8 --- /dev/null +++ b/talawa-mobile-docs/services_third_party_service_multi_media_pick_service/services_third_party_service_multi_media_pick_service-library.md @@ -0,0 +1,38 @@ + + + + +# multi_media_pick_service library + + + + + + + + + + + +## Classes + +##### [MultiMediaPickerService](../services_third_party_service_multi_media_pick_service/MultiMediaPickerService-class.md) + + + +This is a third party service which provide the service to select the image from. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig-class.md b/talawa-mobile-docs/services_user_config/UserConfig-class.md new file mode 100644 index 000000000..01c67b0d4 --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig-class.md @@ -0,0 +1,237 @@ + + + +# UserConfig class + + + + + + + + + +

UserConfig class provides different services in the context of the User.

+

Services include:

+
    +
  • userLoggedIn : helps to make user logged in to the application.
  • +
  • updateUserJoinedOrg : helps to update the user joined organization.
  • +
  • updateUserCreatedOrg : helps to update the user created organization.
  • +
  • updateUserMemberRequestOrg : helps to update the User membership request for the organization.
  • +
  • updateUserAdminOrg : helps to update the Admin of the Organization.
  • +
  • updateAccessToken : helps to update the access token of an user.
  • +
  • updateUser : helps to update the user.
  • +
+ + + + +## Constructors + +[UserConfig](../services_user_config/UserConfig/UserConfig.md) () + + + + +## Properties + +##### [currentOrg](../services_user_config/UserConfig/currentOrg.md) ↔ [OrgInfo](../models_organization_org_info/OrgInfo-class.md) + + + + +_read / write_ + + + +##### [currentOrgInfoController](../services_user_config/UserConfig/currentOrgInfoController.md) → [StreamController](https://api.flutter.dev/flutter/dart-async/StreamController-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> + + + + +_read-only_ + + + +##### [currentOrgInfoStream](../services_user_config/UserConfig/currentOrgInfoStream.md) → [Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> + + + + +_read-only_ + + + +##### [currentOrgName](../services_user_config/UserConfig/currentOrgName.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read-only_ + + + +##### [currentUser](../services_user_config/UserConfig/currentUser.md) ↔ [User](../models_user_user_info/User-class.md) + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [initialiseStream](../services_user_config/UserConfig/initialiseStream.md)() void + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [saveCurrentOrgInHive](../services_user_config/UserConfig/saveCurrentOrgInHive.md)([OrgInfo](../models_organization_org_info/OrgInfo-class.md) saveOrgAsCurrent) void + + + + + + + + +##### [saveUserInHive](../services_user_config/UserConfig/saveUserInHive.md)() void + + + + + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [updateAccessToken](../services_user_config/UserConfig/updateAccessToken.md)({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) accessToken, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) refreshToken}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function is used to updated the access token of the user. + + + + +##### [updateUser](../services_user_config/UserConfig/updateUser.md)([User](../models_user_user_info/User-class.md) updatedUserDetails) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> + + + +This function is used to update the user details. + + + + +##### [updateUserAdminOrg](../services_user_config/UserConfig/updateUserAdminOrg.md)([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> orgDetails) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function is used to update the organization admin. + + + + +##### [updateUserCreatedOrg](../services_user_config/UserConfig/updateUserCreatedOrg.md)([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> orgDetails) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function is used to update the user created organization. + + + + +##### [updateUserJoinedOrg](../services_user_config/UserConfig/updateUserJoinedOrg.md)([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> orgDetails) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function is used to update the user joined organization. + + + + +##### [updateUserMemberRequestOrg](../services_user_config/UserConfig/updateUserMemberRequestOrg.md)([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> orgDetails) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function is used to update the user request to join the organization. + + + + +##### [userLoggedIn](../services_user_config/UserConfig/userLoggedIn.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> + + + +This function is used to log in the user. + + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig/UserConfig.md b/talawa-mobile-docs/services_user_config/UserConfig/UserConfig.md new file mode 100644 index 000000000..9472b066e --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/UserConfig.md @@ -0,0 +1,24 @@ + + + +# UserConfig constructor + + + + + + + +UserConfig() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig/currentOrg.md b/talawa-mobile-docs/services_user_config/UserConfig/currentOrg.md new file mode 100644 index 000000000..a83a2ef49 --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/currentOrg.md @@ -0,0 +1,53 @@ + + + +# currentOrg property + + + + + + + + + +[OrgInfo](../../models_organization_org_info/OrgInfo-class.md) currentOrg + + + + + + + + +## Implementation + +```dart +OrgInfo get currentOrg => _currentOrg!; +``` + + + + + +currentOrg= +([OrgInfo](../../models_organization_org_info/OrgInfo-class.md) org) + + + + + + + +## Implementation + +```dart +set currentOrg(OrgInfo org) => _currentOrg = org; +``` + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig/currentOrgInfoController.md b/talawa-mobile-docs/services_user_config/UserConfig/currentOrgInfoController.md new file mode 100644 index 000000000..6fccf53f6 --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/currentOrgInfoController.md @@ -0,0 +1,36 @@ + + + +# currentOrgInfoController property + + + + + + + + + +[StreamController](https://api.flutter.dev/flutter/dart-async/StreamController-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> currentOrgInfoController + + + + + + + + +## Implementation + +```dart +StreamController get currentOrgInfoController => + _currentOrgInfoController; +``` + + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig/currentOrgInfoStream.md b/talawa-mobile-docs/services_user_config/UserConfig/currentOrgInfoStream.md new file mode 100644 index 000000000..4a2a60ece --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/currentOrgInfoStream.md @@ -0,0 +1,35 @@ + + + +# currentOrgInfoStream property + + + + + + + + + +[Stream](https://api.flutter.dev/flutter/dart-async/Stream-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> currentOrgInfoStream + + + + + + + + +## Implementation + +```dart +Stream get currentOrgInfoStream => _currentOrgInfoStream; +``` + + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig/currentOrgName.md b/talawa-mobile-docs/services_user_config/UserConfig/currentOrgName.md new file mode 100644 index 000000000..64d6a00c5 --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/currentOrgName.md @@ -0,0 +1,35 @@ + + + +# currentOrgName property + + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) currentOrgName + + + + + + + + +## Implementation + +```dart +String get currentOrgName => _currentOrg!.name!; +``` + + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig/currentUser.md b/talawa-mobile-docs/services_user_config/UserConfig/currentUser.md new file mode 100644 index 000000000..77f70037a --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/currentUser.md @@ -0,0 +1,55 @@ + + + +# currentUser property + + + + + + + + + +[User](../../models_user_user_info/User-class.md) currentUser + + + + + + + + +## Implementation + +```dart +User get currentUser => _currentUser!; +``` + + + + + +currentUser= +([User](../../models_user_user_info/User-class.md) user) + + + + + + + +## Implementation + +```dart +set currentUser(User user) { + _currentUser = user; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig/initialiseStream.md b/talawa-mobile-docs/services_user_config/UserConfig/initialiseStream.md new file mode 100644 index 000000000..0fda93269 --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/initialiseStream.md @@ -0,0 +1,37 @@ + + + +# initialiseStream method + + + + + + + + +void initialiseStream +() + + + + + + + + +## Implementation + +```dart +void initialiseStream() { + _currentOrgInfoStream = + _currentOrgInfoController.stream.asBroadcastStream(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig/saveCurrentOrgInHive.md b/talawa-mobile-docs/services_user_config/UserConfig/saveCurrentOrgInHive.md new file mode 100644 index 000000000..6eb038ac8 --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/saveCurrentOrgInHive.md @@ -0,0 +1,43 @@ + + + +# saveCurrentOrgInHive method + + + + + + + + +void saveCurrentOrgInHive +([OrgInfo](../../models_organization_org_info/OrgInfo-class.md) saveOrgAsCurrent) + + + + + + + + +## Implementation + +```dart +void 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/talawa-mobile-docs/services_user_config/UserConfig/saveUserInHive.md b/talawa-mobile-docs/services_user_config/UserConfig/saveUserInHive.md new file mode 100644 index 000000000..53dcd9a8a --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/saveUserInHive.md @@ -0,0 +1,41 @@ + + + +# saveUserInHive method + + + + + + + + +void saveUserInHive +() + + + + + + + + +## Implementation + +```dart +void saveUserInHive() { + final box = Hive.box('currentUser'); + if (box.get('user') == null) { + box.put('user', _currentUser!); + } else { + box.put('user', _currentUser!); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig/updateAccessToken.md b/talawa-mobile-docs/services_user_config/UserConfig/updateAccessToken.md new file mode 100644 index 000000000..7d38a3491 --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/updateAccessToken.md @@ -0,0 +1,47 @@ + + + +# updateAccessToken method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) updateAccessToken +({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) accessToken, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) refreshToken}) + + + + + +

This function is used to updated the access token of the user.

+

params:

+
    +
  • accessToken
  • +
  • refreshToken
  • +
+ + + +## Implementation + +```dart +Future updateAccessToken({ + required String accessToken, + required String refreshToken, +}) async { + _currentUser!.refreshToken = refreshToken; + _currentUser!.authToken = accessToken; + saveUserInHive(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig/updateUser.md b/talawa-mobile-docs/services_user_config/UserConfig/updateUser.md new file mode 100644 index 000000000..d10b9600b --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/updateUser.md @@ -0,0 +1,50 @@ + + + +# updateUser method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> updateUser +([User](../../models_user_user_info/User-class.md) updatedUserDetails) + + + + + +

This function is used to update the user details.

+

params:

+
    +
  • updatedUserDetails : User type variable containing all the details of an user need to be updated.
  • +
+ + + +## Implementation + +```dart +Future updateUser(User updatedUserDetails) async { + try { + _currentUser = updatedUserDetails; + saveUserInHive(); + graphqlConfig.getToken(); + databaseFunctions.init(); + return true; + } on Exception catch (e) { + debugPrint(e.toString()); + return false; + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig/updateUserAdminOrg.md b/talawa-mobile-docs/services_user_config/UserConfig/updateUserAdminOrg.md new file mode 100644 index 000000000..399b73f5e --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/updateUserAdminOrg.md @@ -0,0 +1,42 @@ + + + +# updateUserAdminOrg method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) updateUserAdminOrg +([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> orgDetails) + + + + + +

This function is used to update the organization admin.

+

params:

+
    +
  • orgDetails : details of the organization.
  • +
+ + + +## Implementation + +```dart +Future updateUserAdminOrg(List orgDetails) async { + _currentUser!.updateAdminFor(orgDetails); + saveUserInHive(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig/updateUserCreatedOrg.md b/talawa-mobile-docs/services_user_config/UserConfig/updateUserCreatedOrg.md new file mode 100644 index 000000000..36ff305c0 --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/updateUserCreatedOrg.md @@ -0,0 +1,42 @@ + + + +# updateUserCreatedOrg method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) updateUserCreatedOrg +([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> orgDetails) + + + + + +

This function is used to update the user created organization.

+

params:

+
    +
  • orgDetails : details of the organization that user created.
  • +
+ + + +## Implementation + +```dart +Future updateUserCreatedOrg(List orgDetails) async { + _currentUser!.updateCreatedOrg(orgDetails); + saveUserInHive(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig/updateUserJoinedOrg.md b/talawa-mobile-docs/services_user_config/UserConfig/updateUserJoinedOrg.md new file mode 100644 index 000000000..2b99aa06a --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/updateUserJoinedOrg.md @@ -0,0 +1,42 @@ + + + +# updateUserJoinedOrg method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) updateUserJoinedOrg +([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> orgDetails) + + + + + +

This function is used to update the user joined organization.

+

params:

+
    +
  • orgDetails : details of the organization that user joined.
  • +
+ + + +## Implementation + +```dart +Future updateUserJoinedOrg(List orgDetails) async { + _currentUser!.updateJoinedOrg(orgDetails); + saveUserInHive(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig/updateUserMemberRequestOrg.md b/talawa-mobile-docs/services_user_config/UserConfig/updateUserMemberRequestOrg.md new file mode 100644 index 000000000..8cef35b6a --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/updateUserMemberRequestOrg.md @@ -0,0 +1,42 @@ + + + +# updateUserMemberRequestOrg method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) updateUserMemberRequestOrg +([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> orgDetails) + + + + + +

This function is used to update the user request to join the organization.

+

params:

+
    +
  • orgDetails : details of the organization that user requested to join.
  • +
+ + + +## Implementation + +```dart +Future updateUserMemberRequestOrg(List orgDetails) async { + _currentUser!.updateMemberRequestOrg(orgDetails); + saveUserInHive(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/UserConfig/userLoggedIn.md b/talawa-mobile-docs/services_user_config/UserConfig/userLoggedIn.md new file mode 100644 index 000000000..7ff776029 --- /dev/null +++ b/talawa-mobile-docs/services_user_config/UserConfig/userLoggedIn.md @@ -0,0 +1,78 @@ + + + +# userLoggedIn method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> userLoggedIn +() + + + + + +

This function is used to log in the user.

+ + + +## Implementation + +```dart +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 there is not currentUser then returns false. + if (_currentUser == null) { + _currentUser = User(id: 'null', authToken: 'null'); + return false; + } + // generate access token + graphqlConfig.getToken().then((value) async { + databaseFunctions.init(); + try { + final QueryResult result = await databaseFunctions.gqlAuthQuery( + 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.showTalawaErrorSnackBar( + "Couldn't update User details", + MessageType.error, + ); + } + }); + return true; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/services_user_config/services_user_config-library.md b/talawa-mobile-docs/services_user_config/services_user_config-library.md new file mode 100644 index 000000000..3fb10c55d --- /dev/null +++ b/talawa-mobile-docs/services_user_config/services_user_config-library.md @@ -0,0 +1,38 @@ + + + + +# user_config library + + + + + + + + + + + +## Classes + +##### [UserConfig](../services_user_config/UserConfig-class.md) + + + +UserConfig class provides different services in the context of the User. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/splash_screen/SplashScreen-class.md b/talawa-mobile-docs/splash_screen/SplashScreen-class.md new file mode 100644 index 000000000..ec5863795 --- /dev/null +++ b/talawa-mobile-docs/splash_screen/SplashScreen-class.md @@ -0,0 +1,199 @@ + + + +# SplashScreen class + + + + + + + + + +

This widget return the SplashScreen. Splash Screen is the first screen that +we see when we run our application. It is also known as Launch Screen.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- SplashScreen + + + + + + + + +## Constructors + +[SplashScreen](../splash_screen/SplashScreen/SplashScreen.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, [int](https://api.flutter.dev/flutter/dart-core/int-class.html) mainScreenIndex = 0}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [mainScreenIndex](../splash_screen/SplashScreen/mainScreenIndex.md) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../splash_screen/SplashScreen/createState.md)() _SplashScreenState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/splash_screen/SplashScreen/SplashScreen.md b/talawa-mobile-docs/splash_screen/SplashScreen/SplashScreen.md new file mode 100644 index 000000000..f1eb432e8 --- /dev/null +++ b/talawa-mobile-docs/splash_screen/SplashScreen/SplashScreen.md @@ -0,0 +1,30 @@ + + + +# SplashScreen constructor + + + + + + +const +SplashScreen({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, [int](https://api.flutter.dev/flutter/dart-core/int-class.html) mainScreenIndex = 0}) + + + + + +## Implementation + +```dart +const SplashScreen({required Key key, this.mainScreenIndex = 0}) + : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/splash_screen/SplashScreen/createState.md b/talawa-mobile-docs/splash_screen/SplashScreen/createState.md new file mode 100644 index 000000000..23428f6f6 --- /dev/null +++ b/talawa-mobile-docs/splash_screen/SplashScreen/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_SplashScreenState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_SplashScreenState createState() => _SplashScreenState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/splash_screen/SplashScreen/mainScreenIndex.md b/talawa-mobile-docs/splash_screen/SplashScreen/mainScreenIndex.md new file mode 100644 index 000000000..570058a34 --- /dev/null +++ b/talawa-mobile-docs/splash_screen/SplashScreen/mainScreenIndex.md @@ -0,0 +1,32 @@ + + + +# mainScreenIndex property + + + + + + + +[int](https://api.flutter.dev/flutter/dart-core/int-class.html) mainScreenIndex + +_final_ + + + + + + +## Implementation + +```dart +final int mainScreenIndex; +``` + + + + + + + diff --git a/talawa-mobile-docs/splash_screen/splash_screen-library.md b/talawa-mobile-docs/splash_screen/splash_screen-library.md new file mode 100644 index 000000000..ea4583ae6 --- /dev/null +++ b/talawa-mobile-docs/splash_screen/splash_screen-library.md @@ -0,0 +1,39 @@ + + + + +# splash_screen library + + + + + + + + + + + +## Classes + +##### [SplashScreen](../splash_screen/SplashScreen-class.md) + + + +This widget return the SplashScreen. Splash Screen is the first screen that +we see when we run our application. It is also known as Launch Screen. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizations-class.md b/talawa-mobile-docs/utils_app_localization/AppLocalizations-class.md new file mode 100644 index 000000000..d54ee7ff2 --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizations-class.md @@ -0,0 +1,169 @@ + + + +# AppLocalizations class + + + + + + + + + +

This class provides methods to localize the application so that it can be available +to users with different languages.

+ + + + +## Constructors + +[AppLocalizations](../utils_app_localization/AppLocalizations/AppLocalizations.md) ([Locale](https://api.flutter.dev/flutter/dart-ui/Locale-class.html) locale, {[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isTest = false}) + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [isTest](../utils_app_localization/AppLocalizations/isTest.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read / write_ + + + +##### [locale](../utils_app_localization/AppLocalizations/locale.md) → [Locale](https://api.flutter.dev/flutter/dart-ui/Locale-class.html) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [load](../utils_app_localization/AppLocalizations/load.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> + + + + + + + + +##### [loadTest](../utils_app_localization/AppLocalizations/loadTest.md)([Locale](https://api.flutter.dev/flutter/dart-ui/Locale-class.html) locale) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[AppLocalizations](../utils_app_localization/AppLocalizations-class.md)> + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [strictTranslate](../utils_app_localization/AppLocalizations/strictTranslate.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) key) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [translate](../utils_app_localization/AppLocalizations/translate.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html)? key) [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + + + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + +## Static Methods + +##### [of](../utils_app_localization/AppLocalizations/of.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [AppLocalizations](../utils_app_localization/AppLocalizations-class.md)? + + + + + + + + + + + +## Constants + +##### [delegate](../utils_app_localization/AppLocalizations/delegate-constant.md) const [LocalizationsDelegate](https://api.flutter.dev/flutter/widgets/LocalizationsDelegate-class.html)<[AppLocalizations](../utils_app_localization/AppLocalizations-class.md)> + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizations/AppLocalizations.md b/talawa-mobile-docs/utils_app_localization/AppLocalizations/AppLocalizations.md new file mode 100644 index 000000000..bb06e087a --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizations/AppLocalizations.md @@ -0,0 +1,32 @@ + + + +# AppLocalizations constructor + + + + + + + +AppLocalizations([Locale](https://api.flutter.dev/flutter/dart-ui/Locale-class.html) locale, {[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isTest = false}) + + + + + +## Implementation + +```dart +AppLocalizations( + this.locale, { + this.isTest = false, +}); +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizations/delegate-constant.md b/talawa-mobile-docs/utils_app_localization/AppLocalizations/delegate-constant.md new file mode 100644 index 000000000..3725a88e1 --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizations/delegate-constant.md @@ -0,0 +1,33 @@ + + + +# delegate constant + + + + + + + +[LocalizationsDelegate](https://api.flutter.dev/flutter/widgets/LocalizationsDelegate-class.html)<[AppLocalizations](../../utils_app_localization/AppLocalizations-class.md)> const delegate + + + + + + + + +## Implementation + +```dart +static const LocalizationsDelegate delegate = + AppLocalizationsDelegate(); +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizations/isTest.md b/talawa-mobile-docs/utils_app_localization/AppLocalizations/isTest.md new file mode 100644 index 000000000..9f3b4dc75 --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizations/isTest.md @@ -0,0 +1,32 @@ + + + +# isTest property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isTest + +_read / write_ + + + + + + +## Implementation + +```dart +bool isTest; +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizations/load.md b/talawa-mobile-docs/utils_app_localization/AppLocalizations/load.md new file mode 100644 index 000000000..9cfd30ec1 --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizations/load.md @@ -0,0 +1,46 @@ + + + +# load method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> load +() + + + + + + + + +## Implementation + +```dart +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; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizations/loadTest.md b/talawa-mobile-docs/utils_app_localization/AppLocalizations/loadTest.md new file mode 100644 index 000000000..4f4197b06 --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizations/loadTest.md @@ -0,0 +1,36 @@ + + + +# loadTest method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[AppLocalizations](../../utils_app_localization/AppLocalizations-class.md)> loadTest +([Locale](https://api.flutter.dev/flutter/dart-ui/Locale-class.html) locale) + + + + + + + + +## Implementation + +```dart +Future loadTest(Locale locale) async { + return AppLocalizations(locale); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizations/locale.md b/talawa-mobile-docs/utils_app_localization/AppLocalizations/locale.md new file mode 100644 index 000000000..ba00de796 --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizations/locale.md @@ -0,0 +1,32 @@ + + + +# locale property + + + + + + + +[Locale](https://api.flutter.dev/flutter/dart-ui/Locale-class.html) locale + +_final_ + + + + + + +## Implementation + +```dart +final Locale locale; +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizations/of.md b/talawa-mobile-docs/utils_app_localization/AppLocalizations/of.md new file mode 100644 index 000000000..492424bf7 --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizations/of.md @@ -0,0 +1,36 @@ + + + +# of method + + + + + + + + +[AppLocalizations](../../utils_app_localization/AppLocalizations-class.md)? of +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + + + + + + + + +## Implementation + +```dart +static AppLocalizations? of(BuildContext context) { + return Localizations.of(context, AppLocalizations); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizations/strictTranslate.md b/talawa-mobile-docs/utils_app_localization/AppLocalizations/strictTranslate.md new file mode 100644 index 000000000..e05a4107d --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizations/strictTranslate.md @@ -0,0 +1,44 @@ + + + +# strictTranslate method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) strictTranslate +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) key) + + + + + + + + +## Implementation + +```dart +String strictTranslate(String key) { + if (isTest) return key; + + // ignore: unnecessary_null_comparison + if (key == null) { + return '...'; + } + + final String translate = _localizedStrings[key] ?? key; + return translate; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizations/translate.md b/talawa-mobile-docs/utils_app_localization/AppLocalizations/translate.md new file mode 100644 index 000000000..0b7412122 --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizations/translate.md @@ -0,0 +1,42 @@ + + + +# translate method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? translate +([String](https://api.flutter.dev/flutter/dart-core/String-class.html)? key) + + + + + + + + +## Implementation + +```dart +String? translate(String? key) { + if (isTest) return key; + + // ignore: unnecessary_null_comparison + if (key == null) { + return '...'; + } + return _localizedStrings[key]; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate-class.md b/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate-class.md new file mode 100644 index 000000000..0c6f3c2d0 --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate-class.md @@ -0,0 +1,150 @@ + + + +# AppLocalizationsDelegate class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [LocalizationsDelegate](https://api.flutter.dev/flutter/widgets/LocalizationsDelegate-class.html)<[AppLocalizations](../utils_app_localization/AppLocalizations-class.md)> +- AppLocalizationsDelegate + + + + + + + + +## Constructors + +[AppLocalizationsDelegate](../utils_app_localization/AppLocalizationsDelegate/AppLocalizationsDelegate.md) ({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isTest = false}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [isTest](../utils_app_localization/AppLocalizationsDelegate/isTest.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [type](https://api.flutter.dev/flutter/widgets/LocalizationsDelegate/type.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +The type of the object returned by the load method, T by default. +_read-onlyinherited_ + + + + + +## Methods + +##### [isSupported](../utils_app_localization/AppLocalizationsDelegate/isSupported.md)([Locale](https://api.flutter.dev/flutter/dart-ui/Locale-class.html) locale) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether resources for the given locale can be loaded by this delegate. +_override_ + + + +##### [load](../utils_app_localization/AppLocalizationsDelegate/load.md)([Locale](https://api.flutter.dev/flutter/dart-ui/Locale-class.html) locale) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[AppLocalizations](../utils_app_localization/AppLocalizations-class.md)> + + + +Start loading the resources for locale. The returned future completes +when the resources have finished loading. +_override_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [shouldReload](../utils_app_localization/AppLocalizationsDelegate/shouldReload.md)(covariant [AppLocalizationsDelegate](../utils_app_localization/AppLocalizationsDelegate-class.md) old) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Returns true if the resources for this delegate should be loaded +again by calling the load method. +_override_ + + + +##### [toString](https://api.flutter.dev/flutter/widgets/LocalizationsDelegate/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/AppLocalizationsDelegate.md b/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/AppLocalizationsDelegate.md new file mode 100644 index 000000000..3f42f908e --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/AppLocalizationsDelegate.md @@ -0,0 +1,31 @@ + + + +# AppLocalizationsDelegate constructor + + + + + + +const +AppLocalizationsDelegate({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isTest = false}) + + + + + +## Implementation + +```dart +const AppLocalizationsDelegate({ + this.isTest = false, +}); +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/isSupported.md b/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/isSupported.md new file mode 100644 index 000000000..e2529fec1 --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/isSupported.md @@ -0,0 +1,43 @@ + + + +# isSupported method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isSupported +([Locale](https://api.flutter.dev/flutter/dart-ui/Locale-class.html) locale) + +_override_ + + + +

Whether resources for the given locale can be loaded by this delegate.

+

Return true if the instance of T loaded by this delegate's load +method supports the given locale's language.

+ + + +## Implementation + +```dart +@override +bool isSupported(Locale locale) { + // Include all of your supported language codes here + return ['en', 'es', 'fr', 'hi', 'zh', 'de', 'ja', 'pt'] + .contains(locale.languageCode); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/isTest.md b/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/isTest.md new file mode 100644 index 000000000..e6e920cda --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/isTest.md @@ -0,0 +1,32 @@ + + + +# isTest property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isTest + +_final_ + + + + + + +## Implementation + +```dart +final bool isTest; +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/load.md b/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/load.md new file mode 100644 index 000000000..0e0684946 --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/load.md @@ -0,0 +1,52 @@ + + + +# load method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[AppLocalizations](../../utils_app_localization/AppLocalizations-class.md)> load +([Locale](https://api.flutter.dev/flutter/dart-ui/Locale-class.html) locale) + +_override_ + + + +

Start loading the resources for locale. The returned future completes +when the resources have finished loading.

+

It's assumed that this method will return an object that contains a +collection of related string resources (typically defined with one method +per resource). The object will be retrieved with Localizations.of.

+ + + +## Implementation + +```dart +@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; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/shouldReload.md b/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/shouldReload.md new file mode 100644 index 000000000..232890b37 --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/AppLocalizationsDelegate/shouldReload.md @@ -0,0 +1,41 @@ + + + +# shouldReload method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) shouldReload +(covariant [AppLocalizationsDelegate](../../utils_app_localization/AppLocalizationsDelegate-class.md) old) + +_override_ + + + +

Returns true if the resources for this delegate should be loaded +again by calling the load method.

+

This method is called whenever its Localizations widget is +rebuilt. If it returns true then dependent widgets will be rebuilt +after load has completed.

+ + + +## Implementation + +```dart +@override +bool shouldReload(AppLocalizationsDelegate old) => false; +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_app_localization/utils_app_localization-library.md b/talawa-mobile-docs/utils_app_localization/utils_app_localization-library.md new file mode 100644 index 000000000..7bfdb2bfc --- /dev/null +++ b/talawa-mobile-docs/utils_app_localization/utils_app_localization-library.md @@ -0,0 +1,46 @@ + + + + +# app_localization library + + + + + + + + + + + +## Classes + +##### [AppLocalizations](../utils_app_localization/AppLocalizations-class.md) + + + +This class provides methods to localize the application so that it can be available +to users with different languages. + + +##### [AppLocalizationsDelegate](../utils_app_localization/AppLocalizationsDelegate-class.md) + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_chat_queries/ChatQueries-class.md b/talawa-mobile-docs/utils_chat_queries/ChatQueries-class.md new file mode 100644 index 000000000..3c20eb991 --- /dev/null +++ b/talawa-mobile-docs/utils_chat_queries/ChatQueries-class.md @@ -0,0 +1,128 @@ + + + +# ChatQueries class + + + + + + + + + +

This class creates the queries dealing with chats.

+ + + + +## Constructors + +[ChatQueries](../utils_chat_queries/ChatQueries/ChatQueries.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [messageSentToDirectChatsubscription](../utils_chat_queries/ChatQueries/messageSentToDirectChatsubscription.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read-only_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [fetchDirectChatMessagesByChatId](../utils_chat_queries/ChatQueries/fetchDirectChatMessagesByChatId.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) chatId) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [fetchDirectChatsByUserId](../utils_chat_queries/ChatQueries/fetchDirectChatsByUserId.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) userId) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [sendMessageToDirectChat](../utils_chat_queries/ChatQueries/sendMessageToDirectChat.md)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_chat_queries/ChatQueries/ChatQueries.md b/talawa-mobile-docs/utils_chat_queries/ChatQueries/ChatQueries.md new file mode 100644 index 000000000..55e0facb0 --- /dev/null +++ b/talawa-mobile-docs/utils_chat_queries/ChatQueries/ChatQueries.md @@ -0,0 +1,24 @@ + + + +# ChatQueries constructor + + + + + + + +ChatQueries() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_chat_queries/ChatQueries/fetchDirectChatMessagesByChatId.md b/talawa-mobile-docs/utils_chat_queries/ChatQueries/fetchDirectChatMessagesByChatId.md new file mode 100644 index 000000000..c18224b70 --- /dev/null +++ b/talawa-mobile-docs/utils_chat_queries/ChatQueries/fetchDirectChatMessagesByChatId.md @@ -0,0 +1,53 @@ + + + +# fetchDirectChatMessagesByChatId method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) fetchDirectChatMessagesByChatId +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) chatId) + + + + + + + + +## Implementation + +```dart +String fetchDirectChatMessagesByChatId(String chatId) { + return ''' + query { + directChatsMessagesByChatID(id: "$chatId") { + _id + messageContent + sender { + _id + firstName + image + } + receiver { + _id + firstName + image + } + } + } + '''; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_chat_queries/ChatQueries/fetchDirectChatsByUserId.md b/talawa-mobile-docs/utils_chat_queries/ChatQueries/fetchDirectChatsByUserId.md new file mode 100644 index 000000000..37412a513 --- /dev/null +++ b/talawa-mobile-docs/utils_chat_queries/ChatQueries/fetchDirectChatsByUserId.md @@ -0,0 +1,47 @@ + + + +# fetchDirectChatsByUserId method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) fetchDirectChatsByUserId +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) userId) + + + + + + + + +## Implementation + +```dart +String fetchDirectChatsByUserId(String userId) { + return ''' + query { + directChatsByUserID(id: "$userId") { + _id + users{ + _id + firstName + email + } + } + } + '''; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_chat_queries/ChatQueries/messageSentToDirectChatsubscription.md b/talawa-mobile-docs/utils_chat_queries/ChatQueries/messageSentToDirectChatsubscription.md new file mode 100644 index 000000000..9a57c45da --- /dev/null +++ b/talawa-mobile-docs/utils_chat_queries/ChatQueries/messageSentToDirectChatsubscription.md @@ -0,0 +1,52 @@ + + + +# messageSentToDirectChatsubscription property + + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) messageSentToDirectChatsubscription + + + + + + + + +## Implementation + +```dart +String get messageSentToDirectChatsubscription => ''' + subscription{ + messageSentToDirectChat{ + _id + messageContent + sender { + _id + firstName + image + } + receiver { + _id + firstName + image + } + } + } +'''; +``` + + + + + + + + diff --git a/talawa-mobile-docs/utils_chat_queries/ChatQueries/sendMessageToDirectChat.md b/talawa-mobile-docs/utils_chat_queries/ChatQueries/sendMessageToDirectChat.md new file mode 100644 index 000000000..55f028004 --- /dev/null +++ b/talawa-mobile-docs/utils_chat_queries/ChatQueries/sendMessageToDirectChat.md @@ -0,0 +1,54 @@ + + + +# sendMessageToDirectChat method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) sendMessageToDirectChat +() + + + + + + + + +## Implementation + +```dart +String sendMessageToDirectChat() { + return ''' + mutation sendMessageToDirectChat( + \$chatId: ID! + \$messageContent: String! + ){ + sendMessageToDirectChat( + chatId: \$chatId + messageContent: \$messageContent + ) { + messageContent + sender{ + firstName + } + receiver{ + firstName + } + } + } + '''; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_chat_queries/utils_chat_queries-library.md b/talawa-mobile-docs/utils_chat_queries/utils_chat_queries-library.md new file mode 100644 index 000000000..6d67046a3 --- /dev/null +++ b/talawa-mobile-docs/utils_chat_queries/utils_chat_queries-library.md @@ -0,0 +1,38 @@ + + + + +# chat_queries library + + + + + + + + + + + +## Classes + +##### [ChatQueries](../utils_chat_queries/ChatQueries-class.md) + + + +This class creates the queries dealing with chats. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_comment_queries/CommentQueries-class.md b/talawa-mobile-docs/utils_comment_queries/CommentQueries-class.md new file mode 100644 index 000000000..f32182947 --- /dev/null +++ b/talawa-mobile-docs/utils_comment_queries/CommentQueries-class.md @@ -0,0 +1,110 @@ + + + +# CommentQueries class + + + + + + + + + +

This class creates the queries dealing with comments.

+ + + + +## Constructors + +[CommentQueries](../utils_comment_queries/CommentQueries/CommentQueries.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createComment](../utils_comment_queries/CommentQueries/createComment.md)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [getPostsComments](../utils_comment_queries/CommentQueries/getPostsComments.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) postId) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_comment_queries/CommentQueries/CommentQueries.md b/talawa-mobile-docs/utils_comment_queries/CommentQueries/CommentQueries.md new file mode 100644 index 000000000..ce3490c52 --- /dev/null +++ b/talawa-mobile-docs/utils_comment_queries/CommentQueries/CommentQueries.md @@ -0,0 +1,24 @@ + + + +# CommentQueries constructor + + + + + + + +CommentQueries() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_comment_queries/CommentQueries/createComment.md b/talawa-mobile-docs/utils_comment_queries/CommentQueries/createComment.md new file mode 100644 index 000000000..3557c7507 --- /dev/null +++ b/talawa-mobile-docs/utils_comment_queries/CommentQueries/createComment.md @@ -0,0 +1,46 @@ + + + +# createComment method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) createComment +() + + + + + + + + +## Implementation + +```dart +String createComment() { + return """ + mutation createComment(\$postId: ID!, \$text: String!) { + createComment(postId: \$postId, + data:{ + text: \$text, + } + ){ + _id + } + } +"""; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_comment_queries/CommentQueries/getPostsComments.md b/talawa-mobile-docs/utils_comment_queries/CommentQueries/getPostsComments.md new file mode 100644 index 000000000..b497be68e --- /dev/null +++ b/talawa-mobile-docs/utils_comment_queries/CommentQueries/getPostsComments.md @@ -0,0 +1,48 @@ + + + +# getPostsComments method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) getPostsComments +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) postId) + + + + + + + + +## Implementation + +```dart +String getPostsComments(String postId) { + return """ + query{ + commentsByPost(id: "$postId"){ + _id + text + createdAt + creator{ + firstName + lastName + } + } + } + """; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_comment_queries/utils_comment_queries-library.md b/talawa-mobile-docs/utils_comment_queries/utils_comment_queries-library.md new file mode 100644 index 000000000..9e0b120ae --- /dev/null +++ b/talawa-mobile-docs/utils_comment_queries/utils_comment_queries-library.md @@ -0,0 +1,38 @@ + + + + +# comment_queries library + + + + + + + + + + + +## Classes + +##### [CommentQueries](../utils_comment_queries/CommentQueries-class.md) + + + +This class creates the queries dealing with comments. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_event_queries/EventQueries-class.md b/talawa-mobile-docs/utils_event_queries/EventQueries-class.md new file mode 100644 index 000000000..102d42421 --- /dev/null +++ b/talawa-mobile-docs/utils_event_queries/EventQueries-class.md @@ -0,0 +1,146 @@ + + + +# EventQueries class + + + + + + + + + +

This class creates queries related to the events.

+ + + + +## Constructors + +[EventQueries](../utils_event_queries/EventQueries/EventQueries.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [addEvent](../utils_event_queries/EventQueries/addEvent.md)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [deleteEvent](../utils_event_queries/EventQueries/deleteEvent.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) id) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [fetchOrgEvents](../utils_event_queries/EventQueries/fetchOrgEvents.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [registerForEvent](../utils_event_queries/EventQueries/registerForEvent.md)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [registrantsByEvent](../utils_event_queries/EventQueries/registrantsByEvent.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [updateEvent](../utils_event_queries/EventQueries/updateEvent.md)({dynamic eventId}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_event_queries/EventQueries/EventQueries.md b/talawa-mobile-docs/utils_event_queries/EventQueries/EventQueries.md new file mode 100644 index 000000000..817931179 --- /dev/null +++ b/talawa-mobile-docs/utils_event_queries/EventQueries/EventQueries.md @@ -0,0 +1,24 @@ + + + +# EventQueries constructor + + + + + + + +EventQueries() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_event_queries/EventQueries/addEvent.md b/talawa-mobile-docs/utils_event_queries/EventQueries/addEvent.md new file mode 100644 index 000000000..d82a4ff80 --- /dev/null +++ b/talawa-mobile-docs/utils_event_queries/EventQueries/addEvent.md @@ -0,0 +1,71 @@ + + + +# addEvent method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) addEvent +() + + + + + + + + +## Implementation + +```dart +String addEvent() { + return """ + mutation createEvent( \$organizationId: ID!, + \$title:String!, + \$description: String!, + \$startTime: Time, + \$endTime: Time, + \$allDay: Boolean!, + \$recurring: Boolean!, + \$isPublic: Boolean!, + \$isRegisterable: Boolean!, + \$location: String, + \$startDate : Date!, + \$endDate : Date!, + ) { + 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 + } + } +"""; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_event_queries/EventQueries/deleteEvent.md b/talawa-mobile-docs/utils_event_queries/EventQueries/deleteEvent.md new file mode 100644 index 000000000..fd57a07e3 --- /dev/null +++ b/talawa-mobile-docs/utils_event_queries/EventQueries/deleteEvent.md @@ -0,0 +1,44 @@ + + + +# deleteEvent method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) deleteEvent +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) id) + + + + + + + + +## Implementation + +```dart +String deleteEvent(String id) { + return """ + mutation { + removeEvent( + id: "$id", + ){ + _id + } + } + """; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_event_queries/EventQueries/fetchOrgEvents.md b/talawa-mobile-docs/utils_event_queries/EventQueries/fetchOrgEvents.md new file mode 100644 index 000000000..9c6a6308f --- /dev/null +++ b/talawa-mobile-docs/utils_event_queries/EventQueries/fetchOrgEvents.md @@ -0,0 +1,72 @@ + + + +# fetchOrgEvents method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) fetchOrgEvents +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId) + + + + + + + + +## Implementation + +```dart +String fetchOrgEvents(String orgId) { + return """ + query { + eventsByOrganization(id: "$orgId"){ + _id + organization { + _id + image + } + title + description + isPublic + isRegisterable + recurring + recurrance + startDate + endDate + allDay + startTime + endTime + location + creator{ + _id + firstName + lastName + } + admins { + firstName + lastName + } + registrants { + user { + _id + } + } + } + } + """; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_event_queries/EventQueries/registerForEvent.md b/talawa-mobile-docs/utils_event_queries/EventQueries/registerForEvent.md new file mode 100644 index 000000000..c99105710 --- /dev/null +++ b/talawa-mobile-docs/utils_event_queries/EventQueries/registerForEvent.md @@ -0,0 +1,45 @@ + + + +# registerForEvent method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) registerForEvent +() + + + + + + + + +## Implementation + +```dart +String registerForEvent() { + return """ + mutation registerForEvent(\$eventId: ID!) { + registerForEvent(id: \$eventId) + { + _id + title + description + } + } +"""; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_event_queries/EventQueries/registrantsByEvent.md b/talawa-mobile-docs/utils_event_queries/EventQueries/registrantsByEvent.md new file mode 100644 index 000000000..36f685036 --- /dev/null +++ b/talawa-mobile-docs/utils_event_queries/EventQueries/registrantsByEvent.md @@ -0,0 +1,45 @@ + + + +# registrantsByEvent method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) registrantsByEvent +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) + + + + + + + + +## Implementation + +```dart +String registrantsByEvent(String eventId) { + return ''' + query { + registrantsByEvent(id: "$eventId") { + _id + firstName + lastName + image + } + } + '''; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_event_queries/EventQueries/updateEvent.md b/talawa-mobile-docs/utils_event_queries/EventQueries/updateEvent.md new file mode 100644 index 000000000..3d5cf74f9 --- /dev/null +++ b/talawa-mobile-docs/utils_event_queries/EventQueries/updateEvent.md @@ -0,0 +1,67 @@ + + + +# updateEvent method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) updateEvent +({dynamic eventId}) + + + + + + + + +## Implementation + +```dart +String updateEvent({ + eventId, +}) { + return """mutation updateEvent( + \$title:String!, + \$description: String!, + \$startTime: Time, + \$endTime: Time, + \$allDay: Boolean!, + \$recurring: Boolean!, + \$isPublic: Boolean!, + \$isRegisterable: Boolean!, + \$location: String, + ) { + updateEvent( + id: "$eventId" + data:{ + title: \$title, + description: \$description, + isPublic: \$isPublic, + isRegisterable: \$isRegisterable, + recurring: \$recurring, + allDay: \$allDay, + startTime: \$startTime + endTime: \$endTime + location: \$location + } + ){ + _id + title + description + } + }"""; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_event_queries/utils_event_queries-library.md b/talawa-mobile-docs/utils_event_queries/utils_event_queries-library.md new file mode 100644 index 000000000..c69f1c400 --- /dev/null +++ b/talawa-mobile-docs/utils_event_queries/utils_event_queries-library.md @@ -0,0 +1,38 @@ + + + + +# event_queries library + + + + + + + + + + + +## Classes + +##### [EventQueries](../utils_event_queries/EventQueries-class.md) + + + +This class creates queries related to the events. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_post_queries/PostQueries-class.md b/talawa-mobile-docs/utils_post_queries/PostQueries-class.md new file mode 100644 index 000000000..c42cbf66c --- /dev/null +++ b/talawa-mobile-docs/utils_post_queries/PostQueries-class.md @@ -0,0 +1,128 @@ + + + +# PostQueries class + + + + + + + + + +

This class creates queries related to posts.

+ + + + +## Constructors + +[PostQueries](../utils_post_queries/PostQueries/PostQueries.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [addLike](../utils_post_queries/PostQueries/addLike.md)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Add Like to a post. + + + + +##### [getPostsById](../utils_post_queries/PostQueries/getPostsById.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Getting Posts by Id. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [removeLike](../utils_post_queries/PostQueries/removeLike.md)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Remove Like from a post. + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [uploadPost](../utils_post_queries/PostQueries/uploadPost.md)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Upload a post to database. + + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_post_queries/PostQueries/PostQueries.md b/talawa-mobile-docs/utils_post_queries/PostQueries/PostQueries.md new file mode 100644 index 000000000..6e2213d08 --- /dev/null +++ b/talawa-mobile-docs/utils_post_queries/PostQueries/PostQueries.md @@ -0,0 +1,24 @@ + + + +# PostQueries constructor + + + + + + + +PostQueries() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_post_queries/PostQueries/addLike.md b/talawa-mobile-docs/utils_post_queries/PostQueries/addLike.md new file mode 100644 index 000000000..75f191c97 --- /dev/null +++ b/talawa-mobile-docs/utils_post_queries/PostQueries/addLike.md @@ -0,0 +1,50 @@ + + + +# addLike method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) addLike +() + + + + + +

Add Like to a post.

+

params: + None

+

returns:

+
    +
  • String: The query related to addingLike
  • +
+ + + +## Implementation + +```dart +String addLike() { + return """ + mutation likePost(\$postID: ID!) { + likePost( id: \$postID,) + { + _id + } + } +"""; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_post_queries/PostQueries/getPostsById.md b/talawa-mobile-docs/utils_post_queries/PostQueries/getPostsById.md new file mode 100644 index 000000000..ed6fb741c --- /dev/null +++ b/talawa-mobile-docs/utils_post_queries/PostQueries/getPostsById.md @@ -0,0 +1,74 @@ + + + +# getPostsById method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) getPostsById +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId) + + + + + +

Getting Posts by Id.

+

params:

+
    +
  • orgId: The organisation id
  • +
+

returns:

+
    +
  • String: The query related to gettingPostsbyId
  • +
+ + + +## Implementation + +```dart +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 + } + } + } +"""; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_post_queries/PostQueries/removeLike.md b/talawa-mobile-docs/utils_post_queries/PostQueries/removeLike.md new file mode 100644 index 000000000..e43f174fc --- /dev/null +++ b/talawa-mobile-docs/utils_post_queries/PostQueries/removeLike.md @@ -0,0 +1,53 @@ + + + +# removeLike method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) removeLike +() + + + + + +

Remove Like from a post.

+

params: + None

+

returns:

+
    +
  • String: The query related to removingLike
  • +
+ + + +## Implementation + +```dart +String removeLike() { + return """ + mutation unlikePost(\$postID: ID!) { + unlikePost( id: \$postID,) + { + _id + likedBy{ + _id + } + } + } +"""; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_post_queries/PostQueries/uploadPost.md b/talawa-mobile-docs/utils_post_queries/PostQueries/uploadPost.md new file mode 100644 index 000000000..59d03b867 --- /dev/null +++ b/talawa-mobile-docs/utils_post_queries/PostQueries/uploadPost.md @@ -0,0 +1,63 @@ + + + +# uploadPost method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) uploadPost +() + + + + + +

Upload a post to database.

+

params: + None

+

returns:

+
    +
  • String: The query related to uploadingPost.
  • +
+ + + +## Implementation + +```dart +String uploadPost() { + return ''' + mutation CreatePost( + \$text: String! + \$title: String! + \$imageUrl: URL + \$videoUrl: URL + \$organizationId: ID! +) { + createPost( + data: { + text: \$text + title: \$title + imageUrl: \$imageUrl + videoUrl: \$videoUrl + organizationId: \$organizationId + } + ) { + _id + } +} + '''; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_post_queries/utils_post_queries-library.md b/talawa-mobile-docs/utils_post_queries/utils_post_queries-library.md new file mode 100644 index 000000000..b2562cc70 --- /dev/null +++ b/talawa-mobile-docs/utils_post_queries/utils_post_queries-library.md @@ -0,0 +1,38 @@ + + + + +# post_queries library + + + + + + + + + + + +## Classes + +##### [PostQueries](../utils_post_queries/PostQueries-class.md) + + + +This class creates queries related to posts. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries-class.md b/talawa-mobile-docs/utils_queries/Queries-class.md new file mode 100644 index 000000000..7b1fc116f --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries-class.md @@ -0,0 +1,245 @@ + + + +# Queries class + + + + + + + + + +

This class returns some queries for the application.

+ + + + +## Constructors + +[Queries](../utils_queries/Queries/Queries.md) () + + + + +## Properties + +##### [fetchJoinInOrg](../utils_queries/Queries/fetchJoinInOrg.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read-only_ + + + +##### [fetchJoinInOrgByName](../utils_queries/Queries/fetchJoinInOrgByName.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read-only_ + + + +##### [fetchUserInfo](../utils_queries/Queries/fetchUserInfo.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createDonation](../utils_queries/Queries/createDonation.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) userId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) nameOfOrg, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) nameOfUser, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) payPalId, [double](https://api.flutter.dev/flutter/dart-core/double-class.html) amount) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +createDonation creates a new donation transaction by taking the userId ,orgId ,nameOfOrg ,nameOfUser as parameters + + + + +##### [fetchOrgById](../utils_queries/Queries/fetchOrgById.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [fetchOrgDetailsById](../utils_queries/Queries/fetchOrgDetailsById.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [getPluginsList](../utils_queries/Queries/getPluginsList.md)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +getPluginList queries all properties of pluginList from the server + + + + +##### [joinOrgById](../utils_queries/Queries/joinOrgById.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [loginUser](../utils_queries/Queries/loginUser.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) email, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) password) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [logout](../utils_queries/Queries/logout.md)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [newUserLanguage](../utils_queries/Queries/newUserLanguage.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) userId) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [refreshToken](../utils_queries/Queries/refreshToken.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) refreshToken) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [registerUser](../utils_queries/Queries/registerUser.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) firstName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) lastName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) email, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) password) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [saveFcmToken](../utils_queries/Queries/saveFcmToken.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html)? token) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [sendMembershipRequest](../utils_queries/Queries/sendMembershipRequest.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [updateLanguage](../utils_queries/Queries/updateLanguage.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) languageCode) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [userLanguage](../utils_queries/Queries/userLanguage.md)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/Queries.md b/talawa-mobile-docs/utils_queries/Queries/Queries.md new file mode 100644 index 000000000..b25607632 --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/Queries.md @@ -0,0 +1,24 @@ + + + +# Queries constructor + + + + + + + +Queries() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/createDonation.md b/talawa-mobile-docs/utils_queries/Queries/createDonation.md new file mode 100644 index 000000000..3aed8b44e --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/createDonation.md @@ -0,0 +1,61 @@ + + + +# createDonation method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) createDonation +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) userId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) nameOfOrg, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) nameOfUser, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) payPalId, [double](https://api.flutter.dev/flutter/dart-core/double-class.html) amount) + + + + + +

createDonation creates a new donation transaction by taking the userId ,orgId ,nameOfOrg ,nameOfUser as parameters

+ + + +## Implementation + +```dart +String createDonation( + String userId, + String orgId, + String nameOfOrg, + String nameOfUser, + String payPalId, + double amount, +) { + return ''' + mutation createDonationMutation { createDonation( + userId :"$userId" + orgId :"$orgId", + nameOfOrg:"$nameOfOrg", + nameOfUser:"$nameOfUser", + payPalId:"$payPalId" + amount :$amount + ){ + _id + payPalId + userId + orgId + payPalId + nameOfUser + } + } + '''; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/fetchJoinInOrg.md b/talawa-mobile-docs/utils_queries/Queries/fetchJoinInOrg.md new file mode 100644 index 000000000..33bb1607a --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/fetchJoinInOrg.md @@ -0,0 +1,55 @@ + + + +# fetchJoinInOrg property + + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) fetchJoinInOrg + + + + + + + + +## Implementation + +```dart +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 + } + } + } +"""; +} +``` + + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/fetchJoinInOrgByName.md b/talawa-mobile-docs/utils_queries/Queries/fetchJoinInOrgByName.md new file mode 100644 index 000000000..02bcbb617 --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/fetchJoinInOrgByName.md @@ -0,0 +1,64 @@ + + + +# fetchJoinInOrgByName property + + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) fetchJoinInOrgByName + + + + + + + + +## Implementation + +```dart +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 + } + } + } +"""; +} +``` + + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/fetchOrgById.md b/talawa-mobile-docs/utils_queries/Queries/fetchOrgById.md new file mode 100644 index 000000000..ea2c109b2 --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/fetchOrgById.md @@ -0,0 +1,50 @@ + + + +# fetchOrgById method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) fetchOrgById +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId) + + + + + + + + +## Implementation + +```dart +String fetchOrgById(String orgId) { + return ''' + query{ + organizations(id: "$orgId"){ + image + _id + name + image + isPublic + creator{ + firstName + lastName + } + } + } +'''; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/fetchOrgDetailsById.md b/talawa-mobile-docs/utils_queries/Queries/fetchOrgDetailsById.md new file mode 100644 index 000000000..f311d621c --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/fetchOrgDetailsById.md @@ -0,0 +1,60 @@ + + + +# fetchOrgDetailsById method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) fetchOrgDetailsById +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId) + + + + + + + + +## Implementation + +```dart +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/talawa-mobile-docs/utils_queries/Queries/fetchUserInfo.md b/talawa-mobile-docs/utils_queries/Queries/fetchUserInfo.md new file mode 100644 index 000000000..c038293e5 --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/fetchUserInfo.md @@ -0,0 +1,86 @@ + + + +# fetchUserInfo property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) fetchUserInfo + +_read / write_ + + + + + + +## Implementation + +```dart +String fetchUserInfo = ''' + query Users(\$id: ID!){ + users(where: { 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 + } + } + } + '''; +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/getPluginsList.md b/talawa-mobile-docs/utils_queries/Queries/getPluginsList.md new file mode 100644 index 000000000..66e39ef68 --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/getPluginsList.md @@ -0,0 +1,48 @@ + + + +# getPluginsList method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) getPluginsList +() + + + + + +

getPluginList queries all properties of pluginList from the server

+ + + +## Implementation + +```dart +String getPluginsList() { + return ''' +query { +getPlugins { + _id + pluginName + pluginCreatedBy + pluginDesc + pluginInstallStatus + installedOrgs +} +} +'''; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/joinOrgById.md b/talawa-mobile-docs/utils_queries/Queries/joinOrgById.md new file mode 100644 index 000000000..6b3a9c800 --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/joinOrgById.md @@ -0,0 +1,55 @@ + + + +# joinOrgById method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joinOrgById +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId) + + + + + + + + +## Implementation + +```dart +String joinOrgById(String orgId) { + return ''' + mutation { + joinPublicOrganization(organizationId: "$orgId") { + joinedOrganizations{ + _id + name + image + description + isPublic + creator{ + _id + firstName + lastName + image + } + + } + } + } +'''; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/loginUser.md b/talawa-mobile-docs/utils_queries/Queries/loginUser.md new file mode 100644 index 000000000..31a470855 --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/loginUser.md @@ -0,0 +1,110 @@ + + + +# loginUser method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) loginUser +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) email, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) password) + + + + + + + + +## Implementation + +```dart +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 + androidFirebaseOptions { + apiKey + appId + messagingSenderId + projectId + storageBucket + } + iosFirebaseOptions { + apiKey + appId + messagingSenderId + projectId + storageBucket + iosClientId + iosBundleId + } + } + } + """; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/logout.md b/talawa-mobile-docs/utils_queries/Queries/logout.md new file mode 100644 index 000000000..673bb3885 --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/logout.md @@ -0,0 +1,40 @@ + + + +# logout method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) logout +() + + + + + + + + +## Implementation + +```dart +String logout() { + return """ + mutation { + logout + } + """; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/newUserLanguage.md b/talawa-mobile-docs/utils_queries/Queries/newUserLanguage.md new file mode 100644 index 000000000..a22689f7d --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/newUserLanguage.md @@ -0,0 +1,40 @@ + + + +# newUserLanguage method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) newUserLanguage +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) userId) + + + + + + + + +## Implementation + +```dart +String newUserLanguage(String userId) { + return ''' + query{ + userLanguage(userId:"$userId") + } +'''; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/refreshToken.md b/talawa-mobile-docs/utils_queries/Queries/refreshToken.md new file mode 100644 index 000000000..c384ab091 --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/refreshToken.md @@ -0,0 +1,43 @@ + + + +# refreshToken method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) refreshToken +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) refreshToken) + + + + + + + + +## Implementation + +```dart +String refreshToken(String refreshToken) { + return ''' + mutation{ + refreshToken(refreshToken: "$refreshToken"){ + accessToken + refreshToken + } + } + '''; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/registerUser.md b/talawa-mobile-docs/utils_queries/Queries/registerUser.md new file mode 100644 index 000000000..19b4402c6 --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/registerUser.md @@ -0,0 +1,100 @@ + + + +# registerUser method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) registerUser +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) firstName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) lastName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) email, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) password) + + + + + + + + +## Implementation + +```dart +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 + } + } + """; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/saveFcmToken.md b/talawa-mobile-docs/utils_queries/Queries/saveFcmToken.md new file mode 100644 index 000000000..0b8bab769 --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/saveFcmToken.md @@ -0,0 +1,40 @@ + + + +# saveFcmToken method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) saveFcmToken +([String](https://api.flutter.dev/flutter/dart-core/String-class.html)? token) + + + + + + + + +## Implementation + +```dart +String saveFcmToken(String? token) { + return """ + mutation { + saveFcmToken(token: "$token") + } + """; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/sendMembershipRequest.md b/talawa-mobile-docs/utils_queries/Queries/sendMembershipRequest.md new file mode 100644 index 000000000..033475b2b --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/sendMembershipRequest.md @@ -0,0 +1,54 @@ + + + +# sendMembershipRequest method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) sendMembershipRequest +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId) + + + + + + + + +## Implementation + +```dart +String sendMembershipRequest(String orgId) { + return ''' + mutation { + sendMembershipRequest(organizationId: "$orgId"){ + organization{ + _id + name + image + description + isPublic + creator{ + _id + firstName + lastName + image + } + } + } + } +'''; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/updateLanguage.md b/talawa-mobile-docs/utils_queries/Queries/updateLanguage.md new file mode 100644 index 000000000..4f786b799 --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/updateLanguage.md @@ -0,0 +1,44 @@ + + + +# updateLanguage method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) updateLanguage +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) languageCode) + + + + + + + + +## Implementation + +```dart +String updateLanguage(String languageCode) { + return ''' + mutation { + updateLanguage(languageCode: "$languageCode"){ + _id + firstName + appLanguageCode + } + } + '''; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/Queries/userLanguage.md b/talawa-mobile-docs/utils_queries/Queries/userLanguage.md new file mode 100644 index 000000000..7e07be5a6 --- /dev/null +++ b/talawa-mobile-docs/utils_queries/Queries/userLanguage.md @@ -0,0 +1,40 @@ + + + +# userLanguage method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) userLanguage +() + + + + + + + + +## Implementation + +```dart +String userLanguage() { + return ''' + query{ + myLanguage + } +'''; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_queries/utils_queries-library.md b/talawa-mobile-docs/utils_queries/utils_queries-library.md new file mode 100644 index 000000000..79e7d49e6 --- /dev/null +++ b/talawa-mobile-docs/utils_queries/utils_queries-library.md @@ -0,0 +1,38 @@ + + + + +# queries library + + + + + + + + + + + +## Classes + +##### [Queries](../utils_queries/Queries-class.md) + + + +This class returns some queries for the application. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_task_queries/TaskQueries-class.md b/talawa-mobile-docs/utils_task_queries/TaskQueries-class.md new file mode 100644 index 000000000..9c6198bcd --- /dev/null +++ b/talawa-mobile-docs/utils_task_queries/TaskQueries-class.md @@ -0,0 +1,139 @@ + + + +# TaskQueries class + + + + + + + + + +

This class creates queries for the tasks in the application.

+ + + + +## Constructors + +[TaskQueries](../utils_task_queries/TaskQueries/TaskQueries.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + +## Static Methods + +##### [addTask](../utils_task_queries/TaskQueries/addTask.md)({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) title, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) description, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) deadline, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [deleteTask](../utils_task_queries/TaskQueries/deleteTask.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) taskId) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [editTask](../utils_task_queries/TaskQueries/editTask.md)({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) title, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) description, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) deadline, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) taskId}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [eventTasks](../utils_task_queries/TaskQueries/eventTasks.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + +##### [userTasks](../utils_task_queries/TaskQueries/userTasks.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) userId) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_task_queries/TaskQueries/TaskQueries.md b/talawa-mobile-docs/utils_task_queries/TaskQueries/TaskQueries.md new file mode 100644 index 000000000..aa01fdd0c --- /dev/null +++ b/talawa-mobile-docs/utils_task_queries/TaskQueries/TaskQueries.md @@ -0,0 +1,24 @@ + + + +# TaskQueries constructor + + + + + + + +TaskQueries() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_task_queries/TaskQueries/addTask.md b/talawa-mobile-docs/utils_task_queries/TaskQueries/addTask.md new file mode 100644 index 000000000..9152376d4 --- /dev/null +++ b/talawa-mobile-docs/utils_task_queries/TaskQueries/addTask.md @@ -0,0 +1,61 @@ + + + +# addTask method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) addTask +({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) title, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) description, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) deadline, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId}) + + + + + + + + +## Implementation + +```dart +static String addTask({ + required String title, + required String description, + required String deadline, + required String eventId, +}) => + ''' + mutation { + createTask( + data: { title: "$title", description: "$description", deadline: "$deadline" } + eventId: "$eventId" + ) { + _id + title + description + createdAt + deadline + creator { + _id + firstName + } + event { + _id + title + } + } + } + '''; +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_task_queries/TaskQueries/deleteTask.md b/talawa-mobile-docs/utils_task_queries/TaskQueries/deleteTask.md new file mode 100644 index 000000000..6c2ee6db3 --- /dev/null +++ b/talawa-mobile-docs/utils_task_queries/TaskQueries/deleteTask.md @@ -0,0 +1,40 @@ + + + +# deleteTask method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) deleteTask +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) taskId) + + + + + + + + +## Implementation + +```dart +static String deleteTask(String taskId) => ''' + mutation { + removeTask(id: "$taskId") { + _id + } + } +'''; +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_task_queries/TaskQueries/editTask.md b/talawa-mobile-docs/utils_task_queries/TaskQueries/editTask.md new file mode 100644 index 000000000..f176f847f --- /dev/null +++ b/talawa-mobile-docs/utils_task_queries/TaskQueries/editTask.md @@ -0,0 +1,59 @@ + + + +# editTask method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) editTask +({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) title, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) description, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) deadline, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) taskId}) + + + + + + + + +## Implementation + +```dart +static String editTask({ + required String title, + required String description, + required String deadline, + required String taskId, +}) => + ''' + mutation { + updateTask( + data: { title: "$title", description: "$description", deadline: "$deadline" } + id: "$taskId" + ) { + _id + title + description + createdAt + deadline + creator { + _id + } + event { + _id + } + } + } + '''; +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_task_queries/TaskQueries/eventTasks.md b/talawa-mobile-docs/utils_task_queries/TaskQueries/eventTasks.md new file mode 100644 index 000000000..4b5260c94 --- /dev/null +++ b/talawa-mobile-docs/utils_task_queries/TaskQueries/eventTasks.md @@ -0,0 +1,52 @@ + + + +# eventTasks method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventTasks +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) + + + + + + + + +## Implementation + +```dart +static String eventTasks(String eventId) => ''' + query { + tasksByEvent(id: "$eventId") { + _id + title + description + createdAt + deadline + creator { + _id + firstName + } + event { + _id + title + } + } + } +'''; +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_task_queries/TaskQueries/userTasks.md b/talawa-mobile-docs/utils_task_queries/TaskQueries/userTasks.md new file mode 100644 index 000000000..0c3064b19 --- /dev/null +++ b/talawa-mobile-docs/utils_task_queries/TaskQueries/userTasks.md @@ -0,0 +1,52 @@ + + + +# userTasks method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) userTasks +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) userId) + + + + + + + + +## Implementation + +```dart +static String userTasks(String userId) => ''' + query { + tasksByUser(id: "$userId") { + _id + title + description + createdAt + deadline + creator { + _id + firstName + } + event { + _id + title + } + } + } +'''; +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_task_queries/utils_task_queries-library.md b/talawa-mobile-docs/utils_task_queries/utils_task_queries-library.md new file mode 100644 index 000000000..b1fba2ded --- /dev/null +++ b/talawa-mobile-docs/utils_task_queries/utils_task_queries-library.md @@ -0,0 +1,38 @@ + + + + +# task_queries library + + + + + + + + + + + +## Classes + +##### [TaskQueries](../utils_task_queries/TaskQueries-class.md) + + + +This class creates queries for the tasks in the application. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_validators/Validator-class.md b/talawa-mobile-docs/utils_validators/Validator-class.md new file mode 100644 index 000000000..f179f31a1 --- /dev/null +++ b/talawa-mobile-docs/utils_validators/Validator-class.md @@ -0,0 +1,167 @@ + + + +# Validator class + + + + + + + + + +

This class creats various validator methods for the application. +They are used to validate information given by the users.

+ + + + +## Constructors + +[Validator](../utils_validators/Validator/Validator.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [validateUrlExistence](../utils_validators/Validator/validateUrlExistence.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) url) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)?> + + + + + + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + +## Static Methods + +##### [validateEmail](../utils_validators/Validator/validateEmail.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) email) [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + + + + + +##### [validateEventForm](../utils_validators/Validator/validateEventForm.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) value, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? label) [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + + + + + +##### [validateFirstName](../utils_validators/Validator/validateFirstName.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) value) [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + + + + + +##### [validateLastName](../utils_validators/Validator/validateLastName.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) value) [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + + + + + +##### [validatePassword](../utils_validators/Validator/validatePassword.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) password) [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + + + + + +##### [validatePasswordConfirm](../utils_validators/Validator/validatePasswordConfirm.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) value, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) comparator) [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + + + + + +##### [validateURL](../utils_validators/Validator/validateURL.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) value) [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_validators/Validator/Validator.md b/talawa-mobile-docs/utils_validators/Validator/Validator.md new file mode 100644 index 000000000..4aa170cc1 --- /dev/null +++ b/talawa-mobile-docs/utils_validators/Validator/Validator.md @@ -0,0 +1,24 @@ + + + +# Validator constructor + + + + + + + +Validator() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/utils_validators/Validator/validateEmail.md b/talawa-mobile-docs/utils_validators/Validator/validateEmail.md new file mode 100644 index 000000000..b167aec82 --- /dev/null +++ b/talawa-mobile-docs/utils_validators/Validator/validateEmail.md @@ -0,0 +1,48 @@ + + + +# validateEmail method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? validateEmail +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) email) + + + + + + + + +## Implementation + +```dart +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; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_validators/Validator/validateEventForm.md b/talawa-mobile-docs/utils_validators/Validator/validateEventForm.md new file mode 100644 index 000000000..2742c9277 --- /dev/null +++ b/talawa-mobile-docs/utils_validators/Validator/validateEventForm.md @@ -0,0 +1,45 @@ + + + +# validateEventForm method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? validateEventForm +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) value, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? label) + + + + + + + + +## Implementation + +```dart +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/talawa-mobile-docs/utils_validators/Validator/validateFirstName.md b/talawa-mobile-docs/utils_validators/Validator/validateFirstName.md new file mode 100644 index 000000000..bef755da6 --- /dev/null +++ b/talawa-mobile-docs/utils_validators/Validator/validateFirstName.md @@ -0,0 +1,45 @@ + + + +# validateFirstName method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? validateFirstName +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) value) + + + + + + + + +## Implementation + +```dart +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; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_validators/Validator/validateLastName.md b/talawa-mobile-docs/utils_validators/Validator/validateLastName.md new file mode 100644 index 000000000..d0f24762f --- /dev/null +++ b/talawa-mobile-docs/utils_validators/Validator/validateLastName.md @@ -0,0 +1,45 @@ + + + +# validateLastName method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? validateLastName +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) value) + + + + + + + + +## Implementation + +```dart +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; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_validators/Validator/validatePassword.md b/talawa-mobile-docs/utils_validators/Validator/validatePassword.md new file mode 100644 index 000000000..f79ec49c7 --- /dev/null +++ b/talawa-mobile-docs/utils_validators/Validator/validatePassword.md @@ -0,0 +1,57 @@ + + + +# validatePassword method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? validatePassword +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) password) + + + + + + + + +## Implementation + +```dart +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 (!noSpaceRegex.hasMatch(password)) { + return "Password must not contain spaces"; + } + if (!regExp.hasMatch(password)) { + return "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,\$,etc.)"; + } + + return null; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_validators/Validator/validatePasswordConfirm.md b/talawa-mobile-docs/utils_validators/Validator/validatePasswordConfirm.md new file mode 100644 index 000000000..aa89e2f44 --- /dev/null +++ b/talawa-mobile-docs/utils_validators/Validator/validatePasswordConfirm.md @@ -0,0 +1,42 @@ + + + +# validatePasswordConfirm method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? validatePasswordConfirm +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) value, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) comparator) + + + + + + + + +## Implementation + +```dart +static String? validatePasswordConfirm( + String value, + String comparator, +) { + if (value != comparator) { + return 'Password does not match original'; + } + return null; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_validators/Validator/validateURL.md b/talawa-mobile-docs/utils_validators/Validator/validateURL.md new file mode 100644 index 000000000..b1608f917 --- /dev/null +++ b/talawa-mobile-docs/utils_validators/Validator/validateURL.md @@ -0,0 +1,45 @@ + + + +# validateURL method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? validateURL +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) value) + + + + + + + + +## Implementation + +```dart +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; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_validators/Validator/validateUrlExistence.md b/talawa-mobile-docs/utils_validators/Validator/validateUrlExistence.md new file mode 100644 index 000000000..568b5ec31 --- /dev/null +++ b/talawa-mobile-docs/utils_validators/Validator/validateUrlExistence.md @@ -0,0 +1,42 @@ + + + +# validateUrlExistence method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)?> validateUrlExistence +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) url) + + + + + + + + +## Implementation + +```dart +Future validateUrlExistence(String url) async { + try { + await http.get(Uri.parse(url)); + return true; + } on Exception catch (e) { + debugPrint(e.toString()); + return false; + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/utils_validators/utils_validators-library.md b/talawa-mobile-docs/utils_validators/utils_validators-library.md new file mode 100644 index 000000000..e19c39fe8 --- /dev/null +++ b/talawa-mobile-docs/utils_validators/utils_validators-library.md @@ -0,0 +1,39 @@ + + + + +# validators library + + + + + + + + + + + +## Classes + +##### [Validator](../utils_validators/Validator-class.md) + + + +This class creats various validator methods for the application. +They are used to validate information given by the users. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel-class.md b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel-class.md new file mode 100644 index 000000000..dcb8604ea --- /dev/null +++ b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel-class.md @@ -0,0 +1,233 @@ + + + +# AccessScreenViewModel class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- AccessScreenViewModel + + + + + + + + +## Constructors + +[AccessScreenViewModel](../view_model_access_request_view_model/AccessScreenViewModel/AccessScreenViewModel.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [optionalMessageController](../view_model_access_request_view_model/AccessScreenViewModel/optionalMessageController.md) → [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_final_ + + + +##### [organizations](../view_model_access_request_view_model/AccessScreenViewModel/organizations.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> + + + + +_read / write_ + + + +##### [orgId](../view_model_access_request_view_model/AccessScreenViewModel/orgId.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [selectedOrganization](../view_model_access_request_view_model/AccessScreenViewModel/selectedOrganization.md) ↔ [OrgInfo](../models_organization_org_info/OrgInfo-class.md) + + + + +_read / write_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [initialise](../view_model_access_request_view_model/AccessScreenViewModel/initialise.md)([OrgInfo](../models_organization_org_info/OrgInfo-class.md) org) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [sendMembershipRequest](../view_model_access_request_view_model/AccessScreenViewModel/sendMembershipRequest.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + + + + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/AccessScreenViewModel.md b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/AccessScreenViewModel.md new file mode 100644 index 000000000..067994386 --- /dev/null +++ b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/AccessScreenViewModel.md @@ -0,0 +1,24 @@ + + + +# AccessScreenViewModel constructor + + + + + + + +AccessScreenViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/initialise.md b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/initialise.md new file mode 100644 index 000000000..7bb061c66 --- /dev/null +++ b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/initialise.md @@ -0,0 +1,36 @@ + + + +# initialise method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> initialise +([OrgInfo](../../models_organization_org_info/OrgInfo-class.md) org) + + + + + + + + +## Implementation + +```dart +Future initialise(OrgInfo org) async { + selectedOrganization = org; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/optionalMessageController.md b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/optionalMessageController.md new file mode 100644 index 000000000..3feae3226 --- /dev/null +++ b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/optionalMessageController.md @@ -0,0 +1,32 @@ + + + +# optionalMessageController property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) optionalMessageController + +_final_ + + + + + + +## Implementation + +```dart +final optionalMessageController = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/orgId.md b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/orgId.md new file mode 100644 index 000000000..8401c3532 --- /dev/null +++ b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/orgId.md @@ -0,0 +1,32 @@ + + + +# orgId property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId + +_read / write_ + + + + + + +## Implementation + +```dart +late String orgId; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/organizations.md b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/organizations.md new file mode 100644 index 000000000..d267d675b --- /dev/null +++ b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/organizations.md @@ -0,0 +1,32 @@ + + + +# organizations property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> organizations + +_read / write_ + + + + + + +## Implementation + +```dart +late List organizations = []; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/selectedOrganization.md b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/selectedOrganization.md new file mode 100644 index 000000000..1c7a65ca8 --- /dev/null +++ b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/selectedOrganization.md @@ -0,0 +1,32 @@ + + + +# selectedOrganization property + + + + + + + +[OrgInfo](../../models_organization_org_info/OrgInfo-class.md) selectedOrganization + +_read / write_ + + + + + + +## Implementation + +```dart +late OrgInfo selectedOrganization = OrgInfo(id: '-1'); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/sendMembershipRequest.md b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/sendMembershipRequest.md new file mode 100644 index 000000000..badfa2c33 --- /dev/null +++ b/talawa-mobile-docs/view_model_access_request_view_model/AccessScreenViewModel/sendMembershipRequest.md @@ -0,0 +1,58 @@ + + + +# sendMembershipRequest method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> sendMembershipRequest +() + + + + + + + + +## Implementation + +```dart +Future sendMembershipRequest() async { + //TODO: Implement Message arg for below function + final result = await databaseFunctions.gqlAuthMutation( + queries.sendMembershipRequest(selectedOrganization.id!), + ); + if (result != null) { + final OrgInfo membershipRequest = OrgInfo.fromJson( + (((result as QueryResult).data!)['sendMembershipRequest'] + as Map)['organization'] as Map, + ); + userConfig.updateUserMemberRequestOrg([membershipRequest]); + if (userConfig.currentUser.joinedOrganizations!.isEmpty) { + navigationService.removeAllAndPush( + Routes.waitingScreen, + Routes.splashScreen, + ); + } else { + navigationService.pop(); + navigationService.showTalawaErrorSnackBar( + 'Join in request sent to ${selectedOrganization.name} successfully', + MessageType.info, + ); + } + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_access_request_view_model/view_model_access_request_view_model-library.md b/talawa-mobile-docs/view_model_access_request_view_model/view_model_access_request_view_model-library.md new file mode 100644 index 000000000..4f6d0332c --- /dev/null +++ b/talawa-mobile-docs/view_model_access_request_view_model/view_model_access_request_view_model-library.md @@ -0,0 +1,38 @@ + + + + +# access_request_view_model library + + + + + + + + + + + +## Classes + +##### [AccessScreenViewModel](../view_model_access_request_view_model/AccessScreenViewModel-class.md) + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md new file mode 100644 index 000000000..d1cf1ebe1 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md @@ -0,0 +1,262 @@ + + + +# AddPostViewModel class + + + + + + + + + +

AddPostViewModel class have different functions that are used.

+

to interact with the model to add a new post in the organization.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- AddPostViewModel + + + + + + + + +## Constructors + +[AddPostViewModel](../view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/AddPostViewModel.md) () + + + + +## Properties + +##### [controller](../view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/controller.md) → [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + +Post body text controller. +_read-only_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [imageFile](../view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/imageFile.md) → [File](https://api.flutter.dev/flutter/dart-io/File-class.html)? + + + +The image file that is to be uploaded. +_read-only_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [orgName](../view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/orgName.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +The organisation name. +_read-only_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + +##### [titleController](../view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/titleController.md) → [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + +Post title text controller. +_read-only_ + + + +##### [userName](../view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/userName.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +The Username. +_read-only_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [getImageFromGallery](../view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/getImageFromGallery.md)({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) camera = false}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to get the image from gallery. + + + + +##### [initialise](../view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/initialise.md)() void + + + +This function is usedto do initialisation of stuff in the view model. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeImage](../view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/removeImage.md)() void + + + +This function removes the image selected. + + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [uploadPost](../view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/uploadPost.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function uploads the post finally, and navigate the success message or error message in Snack Bar. + + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/AddPostViewModel.md b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/AddPostViewModel.md new file mode 100644 index 000000000..3c75d173a --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/AddPostViewModel.md @@ -0,0 +1,24 @@ + + + +# AddPostViewModel constructor + + + + + + + +AddPostViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/controller.md b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/controller.md new file mode 100644 index 000000000..6bfa5f1a3 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/controller.md @@ -0,0 +1,42 @@ + + + +# controller property + + + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) controller + + + + + +

Post body text controller.

+

params: +None +returns:

+
    +
  • TextEditingController: The main text controller of the post body
  • +
+ + + +## Implementation + +```dart +TextEditingController get controller => _controller; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/getImageFromGallery.md b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/getImageFromGallery.md new file mode 100644 index 000000000..4b687e6e2 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/getImageFromGallery.md @@ -0,0 +1,55 @@ + + + +# getImageFromGallery method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> getImageFromGallery +({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) camera = false}) + + + + + +

This function is used to get the image from gallery.

+

The function uses the _multiMediaPickerService services.

+

params:

+
    +
  • camera: if true then open camera for image, else open gallery to select image.
  • +
+

returns:

+
    +
  • Future<void>: Getting image from gallery returns future
  • +
+ + + +## Implementation + +```dart +Future getImageFromGallery({bool camera = false}) async { + final image = + await _multiMediaPickerService.getPhotoFromGallery(camera: camera); + if (image != null) { + _imageFile = image; + _navigationService.showTalawaErrorSnackBar( + "Image is added", + MessageType.info, + ); + notifyListeners(); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/imageFile.md b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/imageFile.md new file mode 100644 index 000000000..19699241f --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/imageFile.md @@ -0,0 +1,42 @@ + + + +# imageFile property + + + + + + + + + +[File](https://api.flutter.dev/flutter/dart-io/File-class.html)? imageFile + + + + + +

The image file that is to be uploaded.

+

params: +None +returns:

+
    +
  • File?: The image file
  • +
+ + + +## Implementation + +```dart +File? get imageFile => _imageFile; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/initialise.md b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/initialise.md new file mode 100644 index 000000000..ab0e08b7e --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/initialise.md @@ -0,0 +1,46 @@ + + + +# initialise method + + + + + + + + +void initialise +() + + + + + +

This function is usedto do initialisation of stuff in the view model.

+

params: + None

+

returns: + None

+ + + +## Implementation + +```dart +void initialise() { + _currentUser = locator().currentUser; + _navigationService = locator(); + _selectedOrg = locator().currentOrg; + _imageFile = null; + _multiMediaPickerService = locator(); + _dbFunctions = locator(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/orgName.md b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/orgName.md new file mode 100644 index 000000000..1006f7768 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/orgName.md @@ -0,0 +1,42 @@ + + + +# orgName property + + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgName + + + + + +

The organisation name.

+

params: +None +returns:

+
    +
  • String: The organisation name
  • +
+ + + +## Implementation + +```dart +String get orgName => _selectedOrg.name!; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/removeImage.md b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/removeImage.md new file mode 100644 index 000000000..43fd648c6 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/removeImage.md @@ -0,0 +1,42 @@ + + + +# removeImage method + + + + + + + + +void removeImage +() + + + + + +

This function removes the image selected.

+

params: + None

+

returns: + None

+ + + +## Implementation + +```dart +void removeImage() { + _imageFile = null; + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/titleController.md b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/titleController.md new file mode 100644 index 000000000..d3fac7285 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/titleController.md @@ -0,0 +1,42 @@ + + + +# titleController property + + + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) titleController + + + + + +

Post title text controller.

+

params: +None +returns:

+
    +
  • TextEditingController: The text controller of the title body
  • +
+ + + +## Implementation + +```dart +TextEditingController get titleController => _titleController; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/uploadPost.md b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/uploadPost.md new file mode 100644 index 000000000..4fc93630b --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/uploadPost.md @@ -0,0 +1,68 @@ + + + +# uploadPost method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> uploadPost +() + + + + + +

This function uploads the post finally, and navigate the success message or error message in Snack Bar.

+

params: + None

+

returns:

+
    +
  • Future<void>: Uploading post by contacting queries
  • +
+ + + +## Implementation + +```dart +Future uploadPost() async { + // {TODO: } + if (_imageFile == null) { + try { + await _dbFunctions.gqlAuthMutation( + PostQueries().uploadPost(), + variables: { + "text": _controller.text, + "organizationId": _selectedOrg.id, + "title": _titleController.text + }, + ); + _navigationService.showTalawaErrorSnackBar( + "Post is uploaded", + MessageType.info, + ); + } on Exception catch (_) { + _navigationService.showTalawaErrorSnackBar( + "Something went wrong", + MessageType.error, + ); + } + } + removeImage(); + _controller.text = ""; + _titleController.text = ""; + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/userName.md b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/userName.md new file mode 100644 index 000000000..91033806d --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel/userName.md @@ -0,0 +1,42 @@ + + + +# userName property + + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) userName + + + + + +

The Username.

+

params: +None +returns:

+
    +
  • String: The username of the currentUser
  • +
+ + + +## Implementation + +```dart +String get userName => _currentUser.firstName! + _currentUser.lastName!; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/view_model_after_auth_view_models_add_post_view_models_add_post_view_model-library.md b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/view_model_after_auth_view_models_add_post_view_models_add_post_view_model-library.md new file mode 100644 index 000000000..abcf04d8d --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_add_post_view_models_add_post_view_model/view_model_after_auth_view_models_add_post_view_models_add_post_view_model-library.md @@ -0,0 +1,38 @@ + + + + +# add_post_view_model library + + + + + + + + + + + +## Classes + +##### [AddPostViewModel](../view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md) + + + +AddPostViewModel class have different functions that are used. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md new file mode 100644 index 000000000..ba22f8b88 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md @@ -0,0 +1,276 @@ + + + +# DirectChatViewModel class + + + + + + + + + +

This ViewModel class have different functions that are used interact with model in the context of Direct Chat.

+

Functions include:

+
    +
  • initialise : Initialise the states.
  • +
  • getChatMessages : to get all the messages of a chat.
  • +
  • sendMessageToDirectChat : to send the message to chat.
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- DirectChatViewModel + + + + + + + + +## Constructors + +[DirectChatViewModel](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/DirectChatViewModel.md) () + + + + +## Properties + +##### [chatMessagesByUser](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatMessagesByUser.md) → [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ChatMessage](../models_chats_chat_message/ChatMessage-class.md)>> + + + + +_read-only_ + + + +##### [chats](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chats.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ChatListTileDataModel](../models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md)> + + + + +_read-only_ + + + +##### [chatState](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatState.md) ↔ [ChatState](../enums_enums/ChatState.md) + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [listKey](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/listKey.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[AnimatedListState](https://api.flutter.dev/flutter/widgets/AnimatedListState-class.html)> + + + + +_final_ + + + +##### [name](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/name.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [chatName](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatName.md)(dynamic chatId) void + + + + + + + + +##### [dispose](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/dispose.md)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_override_ + + + +##### [getChatMessages](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/getChatMessages.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) chatId) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function get all messages for a chat. + + + + +##### [initialise](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/initialise.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [refreshChats](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/refreshChats.md)() void + + + +This function refresh the chats. + + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [sendMessageToDirectChat](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/sendMessageToDirectChat.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) chatId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) messageContent) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function send the message to Direct Chat. + + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/DirectChatViewModel.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/DirectChatViewModel.md new file mode 100644 index 000000000..04646cdf5 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/DirectChatViewModel.md @@ -0,0 +1,24 @@ + + + +# DirectChatViewModel constructor + + + + + + + +DirectChatViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatMessagesByUser.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatMessagesByUser.md new file mode 100644 index 000000000..77f46270e --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatMessagesByUser.md @@ -0,0 +1,35 @@ + + + +# chatMessagesByUser property + + + + + + + + + +[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ChatMessage](../../models_chats_chat_message/ChatMessage-class.md)>> chatMessagesByUser + + + + + + + + +## Implementation + +```dart +Map> get chatMessagesByUser => _chatMessagesByUser; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatName.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatName.md new file mode 100644 index 000000000..5c2f3625b --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatName.md @@ -0,0 +1,43 @@ + + + +# chatName method + + + + + + + + +void chatName +(dynamic chatId) + + + + + + + + +## Implementation + +```dart +void chatName(chatId) { + final List users = + _chats.firstWhere((element) => element.id == chatId).users!; + + users.forEach((element) { + if (element.id != userConfig.currentUser.id!) { + name = element.firstName; + } + }); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatState.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatState.md new file mode 100644 index 000000000..0ebdda61c --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chatState.md @@ -0,0 +1,32 @@ + + + +# chatState property + + + + + + + +[ChatState](../../enums_enums/ChatState.md) chatState + +_read / write_ + + + + + + +## Implementation + +```dart +ChatState chatState = ChatState.initial; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chats.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chats.md new file mode 100644 index 000000000..81f69657a --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/chats.md @@ -0,0 +1,35 @@ + + + +# chats property + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[ChatListTileDataModel](../../models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md)> chats + + + + + + + + +## Implementation + +```dart +List get chats => _chats; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/dispose.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/dispose.md new file mode 100644 index 000000000..551ec7916 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/dispose.md @@ -0,0 +1,47 @@ + + + +# dispose method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +void dispose +() + +_override_ + + + +

Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed).

+

This method should only be called by the object's owner.

+

This method does not notify listeners, and clears the listener list once +it is called. Consumers of this class must decide on whether to notify +listeners or not immediately before disposal.

+ + + +## Implementation + +```dart +@override +void dispose() { + _chatMessageSubscription?.cancel(); + _chatListSubscription.cancel(); + super.dispose(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/getChatMessages.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/getChatMessages.md new file mode 100644 index 000000000..bf87af3bc --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/getChatMessages.md @@ -0,0 +1,54 @@ + + + +# getChatMessages method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> getChatMessages +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) chatId) + + + + + +

This function get all messages for a chat.

+

params:

+
    +
  • chatId : id of a chat for which messages need to be fetched.
  • +
+ + + +## Implementation + +```dart +Future getChatMessages(String chatId) async { + _chatMessagesByUser.clear(); + chatState = ChatState.loading; + // await _chatService.getMessagesFromDirectChat(); + // variable + final List messages = []; + _chatMessageSubscription = + _chatService.chatMessagesStream.listen((newMessage) { + messages.add(newMessage); + _chatMessagesByUser[chatId] = messages; + }); + // use `chatService` services + await _chatService.getDirectChatMessagesByChatId(chatId); + chatState = ChatState.complete; + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/initialise.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/initialise.md new file mode 100644 index 000000000..1ddffc5e0 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/initialise.md @@ -0,0 +1,47 @@ + + + +# initialise method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> initialise +() + + + + + + + + +## Implementation + +```dart +Future initialise() async { + setState(ViewState.busy); + chatState = ChatState.loading; + + _chatListSubscription = _chatService.chatListStream.listen((newChat) { + _uniqueChatIds.add(newChat.id!); + _chats.insert(0, newChat); + }); + + await _chatService.getDirectChatsByUserId(); + + chatState = ChatState.complete; + setState(ViewState.idle); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/listKey.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/listKey.md new file mode 100644 index 000000000..64ba84797 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/listKey.md @@ -0,0 +1,32 @@ + + + +# listKey property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[AnimatedListState](https://api.flutter.dev/flutter/widgets/AnimatedListState-class.html)> listKey + +_final_ + + + + + + +## Implementation + +```dart +final listKey = GlobalKey(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/name.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/name.md new file mode 100644 index 000000000..8a9acbd90 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/name.md @@ -0,0 +1,32 @@ + + + +# name property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name + +_read / write_ + + + + + + +## Implementation + +```dart +String? name; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/refreshChats.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/refreshChats.md new file mode 100644 index 000000000..87d21035e --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/refreshChats.md @@ -0,0 +1,40 @@ + + + +# refreshChats method + + + + + + + + +void refreshChats +() + + + + + +

This function refresh the chats.

+ + + +## Implementation + +```dart +void refreshChats() { + _chats.clear(); + _uniqueChatIds.clear(); + notifyListeners(); + _chatService.getDirectChatsByUserId(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/sendMessageToDirectChat.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/sendMessageToDirectChat.md new file mode 100644 index 000000000..d1cf19519 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel/sendMessageToDirectChat.md @@ -0,0 +1,50 @@ + + + +# sendMessageToDirectChat method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> sendMessageToDirectChat +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) chatId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) messageContent) + + + + + +

This function send the message to Direct Chat.

+

params:

+
    +
  • chatId : id of a chat where message need to be send.
  • +
  • messageContent : content of a message.
  • +
+ + + +## Implementation + +```dart +Future sendMessageToDirectChat( + String chatId, + String messageContent, +) async { + chatState = ChatState.loading; + _chatService.chatMessagesStream.listen((newMessage) { + _chatMessagesByUser[chatId]!.add(newMessage); + }); + await _chatService.sendMessageToDirectChat(chatId, messageContent); + chatState = ChatState.complete; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model-library.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model-library.md new file mode 100644 index 000000000..e1737c8bb --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/view_model_after_auth_view_models_chat_view_models_direct_chat_view_model-library.md @@ -0,0 +1,38 @@ + + + + +# direct_chat_view_model library + + + + + + + + + + + +## Classes + +##### [DirectChatViewModel](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md) + + + +This ViewModel class have different functions that are used interact with model in the context of Direct Chat. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel-class.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel-class.md new file mode 100644 index 000000000..d1b8cd05b --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel-class.md @@ -0,0 +1,211 @@ + + + +# SelectContactViewModel class + + + + + + + + + +

SelectContactViewModel class have different functions to interact with model.

+

Functions include:

+
    +
  • getCurrentOrgUsersList : to get all users of current organization.
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- SelectContactViewModel + + + + + + + + +## Constructors + +[SelectContactViewModel](../view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/SelectContactViewModel.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [orgMembersList](../view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/orgMembersList.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../models_user_user_info/User-class.md)> + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [getCurrentOrgUsersList](../view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/getCurrentOrgUsersList.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to get all users list of an current organization. + + + + +##### [initialise](../view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/initialise.md)() void + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/SelectContactViewModel.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/SelectContactViewModel.md new file mode 100644 index 000000000..195db77ac --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/SelectContactViewModel.md @@ -0,0 +1,24 @@ + + + +# SelectContactViewModel constructor + + + + + + + +SelectContactViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/getCurrentOrgUsersList.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/getCurrentOrgUsersList.md new file mode 100644 index 000000000..8c9f8c8cd --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/getCurrentOrgUsersList.md @@ -0,0 +1,42 @@ + + + +# getCurrentOrgUsersList method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> getCurrentOrgUsersList +() + + + + + +

This function is used to get all users list of an current organization.

+ + + +## Implementation + +```dart +Future getCurrentOrgUsersList() async { + if (orgMembersList.isEmpty) { + orgMembersList = await _organizationService + .getOrgMembersList(userConfig.currentOrg.id!); + } + + //return orgMembersList; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/initialise.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/initialise.md new file mode 100644 index 000000000..a51657cbb --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/initialise.md @@ -0,0 +1,36 @@ + + + +# initialise method + + + + + + + + +void initialise +() + + + + + + + + +## Implementation + +```dart +void initialise() { + _organizationService = locator(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/orgMembersList.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/orgMembersList.md new file mode 100644 index 000000000..fc9910f37 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel/orgMembersList.md @@ -0,0 +1,32 @@ + + + +# orgMembersList property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../../models_user_user_info/User-class.md)> orgMembersList + +_read / write_ + + + + + + +## Implementation + +```dart +late List orgMembersList = []; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/view_model_after_auth_view_models_chat_view_models_select_contact_view_model-library.md b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/view_model_after_auth_view_models_chat_view_models_select_contact_view_model-library.md new file mode 100644 index 000000000..8d9207601 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_chat_view_models_select_contact_view_model/view_model_after_auth_view_models_chat_view_models_select_contact_view_model-library.md @@ -0,0 +1,38 @@ + + + + +# select_contact_view_model library + + + + + + + + + + + +## Classes + +##### [SelectContactViewModel](../view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel-class.md) + + + +SelectContactViewModel class have different functions to interact with model. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md new file mode 100644 index 000000000..38267d729 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md @@ -0,0 +1,432 @@ + + + +# CreateEventViewModel class + + + + + + + + + +

CreateEventViewModel class have methods to interact with model in.

+

the context of creating the event in the organization.

+

Methods include:

+
    +
  • createEvent : to create an event.
  • +
  • getImageFromGallery : to select image for a post.
  • +
  • removeImage : to remove the image.
  • +
  • getCurrentOrgUsersList : to get all user list of current organization.
  • +
  • removeUserFromList : to remove a user from list.
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- CreateEventViewModel + + + + + + + + +## Constructors + +[CreateEventViewModel](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/CreateEventViewModel.md) () + + + + +## Properties + +##### [descriptionFocus](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/descriptionFocus.md) ↔ [FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) + + + +DescriptionFocus FocusNode. +_read / write_ + + + +##### [eventDescriptionTextController](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventDescriptionTextController.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + +Event Description Text Controller. +_read / write_ + + + +##### [eventEndDate](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventEndDate.md) ↔ [DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html) + + + +Event End Date. +_read / write_ + + + +##### [eventEndTime](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventEndTime.md) ↔ [TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html) + + + +Event End Time. +_read / write_ + + + +##### [eventLocationTextController](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventLocationTextController.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + +Event Location Text Controller. +_read / write_ + + + +##### [eventStartDate](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventStartDate.md) ↔ [DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html) + + + +Event Start Date. +_read / write_ + + + +##### [eventStartTime](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventStartTime.md) ↔ [TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html) + + + +Event Start Time. +_read / write_ + + + +##### [eventTitleTextController](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventTitleTextController.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + +Event Title Text Controller. +_read / write_ + + + +##### [formKey](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/formKey.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[FormState](https://api.flutter.dev/flutter/widgets/FormState-class.html)> + + + +Global FormKey. +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [imageFile](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/imageFile.md) → [File](https://api.flutter.dev/flutter/dart-io/File-class.html)? + + + +Getter to return imageFile. +_read-only_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [isPublicSwitch](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/isPublicSwitch.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Public Event or Not. +_read / write_ + + + +##### [isRegisterableSwitch](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/isRegisterableSwitch.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +If event is registerable after creation. +_read / write_ + + + +##### [latitude](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/latitude.md) ↔ [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? + + + +Latitude store. +_read / write_ + + + +##### [locationFocus](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/locationFocus.md) ↔ [FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) + + + +LocationFocus FocusNode. +_read / write_ + + + +##### [longitude](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/longitude.md) ↔ [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? + + + +Longitude store. +_read / write_ + + + +##### [memberCheckedMap](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/memberCheckedMap.md) → [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> + + + +Getter to return members map. +_read-only_ + + + +##### [orgMembersList](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/orgMembersList.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../models_user_user_info/User-class.md)> + + + +Organisation Members List. +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [selectedMembers](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/selectedMembers.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../models_user_user_info/User-class.md)> + + + +Getter to return selected members. +_read-only_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + +##### [titleFocus](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/titleFocus.md) ↔ [FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) + + + +TitleFocus FocusNode. +_read / write_ + + + +##### [validate](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/validate.md) ↔ [AutovalidateMode](https://api.flutter.dev/flutter/widgets/AutovalidateMode.html) + + + +AutoValidateMode default to disabled. +_read / write_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [buildUserList](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/buildUserList.md)() void + + + +This function build the user list. + + + + +##### [createEvent](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/createEvent.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to create the event for the organization. + + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [getCurrentOrgUsersList](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/getCurrentOrgUsersList.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../models_user_user_info/User-class.md)>> + + + +This function fetch all the users in the current organization and return List. + + + + +##### [getImageFromGallery](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/getImageFromGallery.md)({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) camera = false}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to get the image from gallery. + + + + +##### [initialize](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/initialize.md)() void + + + +Function To Initialize. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeImage](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/removeImage.md)() void + + + +This function remove the selected image. + + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [removeUserFromList](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/removeUserFromList.md)({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) userId}) void + + + +This function is used to remove a user from user's list. + + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/CreateEventViewModel.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/CreateEventViewModel.md new file mode 100644 index 000000000..50eb1089f --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/CreateEventViewModel.md @@ -0,0 +1,24 @@ + + + +# CreateEventViewModel constructor + + + + + + + +CreateEventViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/buildUserList.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/buildUserList.md new file mode 100644 index 000000000..49b43c3ff --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/buildUserList.md @@ -0,0 +1,50 @@ + + + +# buildUserList method + + + + + + + + +void buildUserList +() + + + + + +

This function build the user list.

+

params: + None

+

returns: + None

+ + + +## Implementation + +```dart +void buildUserList() { + _selectedMembers.clear(); + + // loop through the organization member list + + orgMembersList.forEach((orgMember) { + if (_memberCheckedMap[orgMember.id] == true) { + _selectedMembers.add(orgMember); + } + }); + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/createEvent.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/createEvent.md new file mode 100644 index 000000000..e02be1250 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/createEvent.md @@ -0,0 +1,106 @@ + + + +# createEvent method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> createEvent +() + + + + + +

This function is used to create the event for the organization.

+

The function uses database_mutation_functions services to call the graphQL mutation +for creating an event and passes the required variables for the event.

+

params: + None

+

returns:

+
    +
  • Future<void>: Asynchronous function for creating event
  • +
+ + + +## Implementation + +```dart +Future createEvent() async { + titleFocus.unfocus(); + locationFocus.unfocus(); + descriptionFocus.unfocus(); + validate = AutovalidateMode.always; + if (formKey.currentState!.validate()) { + validate = AutovalidateMode.disabled; + + // variables initialisation + final DateTime startDate = eventStartDate; + final DateTime endDate = eventEndDate; + 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, + ); + + // all required data for creating an event + final Map variables = { + 'startDate': DateFormat('yyyy-MM-dd').format(startDate), + 'endDate': DateFormat('yyyy-MM-dd').format(endDate), + 'organizationId': _currentOrg.id, + 'title': eventTitleTextController.text, + 'description': eventDescriptionTextController.text, + 'location': eventLocationTextController.text, + 'isPublic': isPublicSwitch, + 'isRegisterable': isRegisterableSwitch, + 'recurring': false, + 'allDay': false, + 'startTime': '${DateFormat('HH:mm:ss').format(startTime)}Z', + 'endTime': '${DateFormat('HH:mm:ss').format(endTime)}Z', + if (latitude != null) 'latitude': latitude, + if (longitude != null) 'longitude': longitude, + }; + + navigationService.pushDialog( + const CustomProgressDialog(key: Key('EventCreationProgress')), + ); + final tokenResult = await databaseFunctions + .refreshAccessToken(userConfig.currentUser.refreshToken!); + print(tokenResult); + // invoke the `gqlAuthMutation` function of `databaseFunctions` + // service along with the mutation query and variable map. + final result = await databaseFunctions.gqlAuthMutation( + EventQueries().addEvent(), + variables: variables, + ); + navigationService.pop(); + if (result != null) { + navigationService.pop(); + + await _eventService.getEvents(); + } + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/descriptionFocus.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/descriptionFocus.md new file mode 100644 index 000000000..2d720cdd9 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/descriptionFocus.md @@ -0,0 +1,33 @@ + + + +# descriptionFocus property + + + + + + + +[FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) descriptionFocus + +_read / write_ + + + +

DescriptionFocus FocusNode.

+ + + +## Implementation + +```dart +FocusNode descriptionFocus = FocusNode(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventDescriptionTextController.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventDescriptionTextController.md new file mode 100644 index 000000000..abda49060 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventDescriptionTextController.md @@ -0,0 +1,34 @@ + + + +# eventDescriptionTextController property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) eventDescriptionTextController + +_read / write_ + + + +

Event Description Text Controller.

+ + + +## Implementation + +```dart +TextEditingController eventDescriptionTextController = + TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventEndDate.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventEndDate.md new file mode 100644 index 000000000..2eae857b1 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventEndDate.md @@ -0,0 +1,33 @@ + + + +# eventEndDate property + + + + + + + +[DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html) eventEndDate + +_read / write_ + + + +

Event End Date.

+ + + +## Implementation + +```dart +DateTime eventEndDate = DateTime.now(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventEndTime.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventEndTime.md new file mode 100644 index 000000000..18d766fed --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventEndTime.md @@ -0,0 +1,33 @@ + + + +# eventEndTime property + + + + + + + +[TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html) eventEndTime + +_read / write_ + + + +

Event End Time.

+ + + +## Implementation + +```dart +TimeOfDay eventEndTime = TimeOfDay.now(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventLocationTextController.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventLocationTextController.md new file mode 100644 index 000000000..d371ed22b --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventLocationTextController.md @@ -0,0 +1,33 @@ + + + +# eventLocationTextController property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) eventLocationTextController + +_read / write_ + + + +

Event Location Text Controller.

+ + + +## Implementation + +```dart +TextEditingController eventLocationTextController = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventStartDate.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventStartDate.md new file mode 100644 index 000000000..d568203e3 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventStartDate.md @@ -0,0 +1,33 @@ + + + +# eventStartDate property + + + + + + + +[DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html) eventStartDate + +_read / write_ + + + +

Event Start Date.

+ + + +## Implementation + +```dart +DateTime eventStartDate = DateTime.now(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventStartTime.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventStartTime.md new file mode 100644 index 000000000..0ba2d449b --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventStartTime.md @@ -0,0 +1,33 @@ + + + +# eventStartTime property + + + + + + + +[TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html) eventStartTime + +_read / write_ + + + +

Event Start Time.

+ + + +## Implementation + +```dart +TimeOfDay eventStartTime = TimeOfDay.now(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventTitleTextController.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventTitleTextController.md new file mode 100644 index 000000000..0ff98f1e4 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/eventTitleTextController.md @@ -0,0 +1,33 @@ + + + +# eventTitleTextController property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) eventTitleTextController + +_read / write_ + + + +

Event Title Text Controller.

+ + + +## Implementation + +```dart +TextEditingController eventTitleTextController = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/formKey.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/formKey.md new file mode 100644 index 000000000..8d24a83fc --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/formKey.md @@ -0,0 +1,33 @@ + + + +# formKey property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[FormState](https://api.flutter.dev/flutter/widgets/FormState-class.html)> formKey + +_final_ + + + +

Global FormKey.

+ + + +## Implementation + +```dart +final formKey = GlobalKey(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/getCurrentOrgUsersList.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/getCurrentOrgUsersList.md new file mode 100644 index 000000000..dd2d7bc7f --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/getCurrentOrgUsersList.md @@ -0,0 +1,54 @@ + + + +# getCurrentOrgUsersList method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../../models_user_user_info/User-class.md)>> getCurrentOrgUsersList +() + + + + + +

This function fetch all the users in the current organization and return List.

+

params: + None

+

returns:

+
    +
  • Future<List<User>>: Current Organization Users List
  • +
+ + + +## Implementation + +```dart +Future> getCurrentOrgUsersList() async { + if (orgMembersList.isEmpty) { + orgMembersList = await organizationService + .getOrgMembersList(userConfig.currentOrg.id!); + } + + // loop through list + orgMembersList.forEach((orgMember) { + _memberCheckedMap.putIfAbsent(orgMember.id!, () => false); + _memberCheckedMap.putIfAbsent(orgMember.id!, () => false); + }); + // return list + return orgMembersList; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/getImageFromGallery.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/getImageFromGallery.md new file mode 100644 index 000000000..8401473f6 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/getImageFromGallery.md @@ -0,0 +1,51 @@ + + + +# getImageFromGallery method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> getImageFromGallery +({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) camera = false}) + + + + + +

This function is used to get the image from gallery.

+

The function uses the _multiMediaPickerService services.

+

params:

+
    +
  • camera: if true then open camera for image, else open gallery to select image.
  • +
+

returns:

+
    +
  • Future<void>: Asynchronous function for getting image from gallery
  • +
+ + + +## Implementation + +```dart +Future getImageFromGallery({bool camera = false}) async { + final image = + await _multiMediaPickerService.getPhotoFromGallery(camera: camera); + if (image != null) { + _imageFile = image; + notifyListeners(); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/imageFile.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/imageFile.md new file mode 100644 index 000000000..041c6defc --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/imageFile.md @@ -0,0 +1,42 @@ + + + +# imageFile property + + + + + + + + + +[File](https://api.flutter.dev/flutter/dart-io/File-class.html)? imageFile + + + + + +

Getter to return imageFile.

+

params: +None

+

returns:

+
    +
  • File?: Returns imageFile.
  • +
+ + + +## Implementation + +```dart +File? get imageFile => _imageFile; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/initialize.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/initialize.md new file mode 100644 index 000000000..1f60b376d --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/initialize.md @@ -0,0 +1,45 @@ + + + +# initialize method + + + + + + + + +void initialize +() + + + + + +

Function To Initialize.

+

params: + None

+

returns: + None

+ + + +## Implementation + +```dart +void initialize() { + _currentOrg = _userConfig.currentOrg; + //_organizationService = locator(); + + _imageFile = null; + _multiMediaPickerService = locator(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/isPublicSwitch.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/isPublicSwitch.md new file mode 100644 index 000000000..8c49650a2 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/isPublicSwitch.md @@ -0,0 +1,33 @@ + + + +# isPublicSwitch property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isPublicSwitch + +_read / write_ + + + +

Public Event or Not.

+ + + +## Implementation + +```dart +bool isPublicSwitch = true; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/isRegisterableSwitch.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/isRegisterableSwitch.md new file mode 100644 index 000000000..4c0808ed0 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/isRegisterableSwitch.md @@ -0,0 +1,33 @@ + + + +# isRegisterableSwitch property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isRegisterableSwitch + +_read / write_ + + + +

If event is registerable after creation.

+ + + +## Implementation + +```dart +bool isRegisterableSwitch = true; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/latitude.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/latitude.md new file mode 100644 index 000000000..da17e9b9c --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/latitude.md @@ -0,0 +1,33 @@ + + + +# latitude property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html)? latitude + +_read / write_ + + + +

Latitude store.

+ + + +## Implementation + +```dart +double? latitude; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/locationFocus.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/locationFocus.md new file mode 100644 index 000000000..df230e493 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/locationFocus.md @@ -0,0 +1,33 @@ + + + +# locationFocus property + + + + + + + +[FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) locationFocus + +_read / write_ + + + +

LocationFocus FocusNode.

+ + + +## Implementation + +```dart +FocusNode locationFocus = FocusNode(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/longitude.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/longitude.md new file mode 100644 index 000000000..eba02e97c --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/longitude.md @@ -0,0 +1,33 @@ + + + +# longitude property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html)? longitude + +_read / write_ + + + +

Longitude store.

+ + + +## Implementation + +```dart +double? longitude; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/memberCheckedMap.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/memberCheckedMap.md new file mode 100644 index 000000000..81076cdb6 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/memberCheckedMap.md @@ -0,0 +1,43 @@ + + + +# memberCheckedMap property + + + + + + + + + +[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> memberCheckedMap + + + + + +

Getter to return members map.

+

params: +None

+

returns:

+
    +
  • Map<String, bool>: Returns a map of entries with id and boolean if they are +selected for events or not in bottom sheet.
  • +
+ + + +## Implementation + +```dart +Map get memberCheckedMap => _memberCheckedMap; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/orgMembersList.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/orgMembersList.md new file mode 100644 index 000000000..5e26fd928 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/orgMembersList.md @@ -0,0 +1,33 @@ + + + +# orgMembersList property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../../models_user_user_info/User-class.md)> orgMembersList + +_read / write_ + + + +

Organisation Members List.

+ + + +## Implementation + +```dart +late List orgMembersList = []; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/removeImage.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/removeImage.md new file mode 100644 index 000000000..11b3c4f3e --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/removeImage.md @@ -0,0 +1,42 @@ + + + +# removeImage method + + + + + + + + +void removeImage +() + + + + + +

This function remove the selected image.

+

params: + None

+

returns: + None

+ + + +## Implementation + +```dart +void removeImage() { + _imageFile = null; + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/removeUserFromList.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/removeUserFromList.md new file mode 100644 index 000000000..eafdab6ec --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/removeUserFromList.md @@ -0,0 +1,46 @@ + + + +# removeUserFromList method + + + + + + + + +void removeUserFromList +({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) userId}) + + + + + +

This function is used to remove a user from user's list.

+

params:

+
    +
  • userId: id of the user that need to be removed.
  • +
+

returns: + None

+ + + +## Implementation + +```dart +void removeUserFromList({required String userId}) { + _selectedMembers.removeWhere((user) => user.id == userId); + _memberCheckedMap[userId] = false; + + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/selectedMembers.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/selectedMembers.md new file mode 100644 index 000000000..cc72b1eb8 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/selectedMembers.md @@ -0,0 +1,42 @@ + + + +# selectedMembers property + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../../models_user_user_info/User-class.md)> selectedMembers + + + + + +

Getter to return selected members.

+

params: +None

+

returns:

+
    +
  • List<User>: Returns a list of selectedMembers for events
  • +
+ + + +## Implementation + +```dart +List get selectedMembers => _selectedMembers; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/titleFocus.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/titleFocus.md new file mode 100644 index 000000000..dafe064f7 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/titleFocus.md @@ -0,0 +1,33 @@ + + + +# titleFocus property + + + + + + + +[FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) titleFocus + +_read / write_ + + + +

TitleFocus FocusNode.

+ + + +## Implementation + +```dart +FocusNode titleFocus = FocusNode(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/validate.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/validate.md new file mode 100644 index 000000000..0c6ee84f7 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel/validate.md @@ -0,0 +1,33 @@ + + + +# validate property + + + + + + + +[AutovalidateMode](https://api.flutter.dev/flutter/widgets/AutovalidateMode.html) validate + +_read / write_ + + + +

AutoValidateMode default to disabled.

+ + + +## Implementation + +```dart +AutovalidateMode validate = AutovalidateMode.disabled; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/view_model_after_auth_view_models_event_view_models_create_event_view_model-library.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/view_model_after_auth_view_models_event_view_models_create_event_view_model-library.md new file mode 100644 index 000000000..71a028978 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_create_event_view_model/view_model_after_auth_view_models_event_view_models_create_event_view_model-library.md @@ -0,0 +1,38 @@ + + + + +# create_event_view_model library + + + + + + + + + + + +## Classes + +##### [CreateEventViewModel](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md) + + + +CreateEventViewModel class have methods to interact with model in. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md new file mode 100644 index 000000000..d2eed60cf --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md @@ -0,0 +1,330 @@ + + + +# EditEventViewModel class + + + + + + + + + +

EditEventViewModel class have methods to interact with model in +the context of editing the event in the organization.

+

Methods include:

+
    +
  • updateEvent : to update an event.
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- EditEventViewModel + + + + + + + + +## Constructors + +[EditEventViewModel](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/EditEventViewModel.md) () + + + + +## Properties + +##### [descriptionFocus](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/descriptionFocus.md) ↔ [FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) + + + + +_read / write_ + + + +##### [eventDescriptionTextController](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventDescriptionTextController.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_read / write_ + + + +##### [eventEndDate](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventEndDate.md) ↔ [DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html) + + + + +_read / write_ + + + +##### [eventEndTime](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventEndTime.md) ↔ [TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html) + + + + +_read / write_ + + + +##### [eventLocationTextController](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventLocationTextController.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_read / write_ + + + +##### [eventStartDate](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventStartDate.md) ↔ [DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html) + + + + +_read / write_ + + + +##### [eventStartTime](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventStartTime.md) ↔ [TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html) + + + + +_read / write_ + + + +##### [eventTitleTextController](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventTitleTextController.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_read / write_ + + + +##### [formKey](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/formKey.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[FormState](https://api.flutter.dev/flutter/widgets/FormState-class.html)> + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [isPublicSwitch](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/isPublicSwitch.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read / write_ + + + +##### [isRegisterableSwitch](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/isRegisterableSwitch.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read / write_ + + + +##### [locationFocus](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/locationFocus.md) ↔ [FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + +##### [titleFocus](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/titleFocus.md) ↔ [FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) + + + + +_read / write_ + + + +##### [validate](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/validate.md) ↔ [AutovalidateMode](https://api.flutter.dev/flutter/widgets/AutovalidateMode.html) + + + + +_read / write_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [initialize](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/initialize.md)([Event](../models_events_event_model/Event-class.md) event) void + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [updateEvent](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/updateEvent.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to update an event. +The function uses editEvent function provided by eventService service. + + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/EditEventViewModel.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/EditEventViewModel.md new file mode 100644 index 000000000..13fcad2a0 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/EditEventViewModel.md @@ -0,0 +1,24 @@ + + + +# EditEventViewModel constructor + + + + + + + +EditEventViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/descriptionFocus.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/descriptionFocus.md new file mode 100644 index 000000000..42e3cadfa --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/descriptionFocus.md @@ -0,0 +1,32 @@ + + + +# descriptionFocus property + + + + + + + +[FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) descriptionFocus + +_read / write_ + + + + + + +## Implementation + +```dart +FocusNode descriptionFocus = FocusNode(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventDescriptionTextController.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventDescriptionTextController.md new file mode 100644 index 000000000..6c46c7d62 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventDescriptionTextController.md @@ -0,0 +1,33 @@ + + + +# eventDescriptionTextController property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) eventDescriptionTextController + +_read / write_ + + + + + + +## Implementation + +```dart +TextEditingController eventDescriptionTextController = + TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventEndDate.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventEndDate.md new file mode 100644 index 000000000..9e06aaece --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventEndDate.md @@ -0,0 +1,32 @@ + + + +# eventEndDate property + + + + + + + +[DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html) eventEndDate + +_read / write_ + + + + + + +## Implementation + +```dart +DateTime eventEndDate = DateTime.now(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventEndTime.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventEndTime.md new file mode 100644 index 000000000..fbcf2e3a5 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventEndTime.md @@ -0,0 +1,32 @@ + + + +# eventEndTime property + + + + + + + +[TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html) eventEndTime + +_read / write_ + + + + + + +## Implementation + +```dart +TimeOfDay eventEndTime = TimeOfDay.now(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventLocationTextController.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventLocationTextController.md new file mode 100644 index 000000000..65a364695 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventLocationTextController.md @@ -0,0 +1,32 @@ + + + +# eventLocationTextController property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) eventLocationTextController + +_read / write_ + + + + + + +## Implementation + +```dart +TextEditingController eventLocationTextController = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventStartDate.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventStartDate.md new file mode 100644 index 000000000..0f6005ef7 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventStartDate.md @@ -0,0 +1,32 @@ + + + +# eventStartDate property + + + + + + + +[DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html) eventStartDate + +_read / write_ + + + + + + +## Implementation + +```dart +DateTime eventStartDate = DateTime.now(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventStartTime.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventStartTime.md new file mode 100644 index 000000000..4a0fbcbd6 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventStartTime.md @@ -0,0 +1,32 @@ + + + +# eventStartTime property + + + + + + + +[TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html) eventStartTime + +_read / write_ + + + + + + +## Implementation + +```dart +TimeOfDay eventStartTime = TimeOfDay.now(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventTitleTextController.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventTitleTextController.md new file mode 100644 index 000000000..a8880e96a --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/eventTitleTextController.md @@ -0,0 +1,32 @@ + + + +# eventTitleTextController property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) eventTitleTextController + +_read / write_ + + + + + + +## Implementation + +```dart +TextEditingController eventTitleTextController = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/formKey.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/formKey.md new file mode 100644 index 000000000..d7de0e859 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/formKey.md @@ -0,0 +1,32 @@ + + + +# formKey property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[FormState](https://api.flutter.dev/flutter/widgets/FormState-class.html)> formKey + +_final_ + + + + + + +## Implementation + +```dart +final formKey = GlobalKey(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/initialize.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/initialize.md new file mode 100644 index 000000000..1ecb6819c --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/initialize.md @@ -0,0 +1,37 @@ + + + +# initialize method + + + + + + + + +void initialize +([Event](../../models_events_event_model/Event-class.md) event) + + + + + + + + +## Implementation + +```dart +void initialize(Event event) { + _event = event; + _fillEditForm(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/isPublicSwitch.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/isPublicSwitch.md new file mode 100644 index 000000000..3f1458f4b --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/isPublicSwitch.md @@ -0,0 +1,32 @@ + + + +# isPublicSwitch property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isPublicSwitch + +_read / write_ + + + + + + +## Implementation + +```dart +bool isPublicSwitch = true; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/isRegisterableSwitch.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/isRegisterableSwitch.md new file mode 100644 index 000000000..02f53c66c --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/isRegisterableSwitch.md @@ -0,0 +1,32 @@ + + + +# isRegisterableSwitch property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isRegisterableSwitch + +_read / write_ + + + + + + +## Implementation + +```dart +bool isRegisterableSwitch = false; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/locationFocus.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/locationFocus.md new file mode 100644 index 000000000..bd199d216 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/locationFocus.md @@ -0,0 +1,32 @@ + + + +# locationFocus property + + + + + + + +[FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) locationFocus + +_read / write_ + + + + + + +## Implementation + +```dart +FocusNode locationFocus = FocusNode(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/titleFocus.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/titleFocus.md new file mode 100644 index 000000000..43897adf9 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/titleFocus.md @@ -0,0 +1,32 @@ + + + +# titleFocus property + + + + + + + +[FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) titleFocus + +_read / write_ + + + + + + +## Implementation + +```dart +FocusNode titleFocus = FocusNode(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/updateEvent.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/updateEvent.md new file mode 100644 index 000000000..5befd21fe --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/updateEvent.md @@ -0,0 +1,73 @@ + + + +# updateEvent method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> updateEvent +() + + + + + +

This function is used to update an event. +The function uses editEvent function provided by eventService service.

+ + + +## Implementation + +```dart +Future updateEvent() async { + titleFocus.unfocus(); + locationFocus.unfocus(); + descriptionFocus.unfocus(); + validate = AutovalidateMode.always; + if (formKey.currentState!.validate()) { + validate = AutovalidateMode.disabled; + final DateTime startTime = DateTime( + eventStartDate.year, + eventStartDate.month, + eventStartDate.day, + eventStartTime.hour, + eventStartTime.minute, + ); + final DateTime endTime = DateTime( + eventEndDate.year, + eventEndDate.month, + eventEndDate.day, + eventEndTime.hour, + eventEndTime.minute, + ); + // map for the required data to update an event. + final Map variables = { + 'title': eventTitleTextController.text, + 'description': eventDescriptionTextController.text, + 'location': eventLocationTextController.text, + 'isPublic': isPublicSwitch, + 'isRegisterable': isRegisterableSwitch, + 'recurring': false, + 'allDay': false, + 'startDate': DateFormat('yyyy-MM-dd').format(eventStartDate), + 'endDate': DateFormat('yyyy-MM-dd').format(eventEndDate), + 'startTime': '${DateFormat('HH:mm:ss').format(startTime)}Z', + 'endTime': '${DateFormat('HH:mm:ss').format(endTime)}Z', + }; + _eventService.editEvent(eventId: _event.id!, variables: variables); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/validate.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/validate.md new file mode 100644 index 000000000..7dd63a4d4 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel/validate.md @@ -0,0 +1,32 @@ + + + +# validate property + + + + + + + +[AutovalidateMode](https://api.flutter.dev/flutter/widgets/AutovalidateMode.html) validate + +_read / write_ + + + + + + +## Implementation + +```dart +AutovalidateMode validate = AutovalidateMode.disabled; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/view_model_after_auth_view_models_event_view_models_edit_event_view_model-library.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/view_model_after_auth_view_models_event_view_models_edit_event_view_model-library.md new file mode 100644 index 000000000..ea15b6471 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_edit_event_view_model/view_model_after_auth_view_models_event_view_models_edit_event_view_model-library.md @@ -0,0 +1,39 @@ + + + + +# edit_event_view_model library + + + + + + + + + + + +## Classes + +##### [EditEventViewModel](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md) + + + +EditEventViewModel class have methods to interact with model in +the context of editing the event in the organization. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel-class.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel-class.md new file mode 100644 index 000000000..ca90a6094 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel-class.md @@ -0,0 +1,248 @@ + + + +# EventInfoViewModel class + + + + + + + + + +

EventInfoViewModel class helps interacting with model to serve view with the event information data.'

+

Methods include:

+
    +
  • registerForEvent : to register user for an event.
  • +
  • getFabTitle : to get the status of "registration" for an event.
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- EventInfoViewModel + + + + + + + + +## Constructors + +[EventInfoViewModel](../view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/EventInfoViewModel.md) () + + + + +## Properties + +##### [event](../view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/event.md) ↔ [Event](../models_events_event_model/Event-class.md) + + + + +_read / write_ + + + +##### [exploreEventsInstance](../view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/exploreEventsInstance.md) ↔ [ExploreEventsViewModel](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md) + + + + +_read / write_ + + + +##### [fabTitle](../view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/fabTitle.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [registrants](../view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/registrants.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../models_user_user_info/User-class.md)> + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [getFabTitle](../view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/getFabTitle.md)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +This function returns String type for the event registration status. + + + + +##### [initialize](../view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/initialize.md)({required [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> args}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +initialise with the event data fetched from the model. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [registerForEvent](../view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/registerForEvent.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function helps the user to register for an event. + + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/EventInfoViewModel.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/EventInfoViewModel.md new file mode 100644 index 000000000..e97f40787 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/EventInfoViewModel.md @@ -0,0 +1,24 @@ + + + +# EventInfoViewModel constructor + + + + + + + +EventInfoViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/event.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/event.md new file mode 100644 index 000000000..c2c81ab4f --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/event.md @@ -0,0 +1,32 @@ + + + +# event property + + + + + + + +[Event](../../models_events_event_model/Event-class.md) event + +_read / write_ + + + + + + +## Implementation + +```dart +late Event event; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/exploreEventsInstance.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/exploreEventsInstance.md new file mode 100644 index 000000000..577772d85 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/exploreEventsInstance.md @@ -0,0 +1,32 @@ + + + +# exploreEventsInstance property + + + + + + + +[ExploreEventsViewModel](../../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md) exploreEventsInstance + +_read / write_ + + + + + + +## Implementation + +```dart +late ExploreEventsViewModel exploreEventsInstance; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/fabTitle.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/fabTitle.md new file mode 100644 index 000000000..ec2aa5e29 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/fabTitle.md @@ -0,0 +1,32 @@ + + + +# fabTitle property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) fabTitle + +_read / write_ + + + + + + +## Implementation + +```dart +late String fabTitle; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/getFabTitle.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/getFabTitle.md new file mode 100644 index 000000000..2c51f02c8 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/getFabTitle.md @@ -0,0 +1,43 @@ + + + +# getFabTitle method + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) getFabTitle +() + + + + + +

This function returns String type for the event registration status.

+ + + +## Implementation + +```dart +String getFabTitle() { + if (event.isRegisterable == false) { + return "Not Registrable"; + } else if (event.isRegistered == true) { + return "Registered"; + } else { + return "Register"; + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/initialize.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/initialize.md new file mode 100644 index 000000000..4c6cd87ca --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/initialize.md @@ -0,0 +1,54 @@ + + + +# initialize method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> initialize +({required [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> args}) + + + + + +

initialise with the event data fetched from the model.

+ + + +## Implementation + +```dart +Future initialize({required Map args}) async { + event = args["event"] as Event; + exploreEventsInstance = + args["exploreEventViewModel"] as ExploreEventsViewModel; + fabTitle = getFabTitle(); + setState(ViewState.busy); + final fetchRegistrantsByEventQueryResult = await locator() + .fetchRegistrantsByEvent(event.id!) as QueryResult; + final registrantsJsonList = fetchRegistrantsByEventQueryResult + .data!['registrantsByEvent'] as List; + registrants = registrantsJsonList + .map( + (registrantJson) => User.fromJson( + registrantJson! as Map, + fromOrg: true, + ), + ) + .toList(); + setState(ViewState.idle); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/registerForEvent.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/registerForEvent.md new file mode 100644 index 000000000..453b65075 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/registerForEvent.md @@ -0,0 +1,58 @@ + + + +# registerForEvent method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> registerForEvent +() + + + + + +

This function helps the user to register for an event.

+ + + +## Implementation + +```dart +Future registerForEvent() async { + // if event registration is open and user not already registered for the event. + if (event.isRegisterable == true && event.isRegistered == false) { + navigationService.pushDialog( + const CustomProgressDialog( + key: Key('RegisterEvent'), + ), + ); + + // use `registerForAnEvent` function provided by `EventService` service. + final registerResult = + await locator().registerForAnEvent(event.id!); + //final registerResult = await EventService().registerForAnEvent(event.id!); + // if the registration is successful. + if (registerResult != null) { + event.isRegistered = true; + registrants.add(locator().currentUser); + } + print(registerResult); + fabTitle = getFabTitle(); + navigationService.pop(); + notifyListeners(); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/registrants.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/registrants.md new file mode 100644 index 000000000..3074b46da --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel/registrants.md @@ -0,0 +1,32 @@ + + + +# registrants property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[User](../../models_user_user_info/User-class.md)> registrants + +_read / write_ + + + + + + +## Implementation + +```dart +late List registrants; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/view_model_after_auth_view_models_event_view_models_event_info_view_model-library.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/view_model_after_auth_view_models_event_view_models_event_info_view_model-library.md new file mode 100644 index 000000000..d652071d5 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_event_info_view_model/view_model_after_auth_view_models_event_view_models_event_info_view_model-library.md @@ -0,0 +1,38 @@ + + + + +# event_info_view_model library + + + + + + + + + + + +## Classes + +##### [EventInfoViewModel](../view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel-class.md) + + + +EventInfoViewModel class helps interacting with model to serve view with the event information data.' + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md new file mode 100644 index 000000000..0db9f1f4b --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md @@ -0,0 +1,281 @@ + + + +# ExploreEventsViewModel class + + + + + + + + + +

ExploreEventsViewModel class helps to interact with model to serve data to view for event explore section.

+

Methods include:

+
    +
  • fetchNewEvents : to fetch new events in the organization.
  • +
  • refreshEvents : to refersh the event.
  • +
  • checkIfExistsAndAddNewEvent : to check if the event exists or not, if now add a new event.
  • +
  • deleteEvent : to delete the event.
  • +
  • choseValueFromDropdown : to return the relevant message in the dropdown after any action.
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- ExploreEventsViewModel + + + + + + + + +## Constructors + +[ExploreEventsViewModel](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/ExploreEventsViewModel.md) () + + + + +## Properties + +##### [chosenValue](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/chosenValue.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read-only_ + + + +##### [emptyListMessage](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/emptyListMessage.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read-only_ + + + +##### [events](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/events.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Event](../models_events_event_model/Event-class.md)> + + + + +_read-only_ + + + +##### [eventService](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/eventService.md) → [EventService](../services_event_service/EventService-class.md) + + + + +_read-only_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [checkIfExistsAndAddNewEvent](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/checkIfExistsAndAddNewEvent.md)([Event](../models_events_event_model/Event-class.md) newEvent) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function add a new event if the event not exist. + + + + +##### [choseValueFromDropdown](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/choseValueFromDropdown.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) value) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function takes the choosen value from dropdown and +return the filter events, if empty list then return relevant message. + + + + +##### [deleteEvent](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/deleteEvent.md)({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function deletes the event. + + + + +##### [dispose](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/dispose.md)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_override_ + + + +##### [fetchNewEvents](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/fetchNewEvents.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to fetch new events in the organization. +The function uses getEvents method from EventService. + + + + +##### [initialise](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/initialise.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [refreshEvents](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/refreshEvents.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to refresh the events in the organization. +The function uses getEvents method from EventService. + + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/ExploreEventsViewModel.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/ExploreEventsViewModel.md new file mode 100644 index 000000000..ee83f259c --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/ExploreEventsViewModel.md @@ -0,0 +1,24 @@ + + + +# ExploreEventsViewModel constructor + + + + + + + +ExploreEventsViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/checkIfExistsAndAddNewEvent.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/checkIfExistsAndAddNewEvent.md new file mode 100644 index 000000000..e16d37fb2 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/checkIfExistsAndAddNewEvent.md @@ -0,0 +1,47 @@ + + + +# checkIfExistsAndAddNewEvent method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> checkIfExistsAndAddNewEvent +([Event](../../models_events_event_model/Event-class.md) newEvent) + + + + + +

This function add a new event if the event not exist.

+

params:

+
    +
  • newEvent : Event type variable containing data to create a new event.
  • +
+ + + +## Implementation + +```dart +Future checkIfExistsAndAddNewEvent(Event newEvent) async { + // checking if the `newEvent.id` is unique and not exist already. + if ((!_uniqueEventIds.contains(newEvent.id)) && + (newEvent.organization!.id == userConfig.currentOrg.id)) { + _uniqueEventIds.add(newEvent.id!); + _parseEventDateTime(newEvent); + notifyListeners(); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/choseValueFromDropdown.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/choseValueFromDropdown.md new file mode 100644 index 000000000..a875ad66a --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/choseValueFromDropdown.md @@ -0,0 +1,117 @@ + + + +# choseValueFromDropdown method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> choseValueFromDropdown +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) value) + + + + + +

This function takes the choosen value from dropdown and +return the filter events, if empty list then return relevant message.

+

params:

+
    +
  • value : choosen value from dropdown.
  • +
+ + + +## Implementation + +```dart +Future choseValueFromDropdown(String value) async { + _chosenValue = value; + notifyListeners(); + setState(ViewState.busy); + + switch (_chosenValue) { + // if `_chosenValue` is "All events". + case 'All Events': + { + // all events + _events = _bufferEvents; + // if list is empty + _emptyListMessage = "Looks like there aren't any events."; + } + break; + // if `_chosenValue` is "created event". + case 'Created Events': + { + // loop through the `_events` list and check + // for the creator id matched the current user id. + _events = List.from( + _bufferEvents.where( + (element) => element.creator!.id == userConfig.currentUser.id, + ), + ); + // if list is empty + _emptyListMessage = "You have not created any event."; + } + break; + // if `_chosenValue` is "Registered Events". + case 'Registered Events': + { + // loop through the `_events` list and filter elements + // if `element.isRegistered` is true and user is not the creator. + _events = List.from( + _bufferEvents.where( + (element) => + element.isRegistered == true && + element.creator!.id != userConfig.currentUser.id, + ), + ); + // if list is empty + _emptyListMessage = "No registered events are present"; + } + break; + // if `_chosenValue` is "Registered Events". + case 'Public Events': + { + // loop through the `_events` list and filter elements + // with the `isPublic` as true. + _events = _bufferEvents + .where((element) => element.isPublic == true) + .toList(); + + // if list is empty + _emptyListMessage = "There aren't any public events."; + } + break; + case 'Private Events': + { + // loop through the `_events` list and filter elements + // with the `isPublic` as false. + _events = _bufferEvents + .where((element) => element.isPublic == false) + .toList(); + // if list is empty + _emptyListMessage = "There aren't any private events."; + } + break; + + default: + { + _events = _bufferEvents; + } + } + await Future.delayed(const Duration(milliseconds: 500)); + setState(ViewState.idle); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/chosenValue.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/chosenValue.md new file mode 100644 index 000000000..d75248d69 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/chosenValue.md @@ -0,0 +1,35 @@ + + + +# chosenValue property + + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) chosenValue + + + + + + + + +## Implementation + +```dart +String get chosenValue => _chosenValue; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/deleteEvent.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/deleteEvent.md new file mode 100644 index 000000000..62435c10d --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/deleteEvent.md @@ -0,0 +1,64 @@ + + + +# deleteEvent method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> deleteEvent +({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId}) + + + + + +

This function deletes the event.

+

params:

+
    +
  • eventId : id of the event that need to be delete.
  • +
+ + + +## Implementation + +```dart +Future deleteEvent({required String eventId}) async { + // push the custom alert dialog to ask for confirmation. + navigationService.pushDialog( + CustomAlertDialog( + reverse: true, + dialogSubTitle: 'Are you sure you want to delete this event?', + successText: 'Delete', + success: () { + navigationService.pop(); + _eventService.deleteEvent(eventId).then( + (result) async { + if (result != null) { + navigationService.pop(); + setState(ViewState.busy); + print(result); + _uniqueEventIds.remove(eventId); + _events.removeWhere((element) => element.id == eventId); + await Future.delayed(const Duration(milliseconds: 500)); + setState(ViewState.idle); + } + }, + ); + }, + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/dispose.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/dispose.md new file mode 100644 index 000000000..6c23fac6a --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/dispose.md @@ -0,0 +1,47 @@ + + + +# dispose method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +void dispose +() + +_override_ + + + +

Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed).

+

This method should only be called by the object's owner.

+

This method does not notify listeners, and clears the listener list once +it is called. Consumers of this class must decide on whether to notify +listeners or not immediately before disposal.

+ + + +## Implementation + +```dart +@override +void dispose() { + _eventStreamSubscription.cancel(); + _currentOrganizationStreamSubscription.cancel(); + super.dispose(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/emptyListMessage.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/emptyListMessage.md new file mode 100644 index 000000000..9f89f47ba --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/emptyListMessage.md @@ -0,0 +1,35 @@ + + + +# emptyListMessage property + + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) emptyListMessage + + + + + + + + +## Implementation + +```dart +String get emptyListMessage => _emptyListMessage; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/eventService.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/eventService.md new file mode 100644 index 000000000..face3b442 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/eventService.md @@ -0,0 +1,35 @@ + + + +# eventService property + + + + + + + + + +[EventService](../../services_event_service/EventService-class.md) eventService + + + + + + + + +## Implementation + +```dart +EventService get eventService => _eventService; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/events.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/events.md new file mode 100644 index 000000000..c267070c5 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/events.md @@ -0,0 +1,35 @@ + + + +# events property + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Event](../../models_events_event_model/Event-class.md)> events + + + + + + + + +## Implementation + +```dart +List get events => _events; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/fetchNewEvents.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/fetchNewEvents.md new file mode 100644 index 000000000..9722f847c --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/fetchNewEvents.md @@ -0,0 +1,41 @@ + + + +# fetchNewEvents method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> fetchNewEvents +() + + + + + +

This function is used to fetch new events in the organization. +The function uses getEvents method from EventService.

+ + + +## Implementation + +```dart +Future fetchNewEvents() async { + setState(ViewState.busy); + notifyListeners(); + await _eventService.getEvents(); + setState(ViewState.idle); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/initialise.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/initialise.md new file mode 100644 index 000000000..cb43c5c96 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/initialise.md @@ -0,0 +1,45 @@ + + + +# initialise method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> initialise +() + + + + + + + + +## Implementation + +```dart +Future initialise() async { + setState(ViewState.busy); + _currentOrganizationStreamSubscription = userConfig.currentOrgInfoStream + .listen((updatedOrganization) => refreshEvents()); + await _eventService.getEvents(); + + _eventStreamSubscription = _eventService.eventStream.listen( + (newEvent) => checkIfExistsAndAddNewEvent(newEvent), + ); + _bufferEvents = _events; + setState(ViewState.idle); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/refreshEvents.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/refreshEvents.md new file mode 100644 index 000000000..ed1c495c5 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel/refreshEvents.md @@ -0,0 +1,42 @@ + + + +# refreshEvents method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> refreshEvents +() + + + + + +

This function is used to refresh the events in the organization. +The function uses getEvents method from EventService.

+ + + +## Implementation + +```dart +Future refreshEvents() async { + setState(ViewState.busy); + _events.clear(); + _uniqueEventIds.clear(); + await _eventService.getEvents(); + setState(ViewState.idle); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/view_model_after_auth_view_models_event_view_models_explore_events_view_model-library.md b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/view_model_after_auth_view_models_event_view_models_explore_events_view_model-library.md new file mode 100644 index 000000000..c28d0174c --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_event_view_models_explore_events_view_model/view_model_after_auth_view_models_event_view_models_explore_events_view_model-library.md @@ -0,0 +1,38 @@ + + + + +# explore_events_view_model library + + + + + + + + + + + +## Classes + +##### [ExploreEventsViewModel](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md) + + + +ExploreEventsViewModel class helps to interact with model to serve data to view for event explore section. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md new file mode 100644 index 000000000..3241daad6 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md @@ -0,0 +1,306 @@ + + + +# OrganizationFeedViewModel class + + + + + + + + + +

OrganizationFeedViewModel class helps to interact with model to serve data to view for organization feed section.

+

Methods include:

+
    +
  • setCurrentOrganizationName : to set current organization name.
  • +
  • fetchNewPosts : to fetch new posts in the organization.
  • +
  • navigateToIndividualPage : to navigate to individual page.
  • +
  • navigateToPinnedPostPage : to navigate to pinned post page.
  • +
  • addNewPost : to add new post in the organization.
  • +
  • updatedPost : to update a post in the organization.
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- OrganizationFeedViewModel + + + + + + + + +## Constructors + +[OrganizationFeedViewModel](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/OrganizationFeedViewModel.md) () + + + + +## Properties + +##### [currentOrgName](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/currentOrgName.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read-only_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [istest](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/istest.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read / write_ + + + +##### [pinnedPosts](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/pinnedPosts.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../models_post_post_model/Post-class.md)> + + + + +_read-only_ + + + +##### [posts](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/posts.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../models_post_post_model/Post-class.md)> + + + + +_read-only_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [addNewPost](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/addNewPost.md)([Post](../models_post_post_model/Post-class.md) newPost) void + + + +This function adds new Post. + + + + +##### [buildNewPosts](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/buildNewPosts.md)([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../models_post_post_model/Post-class.md)> newPosts) void + + + +This function initialise _posts with newPosts. + + + + +##### [dispose](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/dispose.md)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_override_ + + + +##### [fetchNewPosts](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/fetchNewPosts.md)() void + + + +This function fetches new posts in the organization. + + + + +##### [initialise](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/initialise.md)({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isTest = false}) void + + + + + + + + +##### [initializeWithDemoData](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/initializeWithDemoData.md)() void + + + + + + + + +##### [navigateToIndividualPage](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/navigateToIndividualPage.md)([Post](../models_post_post_model/Post-class.md) post) void + + + +This function navigate to individual post page. + + + + +##### [navigateToPinnedPostPage](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/navigateToPinnedPostPage.md)() void + + + +This function navigate to pinned post page. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setCurrentOrganizationName](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/setCurrentOrganizationName.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) updatedOrganization) void + + + +This function sets the organization name after update. + + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [updatedPost](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/updatedPost.md)([Post](../models_post_post_model/Post-class.md) post) void + + + +This function updates the post. + + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/OrganizationFeedViewModel.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/OrganizationFeedViewModel.md new file mode 100644 index 000000000..67813533b --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/OrganizationFeedViewModel.md @@ -0,0 +1,24 @@ + + + +# OrganizationFeedViewModel constructor + + + + + + + +OrganizationFeedViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/addNewPost.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/addNewPost.md new file mode 100644 index 000000000..8c2c03afe --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/addNewPost.md @@ -0,0 +1,42 @@ + + + +# addNewPost method + + + + + + + + +void addNewPost +([Post](../../models_post_post_model/Post-class.md) newPost) + + + + + +

This function adds new Post.

+

params:

+
    +
  • newPost
  • +
+ + + +## Implementation + +```dart +void addNewPost(Post newPost) { + _posts.insert(0, newPost); + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/buildNewPosts.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/buildNewPosts.md new file mode 100644 index 000000000..55261441c --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/buildNewPosts.md @@ -0,0 +1,42 @@ + + + +# buildNewPosts method + + + + + + + + +void buildNewPosts +([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../../models_post_post_model/Post-class.md)> newPosts) + + + + + +

This function initialise _posts with newPosts.

+

params:

+
    +
  • newPosts
  • +
+ + + +## Implementation + +```dart +void buildNewPosts(List newPosts) { + _posts = newPosts; + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/currentOrgName.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/currentOrgName.md new file mode 100644 index 000000000..9688a5a1b --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/currentOrgName.md @@ -0,0 +1,35 @@ + + + +# currentOrgName property + + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) currentOrgName + + + + + + + + +## Implementation + +```dart +String get currentOrgName => _currentOrgName; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/dispose.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/dispose.md new file mode 100644 index 000000000..b9bddb208 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/dispose.md @@ -0,0 +1,49 @@ + + + +# dispose method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +void dispose +() + +_override_ + + + +

Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed).

+

This method should only be called by the object's owner.

+

This method does not notify listeners, and clears the listener list once +it is called. Consumers of this class must decide on whether to notify +listeners or not immediately before disposal.

+ + + +## Implementation + +```dart +@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(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/fetchNewPosts.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/fetchNewPosts.md new file mode 100644 index 000000000..a01c185d7 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/fetchNewPosts.md @@ -0,0 +1,37 @@ + + + +# fetchNewPosts method + + + + + + + + +void fetchNewPosts +() + + + + + +

This function fetches new posts in the organization.

+ + + +## Implementation + +```dart +void fetchNewPosts() { + _postService.getPosts(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/initialise.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/initialise.md new file mode 100644 index 000000000..cea956cdb --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/initialise.md @@ -0,0 +1,58 @@ + + + +# initialise method + + + + + + + + +void initialise +({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isTest = false}) + + + + + + + + +## Implementation + +```dart +void initialise( + // bool forTest, + { + bool isTest = false, +}) { + // For caching/initializing the current organization after the stream subscription has canceled and the stream is updated + + _currentOrgName = _userConfig.currentOrg.name!; + // ------ + // Attaching the stream subscription to rebuild the widgets automatically + _currentOrganizationStreamSubscription = + _userConfig.currentOrgInfoStream.listen( + (updatedOrganization) => + setCurrentOrganizationName(updatedOrganization.name!), + ); + _postsSubscription = _postService.postStream.listen((newPosts) { + return buildNewPosts(newPosts); + }); + + _updatePostSubscription = + _postService.updatedPostStream.listen((post) => updatedPost(post)); + if (isTest) { + istest = true; + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/initializeWithDemoData.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/initializeWithDemoData.md new file mode 100644 index 000000000..a6589facc --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/initializeWithDemoData.md @@ -0,0 +1,46 @@ + + + +# initializeWithDemoData method + + + + + + + + +void initializeWithDemoData +() + + + + + + + + +## Implementation + +```dart +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)); + // }); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/istest.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/istest.md new file mode 100644 index 000000000..7b27c4dd8 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/istest.md @@ -0,0 +1,32 @@ + + + +# istest property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) istest + +_read / write_ + + + + + + +## Implementation + +```dart +bool istest = false; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/navigateToIndividualPage.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/navigateToIndividualPage.md new file mode 100644 index 000000000..82d923bcd --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/navigateToIndividualPage.md @@ -0,0 +1,38 @@ + + + +# navigateToIndividualPage method + + + + + + + + +void navigateToIndividualPage +([Post](../../models_post_post_model/Post-class.md) post) + + + + + +

This function navigate to individual post page.

+ + + +## Implementation + +```dart +void navigateToIndividualPage(Post post) { + // uses `pushScreen` method by `navigationService` service. + _navigationService.pushScreen(Routes.individualPost, arguments: post); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/navigateToPinnedPostPage.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/navigateToPinnedPostPage.md new file mode 100644 index 000000000..75f8159c1 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/navigateToPinnedPostPage.md @@ -0,0 +1,41 @@ + + + +# navigateToPinnedPostPage method + + + + + + + + +void navigateToPinnedPostPage +() + + + + + +

This function navigate to pinned post page.

+ + + +## Implementation + +```dart +void navigateToPinnedPostPage() { + // uses `pushScreen` method by `navigationService` service. + _navigationService.pushScreen( + Routes.pinnedPostPage, + arguments: _pinnedPosts, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/pinnedPosts.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/pinnedPosts.md new file mode 100644 index 000000000..88ef2709e --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/pinnedPosts.md @@ -0,0 +1,41 @@ + + + +# pinnedPosts property + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../../models_post_post_model/Post-class.md)> pinnedPosts + + + + + + + + +## Implementation + +```dart +List get pinnedPosts { + if (istest) { + _pinnedPosts = []; + return _pinnedPosts; + } + return _pinnedPosts; +} +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/posts.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/posts.md new file mode 100644 index 000000000..be2240d6a --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/posts.md @@ -0,0 +1,41 @@ + + + +# posts property + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../../models_post_post_model/Post-class.md)> posts + + + + + + + + +## Implementation + +```dart +List get posts { + // if (istest) { + // _posts = pinnedPostsDemoData.map((e) => Post.fromJson(e)).toList(); + // return _posts; + // } + return _posts; +} +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/setCurrentOrganizationName.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/setCurrentOrganizationName.md new file mode 100644 index 000000000..df80565db --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/setCurrentOrganizationName.md @@ -0,0 +1,48 @@ + + + +# setCurrentOrganizationName method + + + + + + + + +void setCurrentOrganizationName +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) updatedOrganization) + + + + + +

This function sets the organization name after update.

+

params:

+
    +
  • updatedOrganization : updated organization name.
  • +
+ + + +## Implementation + +```dart +void setCurrentOrganizationName(String updatedOrganization) { + // if `updatedOrganization` is not same to `_currentOrgName`. + if (updatedOrganization != _currentOrgName) { + _posts.clear(); + _renderedPostID.clear(); + _currentOrgName = updatedOrganization; + notifyListeners(); + } + // _postService.getPosts(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/updatedPost.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/updatedPost.md new file mode 100644 index 000000000..ad276dec3 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel/updatedPost.md @@ -0,0 +1,47 @@ + + + +# updatedPost method + + + + + + + + +void updatedPost +([Post](../../models_post_post_model/Post-class.md) post) + + + + + +

This function updates the post.

+

params:

+
    +
  • post
  • +
+ + + +## Implementation + +```dart +void 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/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model-library.md b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model-library.md new file mode 100644 index 000000000..4f9361201 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/view_model_after_auth_view_models_feed_view_models_organization_feed_view_model-library.md @@ -0,0 +1,38 @@ + + + + +# organization_feed_view_model library + + + + + + + + + + + +## Classes + +##### [OrganizationFeedViewModel](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md) + + + +OrganizationFeedViewModel class helps to interact with model to serve data to view for organization feed section. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md new file mode 100644 index 000000000..f83ea766c --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md @@ -0,0 +1,275 @@ + + + +# EditProfilePageViewModel class + + + + + + + + + +

EditProfilePageViewModel class helps to interact with model to serve data to edit profile views.

+

Methods include:

+
    +
  • getImageFromGallery
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- EditProfilePageViewModel + + + + + + + + +## Constructors + +[EditProfilePageViewModel](../view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/EditProfilePageViewModel.md) () + + + + +## Properties + +##### [databaseService](../view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/databaseService.md) → [DataBaseMutationFunctions](../services_database_mutation_functions/DataBaseMutationFunctions-class.md) + + + + +_final_ + + + +##### [firstNameFocus](../view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/firstNameFocus.md) ↔ [FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) + + + + +_read / write_ + + + +##### [firstNameTextController](../view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/firstNameTextController.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [imageFile](../view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/imageFile.md) ↔ [File](https://api.flutter.dev/flutter/dart-io/File-class.html)? + + + + +_read / write_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [lastNameFocus](../view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/lastNameFocus.md) ↔ [FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) + + + + +_read / write_ + + + +##### [lastNameTextController](../view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/lastNameTextController.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + +##### [user](../view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/user.md) → [User](../models_user_user_info/User-class.md) + + + + +_final_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [getImageFromGallery](../view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/getImageFromGallery.md)({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) camera = false}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to get the image from gallery. +The function uses the _multiMediaPickerService services. + + + + +##### [initialize](../view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/initialize.md)() void + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeImage](../view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/removeImage.md)() void + + + +This function remove the selected image. + + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/EditProfilePageViewModel.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/EditProfilePageViewModel.md new file mode 100644 index 000000000..0bac4a494 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/EditProfilePageViewModel.md @@ -0,0 +1,24 @@ + + + +# EditProfilePageViewModel constructor + + + + + + + +EditProfilePageViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/databaseService.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/databaseService.md new file mode 100644 index 000000000..611b93985 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/databaseService.md @@ -0,0 +1,32 @@ + + + +# databaseService property + + + + + + + +[DataBaseMutationFunctions](../../services_database_mutation_functions/DataBaseMutationFunctions-class.md) databaseService + +_final_ + + + + + + +## Implementation + +```dart +final databaseService = databaseFunctions; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/firstNameFocus.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/firstNameFocus.md new file mode 100644 index 000000000..48ab5e6a5 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/firstNameFocus.md @@ -0,0 +1,32 @@ + + + +# firstNameFocus property + + + + + + + +[FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) firstNameFocus + +_read / write_ + + + + + + +## Implementation + +```dart +FocusNode firstNameFocus = FocusNode(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/firstNameTextController.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/firstNameTextController.md new file mode 100644 index 000000000..ad9f13aa6 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/firstNameTextController.md @@ -0,0 +1,32 @@ + + + +# firstNameTextController property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) firstNameTextController + +_read / write_ + + + + + + +## Implementation + +```dart +TextEditingController firstNameTextController = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/getImageFromGallery.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/getImageFromGallery.md new file mode 100644 index 000000000..b1f5eda7c --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/getImageFromGallery.md @@ -0,0 +1,47 @@ + + + +# getImageFromGallery method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> getImageFromGallery +({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) camera = false}) + + + + + +

This function is used to get the image from gallery. +The function uses the _multiMediaPickerService services.

+

params:

+
    +
  • camera : if true then open camera for image, else open gallery to select image.
  • +
+ + + +## Implementation + +```dart +Future getImageFromGallery({bool camera = false}) async { + final image = + await _multiMediaPickerService.getPhotoFromGallery(camera: camera); + if (image != null) { + imageFile = image; + notifyListeners(); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/imageFile.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/imageFile.md new file mode 100644 index 000000000..57c47fbe1 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/imageFile.md @@ -0,0 +1,32 @@ + + + +# imageFile property + + + + + + + +[File](https://api.flutter.dev/flutter/dart-io/File-class.html)? imageFile + +_read / write_ + + + + + + +## Implementation + +```dart +late File? imageFile; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/initialize.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/initialize.md new file mode 100644 index 000000000..0c1fdae5c --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/initialize.md @@ -0,0 +1,37 @@ + + + +# initialize method + + + + + + + + +void initialize +() + + + + + + + + +## Implementation + +```dart +void initialize() { + imageFile = null; + _multiMediaPickerService = locator(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/lastNameFocus.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/lastNameFocus.md new file mode 100644 index 000000000..e304beed0 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/lastNameFocus.md @@ -0,0 +1,32 @@ + + + +# lastNameFocus property + + + + + + + +[FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) lastNameFocus + +_read / write_ + + + + + + +## Implementation + +```dart +FocusNode lastNameFocus = FocusNode(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/lastNameTextController.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/lastNameTextController.md new file mode 100644 index 000000000..e7cd6c0a2 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/lastNameTextController.md @@ -0,0 +1,32 @@ + + + +# lastNameTextController property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) lastNameTextController + +_read / write_ + + + + + + +## Implementation + +```dart +TextEditingController lastNameTextController = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/removeImage.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/removeImage.md new file mode 100644 index 000000000..2f0f573c0 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/removeImage.md @@ -0,0 +1,38 @@ + + + +# removeImage method + + + + + + + + +void removeImage +() + + + + + +

This function remove the selected image.

+ + + +## Implementation + +```dart +void removeImage() { + imageFile = null; + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/user.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/user.md new file mode 100644 index 000000000..d20415aec --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel/user.md @@ -0,0 +1,32 @@ + + + +# user property + + + + + + + +[User](../../models_user_user_info/User-class.md) user + +_final_ + + + + + + +## Implementation + +```dart +final user = userConfig.currentUser; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model-library.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model-library.md new file mode 100644 index 000000000..6d453459b --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/view_model_after_auth_view_models_profile_view_models_edit_profile_view_model-library.md @@ -0,0 +1,38 @@ + + + + +# edit_profile_view_model library + + + + + + + + + + + +## Classes + +##### [EditProfilePageViewModel](../view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md) + + + +EditProfilePageViewModel class helps to interact with model to serve data to edit profile views. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md new file mode 100644 index 000000000..399f3e789 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md @@ -0,0 +1,385 @@ + + + +# ProfilePageViewModel class + + + + + + + + + +

ProfilePageViewModel class helps to interact with model to serve data +and react to user's input in Profile Page view.

+

Methods include:

+
    +
  • logout
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- ProfilePageViewModel + + + + + + + + +## Constructors + +[ProfilePageViewModel](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/ProfilePageViewModel.md) () + + + + +## Properties + +##### [bottomSheetHeight](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/bottomSheetHeight.md) ↔ [double](https://api.flutter.dev/flutter/dart-core/double-class.html) + + + + +_read / write_ + + + +##### [currentOrg](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/currentOrg.md) ↔ [OrgInfo](../models_organization_org_info/OrgInfo-class.md) + + + + +_read / write_ + + + +##### [currentUser](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/currentUser.md) ↔ [User](../models_user_user_info/User-class.md) + + + + +_read / write_ + + + +##### [denomination](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/denomination.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html)> + + + + +_final_ + + + +##### [donationAmount](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationAmount.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_read / write_ + + + +##### [donationCurrency](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationCurrency.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read / write_ + + + +##### [donationCurrencySymbol](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationCurrencySymbol.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read / write_ + + + +##### [donationField](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationField.md) → [FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [organisation](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/organisation.md) ↔ [Box](https://pub.dev/documentation/hive/2.2.3/hive/Box-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> + + + + +_latefinal_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [scaffoldKey](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/scaffoldKey.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[ScaffoldState](https://api.flutter.dev/flutter/material/ScaffoldState-class.html)> + + + + +_final_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + +##### [url](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/url.md) ↔ [Box](https://pub.dev/documentation/hive/2.2.3/hive/Box-class.html) + + + + +_latefinal_ + + + +##### [user](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/user.md) ↔ [Box](https://pub.dev/documentation/hive/2.2.3/hive/Box-class.html)<[User](../models_user_user_info/User-class.md)> + + + + +_latefinal_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [attachListener](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/attachListener.md)([Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) setter) void + + + + + + + + +##### [changeCurrency](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/changeCurrency.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context, [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) setter) void + + + +This method changes the currency of the user for donation purpose. + + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [dominationButton](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/dominationButton.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) amount, [BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context, [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) setter) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +This widget returns button for domination. + + + + +##### [iconButton](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/iconButton.md)([Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) icon, [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) onTap) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +This widget returns the button for social media sharing option. + + + + +##### [initialize](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/initialize.md)() void + + + + + + + + +##### [invite](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/invite.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) void + + + +This function generates the organization invitation link in a Dialog Box. +Dialog box contains the QR-code of organization invite link and social media sharing options. + + + + +##### [logout](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/logout.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This method destroys the user's session or sign out the user from app. +The function asks for the confimation in Custom Alert Dialog. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [popBottomSheet](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/popBottomSheet.md)() void + + + + + + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [showSnackBar](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/showSnackBar.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) message) void + + + + + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [updateSheetHeight](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/updateSheetHeight.md)() void + + + + + + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/ProfilePageViewModel.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/ProfilePageViewModel.md new file mode 100644 index 000000000..d85feb283 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/ProfilePageViewModel.md @@ -0,0 +1,24 @@ + + + +# ProfilePageViewModel constructor + + + + + + + +ProfilePageViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/attachListener.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/attachListener.md new file mode 100644 index 000000000..edcf92782 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/attachListener.md @@ -0,0 +1,50 @@ + + + +# attachListener method + + + + + + + + +void attachListener +([Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) setter) + + + + + + + + +## Implementation + +```dart +void attachListener(Function setter) { + donationField.addListener(() { + if (donationField.hasFocus) { + setter(() { + bottomSheetHeight = SizeConfig.screenHeight! * 0.8725; + }); + } else { + Future.delayed(const Duration(milliseconds: 300), () { + { + setter(() { + bottomSheetHeight = SizeConfig.screenHeight! * 0.68; + }); + } + }); + } + }); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/bottomSheetHeight.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/bottomSheetHeight.md new file mode 100644 index 000000000..6b02dd542 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/bottomSheetHeight.md @@ -0,0 +1,32 @@ + + + +# bottomSheetHeight property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html) bottomSheetHeight + +_read / write_ + + + + + + +## Implementation + +```dart +double bottomSheetHeight = SizeConfig.screenHeight! * 0.68; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/changeCurrency.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/changeCurrency.md new file mode 100644 index 000000000..123044aa4 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/changeCurrency.md @@ -0,0 +1,46 @@ + + + +# changeCurrency method + + + + + + + + +void changeCurrency +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context, [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) setter) + + + + + +

This method changes the currency of the user for donation purpose.

+ + + +## Implementation + +```dart +void changeCurrency(BuildContext context, Function setter) { + showCurrencyPicker( + context: context, + currencyFilter: supportedCurrencies, + onSelect: (Currency currency) { + setter(() { + donationCurrency = currency.code; + donationCurrencySymbol = currency.symbol; + }); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/currentOrg.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/currentOrg.md new file mode 100644 index 000000000..6455d508d --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/currentOrg.md @@ -0,0 +1,32 @@ + + + +# currentOrg property + + + + + + + +[OrgInfo](../../models_organization_org_info/OrgInfo-class.md) currentOrg + +_read / write_ + + + + + + +## Implementation + +```dart +late OrgInfo currentOrg; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/currentUser.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/currentUser.md new file mode 100644 index 000000000..e955d4062 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/currentUser.md @@ -0,0 +1,32 @@ + + + +# currentUser property + + + + + + + +[User](../../models_user_user_info/User-class.md) currentUser + +_read / write_ + + + + + + +## Implementation + +```dart +late User currentUser; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/denomination.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/denomination.md new file mode 100644 index 000000000..d75e715f0 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/denomination.md @@ -0,0 +1,32 @@ + + + +# denomination property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html)> denomination + +_final_ + + + + + + +## Implementation + +```dart +final List denomination = ['1', '5', '10']; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/dominationButton.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/dominationButton.md new file mode 100644 index 000000000..b69ecf716 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/dominationButton.md @@ -0,0 +1,68 @@ + + + +# dominationButton method + + + + + + + + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) dominationButton +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) amount, [BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context, [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) setter) + + + + + +

This widget returns button for domination.

+

params:

+
    +
  • amount : donation Amount.
  • +
  • setter : Function type, which on tap set the amount to donationAmount.
  • +
+ + + +## Implementation + +```dart +Widget dominationButton( + String amount, + BuildContext context, + Function setter, +) { + return InkWell( + onTap: () { + setter(() { + donationAmount.text = amount; + }); + }, + child: Container( + padding: EdgeInsets.symmetric( + vertical: SizeConfig.screenHeight! * 0.02, + horizontal: SizeConfig.screenWidth! * 0.075, + ), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(10), + color: donationAmount.text == amount + ? Theme.of(context).colorScheme.secondary + : Theme.of(context).colorScheme.primary, + ), + child: Text( + '$donationCurrencySymbol $amount', + style: Theme.of(context).textTheme.titleMedium, + ), + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationAmount.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationAmount.md new file mode 100644 index 000000000..9ce57b258 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationAmount.md @@ -0,0 +1,32 @@ + + + +# donationAmount property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) donationAmount + +_read / write_ + + + + + + +## Implementation + +```dart +TextEditingController donationAmount = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationCurrency.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationCurrency.md new file mode 100644 index 000000000..aacae7fd4 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationCurrency.md @@ -0,0 +1,32 @@ + + + +# donationCurrency property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) donationCurrency + +_read / write_ + + + + + + +## Implementation + +```dart +String donationCurrency = "USD"; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationCurrencySymbol.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationCurrencySymbol.md new file mode 100644 index 000000000..bd1213350 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationCurrencySymbol.md @@ -0,0 +1,32 @@ + + + +# donationCurrencySymbol property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) donationCurrencySymbol + +_read / write_ + + + + + + +## Implementation + +```dart +String donationCurrencySymbol = "\$"; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationField.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationField.md new file mode 100644 index 000000000..a8002fbd9 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/donationField.md @@ -0,0 +1,32 @@ + + + +# donationField property + + + + + + + +[FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) donationField + +_final_ + + + + + + +## Implementation + +```dart +final FocusNode donationField = FocusNode(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/iconButton.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/iconButton.md new file mode 100644 index 000000000..3c4daade7 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/iconButton.md @@ -0,0 +1,52 @@ + + + +# iconButton method + + + + + + + + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) iconButton +([Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) icon, [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) onTap) + + + + + +

This widget returns the button for social media sharing option.

+

params:

+
    +
  • icon : This is Widget type with icon details.
  • +
  • onTap : This is Function, which invoke on tap.
  • +
+ + + +## Implementation + +```dart +Widget iconButton(Widget icon, Function onTap) { + return Stack( + children: [ + IconButton( + onPressed: () { + print('tapped'); + onTap(); + }, + icon: icon, + ), + ], + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/initialize.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/initialize.md new file mode 100644 index 000000000..831375087 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/initialize.md @@ -0,0 +1,39 @@ + + + +# initialize method + + + + + + + + +void initialize +() + + + + + + + + +## Implementation + +```dart +void initialize() { + setState(ViewState.busy); + currentOrg = _userConfig.currentOrg; + currentUser = _userConfig.currentUser; + setState(ViewState.idle); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/invite.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/invite.md new file mode 100644 index 000000000..3126aa8f9 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/invite.md @@ -0,0 +1,134 @@ + + + +# invite method + + + + + + + + +void invite +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + + + + + +

This function generates the organization invitation link in a Dialog Box. +Dialog box contains the QR-code of organization invite link and social media sharing options.

+ + + +## Implementation + +```dart +void invite(BuildContext context) { + _appLanguageService.initialize(); + // organization url + final String url = + 'https://cyberwake.github.io/applink/invite?selectLang=${_appLanguageService.appLocal.languageCode}&setUrl=${GraphqlConfig.orgURI}&selectOrg=${userConfig.currentOrg.id!}'; + // QR + final String qrData = + '${GraphqlConfig.orgURI}?orgid=${userConfig.currentOrg.id!}'; + print(url); + print(qrData); + showModalBottomSheet( + context: context, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), + builder: (BuildContext context) { + return ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + child: Container( + height: MediaQuery.of(context).size.height * 0.75, + decoration: const BoxDecoration( + color: Colors.white, + ), + child: Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + QrImage( + data: qrData, + version: QrVersions.auto, + size: 200.0, + foregroundColor: Colors.black, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.08, + ), + Text( + 'Scan the QR to join ${userConfig.currentOrg.name}', + style: const TextStyle(color: Colors.black), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.02, + ), + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisSize: MainAxisSize.min, + children: [ + iconButton( + const FaIcon( + FontAwesomeIcons.twitter, + size: 35, + color: Color(0xFF1DA1F2), + ), + () async => SocialShare.shareTwitter('Join us', url: url), + ), + iconButton( + CustomPaint( + size: const Size( + 50, + 50 * 1.004, + ), //You can Replace [WIDTH] with your desired width for Custom Paint and height will be calculated automatically + painter: WhatsappLogo(), + ), + () async => SocialShare.shareWhatsapp(url), + ), + iconButton( + CustomPaint( + size: Size( + 45, + (45 * 1).toDouble(), + ), //You can Replace [WIDTH] with your desired width for Custom Paint and height will be calculated automatically + painter: TelegramLogo(), + ), + () async => SocialShare.shareTelegram(url), + ), + iconButton( + const FaIcon( + FontAwesomeIcons.shareNodes, + size: 30, + color: Color(0xff40c351), + ), + () async => SocialShare.shareOptions(url), + ), + ], + ) + ], + ), + ), + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/logout.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/logout.md new file mode 100644 index 000000000..32f820dbc --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/logout.md @@ -0,0 +1,86 @@ + + + +# logout method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> logout +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + + + + + +

This method destroys the user's session or sign out the user from app. +The function asks for the confimation in Custom Alert Dialog.

+ + + +## Implementation + +```dart +Future logout(BuildContext context) async { + // push custom alert dialog with the confirmation message. + navigationService.pushDialog( + CustomAlertDialog( + reverse: true, + dialogSubTitle: 'Are you sure you want to logout?', + successText: 'Logout', + success: () async { + try { + final result = await databaseFunctions + .gqlAuthMutation(queries.logout()) as QueryResult?; + if (result != null && result.data!['logout'] == true) { + 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'); + final androidFirebaseOptionsBox = + Hive.box('androidFirebaseOptions'); + final iosFirebaseOptionsBox = Hive.box('iosFirebaseOptions'); + organisation = Hive.box('currentOrg'); + user.clear(); + url.clear(); + androidFirebaseOptionsBox.clear(); + iosFirebaseOptionsBox.clear(); + try { + Firebase.app() + .delete(); // Deleting app will stop all Firebase plugins + } catch (e) { + debugPrint("ERROR: Unable to delete firebase app $e"); + } + organisation.clear(); + navigationService.pop(); + navigationService.removeAllAndPush( + '/selectLang', + '/', + arguments: '0', + ); + }); + } + } catch (e) { + print(e); + } + }, + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/organisation.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/organisation.md new file mode 100644 index 000000000..3d34e04e3 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/organisation.md @@ -0,0 +1,32 @@ + + + +# organisation property + + + + + + + +[Box](https://pub.dev/documentation/hive/2.2.3/hive/Box-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> organisation + +_latefinal_ + + + + + + +## Implementation + +```dart +late final Box organisation; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/popBottomSheet.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/popBottomSheet.md new file mode 100644 index 000000000..13718f6ff --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/popBottomSheet.md @@ -0,0 +1,36 @@ + + + +# popBottomSheet method + + + + + + + + +void popBottomSheet +() + + + + + + + + +## Implementation + +```dart +void popBottomSheet() { + _navigationService.pop(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/scaffoldKey.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/scaffoldKey.md new file mode 100644 index 000000000..2ecabe500 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/scaffoldKey.md @@ -0,0 +1,32 @@ + + + +# scaffoldKey property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[ScaffoldState](https://api.flutter.dev/flutter/material/ScaffoldState-class.html)> scaffoldKey + +_final_ + + + + + + +## Implementation + +```dart +final GlobalKey scaffoldKey = GlobalKey(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/showSnackBar.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/showSnackBar.md new file mode 100644 index 000000000..aabf7b6b9 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/showSnackBar.md @@ -0,0 +1,36 @@ + + + +# showSnackBar method + + + + + + + + +void showSnackBar +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) message) + + + + + + + + +## Implementation + +```dart +void showSnackBar(String message) { + _navigationService.showTalawaErrorDialog(message, MessageType.error); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/updateSheetHeight.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/updateSheetHeight.md new file mode 100644 index 000000000..e79f361a2 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/updateSheetHeight.md @@ -0,0 +1,37 @@ + + + +# updateSheetHeight method + + + + + + + + +void updateSheetHeight +() + + + + + + + + +## Implementation + +```dart +void updateSheetHeight() { + bottomSheetHeight = SizeConfig.screenHeight! * 0.65; + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/url.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/url.md new file mode 100644 index 000000000..0c2f3bed7 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/url.md @@ -0,0 +1,32 @@ + + + +# url property + + + + + + + +[Box](https://pub.dev/documentation/hive/2.2.3/hive/Box-class.html) url + +_latefinal_ + + + + + + +## Implementation + +```dart +late final Box url; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/user.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/user.md new file mode 100644 index 000000000..441993dc6 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel/user.md @@ -0,0 +1,32 @@ + + + +# user property + + + + + + + +[Box](https://pub.dev/documentation/hive/2.2.3/hive/Box-class.html)<[User](../../models_user_user_info/User-class.md)> user + +_latefinal_ + + + + + + +## Implementation + +```dart +late final Box user; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/view_model_after_auth_view_models_profile_view_models_profile_page_view_model-library.md b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/view_model_after_auth_view_models_profile_view_models_profile_page_view_model-library.md new file mode 100644 index 000000000..02602c2f7 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_profile_view_models_profile_page_view_model/view_model_after_auth_view_models_profile_view_models_profile_page_view_model-library.md @@ -0,0 +1,39 @@ + + + + +# profile_page_view_model library + + + + + + + + + + + +## Classes + +##### [ProfilePageViewModel](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md) + + + +ProfilePageViewModel class helps to interact with model to serve data +and react to user's input in Profile Page view. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md new file mode 100644 index 000000000..4050b66df --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md @@ -0,0 +1,252 @@ + + + +# CreateTaskViewModel class + + + + + + + + + +

CreateTaskViewModel class helps to interact with model to serve data +and react to user's input in Create Task view.

+

Methods include:

+
    +
  • fillTask
  • +
  • `editTask
  • +
  • createTask
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- CreateTaskViewModel + + + + + + + + +## Constructors + +[CreateTaskViewModel](../view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/CreateTaskViewModel.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + +##### [taskDescriptionTextController](../view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskDescriptionTextController.md) → [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_final_ + + + +##### [taskEndDate](../view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskEndDate.md) ↔ [DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html) + + + + +_read / write_ + + + +##### [taskEndTime](../view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskEndTime.md) ↔ [TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html) + + + + +_read / write_ + + + +##### [taskTitleTextController](../view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskTitleTextController.md) → [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_final_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [createTask](../view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/createTask.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> + + + +This function creates a new task for an event. +The function uses createTask method provided by Task Services. + + + + +##### [dispose](../view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/dispose.md)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_override_ + + + +##### [editTask](../view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/editTask.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) taskId) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> + + + +This function updates the task. +The function uses editTask method provided by Task Services. + + + + +##### [fillTask](../view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/fillTask.md)([Task](../models_task_task_model/Task-class.md) task) void + + + +This functions fills the task controller data. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/CreateTaskViewModel.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/CreateTaskViewModel.md new file mode 100644 index 000000000..ddf303088 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/CreateTaskViewModel.md @@ -0,0 +1,24 @@ + + + +# CreateTaskViewModel constructor + + + + + + + +CreateTaskViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/createTask.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/createTask.md new file mode 100644 index 000000000..5bcc17868 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/createTask.md @@ -0,0 +1,54 @@ + + + +# createTask method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> createTask +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) + + + + + +

This function creates a new task for an event. +The function uses createTask method provided by Task Services.

+

params:

+
    +
  • eventId : id of the event for which task need to be add.
  • +
+ + + +## Implementation + +```dart +Future createTask(String eventId) async { + final deadline = DateTime( + taskEndDate.year, + taskEndDate.month, + taskEndDate.day, + taskEndTime.hour, + taskEndTime.minute, + ); + return _taskService.createTask( + title: taskTitleTextController.text, + description: taskDescriptionTextController.text, + deadline: deadline.microsecondsSinceEpoch.toString(), + eventId: eventId, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/dispose.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/dispose.md new file mode 100644 index 000000000..220418033 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/dispose.md @@ -0,0 +1,47 @@ + + + +# dispose method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +void dispose +() + +_override_ + + + +

Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed).

+

This method should only be called by the object's owner.

+

This method does not notify listeners, and clears the listener list once +it is called. Consumers of this class must decide on whether to notify +listeners or not immediately before disposal.

+ + + +## Implementation + +```dart +@override +void dispose() { + taskTitleTextController.dispose(); + taskDescriptionTextController.dispose(); + super.dispose(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/editTask.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/editTask.md new file mode 100644 index 000000000..bb4079d46 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/editTask.md @@ -0,0 +1,54 @@ + + + +# editTask method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> editTask +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) taskId) + + + + + +

This function updates the task. +The function uses editTask method provided by Task Services.

+

params:

+
    +
  • taskId : id of the task that needs to be updated.
  • +
+ + + +## Implementation + +```dart +Future editTask(String taskId) async { + final deadline = DateTime( + taskEndDate.year, + taskEndDate.month, + taskEndDate.day, + taskEndTime.hour, + taskEndTime.minute, + ); + return _taskService.editTask( + title: taskTitleTextController.text, + description: taskDescriptionTextController.text, + deadline: deadline.microsecondsSinceEpoch.toString(), + taskId: taskId, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/fillTask.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/fillTask.md new file mode 100644 index 000000000..5bea4157a --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/fillTask.md @@ -0,0 +1,47 @@ + + + +# fillTask method + + + + + + + + +void fillTask +([Task](../../models_task_task_model/Task-class.md) task) + + + + + +

This functions fills the task controller data.

+

params:

+
    +
  • task : Task type contain task data.
  • +
+ + + +## Implementation + +```dart +void fillTask(Task task) { + taskTitleTextController.text = task.title; + taskDescriptionTextController.text = task.description ?? ''; + if (task.deadline != null) { + taskEndDate = + DateTime.fromMicrosecondsSinceEpoch(int.parse(task.deadline!)); + taskEndTime = TimeOfDay.fromDateTime(taskEndDate); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskDescriptionTextController.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskDescriptionTextController.md new file mode 100644 index 000000000..7f032da66 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskDescriptionTextController.md @@ -0,0 +1,32 @@ + + + +# taskDescriptionTextController property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) taskDescriptionTextController + +_final_ + + + + + + +## Implementation + +```dart +final taskDescriptionTextController = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskEndDate.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskEndDate.md new file mode 100644 index 000000000..696d43408 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskEndDate.md @@ -0,0 +1,32 @@ + + + +# taskEndDate property + + + + + + + +[DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html) taskEndDate + +_read / write_ + + + + + + +## Implementation + +```dart +DateTime taskEndDate = DateTime.now(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskEndTime.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskEndTime.md new file mode 100644 index 000000000..3e1250440 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskEndTime.md @@ -0,0 +1,32 @@ + + + +# taskEndTime property + + + + + + + +[TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html) taskEndTime + +_read / write_ + + + + + + +## Implementation + +```dart +TimeOfDay taskEndTime = TimeOfDay.now(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskTitleTextController.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskTitleTextController.md new file mode 100644 index 000000000..9936df399 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel/taskTitleTextController.md @@ -0,0 +1,32 @@ + + + +# taskTitleTextController property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) taskTitleTextController + +_final_ + + + + + + +## Implementation + +```dart +final taskTitleTextController = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/view_model_after_auth_view_models_task_view_models_create_task_view_model-library.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/view_model_after_auth_view_models_task_view_models_create_task_view_model-library.md new file mode 100644 index 000000000..cfbe42c2b --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_create_task_view_model/view_model_after_auth_view_models_task_view_models_create_task_view_model-library.md @@ -0,0 +1,39 @@ + + + + +# create_task_view_model library + + + + + + + + + + + +## Classes + +##### [CreateTaskViewModel](../view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md) + + + +CreateTaskViewModel class helps to interact with model to serve data +and react to user's input in Create Task view. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel-class.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel-class.md new file mode 100644 index 000000000..688e124ea --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel-class.md @@ -0,0 +1,226 @@ + + + +# ExploreTasksViewModel class + + + + + + + + + +

ExploreTasksViewModel class helps to interact with model to serve data +and react to user's input in Explore Task section.

+

Methods include:

+
    +
  • fetchTasks
  • +
  • `fetchTasksByUser
  • +
  • deleteTask
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- ExploreTasksViewModel + + + + + + + + +## Constructors + +[ExploreTasksViewModel](../view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/ExploreTasksViewModel.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + +##### [tasks](../view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/tasks.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Task](../models_task_task_model/Task-class.md)> + + + + +_read-only_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [deleteTask](../view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/deleteTask.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) taskId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) creatorId) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function deletes the task for an event. +The function uses deleteTask method of Task Service. + + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [fetchTasks](../view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/fetchTasks.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function fetch all the task for an event. +The function uses getTasksForEvent method of Task Service. + + + + +##### [fetchTasksByUser](../view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/fetchTasksByUser.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function fetch tasks created by the current user for an event. +The function uses getTasksByUser method of Task Service. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/ExploreTasksViewModel.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/ExploreTasksViewModel.md new file mode 100644 index 000000000..3d09387b0 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/ExploreTasksViewModel.md @@ -0,0 +1,31 @@ + + + +# ExploreTasksViewModel constructor + + + + + + + +ExploreTasksViewModel() + + + + + +## Implementation + +```dart +ExploreTasksViewModel() { + _taskService.callbackNotifyListeners = () => notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/deleteTask.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/deleteTask.md new file mode 100644 index 000000000..45d4afc88 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/deleteTask.md @@ -0,0 +1,44 @@ + + + +# deleteTask method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> deleteTask +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) taskId, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) creatorId) + + + + + +

This function deletes the task for an event. +The function uses deleteTask method of Task Service.

+

params:

+
    +
  • taskId : id of the task need to be deleted.
  • +
  • creatorId : id of the task creator.
  • +
+ + + +## Implementation + +```dart +Future deleteTask(String taskId, String creatorId) async { + await _taskService.deleteTask(taskId, creatorId); + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/fetchTasks.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/fetchTasks.md new file mode 100644 index 000000000..fc7f65268 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/fetchTasks.md @@ -0,0 +1,44 @@ + + + +# fetchTasks method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> fetchTasks +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId) + + + + + +

This function fetch all the task for an event. +The function uses getTasksForEvent method of Task Service.

+

params:

+
    +
  • eventId : id of an event for which tasks need to be fetched.
  • +
+ + + +## Implementation + +```dart +Future fetchTasks(String eventId) async { + setState(ViewState.busy); + await _taskService.getTasksForEvent(eventId); + setState(ViewState.idle); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/fetchTasksByUser.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/fetchTasksByUser.md new file mode 100644 index 000000000..968e5f374 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/fetchTasksByUser.md @@ -0,0 +1,40 @@ + + + +# fetchTasksByUser method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> fetchTasksByUser +() + + + + + +

This function fetch tasks created by the current user for an event. +The function uses getTasksByUser method of Task Service.

+ + + +## Implementation + +```dart +Future fetchTasksByUser() async { + setState(ViewState.busy); + await _taskService.getTasksByUser(); + setState(ViewState.idle); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/tasks.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/tasks.md new file mode 100644 index 000000000..a04396c29 --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel/tasks.md @@ -0,0 +1,35 @@ + + + +# tasks property + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Task](../../models_task_task_model/Task-class.md)> tasks + + + + + + + + +## Implementation + +```dart +List get tasks => _taskService.tasks; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model-library.md b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model-library.md new file mode 100644 index 000000000..bdfdc5fcf --- /dev/null +++ b/talawa-mobile-docs/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/view_model_after_auth_view_models_task_view_models_explore_tasks_view_model-library.md @@ -0,0 +1,39 @@ + + + + +# explore_tasks_view_model library + + + + + + + + + + + +## Classes + +##### [ExploreTasksViewModel](../view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel-class.md) + + + +ExploreTasksViewModel class helps to interact with model to serve data +and react to user's input in Explore Task section. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_base_view_model/BaseModel-class.md b/talawa-mobile-docs/view_model_base_view_model/BaseModel-class.md new file mode 100644 index 000000000..873cf71cf --- /dev/null +++ b/talawa-mobile-docs/view_model_base_view_model/BaseModel-class.md @@ -0,0 +1,206 @@ + + + +# BaseModel class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- BaseModel + + + +**Implementers** + +- [AccessScreenViewModel](../view_model_access_request_view_model/AccessScreenViewModel-class.md) +- [AddPostViewModel](../view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md) +- [AppLanguage](../view_model_lang_view_model/AppLanguage-class.md) +- [AppTheme](../view_model_theme_view_model/AppTheme-class.md) +- [CommentsViewModel](../view_model_widgets_view_models_comments_view_model/CommentsViewModel-class.md) +- [CreateEventViewModel](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md) +- [CreateTaskViewModel](../view_model_after_auth_view_models_task_view_models_create_task_view_model/CreateTaskViewModel-class.md) +- [CustomDrawerViewModel](../view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md) +- [DemoViewModel](../main/DemoViewModel-class.md) +- [DirectChatViewModel](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md) +- [EditEventViewModel](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md) +- [EditProfilePageViewModel](../view_model_after_auth_view_models_profile_view_models_edit_profile_view_model/EditProfilePageViewModel-class.md) +- [EventInfoViewModel](../view_model_after_auth_view_models_event_view_models_event_info_view_model/EventInfoViewModel-class.md) +- [ExploreEventsViewModel](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md) +- [ExploreTasksViewModel](../view_model_after_auth_view_models_task_view_models_explore_tasks_view_model/ExploreTasksViewModel-class.md) +- [LikeButtonViewModel](../view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md) +- [LoginViewModel](../view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md) +- [MainScreenViewModel](../view_model_main_screen_view_model/MainScreenViewModel-class.md) +- [OrganizationFeedViewModel](../view_model_after_auth_view_models_feed_view_models_organization_feed_view_model/OrganizationFeedViewModel-class.md) +- [ProfilePageViewModel](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md) +- [ProgressDialogViewModel](../view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel-class.md) +- [SelectContactViewModel](../view_model_after_auth_view_models_chat_view_models_select_contact_view_model/SelectContactViewModel-class.md) +- [SelectOrganizationViewModel](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md) +- [SetUrlViewModel](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md) +- [SignupDetailsViewModel](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md) +- [WaitingViewModel](../view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel-class.md) + + + + + +## Constructors + +[BaseModel](../view_model_base_view_model/BaseModel/BaseModel.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-only_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-only_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_base_view_model/BaseModel/BaseModel.md b/talawa-mobile-docs/view_model_base_view_model/BaseModel/BaseModel.md new file mode 100644 index 000000000..679d13ccb --- /dev/null +++ b/talawa-mobile-docs/view_model_base_view_model/BaseModel/BaseModel.md @@ -0,0 +1,24 @@ + + + +# BaseModel constructor + + + + + + + +BaseModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_base_view_model/BaseModel/isBusy.md b/talawa-mobile-docs/view_model_base_view_model/BaseModel/isBusy.md new file mode 100644 index 000000000..e7de222ca --- /dev/null +++ b/talawa-mobile-docs/view_model_base_view_model/BaseModel/isBusy.md @@ -0,0 +1,35 @@ + + + +# isBusy property + + + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isBusy + + + + + + + + +## Implementation + +```dart +bool get isBusy => _state == ViewState.busy; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_base_view_model/BaseModel/setState.md b/talawa-mobile-docs/view_model_base_view_model/BaseModel/setState.md new file mode 100644 index 000000000..a225602b8 --- /dev/null +++ b/talawa-mobile-docs/view_model_base_view_model/BaseModel/setState.md @@ -0,0 +1,37 @@ + + + +# setState method + + + + + + + + +void setState +([ViewState](../../enums_enums/ViewState.md) viewState) + + + + + + + + +## Implementation + +```dart +void setState(ViewState viewState) { + _state = viewState; + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_base_view_model/BaseModel/state.md b/talawa-mobile-docs/view_model_base_view_model/BaseModel/state.md new file mode 100644 index 000000000..1c802c49d --- /dev/null +++ b/talawa-mobile-docs/view_model_base_view_model/BaseModel/state.md @@ -0,0 +1,35 @@ + + + +# state property + + + + + + + + + +[ViewState](../../enums_enums/ViewState.md) state + + + + + + + + +## Implementation + +```dart +ViewState get state => _state; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_base_view_model/view_model_base_view_model-library.md b/talawa-mobile-docs/view_model_base_view_model/view_model_base_view_model-library.md new file mode 100644 index 000000000..95dcbc20c --- /dev/null +++ b/talawa-mobile-docs/view_model_base_view_model/view_model_base_view_model-library.md @@ -0,0 +1,38 @@ + + + + +# base_view_model library + + + + + + + + + + + +## Classes + +##### [BaseModel](../view_model_base_view_model/BaseModel-class.md) + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_lang_view_model/AppLanguage-class.md b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage-class.md new file mode 100644 index 000000000..2927d291d --- /dev/null +++ b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage-class.md @@ -0,0 +1,292 @@ + + + +# AppLanguage class + + + + + + + + + +

AppLanguage view model class interact with modal in the context of the App Language. +The class provides methods that set's the language, change the language in the modal.

+

Methods include:

+
    +
  • fetchLocale
  • +
  • changeLanguage
  • +
  • selectLanguagePress
  • +
  • dbLanguageUpdate
  • +
  • appLanguageQuery
  • +
  • userLanguageQuery
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- AppLanguage + + + + + + + + +## Constructors + +[AppLanguage](../view_model_lang_view_model/AppLanguage/AppLanguage.md) ({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isTest = false}) + + + + +## Properties + +##### [appLocal](../view_model_lang_view_model/AppLanguage/appLocal.md) → [Locale](https://api.flutter.dev/flutter/dart-ui/Locale-class.html) + + + + +_read-only_ + + + +##### [databaseFunctions](../view_model_lang_view_model/AppLanguage/databaseFunctions.md) → [DataBaseMutationFunctions](../services_database_mutation_functions/DataBaseMutationFunctions-class.md) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [isTest](../view_model_lang_view_model/AppLanguage/isTest.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_final_ + + + +##### [navigationService](../view_model_lang_view_model/AppLanguage/navigationService.md) → [NavigationService](../services_navigation_service/NavigationService-class.md) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [appLanguageQuery](../view_model_lang_view_model/AppLanguage/appLanguageQuery.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function perform graphQL query to check the app language. +The function uses gqlAuthQuery method provided by Database Functions Services. + + + + +##### [changeLanguage](../view_model_lang_view_model/AppLanguage/changeLanguage.md)([Locale](https://api.flutter.dev/flutter/dart-ui/Locale-class.html) type) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function change the app default language. + + + + +##### [dbLanguageUpdate](../view_model_lang_view_model/AppLanguage/dbLanguageUpdate.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function updates the Database Language by running the graphQL mutations. + + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [fetchLocale](../view_model_lang_view_model/AppLanguage/fetchLocale.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function fetch the language of the user's app. + + + + +##### [initialize](../view_model_lang_view_model/AppLanguage/initialize.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [selectLanguagePress](../view_model_lang_view_model/AppLanguage/selectLanguagePress.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function navigate user to /appSettingsPage route if the user is authenticated +else navigate to /setUrl route. + + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [userLanguageQuery](../view_model_lang_view_model/AppLanguage/userLanguageQuery.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) userId) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function perform graphQL query to check the user's language in the database. +The function uses gqlAuthQuery method provided by Database Functions Services. + + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/AppLanguage.md b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/AppLanguage.md new file mode 100644 index 000000000..893a5b3d7 --- /dev/null +++ b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/AppLanguage.md @@ -0,0 +1,29 @@ + + + +# AppLanguage constructor + + + + + + + +AppLanguage({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isTest = false}) + + + + + +## Implementation + +```dart +AppLanguage({this.isTest = false}); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/appLanguageQuery.md b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/appLanguageQuery.md new file mode 100644 index 000000000..5720f3225 --- /dev/null +++ b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/appLanguageQuery.md @@ -0,0 +1,42 @@ + + + +# appLanguageQuery method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> appLanguageQuery +() + + + + + +

This function perform graphQL query to check the app language. +The function uses gqlAuthQuery method provided by Database Functions Services.

+ + + +## Implementation + +```dart +Future appLanguageQuery() async { + try { + await databaseFunctions.gqlAuthQuery(queries.userLanguage()); + } catch (e) { + print(e); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/appLocal.md b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/appLocal.md new file mode 100644 index 000000000..6dfb7e022 --- /dev/null +++ b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/appLocal.md @@ -0,0 +1,35 @@ + + + +# appLocal property + + + + + + + + + +[Locale](https://api.flutter.dev/flutter/dart-ui/Locale-class.html) appLocal + + + + + + + + +## Implementation + +```dart +Locale get appLocal => _appLocale; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/changeLanguage.md b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/changeLanguage.md new file mode 100644 index 000000000..623634d01 --- /dev/null +++ b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/changeLanguage.md @@ -0,0 +1,94 @@ + + + +# changeLanguage method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> changeLanguage +([Locale](https://api.flutter.dev/flutter/dart-ui/Locale-class.html) type) + + + + + +

This function change the app default language.

+

params:

+
    +
  • type : Locale type, the language need to be updated with.
  • +
+ + + +## Implementation + +```dart +Future changeLanguage(Locale type) async { + // if the app language is of same [type]. + 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 (type == const Locale("de")) { + //If selected language is Chinese + _appLocale = const Locale("de"); + await prefs.setString('language_code', 'de'); + await prefs.setString('countryCode', 'GE'); + } else if (type == const Locale("ja")) { + //If selected language is Chinese + _appLocale = const Locale("ja"); + await prefs.setString('language_code', 'ja'); + await prefs.setString('countryCode', 'JP'); + } else if (type == const Locale("pt")) { + //If selected language is Chinese + _appLocale = const Locale("pt"); + await prefs.setString('language_code', 'pt'); + await prefs.setString('countryCode', 'PT'); + } else { + //If selected language is english + _appLocale = const Locale("en"); + await prefs.setString('language_code', 'en'); + await prefs.setString('countryCode', 'US'); + } + } + + /// notifying the consumers + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/databaseFunctions.md b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/databaseFunctions.md new file mode 100644 index 000000000..3d86d3cd6 --- /dev/null +++ b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/databaseFunctions.md @@ -0,0 +1,32 @@ + + + +# databaseFunctions property + + + + + + + +[DataBaseMutationFunctions](../../services_database_mutation_functions/DataBaseMutationFunctions-class.md) databaseFunctions + +_final_ + + + + + + +## Implementation + +```dart +final databaseFunctions = locator(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/dbLanguageUpdate.md b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/dbLanguageUpdate.md new file mode 100644 index 000000000..82e5677ef --- /dev/null +++ b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/dbLanguageUpdate.md @@ -0,0 +1,43 @@ + + + +# dbLanguageUpdate method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> dbLanguageUpdate +() + + + + + +

This function updates the Database Language by running the graphQL mutations.

+ + + +## Implementation + +```dart +Future dbLanguageUpdate() async { + try { + await databaseFunctions + .gqlAuthMutation(queries.updateLanguage(_appLocale.languageCode)); + print('Language Updated in Database'); + } catch (e) { + print(e); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/fetchLocale.md b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/fetchLocale.md new file mode 100644 index 000000000..6958ea213 --- /dev/null +++ b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/fetchLocale.md @@ -0,0 +1,41 @@ + + + +# fetchLocale method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> fetchLocale +() + + + + + +

This function fetch the language of the user's app.

+ + + +## Implementation + +```dart +Future fetchLocale() async { + final prefs = await SharedPreferences.getInstance(); + final String langCode = prefs.getString('language_code') ?? 'en'; + _appLocale = Locale(langCode); + + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/initialize.md b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/initialize.md new file mode 100644 index 000000000..8892ae6b8 --- /dev/null +++ b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/initialize.md @@ -0,0 +1,37 @@ + + + +# initialize method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> initialize +() + + + + + + + + +## Implementation + +```dart +Future initialize() async { + _appLocale = const Locale('en'); + await fetchLocale(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/isTest.md b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/isTest.md new file mode 100644 index 000000000..e6e920cda --- /dev/null +++ b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/isTest.md @@ -0,0 +1,32 @@ + + + +# isTest property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isTest + +_final_ + + + + + + +## Implementation + +```dart +final bool isTest; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/navigationService.md b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/navigationService.md new file mode 100644 index 000000000..e7dcec48a --- /dev/null +++ b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/navigationService.md @@ -0,0 +1,32 @@ + + + +# navigationService property + + + + + + + +[NavigationService](../../services_navigation_service/NavigationService-class.md) navigationService + +_final_ + + + + + + +## Implementation + +```dart +final navigationService = locator(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/selectLanguagePress.md b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/selectLanguagePress.md new file mode 100644 index 000000000..22b21ec3f --- /dev/null +++ b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/selectLanguagePress.md @@ -0,0 +1,44 @@ + + + +# selectLanguagePress method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> selectLanguagePress +() + + + + + +

This function navigate user to /appSettingsPage route if the user is authenticated +else navigate to /setUrl route.

+ + + +## Implementation + +```dart +Future selectLanguagePress() async { + final bool userLoggedIn = await userConfig.userLoggedIn(); + if (userLoggedIn) { + dbLanguageUpdate(); + navigationService.popAndPushScreen('/appSettingsPage', arguments: ''); + } else { + navigationService.pushScreen('/setUrl', arguments: ''); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/userLanguageQuery.md b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/userLanguageQuery.md new file mode 100644 index 000000000..2a4c097b7 --- /dev/null +++ b/talawa-mobile-docs/view_model_lang_view_model/AppLanguage/userLanguageQuery.md @@ -0,0 +1,46 @@ + + + +# userLanguageQuery method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> userLanguageQuery +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) userId) + + + + + +

This function perform graphQL query to check the user's language in the database. +The function uses gqlAuthQuery method provided by Database Functions Services.

+

params:

+
    +
  • userId : user for which language need to be fetch.
  • +
+ + + +## Implementation + +```dart +Future userLanguageQuery(String userId) async { + try { + await databaseFunctions.gqlAuthQuery(queries.newUserLanguage(userId)); + } catch (e) { + print(e); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_lang_view_model/view_model_lang_view_model-library.md b/talawa-mobile-docs/view_model_lang_view_model/view_model_lang_view_model-library.md new file mode 100644 index 000000000..6ab708dcf --- /dev/null +++ b/talawa-mobile-docs/view_model_lang_view_model/view_model_lang_view_model-library.md @@ -0,0 +1,39 @@ + + + + +# lang_view_model library + + + + + + + + + + + +## Classes + +##### [AppLanguage](../view_model_lang_view_model/AppLanguage-class.md) + + + +AppLanguage view model class interact with modal in the context of the App Language. +The class provides methods that set's the language, change the language in the modal. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel-class.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel-class.md new file mode 100644 index 000000000..6935ca705 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel-class.md @@ -0,0 +1,616 @@ + + + +# MainScreenViewModel class + + + + + + + + + +

MainScreenViewModel class provide methods to interact with the modal to serve data in user's action in Main Screen Views.

+

The functions in this class are +mainly in the context of Tutorials for different componenets of the App.

+

Functions include:

+
    +
  • showTutorial
  • +
  • showHome
  • +
  • tourEventTargets
  • +
  • tourAddPost
  • +
  • tourChat
  • +
  • tourProfile
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- MainScreenViewModel + + + + + + + + +## Constructors + +[MainScreenViewModel](../view_model_main_screen_view_model/MainScreenViewModel/MainScreenViewModel.md) () + + + + +## Properties + +##### [context](../view_model_main_screen_view_model/MainScreenViewModel/context.md) ↔ [BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) + + + +context consist of parent info. +_read / write_ + + + +##### [currentPageIndex](../view_model_main_screen_view_model/MainScreenViewModel/currentPageIndex.md) ↔ [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +var for current page in index. +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [keyBNChat](../view_model_main_screen_view_model/MainScreenViewModel/keyBNChat.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keyBNEvents](../view_model_main_screen_view_model/MainScreenViewModel/keyBNEvents.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keyBNHome](../view_model_main_screen_view_model/MainScreenViewModel/keyBNHome.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keyBNPost](../view_model_main_screen_view_model/MainScreenViewModel/keyBNPost.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keyBNProfile](../view_model_main_screen_view_model/MainScreenViewModel/keyBNProfile.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keySEAdd](../view_model_main_screen_view_model/MainScreenViewModel/keySEAdd.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keySECard](../view_model_main_screen_view_model/MainScreenViewModel/keySECard.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keySECategoryMenu](../view_model_main_screen_view_model/MainScreenViewModel/keySECategoryMenu.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keySEDateFilter](../view_model_main_screen_view_model/MainScreenViewModel/keySEDateFilter.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keySHMenuIcon](../view_model_main_screen_view_model/MainScreenViewModel/keySHMenuIcon.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keySHOrgName](../view_model_main_screen_view_model/MainScreenViewModel/keySHOrgName.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keySHPinnedPost](../view_model_main_screen_view_model/MainScreenViewModel/keySHPinnedPost.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keySHPost](../view_model_main_screen_view_model/MainScreenViewModel/keySHPost.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keySPAppSetting](../view_model_main_screen_view_model/MainScreenViewModel/keySPAppSetting.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keySPDonateUs](../view_model_main_screen_view_model/MainScreenViewModel/keySPDonateUs.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keySPEditProfile](../view_model_main_screen_view_model/MainScreenViewModel/keySPEditProfile.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keySPHelp](../view_model_main_screen_view_model/MainScreenViewModel/keySPHelp.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keySPInvite](../view_model_main_screen_view_model/MainScreenViewModel/keySPInvite.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keySPLogout](../view_model_main_screen_view_model/MainScreenViewModel/keySPLogout.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keySPPalisadoes](../view_model_main_screen_view_model/MainScreenViewModel/keySPPalisadoes.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [navBarItems](../view_model_main_screen_view_model/MainScreenViewModel/navBarItems.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[BottomNavigationBarItem](https://api.flutter.dev/flutter/widgets/BottomNavigationBarItem-class.html)> + + + +Actual BottomNavigationBarItems that show up on the screen. +_read / write_ + + + +##### [pages](../view_model_main_screen_view_model/MainScreenViewModel/pages.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html)> + + + +Contains the Widgets to be rendered for corresponding navbar items. +_read / write_ + + + +##### [pluginList](../view_model_main_screen_view_model/MainScreenViewModel/pluginList.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html) + + + +list of all the pluginList. +_read / write_ + + + +##### [pluginPrototypeData](../view_model_main_screen_view_model/MainScreenViewModel/pluginPrototypeData.md) ↔ [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html) + + + +Maps the feature names with their proper Icon and Page. +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [showAppTour](../view_model_main_screen_view_model/MainScreenViewModel/showAppTour.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +bool to determine if we wanna show the apptour. +_read / write_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + +##### [targets](../view_model_main_screen_view_model/MainScreenViewModel/targets.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[TargetFocus](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/TargetFocus-class.html)> + + + +array of target. +_final_ + + + +##### [tourComplete](../view_model_main_screen_view_model/MainScreenViewModel/tourComplete.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +bool to determine if apptour is complete. +_read / write_ + + + +##### [tourSkipped](../view_model_main_screen_view_model/MainScreenViewModel/tourSkipped.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +bool to determine if apptour is skipped. +_read / write_ + + + +##### [tutorialCoachMark](../view_model_main_screen_view_model/MainScreenViewModel/tutorialCoachMark.md) ↔ [TutorialCoachMark](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/TutorialCoachMark-class.html) + + + +tutorialCoachMark consist of coach used to give tutorial. +_read / write_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [fetchAndAddPlugins](../view_model_main_screen_view_model/MainScreenViewModel/fetchAndAddPlugins.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) void + + + +Dynamically adds BottomNavigationBarItems in BottomNavigationBar. + + + + +##### [focusTarget](../view_model_main_screen_view_model/MainScreenViewModel/focusTarget.md)([GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> key, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) keyName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) description, {[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isCircle = false, [ContentAlign](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/ContentAlign.html) align = ContentAlign.bottom, [CrossAxisAlignment](https://api.flutter.dev/flutter/rendering/CrossAxisAlignment.html) crossAlign = CrossAxisAlignment.start, [Alignment](https://api.flutter.dev/flutter/painting/Alignment-class.html) skipAlignment = Alignment.topRight, [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html)? next, [CrossAxisAlignment](https://api.flutter.dev/flutter/rendering/CrossAxisAlignment.html) nextCrossAlign = CrossAxisAlignment.end, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isEnd = false}) [TargetFocus](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/TargetFocus-class.html) + + + +This returns a widget for a step in a tutorial. + + + + +##### [initialise](../view_model_main_screen_view_model/MainScreenViewModel/initialise.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) ctx, {required [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) fromSignUp, required [int](https://api.flutter.dev/flutter/dart-core/int-class.html) mainScreenIndex}) void + + + +Initalizing function. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [onTabTapped](../view_model_main_screen_view_model/MainScreenViewModel/onTabTapped.md)([int](https://api.flutter.dev/flutter/dart-core/int-class.html) index) void + + + +Handles click on BottomNavigationBarItem. + + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [showHome](../view_model_main_screen_view_model/MainScreenViewModel/showHome.md)([TargetFocus](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/TargetFocus-class.html) clickedTarget) void + + + +This function shows the Home screen. + + + + +##### [showTutorial](../view_model_main_screen_view_model/MainScreenViewModel/showTutorial.md)({required dynamic onClickTarget([TargetFocus](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/TargetFocus-class.html)), required dynamic onFinish()}) void + + + +This function show tutorial to user. + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [tourAddPost](../view_model_main_screen_view_model/MainScreenViewModel/tourAddPost.md)() void + + + +This function show the tutorial to add Post in the organization. + + + + +##### [tourChat](../view_model_main_screen_view_model/MainScreenViewModel/tourChat.md)() void + + + +This function show the tour of chats. + + + + +##### [tourEventTargets](../view_model_main_screen_view_model/MainScreenViewModel/tourEventTargets.md)() void + + + +This function show the tutorial for Events. + + + + +##### [tourHomeTargets](../view_model_main_screen_view_model/MainScreenViewModel/tourHomeTargets.md)() void + + + +this functions starts the tour and info to be displayed is mentioned in this functions. + + + + +##### [tourProfile](../view_model_main_screen_view_model/MainScreenViewModel/tourProfile.md)() void + + + +This function show the tutorial for the profile page. + + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + +## Static Properties + +##### [keyDrawerCurOrg](../view_model_main_screen_view_model/MainScreenViewModel/keyDrawerCurOrg.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keyDrawerJoinOrg](../view_model_main_screen_view_model/MainScreenViewModel/keyDrawerJoinOrg.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keyDrawerLeaveCurrentOrg](../view_model_main_screen_view_model/MainScreenViewModel/keyDrawerLeaveCurrentOrg.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [keyDrawerSwitchableOrg](../view_model_main_screen_view_model/MainScreenViewModel/keyDrawerSwitchableOrg.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +static variables. +_final_ + + + +##### [scaffoldKey](../view_model_main_screen_view_model/MainScreenViewModel/scaffoldKey.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[ScaffoldState](https://api.flutter.dev/flutter/material/ScaffoldState-class.html)> + + + +static variables. +_final_ + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/MainScreenViewModel.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/MainScreenViewModel.md new file mode 100644 index 000000000..0351920dc --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/MainScreenViewModel.md @@ -0,0 +1,24 @@ + + + +# MainScreenViewModel constructor + + + + + + + +MainScreenViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/context.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/context.md new file mode 100644 index 000000000..e4087fcab --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/context.md @@ -0,0 +1,33 @@ + + + +# context property + + + + + + + +[BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context + +_read / write_ + + + +

context consist of parent info.

+ + + +## Implementation + +```dart +late BuildContext context; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/currentPageIndex.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/currentPageIndex.md new file mode 100644 index 000000000..93f295260 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/currentPageIndex.md @@ -0,0 +1,33 @@ + + + +# currentPageIndex property + + + + + + + +[int](https://api.flutter.dev/flutter/dart-core/int-class.html) currentPageIndex + +_read / write_ + + + +

var for current page in index.

+ + + +## Implementation + +```dart +int currentPageIndex = 0; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/fetchAndAddPlugins.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/fetchAndAddPlugins.md new file mode 100644 index 000000000..9e2ca0105 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/fetchAndAddPlugins.md @@ -0,0 +1,142 @@ + + + +# fetchAndAddPlugins method + + + + + + + + +void fetchAndAddPlugins +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + + + + + +

Dynamically adds BottomNavigationBarItems in BottomNavigationBar.

+

by mapping over the data received from the server.

+

params:

+
    +
  • context: its the same context you use everywhere in the flutter framework refer flutter docs for more info.
  • +
+

returns: + None

+ + + +## Implementation + +```dart +void fetchAndAddPlugins( + BuildContext context, +) { + navBarItems = [ + BottomNavigationBarItem( + icon: Icon( + Icons.home, + key: keyBNHome, + ), + label: AppLocalizations.of(context)!.strictTranslate('Home'), + ), + BottomNavigationBarItem( + icon: Icon( + Icons.event_note, + key: keyBNEvents, + ), + label: AppLocalizations.of(context)!.strictTranslate('Events'), + ), + BottomNavigationBarItem( + icon: Icon( + Icons.add_box, + key: keyBNPost, + ), + label: AppLocalizations.of(context)!.strictTranslate('Add'), + ), + BottomNavigationBarItem( + icon: Icon( + Icons.chat_outlined, + key: keyBNChat, + ), + label: AppLocalizations.of(context)!.strictTranslate('Chat'), + ), + BottomNavigationBarItem( + icon: Icon( + Icons.account_circle, + key: keyBNProfile, + ), + label: AppLocalizations.of(context)!.strictTranslate('Profile'), + ) + ]; + + pages = [ + OrganizationFeed( + key: const Key("HomeView"), + homeModel: this, + ), + ExploreEvents( + key: const Key('ExploreEvents'), + homeModel: this, + ), + AddPost( + key: const Key('AddPost'), + drawerKey: MainScreenViewModel.scaffoldKey, + ), + const ChatPage( + key: Key('Chats'), + ), + ProfilePage( + key: keySPEditProfile, + homeModel: this, + ), + ]; + + pluginList = (Hive.box('pluginBox').get('plugins') ?? []) as List; + + pluginList.forEach((plugin) { + if (pluginPrototypeData.containsKey( + (plugin as Map)["pluginName"] as String, + ) && + plugin["pluginInstallStatus"] as bool) { + navBarItems.add( + BottomNavigationBarItem( + icon: Icon( + (pluginPrototypeData[plugin["pluginName"]] + as Map)["icon"] as IconData, + ), + label: AppLocalizations.of(context)!.strictTranslate( + plugin["pluginName"] as String, + ), + ), + ); + pages.add( + (pluginPrototypeData[plugin["pluginName"]] + as Map)["class"] as StatelessWidget, + ); + } + }); + + /// Causes the app check the plugins updates in every 300 sec + /// + /// updated and re-render the navbar + Timer.periodic(const Duration(seconds: 300), (timer) { + FetchPluginList(); + final newPluginList = + (Hive.box('pluginBox').get('plugins') ?? []) as List; + + if (listEquals(pluginList, newPluginList)) { + notifyListeners(); + } + }); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/focusTarget.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/focusTarget.md new file mode 100644 index 000000000..0e1e09f12 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/focusTarget.md @@ -0,0 +1,124 @@ + + + +# focusTarget method + + + + + + + + +[TargetFocus](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/TargetFocus-class.html) focusTarget +([GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> key, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) keyName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) description, {[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isCircle = false, [ContentAlign](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/ContentAlign.html) align = ContentAlign.bottom, [CrossAxisAlignment](https://api.flutter.dev/flutter/rendering/CrossAxisAlignment.html) crossAlign = CrossAxisAlignment.start, [Alignment](https://api.flutter.dev/flutter/painting/Alignment-class.html) skipAlignment = Alignment.topRight, [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html)? next, [CrossAxisAlignment](https://api.flutter.dev/flutter/rendering/CrossAxisAlignment.html) nextCrossAlign = CrossAxisAlignment.end, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isEnd = false}) + + + + + +

This returns a widget for a step in a tutorial.

+

params:

+
    +
  • key: key of type GlobalKey.
  • +
  • keyName: key where the widget shows.
  • +
  • description: description of the step.
  • +
  • isCircle: bool to specify if circle
  • +
  • align: align of type ContentAlign to align button.
  • +
  • crossAlign: Cross align axes
  • +
  • skipAlignment: to give alignment of skip option
  • +
  • next: Functiontype, this show the next step orkey` to show the tour of.
  • +
  • nextCrossAlign: nextCrossAlign to give alignment of next option
  • +
  • isEnd: true if last step of the tour.
  • +
+

returns:

+
    +
  • TargetFocus: This return widget foa a step in a tut
  • +
+ + + +## Implementation + +```dart +TargetFocus focusTarget( + GlobalKey key, + String keyName, + String description, { + bool isCircle = false, + ContentAlign align = ContentAlign.bottom, + CrossAxisAlignment crossAlign = CrossAxisAlignment.start, + Alignment skipAlignment = Alignment.topRight, + Function? next, + CrossAxisAlignment nextCrossAlign = CrossAxisAlignment.end, + bool isEnd = false, +}) { + return TargetFocus( + enableOverlayTab: true, + color: Colors.transparent, + identify: keyName, + keyTarget: key, + alignSkip: skipAlignment, + shape: isCircle ? ShapeLightFocus.Circle : ShapeLightFocus.RRect, + contents: [ + TargetContent( + align: align, + builder: (context, controller) { + return Container( + child: Column( + mainAxisSize: MainAxisSize.max, + crossAxisAlignment: crossAlign, + children: [ + Text( + description, + style: TextStyle( + color: Theme.of(context).colorScheme.background, + fontSize: 20, + ), + ), + ], + ), + ); + }, + ), + TargetContent( + align: ContentAlign.custom, + customPosition: CustomTargetContentPosition( + bottom: SizeConfig.screenHeight! * 0.025, + ), + builder: (context, controller) { + return GestureDetector( + onTap: () { + if (next != null) { + // ignore: avoid_dynamic_calls + next(); + } + tutorialCoachMark.next(); + }, + child: Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: nextCrossAlign, + children: [ + Text( + isEnd ? 'COMPLETE' : 'NEXT', + style: TextStyle( + color: Theme.of(context).colorScheme.background, + fontSize: 20, + ), + ), + ], + ), + ); + }, + ), + ], + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/initialise.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/initialise.md new file mode 100644 index 000000000..6f3695326 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/initialise.md @@ -0,0 +1,85 @@ + + + +# initialise method + + + + + + + + +void initialise +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) ctx, {required [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) fromSignUp, required [int](https://api.flutter.dev/flutter/dart-core/int-class.html) mainScreenIndex}) + + + + + +

Initalizing function.

+

params:

+
    +
  • ctx: BuildContext, contain parent info
  • +
  • fromSignUp: Bool to find user entry
  • +
  • mainScreenIndex: Index to find tab on mainScreen
  • +
+

returns: + None

+ + + +## Implementation + +```dart +void initialise( + BuildContext ctx, { + required bool fromSignUp, + required int mainScreenIndex, +}) { + currentPageIndex = mainScreenIndex; + showAppTour = fromSignUp; + + pluginPrototypeData = { + "Donation": { + "icon": Icons.attach_money_outlined, + "page": const ChangeThemeTile(), + } + }; + + notifyListeners(); + if (!showAppTour) { + tourComplete = true; + tourSkipped = false; + } else { + Future.delayed( + const Duration(seconds: 1), + () => navigationService.pushDialog( + CustomAlertDialog( + dialogTitle: 'App Tour', + dialogSubTitle: 'Start app tour to know talawa functioning', + successText: 'Start', + secondaryButtonText: 'Skip', + success: () { + context = ctx; + navigationService.pop(); + tourHomeTargets(); + }, + secondaryButtonTap: () { + tourComplete = false; + tourSkipped = true; + notifyListeners(); + }, + ), + ), + ); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNChat.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNChat.md new file mode 100644 index 000000000..b879914b1 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNChat.md @@ -0,0 +1,33 @@ + + + +# keyBNChat property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keyBNChat + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keyBNChat = GlobalKey(debugLabel: "ChatTab"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNEvents.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNEvents.md new file mode 100644 index 000000000..e30a54fde --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNEvents.md @@ -0,0 +1,33 @@ + + + +# keyBNEvents property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keyBNEvents + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keyBNEvents = GlobalKey(debugLabel: "EventTab"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNHome.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNHome.md new file mode 100644 index 000000000..769994405 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNHome.md @@ -0,0 +1,33 @@ + + + +# keyBNHome property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keyBNHome + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keyBNHome = GlobalKey(debugLabel: "HomeTab"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNPost.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNPost.md new file mode 100644 index 000000000..fffa66901 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNPost.md @@ -0,0 +1,33 @@ + + + +# keyBNPost property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keyBNPost + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keyBNPost = GlobalKey(debugLabel: "PostTab"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNProfile.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNProfile.md new file mode 100644 index 000000000..911ddc8b6 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyBNProfile.md @@ -0,0 +1,33 @@ + + + +# keyBNProfile property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keyBNProfile + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keyBNProfile = GlobalKey(debugLabel: "ProfileTab"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerCurOrg.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerCurOrg.md new file mode 100644 index 000000000..e719516e7 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerCurOrg.md @@ -0,0 +1,34 @@ + + + +# keyDrawerCurOrg property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keyDrawerCurOrg + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +static final GlobalKey keyDrawerCurOrg = + GlobalKey(debugLabel: "DrawerCurrentOrg"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerJoinOrg.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerJoinOrg.md new file mode 100644 index 000000000..384fecced --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerJoinOrg.md @@ -0,0 +1,34 @@ + + + +# keyDrawerJoinOrg property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keyDrawerJoinOrg + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +static final GlobalKey keyDrawerJoinOrg = + GlobalKey(debugLabel: "DrawerJoinOrg"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerLeaveCurrentOrg.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerLeaveCurrentOrg.md new file mode 100644 index 000000000..1c4a7087d --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerLeaveCurrentOrg.md @@ -0,0 +1,34 @@ + + + +# keyDrawerLeaveCurrentOrg property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keyDrawerLeaveCurrentOrg + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +static final GlobalKey keyDrawerLeaveCurrentOrg = + GlobalKey(debugLabel: "DrawerLeaveCurrentOr"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerSwitchableOrg.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerSwitchableOrg.md new file mode 100644 index 000000000..decbb6072 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keyDrawerSwitchableOrg.md @@ -0,0 +1,34 @@ + + + +# keyDrawerSwitchableOrg property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keyDrawerSwitchableOrg + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +static final GlobalKey keyDrawerSwitchableOrg = + GlobalKey(debugLabel: "DrawerSwitchableOrg"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySEAdd.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySEAdd.md new file mode 100644 index 000000000..0644acd2d --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySEAdd.md @@ -0,0 +1,33 @@ + + + +# keySEAdd property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keySEAdd + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keySEAdd = GlobalKey(debugLabel: "EventScreenAdd"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySECard.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySECard.md new file mode 100644 index 000000000..52a9e67ab --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySECard.md @@ -0,0 +1,33 @@ + + + +# keySECard property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keySECard + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keySECard = GlobalKey(debugLabel: "EventScreenCard"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySECategoryMenu.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySECategoryMenu.md new file mode 100644 index 000000000..729b2b95e --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySECategoryMenu.md @@ -0,0 +1,34 @@ + + + +# keySECategoryMenu property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keySECategoryMenu + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keySECategoryMenu = + GlobalKey(debugLabel: "EventScreenCategory"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySEDateFilter.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySEDateFilter.md new file mode 100644 index 000000000..f2d5f5e1d --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySEDateFilter.md @@ -0,0 +1,34 @@ + + + +# keySEDateFilter property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keySEDateFilter + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keySEDateFilter = + GlobalKey(debugLabel: "EventScreenDateFilter"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHMenuIcon.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHMenuIcon.md new file mode 100644 index 000000000..89c78447f --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHMenuIcon.md @@ -0,0 +1,33 @@ + + + +# keySHMenuIcon property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keySHMenuIcon + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keySHMenuIcon = GlobalKey(debugLabel: "HomeScreenMenuIcon"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHOrgName.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHOrgName.md new file mode 100644 index 000000000..2960a23f9 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHOrgName.md @@ -0,0 +1,33 @@ + + + +# keySHOrgName property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keySHOrgName + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keySHOrgName = GlobalKey(debugLabel: "HomeScreenOrgName"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHPinnedPost.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHPinnedPost.md new file mode 100644 index 000000000..3afe39943 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHPinnedPost.md @@ -0,0 +1,34 @@ + + + +# keySHPinnedPost property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keySHPinnedPost + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keySHPinnedPost = + GlobalKey(debugLabel: "HomeScreenPinnedPost"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHPost.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHPost.md new file mode 100644 index 000000000..1dcf20665 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySHPost.md @@ -0,0 +1,33 @@ + + + +# keySHPost property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keySHPost + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keySHPost = GlobalKey(debugLabel: "HomeScreenPost"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPAppSetting.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPAppSetting.md new file mode 100644 index 000000000..fec002077 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPAppSetting.md @@ -0,0 +1,34 @@ + + + +# keySPAppSetting property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keySPAppSetting + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keySPAppSetting = + GlobalKey(debugLabel: "ProfileScreenAppSetting"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPDonateUs.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPDonateUs.md new file mode 100644 index 000000000..c912d760f --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPDonateUs.md @@ -0,0 +1,34 @@ + + + +# keySPDonateUs property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keySPDonateUs + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keySPDonateUs = + GlobalKey(debugLabel: "ProfileScreenDonateUs"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPEditProfile.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPEditProfile.md new file mode 100644 index 000000000..9d406c2f9 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPEditProfile.md @@ -0,0 +1,33 @@ + + + +# keySPEditProfile property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keySPEditProfile + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keySPEditProfile = GlobalKey(debugLabel: "ProfileScreenEdit"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPHelp.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPHelp.md new file mode 100644 index 000000000..f1e340f21 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPHelp.md @@ -0,0 +1,33 @@ + + + +# keySPHelp property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keySPHelp + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keySPHelp = GlobalKey(debugLabel: "ProfileScreenHelp"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPInvite.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPInvite.md new file mode 100644 index 000000000..8bda57f92 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPInvite.md @@ -0,0 +1,33 @@ + + + +# keySPInvite property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keySPInvite + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keySPInvite = GlobalKey(debugLabel: "ProfileScreenInvite"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPLogout.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPLogout.md new file mode 100644 index 000000000..418965242 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPLogout.md @@ -0,0 +1,33 @@ + + + +# keySPLogout property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keySPLogout + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keySPLogout = GlobalKey(debugLabel: "ProfileScreenLogout"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPPalisadoes.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPPalisadoes.md new file mode 100644 index 000000000..71ef98a27 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/keySPPalisadoes.md @@ -0,0 +1,34 @@ + + + +# keySPPalisadoes property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> keySPPalisadoes + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +final GlobalKey keySPPalisadoes = + GlobalKey(debugLabel: "ProfileScreenPalisadoes"); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/navBarItems.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/navBarItems.md new file mode 100644 index 000000000..48e1b405b --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/navBarItems.md @@ -0,0 +1,33 @@ + + + +# navBarItems property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[BottomNavigationBarItem](https://api.flutter.dev/flutter/widgets/BottomNavigationBarItem-class.html)> navBarItems + +_read / write_ + + + +

Actual BottomNavigationBarItems that show up on the screen.

+ + + +## Implementation + +```dart +List navBarItems = []; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/onTabTapped.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/onTabTapped.md new file mode 100644 index 000000000..7bae5460f --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/onTabTapped.md @@ -0,0 +1,44 @@ + + + +# onTabTapped method + + + + + + + + +void onTabTapped +([int](https://api.flutter.dev/flutter/dart-core/int-class.html) index) + + + + + +

Handles click on BottomNavigationBarItem.

+

params:

+
    +
  • index: it is track of current page index.
  • +
+

returns: + None

+ + + +## Implementation + +```dart +void onTabTapped(int index) { + currentPageIndex = index; + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/pages.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/pages.md new file mode 100644 index 000000000..d4bc8e82f --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/pages.md @@ -0,0 +1,34 @@ + + + +# pages property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html)> pages + +_read / write_ + + + +

Contains the Widgets to be rendered for corresponding navbar items.

+

Features that should be implemented as plugins should be kept here.

+ + + +## Implementation + +```dart +List pages = []; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/pluginList.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/pluginList.md new file mode 100644 index 000000000..8b7b6fca1 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/pluginList.md @@ -0,0 +1,33 @@ + + + +# pluginList property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html) pluginList + +_read / write_ + + + +

list of all the pluginList.

+ + + +## Implementation + +```dart +List pluginList = []; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/pluginPrototypeData.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/pluginPrototypeData.md new file mode 100644 index 000000000..3974228ed --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/pluginPrototypeData.md @@ -0,0 +1,37 @@ + + + +# pluginPrototypeData property + + + + + + + +[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html) pluginPrototypeData + +_read / write_ + + + +

Maps the feature names with their proper Icon and Page.

+

icon contains the IconData corresponding to plugin's icon. +page contains the corresponding page to be displayed. +Name of the feature provided by the admin must exactly match with the. +name stored here.

+ + + +## Implementation + +```dart +Map pluginPrototypeData = {}; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/scaffoldKey.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/scaffoldKey.md new file mode 100644 index 000000000..e72672b7e --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/scaffoldKey.md @@ -0,0 +1,34 @@ + + + +# scaffoldKey property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[ScaffoldState](https://api.flutter.dev/flutter/material/ScaffoldState-class.html)> scaffoldKey + +_final_ + + + +

static variables.

+ + + +## Implementation + +```dart +static final GlobalKey scaffoldKey = + GlobalKey(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/showAppTour.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/showAppTour.md new file mode 100644 index 000000000..a1d5c5f11 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/showAppTour.md @@ -0,0 +1,33 @@ + + + +# showAppTour property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) showAppTour + +_read / write_ + + + +

bool to determine if we wanna show the apptour.

+ + + +## Implementation + +```dart +late bool showAppTour; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/showHome.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/showHome.md new file mode 100644 index 000000000..b91cffd68 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/showHome.md @@ -0,0 +1,49 @@ + + + +# showHome method + + + + + + + + +void showHome +([TargetFocus](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/TargetFocus-class.html) clickedTarget) + + + + + +

This function shows the Home screen.

+

params:

+
    +
  • clickedTarget: object to identify clickedTarget.
  • +
+

returns: + None

+ + + +## Implementation + +```dart +void showHome(TargetFocus clickedTarget) { + switch (clickedTarget.identify) { + case "keySHMenuIcon": + scaffoldKey.currentState!.openDrawer(); + break; + case "keyDrawerLeaveCurrentOrg": + navigationService.pop(); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/showTutorial.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/showTutorial.md new file mode 100644 index 000000000..010e415b6 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/showTutorial.md @@ -0,0 +1,69 @@ + + + +# showTutorial method + + + + + + + + +void showTutorial +({required dynamic onClickTarget([TargetFocus](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/TargetFocus-class.html)), required dynamic onFinish()}) + + + + + +

This function show tutorial to user.

+

params:

+
    +
  • onClickTarget: Its a function which is required to run desired tasks on click.
  • +
  • onFinish: Its a function which is required to run desired tasks on finish
  • +
+

returns: + None

+ + + +## Implementation + +```dart +void showTutorial({ + required dynamic Function(TargetFocus) onClickTarget, + required dynamic Function() onFinish, +}) { + tutorialCoachMark = TutorialCoachMark( + targets: targets, + colorShadow: Theme.of(context).colorScheme.secondaryContainer, + textSkip: "SKIP", + textStyleSkip: TextStyle( + color: Theme.of(context).colorScheme.background, + fontSize: 20, + ), + paddingFocus: 10, + opacityShadow: 1.0, + onFinish: onFinish, + onClickTarget: onClickTarget, + onSkip: () { + if (scaffoldKey.currentState!.isDrawerOpen) { + navigationService.pop(); + } + tourSkipped = true; + onTabTapped(0); + }, + onClickOverlay: (target) { + onClickTarget(target); + }, + )..show(context: context); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/targets.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/targets.md new file mode 100644 index 000000000..1a70dc391 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/targets.md @@ -0,0 +1,33 @@ + + + +# targets property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[TargetFocus](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/TargetFocus-class.html)> targets + +_final_ + + + +

array of target.

+ + + +## Implementation + +```dart +final List targets = []; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourAddPost.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourAddPost.md new file mode 100644 index 000000000..aff76a556 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourAddPost.md @@ -0,0 +1,59 @@ + + + +# tourAddPost method + + + + + + + + +void tourAddPost +() + + + + + +

This function show the tutorial to add Post in the organization.

+

params: + None

+

returns: + None

+ + + +## Implementation + +```dart +void tourAddPost() { + targets.clear(); + targets.add( + focusTarget( + keyBNPost, + 'keyBNPost', + 'This is the Create post tab here you can add post to the current selected organization', + isCircle: true, + align: ContentAlign.top, + ), + ); + showTutorial( + onFinish: () { + onTabTapped(currentPageIndex + 1); + if (!tourComplete && !tourSkipped) { + tourChat(); + } + }, + onClickTarget: (TargetFocus a) {}, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourChat.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourChat.md new file mode 100644 index 000000000..9386279f5 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourChat.md @@ -0,0 +1,59 @@ + + + +# tourChat method + + + + + + + + +void tourChat +() + + + + + +

This function show the tour of chats.

+

params: + None

+

returns: + None

+ + + +## Implementation + +```dart +void tourChat() { + targets.clear(); + targets.add( + focusTarget( + keyBNChat, + 'keyBNChat', + 'This is the Chat tab here you can see all your messages of the current selected organization', + isCircle: true, + align: ContentAlign.top, + ), + ); + showTutorial( + onFinish: () { + onTabTapped(currentPageIndex + 1); + if (!tourComplete && !tourSkipped) { + tourProfile(); + } + }, + onClickTarget: (TargetFocus a) {}, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourComplete.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourComplete.md new file mode 100644 index 000000000..f95abfaf6 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourComplete.md @@ -0,0 +1,33 @@ + + + +# tourComplete property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) tourComplete + +_read / write_ + + + +

bool to determine if apptour is complete.

+ + + +## Implementation + +```dart +bool tourComplete = false; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourEventTargets.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourEventTargets.md new file mode 100644 index 000000000..35a537747 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourEventTargets.md @@ -0,0 +1,88 @@ + + + +# tourEventTargets method + + + + + + + + +void tourEventTargets +() + + + + + +

This function show the tutorial for Events.

+

params: + None

+

returns: + None

+ + + +## Implementation + +```dart +void tourEventTargets() { + targets.clear(); + targets.add( + focusTarget( + keyBNEvents, + 'keyBNEvents', + 'This is the Events tab here you can see all event related information of the current selected organization', + isCircle: true, + align: ContentAlign.top, + ), + ); + targets.add( + focusTarget( + keySECategoryMenu, + 'keySECategoryMenu', + 'Filter Events based on categories', + ), + ); + targets.add( + focusTarget( + keySEDateFilter, + 'keySEDateFilter', + 'Filter Events between selected dates', + ), + ); + targets.add( + focusTarget( + keySECard, + 'keySECard', + 'Description of event to see more details click on the card', + ), + ); + targets.add( + focusTarget( + keySEAdd, + 'keySEAdd', + 'You can create a new event from here', + align: ContentAlign.top, + ), + ); + showTutorial( + onFinish: () { + onTabTapped(currentPageIndex + 1); + if (!tourComplete && !tourSkipped) { + tourAddPost(); + } + }, + onClickTarget: (TargetFocus a) {}, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourHomeTargets.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourHomeTargets.md new file mode 100644 index 000000000..8a9dbd83b --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourHomeTargets.md @@ -0,0 +1,122 @@ + + + +# tourHomeTargets method + + + + + + + + +void tourHomeTargets +() + + + + + +

this functions starts the tour and info to be displayed is mentioned in this functions.

+

params: + None

+

returns: + None

+ + + +## Implementation + +```dart +void tourHomeTargets() { + targets.clear(); + targets.add( + focusTarget( + keySHOrgName, + 'keySHOrgName', + 'Current selected Organization Name', + ), + ); + targets.add( + focusTarget( + keySHMenuIcon, + 'keySHMenuIcon', + 'Click this button to see options related to switching, joining and leaving organization(s)', + isCircle: true, + next: () => scaffoldKey.currentState!.openDrawer(), + ), + ); + targets.add( + focusTarget( + keyDrawerCurOrg, + 'keyDrawerCurOrg', + "Current selected Organization's Name appears here", + ), + ); + targets.add( + focusTarget( + keyDrawerSwitchableOrg, + 'keyDrawerSwitchableOrg', + "All your joined organizations appear over here you can click on them to change the current organization", + ), + ); + targets.add( + focusTarget( + keyDrawerJoinOrg, + 'keyDrawerJoinOrg', + "From this button you can join other listed organizations", + align: ContentAlign.top, + ), + ); + targets.add( + focusTarget( + keyDrawerLeaveCurrentOrg, + 'keyDrawerLeaveCurrentOrg', + "To leave the current organization you can use this option", + align: ContentAlign.top, + next: () => navigationService.pop(), + ), + ); + targets.add( + focusTarget( + keyBNHome, + 'keyBNHome', + "This is the home tab here you can see the latest post from other members of the current organization", + isCircle: true, + align: ContentAlign.top, + ), + ); + targets.add( + focusTarget( + keySHPinnedPost, + 'keySHPinnedPost', + "This section displays all the important post set by the organization admin(s)", + align: ContentAlign.bottom, + ), + ); + targets.add( + focusTarget( + keySHPost, + 'keySHPost', + "This is the post card you can like and comment on the post from the options available", + align: ContentAlign.bottom, + ), + ); + showTutorial( + onClickTarget: showHome, + onFinish: () { + onTabTapped(currentPageIndex + 1); + if (!tourComplete && !tourSkipped) { + tourEventTargets(); + } + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourProfile.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourProfile.md new file mode 100644 index 000000000..9aae9bc64 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourProfile.md @@ -0,0 +1,96 @@ + + + +# tourProfile method + + + + + + + + +void tourProfile +() + + + + + +

This function show the tutorial for the profile page.

+

params: + None

+

returns: + None

+ + + +## Implementation + +```dart +void tourProfile() { + targets.clear(); + targets.add( + focusTarget( + keyBNProfile, + 'keyBNProfile', + 'This is the Profile tab here you can see all options related to account, app setting, invitation, help etc', + isCircle: true, + align: ContentAlign.top, + nextCrossAlign: CrossAxisAlignment.start, + ), + ); + targets.add( + focusTarget( + keySPAppSetting, + 'keySPAppSetting', + 'You can edit application settings like language, theme etc from here', + ), + ); + targets.add( + focusTarget( + keySPHelp, + 'keySPHelp', + 'For any help we are always there. You can reach us from here', + ), + ); + targets.add( + focusTarget( + keySPDonateUs, + 'keySPDonateUs', + 'To help your organization grow you can support them financially from here', + ), + ); + targets.add( + focusTarget( + keySPInvite, + 'keySPInvite', + 'Wanna invite colleague, invite them from here', + ), + ); + targets.add( + focusTarget( + keySPPalisadoes, + 'keySPPalisadoes', + 'You are all set to go lets get you in', + isEnd: true, + ), + ); + showTutorial( + onFinish: () { + if (!tourComplete && !tourSkipped) { + tourComplete = true; + onTabTapped(0); + } + }, + onClickTarget: (TargetFocus a) {}, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourSkipped.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourSkipped.md new file mode 100644 index 000000000..46465249e --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tourSkipped.md @@ -0,0 +1,33 @@ + + + +# tourSkipped property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) tourSkipped + +_read / write_ + + + +

bool to determine if apptour is skipped.

+ + + +## Implementation + +```dart +bool tourSkipped = false; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tutorialCoachMark.md b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tutorialCoachMark.md new file mode 100644 index 000000000..e6c7406f7 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/MainScreenViewModel/tutorialCoachMark.md @@ -0,0 +1,33 @@ + + + +# tutorialCoachMark property + + + + + + + +[TutorialCoachMark](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/TutorialCoachMark-class.html) tutorialCoachMark + +_read / write_ + + + +

tutorialCoachMark consist of coach used to give tutorial.

+ + + +## Implementation + +```dart +late TutorialCoachMark tutorialCoachMark; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_main_screen_view_model/view_model_main_screen_view_model-library.md b/talawa-mobile-docs/view_model_main_screen_view_model/view_model_main_screen_view_model-library.md new file mode 100644 index 000000000..5d8d53324 --- /dev/null +++ b/talawa-mobile-docs/view_model_main_screen_view_model/view_model_main_screen_view_model-library.md @@ -0,0 +1,38 @@ + + + + +# main_screen_view_model library + + + + + + + + + + + +## Classes + +##### [MainScreenViewModel](../view_model_main_screen_view_model/MainScreenViewModel-class.md) + + + +MainScreenViewModel class provide methods to interact with the modal to serve data in user's action in Main Screen Views. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md new file mode 100644 index 000000000..c2c1a9d09 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md @@ -0,0 +1,275 @@ + + + +# LoginViewModel class + + + + + + + + + +

LoginViewModel class helps to interact with model to serve data +and react to user's input in Login View.

+

Methods include:

+
    +
  • login
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- LoginViewModel + + + + + + + + +## Constructors + +[LoginViewModel](../view_model_pre_auth_view_models_login_view_model/LoginViewModel/LoginViewModel.md) () + + + + +## Properties + +##### [email](../view_model_pre_auth_view_models_login_view_model/LoginViewModel/email.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_read / write_ + + + +##### [emailFocus](../view_model_pre_auth_view_models_login_view_model/LoginViewModel/emailFocus.md) ↔ [FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) + + + + +_read / write_ + + + +##### [formKey](../view_model_pre_auth_view_models_login_view_model/LoginViewModel/formKey.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[FormState](https://api.flutter.dev/flutter/widgets/FormState-class.html)> + + + + +_final_ + + + +##### [greeting](../view_model_pre_auth_view_models_login_view_model/LoginViewModel/greeting.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>> + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [hidePassword](../view_model_pre_auth_view_models_login_view_model/LoginViewModel/hidePassword.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read / write_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [password](../view_model_pre_auth_view_models_login_view_model/LoginViewModel/password.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_read / write_ + + + +##### [passwordFocus](../view_model_pre_auth_view_models_login_view_model/LoginViewModel/passwordFocus.md) ↔ [FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + +##### [validate](../view_model_pre_auth_view_models_login_view_model/LoginViewModel/validate.md) ↔ [AutovalidateMode](https://api.flutter.dev/flutter/widgets/AutovalidateMode.html) + + + + +_read / write_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [initialize](../view_model_pre_auth_view_models_login_view_model/LoginViewModel/initialize.md)() void + + + + + + + + +##### [login](../view_model_pre_auth_view_models_login_view_model/LoginViewModel/login.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to sign-in the user into application. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/LoginViewModel.md b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/LoginViewModel.md new file mode 100644 index 000000000..c37c0bbc5 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/LoginViewModel.md @@ -0,0 +1,24 @@ + + + +# LoginViewModel constructor + + + + + + + +LoginViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/email.md b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/email.md new file mode 100644 index 000000000..8fc948122 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/email.md @@ -0,0 +1,32 @@ + + + +# email property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) email + +_read / write_ + + + + + + +## Implementation + +```dart +TextEditingController email = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/emailFocus.md b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/emailFocus.md new file mode 100644 index 000000000..ecd01d588 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/emailFocus.md @@ -0,0 +1,32 @@ + + + +# emailFocus property + + + + + + + +[FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) emailFocus + +_read / write_ + + + + + + +## Implementation + +```dart +FocusNode emailFocus = FocusNode(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/formKey.md b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/formKey.md new file mode 100644 index 000000000..d7de0e859 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/formKey.md @@ -0,0 +1,32 @@ + + + +# formKey property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[FormState](https://api.flutter.dev/flutter/widgets/FormState-class.html)> formKey + +_final_ + + + + + + +## Implementation + +```dart +final formKey = GlobalKey(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/greeting.md b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/greeting.md new file mode 100644 index 000000000..de486919b --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/greeting.md @@ -0,0 +1,32 @@ + + + +# greeting property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>> greeting + +_read / write_ + + + + + + +## Implementation + +```dart +late List> greeting; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/hidePassword.md b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/hidePassword.md new file mode 100644 index 000000000..bd2ce20b9 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/hidePassword.md @@ -0,0 +1,32 @@ + + + +# hidePassword property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) hidePassword + +_read / write_ + + + + + + +## Implementation + +```dart +bool hidePassword = true; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/initialize.md b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/initialize.md new file mode 100644 index 000000000..048ef7ef8 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/initialize.md @@ -0,0 +1,64 @@ + + + +# initialize method + + + + + + + + +void initialize +() + + + + + + + + +## Implementation + +```dart +void initialize() { + // greating message + greeting = [ + { + 'text': "We're ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall + }, + { + 'text': 'Glad ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24) + }, + { + 'text': "you're ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall + }, + { + 'text': 'Back ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24) + }, + ]; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/login.md b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/login.md new file mode 100644 index 000000000..dc101fdbe --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/login.md @@ -0,0 +1,107 @@ + + + +# login method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> login +() + + + + + +

This function is used to sign-in the user into application.

+ + + +## Implementation + +```dart +Future login() async { + emailFocus.unfocus(); + passwordFocus.unfocus(); + validate = AutovalidateMode.always; + // if the email and password are not empty. + if (formKey.currentState!.validate()) { + validate = AutovalidateMode.disabled; + navigationService + .pushDialog(const CustomProgressDialog(key: Key('LoginProgress'))); + databaseFunctions.init(); + try { + // run the graph QL query to login the user, passing `email` and `password`. + final result = await databaseFunctions + .gqlNonAuthMutation(queries.loginUser(email.text, password.text)); + navigationService.pop(); + // if user found. + if (result != null) { + final User loggedInUser = + User.fromJson(result.data!['login'] as Map); + userConfig.updateUser(loggedInUser); + // if user has not already joined any organization. + if (userConfig.currentUser.joinedOrganizations!.isEmpty) { + navigationService.removeAllAndPush( + Routes.waitingScreen, + Routes.splashScreen, + ); + } else { + userConfig.saveCurrentOrgInHive( + userConfig.currentUser.joinedOrganizations![0], + ); + navigationService.removeAllAndPush( + Routes.mainScreen, + Routes.splashScreen, + arguments: MainScreenArgs(mainScreenIndex: 0, fromSignUp: false), + ); + } + final loginResult = result.data['login'] as Map; + androidFirebaseOptions = + loginResult['androidFirebaseOptions'] as Map; + iosFirebaseOptions = + loginResult['iosFirebaseOptions'] as Map; + if (androidFirebaseOptions['apiKey'] != null || + iosFirebaseOptions['apiKey'] != null) { + await setUpFirebase(); + + final token = await FirebaseMessaging.instance.getToken(); + await databaseFunctions.gqlAuthMutation( + queries.saveFcmToken(token), + ); + + await setUpFirebaseMessaging(); + + final androidFirebaseOptionsBox = + await Hive.openBox('androidFirebaseOptions'); + androidFirebaseOptionsBox.put( + 'androidFirebaseOptions', + androidFirebaseOptions, + ); + + final iosFirebaseOptionsBox = + await Hive.openBox('iosFirebaseOptions'); + iosFirebaseOptionsBox.put( + 'iosFirebaseOptions', + iosFirebaseOptions, + ); + } + } + } on Exception catch (e) { + print('here'); + print(e); + } + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/password.md b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/password.md new file mode 100644 index 000000000..b344a9fed --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/password.md @@ -0,0 +1,32 @@ + + + +# password property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) password + +_read / write_ + + + + + + +## Implementation + +```dart +TextEditingController password = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/passwordFocus.md b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/passwordFocus.md new file mode 100644 index 000000000..2b7716a5d --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/passwordFocus.md @@ -0,0 +1,32 @@ + + + +# passwordFocus property + + + + + + + +[FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) passwordFocus + +_read / write_ + + + + + + +## Implementation + +```dart +FocusNode passwordFocus = FocusNode(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/validate.md b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/validate.md new file mode 100644 index 000000000..7dd63a4d4 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/LoginViewModel/validate.md @@ -0,0 +1,32 @@ + + + +# validate property + + + + + + + +[AutovalidateMode](https://api.flutter.dev/flutter/widgets/AutovalidateMode.html) validate + +_read / write_ + + + + + + +## Implementation + +```dart +AutovalidateMode validate = AutovalidateMode.disabled; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/view_model_pre_auth_view_models_login_view_model-library.md b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/view_model_pre_auth_view_models_login_view_model-library.md new file mode 100644 index 000000000..b183f6c11 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_login_view_model/view_model_pre_auth_view_models_login_view_model-library.md @@ -0,0 +1,39 @@ + + + + +# login_view_model library + + + + + + + + + + + +## Classes + +##### [LoginViewModel](../view_model_pre_auth_view_models_login_view_model/LoginViewModel-class.md) + + + +LoginViewModel class helps to interact with model to serve data +and react to user's input in Login View. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md new file mode 100644 index 000000000..f7fa3a76d --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md @@ -0,0 +1,340 @@ + + + +# SelectOrganizationViewModel class + + + + + + + + + +

SelectOrganizationViewModel class helps to interact with model to serve data +and react to user's input in Select Organization View.

+

Methods include:

+
    +
  • selectOrg
  • +
  • onTapJoin
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- SelectOrganizationViewModel + + + + + + + + +## Constructors + +[SelectOrganizationViewModel](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/SelectOrganizationViewModel.md) () + + + + +## Properties + +##### [allOrgController](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/allOrgController.md) → [ScrollController](https://api.flutter.dev/flutter/widgets/ScrollController-class.html) + + + + +_final_ + + + +##### [controller](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/controller.md) → [ScrollController](https://api.flutter.dev/flutter/widgets/ScrollController-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [organizations](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/organizations.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> + + + + +_read / write_ + + + +##### [orgId](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/orgId.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read / write_ + + + +##### [qrKey](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/qrKey.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + + +_final_ + + + +##### [result](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/result.md) ↔ [Barcode](https://pub.dev/documentation/qr_code_scanner/1.0.1/qr_code_scanner/Barcode-class.html) + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [searchController](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchController.md) → [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_final_ + + + +##### [searchFocus](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchFocus.md) → [FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) + + + + +_final_ + + + +##### [searching](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searching.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read / write_ + + + +##### [selectedOrganization](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/selectedOrganization.md) ↔ [OrgInfo](../models_organization_org_info/OrgInfo-class.md) + + + + +_read / write_ + + + +##### [showSearchOrgList](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/showSearchOrgList.md) ↔ [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + + +_read / write_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [fetchMoreHelper](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/fetchMoreHelper.md)([FetchMore](https://pub.dev/documentation/graphql_flutter/5.2.0-beta.5/graphql_flutter/FetchMore.html)<[Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)?> fetchMore, [List](https://api.flutter.dev/flutter/dart-core/List-class.html) organizations) void + + + +This function fetch more option. + + + + +##### [initialise](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/initialise.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) initialData) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [onTapContinue](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/onTapContinue.md)() void + + + + + + + + +##### [onTapJoin](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/onTapJoin.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function make user to join the selected organization. +The function uses joinOrgById graph QL query. + + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [searchActive](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchActive.md)() void + + + + + + + + +##### [selectOrg](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/selectOrg.md)([OrgInfo](../models_organization_org_info/OrgInfo-class.md) item) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function select the organization. + + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/SelectOrganizationViewModel.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/SelectOrganizationViewModel.md new file mode 100644 index 000000000..a03045c93 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/SelectOrganizationViewModel.md @@ -0,0 +1,24 @@ + + + +# SelectOrganizationViewModel constructor + + + + + + + +SelectOrganizationViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/allOrgController.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/allOrgController.md new file mode 100644 index 000000000..0e3bcabd3 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/allOrgController.md @@ -0,0 +1,32 @@ + + + +# allOrgController property + + + + + + + +[ScrollController](https://api.flutter.dev/flutter/widgets/ScrollController-class.html) allOrgController + +_final_ + + + + + + +## Implementation + +```dart +final ScrollController allOrgController = ScrollController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/controller.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/controller.md new file mode 100644 index 000000000..00b8f4d3b --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/controller.md @@ -0,0 +1,32 @@ + + + +# controller property + + + + + + + +[ScrollController](https://api.flutter.dev/flutter/widgets/ScrollController-class.html) controller + +_final_ + + + + + + +## Implementation + +```dart +final ScrollController controller = ScrollController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/fetchMoreHelper.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/fetchMoreHelper.md new file mode 100644 index 000000000..e7c1a5972 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/fetchMoreHelper.md @@ -0,0 +1,52 @@ + + + +# fetchMoreHelper method + + + + + + + + +void fetchMoreHelper +([FetchMore](https://pub.dev/documentation/graphql_flutter/5.2.0-beta.5/graphql_flutter/FetchMore.html)<[Object](https://api.flutter.dev/flutter/dart-core/Object-class.html)?> fetchMore, [List](https://api.flutter.dev/flutter/dart-core/List-class.html) organizations) + + + + + +

This function fetch more option.

+ + + +## Implementation + +```dart +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/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/initialise.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/initialise.md new file mode 100644 index 000000000..a13f60bf1 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/initialise.md @@ -0,0 +1,52 @@ + + + +# initialise method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> initialise +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) initialData) + + + + + + + + +## Implementation + +```dart +Future initialise(String initialData) async { + searchFocus.addListener(searchActive); + if (!initialData.contains('-1')) { + databaseFunctions.init(); + final fetch = await databaseFunctions.fetchOrgById(initialData); + if (fetch.runtimeType == OrgInfo) { + selectedOrganization = fetch as OrgInfo; + if (userConfig.currentUser.refreshToken?.isEmpty ?? true) { + navigationService.pushScreen( + Routes.signupDetailScreen, + arguments: selectedOrganization, + ); + } else { + selectOrg(selectedOrganization); + } + setState(ViewState.idle); + } + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/onTapContinue.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/onTapContinue.md new file mode 100644 index 000000000..916f8b18a --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/onTapContinue.md @@ -0,0 +1,48 @@ + + + +# onTapContinue method + + + + + + + + +void onTapContinue +() + + + + + + + + +## Implementation + +```dart +void onTapContinue() { + // if user selected any organization. + if (selectedOrganization.id != '-1') { + navigationService.pushScreen( + Routes.signupDetailScreen, + arguments: selectedOrganization, + ); + } else { + navigationService.showTalawaErrorSnackBar( + 'Select one organization to continue', + MessageType.warning, + duration: const Duration(milliseconds: 750), + ); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/onTapJoin.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/onTapJoin.md new file mode 100644 index 000000000..c13233237 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/onTapJoin.md @@ -0,0 +1,88 @@ + + + +# onTapJoin method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> onTapJoin +() + + + + + +

This function make user to join the selected organization. +The function uses joinOrgById graph QL query.

+ + + +## Implementation + +```dart +Future onTapJoin() async { + // if `selectedOrganization` is public. + if (selectedOrganization.isPublic == true) { + try { + // run the graph QL mutation + final QueryResult result = await databaseFunctions.gqlAuthMutation( + queries.joinOrgById(selectedOrganization.id!), + ) as QueryResult; + + final List? joinedOrg = + ((result.data!['joinPublicOrganization'] + as Map)['joinedOrganizations'] + as List?) + ?.map((e) => OrgInfo.fromJson(e as Map)) + .toList(); + userConfig.updateUserJoinedOrg(joinedOrg!); + // if user joined organization length is 1 + if (userConfig.currentUser.joinedOrganizations!.length == 1) { + userConfig.saveCurrentOrgInHive( + userConfig.currentUser.joinedOrganizations![0], + ); + navigationService.removeAllAndPush( + Routes.mainScreen, + Routes.splashScreen, + arguments: MainScreenArgs(mainScreenIndex: 0), + ); + } else { + navigationService.pop(); + navigationService.showTalawaErrorSnackBar( + 'Joined ${selectedOrganization.name} successfully', + MessageType.info, + ); + } + } on Exception catch (e) { + print(e); + navigationService.showTalawaErrorSnackBar( + 'SomeThing went wrong', + MessageType.error, + ); + } + } + // else { + // try { + // // navigationService.pushScreen(Routes.requestAccess); + // } on Exception catch (e) { + // print(e); + // navigationService.showTalawaErrorSnackBar( + // 'SomeThing went wrong', + // MessageType.error, + // ); + // } + // } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/orgId.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/orgId.md new file mode 100644 index 000000000..8401c3532 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/orgId.md @@ -0,0 +1,32 @@ + + + +# orgId property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId + +_read / write_ + + + + + + +## Implementation + +```dart +late String orgId; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/organizations.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/organizations.md new file mode 100644 index 000000000..d267d675b --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/organizations.md @@ -0,0 +1,32 @@ + + + +# organizations property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> organizations + +_read / write_ + + + + + + +## Implementation + +```dart +late List organizations = []; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/qrKey.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/qrKey.md new file mode 100644 index 000000000..1106a10ec --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/qrKey.md @@ -0,0 +1,32 @@ + + + +# qrKey property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> qrKey + +_final_ + + + + + + +## Implementation + +```dart +final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/result.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/result.md new file mode 100644 index 000000000..9e5c1d6a2 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/result.md @@ -0,0 +1,32 @@ + + + +# result property + + + + + + + +[Barcode](https://pub.dev/documentation/qr_code_scanner/1.0.1/qr_code_scanner/Barcode-class.html) result + +_read / write_ + + + + + + +## Implementation + +```dart +late Barcode result; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchActive.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchActive.md new file mode 100644 index 000000000..da4b165c2 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchActive.md @@ -0,0 +1,40 @@ + + + +# searchActive method + + + + + + + + +void searchActive +() + + + + + + + + +## Implementation + +```dart +void searchActive() { + if (searchFocus.hasFocus) { + organizations = []; + searching = true; + setState(ViewState.idle); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchController.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchController.md new file mode 100644 index 000000000..5f278031a --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchController.md @@ -0,0 +1,32 @@ + + + +# searchController property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) searchController + +_final_ + + + + + + +## Implementation + +```dart +final TextEditingController searchController = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchFocus.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchFocus.md new file mode 100644 index 000000000..a2cadd525 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searchFocus.md @@ -0,0 +1,32 @@ + + + +# searchFocus property + + + + + + + +[FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) searchFocus + +_final_ + + + + + + +## Implementation + +```dart +final FocusNode searchFocus = FocusNode(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searching.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searching.md new file mode 100644 index 000000000..427df2c30 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/searching.md @@ -0,0 +1,32 @@ + + + +# searching property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) searching + +_read / write_ + + + + + + +## Implementation + +```dart +bool searching = false; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/selectOrg.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/selectOrg.md new file mode 100644 index 000000000..6a6ccd37b --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/selectOrg.md @@ -0,0 +1,91 @@ + + + +# selectOrg method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> selectOrg +([OrgInfo](../../models_organization_org_info/OrgInfo-class.md) item) + + + + + +

This function select the organization.

+

params:

+
    +
  • item : Selected organization data.
  • +
+ + + +## Implementation + +```dart +Future selectOrg(OrgInfo item) async { + print(item.id); + bool orgAlreadyJoined = false; + bool orgRequestAlreadyPresent = false; + final bool userLoggedIn = await userConfig.userLoggedIn(); + // if user session not expirec + if (userLoggedIn) { + // check if user has already joined the selected organization. + userConfig.currentUser.joinedOrganizations!.forEach((element) { + if (element.id! == item.id) { + orgAlreadyJoined = true; + } + }); + // check if user has already send the membership request to the selected organization. + userConfig.currentUser.membershipRequests!.forEach((element) { + if (element.id! == item.id) { + orgRequestAlreadyPresent = true; + } + }); + // if not already joined and not memebrship request. + if (!orgAlreadyJoined && !orgRequestAlreadyPresent) { + selectedOrganization = item; + notifyListeners(); + onTapJoin(); + // print(selectedOrganization.isPublic); + + if (!selectedOrganization.isPublic!) { + navigationService.pushScreen( + Routes.requestAccess, + arguments: selectedOrganization, + ); + } + } else if (orgAlreadyJoined) { + selectedOrganization = OrgInfo(id: '-1'); + navigationService.showTalawaErrorSnackBar( + 'Organisation already joined', + MessageType.warning, + ); + } else { + navigationService.showTalawaErrorSnackBar( + 'Membership request already sent', + MessageType.warning, + ); + } + } else { + selectedOrganization = item; + notifyListeners(); + navigationService.pushScreen( + Routes.signupDetailScreen, + arguments: selectedOrganization, + ); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/selectedOrganization.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/selectedOrganization.md new file mode 100644 index 000000000..1c7a65ca8 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/selectedOrganization.md @@ -0,0 +1,32 @@ + + + +# selectedOrganization property + + + + + + + +[OrgInfo](../../models_organization_org_info/OrgInfo-class.md) selectedOrganization + +_read / write_ + + + + + + +## Implementation + +```dart +late OrgInfo selectedOrganization = OrgInfo(id: '-1'); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/showSearchOrgList.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/showSearchOrgList.md new file mode 100644 index 000000000..c8c83bdd4 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel/showSearchOrgList.md @@ -0,0 +1,32 @@ + + + +# showSearchOrgList property + + + + + + + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) showSearchOrgList + +_read / write_ + + + + + + +## Implementation + +```dart +late Widget showSearchOrgList = Container(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/view_model_pre_auth_view_models_select_organization_view_model-library.md b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/view_model_pre_auth_view_models_select_organization_view_model-library.md new file mode 100644 index 000000000..074705cdc --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_select_organization_view_model/view_model_pre_auth_view_models_select_organization_view_model-library.md @@ -0,0 +1,39 @@ + + + + +# select_organization_view_model library + + + + + + + + + + + +## Classes + +##### [SelectOrganizationViewModel](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md) + + + +SelectOrganizationViewModel class helps to interact with model to serve data +and react to user's input in Select Organization View. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md new file mode 100644 index 000000000..eea1cc27f --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md @@ -0,0 +1,319 @@ + + + +# SetUrlViewModel class + + + + + + + + + +

SetUrlViewModel class helps to interact with model to serve data.

+

and react to user's input for Set Url Section. +Methods include:

+
    +
  • checkURLandNavigate
  • +
  • scanQR
  • +
  • initialise
  • +
  • checkURLandNavigate
  • +
  • checkURLandShowPopUp
  • +
  • scanQR
  • +
  • _onQRViewCreated
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- SetUrlViewModel + + + + + + + + +## Constructors + +[SetUrlViewModel](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/SetUrlViewModel.md) () + + + + +## Properties + +##### [formKey](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/formKey.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[FormState](https://api.flutter.dev/flutter/widgets/FormState-class.html)> + + + +formKey. +_final_ + + + +##### [greeting](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/greeting.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>> + + + +qrController. +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [orgId](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/orgId.md) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +organizationID. +_read / write_ + + + +##### [qrKey](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/qrKey.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> + + + +qrKey. +_final_ + + + +##### [result](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/result.md) ↔ [Barcode](https://pub.dev/documentation/qr_code_scanner/1.0.1/qr_code_scanner/Barcode-class.html) + + + +qrText. +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + +##### [url](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/url.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + +url. +_read / write_ + + + +##### [urlFocus](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/urlFocus.md) ↔ [FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) + + + +urlFocus. +_read / write_ + + + +##### [validate](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/validate.md) ↔ [AutovalidateMode](https://api.flutter.dev/flutter/widgets/AutovalidateMode.html) + + + +qrValidator. +_read / write_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [checkURLandNavigate](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/checkURLandNavigate.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) navigateTo, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) argument) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function check the URL and navigate to the respective URL. + + + + +##### [checkURLandShowPopUp](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/checkURLandShowPopUp.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) argument) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function check the URL and navigate to the respective URL. + + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [initialise](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/initialise.md)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) inviteUrl = ''}) void + + + +This function initialises the variables. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [scanQR](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/scanQR.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) void + + + +This function create a widget which is used to scan the QR-code. + + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + +## Constants + +##### [imageUrlKey](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/imageUrlKey-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +imageUrlKey. + + + + +##### [urlKey](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/urlKey-constant.md) const [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +urlKey. + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/SetUrlViewModel.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/SetUrlViewModel.md new file mode 100644 index 000000000..e77e026ae --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/SetUrlViewModel.md @@ -0,0 +1,24 @@ + + + +# SetUrlViewModel constructor + + + + + + + +SetUrlViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/checkURLandNavigate.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/checkURLandNavigate.md new file mode 100644 index 000000000..3d400b257 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/checkURLandNavigate.md @@ -0,0 +1,72 @@ + + + +# checkURLandNavigate method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> checkURLandNavigate +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) navigateTo, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) argument) + + + + + +

This function check the URL and navigate to the respective URL.

+

params:

+
    +
  • navigateTo: url
  • +
  • argument: message
  • +
+

returns:

+
    +
  • Future<void>: void
  • +
+ + + +## Implementation + +```dart +Future checkURLandNavigate(String navigateTo, String argument) async { + urlFocus.unfocus(); + validate = AutovalidateMode.always; + + /// if the url is valid. + if (formKey.currentState!.validate()) { + navigationService + .pushDialog(const CustomProgressDialog(key: Key('UrlCheckProgress'))); + validate = AutovalidateMode.disabled; + final String uri = url.text.trim(); + final bool? urlPresent = + await locator().validateUrlExistence(uri); + if (urlPresent! == true) { + final box = Hive.box('url'); + box.put(urlKey, uri); + box.put(imageUrlKey, "$uri/talawa/"); + + navigationService.pop(); + graphqlConfig.getOrgUrl(); + navigationService.pushScreen(navigateTo, arguments: argument); + } else { + navigationService.pop(); + navigationService.showTalawaErrorSnackBar( + "URL doesn't exist/no connection please check", + MessageType.error, + ); + } + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/checkURLandShowPopUp.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/checkURLandShowPopUp.md new file mode 100644 index 000000000..bdfe2ca46 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/checkURLandShowPopUp.md @@ -0,0 +1,73 @@ + + + +# checkURLandShowPopUp method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> checkURLandShowPopUp +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) argument) + + + + + +

This function check the URL and navigate to the respective URL.

+

params:

+
    +
  • argument: message
  • +
+

returns:

+
    +
  • Future<void>: sdf
  • +
+ + + +## Implementation + +```dart +Future checkURLandShowPopUp(String argument) async { + urlFocus.unfocus(); + validate = AutovalidateMode.always; + + // if the url is valid. + if (formKey.currentState!.validate()) { + navigationService.pushDialog( + const CustomProgressDialog( + key: Key('UrlCheckProgress'), + ), + ); + validate = AutovalidateMode.disabled; + final String uri = url.text.trim(); + final bool? urlPresent = + await locator().validateUrlExistence(uri); + if (urlPresent! == true) { + final box = Hive.box('url'); + box.put(urlKey, uri); + box.put(imageUrlKey, "$uri/talawa/"); + navigationService.pop(); + graphqlConfig.getOrgUrl(); + navigationService.showSnackBar("Url is valid"); + } else { + navigationService.pop(); + navigationService.showTalawaErrorDialog( + "URL doesn't exist/no connection please check", + MessageType.info, + ); + } + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/formKey.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/formKey.md new file mode 100644 index 000000000..dc694cea6 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/formKey.md @@ -0,0 +1,33 @@ + + + +# formKey property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[FormState](https://api.flutter.dev/flutter/widgets/FormState-class.html)> formKey + +_final_ + + + +

formKey.

+ + + +## Implementation + +```dart +final formKey = GlobalKey(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/greeting.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/greeting.md new file mode 100644 index 000000000..3c142332f --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/greeting.md @@ -0,0 +1,33 @@ + + + +# greeting property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>> greeting + +_read / write_ + + + +

qrController.

+ + + +## Implementation + +```dart +late List> greeting; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/imageUrlKey-constant.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/imageUrlKey-constant.md new file mode 100644 index 000000000..6c8a4090a --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/imageUrlKey-constant.md @@ -0,0 +1,33 @@ + + + +# imageUrlKey constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const imageUrlKey + + + + + +

imageUrlKey.

+ + + +## Implementation + +```dart +static const imageUrlKey = "imageUrl"; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/initialise.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/initialise.md new file mode 100644 index 000000000..828addb8f --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/initialise.md @@ -0,0 +1,89 @@ + + + +# initialise method + + + + + + + + +void initialise +({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) inviteUrl = ''}) + + + + + +

This function initialises the variables.

+

params:

+
    +
  • inviteUrl: url
  • +
+

returns: + None

+ + + +## Implementation + +```dart +void initialise({String inviteUrl = ''}) { + final uri = inviteUrl; + if (uri.isNotEmpty) { + /// assigning the invite server url to the url text controller. + url.text = uri; + final box = Hive.box('url'); + box.put(urlKey, uri); + box.put(imageUrlKey, "$uri/talawa/"); + graphqlConfig.getOrgUrl(); + } + + /// greeting message. + greeting = [ + { + 'text': 'Join ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24, fontWeight: FontWeight.w700) + }, + { + 'text': 'and ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall + }, + { + 'text': 'Collaborate ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24, fontWeight: FontWeight.w700) + }, + { + 'text': 'with your ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall + }, + { + 'text': 'Organizations', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall! + .copyWith(fontSize: 24, color: const Color(0xFF4285F4)) + }, + ]; + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/orgId.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/orgId.md new file mode 100644 index 000000000..0dd4df433 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/orgId.md @@ -0,0 +1,33 @@ + + + +# orgId property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId + +_read / write_ + + + +

organizationID.

+ + + +## Implementation + +```dart +String orgId = '-1'; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/qrKey.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/qrKey.md new file mode 100644 index 000000000..911a3ddbb --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/qrKey.md @@ -0,0 +1,33 @@ + + + +# qrKey property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html)>> qrKey + +_final_ + + + +

qrKey.

+ + + +## Implementation + +```dart +final GlobalKey qrKey = GlobalKey(debugLabel: 'QR'); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/result.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/result.md new file mode 100644 index 000000000..e23ab6061 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/result.md @@ -0,0 +1,33 @@ + + + +# result property + + + + + + + +[Barcode](https://pub.dev/documentation/qr_code_scanner/1.0.1/qr_code_scanner/Barcode-class.html) result + +_read / write_ + + + +

qrText.

+ + + +## Implementation + +```dart +late Barcode result; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/scanQR.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/scanQR.md new file mode 100644 index 000000000..ead578be1 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/scanQR.md @@ -0,0 +1,93 @@ + + + +# scanQR method + + + + + + + + +void scanQR +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + + + + + +

This function create a widget which is used to scan the QR-code.

+

params:

+
    +
  • context: BuildContext
  • +
+

returns: + None

+ + + +## Implementation + +```dart +void scanQR(BuildContext context) { + showModalBottomSheet( + context: context, + barrierColor: Colors.transparent, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), + builder: (BuildContext context) { + return ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + child: Container( + height: MediaQuery.of(context).size.width, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.secondary, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: 250, + width: 250, + child: QRView( + key: qrKey, + onQRViewCreated: _onQRViewCreated, + overlay: QrScannerOverlayShape( + borderRadius: 10, + borderLength: 20, + borderWidth: 10, + cutOutSize: 250, + ), + /*overlayMargin: EdgeInsets.all(50)*/ + ), + ), + SizedBox( + height: SizeConfig.safeBlockVertical! * 4, + ), + const Text('Scan QR'), + SizedBox( + height: SizeConfig.safeBlockVertical! * 4, + ) + ], + ), + ), + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/url.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/url.md new file mode 100644 index 000000000..2f3e57fc8 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/url.md @@ -0,0 +1,33 @@ + + + +# url property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) url + +_read / write_ + + + +

url.

+ + + +## Implementation + +```dart +TextEditingController url = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/urlFocus.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/urlFocus.md new file mode 100644 index 000000000..bc8e159cf --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/urlFocus.md @@ -0,0 +1,33 @@ + + + +# urlFocus property + + + + + + + +[FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) urlFocus + +_read / write_ + + + +

urlFocus.

+ + + +## Implementation + +```dart +FocusNode urlFocus = FocusNode(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/urlKey-constant.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/urlKey-constant.md new file mode 100644 index 000000000..3e462eee9 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/urlKey-constant.md @@ -0,0 +1,33 @@ + + + +# urlKey constant + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) const urlKey + + + + + +

urlKey.

+ + + +## Implementation + +```dart +static const urlKey = "url"; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/validate.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/validate.md new file mode 100644 index 000000000..4c7538890 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel/validate.md @@ -0,0 +1,33 @@ + + + +# validate property + + + + + + + +[AutovalidateMode](https://api.flutter.dev/flutter/widgets/AutovalidateMode.html) validate + +_read / write_ + + + +

qrValidator.

+ + + +## Implementation + +```dart +AutovalidateMode validate = AutovalidateMode.disabled; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/view_model_pre_auth_view_models_set_url_view_model-library.md b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/view_model_pre_auth_view_models_set_url_view_model-library.md new file mode 100644 index 000000000..040465868 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_set_url_view_model/view_model_pre_auth_view_models_set_url_view_model-library.md @@ -0,0 +1,38 @@ + + + + +# set_url_view_model library + + + + + + + + + + + +## Classes + +##### [SetUrlViewModel](../view_model_pre_auth_view_models_set_url_view_model/SetUrlViewModel-class.md) + + + +SetUrlViewModel class helps to interact with model to serve data. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md new file mode 100644 index 000000000..68a80ada5 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md @@ -0,0 +1,303 @@ + + + +# SignupDetailsViewModel class + + + + + + + + + +

SignupDetailsViewModel class helps to interact with model to serve data +and react to user's input for Sign Up Details section.

+

Methods include:

+
    +
  • signUp
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- SignupDetailsViewModel + + + + + + + + +## Constructors + +[SignupDetailsViewModel](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/SignupDetailsViewModel.md) () + + + + +## Properties + +##### [confirmFocus](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/confirmFocus.md) ↔ [FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) + + + + +_read / write_ + + + +##### [confirmPassword](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/confirmPassword.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_read / write_ + + + +##### [email](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/email.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_read / write_ + + + +##### [firstName](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/firstName.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_read / write_ + + + +##### [formKey](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/formKey.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[FormState](https://api.flutter.dev/flutter/widgets/FormState-class.html)> + + + + +_final_ + + + +##### [greeting](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/greeting.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>> + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [hidePassword](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/hidePassword.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read / write_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [lastName](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/lastName.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_read / write_ + + + +##### [password](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/password.md) ↔ [TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [selectedOrganization](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/selectedOrganization.md) ↔ [OrgInfo](../models_organization_org_info/OrgInfo-class.md) + + + + +_read / write_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + +##### [validate](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/validate.md) ↔ [AutovalidateMode](https://api.flutter.dev/flutter/widgets/AutovalidateMode.html) + + + + +_read / write_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [initialise](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/initialise.md)([OrgInfo](../models_organization_org_info/OrgInfo-class.md) org) void + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [signUp](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/signUp.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + +This function is used to sign up the user into the application by passing the data to database query. +The function uses gqlNonAuthMutation method provided by databaseFunctions services. + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/SignupDetailsViewModel.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/SignupDetailsViewModel.md new file mode 100644 index 000000000..de1282e24 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/SignupDetailsViewModel.md @@ -0,0 +1,24 @@ + + + +# SignupDetailsViewModel constructor + + + + + + + +SignupDetailsViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/confirmFocus.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/confirmFocus.md new file mode 100644 index 000000000..66b9c41cb --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/confirmFocus.md @@ -0,0 +1,32 @@ + + + +# confirmFocus property + + + + + + + +[FocusNode](https://api.flutter.dev/flutter/widgets/FocusNode-class.html) confirmFocus + +_read / write_ + + + + + + +## Implementation + +```dart +FocusNode confirmFocus = FocusNode(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/confirmPassword.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/confirmPassword.md new file mode 100644 index 000000000..be24345f1 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/confirmPassword.md @@ -0,0 +1,32 @@ + + + +# confirmPassword property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) confirmPassword + +_read / write_ + + + + + + +## Implementation + +```dart +TextEditingController confirmPassword = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/email.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/email.md new file mode 100644 index 000000000..8fc948122 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/email.md @@ -0,0 +1,32 @@ + + + +# email property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) email + +_read / write_ + + + + + + +## Implementation + +```dart +TextEditingController email = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/firstName.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/firstName.md new file mode 100644 index 000000000..05e3d39ab --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/firstName.md @@ -0,0 +1,32 @@ + + + +# firstName property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) firstName + +_read / write_ + + + + + + +## Implementation + +```dart +TextEditingController firstName = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/formKey.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/formKey.md new file mode 100644 index 000000000..d7de0e859 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/formKey.md @@ -0,0 +1,32 @@ + + + +# formKey property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[FormState](https://api.flutter.dev/flutter/widgets/FormState-class.html)> formKey + +_final_ + + + + + + +## Implementation + +```dart +final formKey = GlobalKey(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/greeting.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/greeting.md new file mode 100644 index 000000000..de486919b --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/greeting.md @@ -0,0 +1,32 @@ + + + +# greeting property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>> greeting + +_read / write_ + + + + + + +## Implementation + +```dart +late List> greeting; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/hidePassword.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/hidePassword.md new file mode 100644 index 000000000..bd2ce20b9 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/hidePassword.md @@ -0,0 +1,32 @@ + + + +# hidePassword property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) hidePassword + +_read / write_ + + + + + + +## Implementation + +```dart +bool hidePassword = true; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/initialise.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/initialise.md new file mode 100644 index 000000000..eb0ac9473 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/initialise.md @@ -0,0 +1,64 @@ + + + +# initialise method + + + + + + + + +void initialise +([OrgInfo](../../models_organization_org_info/OrgInfo-class.md) org) + + + + + + + + +## Implementation + +```dart +void initialise(OrgInfo org) { + selectedOrganization = org; + // greeting message + greeting = [ + { + 'text': "Let's ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall + }, + { + 'text': 'get ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall + }, + { + 'text': "you ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall + }, + { + 'text': 'SignUp ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24) + }, + ]; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/lastName.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/lastName.md new file mode 100644 index 000000000..7f599f492 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/lastName.md @@ -0,0 +1,32 @@ + + + +# lastName property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) lastName + +_read / write_ + + + + + + +## Implementation + +```dart +TextEditingController lastName = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/password.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/password.md new file mode 100644 index 000000000..b344a9fed --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/password.md @@ -0,0 +1,32 @@ + + + +# password property + + + + + + + +[TextEditingController](https://api.flutter.dev/flutter/widgets/TextEditingController-class.html) password + +_read / write_ + + + + + + +## Implementation + +```dart +TextEditingController password = TextEditingController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/selectedOrganization.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/selectedOrganization.md new file mode 100644 index 000000000..627e15c4d --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/selectedOrganization.md @@ -0,0 +1,32 @@ + + + +# selectedOrganization property + + + + + + + +[OrgInfo](../../models_organization_org_info/OrgInfo-class.md) selectedOrganization + +_read / write_ + + + + + + +## Implementation + +```dart +late OrgInfo selectedOrganization; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/signUp.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/signUp.md new file mode 100644 index 000000000..a21b802c3 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/signUp.md @@ -0,0 +1,128 @@ + + + +# signUp method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> signUp +() + + + + + +

This function is used to sign up the user into the application by passing the data to database query. +The function uses gqlNonAuthMutation method provided by databaseFunctions services.

+ + + +## Implementation + +```dart +Future 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 result = await databaseFunctions.gqlNonAuthMutation( + queries.registerUser( + firstName.text, + lastName.text, + email.text, + password.text, + ), + ); + navigationService.pop(); + if (result != null) { + 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 user successfully saved and access token is also generated. + if (userSaved && tokenRefreshed) { + // if the selected organization is public. + 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( + Routes.mainScreen, + Routes.splashScreen, + arguments: + MainScreenArgs(mainScreenIndex: 0, fromSignUp: true), + ); + } on Exception catch (e) { + print(e); + navigationService.showTalawaErrorSnackBar( + 'SomeThing went wrong', + MessageType.error, + ); + } + } 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( + Routes.waitingScreen, + Routes.splashScreen, + ); + } on Exception catch (e) { + print(e); + navigationService.showTalawaErrorSnackBar( + 'SomeThing went wrong', + MessageType.error, + ); + } + } + } + } + } on Exception catch (e) { + print(e); + navigationService.showTalawaErrorSnackBar( + 'SomeThing went wrong', + MessageType.error, + ); + } + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/validate.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/validate.md new file mode 100644 index 000000000..7dd63a4d4 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel/validate.md @@ -0,0 +1,32 @@ + + + +# validate property + + + + + + + +[AutovalidateMode](https://api.flutter.dev/flutter/widgets/AutovalidateMode.html) validate + +_read / write_ + + + + + + +## Implementation + +```dart +AutovalidateMode validate = AutovalidateMode.disabled; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/view_model_pre_auth_view_models_signup_details_view_model-library.md b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/view_model_pre_auth_view_models_signup_details_view_model-library.md new file mode 100644 index 000000000..24e8f4fda --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_signup_details_view_model/view_model_pre_auth_view_models_signup_details_view_model-library.md @@ -0,0 +1,39 @@ + + + + +# signup_details_view_model library + + + + + + + + + + + +## Classes + +##### [SignupDetailsViewModel](../view_model_pre_auth_view_models_signup_details_view_model/SignupDetailsViewModel-class.md) + + + +SignupDetailsViewModel class helps to interact with model to serve data +and react to user's input for Sign Up Details section. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel-class.md b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel-class.md new file mode 100644 index 000000000..71a25deca --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel-class.md @@ -0,0 +1,239 @@ + + + +# WaitingViewModel class + + + + + + + + + +

WaitingViewModel class helps to interact with model to serve data +and react to user's input for Waiting section.

+

Methods include:

+
    +
  • logout
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- WaitingViewModel + + + + + + + + +## Constructors + +[WaitingViewModel](../view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/WaitingViewModel.md) () + + + + +## Properties + +##### [currentUser](../view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/currentUser.md) ↔ [User](../models_user_user_info/User-class.md) + + + + +_read / write_ + + + +##### [greeting](../view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/greeting.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>> + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [pendingRequestOrg](../view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/pendingRequestOrg.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [initialise](../view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/initialise.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) void + + + + + + + + +##### [joinOrg](../view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/joinOrg.md)() void + + + + + + + + +##### [logout](../view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/logout.md)() void + + + +This function ends the session for the user or logout the user from the application. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/WaitingViewModel.md b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/WaitingViewModel.md new file mode 100644 index 000000000..127dbe8ba --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/WaitingViewModel.md @@ -0,0 +1,24 @@ + + + +# WaitingViewModel constructor + + + + + + + +WaitingViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/currentUser.md b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/currentUser.md new file mode 100644 index 000000000..e955d4062 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/currentUser.md @@ -0,0 +1,32 @@ + + + +# currentUser property + + + + + + + +[User](../../models_user_user_info/User-class.md) currentUser + +_read / write_ + + + + + + +## Implementation + +```dart +late User currentUser; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/greeting.md b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/greeting.md new file mode 100644 index 000000000..de486919b --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/greeting.md @@ -0,0 +1,32 @@ + + + +# greeting property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>> greeting + +_read / write_ + + + + + + +## Implementation + +```dart +late List> greeting; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/initialise.md b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/initialise.md new file mode 100644 index 000000000..7dce45b34 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/initialise.md @@ -0,0 +1,53 @@ + + + +# initialise method + + + + + + + + +void initialise +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + + + + + + + + +## Implementation + +```dart +void initialise(BuildContext context) { + currentUser = userConfig.currentUser; + pendingRequestOrg = currentUser.membershipRequests!; + // greetings + greeting = [ + { + 'text': "Please wait", + 'textStyle': Theme.of(context).textTheme.headlineSmall + }, + { + 'text': " ${currentUser.firstName} ", + 'textStyle': + Theme.of(context).textTheme.titleLarge!.copyWith(fontSize: 24) + }, + { + 'text': "for organisation(s) to accept your invitation.", + 'textStyle': Theme.of(context).textTheme.headlineSmall + }, + ]; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/joinOrg.md b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/joinOrg.md new file mode 100644 index 000000000..428ddfc29 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/joinOrg.md @@ -0,0 +1,36 @@ + + + +# joinOrg method + + + + + + + + +void joinOrg +() + + + + + + + + +## Implementation + +```dart +void joinOrg() { + navigationService.pushScreen(Routes.joinOrg, arguments: '-1'); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/logout.md b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/logout.md new file mode 100644 index 000000000..278a53c3e --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/logout.md @@ -0,0 +1,45 @@ + + + +# logout method + + + + + + + + +void logout +() + + + + + +

This function ends the session for the user or logout the user from the application.

+ + + +## Implementation + +```dart +void logout() { + final user = Hive.box('currentUser'); + final url = Hive.box('url'); + user.clear(); + url.clear(); + navigationService.removeAllAndPush( + Routes.languageSelectionRoute, + Routes.splashScreen, + arguments: '0', + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/pendingRequestOrg.md b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/pendingRequestOrg.md new file mode 100644 index 000000000..9ca3922f2 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel/pendingRequestOrg.md @@ -0,0 +1,32 @@ + + + +# pendingRequestOrg property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> pendingRequestOrg + +_read / write_ + + + + + + +## Implementation + +```dart +late List pendingRequestOrg; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/view_model_pre_auth_view_models_waiting_view_model-library.md b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/view_model_pre_auth_view_models_waiting_view_model-library.md new file mode 100644 index 000000000..9a3ae1c44 --- /dev/null +++ b/talawa-mobile-docs/view_model_pre_auth_view_models_waiting_view_model/view_model_pre_auth_view_models_waiting_view_model-library.md @@ -0,0 +1,39 @@ + + + + +# waiting_view_model library + + + + + + + + + + + +## Classes + +##### [WaitingViewModel](../view_model_pre_auth_view_models_waiting_view_model/WaitingViewModel-class.md) + + + +WaitingViewModel class helps to interact with model to serve data +and react to user's input for Waiting section. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_theme_view_model/AppTheme-class.md b/talawa-mobile-docs/view_model_theme_view_model/AppTheme-class.md new file mode 100644 index 000000000..237c0f90f --- /dev/null +++ b/talawa-mobile-docs/view_model_theme_view_model/AppTheme-class.md @@ -0,0 +1,220 @@ + + + +# AppTheme class + + + + + + + + + +

AppTheme class is a type of View Model to serve data from modal to views in the context of App Themes.

+

Methods include:

+
    +
  • switchTheme
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- AppTheme + + + + + + + + +## Constructors + +[AppTheme](../view_model_theme_view_model/AppTheme/AppTheme.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [isdarkTheme](../view_model_theme_view_model/AppTheme/isdarkTheme.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-only_ + + + +##### [key](../view_model_theme_view_model/AppTheme/key.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [initialize](../view_model_theme_view_model/AppTheme/initialize.md)() void + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [switchTheme](../view_model_theme_view_model/AppTheme/switchTheme.md)({required [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isOn}) void + + + +This function switches the app theme. + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_theme_view_model/AppTheme/AppTheme.md b/talawa-mobile-docs/view_model_theme_view_model/AppTheme/AppTheme.md new file mode 100644 index 000000000..4e8b04727 --- /dev/null +++ b/talawa-mobile-docs/view_model_theme_view_model/AppTheme/AppTheme.md @@ -0,0 +1,24 @@ + + + +# AppTheme constructor + + + + + + + +AppTheme() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_theme_view_model/AppTheme/initialize.md b/talawa-mobile-docs/view_model_theme_view_model/AppTheme/initialize.md new file mode 100644 index 000000000..da8232bbd --- /dev/null +++ b/talawa-mobile-docs/view_model_theme_view_model/AppTheme/initialize.md @@ -0,0 +1,37 @@ + + + +# initialize method + + + + + + + + +void initialize +() + + + + + + + + +## Implementation + +```dart +void initialize() { + _isDarkMode = true; + _loadFromPrefs(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_theme_view_model/AppTheme/isdarkTheme.md b/talawa-mobile-docs/view_model_theme_view_model/AppTheme/isdarkTheme.md new file mode 100644 index 000000000..4c2bac3ff --- /dev/null +++ b/talawa-mobile-docs/view_model_theme_view_model/AppTheme/isdarkTheme.md @@ -0,0 +1,35 @@ + + + +# isdarkTheme property + + + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isdarkTheme + + + + + + + + +## Implementation + +```dart +bool get isdarkTheme => _isDarkMode; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_theme_view_model/AppTheme/key.md b/talawa-mobile-docs/view_model_theme_view_model/AppTheme/key.md new file mode 100644 index 000000000..ca4316782 --- /dev/null +++ b/talawa-mobile-docs/view_model_theme_view_model/AppTheme/key.md @@ -0,0 +1,32 @@ + + + +# key property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) key + +_final_ + + + + + + +## Implementation + +```dart +final String key = "DynamicTheme"; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_theme_view_model/AppTheme/switchTheme.md b/talawa-mobile-docs/view_model_theme_view_model/AppTheme/switchTheme.md new file mode 100644 index 000000000..25663ba89 --- /dev/null +++ b/talawa-mobile-docs/view_model_theme_view_model/AppTheme/switchTheme.md @@ -0,0 +1,43 @@ + + + +# switchTheme method + + + + + + + + +void switchTheme +({required [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isOn}) + + + + + +

This function switches the app theme.

+
    +
  • Dart -> Light
  • +
  • Light -> Dark
  • +
+ + + +## Implementation + +```dart +void switchTheme({required bool isOn}) { + _isDarkMode = isOn; + _saveToPrefs(); + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_theme_view_model/view_model_theme_view_model-library.md b/talawa-mobile-docs/view_model_theme_view_model/view_model_theme_view_model-library.md new file mode 100644 index 000000000..46949516e --- /dev/null +++ b/talawa-mobile-docs/view_model_theme_view_model/view_model_theme_view_model-library.md @@ -0,0 +1,38 @@ + + + + +# theme_view_model library + + + + + + + + + + + +## Classes + +##### [AppTheme](../view_model_theme_view_model/AppTheme-class.md) + + + +AppTheme class is a type of View Model to serve data from modal to views in the context of App Themes. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel-class.md b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel-class.md new file mode 100644 index 000000000..4e83dc409 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel-class.md @@ -0,0 +1,242 @@ + + + +# CommentsViewModel class + + + + + + + + + +

CommentsViewModel class helps to serve the data from model +and to react to user's input for Comment Widget.

+

Methods include:

+
    +
  • getComments : to get all comments on the post.
  • +
  • createComment : to add comment on the post.
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- CommentsViewModel + + + + + + + + +## Constructors + +[CommentsViewModel](../view_model_widgets_view_models_comments_view_model/CommentsViewModel/CommentsViewModel.md) () + + + + +## Properties + +##### [commentList](../view_model_widgets_view_models_comments_view_model/CommentsViewModel/commentList.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Comment](../models_comment_comment_model/Comment-class.md)> + + + + +_read-only_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [postId](../view_model_widgets_view_models_comments_view_model/CommentsViewModel/postId.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_read-only_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + + + +## Methods + +##### [addCommentLocally](../view_model_widgets_view_models_comments_view_model/CommentsViewModel/addCommentLocally.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) msg) void + + + + + + + + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [createComment](../view_model_widgets_view_models_comments_view_model/CommentsViewModel/createComment.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) msg) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This function add comment on the post. +The function uses createComments method provided by Comment Service. + + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [getComments](../view_model_widgets_view_models_comments_view_model/CommentsViewModel/getComments.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + +This methods fetch all comments on the post. +The function uses getCommentsForPost method by Comment Service. + + + + +##### [initialise](../view_model_widgets_view_models_comments_view_model/CommentsViewModel/initialise.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) postID) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/CommentsViewModel.md b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/CommentsViewModel.md new file mode 100644 index 000000000..6be109507 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/CommentsViewModel.md @@ -0,0 +1,24 @@ + + + +# CommentsViewModel constructor + + + + + + + +CommentsViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/addCommentLocally.md b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/addCommentLocally.md new file mode 100644 index 000000000..093423e4e --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/addCommentLocally.md @@ -0,0 +1,44 @@ + + + +# addCommentLocally method + + + + + + + + +void addCommentLocally +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) msg) + + + + + + + + +## Implementation + +```dart +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/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/commentList.md b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/commentList.md new file mode 100644 index 000000000..520c4d731 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/commentList.md @@ -0,0 +1,35 @@ + + + +# commentList property + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Comment](../../models_comment_comment_model/Comment-class.md)> commentList + + + + + + + + +## Implementation + +```dart +List get commentList => _commentlist; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/createComment.md b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/createComment.md new file mode 100644 index 000000000..28f2ea742 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/createComment.md @@ -0,0 +1,44 @@ + + + +# createComment method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) createComment +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) msg) + + + + + +

This function add comment on the post. +The function uses createComments method provided by Comment Service.

+

params:

+
    +
  • msg : text of the comment to add.
  • +
+ + + +## Implementation + +```dart +Future createComment(String msg) async { + print("comment viewModel called"); + await _commentService.createComments(_postID, msg); + addCommentLocally(msg); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/getComments.md b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/getComments.md new file mode 100644 index 000000000..8969fdda4 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/getComments.md @@ -0,0 +1,45 @@ + + + +# getComments method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) getComments +() + + + + + +

This methods fetch all comments on the post. +The function uses getCommentsForPost method by Comment Service.

+ + + +## Implementation + +```dart +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); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/initialise.md b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/initialise.md new file mode 100644 index 000000000..7515645c5 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/initialise.md @@ -0,0 +1,42 @@ + + + +# initialise method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html) initialise +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) postID) + + + + + + + + +## Implementation + +```dart +Future initialise(String postID) async { + _commentlist = []; + _postID = postID; + _commentService = locator(); + _userConfig = locator(); + _postService = locator(); + notifyListeners(); + await getComments(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/postId.md b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/postId.md new file mode 100644 index 000000000..fe08747d2 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/CommentsViewModel/postId.md @@ -0,0 +1,35 @@ + + + +# postId property + + + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) postId + + + + + + + + +## Implementation + +```dart +String get postId => _postID; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/view_model_widgets_view_models_comments_view_model-library.md b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/view_model_widgets_view_models_comments_view_model-library.md new file mode 100644 index 000000000..05ca1b659 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_comments_view_model/view_model_widgets_view_models_comments_view_model-library.md @@ -0,0 +1,39 @@ + + + + +# comments_view_model library + + + + + + + + + + + +## Classes + +##### [CommentsViewModel](../view_model_widgets_view_models_comments_view_model/CommentsViewModel-class.md) + + + +CommentsViewModel class helps to serve the data from model +and to react to user's input for Comment Widget. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md new file mode 100644 index 000000000..5379596e0 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md @@ -0,0 +1,269 @@ + + + +# CustomDrawerViewModel class + + + + + + + + + +

CustomDrawerViewModel class helps to serve the data and +to react to user's input for Custom Dialog Widget.

+

Functions include:

+
    +
  • switchOrg
  • +
  • isPresentinSwitchableOrg
  • +
  • setSelectedOrganizationName
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- CustomDrawerViewModel + + + + + + + + +## Constructors + +[CustomDrawerViewModel](../view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/CustomDrawerViewModel.md) () + + + + +## Properties + +##### [controller](../view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/controller.md) → [ScrollController](https://api.flutter.dev/flutter/widgets/ScrollController-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [selectedOrg](../view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/selectedOrg.md) → [OrgInfo](../models_organization_org_info/OrgInfo-class.md)? + + + + +_read-only_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + +##### [switchAbleOrg](../view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/switchAbleOrg.md) ↔ [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../models_organization_org_info/OrgInfo-class.md)> + + + + +_read / write_ + + + +##### [targets](../view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/targets.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[TargetFocus](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/TargetFocus-class.html)> + + + + +_final_ + + + +##### [tutorialCoachMark](../view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/tutorialCoachMark.md) ↔ [TutorialCoachMark](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/TutorialCoachMark-class.html) + + + + +_read / write_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](../view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/dispose.md)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_override_ + + + +##### [initialize](../view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/initialize.md)([MainScreenViewModel](../view_model_main_screen_view_model/MainScreenViewModel-class.md) homeModel, [BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) void + + + + + + + + +##### [isPresentinSwitchableOrg](../view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/isPresentinSwitchableOrg.md)([OrgInfo](../models_organization_org_info/OrgInfo-class.md) switchToOrg) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +This function checks switchOrg is present in the switchAbleOrg. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](../view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/notifyListeners.md)() void + + + +Call all the registered listeners. +_override_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setSelectedOrganizationName](../view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/setSelectedOrganizationName.md)([OrgInfo](../models_organization_org_info/OrgInfo-class.md) updatedOrganization) void + + + +This function switches the current organization to new organization. + + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [switchOrg](../view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/switchOrg.md)([OrgInfo](../models_organization_org_info/OrgInfo-class.md) switchToOrg) void + + + +This function switch the current organization to another organization, +if the organization(want switch to) is present. + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/CustomDrawerViewModel.md b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/CustomDrawerViewModel.md new file mode 100644 index 000000000..c3636dcc0 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/CustomDrawerViewModel.md @@ -0,0 +1,24 @@ + + + +# CustomDrawerViewModel constructor + + + + + + + +CustomDrawerViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/controller.md b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/controller.md new file mode 100644 index 000000000..00b8f4d3b --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/controller.md @@ -0,0 +1,32 @@ + + + +# controller property + + + + + + + +[ScrollController](https://api.flutter.dev/flutter/widgets/ScrollController-class.html) controller + +_final_ + + + + + + +## Implementation + +```dart +final ScrollController controller = ScrollController(); +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/dispose.md b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/dispose.md new file mode 100644 index 000000000..b73e68485 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/dispose.md @@ -0,0 +1,47 @@ + + + +# dispose method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +void dispose +() + +_override_ + + + +

Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed).

+

This method should only be called by the object's owner.

+

This method does not notify listeners, and clears the listener list once +it is called. Consumers of this class must decide on whether to notify +listeners or not immediately before disposal.

+ + + +## Implementation + +```dart +@override +void dispose() { + _disposed = true; + _currentOrganizationStreamSubscription?.cancel(); + super.dispose(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/initialize.md b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/initialize.md new file mode 100644 index 000000000..8d3d536fe --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/initialize.md @@ -0,0 +1,44 @@ + + + +# initialize method + + + + + + + + +void initialize +([MainScreenViewModel](../../view_model_main_screen_view_model/MainScreenViewModel-class.md) homeModel, [BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + + + + + + + + +## Implementation + +```dart +void initialize(MainScreenViewModel homeModel, BuildContext context) { + _currentOrganizationStreamSubscription = + userConfig.currentOrgInfoStream.listen( + (updatedOrganization) { + setSelectedOrganizationName(updatedOrganization); + }, + ); + _currentUser = userConfig.currentUser; + _selectedOrg = userConfig.currentOrg; + _switchAbleOrg = _currentUser.joinedOrganizations!; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/isPresentinSwitchableOrg.md b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/isPresentinSwitchableOrg.md new file mode 100644 index 000000000..ccf6f13c7 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/isPresentinSwitchableOrg.md @@ -0,0 +1,47 @@ + + + +# isPresentinSwitchableOrg method + + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isPresentinSwitchableOrg +([OrgInfo](../../models_organization_org_info/OrgInfo-class.md) switchToOrg) + + + + + +

This function checks switchOrg is present in the switchAbleOrg.

+

params:

+
    +
  • switchToOrg : OrgInfo type of organization want to switch into.
  • +
+ + + +## Implementation + +```dart +bool isPresentinSwitchableOrg(OrgInfo switchToOrg) { + var isPresent = false; + for (final OrgInfo orgs in switchAbleOrg) { + if (orgs.id == switchToOrg.id) { + isPresent = true; + } + } + return isPresent; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/notifyListeners.md b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/notifyListeners.md new file mode 100644 index 000000000..1256555b5 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/notifyListeners.md @@ -0,0 +1,51 @@ + + + +# notifyListeners method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +void notifyListeners +() + +_override_ + + + +

Call all the registered listeners.

+

Call this method whenever the object changes, to notify any clients the +object may have changed. Listeners that are added during this iteration +will not be visited. Listeners that are removed during this iteration will +not be visited after they are removed.

+

Exceptions thrown by listeners will be caught and reported using +FlutterError.reportError.

+

This method must not be called after dispose has been called.

+

Surprising behavior can result when reentrantly removing a listener (e.g. +in response to a notification) that has been registered multiple times. +See the discussion at removeListener.

+ + + +## Implementation + +```dart +@override +void notifyListeners() { + if (!_disposed) { + super.notifyListeners(); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/selectedOrg.md b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/selectedOrg.md new file mode 100644 index 000000000..55ad05093 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/selectedOrg.md @@ -0,0 +1,35 @@ + + + +# selectedOrg property + + + + + + + + + +[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)? selectedOrg + + + + + + + + +## Implementation + +```dart +OrgInfo? get selectedOrg => _selectedOrg; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/setSelectedOrganizationName.md b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/setSelectedOrganizationName.md new file mode 100644 index 000000000..ebc514a5e --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/setSelectedOrganizationName.md @@ -0,0 +1,47 @@ + + + +# setSelectedOrganizationName method + + + + + + + + +void setSelectedOrganizationName +([OrgInfo](../../models_organization_org_info/OrgInfo-class.md) updatedOrganization) + + + + + +

This function switches the current organization to new organization.

+

params:

+
    +
  • updatedOrganization : OrgInfo type, new organization.
  • +
+ + + +## Implementation + +```dart +void setSelectedOrganizationName(OrgInfo updatedOrganization) { + // if current and updated organization are not same. + if (_selectedOrg != updatedOrganization) { + _selectedOrg = updatedOrganization; + // update in `UserConfig` variable. + userConfig.currentOrgInfoController.add(_selectedOrg!); + notifyListeners(); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/switchAbleOrg.md b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/switchAbleOrg.md new file mode 100644 index 000000000..604cd6181 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/switchAbleOrg.md @@ -0,0 +1,54 @@ + + + +# switchAbleOrg property + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> switchAbleOrg + + + + + + + + +## Implementation + +```dart +List get switchAbleOrg => _switchAbleOrg; +``` + + + + + +switchAbleOrg= +([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)> switchableOrg) + + + + + + + +## Implementation + +```dart +set switchAbleOrg(List switchableOrg) => + _switchAbleOrg = switchableOrg; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/switchOrg.md b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/switchOrg.md new file mode 100644 index 000000000..2cccdb4b7 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/switchOrg.md @@ -0,0 +1,53 @@ + + + +# switchOrg method + + + + + + + + +void switchOrg +([OrgInfo](../../models_organization_org_info/OrgInfo-class.md) switchToOrg) + + + + + +

This function switch the current organization to another organization, +if the organization(want switch to) is present.

+ + + +## Implementation + +```dart +void switchOrg(OrgInfo switchToOrg) { + // if `selectedOrg` is equal to `switchOrg` and `switchToOrg` present or not. + if (selectedOrg == switchToOrg && isPresentinSwitchableOrg(switchToOrg)) { + // _navigationService.pop(); + navigationService.showTalawaErrorSnackBar( + '${switchToOrg.name} already selected', + MessageType.warning, + ); + } else { + userConfig.saveCurrentOrgInHive(switchToOrg); + setSelectedOrganizationName(switchToOrg); + navigationService.showTalawaErrorSnackBar( + 'Switched to ${switchToOrg.name}', + MessageType.info, + ); + } + navigationService.pop(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/targets.md b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/targets.md new file mode 100644 index 000000000..730ed6ecb --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/targets.md @@ -0,0 +1,32 @@ + + + +# targets property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[TargetFocus](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/TargetFocus-class.html)> targets + +_final_ + + + + + + +## Implementation + +```dart +final List targets = []; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/tutorialCoachMark.md b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/tutorialCoachMark.md new file mode 100644 index 000000000..8267cc6f1 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel/tutorialCoachMark.md @@ -0,0 +1,32 @@ + + + +# tutorialCoachMark property + + + + + + + +[TutorialCoachMark](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/TutorialCoachMark-class.html) tutorialCoachMark + +_read / write_ + + + + + + +## Implementation + +```dart +late TutorialCoachMark tutorialCoachMark; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/view_model_widgets_view_models_custom_drawer_view_model-library.md b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/view_model_widgets_view_models_custom_drawer_view_model-library.md new file mode 100644 index 000000000..f9c890977 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_custom_drawer_view_model/view_model_widgets_view_models_custom_drawer_view_model-library.md @@ -0,0 +1,39 @@ + + + + +# custom_drawer_view_model library + + + + + + + + + + + +## Classes + +##### [CustomDrawerViewModel](../view_model_widgets_view_models_custom_drawer_view_model/CustomDrawerViewModel-class.md) + + + +CustomDrawerViewModel class helps to serve the data and +to react to user's input for Custom Dialog Widget. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_event_card_view_model/view_model_widgets_view_models_event_card_view_model-library.md b/talawa-mobile-docs/view_model_widgets_view_models_event_card_view_model/view_model_widgets_view_models_event_card_view_model-library.md new file mode 100644 index 000000000..40e6bafb6 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_event_card_view_model/view_model_widgets_view_models_event_card_view_model-library.md @@ -0,0 +1,29 @@ + + + + +# event_card_view_model library + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md new file mode 100644 index 000000000..f31499362 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md @@ -0,0 +1,260 @@ + + + +# LikeButtonViewModel class + + + + + + + + + +

LikeButtonViewModel class helps to serve the data and +to react to user's input for Like Button Widget.

+

Methods include:

+
    +
  • toggleIsLiked
  • +
  • setIsLiked
  • +
  • updatePost
  • +
+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- LikeButtonViewModel + + + + + + + + +## Constructors + +[LikeButtonViewModel](../view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/LikeButtonViewModel.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [isLiked](../view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/isLiked.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-only_ + + + +##### [likedBy](../view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/likedBy.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[LikedBy](../models_post_post_model/LikedBy-class.md)> + + + + +_read-only_ + + + +##### [likesCount](../view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/likesCount.md) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + + +_read-only_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [checkAndSetTheIsLiked](../view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/checkAndSetTheIsLiked.md)() void + + + + + + + + +##### [dispose](../view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/dispose.md)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_override_ + + + +##### [initialize](../view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/initialize.md)([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[LikedBy](../models_post_post_model/LikedBy-class.md)> likedBy, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) postID) void + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setIsLiked](../view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/setIsLiked.md)({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) val = true}) void + + + +This function set _isLike to true. + + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toggleIsLiked](../view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/toggleIsLiked.md)() void + + + +This function add like to the post if not liked and +remove the like from the post if liked. + + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [updatePost](../view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/updatePost.md)([Post](../models_post_post_model/Post-class.md) post) void + + + +This function updates the Post. + + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/LikeButtonViewModel.md b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/LikeButtonViewModel.md new file mode 100644 index 000000000..c6399f1d3 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/LikeButtonViewModel.md @@ -0,0 +1,24 @@ + + + +# LikeButtonViewModel constructor + + + + + + + +LikeButtonViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/checkAndSetTheIsLiked.md b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/checkAndSetTheIsLiked.md new file mode 100644 index 000000000..067e2a13c --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/checkAndSetTheIsLiked.md @@ -0,0 +1,41 @@ + + + +# checkAndSetTheIsLiked method + + + + + + + + +void checkAndSetTheIsLiked +() + + + + + + + + +## Implementation + +```dart +void checkAndSetTheIsLiked() { + setIsLiked(val: false); + for (var i = 0; i < _likedBy.length; i++) { + if (_likedBy[i].sId == _user.id) { + setIsLiked(); + } + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/dispose.md b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/dispose.md new file mode 100644 index 000000000..f93ec9beb --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/dispose.md @@ -0,0 +1,46 @@ + + + +# dispose method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +void dispose +() + +_override_ + + + +

Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed).

+

This method should only be called by the object's owner.

+

This method does not notify listeners, and clears the listener list once +it is called. Consumers of this class must decide on whether to notify +listeners or not immediately before disposal.

+ + + +## Implementation + +```dart +@override +// ignore: must_call_super +void dispose() { + _updatePostSubscription.cancel(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/initialize.md b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/initialize.md new file mode 100644 index 000000000..24b3ef3a8 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/initialize.md @@ -0,0 +1,42 @@ + + + +# initialize method + + + + + + + + +void initialize +([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[LikedBy](../../models_post_post_model/LikedBy-class.md)> likedBy, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) postID) + + + + + + + + +## Implementation + +```dart +void initialize(List likedBy, String postID) { + _postID = postID; + _user = _userConfig.currentUser; + _likedBy = likedBy; + notifyListeners(); + checkAndSetTheIsLiked(); + _updatePostSubscription = + _postService.updatedPostStream.listen((post) => updatePost(post)); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/isLiked.md b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/isLiked.md new file mode 100644 index 000000000..e1e07b47d --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/isLiked.md @@ -0,0 +1,35 @@ + + + +# isLiked property + + + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isLiked + + + + + + + + +## Implementation + +```dart +bool get isLiked => _isLiked; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/likedBy.md b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/likedBy.md new file mode 100644 index 000000000..d35d176b5 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/likedBy.md @@ -0,0 +1,35 @@ + + + +# likedBy property + + + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[LikedBy](../../models_post_post_model/LikedBy-class.md)> likedBy + + + + + + + + +## Implementation + +```dart +List get likedBy => _likedBy; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/likesCount.md b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/likesCount.md new file mode 100644 index 000000000..8766c21d5 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/likesCount.md @@ -0,0 +1,35 @@ + + + +# likesCount property + + + + + + + + + +[int](https://api.flutter.dev/flutter/dart-core/int-class.html) likesCount + + + + + + + + +## Implementation + +```dart +int get likesCount => _likedBy.length; +``` + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/setIsLiked.md b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/setIsLiked.md new file mode 100644 index 000000000..0f471fd16 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/setIsLiked.md @@ -0,0 +1,38 @@ + + + +# setIsLiked method + + + + + + + + +void setIsLiked +({[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) val = true}) + + + + + +

This function set _isLike to true.

+ + + +## Implementation + +```dart +void setIsLiked({bool val = true}) { + _isLiked = val; + notifyListeners(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/toggleIsLiked.md b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/toggleIsLiked.md new file mode 100644 index 000000000..02c2ab66e --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/toggleIsLiked.md @@ -0,0 +1,42 @@ + + + +# toggleIsLiked method + + + + + + + + +void toggleIsLiked +() + + + + + +

This function add like to the post if not liked and +remove the like from the post if liked.

+ + + +## Implementation + +```dart +void toggleIsLiked() { + if (!_isLiked) { + _postService.addLike(_postID); + } else { + _postService.removeLike(_postID); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/updatePost.md b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/updatePost.md new file mode 100644 index 000000000..4076fffea --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel/updatePost.md @@ -0,0 +1,42 @@ + + + +# updatePost method + + + + + + + + +void updatePost +([Post](../../models_post_post_model/Post-class.md) post) + + + + + +

This function updates the Post.

+

params: +post : Post type, the post that need to be updated.

+ + + +## Implementation + +```dart +void updatePost(Post post) { + if (_postID == post.sId) { + _likedBy = post.likedBy!; + checkAndSetTheIsLiked(); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/view_model_widgets_view_models_like_button_view_model-library.md b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/view_model_widgets_view_models_like_button_view_model-library.md new file mode 100644 index 000000000..d178be920 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_like_button_view_model/view_model_widgets_view_models_like_button_view_model-library.md @@ -0,0 +1,39 @@ + + + + +# like_button_view_model library + + + + + + + + + + + +## Classes + +##### [LikeButtonViewModel](../view_model_widgets_view_models_like_button_view_model/LikeButtonViewModel-class.md) + + + +LikeButtonViewModel class helps to serve the data and +to react to user's input for Like Button Widget. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel-class.md b/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel-class.md new file mode 100644 index 000000000..1fb945caa --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel-class.md @@ -0,0 +1,208 @@ + + + +# ProgressDialogViewModel class + + + + + + + + + +

ProgressDialogViewModel class helps to serve the data and +to react to user's input for Progress Dialog Widget.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html) +- [BaseModel](../view_model_base_view_model/BaseModel-class.md) +- ProgressDialogViewModel + + + + + + + + +## Constructors + +[ProgressDialogViewModel](../view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/ProgressDialogViewModel.md) () + + + + +## Properties + +##### [connectivityPresent](../view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/connectivityPresent.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read / write_ + + + +##### [connectivityResult](../view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/connectivityResult.md) ↔ [ConnectivityResult](https://pub.dev/documentation/connectivity_plus_platform_interface/1.2.4/connectivity_plus_platform_interface/ConnectivityResult.html) + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [hasListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/hasListeners.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether any listeners are currently registered. +_read-onlyinherited_ + + + +##### [isBusy](../view_model_base_view_model/BaseModel/isBusy.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [state](../view_model_base_view_model/BaseModel/state.md) → [ViewState](../enums_enums/ViewState.md) + + + + +_read-onlyinherited_ + + + + + +## Methods + +##### [addListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/addListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Register a closure to be called when the object changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/foundation/ChangeNotifier/dispose.html)() void + + + +Discards any resources used by the object. After this is called, the +object is not in a usable state and should be discarded (calls to +addListener will throw after the object is disposed). +_inherited_ + + + +##### [initialise](../view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/initialise.md)() [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [notifyListeners](https://api.flutter.dev/flutter/foundation/ChangeNotifier/notifyListeners.html)() void + + + +Call all the registered listeners. +_inherited_ + + + +##### [removeListener](https://api.flutter.dev/flutter/foundation/ChangeNotifier/removeListener.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) listener) void + + + +Remove a previously registered closure from the list of closures that are +notified when the object changes. +_inherited_ + + + +##### [setState](../view_model_base_view_model/BaseModel/setState.md)([ViewState](../enums_enums/ViewState.md) viewState) void + + + + +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/ProgressDialogViewModel.md b/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/ProgressDialogViewModel.md new file mode 100644 index 000000000..f59d835a4 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/ProgressDialogViewModel.md @@ -0,0 +1,24 @@ + + + +# ProgressDialogViewModel constructor + + + + + + + +ProgressDialogViewModel() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/connectivityPresent.md b/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/connectivityPresent.md new file mode 100644 index 000000000..db77d704c --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/connectivityPresent.md @@ -0,0 +1,32 @@ + + + +# connectivityPresent property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) connectivityPresent + +_read / write_ + + + + + + +## Implementation + +```dart +bool connectivityPresent = false; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/connectivityResult.md b/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/connectivityResult.md new file mode 100644 index 000000000..f3c500a12 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/connectivityResult.md @@ -0,0 +1,32 @@ + + + +# connectivityResult property + + + + + + + +[ConnectivityResult](https://pub.dev/documentation/connectivity_plus_platform_interface/1.2.4/connectivity_plus_platform_interface/ConnectivityResult.html) connectivityResult + +_read / write_ + + + + + + +## Implementation + +```dart +late ConnectivityResult connectivityResult; +``` + + + + + + + diff --git a/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/initialise.md b/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/initialise.md new file mode 100644 index 000000000..7389c3d92 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel/initialise.md @@ -0,0 +1,45 @@ + + + +# initialise method + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<void> initialise +() + + + + + + + + +## Implementation + +```dart +Future 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/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/view_model_widgets_view_models_progress_dialog_view_model-library.md b/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/view_model_widgets_view_models_progress_dialog_view_model-library.md new file mode 100644 index 000000000..51f0ddc22 --- /dev/null +++ b/talawa-mobile-docs/view_model_widgets_view_models_progress_dialog_view_model/view_model_widgets_view_models_progress_dialog_view_model-library.md @@ -0,0 +1,39 @@ + + + + +# progress_dialog_view_model library + + + + + + + + + + + +## Classes + +##### [ProgressDialogViewModel](../view_model_widgets_view_models_progress_dialog_view_model/ProgressDialogViewModel-class.md) + + + +ProgressDialogViewModel class helps to serve the data and +to react to user's input for Progress Dialog Widget. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost-class.md b/talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost-class.md new file mode 100644 index 000000000..f61800c2d --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost-class.md @@ -0,0 +1,198 @@ + + + +# AddPost class + + + + + + + + + +

AddPost returns a widget to add(upload) the post.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- AddPost + + + + + + + + +## Constructors + +[AddPost](../views_after_auth_screens_add_post_page/AddPost/AddPost.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[ScaffoldState](https://api.flutter.dev/flutter/material/ScaffoldState-class.html)>? drawerKey}) + + _const_ + + +## Properties + +##### [drawerKey](../views_after_auth_screens_add_post_page/AddPost/drawerKey.md) → [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[ScaffoldState](https://api.flutter.dev/flutter/material/ScaffoldState-class.html)>? + + + +DrawerKey. +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_add_post_page/AddPost/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost/AddPost.md b/talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost/AddPost.md new file mode 100644 index 000000000..a98f0d2a1 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost/AddPost.md @@ -0,0 +1,29 @@ + + + +# AddPost constructor + + + + + + +const +AddPost({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, [GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[ScaffoldState](https://api.flutter.dev/flutter/material/ScaffoldState-class.html)>? drawerKey}) + + + + + +## Implementation + +```dart +const AddPost({Key? key, this.drawerKey}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost/build.md b/talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost/build.md new file mode 100644 index 000000000..dc744fe0a --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost/build.md @@ -0,0 +1,229 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return Scaffold( + resizeToAvoidBottomInset: false, + // header for the widget + appBar: AppBar( + backgroundColor: Theme.of(context).primaryColor, + elevation: 0.9, + centerTitle: true, + // header title + title: Text( + AppLocalizations.of(context)!.strictTranslate('Share News'), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + leading: IconButton( + //TODO: showing the null pointer exception + key: const Key('add_post_icon_button1'), + color: Theme.of(context).iconTheme.color, + icon: const Icon(Icons.menu), + onPressed: () => drawerKey!.currentState!.openDrawer(), + ), + // button to upload the post. + actions: [ + TextButton( + key: const Key('add_post_text_btn1'), + onPressed: () => model.uploadPost(), + child: Text( + AppLocalizations.of(context)!.strictTranslate("Post"), + style: Theme.of(context).textTheme.headlineSmall!.copyWith( + fontWeight: FontWeight.w600, + color: Theme.of(context).colorScheme.secondary, + ), + ), + ), + ], + ), + body: BaseView( + onModelReady: (m) { + m.initialise(); + model = m; + }, + builder: (context, model, child) => SingleChildScrollView( + child: Column( + children: [ + ListTile( + leading: const CircleAvatar(radius: 25), + title: Text(model.userName), + subtitle: Text( + AppLocalizations.of(context)!.strictTranslate(model.orgName), + ), + ), + // renders icon button to upload post files. + Row( + children: [ + // button to select the photo from gallery. + IconButton( + key: const Key('add_post_icon_button2'), + onPressed: () => model.getImageFromGallery(), + icon: const Icon(Icons.photo), + ), + // button to capture the image. + IconButton( + key: const Key('add_post_icon_button3'), + onPressed: () => model.getImageFromGallery(camera: true), + icon: const Icon(Icons.camera_alt), + ), + // button to select file + IconButton( + key: const Key('add_post_icon_button4'), + onPressed: () {}, + icon: const Icon(Icons.file_upload), + ), + // button to add hastags to the post. + TextButton( + key: const Key('add_post_text_btn2'), + onPressed: () {}, + child: Text( + '# ${AppLocalizations.of(context)!.strictTranslate("Add hashtag")}', + style: Theme.of(context).textTheme.titleLarge, + ), + ), + ], + ), + const Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: TextField( + controller: model.titleController, + // input field to write the description of the post. + decoration: InputDecoration( + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + errorBorder: InputBorder.none, + disabledBorder: InputBorder.none, + hintText: AppLocalizations.of(context)!.strictTranslate( + "Enter the title of your post", + ), + label: Text( + AppLocalizations.of(context)!.strictTranslate( + "Title", + ), + ), + ), + ), + ), + const Divider(), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 16.0), + child: TextField( + controller: model.controller, + maxLines: null, + // input field to write the description of the post. + 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", + ), + ), + ), + ), + // if the image for the post is added then render button to remove it. + model.imageFile != null + // ignore: sized_box_for_whitespace + ? Container( + height: 230, + padding: const EdgeInsets.all(8.0), + child: Stack( + children: [ + Image.file( + model.imageFile!, + fit: BoxFit.cover, + width: MediaQuery.of(context).size.width, + ), + Positioned( + right: 5, + top: 5, + child: IconButton( + onPressed: () => model.removeImage(), + icon: const Icon( + Icons.cancel, + color: Colors.black, + ), + ), + ) + ], + ), + ) + : Container(), + ], + ), + ), + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost/drawerKey.md b/talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost/drawerKey.md new file mode 100644 index 000000000..e50f7f58b --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_add_post_page/AddPost/drawerKey.md @@ -0,0 +1,33 @@ + + + +# drawerKey property + + + + + + + +[GlobalKey](https://api.flutter.dev/flutter/widgets/GlobalKey-class.html)<[ScaffoldState](https://api.flutter.dev/flutter/material/ScaffoldState-class.html)>? drawerKey + +_final_ + + + +

DrawerKey.

+ + + +## Implementation + +```dart +final GlobalKey? drawerKey; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_add_post_page/model.md b/talawa-mobile-docs/views_after_auth_screens_add_post_page/model.md new file mode 100644 index 000000000..b885e4796 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_add_post_page/model.md @@ -0,0 +1,36 @@ + + + +# model top-level property + + + + + + + + + +[AddPostViewModel](../view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md) model + +_read / write_ + + + +

Add Post View Model.

+ + + +## Implementation + +```dart +late AddPostViewModel model; +``` + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_add_post_page/views_after_auth_screens_add_post_page-library.md b/talawa-mobile-docs/views_after_auth_screens_add_post_page/views_after_auth_screens_add_post_page-library.md new file mode 100644 index 000000000..1283c8ee0 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_add_post_page/views_after_auth_screens_add_post_page-library.md @@ -0,0 +1,49 @@ + + + + +# add_post_page library + + + + + + + + + + + +## Classes + +##### [AddPost](../views_after_auth_screens_add_post_page/AddPost-class.md) + + + +AddPost returns a widget to add(upload) the post. + + + + + + +## Properties + +##### [model](../views_after_auth_screens_add_post_page/model.md) ↔ [AddPostViewModel](../view_model_after_auth_view_models_add_post_view_models_add_post_view_model/AddPostViewModel-class.md) + + + +Add Post View Model. +_read / write_ + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage-class.md b/talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage-class.md new file mode 100644 index 000000000..b86bb1fbd --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage-class.md @@ -0,0 +1,189 @@ + + + +# AppSettingsPage class + + + + + + + + + +

AppSettingsPage is a widget that has mutable state _AppSettingsPageState.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- AppSettingsPage + + + + + + + + +## Constructors + +[AppSettingsPage](../views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage/AppSettingsPage.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage/createState.md)() _AppSettingsPageState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage/AppSettingsPage.md b/talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage/AppSettingsPage.md new file mode 100644 index 000000000..cef89c44b --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage/AppSettingsPage.md @@ -0,0 +1,29 @@ + + + +# AppSettingsPage constructor + + + + + + +const +AppSettingsPage({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const AppSettingsPage({Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage/createState.md b/talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage/createState.md new file mode 100644 index 000000000..f6f01c5f1 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_AppSettingsPageState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_AppSettingsPageState createState() => _AppSettingsPageState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/views_after_auth_screens_app_settings_app_settings_page-library.md b/talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/views_after_auth_screens_app_settings_app_settings_page-library.md new file mode 100644 index 000000000..b5eed9934 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_app_settings_app_settings_page/views_after_auth_screens_app_settings_app_settings_page-library.md @@ -0,0 +1,38 @@ + + + + +# app_settings_page library + + + + + + + + + + + +## Classes + +##### [AppSettingsPage](../views_after_auth_screens_app_settings_app_settings_page/AppSettingsPage-class.md) + + + +AppSettingsPage is a widget that has mutable state _AppSettingsPageState. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/ChatPage-class.md b/talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/ChatPage-class.md new file mode 100644 index 000000000..d85f9dd3e --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/ChatPage-class.md @@ -0,0 +1,190 @@ + + + +# ChatPage class + + + + + + + + + +

ChatPage returns a stateless widget for current user Chat Page which renders +the list of all the users that the current user has chat with.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- ChatPage + + + + + + + + +## Constructors + +[ChatPage](../views_after_auth_screens_chat_chat_list_screen/ChatPage/ChatPage.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_chat_chat_list_screen/ChatPage/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/ChatPage/ChatPage.md b/talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/ChatPage/ChatPage.md new file mode 100644 index 000000000..c9653c01c --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/ChatPage/ChatPage.md @@ -0,0 +1,29 @@ + + + +# ChatPage constructor + + + + + + +const +ChatPage({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const ChatPage({Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/ChatPage/build.md b/talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/ChatPage/build.md new file mode 100644 index 000000000..11b31fb2a --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/ChatPage/build.md @@ -0,0 +1,114 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return DefaultTabController( + length: 2, + child: Scaffold( + appBar: AppBar( + backgroundColor: Theme.of(context).primaryColor, + elevation: 0.0, + centerTitle: true, + title: Text( + "Chats", + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + bottom: const TabBar( + tabs: [ + Tab( + text: "Direct", + ), + Tab( + text: "Events", + ), + ], + ), + ), + // returns a tabs on the top for current user to switch between DirectChats and EventChats. + body: const TabBarView( + children: [ + DirectChats(), + EventChats(), + ], + ), + floatingActionButton: FloatingActionButton( + // onPressed to FloatingActionButton renders SelectContact Widget to chat with other users in the connection. + onPressed: () { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => const SelectContact()), + ); + }, + child: const Icon(Icons.add), + ), + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/views_after_auth_screens_chat_chat_list_screen-library.md b/talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/views_after_auth_screens_chat_chat_list_screen-library.md new file mode 100644 index 000000000..fe58d6952 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_chat_list_screen/views_after_auth_screens_chat_chat_list_screen-library.md @@ -0,0 +1,39 @@ + + + + +# chat_list_screen library + + + + + + + + + + + +## Classes + +##### [ChatPage](../views_after_auth_screens_chat_chat_list_screen/ChatPage-class.md) + + + +ChatPage returns a stateless widget for current user Chat Page which renders +the list of all the users that the current user has chat with. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen-class.md b/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen-class.md new file mode 100644 index 000000000..131bed196 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen-class.md @@ -0,0 +1,207 @@ + + + +# ChatMessageScreen class + + + + + + + + + +

ChatMessageScreen returns a StatelessWidget for showing the chat message screen.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- ChatMessageScreen + + + + + + + + +## Constructors + +[ChatMessageScreen](../views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/ChatMessageScreen.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) chatId, required [DirectChatViewModel](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md) model}) + + _const_ + + +## Properties + +##### [chatId](../views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/chatId.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [model](../views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/model.md) → [DirectChatViewModel](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/ChatMessageScreen.md b/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/ChatMessageScreen.md new file mode 100644 index 000000000..f6d0c8a5e --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/ChatMessageScreen.md @@ -0,0 +1,30 @@ + + + +# ChatMessageScreen constructor + + + + + + +const +ChatMessageScreen({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) chatId, required [DirectChatViewModel](../../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md) model}) + + + + + +## Implementation + +```dart +const ChatMessageScreen({Key? key, required this.chatId, required this.model}) + : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/build.md b/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/build.md new file mode 100644 index 000000000..0ba68ed58 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/build.md @@ -0,0 +1,122 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + model.getChatMessages(chatId); + model.chatName(chatId); + return Scaffold( + appBar: AppBar( + automaticallyImplyLeading: false, + title: Row( + children: [ + IconButton( + icon: const Icon(Icons.arrow_back), + onPressed: () => Navigator.pop(context), + ), + SizedBox(width: SizeConfig.safeBlockHorizontal! * 3), + CircleAvatar( + backgroundColor: Colors.white, + radius: SizeConfig.blockSizeVertical! * 2.3, + ), + SizedBox(width: SizeConfig.safeBlockHorizontal! * 3), + Text('${model.name}'), + ], + ), + ), + body: BaseView( + onModelReady: (model) => model.getChatMessages(chatId), + builder: (context, model, child) => + (Provider.of(context).chatState == + ChatState.complete) + ? Column( + children: [ + Expanded( + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.safeBlockHorizontal! * 3, + ), + child: ListView.builder( + itemCount: model.chatMessagesByUser[chatId]!.length, + itemBuilder: (context, index) { + return Message( + message: + model.chatMessagesByUser[chatId]![index], + ); + }, + ), + ), + ), + ChatInputField(chatId: chatId, model: model), + ], + ) + : const Center( + child: CircularProgressIndicator(), + ), + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/chatId.md b/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/chatId.md new file mode 100644 index 000000000..2dc5c3bec --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/chatId.md @@ -0,0 +1,32 @@ + + + +# chatId property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) chatId + +_final_ + + + + + + +## Implementation + +```dart +final String chatId; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/model.md b/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/model.md new file mode 100644 index 000000000..45becc144 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen/model.md @@ -0,0 +1,32 @@ + + + +# model property + + + + + + + +[DirectChatViewModel](../../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md) model + +_final_ + + + + + + +## Implementation + +```dart +final DirectChatViewModel model; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/views_after_auth_screens_chat_chat_message_screen-library.md b/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/views_after_auth_screens_chat_chat_message_screen-library.md new file mode 100644 index 000000000..7ee3f7021 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_chat_message_screen/views_after_auth_screens_chat_chat_message_screen-library.md @@ -0,0 +1,38 @@ + + + + +# chat_message_screen library + + + + + + + + + + + +## Classes + +##### [ChatMessageScreen](../views_after_auth_screens_chat_chat_message_screen/ChatMessageScreen-class.md) + + + +ChatMessageScreen returns a StatelessWidget for showing the chat message screen. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile-class.md b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile-class.md new file mode 100644 index 000000000..aa7aa3b89 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile-class.md @@ -0,0 +1,207 @@ + + + +# ChatTile class + + + + + + + + + +

ChatTile return a widget for a tile in the list of Direct Chats in the Chat List Screen.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- ChatTile + + + + + + + + +## Constructors + +[ChatTile](../views_after_auth_screens_chat_direct_chats/ChatTile/ChatTile.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [ChatListTileDataModel](../models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md) chat, required [DirectChatViewModel](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md) model}) + + _const_ + + +## Properties + +##### [chat](../views_after_auth_screens_chat_direct_chats/ChatTile/chat.md) → [ChatListTileDataModel](../models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [model](../views_after_auth_screens_chat_direct_chats/ChatTile/model.md) → [DirectChatViewModel](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_chat_direct_chats/ChatTile/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/ChatTile.md b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/ChatTile.md new file mode 100644 index 000000000..d57031896 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/ChatTile.md @@ -0,0 +1,30 @@ + + + +# ChatTile constructor + + + + + + +const +ChatTile({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [ChatListTileDataModel](../../models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md) chat, required [DirectChatViewModel](../../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md) model}) + + + + + +## Implementation + +```dart +const ChatTile({Key? key, required this.chat, required this.model}) + : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/build.md b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/build.md new file mode 100644 index 000000000..b568e64b0 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/build.md @@ -0,0 +1,78 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return ListTile( + onTap: () => navigationService + .pushScreen(Routes.chatMessageScreen, arguments: [chat.id, model]), + leading: const CircleAvatar( + radius: 20, + ), + title: Text(chat.users![0].firstName!), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/chat.md b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/chat.md new file mode 100644 index 000000000..f685bdc76 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/chat.md @@ -0,0 +1,32 @@ + + + +# chat property + + + + + + + +[ChatListTileDataModel](../../models_chats_chat_list_tile_data_model/ChatListTileDataModel-class.md) chat + +_final_ + + + + + + +## Implementation + +```dart +final ChatListTileDataModel chat; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/model.md b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/model.md new file mode 100644 index 000000000..45becc144 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/ChatTile/model.md @@ -0,0 +1,32 @@ + + + +# model property + + + + + + + +[DirectChatViewModel](../../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md) model + +_final_ + + + + + + +## Implementation + +```dart +final DirectChatViewModel model; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/DirectChats-class.md b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/DirectChats-class.md new file mode 100644 index 000000000..2db88e0c7 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/DirectChats-class.md @@ -0,0 +1,190 @@ + + + +# DirectChats class + + + + + + + + + +

DirectChats return a statelessWidget for rendering all the directs +chats of the current user in the Chat List Screen

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- DirectChats + + + + + + + + +## Constructors + +[DirectChats](../views_after_auth_screens_chat_direct_chats/DirectChats/DirectChats.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_chat_direct_chats/DirectChats/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/DirectChats/DirectChats.md b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/DirectChats/DirectChats.md new file mode 100644 index 000000000..bacac35ba --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/DirectChats/DirectChats.md @@ -0,0 +1,29 @@ + + + +# DirectChats constructor + + + + + + +const +DirectChats({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const DirectChats({Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/DirectChats/build.md b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/DirectChats/build.md new file mode 100644 index 000000000..13c976ecb --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/DirectChats/build.md @@ -0,0 +1,85 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(), + builder: (context, model, child) { + return ListView.builder( + // key: model.listKey, + itemCount: model.chats.length, + itemBuilder: (context, index) { + return ChatTile( + chat: model.chats[index], + model: model, + ); + }, + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/views_after_auth_screens_chat_direct_chats-library.md b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/views_after_auth_screens_chat_direct_chats-library.md new file mode 100644 index 000000000..f52c976e0 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_direct_chats/views_after_auth_screens_chat_direct_chats-library.md @@ -0,0 +1,46 @@ + + + + +# direct_chats library + + + + + + + + + + + +## Classes + +##### [ChatTile](../views_after_auth_screens_chat_direct_chats/ChatTile-class.md) + + + +ChatTile return a widget for a tile in the list of Direct Chats in the Chat List Screen. + + +##### [DirectChats](../views_after_auth_screens_chat_direct_chats/DirectChats-class.md) + + + +DirectChats return a statelessWidget for rendering all the directs +chats of the current user in the Chat List Screen + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_event_chats/EventChats-class.md b/talawa-mobile-docs/views_after_auth_screens_chat_event_chats/EventChats-class.md new file mode 100644 index 000000000..afab3cf58 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_event_chats/EventChats-class.md @@ -0,0 +1,190 @@ + + + +# EventChats class + + + + + + + + + +

EventChats return a statelessWidget for rendering all the events +chats of the current user in the Chat List Screen

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- EventChats + + + + + + + + +## Constructors + +[EventChats](../views_after_auth_screens_chat_event_chats/EventChats/EventChats.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_chat_event_chats/EventChats/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_event_chats/EventChats/EventChats.md b/talawa-mobile-docs/views_after_auth_screens_chat_event_chats/EventChats/EventChats.md new file mode 100644 index 000000000..5186b0822 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_event_chats/EventChats/EventChats.md @@ -0,0 +1,29 @@ + + + +# EventChats constructor + + + + + + +const +EventChats({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const EventChats({Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_event_chats/EventChats/build.md b/talawa-mobile-docs/views_after_auth_screens_chat_event_chats/EventChats/build.md new file mode 100644 index 000000000..0552bb07a --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_event_chats/EventChats/build.md @@ -0,0 +1,73 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return Container( + child: null, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_event_chats/views_after_auth_screens_chat_event_chats-library.md b/talawa-mobile-docs/views_after_auth_screens_chat_event_chats/views_after_auth_screens_chat_event_chats-library.md new file mode 100644 index 000000000..692360af1 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_event_chats/views_after_auth_screens_chat_event_chats-library.md @@ -0,0 +1,39 @@ + + + + +# event_chats library + + + + + + + + + + + +## Classes + +##### [EventChats](../views_after_auth_screens_chat_event_chats/EventChats-class.md) + + + +EventChats return a statelessWidget for rendering all the events +chats of the current user in the Chat List Screen + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_select_contact/SelectContact-class.md b/talawa-mobile-docs/views_after_auth_screens_chat_select_contact/SelectContact-class.md new file mode 100644 index 000000000..790f504b5 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_select_contact/SelectContact-class.md @@ -0,0 +1,189 @@ + + + +# SelectContact class + + + + + + + + + +

SelectContact returns a widget that has mutable state _SelectContactState.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- SelectContact + + + + + + + + +## Constructors + +[SelectContact](../views_after_auth_screens_chat_select_contact/SelectContact/SelectContact.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_after_auth_screens_chat_select_contact/SelectContact/createState.md)() _SelectContactState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_select_contact/SelectContact/SelectContact.md b/talawa-mobile-docs/views_after_auth_screens_chat_select_contact/SelectContact/SelectContact.md new file mode 100644 index 000000000..d896d61fd --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_select_contact/SelectContact/SelectContact.md @@ -0,0 +1,29 @@ + + + +# SelectContact constructor + + + + + + +const +SelectContact({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const SelectContact({Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_select_contact/SelectContact/createState.md b/talawa-mobile-docs/views_after_auth_screens_chat_select_contact/SelectContact/createState.md new file mode 100644 index 000000000..34529da24 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_select_contact/SelectContact/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_SelectContactState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_SelectContactState createState() => _SelectContactState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_select_contact/views_after_auth_screens_chat_select_contact-library.md b/talawa-mobile-docs/views_after_auth_screens_chat_select_contact/views_after_auth_screens_chat_select_contact-library.md new file mode 100644 index 000000000..f924dee20 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_select_contact/views_after_auth_screens_chat_select_contact-library.md @@ -0,0 +1,38 @@ + + + + +# select_contact library + + + + + + + + + + + +## Classes + +##### [SelectContact](../views_after_auth_screens_chat_select_contact/SelectContact-class.md) + + + +SelectContact returns a widget that has mutable state _SelectContactState. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField-class.md b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField-class.md new file mode 100644 index 000000000..8eb646085 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField-class.md @@ -0,0 +1,207 @@ + + + +# ChatInputField class + + + + + + + + + +

ChatInputField returns a widget that has mutable state _ChatInputFieldState.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- ChatInputField + + + + + + + + +## Constructors + +[ChatInputField](../views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/ChatInputField.md) ({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) chatId, required [DirectChatViewModel](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md) model, [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [chatId](../views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/chatId.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +ChatId. +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [model](../views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/model.md) → [DirectChatViewModel](../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md) + + + +DirectChatViewModel instance. +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/createState.md)() [State](https://api.flutter.dev/flutter/widgets/State-class.html)<[ChatInputField](../views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField-class.md)> + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/ChatInputField.md b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/ChatInputField.md new file mode 100644 index 000000000..9521860d9 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/ChatInputField.md @@ -0,0 +1,33 @@ + + + +# ChatInputField constructor + + + + + + +const +ChatInputField({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) chatId, required [DirectChatViewModel](../../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md) model, [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const ChatInputField({ + required this.chatId, + required this.model, + Key? key, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/chatId.md b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/chatId.md new file mode 100644 index 000000000..e2b3e1207 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/chatId.md @@ -0,0 +1,33 @@ + + + +# chatId property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) chatId + +_final_ + + + +

ChatId.

+ + + +## Implementation + +```dart +final String chatId; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/createState.md b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/createState.md new file mode 100644 index 000000000..1d7afc59b --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[ChatInputField](../../views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField-class.md)> createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +State createState() => _ChatInputFieldState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/model.md b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/model.md new file mode 100644 index 000000000..3abb558cf --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField/model.md @@ -0,0 +1,33 @@ + + + +# model property + + + + + + + +[DirectChatViewModel](../../view_model_after_auth_view_models_chat_view_models_direct_chat_view_model/DirectChatViewModel-class.md) model + +_final_ + + + +

DirectChatViewModel instance.

+ + + +## Implementation + +```dart +final DirectChatViewModel model; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/views_after_auth_screens_chat_widgets_chat_input_field-library.md b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/views_after_auth_screens_chat_widgets_chat_input_field-library.md new file mode 100644 index 000000000..bb61c05cc --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_input_field/views_after_auth_screens_chat_widgets_chat_input_field-library.md @@ -0,0 +1,38 @@ + + + + +# chat_input_field library + + + + + + + + + + + +## Classes + +##### [ChatInputField](../views_after_auth_screens_chat_widgets_chat_input_field/ChatInputField-class.md) + + + +ChatInputField returns a widget that has mutable state _ChatInputFieldState. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/Message-class.md b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/Message-class.md new file mode 100644 index 000000000..7bb1eb076 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/Message-class.md @@ -0,0 +1,189 @@ + + + +# Message class + + + + + + + + + +

Message returns a widget for chat message in the bubble form.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- Message + + + + + + + + +## Constructors + +[Message](../views_after_auth_screens_chat_widgets_chat_message_bubble/Message/Message.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [ChatMessage](../models_chats_chat_message/ChatMessage-class.md) message}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_chat_widgets_chat_message_bubble/Message/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/Message/Message.md b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/Message/Message.md new file mode 100644 index 000000000..6f392e748 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/Message/Message.md @@ -0,0 +1,29 @@ + + + +# Message constructor + + + + + + +const +Message({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [ChatMessage](../../models_chats_chat_message/ChatMessage-class.md) message}) + + + + + +## Implementation + +```dart +const Message({Key? key, required this.message}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/Message/build.md b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/Message/build.md new file mode 100644 index 000000000..824759c16 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/Message/build.md @@ -0,0 +1,117 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + // styling + return Padding( + padding: EdgeInsets.only(top: SizeConfig.safeBlockVertical! * 2), + child: Row( + mainAxisAlignment: + message.sender!.firstName == userConfig.currentUser.firstName + ? MainAxisAlignment.end + : MainAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.safeBlockHorizontal! * 2, + vertical: SizeConfig.blockSizeVertical! * 1.2, + ), + decoration: BoxDecoration( + // if the message is sent by current user, then the background color will be white else green + color: + message.sender!.firstName == userConfig.currentUser.firstName + ? Colors.white + : Colors.green, + borderRadius: + message.sender!.firstName == userConfig.currentUser.firstName + ? const BorderRadius.only( + bottomRight: Radius.circular(15), + topLeft: Radius.circular(15), + bottomLeft: Radius.circular(15), + ) + : const BorderRadius.only( + bottomRight: Radius.circular(15), + topRight: Radius.circular(15), + bottomLeft: Radius.circular(15), + ), + ), + child: Text( + message.messageContent!, + // if the message is sent by current user, then the text color will be black else theme bodyText color + style: TextStyle( + color: message.sender!.firstName == + userConfig.currentUser.firstName + ? Colors.black + : Theme.of(context).textTheme.bodyLarge!.color, + ), + ), + ), + ], + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/views_after_auth_screens_chat_widgets_chat_message_bubble-library.md b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/views_after_auth_screens_chat_widgets_chat_message_bubble-library.md new file mode 100644 index 000000000..7a6b4a4f5 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_chat_widgets_chat_message_bubble/views_after_auth_screens_chat_widgets_chat_message_bubble-library.md @@ -0,0 +1,38 @@ + + + + +# chat_message_bubble library + + + + + + + + + + + +## Classes + +##### [Message](../views_after_auth_screens_chat_widgets_chat_message_bubble/Message-class.md) + + + +Message returns a widget for chat message in the bubble form. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm-class.md b/talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm-class.md new file mode 100644 index 000000000..6899a021e --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm-class.md @@ -0,0 +1,199 @@ + + + +# CreateEventForm class + + + + + + + + + +

CreateEventForm returns a widget of a Form for creating events in the organization. +This widget is used in CreateEventPage widget.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- CreateEventForm + + + + + + + + +## Constructors + +[CreateEventForm](../views_after_auth_screens_events_create_event_form/CreateEventForm/CreateEventForm.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [CreateEventViewModel](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md) model}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [model](../views_after_auth_screens_events_create_event_form/CreateEventForm/model.md) → [CreateEventViewModel](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_events_create_event_form/CreateEventForm/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm/CreateEventForm.md b/talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm/CreateEventForm.md new file mode 100644 index 000000000..bc499612c --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm/CreateEventForm.md @@ -0,0 +1,29 @@ + + + +# CreateEventForm constructor + + + + + + +const +CreateEventForm({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [CreateEventViewModel](../../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md) model}) + + + + + +## Implementation + +```dart +const CreateEventForm({Key? key, required this.model}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm/build.md b/talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm/build.md new file mode 100644 index 000000000..4f52a40cc --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm/build.md @@ -0,0 +1,194 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + // Form class is a container for grouping together multiple form field widgets. + return Form( + key: model.formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Text field for event title. + TextFormField( + key: const Key('create_event_form_tff1'), + textInputAction: TextInputAction.next, + controller: model.eventTitleTextController, + keyboardType: TextInputType.name, + maxLength: 20, + focusNode: model.titleFocus, + validator: (value) => Validator.validateEventForm(value!, 'Title'), + decoration: InputDecoration( + // placeholder of the text field + labelText: 'Add Event Title', + isDense: true, + labelStyle: Theme.of(context).textTheme.titleMedium, + 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, + ), + // Text field for the location. + TextFormField( + key: const Key('create_event_form_tff2'), + textInputAction: TextInputAction.next, + keyboardType: TextInputType.streetAddress, + controller: model.eventLocationTextController, + focusNode: model.locationFocus, + validator: (value) => + Validator.validateEventForm(value!, 'Location'), + decoration: InputDecoration( + hintText: 'Where is the event?', + labelText: 'Add Location', + labelStyle: Theme.of(context).textTheme.titleMedium, + border: InputBorder.none, + focusedBorder: InputBorder.none, + enabledBorder: InputBorder.none, + suffix: GestureDetector( + key: const Key('gesture_cef_test'), + onTap: () => navigationService.pushScreen( + Routes.mapScreen, + arguments: { + 'model': model, + // initalize the map screen with a marker at this location + 'latitude': 37.42796133580664, + 'longitude': -122.085749655962, + }, + ), + child: Text( + AppLocalizations.of(context)! + .strictTranslate('Choose on map'), + style: Theme.of(context) + .textTheme + .bodySmall! + .copyWith(fontSize: 16), + ), + ), + 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, + ), + // Text field for event description. + TextFormField( + key: const Key('create_event_form_tff3'), + keyboardType: TextInputType.multiline, + controller: model.eventDescriptionTextController, + focusNode: model.descriptionFocus, + validator: (value) => + Validator.validateEventForm(value!, 'Description'), + maxLines: 10, + minLines: 1, + decoration: InputDecoration( + hintText: 'Describe the event', + labelText: 'Add Description', + labelStyle: Theme.of(context).textTheme.titleMedium, + 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/talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm/model.md b/talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm/model.md new file mode 100644 index 000000000..bbf439e81 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_create_event_form/CreateEventForm/model.md @@ -0,0 +1,32 @@ + + + +# model property + + + + + + + +[CreateEventViewModel](../../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md) model + +_final_ + + + + + + +## Implementation + +```dart +final CreateEventViewModel model; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_create_event_form/views_after_auth_screens_events_create_event_form-library.md b/talawa-mobile-docs/views_after_auth_screens_events_create_event_form/views_after_auth_screens_events_create_event_form-library.md new file mode 100644 index 000000000..b2576e320 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_create_event_form/views_after_auth_screens_events_create_event_form-library.md @@ -0,0 +1,39 @@ + + + + +# create_event_form library + + + + + + + + + + + +## Classes + +##### [CreateEventForm](../views_after_auth_screens_events_create_event_form/CreateEventForm-class.md) + + + +CreateEventForm returns a widget of a Form for creating events in the organization. +This widget is used in CreateEventPage widget. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_create_event_page/CreateEventPage-class.md b/talawa-mobile-docs/views_after_auth_screens_events_create_event_page/CreateEventPage-class.md new file mode 100644 index 000000000..eae27c46b --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_create_event_page/CreateEventPage-class.md @@ -0,0 +1,189 @@ + + + +# CreateEventPage class + + + + + + + + + +

CreateEventPage returns a widget that has mutable state _CreateEventPageState.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- CreateEventPage + + + + + + + + +## Constructors + +[CreateEventPage](../views_after_auth_screens_events_create_event_page/CreateEventPage/CreateEventPage.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_after_auth_screens_events_create_event_page/CreateEventPage/createState.md)() _CreateEventPageState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_create_event_page/CreateEventPage/CreateEventPage.md b/talawa-mobile-docs/views_after_auth_screens_events_create_event_page/CreateEventPage/CreateEventPage.md new file mode 100644 index 000000000..3692c4ee9 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_create_event_page/CreateEventPage/CreateEventPage.md @@ -0,0 +1,29 @@ + + + +# CreateEventPage constructor + + + + + + +const +CreateEventPage({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const CreateEventPage({Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_create_event_page/CreateEventPage/createState.md b/talawa-mobile-docs/views_after_auth_screens_events_create_event_page/CreateEventPage/createState.md new file mode 100644 index 000000000..2b79419a3 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_create_event_page/CreateEventPage/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_CreateEventPageState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_CreateEventPageState createState() => _CreateEventPageState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_create_event_page/views_after_auth_screens_events_create_event_page-library.md b/talawa-mobile-docs/views_after_auth_screens_events_create_event_page/views_after_auth_screens_events_create_event_page-library.md new file mode 100644 index 000000000..19a719544 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_create_event_page/views_after_auth_screens_events_create_event_page-library.md @@ -0,0 +1,38 @@ + + + + +# create_event_page library + + + + + + + + + + + +## Classes + +##### [CreateEventPage](../views_after_auth_screens_events_create_event_page/CreateEventPage-class.md) + + + +CreateEventPage returns a widget that has mutable state _CreateEventPageState. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage-class.md b/talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage-class.md new file mode 100644 index 000000000..612885d7f --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage-class.md @@ -0,0 +1,198 @@ + + + +# EditEventPage class + + + + + + + + + +

EditEventPage returns a widget that has mutable state _EditEventPageState.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- EditEventPage + + + + + + + + +## Constructors + +[EditEventPage](../views_after_auth_screens_events_edit_event_page/EditEventPage/EditEventPage.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [Event](../models_events_event_model/Event-class.md) event}) + + _const_ + + +## Properties + +##### [event](../views_after_auth_screens_events_edit_event_page/EditEventPage/event.md) → [Event](../models_events_event_model/Event-class.md) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_after_auth_screens_events_edit_event_page/EditEventPage/createState.md)() _EditEventPageState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage/EditEventPage.md b/talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage/EditEventPage.md new file mode 100644 index 000000000..101f34c3d --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage/EditEventPage.md @@ -0,0 +1,29 @@ + + + +# EditEventPage constructor + + + + + + +const +EditEventPage({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [Event](../../models_events_event_model/Event-class.md) event}) + + + + + +## Implementation + +```dart +const EditEventPage({Key? key, required this.event}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage/createState.md b/talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage/createState.md new file mode 100644 index 000000000..f095ce13c --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_EditEventPageState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_EditEventPageState createState() => _EditEventPageState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage/event.md b/talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage/event.md new file mode 100644 index 000000000..9714bc41a --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/EditEventPage/event.md @@ -0,0 +1,32 @@ + + + +# event property + + + + + + + +[Event](../../models_events_event_model/Event-class.md) event + +_final_ + + + + + + +## Implementation + +```dart +final Event event; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/views_after_auth_screens_events_edit_event_page-library.md b/talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/views_after_auth_screens_events_edit_event_page-library.md new file mode 100644 index 000000000..03f6aafa3 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_edit_event_page/views_after_auth_screens_events_edit_event_page-library.md @@ -0,0 +1,38 @@ + + + + +# edit_event_page library + + + + + + + + + + + +## Classes + +##### [EditEventPage](../views_after_auth_screens_events_edit_event_page/EditEventPage-class.md) + + + +EditEventPage returns a widget that has mutable state _EditEventPageState. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm-class.md b/talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm-class.md new file mode 100644 index 000000000..4b944f021 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm-class.md @@ -0,0 +1,199 @@ + + + +# EditEventForm class + + + + + + + + + +

EditEventForm returns a widget of a Form for editing an event. +This widget is used in EditEventPage widget.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- EditEventForm + + + + + + + + +## Constructors + +[EditEventForm](../views_after_auth_screens_events_edit_events_form/EditEventForm/EditEventForm.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [EditEventViewModel](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md) model}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [model](../views_after_auth_screens_events_edit_events_form/EditEventForm/model.md) → [EditEventViewModel](../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_events_edit_events_form/EditEventForm/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm/EditEventForm.md b/talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm/EditEventForm.md new file mode 100644 index 000000000..355dbe36f --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm/EditEventForm.md @@ -0,0 +1,29 @@ + + + +# EditEventForm constructor + + + + + + +const +EditEventForm({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [EditEventViewModel](../../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md) model}) + + + + + +## Implementation + +```dart +const EditEventForm({Key? key, required this.model}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm/build.md b/talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm/build.md new file mode 100644 index 000000000..586d7aeea --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm/build.md @@ -0,0 +1,188 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + // Form class is a container for grouping together multiple form field widgets. + return Form( + key: model.formKey, + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // Text field for event title. + TextFormField( + textInputAction: TextInputAction.next, + controller: model.eventTitleTextController, + keyboardType: TextInputType.name, + maxLength: 20, + focusNode: model.titleFocus, + validator: (value) => Validator.validateEventForm(value!, 'Title'), + decoration: InputDecoration( + labelText: 'Add Event Title', + isDense: true, + labelStyle: Theme.of(context).textTheme.titleMedium, + 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, + ), + ), + suffixIcon: IconButton( + onPressed: () { + FocusScope.of(context).requestFocus(model.titleFocus); + }, + icon: const Icon(Icons.edit), + ), + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + // Text field for the location. + TextFormField( + textInputAction: TextInputAction.next, + keyboardType: TextInputType.streetAddress, + controller: model.eventLocationTextController, + focusNode: model.locationFocus, + validator: (value) => + Validator.validateEventForm(value!, 'Location'), + decoration: InputDecoration( + hintText: 'Where is the event?', + labelText: 'Add Location', + labelStyle: Theme.of(context).textTheme.titleMedium, + 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, + ), + ), + suffixIcon: IconButton( + onPressed: () { + FocusScope.of(context).requestFocus(model.locationFocus); + }, + icon: const Icon(Icons.edit), + ), + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + // Text field for event description. + TextFormField( + keyboardType: TextInputType.multiline, + controller: model.eventDescriptionTextController, + focusNode: model.descriptionFocus, + validator: (value) => + Validator.validateEventForm(value!, 'Description'), + maxLines: 10, + minLines: 1, + decoration: InputDecoration( + hintText: 'Describe the event', + labelText: 'Add Description', + labelStyle: Theme.of(context).textTheme.titleMedium, + 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, + ), + ), + suffixIcon: IconButton( + onPressed: () { + FocusScope.of(context).requestFocus(model.descriptionFocus); + }, + icon: const Icon(Icons.edit), + ), + ), + ), + ], + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm/model.md b/talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm/model.md new file mode 100644 index 000000000..9cf984beb --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/EditEventForm/model.md @@ -0,0 +1,32 @@ + + + +# model property + + + + + + + +[EditEventViewModel](../../view_model_after_auth_view_models_event_view_models_edit_event_view_model/EditEventViewModel-class.md) model + +_final_ + + + + + + +## Implementation + +```dart +final EditEventViewModel model; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/views_after_auth_screens_events_edit_events_form-library.md b/talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/views_after_auth_screens_events_edit_events_form-library.md new file mode 100644 index 000000000..a2c383396 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_edit_events_form/views_after_auth_screens_events_edit_events_form-library.md @@ -0,0 +1,39 @@ + + + + +# edit_events_form library + + + + + + + + + + + +## Classes + +##### [EditEventForm](../views_after_auth_screens_events_edit_events_form/EditEventForm-class.md) + + + +EditEventForm returns a widget of a Form for editing an event. +This widget is used in EditEventPage widget. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar-class.md b/talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar-class.md new file mode 100644 index 000000000..5d56cb4be --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar-class.md @@ -0,0 +1,198 @@ + + + +# EventCalendar class + + + + + + + + + +

EventCalendar returns a widget that has mutable state _EventCalendarState.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- EventCalendar + + + + + + + + +## Constructors + +[EventCalendar](../views_after_auth_screens_events_event_calendar/EventCalendar/EventCalendar.md) ([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Event](../models_events_event_model/Event-class.md)> eventList, {[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [eventList](../views_after_auth_screens_events_event_calendar/EventCalendar/eventList.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Event](../models_events_event_model/Event-class.md)> + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_after_auth_screens_events_event_calendar/EventCalendar/createState.md)() [State](https://api.flutter.dev/flutter/widgets/State-class.html)<[EventCalendar](../views_after_auth_screens_events_event_calendar/EventCalendar-class.md)> + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar/EventCalendar.md b/talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar/EventCalendar.md new file mode 100644 index 000000000..65f8fdce0 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar/EventCalendar.md @@ -0,0 +1,29 @@ + + + +# EventCalendar constructor + + + + + + +const +EventCalendar([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Event](../../models_events_event_model/Event-class.md)> eventList, {[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const EventCalendar(this.eventList, {Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar/createState.md b/talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar/createState.md new file mode 100644 index 000000000..f0a5f419f --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[EventCalendar](../../views_after_auth_screens_events_event_calendar/EventCalendar-class.md)> createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +State createState() => _EventCalendarState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar/eventList.md b/talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar/eventList.md new file mode 100644 index 000000000..9fb10e4c0 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_event_calendar/EventCalendar/eventList.md @@ -0,0 +1,32 @@ + + + +# eventList property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Event](../../models_events_event_model/Event-class.md)> eventList + +_final_ + + + + + + +## Implementation + +```dart +final List eventList; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_event_calendar/views_after_auth_screens_events_event_calendar-library.md b/talawa-mobile-docs/views_after_auth_screens_events_event_calendar/views_after_auth_screens_events_event_calendar-library.md new file mode 100644 index 000000000..d2022d1c0 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_event_calendar/views_after_auth_screens_events_event_calendar-library.md @@ -0,0 +1,38 @@ + + + + +# event_calendar library + + + + + + + + + + + +## Classes + +##### [EventCalendar](../views_after_auth_screens_events_event_calendar/EventCalendar-class.md) + + + +EventCalendar returns a widget that has mutable state _EventCalendarState. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_event_info_body/EventInfoBody-class.md b/talawa-mobile-docs/views_after_auth_screens_events_event_info_body/EventInfoBody-class.md new file mode 100644 index 000000000..17d306b07 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_event_info_body/EventInfoBody-class.md @@ -0,0 +1,189 @@ + + + +# EventInfoBody class + + + + + + + + + +

EventInfoBody returns a stateless widget which describes the body of a particular event.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- EventInfoBody + + + + + + + + +## Constructors + +[EventInfoBody](../views_after_auth_screens_events_event_info_body/EventInfoBody/EventInfoBody.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_events_event_info_body/EventInfoBody/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_event_info_body/EventInfoBody/EventInfoBody.md b/talawa-mobile-docs/views_after_auth_screens_events_event_info_body/EventInfoBody/EventInfoBody.md new file mode 100644 index 000000000..f2834782c --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_event_info_body/EventInfoBody/EventInfoBody.md @@ -0,0 +1,29 @@ + + + +# EventInfoBody constructor + + + + + + +const +EventInfoBody({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const EventInfoBody({Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_event_info_body/EventInfoBody/build.md b/talawa-mobile-docs/views_after_auth_screens_events_event_info_body/EventInfoBody/build.md new file mode 100644 index 000000000..5800dc423 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_event_info_body/EventInfoBody/build.md @@ -0,0 +1,332 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + // fetching the event data from model + final model = Provider.of(context); + final event = model.event; + // Slivers are special-purpose widgets that can be combined using a + //CustomScrollView to create custom scroll effects. A SliverToBoxAdapter + //is a basic sliver that creates a bridge back to one of the usual box-based widgets. + return SliverToBoxAdapter( + child: Padding( + padding: const EdgeInsets.all(10), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Stack( + children: [ + Container( + padding: EdgeInsets.only( + right: SizeConfig.safeBlockHorizontal! * 15, + ), + child: Row( + children: [ + Flexible( + child: Text( + // event title + event.title!, + style: Theme.of(context) + .textTheme + .headlineMedium! + .copyWith(fontSize: 26), + ), + ), + ], + ), + ), + Positioned( + right: SizeConfig.screenWidth! * 0.002, + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + (model.event.creator!.id == userConfig.currentUser.id) + ? IconButton( + onPressed: () => navigationService.pushScreen( + "/editEventPage", + arguments: model.event, + ), + icon: const Icon(Icons.edit), + ) + : Container(), + const Icon(Icons.chat_bubble_outline), + ], + ), + ), + ], + ), + Text( + // Display event creator full name. + "${AppLocalizations.of(context)!.strictTranslate("Created by")}: ${event.creator!.firstName} ${event.creator!.lastName}", + style: Theme.of(context) + .textTheme + .bodyMedium! + .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( + // Display start and end date of the Event. + "${event.startDate!} - ${event.endDate!}", + style: Theme.of(context).textTheme.bodySmall, + ), + const Spacer(), + // If event type is public then renders lock_open icon else renders lock icon. + event.isPublic! + ? Icon( + Icons.lock_open, + size: 13, + color: Theme.of(context).colorScheme.secondary, + ) + : Icon( + Icons.lock, + size: 13, + color: Theme.of(context).colorScheme.primary, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.027, + ), + // If event type is public then renders 'public' + // else renders 'private' text translated into the app language. + event.isPublic! + ? Text( + AppLocalizations.of(context)!.strictTranslate('public'), + style: Theme.of(context).textTheme.bodySmall, + ) + : Text( + AppLocalizations.of(context)! + .strictTranslate('private'), + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.011, + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + // display schedule icon with the start and end date of the time. + const Icon( + Icons.schedule, + size: 12, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.025, + ), + Text( + "${event.startTime!} - ${event.endTime!}", + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.011, + ), + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const Icon( + Icons.place, + size: 12, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.027, + ), + Text( + event.location!, + style: Theme.of(context).textTheme.bodySmall, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + maxLines: 3, + ), + const Spacer(), + // If the event location is not null then display the location + //on the map with the reference of latitude and longitude provided for the event. + if (event.latitude != null && event.longitude != null) + GestureDetector( + onTap: () => navigationService.pushScreen( + Routes.mapScreen, + arguments: { + "latitude": event.latitude, + "longitude": event.longitude, + }, + ), + child: Text( + 'View on map', + style: Theme.of(context).textTheme.bodySmall!.copyWith( + color: Theme.of(context).colorScheme.secondary, + ), + 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 + .headlineSmall! + .copyWith(fontSize: 16), + ), + SizedBox(width: SizeConfig.screenWidth! * 0.013), + Text( + // Display the Description of the event if not null. + event.description!, + style: Theme.of(context).textTheme.bodySmall, + ), + SizedBox(height: SizeConfig.screenHeight! * 0.013), + Text( + AppLocalizations.of(context)!.strictTranslate("Admins"), + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith(fontSize: 16), + ), + Divider( + color: Theme.of(context).colorScheme.onBackground, + thickness: 2, + ), + ListView.builder( + padding: EdgeInsets.zero, + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: event.admins!.length, + itemBuilder: (BuildContext context, int index) { + return CustomListTile( + key: Key( + '${AppLocalizations.of(context)!.strictTranslate("Admins")}$index', + ), + index: index, + type: TileType.user, + userInfo: event.admins![index], + onTapUserInfo: () {}, + ); + }, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.013, + ), + Text( + AppLocalizations.of(context)!.strictTranslate("Attendees"), + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith(fontSize: 16), + ), + Divider( + color: Theme.of(context).colorScheme.onBackground, + thickness: 2, + ), + if (model.isBusy) + // if the model is still fetching the attendees details then display Circular Progress Indicator Icon. + const Padding( + padding: EdgeInsets.only(top: 12.0), + child: Center(child: CircularProgressIndicator()), + ) + else + // else if the model fetched the attendees details successfully + //then renders all the attendees in ListView. + ListView.builder( + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: model.registrants.length, + itemBuilder: (BuildContext context, int index) { + return CustomListTile( + key: Key( + '${AppLocalizations.of(context)!.strictTranslate("Attendee")}$index', + ), + index: index, + type: TileType.user, + userInfo: model.registrants[index], + onTapUserInfo: () {}, + ); + }, + ) + ], + ), + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_event_info_body/views_after_auth_screens_events_event_info_body-library.md b/talawa-mobile-docs/views_after_auth_screens_events_event_info_body/views_after_auth_screens_events_event_info_body-library.md new file mode 100644 index 000000000..2035b82bd --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_event_info_body/views_after_auth_screens_events_event_info_body-library.md @@ -0,0 +1,38 @@ + + + + +# event_info_body library + + + + + + + + + + + +## Classes + +##### [EventInfoBody](../views_after_auth_screens_events_event_info_body/EventInfoBody-class.md) + + + +EventInfoBody returns a stateless widget which describes the body of a particular event. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage-class.md b/talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage-class.md new file mode 100644 index 000000000..10ec2c8e7 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage-class.md @@ -0,0 +1,198 @@ + + + +# EventInfoPage class + + + + + + + + + +

EventInfoPage returns a widget that has mutable state _EventInfoPageState.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- EventInfoPage + + + + + + + + +## Constructors + +[EventInfoPage](../views_after_auth_screens_events_event_info_page/EventInfoPage/EventInfoPage.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> args}) + + _const_ + + +## Properties + +##### [args](../views_after_auth_screens_events_event_info_page/EventInfoPage/args.md) → [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_after_auth_screens_events_event_info_page/EventInfoPage/createState.md)() _EventInfoPageState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage/EventInfoPage.md b/talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage/EventInfoPage.md new file mode 100644 index 000000000..f56297666 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage/EventInfoPage.md @@ -0,0 +1,29 @@ + + + +# EventInfoPage constructor + + + + + + +const +EventInfoPage({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> args}) + + + + + +## Implementation + +```dart +const EventInfoPage({Key? key, required this.args}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage/args.md b/talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage/args.md new file mode 100644 index 000000000..bc15ede0a --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage/args.md @@ -0,0 +1,32 @@ + + + +# args property + + + + + + + +[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic> args + +_final_ + + + + + + +## Implementation + +```dart +final Map args; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage/createState.md b/talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage/createState.md new file mode 100644 index 000000000..40792cb7f --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_event_info_page/EventInfoPage/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_EventInfoPageState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_EventInfoPageState createState() => _EventInfoPageState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_event_info_page/views_after_auth_screens_events_event_info_page-library.md b/talawa-mobile-docs/views_after_auth_screens_events_event_info_page/views_after_auth_screens_events_event_info_page-library.md new file mode 100644 index 000000000..143f14484 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_event_info_page/views_after_auth_screens_events_event_info_page-library.md @@ -0,0 +1,38 @@ + + + + +# event_info_page library + + + + + + + + + + + +## Classes + +##### [EventInfoPage](../views_after_auth_screens_events_event_info_page/EventInfoPage-class.md) + + + +EventInfoPage returns a widget that has mutable state _EventInfoPageState. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog-class.md b/talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog-class.md new file mode 100644 index 000000000..fd5c8bca4 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog-class.md @@ -0,0 +1,189 @@ + + + +# ExploreEventDialog class + + + + + + + + + +

ExploreEventDialog returns a widget that has mutable state _ExploreEventDialogState.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- ExploreEventDialog + + + + + + + + +## Constructors + +[ExploreEventDialog](../views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog/ExploreEventDialog.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog/createState.md)() _ExploreEventDialogState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog/ExploreEventDialog.md b/talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog/ExploreEventDialog.md new file mode 100644 index 000000000..a932b4294 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog/ExploreEventDialog.md @@ -0,0 +1,29 @@ + + + +# ExploreEventDialog constructor + + + + + + +const +ExploreEventDialog({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key}) + + + + + +## Implementation + +```dart +const ExploreEventDialog({required Key key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog/createState.md b/talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog/createState.md new file mode 100644 index 000000000..f864e77ec --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_ExploreEventDialogState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_ExploreEventDialogState createState() => _ExploreEventDialogState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/views_after_auth_screens_events_explore_event_dialogue-library.md b/talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/views_after_auth_screens_events_explore_event_dialogue-library.md new file mode 100644 index 000000000..d97223d2e --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_explore_event_dialogue/views_after_auth_screens_events_explore_event_dialogue-library.md @@ -0,0 +1,38 @@ + + + + +# explore_event_dialogue library + + + + + + + + + + + +## Classes + +##### [ExploreEventDialog](../views_after_auth_screens_events_explore_event_dialogue/ExploreEventDialog-class.md) + + + +ExploreEventDialog returns a widget that has mutable state _ExploreEventDialogState. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents-class.md b/talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents-class.md new file mode 100644 index 000000000..31f1fd129 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents-class.md @@ -0,0 +1,207 @@ + + + +# ExploreEvents class + + + + + + + + + +

Shows the list of events with options to categorize them.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- ExploreEvents + + + + + + + + +## Constructors + +[ExploreEvents](../views_after_auth_screens_events_explore_events/ExploreEvents/ExploreEvents.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, [MainScreenViewModel](../view_model_main_screen_view_model/MainScreenViewModel-class.md)? homeModel}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [homeModel](../views_after_auth_screens_events_explore_events/ExploreEvents/homeModel.md) → [MainScreenViewModel](../view_model_main_screen_view_model/MainScreenViewModel-class.md)? + + + +homeModal is a type of MainScreenViewModel which provides methods to handle the data for this component. +_final_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_events_explore_events/ExploreEvents/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [dropDownList](../views_after_auth_screens_events_explore_events/ExploreEvents/dropDownList.md)([ExploreEventsViewModel](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md) model, [BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Shows a list of dropdown taken from model and context. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/ExploreEvents.md b/talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/ExploreEvents.md new file mode 100644 index 000000000..8329f47a9 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/ExploreEvents.md @@ -0,0 +1,32 @@ + + + +# ExploreEvents constructor + + + + + + +const +ExploreEvents({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, [MainScreenViewModel](../../view_model_main_screen_view_model/MainScreenViewModel-class.md)? homeModel}) + + + + + +## Implementation + +```dart +const ExploreEvents({ + required Key key, + this.homeModel, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/build.md b/talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/build.md new file mode 100644 index 000000000..fc8416b51 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/build.md @@ -0,0 +1,291 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(), + builder: (context, model, child) { + return Scaffold( + appBar: AppBar( + // AppBar returns widget for the header. + backgroundColor: Theme.of(context).primaryColor, + key: const Key("ExploreEventsAppBar"), + elevation: 0.0, + automaticallyImplyLeading: false, + centerTitle: true, + title: Text( + AppLocalizations.of(context)!.strictTranslate('Explore Events'), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + leading: IconButton( + // returns a button of menu icon to redirect to home. + color: Theme.of(context).iconTheme.color, + icon: const Icon(Icons.menu), + onPressed: () => + MainScreenViewModel.scaffoldKey.currentState!.openDrawer(), + ), + actions: [ + Padding( + padding: EdgeInsets.only( + right: SizeConfig.screenWidth! * 0.027, + ), + // if the events is not empty then renders button for searching the events else renders just a box. + child: model.events.isNotEmpty + ? IconButton( + onPressed: () { + showSearch( + context: context, + delegate: EventSearch( + eventList: model.events, + exploreEventsViewModel: model, + ), + ); + }, + icon: const Icon(Icons.search, size: 20), + ) + : const SizedBox(), + ) + ], + ), + // if the model is still fetching the events list then renders the Circular Progress Indicator + // else render refresh icon along with the list of searched events for exploration. + body: model.isBusy + ? const Center(child: CircularProgressIndicator()) + : RefreshIndicator( + onRefresh: () async => model.refreshEvents(), + child: Stack( + children: [ + SingleChildScrollView( + physics: const AlwaysScrollableScrollPhysics(), + child: Padding( + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.screenWidth! * 0.010, + ), + child: Column( + children: [ + Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Expanded( + flex: 3, + child: Card( + color: Theme.of(context) + .colorScheme + .onPrimary, + elevation: 2, + child: Container( + padding: const EdgeInsets.symmetric( + horizontal: 20, + ), + //width: SizeConfig.screenWidth! * 0.45, + child: DropdownButtonHideUnderline( + child: dropDownList(model, context), + ), + ), + ), + ), + Expanded( + flex: 2, + child: GestureDetector( + onTap: () { + showDialog( + // on tap open the Explore Event Dialog. + context: context, + builder: (_) { + return const ExploreEventDialog( + key: Key('ExploreEvents'), + ); + }, + ); + }, + child: Card( + key: homeModel?.keySEDateFilter, + color: Theme.of(context) + .colorScheme + .onPrimary, + child: Container( + padding: const EdgeInsets.symmetric( + vertical: 12, + ), + // width: SizeConfig.screenWidth! * 0.30, + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceEvenly, + children: [ + const Icon( + Icons.calendar_today, + color: Color(0xff524F4F), + ), + const SizedBox( + width: 8, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate( + "Add Date", + ), + ), + ], + ), + ), + ), + ), + ), + Expanded( + flex: 1, + child: Card( + color: Theme.of(context) + .colorScheme + .onPrimary, + child: IconButton( + onPressed: () { + navigationService.pushScreen( + Routes.calendar, + arguments: model.events, + ); + }, + icon: const Icon( + Icons.calendar_month, + ), + ), + ), + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.027, + ), + // if the events model is empty then renders a box with text as "Empty List" + // else renders lists of the all event tile. + model.events.isEmpty + ? SizedBox( + height: SizeConfig.screenHeight! * 0.5, + child: Center( + child: Text(model.emptyListMessage), + ), + ) + : ListView.builder( + physics: + const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: model.events.length, + itemBuilder: + (BuildContext context, int index) { + return GestureDetector( + onTap: () { + navigationService.pushScreen( + "/eventInfo", + arguments: { + "event": model.events[index], + "exploreEventViewModel": model + }, + ); + }, + child: EventCard( + event: model.events[index], + isSearchItem: false, + ), + ); + }, + ), + ], + ), + ), + ), + ], + ), + ), + floatingActionButton: FloatingActionButton.extended( + key: homeModel?.keySEAdd, + heroTag: "AddEventFab", + backgroundColor: Theme.of(context).colorScheme.background, + onPressed: () { + navigationService.pushScreen( + "/createEventPage", + ); + }, + icon: Icon( + Icons.add, + color: Theme.of(context).colorScheme.secondary, + ), + label: Text( + AppLocalizations.of(context)!.strictTranslate("Event"), + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith(color: Theme.of(context).colorScheme.secondary), + ), + ), + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/dropDownList.md b/talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/dropDownList.md new file mode 100644 index 000000000..ab1c95642 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/dropDownList.md @@ -0,0 +1,71 @@ + + + +# dropDownList method + + + + + + + + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) dropDownList +([ExploreEventsViewModel](../../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md) model, [BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + + + + + +

Shows a list of dropdown taken from model and context.

+

params:

+
    +
  • model: contains the events data
  • +
  • context: the overall context of UI
  • +
+

returns:

+
    +
  • Widget: the dropdown
  • +
+ + + +## Implementation + +```dart +Widget dropDownList(ExploreEventsViewModel model, BuildContext context) { + return DropdownButton( + key: homeModel?.keySECategoryMenu, + value: model.chosenValue, + isExpanded: true, + items: [ + 'All Events', + 'Created Events', + 'Registered Events', + 'Public Events', + 'Private Events', + ].map>((String value) { + return DropdownMenuItem( + value: value, + child: Text( + AppLocalizations.of(context)!.strictTranslate(value), + style: Theme.of(context) + .textTheme + .titleLarge! + .copyWith(color: Theme.of(context).colorScheme.secondary), + ), + ); + }).toList(), + onChanged: (value) { + model.choseValueFromDropdown(value!); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/homeModel.md b/talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/homeModel.md new file mode 100644 index 000000000..57574b782 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_explore_events/ExploreEvents/homeModel.md @@ -0,0 +1,33 @@ + + + +# homeModel property + + + + + + + +[MainScreenViewModel](../../view_model_main_screen_view_model/MainScreenViewModel-class.md)? homeModel + +_final_ + + + +

homeModal is a type of MainScreenViewModel which provides methods to handle the data for this component.

+ + + +## Implementation + +```dart +final MainScreenViewModel? homeModel; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_events_explore_events/views_after_auth_screens_events_explore_events-library.md b/talawa-mobile-docs/views_after_auth_screens_events_explore_events/views_after_auth_screens_events_explore_events-library.md new file mode 100644 index 000000000..0e0ef06ba --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_events_explore_events/views_after_auth_screens_events_explore_events-library.md @@ -0,0 +1,38 @@ + + + + +# explore_events library + + + + + + + + + + + +## Classes + +##### [ExploreEvents](../views_after_auth_screens_events_explore_events/ExploreEvents-class.md) + + + +Shows the list of events with options to categorize them. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate-class.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate-class.md new file mode 100644 index 000000000..fb53308d8 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate-class.md @@ -0,0 +1,198 @@ + + + +# CommentTemplate class + + + + + + + + + +

CommentTemplate returns a widget of the individual user commented on the post.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- CommentTemplate + + + + + + + + +## Constructors + +[CommentTemplate](../views_after_auth_screens_feed_individual_post/CommentTemplate/CommentTemplate.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [Comment](../models_comment_comment_model/Comment-class.md) comment}) + + _const_ + + +## Properties + +##### [comment](../views_after_auth_screens_feed_individual_post/CommentTemplate/comment.md) → [Comment](../models_comment_comment_model/Comment-class.md) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_feed_individual_post/CommentTemplate/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate/CommentTemplate.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate/CommentTemplate.md new file mode 100644 index 000000000..03d248913 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate/CommentTemplate.md @@ -0,0 +1,32 @@ + + + +# CommentTemplate constructor + + + + + + +const +CommentTemplate({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [Comment](../../models_comment_comment_model/Comment-class.md) comment}) + + + + + +## Implementation + +```dart +const CommentTemplate({ + Key? key, + required this.comment, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate/build.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate/build.md new file mode 100644 index 000000000..06c25c934 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate/build.md @@ -0,0 +1,105 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@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.bodyMedium, + ), + ), + Text( + comment.text!, + style: Theme.of(context) + .textTheme + .bodyLarge! + .copyWith(fontSize: 16.0), + ), + ], + ), + ), + ) + ], + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate/comment.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate/comment.md new file mode 100644 index 000000000..c6fe7ea8c --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/CommentTemplate/comment.md @@ -0,0 +1,32 @@ + + + +# comment property + + + + + + + +[Comment](../../models_comment_comment_model/Comment-class.md) comment + +_final_ + + + + + + +## Implementation + +```dart +final Comment comment; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection-class.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection-class.md new file mode 100644 index 000000000..9a1ff325d --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection-class.md @@ -0,0 +1,198 @@ + + + +# IndividualPageLikeSection class + + + + + + + + + +

IndividualPageLikeSection returns a widget that show the list of all the users liked the post.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- IndividualPageLikeSection + + + + + + + + +## Constructors + +[IndividualPageLikeSection](../views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/IndividualPageLikeSection.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[LikedBy](../models_post_post_model/LikedBy-class.md)> usersLiked}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [usersLiked](../views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/usersLiked.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[LikedBy](../models_post_post_model/LikedBy-class.md)> + + + + +_final_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/IndividualPageLikeSection.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/IndividualPageLikeSection.md new file mode 100644 index 000000000..277f839a8 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/IndividualPageLikeSection.md @@ -0,0 +1,32 @@ + + + +# IndividualPageLikeSection constructor + + + + + + +const +IndividualPageLikeSection({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[LikedBy](../../models_post_post_model/LikedBy-class.md)> usersLiked}) + + + + + +## Implementation + +```dart +const IndividualPageLikeSection({ + Key? key, + required this.usersLiked, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/build.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/build.md new file mode 100644 index 000000000..3f7bb9e2c --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/build.md @@ -0,0 +1,84 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildPadding(context, "Liked by"), + Row( + children: [ + // Looping through the usersLiked list, + for (int i = 0; i < usersLiked.length; i++) + // renders the custom widget for invidual user. + likedUserCircleAvatar(usersLiked[i]) + ], + ), + ], + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/usersLiked.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/usersLiked.md new file mode 100644 index 000000000..6a93bef90 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPageLikeSection/usersLiked.md @@ -0,0 +1,32 @@ + + + +# usersLiked property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[LikedBy](../../models_post_post_model/LikedBy-class.md)> usersLiked + +_final_ + + + + + + +## Implementation + +```dart +final List usersLiked; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection-class.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection-class.md new file mode 100644 index 000000000..ee38a46c9 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection-class.md @@ -0,0 +1,207 @@ + + + +# IndividualPostCommentSection class + + + + + + + + + +

IndividualPostCommentSection returns a widget that show the list of all the users commented on the post.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- IndividualPostCommentSection + + + + + + + + +## Constructors + +[IndividualPostCommentSection](../views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/IndividualPostCommentSection.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Comments](../models_post_post_model/Comments-class.md)> comments, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) postID}) + + _const_ + + +## Properties + +##### [comments](../views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/comments.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Comments](../models_post_post_model/Comments-class.md)> + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [postID](../views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/postID.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/IndividualPostCommentSection.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/IndividualPostCommentSection.md new file mode 100644 index 000000000..211002b58 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/IndividualPostCommentSection.md @@ -0,0 +1,33 @@ + + + +# IndividualPostCommentSection constructor + + + + + + +const +IndividualPostCommentSection({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Comments](../../models_post_post_model/Comments-class.md)> comments, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) postID}) + + + + + +## Implementation + +```dart +const IndividualPostCommentSection({ + Key? key, + required this.comments, + required this.postID, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/build.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/build.md new file mode 100644 index 000000000..09d6c82d3 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/build.md @@ -0,0 +1,87 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) async { + await model.initialise(postID); + // print(model.commentList.first.creator); + _commentViewModel = model; + }, + builder: (context, model, child) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + buildPadding(context, "Comments"), + // Looping through the commentList list, + for (int i = 0; i < model.commentList.length; i++) + // renders the custom widget for invidual user. + CommentTemplate(comment: model.commentList[i]) + ], + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/comments.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/comments.md new file mode 100644 index 000000000..0276c53d6 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/comments.md @@ -0,0 +1,32 @@ + + + +# comments property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Comments](../../models_post_post_model/Comments-class.md)> comments + +_final_ + + + + + + +## Implementation + +```dart +final List comments; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/postID.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/postID.md new file mode 100644 index 000000000..9e5c5243b --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostCommentSection/postID.md @@ -0,0 +1,32 @@ + + + +# postID property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) postID + +_final_ + + + + + + +## Implementation + +```dart +final String postID; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView-class.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView-class.md new file mode 100644 index 000000000..453fc8cf2 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView-class.md @@ -0,0 +1,198 @@ + + + +# IndividualPostView class + + + + + + + + + +

IndividualPostView returns a widget that has mutable state _IndividualPostViewState.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- IndividualPostView + + + + + + + + +## Constructors + +[IndividualPostView](../views_after_auth_screens_feed_individual_post/IndividualPostView/IndividualPostView.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [Post](../models_post_post_model/Post-class.md) post}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [post](../views_after_auth_screens_feed_individual_post/IndividualPostView/post.md) → [Post](../models_post_post_model/Post-class.md) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_after_auth_screens_feed_individual_post/IndividualPostView/createState.md)() _IndividualPostViewState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView/IndividualPostView.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView/IndividualPostView.md new file mode 100644 index 000000000..46d963572 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView/IndividualPostView.md @@ -0,0 +1,29 @@ + + + +# IndividualPostView constructor + + + + + + +const +IndividualPostView({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [Post](../../models_post_post_model/Post-class.md) post}) + + + + + +## Implementation + +```dart +const IndividualPostView({Key? key, required this.post}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView/createState.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView/createState.md new file mode 100644 index 000000000..dfbb3d183 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_IndividualPostViewState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_IndividualPostViewState createState() => _IndividualPostViewState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView/post.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView/post.md new file mode 100644 index 000000000..e986becbc --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/IndividualPostView/post.md @@ -0,0 +1,32 @@ + + + +# post property + + + + + + + +[Post](../../models_post_post_model/Post-class.md) post + +_final_ + + + + + + +## Implementation + +```dart +final Post post; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/buildPadding.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/buildPadding.md new file mode 100644 index 000000000..a98749bed --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/buildPadding.md @@ -0,0 +1,44 @@ + + + +# buildPadding function + + + + + + + + + + +[Padding](https://api.flutter.dev/flutter/widgets/Padding-class.html) buildPadding +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) text) + + + + + + + + +## Implementation + +```dart +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.titleLarge, + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/likedUserCircleAvatar.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/likedUserCircleAvatar.md new file mode 100644 index 000000000..fb2e6b9a9 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/likedUserCircleAvatar.md @@ -0,0 +1,62 @@ + + + +# likedUserCircleAvatar function + + + + + + + + + + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) likedUserCircleAvatar +([LikedBy](../models_post_post_model/LikedBy-class.md) user) + + + + + +

likedUserCircleAvatar returns a widget of the individual user liked the post.

+ + + +## Implementation + +```dart +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/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/views_after_auth_screens_feed_individual_post-library.md b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/views_after_auth_screens_feed_individual_post-library.md new file mode 100644 index 000000000..1f2f4b615 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_individual_post/views_after_auth_screens_feed_individual_post-library.md @@ -0,0 +1,79 @@ + + + + +# individual_post library + + + + + + + + + + + +## Classes + +##### [CommentTemplate](../views_after_auth_screens_feed_individual_post/CommentTemplate-class.md) + + + +CommentTemplate returns a widget of the individual user commented on the post. + + +##### [IndividualPageLikeSection](../views_after_auth_screens_feed_individual_post/IndividualPageLikeSection-class.md) + + + +IndividualPageLikeSection returns a widget that show the list of all the users liked the post. + + +##### [IndividualPostCommentSection](../views_after_auth_screens_feed_individual_post/IndividualPostCommentSection-class.md) + + + +IndividualPostCommentSection returns a widget that show the list of all the users commented on the post. + + +##### [IndividualPostView](../views_after_auth_screens_feed_individual_post/IndividualPostView-class.md) + + + +IndividualPostView returns a widget that has mutable state _IndividualPostViewState. + + + + + + + +## Functions + +##### [buildPadding](../views_after_auth_screens_feed_individual_post/buildPadding.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) text) [Padding](https://api.flutter.dev/flutter/widgets/Padding-class.html) + + + + + + + + +##### [likedUserCircleAvatar](../views_after_auth_screens_feed_individual_post/likedUserCircleAvatar.md)([LikedBy](../models_post_post_model/LikedBy-class.md) user) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +likedUserCircleAvatar returns a widget of the individual user liked the post. + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed-class.md b/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed-class.md new file mode 100644 index 000000000..8c5de718c --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed-class.md @@ -0,0 +1,207 @@ + + + +# OrganizationFeed class + + + + + + + + + +

OrganizationFeed returns a widget that shows the feed of the organization.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- OrganizationFeed + + + + + + + + +## Constructors + +[OrganizationFeed](../views_after_auth_screens_feed_organization_feed/OrganizationFeed/OrganizationFeed.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, [MainScreenViewModel](../view_model_main_screen_view_model/MainScreenViewModel-class.md)? homeModel, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) forTest = false}) + + _const_ + + +## Properties + +##### [forTest](../views_after_auth_screens_feed_organization_feed/OrganizationFeed/forTest.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [homeModel](../views_after_auth_screens_feed_organization_feed/OrganizationFeed/homeModel.md) → [MainScreenViewModel](../view_model_main_screen_view_model/MainScreenViewModel-class.md)? + + + + +_final_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_feed_organization_feed/OrganizationFeed/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/OrganizationFeed.md b/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/OrganizationFeed.md new file mode 100644 index 000000000..553285ef8 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/OrganizationFeed.md @@ -0,0 +1,33 @@ + + + +# OrganizationFeed constructor + + + + + + +const +OrganizationFeed({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, [MainScreenViewModel](../../view_model_main_screen_view_model/MainScreenViewModel-class.md)? homeModel, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) forTest = false}) + + + + + +## Implementation + +```dart +const OrganizationFeed({ + required Key key, + this.homeModel, + this.forTest = false, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/build.md b/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/build.md new file mode 100644 index 000000000..271b6e9d5 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/build.md @@ -0,0 +1,130 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(isTest: forTest), + builder: (context, model, child) { + return Scaffold( + appBar: AppBar( + // AppBar returns a widget for the header of the page. + backgroundColor: Theme.of(context).primaryColor, + elevation: 0.0, + centerTitle: true, + title: Text( + model.currentOrgName, + key: homeModel?.keySHOrgName, + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + leading: IconButton( + key: homeModel?.keySHMenuIcon, + icon: Icon( + Icons.menu, + color: Theme.of(context).iconTheme.color, + ), + onPressed: () => + MainScreenViewModel.scaffoldKey.currentState!.openDrawer(), + ), + ), + // if the model is fetching the data then renders Circular Progress Indicator else renders the result. + body: model.isBusy + ? const CircularProgressIndicator() + : RefreshIndicator( + onRefresh: () async => model.fetchNewPosts(), + child: ListView( + shrinkWrap: true, + children: [ + // If the organization has pinned posts then renders PinnedPostCarousel widget else Container. + model.pinnedPosts.isNotEmpty + ? PinnedPostCarousel( + key: homeModel?.keySHPinnedPost, + pinnedPosts: model.pinnedPosts, + navigateToPinnedPostPage: + model.navigateToPinnedPostPage, + navigateToIndividualPostPage: + model.navigateToIndividualPage, + ) + : Container(), + // If the organization has posts then renders PostListWidget widget else Container. + model.posts.isNotEmpty + ? PostListWidget( + key: homeModel?.keySHPost, + posts: model.posts, + function: model.navigateToIndividualPage, + ) + : Container(), + ], + ), + ), + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/forTest.md b/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/forTest.md new file mode 100644 index 000000000..6505e3f01 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/forTest.md @@ -0,0 +1,32 @@ + + + +# forTest property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) forTest + +_final_ + + + + + + +## Implementation + +```dart +final bool forTest; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/homeModel.md b/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/homeModel.md new file mode 100644 index 000000000..d7359e061 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/OrganizationFeed/homeModel.md @@ -0,0 +1,32 @@ + + + +# homeModel property + + + + + + + +[MainScreenViewModel](../../view_model_main_screen_view_model/MainScreenViewModel-class.md)? homeModel + +_final_ + + + + + + +## Implementation + +```dart +final MainScreenViewModel? homeModel; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/views_after_auth_screens_feed_organization_feed-library.md b/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/views_after_auth_screens_feed_organization_feed-library.md new file mode 100644 index 000000000..b349ef21b --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_organization_feed/views_after_auth_screens_feed_organization_feed-library.md @@ -0,0 +1,38 @@ + + + + +# organization_feed library + + + + + + + + + + + +## Classes + +##### [OrganizationFeed](../views_after_auth_screens_feed_organization_feed/OrganizationFeed-class.md) + + + +OrganizationFeed returns a widget that shows the feed of the organization. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage-class.md b/talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage-class.md new file mode 100644 index 000000000..03e0b0a90 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage-class.md @@ -0,0 +1,198 @@ + + + +# PinnedPostPage class + + + + + + + + + +

PinnedPostPage returns a widget that shows the list of all the pinned post.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- PinnedPostPage + + + + + + + + +## Constructors + +[PinnedPostPage](../views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/PinnedPostPage.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../models_post_post_model/Post-class.md)> pinnedPosts}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [pinnedPosts](../views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/pinnedPosts.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../models_post_post_model/Post-class.md)> + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/PinnedPostPage.md b/talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/PinnedPostPage.md new file mode 100644 index 000000000..e0f59c0c6 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/PinnedPostPage.md @@ -0,0 +1,29 @@ + + + +# PinnedPostPage constructor + + + + + + +const +PinnedPostPage({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../../models_post_post_model/Post-class.md)> pinnedPosts}) + + + + + +## Implementation + +```dart +const PinnedPostPage({Key? key, required this.pinnedPosts}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/build.md b/talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/build.md new file mode 100644 index 000000000..17efc1768 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/build.md @@ -0,0 +1,87 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + iconTheme: Theme.of(context).iconTheme, + backgroundColor: Theme.of(context).primaryColor, + elevation: 0.0, + title: Text( + AppLocalizations.of(context)!.strictTranslate('Pinned Posts'), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + ), + body: ListView( + children: [PostListWidget(posts: pinnedPosts)], + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/pinnedPosts.md b/talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/pinnedPosts.md new file mode 100644 index 000000000..4071846ea --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/PinnedPostPage/pinnedPosts.md @@ -0,0 +1,32 @@ + + + +# pinnedPosts property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../../models_post_post_model/Post-class.md)> pinnedPosts + +_final_ + + + + + + +## Implementation + +```dart +final List pinnedPosts; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/views_after_auth_screens_feed_pinned_post_page-library.md b/talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/views_after_auth_screens_feed_pinned_post_page-library.md new file mode 100644 index 000000000..b53b74bc3 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_feed_pinned_post_page/views_after_auth_screens_feed_pinned_post_page-library.md @@ -0,0 +1,38 @@ + + + + +# pinned_post_page library + + + + + + + + + + + +## Classes + +##### [PinnedPostPage](../views_after_auth_screens_feed_pinned_post_page/PinnedPostPage-class.md) + + + +PinnedPostPage returns a widget that shows the list of all the pinned post. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest-class.md b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest-class.md new file mode 100644 index 000000000..c490c40bc --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest-class.md @@ -0,0 +1,198 @@ + + + +# SendAccessRequest class + + + + + + + + + +

requestAccess

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- SendAccessRequest + + + + + + + + +## Constructors + +[SendAccessRequest](../views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/SendAccessRequest.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [OrgInfo](../models_organization_org_info/OrgInfo-class.md) org}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [org](../views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/org.md) → [OrgInfo](../models_organization_org_info/OrgInfo-class.md) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/SendAccessRequest.md b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/SendAccessRequest.md new file mode 100644 index 000000000..40408e8de --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/SendAccessRequest.md @@ -0,0 +1,33 @@ + + + +# SendAccessRequest constructor + + + + + + +const +SendAccessRequest({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [OrgInfo](../../models_organization_org_info/OrgInfo-class.md) org}) + + + + + +## Implementation + +```dart +const SendAccessRequest({ + Key? key, + required this.org, + // required this.model +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/build.md b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/build.md new file mode 100644 index 000000000..64d8efdde --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/build.md @@ -0,0 +1,152 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(org), + builder: (context, model, child) { + return SafeArea( + child: Scaffold( + appBar: AppBar( + backgroundColor: Colors.transparent, + ), + resizeToAvoidBottomInset: false, + body: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset('assets/images/Group 8948.png'), + Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + "You need access", + style: AppTheme.title.copyWith(color: AppTheme.white), + ), + const SizedBox( + height: 5, + ), + const Text( + "Request access, or switch to an account with access", + ), + const SizedBox( + height: 20, + ), + Container( + child: TextField( + style: const TextStyle(color: AppTheme.blackPrimary), + minLines: 15, + maxLines: 20, + decoration: InputDecoration( + constraints: const BoxConstraints( + maxWidth: 400, + minWidth: 100, + ), + enabledBorder: UnderlineInputBorder( + borderRadius: BorderRadius.circular(20.0), + borderSide: const BorderSide( + width: 3, + color: Colors.white, + ), + ), + hintText: "Message (optional)", + hintStyle: const TextStyle( + color: AppTheme.blackSecondary, + ), + filled: true, + fillColor: AppTheme.white, + ), + ), + ), + ], + ), + ), + Center( + child: TextButton( + onPressed: () { + model.sendMembershipRequest(); + }, + style: + TextButton.styleFrom(backgroundColor: AppTheme.green), + child: const Text( + "Request Access", + style: TextStyle( + color: AppTheme.white, + ), + ), + ), + ) + ], + ), + ), + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/org.md b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/org.md new file mode 100644 index 000000000..5aa35421b --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest/org.md @@ -0,0 +1,32 @@ + + + +# org property + + + + + + + +[OrgInfo](../../models_organization_org_info/OrgInfo-class.md) org + +_final_ + + + + + + +## Implementation + +```dart +final OrgInfo org; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/views_after_auth_screens_join_org_after_auth_access_request_screen-library.md b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/views_after_auth_screens_join_org_after_auth_access_request_screen-library.md new file mode 100644 index 000000000..b615cea0e --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_access_request_screen/views_after_auth_screens_join_org_after_auth_access_request_screen-library.md @@ -0,0 +1,38 @@ + + + + +# access_request_screen library + + + + + + + + + + + +## Classes + +##### [SendAccessRequest](../views_after_auth_screens_join_org_after_auth_access_request_screen/SendAccessRequest-class.md) + + + +requestAccess + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth-class.md b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth-class.md new file mode 100644 index 000000000..dfd63ddc7 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth-class.md @@ -0,0 +1,207 @@ + + + +# JoinOrganisationAfterAuth class + + + + + + + + + +

JoinOrganisationAfterAuth returns a widget for page to join the organization just after user authentication.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- JoinOrganisationAfterAuth + + + + + + + + +## Constructors + +[JoinOrganisationAfterAuth](../views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/JoinOrganisationAfterAuth.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [orgId](../views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/orgId.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [scanQR](../views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/scanQR.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context, [SelectOrganizationViewModel](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md) model) void + + + +scanQR returns a widget that is use in joining the organization via the QR code. + + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/JoinOrganisationAfterAuth.md b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/JoinOrganisationAfterAuth.md new file mode 100644 index 000000000..1b9db464b --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/JoinOrganisationAfterAuth.md @@ -0,0 +1,30 @@ + + + +# JoinOrganisationAfterAuth constructor + + + + + + +const +JoinOrganisationAfterAuth({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId}) + + + + + +## Implementation + +```dart +const JoinOrganisationAfterAuth({Key? key, required this.orgId}) + : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/build.md b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/build.md new file mode 100644 index 000000000..b5cbaa0c5 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/build.md @@ -0,0 +1,123 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(orgId), + builder: (context, model, child) { + return Scaffold( + key: const Key('JoinOrgScreen'), + // header for the widget + appBar: AppBar( + centerTitle: true, + // title of the header. + title: Text( + AppLocalizations.of(context)! + .strictTranslate('Join Organisation'), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + // action button for the option to join the organization using QR code. + actions: [ + IconButton( + icon: const Icon( + Icons.qr_code_scanner, + size: 30, + semanticLabel: 'Join Organisation with QR', + ), + onPressed: () => scanQR(context, model), + ), + ], + ), + body: Column( + children: [ + const Padding( + padding: EdgeInsets.symmetric(horizontal: 12.0), + child: Divider( + color: Colors.grey, + thickness: 2.0, + ), + ), + Expanded( + // if model searching is under process then renders OrganizationSearchList widget + // else renders OrganizationList widget. + child: model.searching + ? OrganizationSearchList(model: model) + : OrganizationList(model: model), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + ], + ), + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/orgId.md b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/orgId.md new file mode 100644 index 000000000..317117668 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/orgId.md @@ -0,0 +1,32 @@ + + + +# orgId property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) orgId + +_final_ + + + + + + +## Implementation + +```dart +final String orgId; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/scanQR.md b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/scanQR.md new file mode 100644 index 000000000..f660938f2 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth/scanQR.md @@ -0,0 +1,89 @@ + + + +# scanQR method + + + + + + + + +void scanQR +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context, [SelectOrganizationViewModel](../../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md) model) + + + + + +

scanQR returns a widget that is use in joining the organization via the QR code.

+ + + +## Implementation + +```dart +void scanQR(BuildContext context, SelectOrganizationViewModel model) { + showModalBottomSheet( + context: context, + barrierColor: Colors.transparent, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), + builder: (BuildContext context) { + return ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + child: Container( + height: MediaQuery.of(context).size.width, + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.secondary, + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + SizedBox( + height: 250, + width: 250, + child: QRView( + key: model.qrKey, + onQRViewCreated: (controller) => + _onQRViewCreated(controller, model), + overlay: QrScannerOverlayShape( + overlayColor: Theme.of(context).colorScheme.secondary, + borderRadius: 10, + borderLength: 20, + borderWidth: 10, + cutOutSize: 250, + ), + /*overlayMargin: EdgeInsets.all(50)*/ + ), + ), + SizedBox( + height: SizeConfig.safeBlockVertical! * 4, + ), + const Text('Scan QR'), + SizedBox( + height: SizeConfig.safeBlockVertical! * 4, + ) + ], + ), + ), + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth-library.md b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth-library.md new file mode 100644 index 000000000..d7987c80f --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/views_after_auth_screens_join_org_after_auth_join_organisation_after_auth-library.md @@ -0,0 +1,38 @@ + + + + +# join_organisation_after_auth library + + + + + + + + + + + +## Classes + +##### [JoinOrganisationAfterAuth](../views_after_auth_screens_join_org_after_auth_join_organisation_after_auth/JoinOrganisationAfterAuth-class.md) + + + +JoinOrganisationAfterAuth returns a widget for page to join the organization just after user authentication. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/EditProfilePage-class.md b/talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/EditProfilePage-class.md new file mode 100644 index 000000000..62aad1769 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/EditProfilePage-class.md @@ -0,0 +1,189 @@ + + + +# EditProfilePage class + + + + + + + + + +

EditProfilePage returns a widget that has mutable state _EditProfilePageState.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- EditProfilePage + + + + + + + + +## Constructors + +[EditProfilePage](../views_after_auth_screens_profile_edit_profile_page/EditProfilePage/EditProfilePage.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_after_auth_screens_profile_edit_profile_page/EditProfilePage/createState.md)() _EditProfilePageState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/EditProfilePage/EditProfilePage.md b/talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/EditProfilePage/EditProfilePage.md new file mode 100644 index 000000000..54f963a39 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/EditProfilePage/EditProfilePage.md @@ -0,0 +1,29 @@ + + + +# EditProfilePage constructor + + + + + + +const +EditProfilePage({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const EditProfilePage({Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/EditProfilePage/createState.md b/talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/EditProfilePage/createState.md new file mode 100644 index 000000000..cb46e96d3 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/EditProfilePage/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_EditProfilePageState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_EditProfilePageState createState() => _EditProfilePageState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/views_after_auth_screens_profile_edit_profile_page-library.md b/talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/views_after_auth_screens_profile_edit_profile_page-library.md new file mode 100644 index 000000000..84dd71907 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_profile_edit_profile_page/views_after_auth_screens_profile_edit_profile_page-library.md @@ -0,0 +1,38 @@ + + + + +# edit_profile_page library + + + + + + + + + + + +## Classes + +##### [EditProfilePage](../views_after_auth_screens_profile_edit_profile_page/EditProfilePage-class.md) + + + +EditProfilePage returns a widget that has mutable state _EditProfilePageState. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage-class.md b/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage-class.md new file mode 100644 index 000000000..83715717f --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage-class.md @@ -0,0 +1,207 @@ + + + +# ProfilePage class + + + + + + + + + +

ProfilePage returns a widget that renders a page of user's profile.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- ProfilePage + + + + + + + + +## Constructors + +[ProfilePage](../views_after_auth_screens_profile_profile_page/ProfilePage/ProfilePage.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, [MainScreenViewModel](../view_model_main_screen_view_model/MainScreenViewModel-class.md)? homeModel}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [homeModel](../views_after_auth_screens_profile_profile_page/ProfilePage/homeModel.md) → [MainScreenViewModel](../view_model_main_screen_view_model/MainScreenViewModel-class.md)? + + + + +_final_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_profile_profile_page/ProfilePage/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [donate](../views_after_auth_screens_profile_profile_page/ProfilePage/donate.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context, [ProfilePageViewModel](../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md) model) void + + + + + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/ProfilePage.md b/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/ProfilePage.md new file mode 100644 index 000000000..200752360 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/ProfilePage.md @@ -0,0 +1,32 @@ + + + +# ProfilePage constructor + + + + + + +const +ProfilePage({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, [MainScreenViewModel](../../view_model_main_screen_view_model/MainScreenViewModel-class.md)? homeModel}) + + + + + +## Implementation + +```dart +const ProfilePage({ + required Key key, + this.homeModel, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/build.md b/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/build.md new file mode 100644 index 000000000..b4a084ed5 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/build.md @@ -0,0 +1,322 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return Scaffold( + key: model.scaffoldKey, + appBar: AppBar( + backgroundColor: Theme.of(context).primaryColor, + elevation: 0.0, + centerTitle: true, + leading: IconButton( + color: Theme.of(context).iconTheme.color, + icon: const Icon(Icons.menu), + onPressed: () => + MainScreenViewModel.scaffoldKey.currentState!.openDrawer(), + ), + key: const Key("ProfilePageAppBar"), + title: Text( + AppLocalizations.of(context)!.strictTranslate('Profile'), + style: Theme.of(context).textTheme.titleLarge!.copyWith( + fontWeight: FontWeight.w600, + fontSize: 20, + ), + ), + ), + // if data fetching is under process then renders Circular Progress Icon + // else renders the widget. + 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( + // Avatar + icon: CustomAvatar( + isImageNull: model.currentUser.image == null, + firstAlphabet: + model.currentUser.firstName!.substring(0, 1), + imageUrl: model.currentUser.image, + fontSize: Theme.of(context) + .textTheme + .titleLarge! + .fontSize, + ), + // display first and last name. + title: + '${model.currentUser.firstName!} ${model.currentUser.lastName!}', + // display email address + subtitle: model.currentUser.email!, + // button to edit the profile which redirects to edit profile page. + trailingIconButton: IconButton( + icon: Icon( + Icons.drive_file_rename_outline, + color: Theme.of(context).colorScheme.secondary, + ), + onPressed: () { + navigationService.pushScreen("/editProfilePage"); + }, + ), + ), + onTapOption: () {}, + ), + const Divider( + thickness: 1, // thickness of the line + indent: + 20, // empty space to the leading edge of divider. + endIndent: + 20, // empty space to the trailing edge of the divider. + color: Colors + .black26, // The color to use when painting the line. + height: 20, // + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.67, + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + SizedBox( + height: SizeConfig.screenHeight! * 0.01, + ), + CustomListTile( + key: homeModel!.keySPAppSetting, + index: 0, + type: TileType.option, + option: Options( + icon: Icon( + Icons.phonelink_setup, + color: + Theme.of(context).colorScheme.secondary, + size: 30, + ), + // title for App Settings. + title: AppLocalizations.of(context)! + .strictTranslate('App Settings'), + // display language of the app. + subtitle: + '${AppLocalizations.of(context)!.strictTranslate("Language")}, ${AppLocalizations.of(context)!.strictTranslate("dark mode")}, ${AppLocalizations.of(context)!.strictTranslate("font size")}', + ), + // button for the app setting which redirects to app setting page. + onTapOption: () { + navigationService + .pushScreen("/appSettingsPage"); + }, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.05, + ), + CustomListTile( + key: const Key('TasksByUser'), + index: 1, + type: TileType.option, + option: Options( + icon: Icon( + Icons.task_outlined, + color: + Theme.of(context).colorScheme.secondary, + size: 30, + ), + // title for My Tasks tile + title: AppLocalizations.of(context)! + .strictTranslate('My Tasks'), + // display subtitle + subtitle: AppLocalizations.of(context)! + .strictTranslate( + "View and edit all tasks created by you", + ), + ), + // on tag redirects to the user Tasks page. + onTapOption: () { + navigationService.pushScreen(Routes.userTasks); + }, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.05, + ), + // // Will be added later when we add the Help Section in Documentation. + // CustomListTile( + // key: homeModel!.keySPHelp, + // 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: () {}, + // ), + /// `Donation` acts as plugin. If visible is true the it will be always visible. + /// even if it's uninstalled by the admin (for development purposes) + TalawaPluginProvider( + pluginName: "Donation", + visible: true, + child: Column( + children: [ + CustomListTile( + key: homeModel!.keySPDonateUs, + index: 2, + type: TileType.option, + option: Options( + icon: Icon( + Icons.monetization_on, + color: Theme.of(context) + .colorScheme + .secondary, + size: 30, + ), + title: AppLocalizations.of(context)! + .strictTranslate('Donate Us'), + subtitle: AppLocalizations.of(context)! + .strictTranslate( + 'Help us to develop for you', + ), + ), + onTapOption: () => donate(context, model), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.05, + ), + ], + ), + ), + // custom tile for Invitation. + CustomListTile( + key: homeModel!.keySPInvite, + index: 3, + type: TileType.option, + option: Options( + icon: Icon( + Icons.share, + color: + Theme.of(context).colorScheme.secondary, + size: 30, + ), + // title + title: AppLocalizations.of(context)! + .strictTranslate('Invite'), + // subtitle + subtitle: AppLocalizations.of(context)! + .strictTranslate('Invite to org'), + ), + // on tap call the invite function + onTapOption: () => model.invite(context), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.05, + ), + // Custom tile for Logout option. + CustomListTile( + key: homeModel!.keySPLogout, + index: 3, + type: TileType.option, + option: Options( + icon: Icon( + Icons.logout, + color: + Theme.of(context).colorScheme.secondary, + size: 30, + ), + title: AppLocalizations.of(context)! + .strictTranslate('Log out'), + subtitle: AppLocalizations.of(context)! + .strictTranslate('Log out from Talawa'), + ), + // on tap calls the logout function + onTapOption: () => model.logout(context), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.05, + ), + FromPalisadoes(key: homeModel!.keySPPalisadoes), + ], + ), + ) + ], + ), + ), + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/donate.md b/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/donate.md new file mode 100644 index 000000000..32bb9a58e --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/donate.md @@ -0,0 +1,302 @@ + + + +# donate method + + + + + + + + +void donate +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context, [ProfilePageViewModel](../../view_model_after_auth_view_models_profile_view_models_profile_page_view_model/ProfilePageViewModel-class.md) model) + + + + + + + + +## Implementation + +```dart +void donate(BuildContext context, ProfilePageViewModel model) { + showModalBottomSheet( + context: context, + isScrollControlled: true, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), + builder: (BuildContext context) { + return StatefulBuilder( + builder: (context, setState) { + model.attachListener(setState); + return ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + child: SizedBox( + height: model.bottomSheetHeight, + child: Scaffold( + // background color set to Primary + backgroundColor: + Theme.of(context).colorScheme.primaryContainer, + // header + appBar: AppBar( + centerTitle: true, + automaticallyImplyLeading: false, + backgroundColor: Colors.transparent, + elevation: 0.0, + toolbarHeight: SizeConfig.screenHeight! * 0.15, + title: Padding( + padding: const EdgeInsets.only(top: 8.0), + // display title + child: Text( + 'Donating to \n${model.currentOrg.name}', + style: Theme.of(context) + .textTheme + .headlineMedium! + .copyWith(fontSize: 24), + maxLines: 2, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.center, + ), + ), + actions: [ + Padding( + padding: EdgeInsets.only( + right: 8.0, + top: SizeConfig.screenHeight! * 0.01, + ), + child: IconButton( + icon: Icon( + Icons.cancel, + color: Theme.of(context).colorScheme.primary, + ), + onPressed: model.popBottomSheet, + ), + ) + ], + ), + body: SingleChildScrollView( + // SingleChildScrollView is a box in which a single widget can be scrolled. + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + SizedBox( + height: SizeConfig.screenWidth! * 0.05, + ), + Text( + 'Please Select and amount', + style: Theme.of(context).textTheme.headlineSmall, + ), + SizedBox( + height: SizeConfig.screenWidth! * 0.05, + ), + Container( + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + // looping through and renders button for donation amounts. + children: List.generate( + 3, + (index) => model.dominationButton( + model.denomination[index], + context, + setState, + ), + ), + ), + ), + SizedBox( + height: SizeConfig.screenWidth! * 0.05, + ), + Text( + 'Or', + style: Theme.of(context).textTheme.headlineSmall, + ), + Text( + 'Input custom amount', + style: Theme.of(context).textTheme.headlineSmall, + ), + SizedBox( + height: SizeConfig.screenWidth! * 0.05, + ), + // containers for custom amount + Container( + padding: EdgeInsets.symmetric( + horizontal: SizeConfig.screenWidth! * 0.05, + ), + child: TextField( + controller: model.donationAmount, + focusNode: model.donationField, + textInputAction: TextInputAction.next, + keyboardType: TextInputType.number, + autofillHints: const [AutofillHints.email], + enableSuggestions: true, + style: Theme.of(context).textTheme.titleLarge, + onChanged: (text) { + setState(() {}); + }, + decoration: InputDecoration( + hintText: AppLocalizations.of(context)! + .translate("Enter donation amount"), + labelText: AppLocalizations.of(context)! + .translate("Enter custom donation amount"), + labelStyle: + Theme.of(context).textTheme.titleMedium, + prefixIcon: GestureDetector( + onTap: () { + model.changeCurrency(context, setState); + }, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 15.0, + ), + child: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + model.donationCurrency, + textAlign: TextAlign.center, + style: Theme.of(context) + .textTheme + .headlineSmall, + ), + const Icon( + Icons.arrow_drop_down_circle_outlined, + ) + ], + ), + ), + ), + enabledBorder: OutlineInputBorder( + borderRadius: const BorderRadius.all( + Radius.circular(12.0), + ), + borderSide: BorderSide( + color: + Theme.of(context).colorScheme.secondary, + width: 2, + ), + ), + focusedBorder: OutlineInputBorder( + borderRadius: const BorderRadius.all( + Radius.circular(10.0), + ), + borderSide: BorderSide( + color: + Theme.of(context).colorScheme.secondary, + ), + ), + ), + ), + ), + SizedBox( + height: SizeConfig.screenWidth! * 0.05, + ), + ElevatedButton( + onPressed: () async { + ///required fields for donation transaction + late final String userId; + late final String orgId; + late final String nameOfOrg; + late final String nameOfUser; + late final String payPalId; + late final double amount; + orgId = model.currentOrg.id!; + userId = model.currentUser.id!; + nameOfUser = + "${model.currentUser.firstName!} ${model.currentUser.lastName!}"; + nameOfOrg = model.currentOrg.name!; + + amount = double.parse(model.donationAmount.text); + final request = BraintreeDropInRequest( + tokenizationKey: + '', + collectDeviceData: true, + paypalRequest: BraintreePayPalRequest( + amount: model.donationAmount.text, + displayName: "Talawa", + ), + cardEnabled: true, + ); + + final BraintreeDropInResult? result = + await BraintreeDropIn.start(request); + if (result != null) { + ///saving the donation in server + late final GraphQLClient client = + graphqlConfig.clientToQuery(); + + ///getting transaction id from `brainTree` API + payPalId = result.paymentMethodNonce.nonce; + + final QueryResult donationResult = + await client.mutate( + MutationOptions( + document: gql( + queries.createDonation( + userId, + orgId, + nameOfOrg, + nameOfUser, + payPalId, + amount, + ), + ), + ), + ); + if (donationResult.hasException) { + model.showSnackBar( + "Error occurred while making a donation", + ); + } + + /// hiding the donation UI once it is successful + model.popBottomSheet(); + model.showSnackBar( + 'Donation Successful,Thanks for the support !', + ); + } + }, + style: ButtonStyle( + backgroundColor: MaterialStateProperty.all( + // if the donation amount entered or selected is empty then renders grey color + // else render primary color + model.donationAmount.text.isEmpty + ? Colors.grey + : Theme.of(context).colorScheme.primary, + ), + ), + child: Text( + 'DONATE', + style: Theme.of(context).textTheme.labelLarge, + ), + ) + ], + ), + ), + ), + ), + ); + }, + ); + }, + ).then((value) => model.updateSheetHeight()); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/homeModel.md b/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/homeModel.md new file mode 100644 index 000000000..d7359e061 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/ProfilePage/homeModel.md @@ -0,0 +1,32 @@ + + + +# homeModel property + + + + + + + +[MainScreenViewModel](../../view_model_main_screen_view_model/MainScreenViewModel-class.md)? homeModel + +_final_ + + + + + + +## Implementation + +```dart +final MainScreenViewModel? homeModel; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/views_after_auth_screens_profile_profile_page-library.md b/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/views_after_auth_screens_profile_profile_page-library.md new file mode 100644 index 000000000..7d8218ef7 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_profile_profile_page/views_after_auth_screens_profile_profile_page-library.md @@ -0,0 +1,38 @@ + + + + +# profile_page library + + + + + + + + + + + +## Classes + +##### [ProfilePage](../views_after_auth_screens_profile_profile_page/ProfilePage-class.md) + + + +ProfilePage returns a widget that renders a page of user's profile. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage-class.md b/talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage-class.md new file mode 100644 index 000000000..c14032295 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage-class.md @@ -0,0 +1,198 @@ + + + +# CreateTaskPage class + + + + + + + + + +

CreateTaskPage returns a widget for page to create task for the user.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- CreateTaskPage + + + + + + + + +## Constructors + +[CreateTaskPage](../views_after_auth_screens_tasks_create_task_page/CreateTaskPage/CreateTaskPage.md) ({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId, [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [eventId](../views_after_auth_screens_tasks_create_task_page/CreateTaskPage/eventId.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_tasks_create_task_page/CreateTaskPage/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage/CreateTaskPage.md b/talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage/CreateTaskPage.md new file mode 100644 index 000000000..67c1b703b --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage/CreateTaskPage.md @@ -0,0 +1,29 @@ + + + +# CreateTaskPage constructor + + + + + + +const +CreateTaskPage({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId, [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const CreateTaskPage({required this.eventId, Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage/build.md b/talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage/build.md new file mode 100644 index 000000000..b173c4741 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage/build.md @@ -0,0 +1,80 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return BaseView( + builder: (context, model, _) { + // renders custom widget TaskForm, you can explore TaskForm widget [here](/widgets/task_form.dart). + return TaskForm( + onSave: () => model.createTask(eventId), + title: 'Create Task', + actionText: 'Add', + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage/eventId.md b/talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage/eventId.md new file mode 100644 index 000000000..4ca1b3890 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/CreateTaskPage/eventId.md @@ -0,0 +1,32 @@ + + + +# eventId property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId + +_final_ + + + + + + +## Implementation + +```dart +final String eventId; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/views_after_auth_screens_tasks_create_task_page-library.md b/talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/views_after_auth_screens_tasks_create_task_page-library.md new file mode 100644 index 000000000..e30821a17 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_create_task_page/views_after_auth_screens_tasks_create_task_page-library.md @@ -0,0 +1,38 @@ + + + + +# create_task_page library + + + + + + + + + + + +## Classes + +##### [CreateTaskPage](../views_after_auth_screens_tasks_create_task_page/CreateTaskPage-class.md) + + + +CreateTaskPage returns a widget for page to create task for the user. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage-class.md b/talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage-class.md new file mode 100644 index 000000000..8a8ff4c7f --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage-class.md @@ -0,0 +1,198 @@ + + + +# EditTaskPage class + + + + + + + + + +

EditTaskPage returns a widget for page to edit the task for the user.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- EditTaskPage + + + + + + + + +## Constructors + +[EditTaskPage](../views_after_auth_screens_tasks_edit_task_page/EditTaskPage/EditTaskPage.md) ({required [Task](../models_task_task_model/Task-class.md) task, [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [task](../views_after_auth_screens_tasks_edit_task_page/EditTaskPage/task.md) → [Task](../models_task_task_model/Task-class.md) + + + + +_final_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_tasks_edit_task_page/EditTaskPage/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage/EditTaskPage.md b/talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage/EditTaskPage.md new file mode 100644 index 000000000..204de2133 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage/EditTaskPage.md @@ -0,0 +1,29 @@ + + + +# EditTaskPage constructor + + + + + + +const +EditTaskPage({required [Task](../../models_task_task_model/Task-class.md) task, [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const EditTaskPage({required this.task, Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage/build.md b/talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage/build.md new file mode 100644 index 000000000..35493bb5b --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage/build.md @@ -0,0 +1,81 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.fillTask(task), + builder: (context, model, _) { + // renders custom widget TaskForm, you can explore TaskForm widget [here](/widgets/task_form.dart). + return TaskForm( + onSave: () => model.editTask(task.id), + title: 'Edit Task', + actionText: 'Update', + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage/task.md b/talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage/task.md new file mode 100644 index 000000000..3cf99076f --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/EditTaskPage/task.md @@ -0,0 +1,32 @@ + + + +# task property + + + + + + + +[Task](../../models_task_task_model/Task-class.md) task + +_final_ + + + + + + +## Implementation + +```dart +final Task task; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/views_after_auth_screens_tasks_edit_task_page-library.md b/talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/views_after_auth_screens_tasks_edit_task_page-library.md new file mode 100644 index 000000000..58b4e96c1 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_edit_task_page/views_after_auth_screens_tasks_edit_task_page-library.md @@ -0,0 +1,38 @@ + + + + +# edit_task_page library + + + + + + + + + + + +## Classes + +##### [EditTaskPage](../views_after_auth_screens_tasks_edit_task_page/EditTaskPage-class.md) + + + +EditTaskPage returns a widget for page to edit the task for the user. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage-class.md b/talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage-class.md new file mode 100644 index 000000000..25f2d41a0 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage-class.md @@ -0,0 +1,198 @@ + + + +# EventTasksPage class + + + + + + + + + +

EventTasksPage return a widget for Event Task Page that is created by event creator.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- EventTasksPage + + + + + + + + +## Constructors + +[EventTasksPage](../views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/EventTasksPage.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId}) + + _const_ + + +## Properties + +##### [eventId](../views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/eventId.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/EventTasksPage.md b/talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/EventTasksPage.md new file mode 100644 index 000000000..fcfe45d50 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/EventTasksPage.md @@ -0,0 +1,29 @@ + + + +# EventTasksPage constructor + + + + + + +const +EventTasksPage({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId}) + + + + + +## Implementation + +```dart +const EventTasksPage({Key? key, required this.eventId}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/build.md b/talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/build.md new file mode 100644 index 000000000..a5fc7f839 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/build.md @@ -0,0 +1,95 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.fetchTasks(eventId), + builder: (_, model, __) { + final tasks = model.tasks; + return RefreshIndicator( + onRefresh: () => model.fetchTasks(eventId), + child: Scaffold( + appBar: AppBar( + title: const Text('Event Tasks'), + ), + // TaskSchedule is custom widget. + body: TaskSchedule(tasks: tasks), + floatingActionButton: FloatingActionButton( + onPressed: () async { + await navigationService.pushScreen( + Routes.addTask, + arguments: eventId, + ); + }, + child: const Icon(Icons.add), + ), + ), + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/eventId.md b/talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/eventId.md new file mode 100644 index 000000000..4ca1b3890 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/EventTasksPage/eventId.md @@ -0,0 +1,32 @@ + + + +# eventId property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) eventId + +_final_ + + + + + + +## Implementation + +```dart +final String eventId; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/views_after_auth_screens_tasks_event_tasks_page-library.md b/talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/views_after_auth_screens_tasks_event_tasks_page-library.md new file mode 100644 index 000000000..47d26bcc2 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_event_tasks_page/views_after_auth_screens_tasks_event_tasks_page-library.md @@ -0,0 +1,38 @@ + + + + +# event_tasks_page library + + + + + + + + + + + +## Classes + +##### [EventTasksPage](../views_after_auth_screens_tasks_event_tasks_page/EventTasksPage-class.md) + + + +EventTasksPage return a widget for Event Task Page that is created by event creator. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/UserTasksPage-class.md b/talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/UserTasksPage-class.md new file mode 100644 index 000000000..ca207fe6d --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/UserTasksPage-class.md @@ -0,0 +1,189 @@ + + + +# UserTasksPage class + + + + + + + + + +

UserTasksPage returns a widget for page of User Tasks.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- UserTasksPage + + + + + + + + +## Constructors + +[UserTasksPage](../views_after_auth_screens_tasks_user_tasks_page/UserTasksPage/UserTasksPage.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_after_auth_screens_tasks_user_tasks_page/UserTasksPage/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/UserTasksPage/UserTasksPage.md b/talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/UserTasksPage/UserTasksPage.md new file mode 100644 index 000000000..2263a899c --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/UserTasksPage/UserTasksPage.md @@ -0,0 +1,29 @@ + + + +# UserTasksPage constructor + + + + + + +const +UserTasksPage({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const UserTasksPage({Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/UserTasksPage/build.md b/talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/UserTasksPage/build.md new file mode 100644 index 000000000..2a4d3e2cc --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/UserTasksPage/build.md @@ -0,0 +1,86 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.fetchTasksByUser(), + builder: (_, model, __) { + final tasks = model.tasks; + return RefreshIndicator( + onRefresh: () => model.fetchTasksByUser(), + child: Scaffold( + appBar: AppBar( + title: const Text('User Tasks'), + ), + // TaskSchedule is custom widget. + body: TaskSchedule(tasks: tasks, showMoreOptions: true), + ), + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/views_after_auth_screens_tasks_user_tasks_page-library.md b/talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/views_after_auth_screens_tasks_user_tasks_page-library.md new file mode 100644 index 000000000..8e4e1e055 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_tasks_user_tasks_page/views_after_auth_screens_tasks_user_tasks_page-library.md @@ -0,0 +1,38 @@ + + + + +# user_tasks_page library + + + + + + + + + + + +## Classes + +##### [UserTasksPage](../views_after_auth_screens_tasks_user_tasks_page/UserTasksPage-class.md) + + + +UserTasksPage returns a widget for page of User Tasks. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen-class.md b/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen-class.md new file mode 100644 index 000000000..c5eaefb15 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen-class.md @@ -0,0 +1,216 @@ + + + +# MapScreen class + + + + + + + + + +

MapScreen returns a widget that has mutable state _MapScreenState.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- MapScreen + + + + + + + + +## Constructors + +[MapScreen](../views_after_auth_screens_venue_map_screen/MapScreen/MapScreen.md) ([CreateEventViewModel](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md)? model, [double](https://api.flutter.dev/flutter/dart-core/double-class.html) latitude, [double](https://api.flutter.dev/flutter/dart-core/double-class.html) longitude, {[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [latitude](../views_after_auth_screens_venue_map_screen/MapScreen/latitude.md) → [double](https://api.flutter.dev/flutter/dart-core/double-class.html) + + + + +_final_ + + + +##### [longitude](../views_after_auth_screens_venue_map_screen/MapScreen/longitude.md) → [double](https://api.flutter.dev/flutter/dart-core/double-class.html) + + + + +_final_ + + + +##### [model](../views_after_auth_screens_venue_map_screen/MapScreen/model.md) → [CreateEventViewModel](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md)? + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_after_auth_screens_venue_map_screen/MapScreen/createState.md)() _MapScreenState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/MapScreen.md b/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/MapScreen.md new file mode 100644 index 000000000..c16e8d0be --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/MapScreen.md @@ -0,0 +1,30 @@ + + + +# MapScreen constructor + + + + + + +const +MapScreen([CreateEventViewModel](../../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md)? model, [double](https://api.flutter.dev/flutter/dart-core/double-class.html) latitude, [double](https://api.flutter.dev/flutter/dart-core/double-class.html) longitude, {[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const MapScreen(this.model, this.latitude, this.longitude, {Key? key}) + : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/createState.md b/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/createState.md new file mode 100644 index 000000000..713d88f2a --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_MapScreenState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_MapScreenState createState() => _MapScreenState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/latitude.md b/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/latitude.md new file mode 100644 index 000000000..6af59a4a5 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/latitude.md @@ -0,0 +1,32 @@ + + + +# latitude property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html) latitude + +_final_ + + + + + + +## Implementation + +```dart +final double latitude; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/longitude.md b/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/longitude.md new file mode 100644 index 000000000..7879ff570 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/longitude.md @@ -0,0 +1,32 @@ + + + +# longitude property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html) longitude + +_final_ + + + + + + +## Implementation + +```dart +final double longitude; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/model.md b/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/model.md new file mode 100644 index 000000000..697bf3c0c --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/MapScreen/model.md @@ -0,0 +1,32 @@ + + + +# model property + + + + + + + +[CreateEventViewModel](../../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md)? model + +_final_ + + + + + + +## Implementation + +```dart +final CreateEventViewModel? model; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/views_after_auth_screens_venue_map_screen-library.md b/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/views_after_auth_screens_venue_map_screen-library.md new file mode 100644 index 000000000..6fc918ae7 --- /dev/null +++ b/talawa-mobile-docs/views_after_auth_screens_venue_map_screen/views_after_auth_screens_venue_map_screen-library.md @@ -0,0 +1,38 @@ + + + + +# map_screen library + + + + + + + + + + + +## Classes + +##### [MapScreen](../views_after_auth_screens_venue_map_screen/MapScreen-class.md) + + + +MapScreen returns a widget that has mutable state _MapScreenState. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_base_view/BaseView-class.md b/talawa-mobile-docs/views_base_view/BaseView-class.md new file mode 100644 index 000000000..8946f6bb4 --- /dev/null +++ b/talawa-mobile-docs/views_base_view/BaseView-class.md @@ -0,0 +1,206 @@ + + + +# BaseView<T extends ChangeNotifier> class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- BaseView + + + + + + + + +## Constructors + +[BaseView](../views_base_view/BaseView/BaseView.md) ({required [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) builder([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html), T, [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html)?), dynamic onModelReady(T)?}) + + _const_ + + +## Properties + +##### [builder](../views_base_view/BaseView/builder.md) → [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) Function([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html), T, [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html)?) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [onModelReady](../views_base_view/BaseView/onModelReady.md) → (dynamic Function(T)?) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_base_view/BaseView/createState.md)() _BaseViewState<T> + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_base_view/BaseView/BaseView.md b/talawa-mobile-docs/views_base_view/BaseView/BaseView.md new file mode 100644 index 000000000..b2b14d9c9 --- /dev/null +++ b/talawa-mobile-docs/views_base_view/BaseView/BaseView.md @@ -0,0 +1,32 @@ + + + +# BaseView<T extends ChangeNotifier> constructor + + + + + + +const +BaseView<T extends ChangeNotifier>({required [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) builder([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html), T, [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html)?), dynamic onModelReady(T)?}) + + + + + +## Implementation + +```dart +const BaseView({ + required this.builder, + this.onModelReady, +}); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_base_view/BaseView/builder.md b/talawa-mobile-docs/views_base_view/BaseView/builder.md new file mode 100644 index 000000000..e30644f09 --- /dev/null +++ b/talawa-mobile-docs/views_base_view/BaseView/builder.md @@ -0,0 +1,32 @@ + + + +# builder property + + + + + + + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) Function([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html), T, [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html)?) builder + +_final_ + + + + + + +## Implementation + +```dart +final Widget Function(BuildContext, T, Widget?) builder; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_base_view/BaseView/createState.md b/talawa-mobile-docs/views_base_view/BaseView/createState.md new file mode 100644 index 000000000..e14ec4540 --- /dev/null +++ b/talawa-mobile-docs/views_base_view/BaseView/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_BaseViewState<T> createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_BaseViewState createState() => _BaseViewState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_base_view/BaseView/onModelReady.md b/talawa-mobile-docs/views_base_view/BaseView/onModelReady.md new file mode 100644 index 000000000..2ac8d9e41 --- /dev/null +++ b/talawa-mobile-docs/views_base_view/BaseView/onModelReady.md @@ -0,0 +1,32 @@ + + + +# onModelReady property + + + + + + + +(dynamic Function(T)?) onModelReady + +_final_ + + + + + + +## Implementation + +```dart +final Function(T)? onModelReady; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_base_view/views_base_view-library.md b/talawa-mobile-docs/views_base_view/views_base_view-library.md new file mode 100644 index 000000000..c235dde85 --- /dev/null +++ b/talawa-mobile-docs/views_base_view/views_base_view-library.md @@ -0,0 +1,38 @@ + + + + +# base_view library + + + + + + + + + + + +## Classes + +##### [BaseView](../views_base_view/BaseView-class.md)<T extends [ChangeNotifier](https://api.flutter.dev/flutter/foundation/ChangeNotifier-class.html)> + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_main_screen/MainScreen-class.md b/talawa-mobile-docs/views_main_screen/MainScreen-class.md new file mode 100644 index 000000000..27015e107 --- /dev/null +++ b/talawa-mobile-docs/views_main_screen/MainScreen-class.md @@ -0,0 +1,197 @@ + + + +# MainScreen class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- MainScreen + + + + + + + + +## Constructors + +[MainScreen](../views_main_screen/MainScreen/MainScreen.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [MainScreenArgs](../models_mainscreen_navigation_args/MainScreenArgs-class.md) mainScreenArgs}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [mainScreenArgs](../views_main_screen/MainScreen/mainScreenArgs.md) → [MainScreenArgs](../models_mainscreen_navigation_args/MainScreenArgs-class.md) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_main_screen/MainScreen/createState.md)() [State](https://api.flutter.dev/flutter/widgets/State-class.html)<[MainScreen](../views_main_screen/MainScreen-class.md)> + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_main_screen/MainScreen/MainScreen.md b/talawa-mobile-docs/views_main_screen/MainScreen/MainScreen.md new file mode 100644 index 000000000..bdcd9e82e --- /dev/null +++ b/talawa-mobile-docs/views_main_screen/MainScreen/MainScreen.md @@ -0,0 +1,29 @@ + + + +# MainScreen constructor + + + + + + +const +MainScreen({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [MainScreenArgs](../../models_mainscreen_navigation_args/MainScreenArgs-class.md) mainScreenArgs}) + + + + + +## Implementation + +```dart +const MainScreen({Key? key, required this.mainScreenArgs}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_main_screen/MainScreen/createState.md b/talawa-mobile-docs/views_main_screen/MainScreen/createState.md new file mode 100644 index 000000000..6553b2090 --- /dev/null +++ b/talawa-mobile-docs/views_main_screen/MainScreen/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[MainScreen](../../views_main_screen/MainScreen-class.md)> createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +State createState() => _MainScreenState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_main_screen/MainScreen/mainScreenArgs.md b/talawa-mobile-docs/views_main_screen/MainScreen/mainScreenArgs.md new file mode 100644 index 000000000..5ca52b985 --- /dev/null +++ b/talawa-mobile-docs/views_main_screen/MainScreen/mainScreenArgs.md @@ -0,0 +1,32 @@ + + + +# mainScreenArgs property + + + + + + + +[MainScreenArgs](../../models_mainscreen_navigation_args/MainScreenArgs-class.md) mainScreenArgs + +_final_ + + + + + + +## Implementation + +```dart +final MainScreenArgs mainScreenArgs; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_main_screen/views_main_screen-library.md b/talawa-mobile-docs/views_main_screen/views_main_screen-library.md new file mode 100644 index 000000000..f880632ed --- /dev/null +++ b/talawa-mobile-docs/views_main_screen/views_main_screen-library.md @@ -0,0 +1,38 @@ + + + + +# main_screen library + + + + + + + + + + + +## Classes + +##### [MainScreen](../views_main_screen/MainScreen-class.md) + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_change_password/ChangePass-class.md b/talawa-mobile-docs/views_pre_auth_screens_change_password/ChangePass-class.md new file mode 100644 index 000000000..731c511f0 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_change_password/ChangePass-class.md @@ -0,0 +1,192 @@ + + + +# ChangePass class + + + + + + + + + +

This widget lets the user change his/her password. +There are two input fields. The first one is for entering the new password, and the +second one is for re-entering the password for verification. +There is a raised button which finally updates the password when pressed.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- ChangePass + + + + + + + + +## Constructors + +[ChangePass](../views_pre_auth_screens_change_password/ChangePass/ChangePass.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_pre_auth_screens_change_password/ChangePass/createState.md)() _ChangePassState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_change_password/ChangePass/ChangePass.md b/talawa-mobile-docs/views_pre_auth_screens_change_password/ChangePass/ChangePass.md new file mode 100644 index 000000000..1cd9383e7 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_change_password/ChangePass/ChangePass.md @@ -0,0 +1,29 @@ + + + +# ChangePass constructor + + + + + + +const +ChangePass({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key}) + + + + + +## Implementation + +```dart +const ChangePass({required Key key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_change_password/ChangePass/createState.md b/talawa-mobile-docs/views_pre_auth_screens_change_password/ChangePass/createState.md new file mode 100644 index 000000000..895a6ff7f --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_change_password/ChangePass/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_ChangePassState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_ChangePassState createState() => _ChangePassState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_change_password/views_pre_auth_screens_change_password-library.md b/talawa-mobile-docs/views_pre_auth_screens_change_password/views_pre_auth_screens_change_password-library.md new file mode 100644 index 000000000..23eb04bfc --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_change_password/views_pre_auth_screens_change_password-library.md @@ -0,0 +1,41 @@ + + + + +# change_password library + + + + + + + + + + + +## Classes + +##### [ChangePass](../views_pre_auth_screens_change_password/ChangePass-class.md) + + + +This widget lets the user change his/her password. +There are two input fields. The first one is for entering the new password, and the +second one is for re-entering the password for verification. +There is a raised button which finally updates the password when pressed. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_login/Login-class.md b/talawa-mobile-docs/views_pre_auth_screens_login/Login-class.md new file mode 100644 index 000000000..70fae78e2 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_login/Login-class.md @@ -0,0 +1,194 @@ + + + +# Login class + + + + + + + + + +

This is the login widget. +There are two input fiels. The first one takes in the email and +the second one takes in the password of the user. +There is also a "Forgot Password" text button, which directs to +the "recover password" screen when pressed. +At the bottom, there is a login button to initiate the login.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- Login + + + + + + + + +## Constructors + +[Login](../views_pre_auth_screens_login/Login/Login.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_pre_auth_screens_login/Login/createState.md)() _LoginState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_login/Login/Login.md b/talawa-mobile-docs/views_pre_auth_screens_login/Login/Login.md new file mode 100644 index 000000000..286bc4a1e --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_login/Login/Login.md @@ -0,0 +1,29 @@ + + + +# Login constructor + + + + + + +const +Login({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key}) + + + + + +## Implementation + +```dart +const Login({required Key key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_login/Login/createState.md b/talawa-mobile-docs/views_pre_auth_screens_login/Login/createState.md new file mode 100644 index 000000000..15962de2e --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_login/Login/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_LoginState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_LoginState createState() => _LoginState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_login/views_pre_auth_screens_login-library.md b/talawa-mobile-docs/views_pre_auth_screens_login/views_pre_auth_screens_login-library.md new file mode 100644 index 000000000..ce705ea1d --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_login/views_pre_auth_screens_login-library.md @@ -0,0 +1,43 @@ + + + + +# login library + + + + + + + + + + + +## Classes + +##### [Login](../views_pre_auth_screens_login/Login-class.md) + + + +This is the login widget. +There are two input fiels. The first one takes in the email and +the second one takes in the password of the user. +There is also a "Forgot Password" text button, which directs to +the "recover password" screen when pressed. +At the bottom, there is a login button to initiate the login. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_recover/Recover-class.md b/talawa-mobile-docs/views_pre_auth_screens_recover/Recover-class.md new file mode 100644 index 000000000..729d6af96 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_recover/Recover-class.md @@ -0,0 +1,190 @@ + + + +# Recover class + + + + + + + + + +

This class recovers the users password. +The users needs to enter his/her email and press on the button at the bottom to recover his/her password.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- Recover + + + + + + + + +## Constructors + +[Recover](../views_pre_auth_screens_recover/Recover/Recover.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_pre_auth_screens_recover/Recover/createState.md)() _RecoverState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_recover/Recover/Recover.md b/talawa-mobile-docs/views_pre_auth_screens_recover/Recover/Recover.md new file mode 100644 index 000000000..62e8bdcc4 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_recover/Recover/Recover.md @@ -0,0 +1,29 @@ + + + +# Recover constructor + + + + + + +const +Recover({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key}) + + + + + +## Implementation + +```dart +const Recover({required Key key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_recover/Recover/createState.md b/talawa-mobile-docs/views_pre_auth_screens_recover/Recover/createState.md new file mode 100644 index 000000000..2ba2ecaf8 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_recover/Recover/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_RecoverState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_RecoverState createState() => _RecoverState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_recover/views_pre_auth_screens_recover-library.md b/talawa-mobile-docs/views_pre_auth_screens_recover/views_pre_auth_screens_recover-library.md new file mode 100644 index 000000000..4847fa5eb --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_recover/views_pre_auth_screens_recover-library.md @@ -0,0 +1,39 @@ + + + + +# recover library + + + + + + + + + + + +## Classes + +##### [Recover](../views_pre_auth_screens_recover/Recover-class.md) + + + +This class recovers the users password. +The users needs to enter his/her email and press on the button at the bottom to recover his/her password. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_select_language/SelectLanguage-class.md b/talawa-mobile-docs/views_pre_auth_screens_select_language/SelectLanguage-class.md new file mode 100644 index 000000000..ebdca5873 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_select_language/SelectLanguage-class.md @@ -0,0 +1,192 @@ + + + +# SelectLanguage class + + + + + + + + + +

This widget enables us to select a different language. +The default language is English. We can choose among the options to switch the language. +There is a text button at the right bottom of the screen which changes the language when tapped. +The user finally gets redirected to the previous screen.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- SelectLanguage + + + + + + + + +## Constructors + +[SelectLanguage](../views_pre_auth_screens_select_language/SelectLanguage/SelectLanguage.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_pre_auth_screens_select_language/SelectLanguage/createState.md)() _SelectLanguageState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_select_language/SelectLanguage/SelectLanguage.md b/talawa-mobile-docs/views_pre_auth_screens_select_language/SelectLanguage/SelectLanguage.md new file mode 100644 index 000000000..e41052761 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_select_language/SelectLanguage/SelectLanguage.md @@ -0,0 +1,29 @@ + + + +# SelectLanguage constructor + + + + + + +const +SelectLanguage({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key}) + + + + + +## Implementation + +```dart +const SelectLanguage({required Key key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_select_language/SelectLanguage/createState.md b/talawa-mobile-docs/views_pre_auth_screens_select_language/SelectLanguage/createState.md new file mode 100644 index 000000000..2428e069e --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_select_language/SelectLanguage/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_SelectLanguageState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_SelectLanguageState createState() => _SelectLanguageState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_select_language/views_pre_auth_screens_select_language-library.md b/talawa-mobile-docs/views_pre_auth_screens_select_language/views_pre_auth_screens_select_language-library.md new file mode 100644 index 000000000..d177a30d0 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_select_language/views_pre_auth_screens_select_language-library.md @@ -0,0 +1,41 @@ + + + + +# select_language library + + + + + + + + + + + +## Classes + +##### [SelectLanguage](../views_pre_auth_screens_select_language/SelectLanguage-class.md) + + + +This widget enables us to select a different language. +The default language is English. We can choose among the options to switch the language. +There is a text button at the right bottom of the screen which changes the language when tapped. +The user finally gets redirected to the previous screen. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization-class.md b/talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization-class.md new file mode 100644 index 000000000..971cf7ddf --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization-class.md @@ -0,0 +1,200 @@ + + + +# SelectOrganization class + + + + + + + + + +

This widget lets the user select new organizations.

+

There is a list tile which displays the organization selected by the user. +He/she needs to press the "continue" button to proceed.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- SelectOrganization + + + + + + + + +## Constructors + +[SelectOrganization](../views_pre_auth_screens_select_organization/SelectOrganization/SelectOrganization.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) selectedOrgId}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [selectedOrgId](../views_pre_auth_screens_select_organization/SelectOrganization/selectedOrgId.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Contains Integer value for selected org id. +_final_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_pre_auth_screens_select_organization/SelectOrganization/createState.md)() _SelectOrganizationState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization/SelectOrganization.md b/talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization/SelectOrganization.md new file mode 100644 index 000000000..e50889bab --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization/SelectOrganization.md @@ -0,0 +1,30 @@ + + + +# SelectOrganization constructor + + + + + + +const +SelectOrganization({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) selectedOrgId}) + + + + + +## Implementation + +```dart +const SelectOrganization({required Key key, required this.selectedOrgId}) + : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization/createState.md b/talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization/createState.md new file mode 100644 index 000000000..f79eaff9e --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_SelectOrganizationState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_SelectOrganizationState createState() => _SelectOrganizationState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization/selectedOrgId.md b/talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization/selectedOrgId.md new file mode 100644 index 000000000..c195ff636 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_select_organization/SelectOrganization/selectedOrgId.md @@ -0,0 +1,33 @@ + + + +# selectedOrgId property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) selectedOrgId + +_final_ + + + +

Contains Integer value for selected org id.

+ + + +## Implementation + +```dart +final String selectedOrgId; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_select_organization/views_pre_auth_screens_select_organization-library.md b/talawa-mobile-docs/views_pre_auth_screens_select_organization/views_pre_auth_screens_select_organization-library.md new file mode 100644 index 000000000..af27a16c9 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_select_organization/views_pre_auth_screens_select_organization-library.md @@ -0,0 +1,38 @@ + + + + +# select_organization library + + + + + + + + + + + +## Classes + +##### [SelectOrganization](../views_pre_auth_screens_select_organization/SelectOrganization-class.md) + + + +This widget lets the user select new organizations. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl-class.md b/talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl-class.md new file mode 100644 index 000000000..a79b2add3 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl-class.md @@ -0,0 +1,203 @@ + + + +# SetUrl class + + + + + + + + + +

This widget lets a user sign in/up with the organization url.

+

The user can enter an organization through the QR code scanner, +or enter the organization URL and then login. +There is also a signup option which navigates to a screen for the user +to select an organization. +At the bottom, there is also a gesture detector for changing the language.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- SetUrl + + + + + + + + +## Constructors + +[SetUrl](../views_pre_auth_screens_set_url/SetUrl/SetUrl.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) uri}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [uri](../views_pre_auth_screens_set_url/SetUrl/uri.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Variable. +_final_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_pre_auth_screens_set_url/SetUrl/createState.md)() _SetUrlState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl/SetUrl.md b/talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl/SetUrl.md new file mode 100644 index 000000000..aac3a1fad --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl/SetUrl.md @@ -0,0 +1,29 @@ + + + +# SetUrl constructor + + + + + + +const +SetUrl({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) uri}) + + + + + +## Implementation + +```dart +const SetUrl({required Key key, required this.uri}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl/createState.md b/talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl/createState.md new file mode 100644 index 000000000..90d6901db --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_SetUrlState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_SetUrlState createState() => _SetUrlState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl/uri.md b/talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl/uri.md new file mode 100644 index 000000000..4eb44bdd7 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_set_url/SetUrl/uri.md @@ -0,0 +1,33 @@ + + + +# uri property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) uri + +_final_ + + + +

Variable.

+ + + +## Implementation + +```dart +final String uri; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_set_url/views_pre_auth_screens_set_url-library.md b/talawa-mobile-docs/views_pre_auth_screens_set_url/views_pre_auth_screens_set_url-library.md new file mode 100644 index 000000000..3947441b1 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_set_url/views_pre_auth_screens_set_url-library.md @@ -0,0 +1,38 @@ + + + + +# set_url library + + + + + + + + + + + +## Classes + +##### [SetUrl](../views_pre_auth_screens_set_url/SetUrl-class.md) + + + +This widget lets a user sign in/up with the organization url. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails-class.md b/talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails-class.md new file mode 100644 index 000000000..dc5cf6e2a --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails-class.md @@ -0,0 +1,198 @@ + + + +# SignUpDetails class + + + + + + + + + +

This widget takes the user details for signup. The form includes first name, last name, email, password, and password confirmation inputs.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- SignUpDetails + + + + + + + + +## Constructors + +[SignUpDetails](../views_pre_auth_screens_signup_details/SignUpDetails/SignUpDetails.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, required [OrgInfo](../models_organization_org_info/OrgInfo-class.md) selectedOrg}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [selectedOrg](../views_pre_auth_screens_signup_details/SignUpDetails/selectedOrg.md) → [OrgInfo](../models_organization_org_info/OrgInfo-class.md) + + + + +_final_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../views_pre_auth_screens_signup_details/SignUpDetails/createState.md)() _SignUpDetailsState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails/SignUpDetails.md b/talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails/SignUpDetails.md new file mode 100644 index 000000000..730d0de63 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails/SignUpDetails.md @@ -0,0 +1,30 @@ + + + +# SignUpDetails constructor + + + + + + +const +SignUpDetails({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, required [OrgInfo](../../models_organization_org_info/OrgInfo-class.md) selectedOrg}) + + + + + +## Implementation + +```dart +const SignUpDetails({required Key key, required this.selectedOrg}) + : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails/createState.md b/talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails/createState.md new file mode 100644 index 000000000..d63614dd6 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_SignUpDetailsState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_SignUpDetailsState createState() => _SignUpDetailsState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails/selectedOrg.md b/talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails/selectedOrg.md new file mode 100644 index 000000000..93ed4601a --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_signup_details/SignUpDetails/selectedOrg.md @@ -0,0 +1,32 @@ + + + +# selectedOrg property + + + + + + + +[OrgInfo](../../models_organization_org_info/OrgInfo-class.md) selectedOrg + +_final_ + + + + + + +## Implementation + +```dart +final OrgInfo selectedOrg; +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_signup_details/views_pre_auth_screens_signup_details-library.md b/talawa-mobile-docs/views_pre_auth_screens_signup_details/views_pre_auth_screens_signup_details-library.md new file mode 100644 index 000000000..4198a4f70 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_signup_details/views_pre_auth_screens_signup_details-library.md @@ -0,0 +1,38 @@ + + + + +# signup_details library + + + + + + + + + + + +## Classes + +##### [SignUpDetails](../views_pre_auth_screens_signup_details/SignUpDetails-class.md) + + + +This widget takes the user details for signup. The form includes first name, last name, email, password, and password confirmation inputs. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/WaitingPage-class.md b/talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/WaitingPage-class.md new file mode 100644 index 000000000..bb3e35ccf --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/WaitingPage-class.md @@ -0,0 +1,189 @@ + + + +# WaitingPage class + + + + + + + + + +

This class returns a widget which shows the request sent by the user to join a private organization.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- WaitingPage + + + + + + + + +## Constructors + +[WaitingPage](../views_pre_auth_screens_waiting_to_join_private_org/WaitingPage/WaitingPage.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../views_pre_auth_screens_waiting_to_join_private_org/WaitingPage/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/WaitingPage/WaitingPage.md b/talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/WaitingPage/WaitingPage.md new file mode 100644 index 000000000..e02f65209 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/WaitingPage/WaitingPage.md @@ -0,0 +1,29 @@ + + + +# WaitingPage constructor + + + + + + +const +WaitingPage({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const WaitingPage({Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/WaitingPage/build.md b/talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/WaitingPage/build.md new file mode 100644 index 000000000..853022b40 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/WaitingPage/build.md @@ -0,0 +1,179 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialise(context), + builder: (context, model, child) { + return Scaffold( + key: const Key('WaitingPageScaffold'), + 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.center, + 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: [ + //Greeting text + CustomRichText( + key: const Key('WaitingPageText'), + words: model.greeting, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.03, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate('Request Sent to'), + style: Theme.of(context).textTheme.titleLarge, + ), + ], + ), + ), + //Information of the organization to which the request is sent. + Expanded( + child: ListView.builder( + key: const Key('PendingRequestList'), + shrinkWrap: true, + 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) {}, + ); + }, + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + //Join organization button + RaisedRoundedButton( + key: const Key('JoinOrg'), + buttonLabel: AppLocalizations.of(context)! + .strictTranslate('Join Organisation'), + onTap: model.joinOrg, + showArrow: true, + textColor: Theme.of(context).colorScheme.secondaryContainer, + backgroundColor: Theme.of(context) + .inputDecorationTheme + .focusedBorder! + .borderSide + .color, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + //Logout button + 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.secondaryContainer, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.0215, + ), + ], + ), + ), + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/views_pre_auth_screens_waiting_to_join_private_org-library.md b/talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/views_pre_auth_screens_waiting_to_join_private_org-library.md new file mode 100644 index 000000000..baca98c97 --- /dev/null +++ b/talawa-mobile-docs/views_pre_auth_screens_waiting_to_join_private_org/views_pre_auth_screens_waiting_to_join_private_org-library.md @@ -0,0 +1,38 @@ + + + + +# waiting_to_join_private_org library + + + + + + + + + + + +## Classes + +##### [WaitingPage](../views_pre_auth_screens_waiting_to_join_private_org/WaitingPage-class.md) + + + +This class returns a widget which shows the request sent by the user to join a private organization. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_add_members_bottom_sheet/EventBottomSheet-class.md b/talawa-mobile-docs/widgets_add_members_bottom_sheet/EventBottomSheet-class.md new file mode 100644 index 000000000..fd1368ae6 --- /dev/null +++ b/talawa-mobile-docs/widgets_add_members_bottom_sheet/EventBottomSheet-class.md @@ -0,0 +1,101 @@ + + + +# EventBottomSheet class + + + + + + + + + +

Adds members to an event.

+ + + + +## Constructors + +[EventBottomSheet](../widgets_add_members_bottom_sheet/EventBottomSheet/EventBottomSheet.md) () + + + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [addUserBottomSheet](../widgets_add_members_bottom_sheet/EventBottomSheet/addUserBottomSheet.md)({required [BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context, required [CreateEventViewModel](../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md) model}) void + + + +This function creates a modal material design bottom sheet. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_add_members_bottom_sheet/EventBottomSheet/EventBottomSheet.md b/talawa-mobile-docs/widgets_add_members_bottom_sheet/EventBottomSheet/EventBottomSheet.md new file mode 100644 index 000000000..588e22a0a --- /dev/null +++ b/talawa-mobile-docs/widgets_add_members_bottom_sheet/EventBottomSheet/EventBottomSheet.md @@ -0,0 +1,24 @@ + + + +# EventBottomSheet constructor + + + + + + + +EventBottomSheet() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_add_members_bottom_sheet/EventBottomSheet/addUserBottomSheet.md b/talawa-mobile-docs/widgets_add_members_bottom_sheet/EventBottomSheet/addUserBottomSheet.md new file mode 100644 index 000000000..c3727ed08 --- /dev/null +++ b/talawa-mobile-docs/widgets_add_members_bottom_sheet/EventBottomSheet/addUserBottomSheet.md @@ -0,0 +1,148 @@ + + + +# addUserBottomSheet method + + + + + + + + +void addUserBottomSheet +({required [BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context, required [CreateEventViewModel](../../view_model_after_auth_view_models_event_view_models_create_event_view_model/CreateEventViewModel-class.md) model}) + + + + + +

This function creates a modal material design bottom sheet.

+

to let the user add admin or members to an organization. +params:

+
    +
  • context: BuildContext
  • +
  • model: CreateEventViewModel
  • +
+

returns: + None

+ + + +## Implementation + +```dart +void addUserBottomSheet({ + required BuildContext context, + required CreateEventViewModel model, +}) { + // Returns a Future that resolves to the value ("context") passed + // to Navigator.pop + showModalBottomSheet( + context: context, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + ), + isScrollControlled: true, + builder: (BuildContext context) { + return StatefulBuilder( + builder: (BuildContext context, StateSetter setState) { + return ClipRRect( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(30), + topRight: Radius.circular(30), + ), + child: Container( + height: MediaQuery.of(context).size.height * 0.8, + decoration: BoxDecoration( + color: Theme.of(context).scaffoldBackgroundColor, + ), + child: Padding( + padding: const EdgeInsets.all(10), + child: Column( + children: [ + const Text( + "Add Members", + style: TextStyle(fontSize: 16), + ), + TextButton( + key: const Key('text_btn_ambs1'), + onPressed: () { + model.buildUserList(); + Navigator.pop(context); + }, + child: const Text("Done"), + ), + const Divider(), + FutureBuilder( + // an admin can access the list of the members in an organization + future: model.getCurrentOrgUsersList(), + builder: ( + BuildContext context, + AsyncSnapshot> snapshot, + ) { + if (snapshot.data == null) { + return const Center( + child: CircularProgressIndicator(), + ); + } else { + return snapshot.data!.isEmpty + ? const Center( + child: Text( + "There aren't any members in this organization.", + ), + ) + // Displaying the list of the members + : Flexible( + child: ListView.builder( + shrinkWrap: true, + itemCount: snapshot.data!.length, + itemBuilder: (context, index) { + return CheckboxListTile( + checkColor: Theme.of(context) + .colorScheme + .background, + activeColor: Theme.of(context) + .colorScheme + .primary, + title: Text( + "${snapshot.data![index].firstName!} ${snapshot.data![index].lastName!}", + ), + value: model.memberCheckedMap[ + snapshot.data![index].id], + onChanged: (val) { + setState( + () { + model.memberCheckedMap[snapshot + .data![index].id!] = val!; + }, + ); + }, + ); + }, + ), + ); + } + }, + ) + ], + ), + ), + ), + ); + }, + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_add_members_bottom_sheet/widgets_add_members_bottom_sheet-library.md b/talawa-mobile-docs/widgets_add_members_bottom_sheet/widgets_add_members_bottom_sheet-library.md new file mode 100644 index 000000000..852972d89 --- /dev/null +++ b/talawa-mobile-docs/widgets_add_members_bottom_sheet/widgets_add_members_bottom_sheet-library.md @@ -0,0 +1,38 @@ + + + + +# add_members_bottom_sheet library + + + + + + + + + + + +## Classes + +##### [EventBottomSheet](../widgets_add_members_bottom_sheet/EventBottomSheet-class.md) + + + +Adds members to an event. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog-class.md b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog-class.md new file mode 100644 index 000000000..7cdcf62e3 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog-class.md @@ -0,0 +1,255 @@ + + + +# CustomAlertDialog class + + + + + + + + + +

This Class returns CustomAlertDialog widget. Custom Alert Dialog is a popup +that appeared in the screen showing Alert message along with the event buttons. +This extends stateless widget that means it cannot change its state during the +runtime of a application.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- CustomAlertDialog + + + + + + + + +## Constructors + +[CustomAlertDialog](../widgets_custom_alert_dialog/CustomAlertDialog/CustomAlertDialog.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? successText, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? dialogTitle, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) reverse = false, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) secondaryButtonText = 'Close', [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html)? secondaryButtonTap, required [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) success, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) dialogSubTitle}) + + _const_ + + +## Properties + +##### [dialogSubTitle](../widgets_custom_alert_dialog/CustomAlertDialog/dialogSubTitle.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [dialogTitle](../widgets_custom_alert_dialog/CustomAlertDialog/dialogTitle.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [reverse](../widgets_custom_alert_dialog/CustomAlertDialog/reverse.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [secondaryButtonTap](../widgets_custom_alert_dialog/CustomAlertDialog/secondaryButtonTap.md) → [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html)? + + + + +_final_ + + + +##### [secondaryButtonText](../widgets_custom_alert_dialog/CustomAlertDialog/secondaryButtonText.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [success](../widgets_custom_alert_dialog/CustomAlertDialog/success.md) → [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) + + + + +_final_ + + + +##### [successText](../widgets_custom_alert_dialog/CustomAlertDialog/successText.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_final_ + + + + + +## Methods + +##### [build](../widgets_custom_alert_dialog/CustomAlertDialog/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/CustomAlertDialog.md b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/CustomAlertDialog.md new file mode 100644 index 000000000..8eaaa8ad1 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/CustomAlertDialog.md @@ -0,0 +1,38 @@ + + + +# CustomAlertDialog constructor + + + + + + +const +CustomAlertDialog({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? successText, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? dialogTitle, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) reverse = false, [String](https://api.flutter.dev/flutter/dart-core/String-class.html) secondaryButtonText = 'Close', [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html)? secondaryButtonTap, required [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) success, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) dialogSubTitle}) + + + + + +## Implementation + +```dart +const CustomAlertDialog({ + Key? key, + this.successText, + this.dialogTitle, + this.reverse = false, + this.secondaryButtonText = 'Close', + this.secondaryButtonTap, + required this.success, + required this.dialogSubTitle, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/build.md b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/build.md new file mode 100644 index 000000000..1e9548007 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/build.md @@ -0,0 +1,108 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + final List actions = [ + RaisedRoundedButton( + key: const Key('Close'), + onTap: () => secondaryButtonTap ?? navigationService.pop(), + buttonLabel: + AppLocalizations.of(context)!.strictTranslate(secondaryButtonText), + 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 + .headlineSmall! + .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/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/dialogSubTitle.md b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/dialogSubTitle.md new file mode 100644 index 000000000..289f53404 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/dialogSubTitle.md @@ -0,0 +1,32 @@ + + + +# dialogSubTitle property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) dialogSubTitle + +_final_ + + + + + + +## Implementation + +```dart +final String dialogSubTitle; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/dialogTitle.md b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/dialogTitle.md new file mode 100644 index 000000000..e9b1201be --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/dialogTitle.md @@ -0,0 +1,32 @@ + + + +# dialogTitle property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? dialogTitle + +_final_ + + + + + + +## Implementation + +```dart +final String? dialogTitle; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/reverse.md b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/reverse.md new file mode 100644 index 000000000..1a6ef66a4 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/reverse.md @@ -0,0 +1,32 @@ + + + +# reverse property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) reverse + +_final_ + + + + + + +## Implementation + +```dart +final bool reverse; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/secondaryButtonTap.md b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/secondaryButtonTap.md new file mode 100644 index 000000000..69581557b --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/secondaryButtonTap.md @@ -0,0 +1,32 @@ + + + +# secondaryButtonTap property + + + + + + + +[Function](https://api.flutter.dev/flutter/dart-core/Function-class.html)? secondaryButtonTap + +_final_ + + + + + + +## Implementation + +```dart +final Function? secondaryButtonTap; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/secondaryButtonText.md b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/secondaryButtonText.md new file mode 100644 index 000000000..d56250bfc --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/secondaryButtonText.md @@ -0,0 +1,32 @@ + + + +# secondaryButtonText property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) secondaryButtonText + +_final_ + + + + + + +## Implementation + +```dart +final String secondaryButtonText; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/success.md b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/success.md new file mode 100644 index 000000000..5a38d9633 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/success.md @@ -0,0 +1,32 @@ + + + +# success property + + + + + + + +[Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) success + +_final_ + + + + + + +## Implementation + +```dart +final Function success; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/successText.md b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/successText.md new file mode 100644 index 000000000..bae6cfb7b --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_alert_dialog/CustomAlertDialog/successText.md @@ -0,0 +1,32 @@ + + + +# successText property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? successText + +_final_ + + + + + + +## Implementation + +```dart +final String? successText; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_alert_dialog/widgets_custom_alert_dialog-library.md b/talawa-mobile-docs/widgets_custom_alert_dialog/widgets_custom_alert_dialog-library.md new file mode 100644 index 000000000..04914c600 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_alert_dialog/widgets_custom_alert_dialog-library.md @@ -0,0 +1,41 @@ + + + + +# custom_alert_dialog library + + + + + + + + + + + +## Classes + +##### [CustomAlertDialog](../widgets_custom_alert_dialog/CustomAlertDialog-class.md) + + + +This Class returns CustomAlertDialog widget. Custom Alert Dialog is a popup +that appeared in the screen showing Alert message along with the event buttons. +This extends stateless widget that means it cannot change its state during the +runtime of a application. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar-class.md b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar-class.md new file mode 100644 index 000000000..b17358fba --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar-class.md @@ -0,0 +1,236 @@ + + + +# CustomAvatar class + + + + + + + + + +

Creates a custom avatar. +The avatar is created using the image provided, +or the first alphabet with a standard background color.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- CustomAvatar + + + + + + + + +## Constructors + +[CustomAvatar](../widgets_custom_avatar/CustomAvatar/CustomAvatar.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isImageNull, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? firstAlphabet, [BaseCacheManager](https://pub.dev/documentation/flutter_cache_manager/3.3.1/flutter_cache_manager/BaseCacheManager-class.html)? cacheManager, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? imageUrl, [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? fontSize = 40}) + + _const_ + + +## Properties + +##### [cacheManager](../widgets_custom_avatar/CustomAvatar/cacheManager.md) → [BaseCacheManager](https://pub.dev/documentation/flutter_cache_manager/3.3.1/flutter_cache_manager/BaseCacheManager-class.html)? + + + + +_final_ + + + +##### [firstAlphabet](../widgets_custom_avatar/CustomAvatar/firstAlphabet.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_final_ + + + +##### [fontSize](../widgets_custom_avatar/CustomAvatar/fontSize.md) → [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [imageUrl](../widgets_custom_avatar/CustomAvatar/imageUrl.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_final_ + + + +##### [isImageNull](../widgets_custom_avatar/CustomAvatar/isImageNull.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_final_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_custom_avatar/CustomAvatar/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/CustomAvatar.md b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/CustomAvatar.md new file mode 100644 index 000000000..6889bbd2e --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/CustomAvatar.md @@ -0,0 +1,36 @@ + + + +# CustomAvatar constructor + + + + + + +const +CustomAvatar({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isImageNull, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? firstAlphabet, [BaseCacheManager](https://pub.dev/documentation/flutter_cache_manager/3.3.1/flutter_cache_manager/BaseCacheManager-class.html)? cacheManager, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? imageUrl, [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? fontSize = 40}) + + + + + +## Implementation + +```dart +const CustomAvatar({ + Key? key, + required this.isImageNull, + this.firstAlphabet, + this.cacheManager, + this.imageUrl, + this.fontSize = 40, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/build.md b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/build.md new file mode 100644 index 000000000..94273da49 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/build.md @@ -0,0 +1,106 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return isImageNull + //creating the avatar with the icon-theme color when the image is null + ? CircleAvatar( + backgroundColor: + Theme.of(context).iconTheme.color!.withOpacity(0.2), + child: Center( + child: Text( + firstAlphabet!, + style: Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(fontSize: fontSize), + ), + ), + ) + //creating the avatar with the provided image + : CachedNetworkImage( + cacheManager: cacheManager, + 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/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/cacheManager.md b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/cacheManager.md new file mode 100644 index 000000000..64667e800 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/cacheManager.md @@ -0,0 +1,32 @@ + + + +# cacheManager property + + + + + + + +[BaseCacheManager](https://pub.dev/documentation/flutter_cache_manager/3.3.1/flutter_cache_manager/BaseCacheManager-class.html)? cacheManager + +_final_ + + + + + + +## Implementation + +```dart +final BaseCacheManager? cacheManager; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/firstAlphabet.md b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/firstAlphabet.md new file mode 100644 index 000000000..ae1ab0c5f --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/firstAlphabet.md @@ -0,0 +1,32 @@ + + + +# firstAlphabet property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? firstAlphabet + +_final_ + + + + + + +## Implementation + +```dart +final String? firstAlphabet; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/fontSize.md b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/fontSize.md new file mode 100644 index 000000000..67ce19850 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/fontSize.md @@ -0,0 +1,32 @@ + + + +# fontSize property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html)? fontSize + +_final_ + + + + + + +## Implementation + +```dart +final double? fontSize; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/imageUrl.md b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/imageUrl.md new file mode 100644 index 000000000..c1aab3120 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/imageUrl.md @@ -0,0 +1,32 @@ + + + +# imageUrl property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? imageUrl + +_final_ + + + + + + +## Implementation + +```dart +final String? imageUrl; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/isImageNull.md b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/isImageNull.md new file mode 100644 index 000000000..2485f03e9 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_avatar/CustomAvatar/isImageNull.md @@ -0,0 +1,32 @@ + + + +# isImageNull property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isImageNull + +_final_ + + + + + + +## Implementation + +```dart +final bool isImageNull; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_avatar/widgets_custom_avatar-library.md b/talawa-mobile-docs/widgets_custom_avatar/widgets_custom_avatar-library.md new file mode 100644 index 000000000..b11199567 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_avatar/widgets_custom_avatar-library.md @@ -0,0 +1,40 @@ + + + + +# custom_avatar library + + + + + + + + + + + +## Classes + +##### [CustomAvatar](../widgets_custom_avatar/CustomAvatar-class.md) + + + +Creates a custom avatar. +The avatar is created using the image provided, +or the first alphabet with a standard background color. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_drawer/CustomDrawer-class.md b/talawa-mobile-docs/widgets_custom_drawer/CustomDrawer-class.md new file mode 100644 index 000000000..d50b757b4 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_drawer/CustomDrawer-class.md @@ -0,0 +1,208 @@ + + + +# CustomDrawer class + + + + + + + + + +

Creates a custom drawer for switching organizations.

+

joining new organizations, or leaving an organization.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- CustomDrawer + + + + + + + + +## Constructors + +[CustomDrawer](../widgets_custom_drawer/CustomDrawer/CustomDrawer.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [MainScreenViewModel](../view_model_main_screen_view_model/MainScreenViewModel-class.md) homeModel}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [homeModel](../widgets_custom_drawer/CustomDrawer/homeModel.md) → [MainScreenViewModel](../view_model_main_screen_view_model/MainScreenViewModel-class.md) + + + +home model. +_final_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_custom_drawer/CustomDrawer/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [exitButton](../widgets_custom_drawer/CustomDrawer/exitButton.md)() void + + + +Button to exit the organization. + + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/CustomDrawer.md b/talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/CustomDrawer.md new file mode 100644 index 000000000..1a91c48a2 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/CustomDrawer.md @@ -0,0 +1,32 @@ + + + +# CustomDrawer constructor + + + + + + +const +CustomDrawer({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [MainScreenViewModel](../../view_model_main_screen_view_model/MainScreenViewModel-class.md) homeModel}) + + + + + +## Implementation + +```dart +const CustomDrawer({ + Key? key, + required this.homeModel, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/build.md b/talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/build.md new file mode 100644 index 000000000..179b7931f --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/build.md @@ -0,0 +1,198 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.initialize(homeModel, context), + builder: (context, model, child) { + return Container( + width: SizeConfig.screenWidth! * 0.6, + alignment: Alignment.centerLeft, + child: Drawer( + key: const Key("Drawer"), + child: ListView( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + //A material design Drawer header that identifies the app's user. + UserAccountsDrawerHeader( + currentAccountPicture: CustomAvatar( + isImageNull: model.selectedOrg?.image == null, + imageUrl: model.selectedOrg?.image, + firstAlphabet: model.selectedOrg?.name!.substring(0, 1), + ), + accountName: Column( + key: MainScreenViewModel.keyDrawerCurOrg, + mainAxisAlignment: MainAxisAlignment.end, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + model.selectedOrg?.name! ?? "NULL", + ), + Text( + AppLocalizations.of(context)! + .strictTranslate("Selected Organization"), + ) + ], + ), + accountEmail: const SizedBox(), + ), + //Tile to Switch organizations + Column( + key: MainScreenViewModel.keyDrawerSwitchableOrg, + children: [ + Padding( + padding: const EdgeInsets.symmetric( + vertical: 5, + horizontal: 8.0, + ), + child: Text( + AppLocalizations.of(context)! + .strictTranslate("Switch Organization"), + style: Theme.of(context).textTheme.titleLarge, + ), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.41, + child: Scrollbar( + controller: model.controller, + thumbVisibility: true, + child: ListView.builder( + key: const Key("Switching Org"), + controller: model.controller, + padding: EdgeInsets.zero, + itemCount: model.switchAbleOrg.length, + // itemCount: 3, + itemBuilder: (BuildContext context, int index) { + return ListTile( + key: const Key("Org"), + 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(), + // A Tile to join a new organization + ListTile( + key: MainScreenViewModel.keyDrawerJoinOrg, + onTap: () => navigationService + .popAndPushScreen(Routes.joinOrg, arguments: '-1'), + leading: const Icon( + Icons.add, + size: 30, + ), + title: Text( + AppLocalizations.of(context)! + .strictTranslate("Join new Organization"), + ), + ), + ListTile( + key: MainScreenViewModel.keyDrawerLeaveCurrentOrg, + onTap: () => exitButton(), + leading: const Icon(Icons.logout, size: 30), + title: Text( + AppLocalizations.of(context)! + .strictTranslate("Leave Current Organization"), + ), + ), + SizedBox( + key: const Key("Sized Box Drawer"), + height: SizeConfig.screenHeight! * 0.03, + ), + const FromPalisadoes(key: Key("From Palisadoes")), + SizedBox( + key: const Key("Sized BottomBox Drawer"), + height: SizeConfig.screenHeight! * 0.03, + ) + ], + ), + ], + ), + ), + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/exitButton.md b/talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/exitButton.md new file mode 100644 index 000000000..2d4c0b640 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/exitButton.md @@ -0,0 +1,51 @@ + + + +# exitButton method + + + + + + + + +void exitButton +() + + + + + +

Button to exit the organization.

+

params: + None

+

returns: + None

+ + + +## Implementation + +```dart +void exitButton() { + return navigationService.pushDialog( + CustomAlertDialog( + key: const Key("Exit?"), + reverse: true, + dialogSubTitle: 'Are you sure you want to exit this organization?', + successText: 'Exit', + success: () { + //Exit org + }, + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/homeModel.md b/talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/homeModel.md new file mode 100644 index 000000000..310768eb9 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_drawer/CustomDrawer/homeModel.md @@ -0,0 +1,33 @@ + + + +# homeModel property + + + + + + + +[MainScreenViewModel](../../view_model_main_screen_view_model/MainScreenViewModel-class.md) homeModel + +_final_ + + + +

home model.

+ + + +## Implementation + +```dart +final MainScreenViewModel homeModel; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_drawer/widgets_custom_drawer-library.md b/talawa-mobile-docs/widgets_custom_drawer/widgets_custom_drawer-library.md new file mode 100644 index 000000000..8ae003a91 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_drawer/widgets_custom_drawer-library.md @@ -0,0 +1,38 @@ + + + + +# custom_drawer library + + + + + + + + + + + +## Classes + +##### [CustomDrawer](../widgets_custom_drawer/CustomDrawer-class.md) + + + +Creates a custom drawer for switching organizations. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile-class.md b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile-class.md new file mode 100644 index 000000000..1bffb888c --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile-class.md @@ -0,0 +1,271 @@ + + + +# CustomListTile class + + + + + + + + + +

Returns a widget for rendering Customized tiles. +A Tile shows the org info, user info, options that on tap user & org info.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- CustomListTile + + + + + + + + +## Constructors + +[CustomListTile](../widgets_custom_list_tile/CustomListTile/CustomListTile.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, required [int](https://api.flutter.dev/flutter/dart-core/int-class.html) index, required [TileType](../enums_enums/TileType.md) type, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) showIcon = false, [OrgInfo](../models_organization_org_info/OrgInfo-class.md)? orgInfo, dynamic onTapOrgInfo([OrgInfo](../models_organization_org_info/OrgInfo-class.md))?, [User](../models_user_user_info/User-class.md)? userInfo, dynamic onTapUserInfo()?, [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html)? onTapOption, [Options](../models_options_options/Options-class.md)? option}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [index](../widgets_custom_list_tile/CustomListTile/index.md) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + + +_final_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [onTapOption](../widgets_custom_list_tile/CustomListTile/onTapOption.md) → [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html)? + + + + +_final_ + + + +##### [onTapOrgInfo](../widgets_custom_list_tile/CustomListTile/onTapOrgInfo.md) → (dynamic Function([OrgInfo](../models_organization_org_info/OrgInfo-class.md))?) + + + + +_final_ + + + +##### [onTapUserInfo](../widgets_custom_list_tile/CustomListTile/onTapUserInfo.md) → (dynamic Function()?) + + + + +_final_ + + + +##### [option](../widgets_custom_list_tile/CustomListTile/option.md) → [Options](../models_options_options/Options-class.md)? + + + + +_final_ + + + +##### [orgInfo](../widgets_custom_list_tile/CustomListTile/orgInfo.md) → [OrgInfo](../models_organization_org_info/OrgInfo-class.md)? + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [showIcon](../widgets_custom_list_tile/CustomListTile/showIcon.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_final_ + + + +##### [type](../widgets_custom_list_tile/CustomListTile/type.md) → [TileType](../enums_enums/TileType.md) + + + + +_final_ + + + +##### [userInfo](../widgets_custom_list_tile/CustomListTile/userInfo.md) → [User](../models_user_user_info/User-class.md)? + + + + +_final_ + + + + + +## Methods + +##### [build](../widgets_custom_list_tile/CustomListTile/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/CustomListTile.md b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/CustomListTile.md new file mode 100644 index 000000000..3eeda234d --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/CustomListTile.md @@ -0,0 +1,40 @@ + + + +# CustomListTile constructor + + + + + + +const +CustomListTile({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, required [int](https://api.flutter.dev/flutter/dart-core/int-class.html) index, required [TileType](../../enums_enums/TileType.md) type, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) showIcon = false, [OrgInfo](../../models_organization_org_info/OrgInfo-class.md)? orgInfo, dynamic onTapOrgInfo([OrgInfo](../../models_organization_org_info/OrgInfo-class.md))?, [User](../../models_user_user_info/User-class.md)? userInfo, dynamic onTapUserInfo()?, [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html)? onTapOption, [Options](../../models_options_options/Options-class.md)? option}) + + + + + +## Implementation + +```dart +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); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/build.md b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/build.md new file mode 100644 index 000000000..7f8f54cc0 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/build.md @@ -0,0 +1,143 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return InkWell( + // checking wheather the tapped tile is of user or org. + onTap: () => type == TileType.org + ? onTapOrgInfo!(orgInfo!) + : type == TileType.user + ? onTapUserInfo!() + // ignore: avoid_dynamic_calls + : onTapOption!(), + child: Padding( + padding: const EdgeInsets.all(18.0), + child: Container( + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.circular(20), + ), + height: 70, + child: Row( + children: [ + Expanded( + flex: 3, + child: Padding( + padding: const EdgeInsets.symmetric( + horizontal: 25, + ), + child: Text( + type == TileType.org + ? orgInfo!.name! + : type == TileType.user + ? '${userInfo!.firstName!} ${userInfo!.lastName!}' + : option!.title, + style: type == TileType.org + ? Theme.of(context) + .textTheme + .headlineSmall! + .copyWith(fontSize: 18, color: Colors.black) + : type == TileType.user + ? Theme.of(context) + .textTheme + .titleLarge! + .copyWith(fontSize: 18, color: Colors.black) + : option!.trailingIconButton == null + ? Theme.of(context) + .textTheme + .bodyMedium! + .copyWith(fontSize: 18, color: Colors.black) + : Theme.of(context) + .textTheme + .headlineSmall! + .copyWith( + fontSize: 18, + color: Colors.black, + ), + ), + ), + ), + Expanded( + flex: 1, + child: type != TileType.user + ? type == TileType.org + ? Icon( + orgInfo!.isPublic! ? Icons.lock_open : Icons.lock, + color: orgInfo!.isPublic! + ? const Color(0xFF34AD64) + : const Color(0xffFABC57), + ) + : option!.trailingIconButton ?? const SizedBox() + : const SizedBox(), + ), + ], + ), + ), + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/index.md b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/index.md new file mode 100644 index 000000000..8d38fdfe8 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/index.md @@ -0,0 +1,32 @@ + + + +# index property + + + + + + + +[int](https://api.flutter.dev/flutter/dart-core/int-class.html) index + +_final_ + + + + + + +## Implementation + +```dart +final int index; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/onTapOption.md b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/onTapOption.md new file mode 100644 index 000000000..1a38e0522 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/onTapOption.md @@ -0,0 +1,32 @@ + + + +# onTapOption property + + + + + + + +[Function](https://api.flutter.dev/flutter/dart-core/Function-class.html)? onTapOption + +_final_ + + + + + + +## Implementation + +```dart +final Function? onTapOption; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/onTapOrgInfo.md b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/onTapOrgInfo.md new file mode 100644 index 000000000..c835fb4c1 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/onTapOrgInfo.md @@ -0,0 +1,32 @@ + + + +# onTapOrgInfo property + + + + + + + +(dynamic Function([OrgInfo](../../models_organization_org_info/OrgInfo-class.md))?) onTapOrgInfo + +_final_ + + + + + + +## Implementation + +```dart +final Function(OrgInfo)? onTapOrgInfo; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/onTapUserInfo.md b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/onTapUserInfo.md new file mode 100644 index 000000000..7aed949ac --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/onTapUserInfo.md @@ -0,0 +1,32 @@ + + + +# onTapUserInfo property + + + + + + + +(dynamic Function()?) onTapUserInfo + +_final_ + + + + + + +## Implementation + +```dart +final Function()? onTapUserInfo; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/option.md b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/option.md new file mode 100644 index 000000000..5ea411944 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/option.md @@ -0,0 +1,32 @@ + + + +# option property + + + + + + + +[Options](../../models_options_options/Options-class.md)? option + +_final_ + + + + + + +## Implementation + +```dart +final Options? option; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/orgInfo.md b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/orgInfo.md new file mode 100644 index 000000000..22dfb8f00 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/orgInfo.md @@ -0,0 +1,32 @@ + + + +# orgInfo property + + + + + + + +[OrgInfo](../../models_organization_org_info/OrgInfo-class.md)? orgInfo + +_final_ + + + + + + +## Implementation + +```dart +final OrgInfo? orgInfo; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/showIcon.md b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/showIcon.md new file mode 100644 index 000000000..fff3c932a --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/showIcon.md @@ -0,0 +1,32 @@ + + + +# showIcon property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) showIcon + +_final_ + + + + + + +## Implementation + +```dart +final bool showIcon; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/type.md b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/type.md new file mode 100644 index 000000000..1b487d771 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/type.md @@ -0,0 +1,32 @@ + + + +# type property + + + + + + + +[TileType](../../enums_enums/TileType.md) type + +_final_ + + + + + + +## Implementation + +```dart +final TileType type; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/userInfo.md b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/userInfo.md new file mode 100644 index 000000000..04e9dd974 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_list_tile/CustomListTile/userInfo.md @@ -0,0 +1,32 @@ + + + +# userInfo property + + + + + + + +[User](../../models_user_user_info/User-class.md)? userInfo + +_final_ + + + + + + +## Implementation + +```dart +final User? userInfo; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_list_tile/widgets_custom_list_tile-library.md b/talawa-mobile-docs/widgets_custom_list_tile/widgets_custom_list_tile-library.md new file mode 100644 index 000000000..20f3bdfd3 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_list_tile/widgets_custom_list_tile-library.md @@ -0,0 +1,39 @@ + + + + +# custom_list_tile library + + + + + + + + + + + +## Classes + +##### [CustomListTile](../widgets_custom_list_tile/CustomListTile-class.md) + + + +Returns a widget for rendering Customized tiles. +A Tile shows the org info, user info, options that on tap user & org info. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_progress_dialog/CustomProgressDialog-class.md b/talawa-mobile-docs/widgets_custom_progress_dialog/CustomProgressDialog-class.md new file mode 100644 index 000000000..6f3003ddc --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_progress_dialog/CustomProgressDialog-class.md @@ -0,0 +1,191 @@ + + + +# CustomProgressDialog class + + + + + + + + + +

A progress dialogue which shows an activity indicator +spinning clockwise if there is internet connectivity. +Otherwise, it shows no-internet image and text.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- CustomProgressDialog + + + + + + + + +## Constructors + +[CustomProgressDialog](../widgets_custom_progress_dialog/CustomProgressDialog/CustomProgressDialog.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_custom_progress_dialog/CustomProgressDialog/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_progress_dialog/CustomProgressDialog/CustomProgressDialog.md b/talawa-mobile-docs/widgets_custom_progress_dialog/CustomProgressDialog/CustomProgressDialog.md new file mode 100644 index 000000000..3dbcc9b6f --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_progress_dialog/CustomProgressDialog/CustomProgressDialog.md @@ -0,0 +1,29 @@ + + + +# CustomProgressDialog constructor + + + + + + +const +CustomProgressDialog({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key}) + + + + + +## Implementation + +```dart +const CustomProgressDialog({required Key key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_progress_dialog/CustomProgressDialog/build.md b/talawa-mobile-docs/widgets_custom_progress_dialog/CustomProgressDialog/build.md new file mode 100644 index 000000000..543386b09 --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_progress_dialog/CustomProgressDialog/build.md @@ -0,0 +1,114 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@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.titleLarge!.color, + borderRadius: BorderRadius.circular(15), + ), + child: model.connectivityPresent + ? Center( + //An iOS-style activity indicator that spins clockwise. + + child: CupertinoActivityIndicator( + radius: SizeConfig.screenWidth! * 0.065, + ), + ) + // Shows no-internet image and text on no connectivity + : 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.headlineSmall, + ), + ], + ), + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_custom_progress_dialog/widgets_custom_progress_dialog-library.md b/talawa-mobile-docs/widgets_custom_progress_dialog/widgets_custom_progress_dialog-library.md new file mode 100644 index 000000000..6c67685cc --- /dev/null +++ b/talawa-mobile-docs/widgets_custom_progress_dialog/widgets_custom_progress_dialog-library.md @@ -0,0 +1,40 @@ + + + + +# custom_progress_dialog library + + + + + + + + + + + +## Classes + +##### [CustomProgressDialog](../widgets_custom_progress_dialog/CustomProgressDialog-class.md) + + + +A progress dialogue which shows an activity indicator +spinning clockwise if there is internet connectivity. +Otherwise, it shows no-internet image and text. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_date_time_picker/customDatePicker.md b/talawa-mobile-docs/widgets_date_time_picker/customDatePicker.md new file mode 100644 index 000000000..be6e41a57 --- /dev/null +++ b/talawa-mobile-docs/widgets_date_time_picker/customDatePicker.md @@ -0,0 +1,51 @@ + + + +# customDatePicker function + + + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html)> customDatePicker +({required [DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html) initialDate}) + + + + + +

Shows a dialog containing a Material Design date picker.

+

The returned Future resolves to the date selected by the user when the user confirms the dialog. +If the user cancels the dialog, null is returned.

+ + + +## Implementation + +```dart +Future customDatePicker({required DateTime initialDate}) async { + // showDatePicker which shows a material design date range picker used to select a range of dates. + 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; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_date_time_picker/customTimePicker.md b/talawa-mobile-docs/widgets_date_time_picker/customTimePicker.md new file mode 100644 index 000000000..dbef8ac94 --- /dev/null +++ b/talawa-mobile-docs/widgets_date_time_picker/customTimePicker.md @@ -0,0 +1,51 @@ + + + +# customTimePicker function + + + + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html)> customTimePicker +({required [TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html) initialTime}) + + + + + +

Shows a dialog containing a material design time picker.

+

The returned Future resolves to the time selected by the user when the user closes the dialog. +If the user cancels the dialog, null is returned.

+ + + +## Implementation + +```dart +Future customTimePicker({required TimeOfDay initialTime}) async { + // showTimePicker which shows a material design time range picker used to select a range of times. + // Click ![here](https://api.flutter.dev/flutter/material/showTimePicker.html) to know more. + final TimeOfDay? pickedTime = await showTimePicker( + context: navigationService.navigatorKey.currentContext!, + initialTime: initialTime, + ); + + if (pickedTime != null && pickedTime != initialTime) { + return pickedTime; + } + return initialTime; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_date_time_picker/widgets_date_time_picker-library.md b/talawa-mobile-docs/widgets_date_time_picker/widgets_date_time_picker-library.md new file mode 100644 index 000000000..2a02458bf --- /dev/null +++ b/talawa-mobile-docs/widgets_date_time_picker/widgets_date_time_picker-library.md @@ -0,0 +1,49 @@ + + + + +# date_time_picker library + + + + + + + + + + + + + + + + +## Functions + +##### [customDatePicker](../widgets_date_time_picker/customDatePicker.md)({required [DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html) initialDate}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[DateTime](https://api.flutter.dev/flutter/dart-core/DateTime-class.html)> + + + +Shows a dialog containing a Material Design date picker. + + + + +##### [customTimePicker](../widgets_date_time_picker/customTimePicker.md)({required [TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html) initialTime}) [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[TimeOfDay](https://api.flutter.dev/flutter/material/TimeOfDay-class.html)> + + + +Shows a dialog containing a material design time picker. + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_card/EventCard-class.md b/talawa-mobile-docs/widgets_event_card/EventCard-class.md new file mode 100644 index 000000000..a823fc9c5 --- /dev/null +++ b/talawa-mobile-docs/widgets_event_card/EventCard-class.md @@ -0,0 +1,225 @@ + + + +# EventCard class + + + + + + + + + +

This class returns the EventCard widget.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- EventCard + + + + + + + + +## Constructors + +[EventCard](../widgets_event_card/EventCard/EventCard.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [Event](../models_events_event_model/Event-class.md) event, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? eventTitleHighlightedText, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? eventTitleNormalText, required [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isSearchItem}) + + _const_ + + +## Properties + +##### [event](../widgets_event_card/EventCard/event.md) → [Event](../models_events_event_model/Event-class.md) + + + + +_final_ + + + +##### [eventTitleHighlightedText](../widgets_event_card/EventCard/eventTitleHighlightedText.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_final_ + + + +##### [eventTitleNormalText](../widgets_event_card/EventCard/eventTitleNormalText.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [isSearchItem](../widgets_event_card/EventCard/isSearchItem.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_final_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_event_card/EventCard/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_card/EventCard/EventCard.md b/talawa-mobile-docs/widgets_event_card/EventCard/EventCard.md new file mode 100644 index 000000000..f6421729a --- /dev/null +++ b/talawa-mobile-docs/widgets_event_card/EventCard/EventCard.md @@ -0,0 +1,35 @@ + + + +# EventCard constructor + + + + + + +const +EventCard({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [Event](../../models_events_event_model/Event-class.md) event, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? eventTitleHighlightedText, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? eventTitleNormalText, required [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isSearchItem}) + + + + + +## Implementation + +```dart +const EventCard({ + Key? key, + required this.event, + this.eventTitleHighlightedText, + this.eventTitleNormalText, + required this.isSearchItem, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_card/EventCard/build.md b/talawa-mobile-docs/widgets_event_card/EventCard/build.md new file mode 100644 index 000000000..feddc8335 --- /dev/null +++ b/talawa-mobile-docs/widgets_event_card/EventCard/build.md @@ -0,0 +1,336 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + final bool isRegistered = event.isRegistered ?? false; + return Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Stack( + children: [ + Card( + shape: RoundedRectangleBorder( + side: + isRegistered && userConfig.currentUser.id != event.creator!.id + ? BorderSide( + color: Theme.of(context).colorScheme.secondary, + width: SizeConfig.screenWidth! * 0.008, + ) + : BorderSide.none, + ), + elevation: 3, + color: Theme.of(context).primaryColor, + child: Column( + children: [ + AspectRatio( + aspectRatio: 2.5, + child: Container( + height: SizeConfig.screenHeight! * 0.11, + width: double.infinity, + decoration: BoxDecoration( + color: Colors.grey.withOpacity(0.3), + image: const DecorationImage( + fit: BoxFit.fitWidth, + alignment: FractionalOffset.topCenter, + image: NetworkImage( + 'https://picsum.photos/id/1022/200/300', + ), + ), + ), + child: ClipRRect( + child: BackdropFilter( + filter: ImageFilter.blur(sigmaX: 5, sigmaY: 5), + child: Container( + decoration: BoxDecoration( + color: Colors.white.withOpacity(0.0), + ), + ), + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(10), + child: Column( + children: [ + Row( + children: [ + SizedBox( + width: SizeConfig.screenWidth! * 0.48, + child: isSearchItem + ? RichText( + text: TextSpan( + text: eventTitleHighlightedText, + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith( + fontWeight: FontWeight.bold, + ), + children: [ + TextSpan( + text: eventTitleNormalText, + style: Theme.of(context) + .textTheme + .headlineSmall! + .copyWith( + color: Colors.grey, + ), + ) + ], + ), + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + ) + : Text( + event.title!, + style: Theme.of(context) + .textTheme + .headlineSmall, + ), + ), + const Spacer(), + const Icon( + Icons.calendar_today, + size: 13, + ), + const Spacer(), + Text( + "${event.startDate!} - ${event.endDate!}", + style: Theme.of(context).textTheme.bodySmall, + ) + ], + ), + 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.bodySmall, + ), + 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.bodySmall, + ), + ) + ], + ), + 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.bodySmall, + overflow: TextOverflow.ellipsis, + textAlign: TextAlign.left, + maxLines: 3, + ), + ), + const Icon( + Icons.chevron_right, + ), + ], + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.007, + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + userConfig.currentUser.id == event.creator!.id + ? Row( + children: [ + Icon( + Icons.verified, + size: 13, + color: Theme.of(context) + .colorScheme + .secondary, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.013, + ), + Text( + AppLocalizations.of(context)! + .strictTranslate('Created'), + style: + Theme.of(context).textTheme.bodySmall, + ), + ], + ) + : const SizedBox(), + const Spacer(), + 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.bodySmall, + ) + : Text( + AppLocalizations.of(context)! + .strictTranslate('private'), + style: Theme.of(context).textTheme.bodySmall, + ), + 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.bodySmall, + ) + : Text( + (event.registrants?.length ?? 0).toString(), + style: Theme.of(context).textTheme.bodySmall, + ) + ], + ), + ], + ), + ) + ], + ), + ), + Positioned( + top: SizeConfig.screenHeight! * 0.007, + right: SizeConfig.screenWidth! * 0.013, + child: isRegistered && + userConfig.currentUser.id != event.creator!.id + ? DecoratedBox( + decoration: BoxDecoration( + color: Theme.of(context).colorScheme.secondary, + borderRadius: const BorderRadius.only( + bottomLeft: Radius.circular(15), + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Center( + child: Text( + AppLocalizations.of(context)! + .strictTranslate("Registered"), + style: + Theme.of(context).textTheme.titleLarge!.copyWith( + color: Colors.white, + fontWeight: FontWeight.w700, + ), + ), + ), + ), + ) + : const SizedBox(), + ) + ], + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_card/EventCard/event.md b/talawa-mobile-docs/widgets_event_card/EventCard/event.md new file mode 100644 index 000000000..9714bc41a --- /dev/null +++ b/talawa-mobile-docs/widgets_event_card/EventCard/event.md @@ -0,0 +1,32 @@ + + + +# event property + + + + + + + +[Event](../../models_events_event_model/Event-class.md) event + +_final_ + + + + + + +## Implementation + +```dart +final Event event; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_card/EventCard/eventTitleHighlightedText.md b/talawa-mobile-docs/widgets_event_card/EventCard/eventTitleHighlightedText.md new file mode 100644 index 000000000..237bbbb81 --- /dev/null +++ b/talawa-mobile-docs/widgets_event_card/EventCard/eventTitleHighlightedText.md @@ -0,0 +1,32 @@ + + + +# eventTitleHighlightedText property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? eventTitleHighlightedText + +_final_ + + + + + + +## Implementation + +```dart +final String? eventTitleHighlightedText; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_card/EventCard/eventTitleNormalText.md b/talawa-mobile-docs/widgets_event_card/EventCard/eventTitleNormalText.md new file mode 100644 index 000000000..bbc1edc6c --- /dev/null +++ b/talawa-mobile-docs/widgets_event_card/EventCard/eventTitleNormalText.md @@ -0,0 +1,32 @@ + + + +# eventTitleNormalText property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? eventTitleNormalText + +_final_ + + + + + + +## Implementation + +```dart +final String? eventTitleNormalText; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_card/EventCard/isSearchItem.md b/talawa-mobile-docs/widgets_event_card/EventCard/isSearchItem.md new file mode 100644 index 000000000..463d3fb1e --- /dev/null +++ b/talawa-mobile-docs/widgets_event_card/EventCard/isSearchItem.md @@ -0,0 +1,32 @@ + + + +# isSearchItem property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) isSearchItem + +_final_ + + + + + + +## Implementation + +```dart +final bool isSearchItem; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_card/widgets_event_card-library.md b/talawa-mobile-docs/widgets_event_card/widgets_event_card-library.md new file mode 100644 index 000000000..36714b8fc --- /dev/null +++ b/talawa-mobile-docs/widgets_event_card/widgets_event_card-library.md @@ -0,0 +1,38 @@ + + + + +# event_card library + + + + + + + + + + + +## Classes + +##### [EventCard](../widgets_event_card/EventCard-class.md) + + + +This class returns the EventCard widget. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile-class.md b/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile-class.md new file mode 100644 index 000000000..4e7838b6e --- /dev/null +++ b/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile-class.md @@ -0,0 +1,225 @@ + + + +# DateTimeTile class + + + + + + + + + +

Returns a widget tile(item) for displaying date and time.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- DateTimeTile + + + + + + + + +## Constructors + +[DateTimeTile](../widgets_event_date_time_tile/DateTimeTile/DateTimeTile.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) date, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) time, required [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) setDate, required [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) setTime}) + + _const_ + + +## Properties + +##### [date](../widgets_event_date_time_tile/DateTimeTile/date.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [setDate](../widgets_event_date_time_tile/DateTimeTile/setDate.md) → [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) + + + + +_final_ + + + +##### [setTime](../widgets_event_date_time_tile/DateTimeTile/setTime.md) → [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) + + + + +_final_ + + + +##### [time](../widgets_event_date_time_tile/DateTimeTile/time.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + + + +## Methods + +##### [build](../widgets_event_date_time_tile/DateTimeTile/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/DateTimeTile.md b/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/DateTimeTile.md new file mode 100644 index 000000000..9a1255317 --- /dev/null +++ b/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/DateTimeTile.md @@ -0,0 +1,35 @@ + + + +# DateTimeTile constructor + + + + + + +const +DateTimeTile({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) date, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) time, required [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) setDate, required [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) setTime}) + + + + + +## Implementation + +```dart +const DateTimeTile({ + Key? key, + required this.date, + required this.time, + required this.setDate, + required this.setTime, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/build.md b/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/build.md new file mode 100644 index 000000000..ab4c1078f --- /dev/null +++ b/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/build.md @@ -0,0 +1,120 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return Container( + color: Theme.of(context).colorScheme.primaryContainer, + height: SizeConfig.screenHeight! * 0.068, + width: double.infinity, + child: Padding( + padding: + EdgeInsets.symmetric(horizontal: SizeConfig.screenWidth! * 0.083), + child: Row( + children: [ + const Icon( + Icons.calendar_today, + color: Color(0xff524F4F), + size: 19, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.045, + ), + InkWell( + key: const Key('EventDateTimeTileDate'), + onTap: () async { + setDate(); + }, + child: Text( + date, + style: const TextStyle(fontSize: 16), + ), + ), + const Spacer(), + const Icon( + Icons.schedule, + color: Color(0xff524F4F), + size: 19, + ), + SizedBox( + width: SizeConfig.screenWidth! * 0.045, + ), + InkWell( + key: const Key('EventDateTimeTileTime'), + onTap: () async { + setTime(); + }, + child: Text( + time, + style: const TextStyle(fontSize: 16), + ), + ), + ], + ), + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/date.md b/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/date.md new file mode 100644 index 000000000..5c32ea33f --- /dev/null +++ b/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/date.md @@ -0,0 +1,32 @@ + + + +# date property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) date + +_final_ + + + + + + +## Implementation + +```dart +final String date; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/setDate.md b/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/setDate.md new file mode 100644 index 000000000..b07f5810d --- /dev/null +++ b/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/setDate.md @@ -0,0 +1,32 @@ + + + +# setDate property + + + + + + + +[Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) setDate + +_final_ + + + + + + +## Implementation + +```dart +final Function setDate; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/setTime.md b/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/setTime.md new file mode 100644 index 000000000..8ede21b12 --- /dev/null +++ b/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/setTime.md @@ -0,0 +1,32 @@ + + + +# setTime property + + + + + + + +[Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) setTime + +_final_ + + + + + + +## Implementation + +```dart +final Function setTime; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/time.md b/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/time.md new file mode 100644 index 000000000..ebc301185 --- /dev/null +++ b/talawa-mobile-docs/widgets_event_date_time_tile/DateTimeTile/time.md @@ -0,0 +1,32 @@ + + + +# time property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) time + +_final_ + + + + + + +## Implementation + +```dart +final String time; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_date_time_tile/widgets_event_date_time_tile-library.md b/talawa-mobile-docs/widgets_event_date_time_tile/widgets_event_date_time_tile-library.md new file mode 100644 index 000000000..c425fb7a5 --- /dev/null +++ b/talawa-mobile-docs/widgets_event_date_time_tile/widgets_event_date_time_tile-library.md @@ -0,0 +1,38 @@ + + + + +# event_date_time_tile library + + + + + + + + + + + +## Classes + +##### [DateTimeTile](../widgets_event_date_time_tile/DateTimeTile-class.md) + + + +Returns a widget tile(item) for displaying date and time. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_search_delegate/EventSearch-class.md b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch-class.md new file mode 100644 index 000000000..1b25b05d5 --- /dev/null +++ b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch-class.md @@ -0,0 +1,279 @@ + + + +# EventSearch class + + + + + + + + + +

This class returns a list of the events which match the search query.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [SearchDelegate](https://api.flutter.dev/flutter/material/SearchDelegate-class.html)<[Event](../models_events_event_model/Event-class.md)> +- EventSearch + + + + + + + + +## Constructors + +[EventSearch](../widgets_event_search_delegate/EventSearch/EventSearch.md) ({required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Event](../models_events_event_model/Event-class.md)> eventList, required [ExploreEventsViewModel](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md) exploreEventsViewModel}) + + + + +## Properties + +##### [eventList](../widgets_event_search_delegate/EventSearch/eventList.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Event](../models_events_event_model/Event-class.md)> + + + + +_final_ + + + +##### [exploreEventsViewModel](../widgets_event_search_delegate/EventSearch/exploreEventsViewModel.md) ↔ [ExploreEventsViewModel](../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md) + + + + +_read / write_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [keyboardType](https://api.flutter.dev/flutter/material/SearchDelegate/keyboardType.html) → [TextInputType](https://api.flutter.dev/flutter/services/TextInputType-class.html)? + + + +The type of action button to use for the keyboard. +_finalinherited_ + + + +##### [query](https://api.flutter.dev/flutter/material/SearchDelegate/query.html) ↔ [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +The current query string shown in the AppBar. +_read / writeinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [searchFieldDecorationTheme](https://api.flutter.dev/flutter/material/SearchDelegate/searchFieldDecorationTheme.html) → [InputDecorationTheme](https://api.flutter.dev/flutter/material/InputDecorationTheme-class.html)? + + + +The InputDecorationTheme used to configure the search field's visuals. +_finalinherited_ + + + +##### [searchFieldLabel](https://api.flutter.dev/flutter/material/SearchDelegate/searchFieldLabel.html) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + +The hint text that is shown in the search field when it is empty. +_finalinherited_ + + + +##### [searchFieldStyle](https://api.flutter.dev/flutter/material/SearchDelegate/searchFieldStyle.html) → [TextStyle](https://api.flutter.dev/flutter/painting/TextStyle-class.html)? + + + +The style of the searchFieldLabel. +_finalinherited_ + + + +##### [textInputAction](https://api.flutter.dev/flutter/material/SearchDelegate/textInputAction.html) → [TextInputAction](https://api.flutter.dev/flutter/services/TextInputAction.html) + + + +The text input action configuring the soft keyboard to a particular action +button. +_finalinherited_ + + + +##### [transitionAnimation](https://api.flutter.dev/flutter/material/SearchDelegate/transitionAnimation.html) → [Animation](https://api.flutter.dev/flutter/animation/Animation-class.html)<[double](https://api.flutter.dev/flutter/dart-core/double-class.html)> + + + +Animation triggered when the search pages fades in or out. +_read-onlyinherited_ + + + + + +## Methods + +##### [appBarTheme](https://api.flutter.dev/flutter/material/SearchDelegate/appBarTheme.html)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [ThemeData](https://api.flutter.dev/flutter/material/ThemeData-class.html) + + + +The theme used to configure the search page. +_inherited_ + + + +##### [buildActions](../widgets_event_search_delegate/EventSearch/buildActions.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html)> + + + +Widgets to display after the search query in the AppBar. +_override_ + + + +##### [buildBottom](https://api.flutter.dev/flutter/material/SearchDelegate/buildBottom.html)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [PreferredSizeWidget](https://api.flutter.dev/flutter/widgets/PreferredSizeWidget-class.html)? + + + +Widget to display across the bottom of the AppBar. +_inherited_ + + + +##### [buildLeading](../widgets_event_search_delegate/EventSearch/buildLeading.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +A widget to display before the current query in the AppBar. +_override_ + + + +##### [buildResults](../widgets_event_search_delegate/EventSearch/buildResults.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +The results shown after the user submits a search from the search page. +_override_ + + + +##### [buildSuggestions](../widgets_event_search_delegate/EventSearch/buildSuggestions.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Suggestions shown in the body of the search page while the user types a +query into the search field. +_override_ + + + +##### [buildSuggestionsSucess](../widgets_event_search_delegate/EventSearch/buildSuggestionsSucess.md)([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Event](../models_events_event_model/Event-class.md)> suggestions) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + + + + + + +##### [close](https://api.flutter.dev/flutter/material/SearchDelegate/close.html)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context, [Event](../models_events_event_model/Event-class.md) result) void + + + +Closes the search page and returns to the underlying route. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [showResults](https://api.flutter.dev/flutter/material/SearchDelegate/showResults.html)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) void + + + +Transition from the suggestions returned by buildSuggestions to the +query results returned by buildResults. +_inherited_ + + + +##### [showSuggestions](https://api.flutter.dev/flutter/material/SearchDelegate/showSuggestions.html)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) void + + + +Transition from showing the results returned by buildResults to showing +the suggestions returned by buildSuggestions. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/dart-core/Object/toString.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/EventSearch.md b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/EventSearch.md new file mode 100644 index 000000000..63dfbfee0 --- /dev/null +++ b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/EventSearch.md @@ -0,0 +1,29 @@ + + + +# EventSearch constructor + + + + + + + +EventSearch({required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Event](../../models_events_event_model/Event-class.md)> eventList, required [ExploreEventsViewModel](../../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md) exploreEventsViewModel}) + + + + + +## Implementation + +```dart +EventSearch({required this.eventList, required this.exploreEventsViewModel}); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildActions.md b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildActions.md new file mode 100644 index 000000000..955593cee --- /dev/null +++ b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildActions.md @@ -0,0 +1,57 @@ + + + +# buildActions method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html)> buildActions +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Widgets to display after the search query in the AppBar.

+

If the query is not empty, this should typically contain a button to +clear the query and show the suggestions again (via showSuggestions) if +the results are currently shown.

+

Returns null if no widget should be shown.

+

See also:

+
    +
  • AppBar.actions, the intended use for the return value of this method.
  • +
+ + + +## Implementation + +```dart +@override +List buildActions(BuildContext context) { + /// Returns an icon button which closes the search page and returns + /// to the underlying route if the query is empty. Otherwise it sets the + /// query empty. + return [ + IconButton( + onPressed: () { + query.isNotEmpty ? query = '' : close(context, eventList.first); + }, + icon: const Icon(Icons.clear), + ) + ]; +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildLeading.md b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildLeading.md new file mode 100644 index 000000000..932c3165c --- /dev/null +++ b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildLeading.md @@ -0,0 +1,55 @@ + + + +# buildLeading method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) buildLeading +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

A widget to display before the current query in the AppBar.

+

Typically an IconButton configured with a BackButtonIcon that exits +the search with close. One can also use an AnimatedIcon driven by +transitionAnimation, which animates from e.g. a hamburger menu to the +back button as the search overlay fades in.

+

Returns null if no widget should be shown.

+

See also:

+
    +
  • AppBar.leading, the intended use for the return value of this method.
  • +
+ + + +## Implementation + +```dart +@override +Widget buildLeading(BuildContext context) { + /// Returns an icon button which closes the search page and returns + /// to the underlying route + return IconButton( + onPressed: () { + close(context, eventList.first); + }, + icon: const Icon(Icons.arrow_back), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildResults.md b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildResults.md new file mode 100644 index 000000000..f2746447d --- /dev/null +++ b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildResults.md @@ -0,0 +1,48 @@ + + + +# buildResults method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) buildResults +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

The results shown after the user submits a search from the search page.

+

The current value of query can be used to determine what the user +searched for.

+

This method might be applied more than once to the same query. +If your buildResults method is computationally expensive, you may want +to cache the search results for one or more queries.

+

Typically, this method returns a ListView with the search results. +When the user taps on a particular search result, close should be called +with the selected result as argument. This will close the search page and +communicate the result back to the initial caller of showSearch.

+ + + +## Implementation + +```dart +@override +Widget buildResults(BuildContext context) { + return Container(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildSuggestions.md b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildSuggestions.md new file mode 100644 index 000000000..214844f00 --- /dev/null +++ b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildSuggestions.md @@ -0,0 +1,57 @@ + + + +# buildSuggestions method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) buildSuggestions +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Suggestions shown in the body of the search page while the user types a +query into the search field.

+

The delegate method is called whenever the content of query changes. +The suggestions should be based on the current query string. If the query +string is empty, it is good practice to show suggested queries based on +past queries or the current context.

+

Usually, this method will return a ListView with one ListTile per +suggestion. When ListTile.onTap is called, query should be updated +with the corresponding suggestion and the results page should be shown +by calling showResults.

+ + + +## Implementation + +```dart +@override +Widget buildSuggestions(BuildContext context) { + /// Returns a scrollable list through "buildSuggestionsSuccess" function. + /// where() method Returns a new lazy Iterable with all elements that satisfy the predicate test. + /// toList( ) method is used to convert an Iterable to a List. + /// toLowerCase() converts all characters in a string to lower case. + final suggestions = eventList.where((event) { + final eventLowerCase = event.title!.toLowerCase(); + final queryLowerCase = query.toLowerCase(); + return eventLowerCase.startsWith(queryLowerCase); + }).toList(); + return buildSuggestionsSucess(suggestions); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildSuggestionsSucess.md b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildSuggestionsSucess.md new file mode 100644 index 000000000..f4ebd1ef3 --- /dev/null +++ b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/buildSuggestionsSucess.md @@ -0,0 +1,71 @@ + + + +# buildSuggestionsSucess method + + + + + + + + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) buildSuggestionsSucess +([List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Event](../../models_events_event_model/Event-class.md)> suggestions) + + + + + + + + +## Implementation + +```dart +Widget buildSuggestionsSucess(List suggestions) { + /// Takes a List of Events as parameter which is passed by the "buildSuggestions" function. + /// Returns a SingleChildScrollView of the events from the list. + /// SingleChildScrollView is box in which a single widget can be scrolled. + return SingleChildScrollView( + child: ListView.builder( + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: suggestions.length, + itemBuilder: (BuildContext context, int index) { + final highlightedText = + suggestions[index].title!.substring(0, query.length); + final normalText = suggestions[index].title!.substring(query.length); + + /// Returns a widget that detects gestures. + /// Defers to its child for its sizing behavior. + /// Navigates to the screen with the event information. + return GestureDetector( + onTap: () { + navigationService.pushScreen( + "/eventInfo", + arguments: { + "event": suggestions[index], + "exploreEventViewModel": exploreEventsViewModel + }, + ); + }, + child: EventCard( + event: suggestions[index], + isSearchItem: true, + eventTitleHighlightedText: highlightedText, + eventTitleNormalText: normalText, + ), + ); + }, + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/eventList.md b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/eventList.md new file mode 100644 index 000000000..9fb10e4c0 --- /dev/null +++ b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/eventList.md @@ -0,0 +1,32 @@ + + + +# eventList property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Event](../../models_events_event_model/Event-class.md)> eventList + +_final_ + + + + + + +## Implementation + +```dart +final List eventList; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/exploreEventsViewModel.md b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/exploreEventsViewModel.md new file mode 100644 index 000000000..3ca7e2f79 --- /dev/null +++ b/talawa-mobile-docs/widgets_event_search_delegate/EventSearch/exploreEventsViewModel.md @@ -0,0 +1,32 @@ + + + +# exploreEventsViewModel property + + + + + + + +[ExploreEventsViewModel](../../view_model_after_auth_view_models_event_view_models_explore_events_view_model/ExploreEventsViewModel-class.md) exploreEventsViewModel + +_read / write_ + + + + + + +## Implementation + +```dart +ExploreEventsViewModel exploreEventsViewModel; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_event_search_delegate/widgets_event_search_delegate-library.md b/talawa-mobile-docs/widgets_event_search_delegate/widgets_event_search_delegate-library.md new file mode 100644 index 000000000..100e00d1b --- /dev/null +++ b/talawa-mobile-docs/widgets_event_search_delegate/widgets_event_search_delegate-library.md @@ -0,0 +1,38 @@ + + + + +# event_search_delegate library + + + + + + + + + + + +## Classes + +##### [EventSearch](../widgets_event_search_delegate/EventSearch-class.md) + + + +This class returns a list of the events which match the search query. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_from_palisadoes/FromPalisadoes-class.md b/talawa-mobile-docs/widgets_from_palisadoes/FromPalisadoes-class.md new file mode 100644 index 000000000..29596a85e --- /dev/null +++ b/talawa-mobile-docs/widgets_from_palisadoes/FromPalisadoes-class.md @@ -0,0 +1,189 @@ + + + +# FromPalisadoes class + + + + + + + + + +

This class generates the text "From Palisadoes" in a custom way.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- FromPalisadoes + + + + + + + + +## Constructors + +[FromPalisadoes](../widgets_from_palisadoes/FromPalisadoes/FromPalisadoes.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_from_palisadoes/FromPalisadoes/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_from_palisadoes/FromPalisadoes/FromPalisadoes.md b/talawa-mobile-docs/widgets_from_palisadoes/FromPalisadoes/FromPalisadoes.md new file mode 100644 index 000000000..2932b6ed5 --- /dev/null +++ b/talawa-mobile-docs/widgets_from_palisadoes/FromPalisadoes/FromPalisadoes.md @@ -0,0 +1,29 @@ + + + +# FromPalisadoes constructor + + + + + + +const +FromPalisadoes({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const FromPalisadoes({Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_from_palisadoes/FromPalisadoes/build.md b/talawa-mobile-docs/widgets_from_palisadoes/FromPalisadoes/build.md new file mode 100644 index 000000000..e4b6eb4cf --- /dev/null +++ b/talawa-mobile-docs/widgets_from_palisadoes/FromPalisadoes/build.md @@ -0,0 +1,106 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return Column( + children: [ + // Customizing the word "from". + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + // This method is called for localized text. + AppLocalizations.of(context)!.strictTranslate('from'), + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ), + SizedBox( + height: SizeConfig.blockSizeHorizontal, + ), + // Customizing the word "Palisadoes". + Row( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + 'PALISADOES', + style: Theme.of(context) + .textTheme + .titleSmall! + .copyWith(fontWeight: FontWeight.w700), + ), + ], + ), + SizedBox( + height: SizeConfig.blockSizeHorizontal! * 5, + ), + ], + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_from_palisadoes/widgets_from_palisadoes-library.md b/talawa-mobile-docs/widgets_from_palisadoes/widgets_from_palisadoes-library.md new file mode 100644 index 000000000..f0fec4648 --- /dev/null +++ b/talawa-mobile-docs/widgets_from_palisadoes/widgets_from_palisadoes-library.md @@ -0,0 +1,38 @@ + + + + +# from_palisadoes library + + + + + + + + + + + +## Classes + +##### [FromPalisadoes](../widgets_from_palisadoes/FromPalisadoes-class.md) + + + +This class generates the text "From Palisadoes" in a custom way. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_invite_child/iconButton.md b/talawa-mobile-docs/widgets_invite_child/iconButton.md new file mode 100644 index 000000000..69577b9a8 --- /dev/null +++ b/talawa-mobile-docs/widgets_invite_child/iconButton.md @@ -0,0 +1,51 @@ + + + +# iconButton function + + + + + + + + + + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) iconButton +([String](https://api.flutter.dev/flutter/dart-core/String-class.html) key, [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) icon, [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) onTap) + + + + + +

This function is for debugging purposes. +It prints "tapped" in the console for the developer to know that the button was tapped.

+ + + +## Implementation + +```dart +Widget iconButton(String key, Widget icon, Function onTap) { + return Stack( + children: [ + IconButton( + key: Key(key), + onPressed: () { + print('tapped'); + onTap(); + }, + icon: icon, + ), + ], + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_invite_child/invite.md b/talawa-mobile-docs/widgets_invite_child/invite.md new file mode 100644 index 000000000..2b55a998b --- /dev/null +++ b/talawa-mobile-docs/widgets_invite_child/invite.md @@ -0,0 +1,122 @@ + + + +# invite function + + + + + + + + + + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) invite +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + + + + + +

This widget gives us various options to invite someone to an organization. +We can use QR code scanner, social media platforms like twitter, whatsapp, telegram and many more.

+ + + +## Implementation + +```dart +Widget invite(BuildContext context) { + _appLanguageService.initialize(); + + final String url = + 'https://cyberwake.github.io/applink/invite?selectLang=${_appLanguageService.appLocal.languageCode}&setUrl=${GraphqlConfig.orgURI}&selectOrg=${userConfig.currentOrg.id!}'; + final String qrData = + '${GraphqlConfig.orgURI}?orgid=${userConfig.currentOrg.id!}'; + + // print(url); + // print(qrData); + + return Column( + mainAxisSize: MainAxisSize.max, + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + //Scan the below given QR code to join the organization. + QrImage( + key: const Key("QRcode"), + data: qrData, + version: QrVersions.auto, + size: 200.0, + foregroundColor: Colors.black, + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.08, + ), + Text( + 'Scan the QR to join ${userConfig.currentOrg.name}', + style: const TextStyle(color: Colors.black), + ), + SizedBox( + height: SizeConfig.screenHeight! * 0.02, + ), + //Tap on the Twitter icon to join the organization through Twitter. + Row( + mainAxisAlignment: MainAxisAlignment.spaceEvenly, + mainAxisSize: MainAxisSize.min, + children: [ + iconButton( + "Twitter", + const FaIcon( + FontAwesomeIcons.twitter, + size: 35, + color: Color(0xFF1DA1F2), + ), + () async => SocialShare.shareTwitter('Join us', url: url), + ), + //Tap on the Whatsapp icon to join the organization through Whatsapp. + iconButton( + "WhatsApp", + CustomPaint( + size: const Size( + 50, + 50 * 1.004, + ), //You can Replace [WIDTH] with your desired width for Custom Paint and height will be calculated automatically + painter: WhatsappLogo(), + ), + () async => SocialShare.shareWhatsapp(url), + ), + iconButton( + "Telegram", + CustomPaint( + size: Size( + 45, + (45 * 1).toDouble(), + ), //You can Replace [WIDTH] with your desired width for Custom Paint and height will be calculated automatically + painter: TelegramLogo(), + ), + () async => SocialShare.shareTelegram(url), + ), + iconButton( + "Alt", + const FaIcon( + FontAwesomeIcons.shareNodes, + size: 30, + color: Color(0xff40c351), + ), + () async => SocialShare.shareOptions(url), + ), + ], + ) + ], + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_invite_child/widgets_invite_child-library.md b/talawa-mobile-docs/widgets_invite_child/widgets_invite_child-library.md new file mode 100644 index 000000000..dfc730d90 --- /dev/null +++ b/talawa-mobile-docs/widgets_invite_child/widgets_invite_child-library.md @@ -0,0 +1,51 @@ + + + + +# invite_child library + + + + + + + + + + + + + + + + +## Functions + +##### [iconButton](../widgets_invite_child/iconButton.md)([String](https://api.flutter.dev/flutter/dart-core/String-class.html) key, [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) icon, [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) onTap) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +This function is for debugging purposes. +It prints "tapped" in the console for the developer to know that the button was tapped. + + + + +##### [invite](../widgets_invite_child/invite.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +This widget gives us various options to invite someone to an organization. +We can use QR code scanner, social media platforms like twitter, whatsapp, telegram and many more. + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_lang_switch/LanguageTile-class.md b/talawa-mobile-docs/widgets_lang_switch/LanguageTile-class.md new file mode 100644 index 000000000..436640611 --- /dev/null +++ b/talawa-mobile-docs/widgets_lang_switch/LanguageTile-class.md @@ -0,0 +1,189 @@ + + + +# LanguageTile class + + + + + + + + + +

This widget enables language switch for "internationalizing our app".

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- LanguageTile + + + + + + + + +## Constructors + +[LanguageTile](../widgets_lang_switch/LanguageTile/LanguageTile.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_lang_switch/LanguageTile/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_lang_switch/LanguageTile/LanguageTile.md b/talawa-mobile-docs/widgets_lang_switch/LanguageTile/LanguageTile.md new file mode 100644 index 000000000..34f40dc1f --- /dev/null +++ b/talawa-mobile-docs/widgets_lang_switch/LanguageTile/LanguageTile.md @@ -0,0 +1,29 @@ + + + +# LanguageTile constructor + + + + + + +const +LanguageTile({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const LanguageTile({Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_lang_switch/LanguageTile/build.md b/talawa-mobile-docs/widgets_lang_switch/LanguageTile/build.md new file mode 100644 index 000000000..71ec7fde9 --- /dev/null +++ b/talawa-mobile-docs/widgets_lang_switch/LanguageTile/build.md @@ -0,0 +1,97 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + //AppLanguage enables to set up localized values for each locale that our app supports. + //A locale is an identifier used to select a user's language and formatting preferences. + //This represents a Unicode Language Identifier (i.e. without Locale extensions), + //except variants are not supported. + return Consumer( + builder: (context, appLang, _) { + final Language userLanguage = languages.firstWhere( + (element) => element.langCode == appLang.appLocal.languageCode, + ); + return ListTile( + key: const Key('LanguageTile'), + contentPadding: EdgeInsets.zero, + title: + Text(AppLocalizations.of(context)!.strictTranslate("Language")), + trailing: TextButton( + key: const Key('LanguageSelector'), + onPressed: () { + navigationService.pushReplacementScreen( + '/selectLang', + arguments: '0', + ); + }, + child: Text(userLanguage.langName), + ), + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_lang_switch/widgets_lang_switch-library.md b/talawa-mobile-docs/widgets_lang_switch/widgets_lang_switch-library.md new file mode 100644 index 000000000..d09274809 --- /dev/null +++ b/talawa-mobile-docs/widgets_lang_switch/widgets_lang_switch-library.md @@ -0,0 +1,38 @@ + + + + +# lang_switch library + + + + + + + + + + + +## Classes + +##### [LanguageTile](../widgets_lang_switch/LanguageTile-class.md) + + + +This widget enables language switch for "internationalizing our app". + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile-class.md b/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile-class.md new file mode 100644 index 000000000..10202832b --- /dev/null +++ b/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile-class.md @@ -0,0 +1,219 @@ + + + +# MemberNameTile class + + + + + + + + + +

This widget returns a tile containing the name of the member. +Along with the name, there is a circle avatar which either contains +the image uploaded by the user or the first character of his/her name in +uppercase.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- MemberNameTile + + + + + + + + +## Constructors + +[MemberNameTile](../widgets_member_name_tile/MemberNameTile/MemberNameTile.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) userName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? userImage, required [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) onDelete}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [onDelete](../widgets_member_name_tile/MemberNameTile/onDelete.md) → [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [userImage](../widgets_member_name_tile/MemberNameTile/userImage.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? + + + + +_final_ + + + +##### [userName](../widgets_member_name_tile/MemberNameTile/userName.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + + + +## Methods + +##### [build](../widgets_member_name_tile/MemberNameTile/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/MemberNameTile.md b/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/MemberNameTile.md new file mode 100644 index 000000000..a2ae5471c --- /dev/null +++ b/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/MemberNameTile.md @@ -0,0 +1,34 @@ + + + +# MemberNameTile constructor + + + + + + +const +MemberNameTile({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) userName, [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? userImage, required [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) onDelete}) + + + + + +## Implementation + +```dart +const MemberNameTile({ + Key? key, + required this.userName, + this.userImage, + required this.onDelete, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/build.md b/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/build.md new file mode 100644 index 000000000..2a1b65b43 --- /dev/null +++ b/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/build.md @@ -0,0 +1,119 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 10, right: 5), + child: Container( + width: SizeConfig.screenWidth! * (0.3 + userName.length / 50), + height: SizeConfig.screenHeight! * 0.04, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(SizeConfig.screenHeight! * 0.02), + color: Theme.of(context).colorScheme.primaryContainer, + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + // Background is set with the image uploaded by the user. + userImage != null + ? CircleAvatar( + radius: SizeConfig.screenHeight! * 0.0201, + backgroundImage: NetworkImage(userImage!), + ) + // If the user has not uploaded his/her image, then a circle avatar is created. + // It has the first character of the user's name in uppercase and the default background color. + : CircleAvatar( + radius: SizeConfig.screenHeight! * 0.0201, + backgroundColor: Theme.of(context).colorScheme.secondary, + child: Text( + userName.substring(0, 1).toUpperCase(), + style: const TextStyle(color: Colors.white), + ), + ), + // The name of the member in text form. + Padding( + padding: const EdgeInsets.only(left: 5), + child: Text( + userName, + ), + ), + IconButton( + padding: EdgeInsets.zero, + onPressed: () => onDelete(), + icon: const Icon( + Icons.cancel_rounded, + color: Color(0xff524F4F), + size: 19, + ), + ) + ], + ), + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/onDelete.md b/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/onDelete.md new file mode 100644 index 000000000..043ff31fe --- /dev/null +++ b/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/onDelete.md @@ -0,0 +1,32 @@ + + + +# onDelete property + + + + + + + +[Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) onDelete + +_final_ + + + + + + +## Implementation + +```dart +final Function onDelete; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/userImage.md b/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/userImage.md new file mode 100644 index 000000000..a26568fc3 --- /dev/null +++ b/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/userImage.md @@ -0,0 +1,32 @@ + + + +# userImage property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? userImage + +_final_ + + + + + + +## Implementation + +```dart +final String? userImage; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/userName.md b/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/userName.md new file mode 100644 index 000000000..196794fd6 --- /dev/null +++ b/talawa-mobile-docs/widgets_member_name_tile/MemberNameTile/userName.md @@ -0,0 +1,32 @@ + + + +# userName property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) userName + +_final_ + + + + + + +## Implementation + +```dart +final String userName; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_member_name_tile/widgets_member_name_tile-library.md b/talawa-mobile-docs/widgets_member_name_tile/widgets_member_name_tile-library.md new file mode 100644 index 000000000..a2d0955cb --- /dev/null +++ b/talawa-mobile-docs/widgets_member_name_tile/widgets_member_name_tile-library.md @@ -0,0 +1,41 @@ + + + + +# member_name_tile library + + + + + + + + + + + +## Classes + +##### [MemberNameTile](../widgets_member_name_tile/MemberNameTile-class.md) + + + +This widget returns a tile containing the name of the member. +Along with the name, there is a circle avatar which either contains +the image uploaded by the user or the first character of his/her name in +uppercase. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_organization_list/OrganizationList-class.md b/talawa-mobile-docs/widgets_organization_list/OrganizationList-class.md new file mode 100644 index 000000000..11404fa29 --- /dev/null +++ b/talawa-mobile-docs/widgets_organization_list/OrganizationList-class.md @@ -0,0 +1,200 @@ + + + +# OrganizationList class + + + + + + + + + +

This class returns the OrganizationList widget.

+

which shows the list of all organizations exists in the URL. +This widget is used after the authentication.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- OrganizationList + + + + + + + + +## Constructors + +[OrganizationList](../widgets_organization_list/OrganizationList/OrganizationList.md) ({required [SelectOrganizationViewModel](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md) model, [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [model](../widgets_organization_list/OrganizationList/model.md) → [SelectOrganizationViewModel](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md) + + + +model is a type of SelectOrganizationViewModel which provides methods to handle the data for this component. +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_organization_list/OrganizationList/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_organization_list/OrganizationList/OrganizationList.md b/talawa-mobile-docs/widgets_organization_list/OrganizationList/OrganizationList.md new file mode 100644 index 000000000..d697ef284 --- /dev/null +++ b/talawa-mobile-docs/widgets_organization_list/OrganizationList/OrganizationList.md @@ -0,0 +1,29 @@ + + + +# OrganizationList constructor + + + + + + +const +OrganizationList({required [SelectOrganizationViewModel](../../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md) model, [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const OrganizationList({required this.model, Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_organization_list/OrganizationList/build.md b/talawa-mobile-docs/widgets_organization_list/OrganizationList/build.md new file mode 100644 index 000000000..b4c96e963 --- /dev/null +++ b/talawa-mobile-docs/widgets_organization_list/OrganizationList/build.md @@ -0,0 +1,185 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + final navigationServiceLocal = locator(); + model.organizations = []; + int noOfRefetch = 0; + return GraphQLProvider( + client: ValueNotifier(graphqlConfig.clientToQuery()), + child: Query( + options: QueryOptions( + document: gql(queries.fetchJoinInOrg), + variables: { + // fetch 15 items only, will fetch more when scrolling index is at the 3rd last item! + 'first': 15, + 'skip': 0, + }, + ), + builder: ( + QueryResult result, { + Future Function(FetchMoreOptions)? fetchMore, + Future Function()? refetch, + }) { + // checking for any errors, if true fetch again! + if (result.hasException) { + final isException = databaseFunctions.encounteredExceptionOrError( + result.exception!, + showSnackBar: noOfRefetch == 0, + ); + if (isException != null) { + if (isException) { + refetch!(); + noOfRefetch++; + } else { + refetch!(); + noOfRefetch++; + } + } + } else { + // If the result is still loading! + if (!result.isLoading) { + model.organizations = OrgInfo().fromJsonToList( + result.data!['organizationsConnection'] as List, + ); + } + + Timer(const Duration(seconds: TimeOuts.small), () { + if (model.organizations.isEmpty) { + navigationServiceLocal.showTalawaErrorDialog( + "No organizations found Please contact your admin", + MessageType.error, + ); + } + }); + return Scrollbar( + thumbVisibility: true, + interactive: true, + controller: model.allOrgController, + // Listview is a scrollable list of widgets arranged linearly. + child: ListView.separated( + controller: model.allOrgController, + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: result.isLoading + ? model.organizations.length + 1 + : model.organizations.length, + itemBuilder: (BuildContext context, int index) { + // If the index is at the end of the list! + if (index == model.organizations.length) { + // return the ListTile showing the loading icon! + return ListTile( + title: Center( + child: CupertinoActivityIndicator( + radius: SizeConfig.screenWidth! * 0.065, + ), + ), + ); + } + // If the index is at the 3rd last item in the organization list. + if (index == model.organizations.length - 3) { + // return VisibilityDetector and fetch more items in the list to show up! + return VisibilityDetector( + key: const Key('OrgSelItem'), + onVisibilityChanged: (VisibilityInfo info) { + if (info.visibleFraction > 0) { + model.fetchMoreHelper( + fetchMore!, + model.organizations, + ); + } + }, + child: CustomListTile( + index: index, + type: TileType.org, + orgInfo: model.organizations[index], + onTapOrgInfo: (item) => model.selectOrg(item), + key: Key('OrgSelItem$index'), + ), + ); + } + // return CustomeTile that shows a particular item in the list! + return CustomListTile( + index: index, + type: TileType.org, + orgInfo: model.organizations[index], + onTapOrgInfo: (item) => model.selectOrg(item), + key: Key('OrgSelItem$index'), + ); + }, + separatorBuilder: (BuildContext context, int index) { + return Container(); + }, + ), + ); + } + return Container(); + }, + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_organization_list/OrganizationList/model.md b/talawa-mobile-docs/widgets_organization_list/OrganizationList/model.md new file mode 100644 index 000000000..d08ac7e69 --- /dev/null +++ b/talawa-mobile-docs/widgets_organization_list/OrganizationList/model.md @@ -0,0 +1,33 @@ + + + +# model property + + + + + + + +[SelectOrganizationViewModel](../../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md) model + +_final_ + + + +

model is a type of SelectOrganizationViewModel which provides methods to handle the data for this component.

+ + + +## Implementation + +```dart +final SelectOrganizationViewModel model; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_organization_list/widgets_organization_list-library.md b/talawa-mobile-docs/widgets_organization_list/widgets_organization_list-library.md new file mode 100644 index 000000000..dfd618cfd --- /dev/null +++ b/talawa-mobile-docs/widgets_organization_list/widgets_organization_list-library.md @@ -0,0 +1,38 @@ + + + + +# organization_list library + + + + + + + + + + + +## Classes + +##### [OrganizationList](../widgets_organization_list/OrganizationList-class.md) + + + +This class returns the OrganizationList widget. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList-class.md b/talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList-class.md new file mode 100644 index 000000000..c7def0d5c --- /dev/null +++ b/talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList-class.md @@ -0,0 +1,199 @@ + + + +# OrganizationSearchList class + + + + + + + + + +

OrganizationSearchList class return a widget that shows all +the matching organizations searched on the search bar.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- OrganizationSearchList + + + + + + + + +## Constructors + +[OrganizationSearchList](../widgets_organization_search_list/OrganizationSearchList/OrganizationSearchList.md) ({required [SelectOrganizationViewModel](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md) model, [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [model](../widgets_organization_search_list/OrganizationSearchList/model.md) → [SelectOrganizationViewModel](../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_organization_search_list/OrganizationSearchList/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList/OrganizationSearchList.md b/talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList/OrganizationSearchList.md new file mode 100644 index 000000000..96e9f385d --- /dev/null +++ b/talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList/OrganizationSearchList.md @@ -0,0 +1,30 @@ + + + +# OrganizationSearchList constructor + + + + + + +const +OrganizationSearchList({required [SelectOrganizationViewModel](../../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md) model, [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const OrganizationSearchList({required this.model, Key? key}) + : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList/build.md b/talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList/build.md new file mode 100644 index 000000000..9ce460535 --- /dev/null +++ b/talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList/build.md @@ -0,0 +1,182 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return GraphQLProvider( + client: ValueNotifier(graphqlConfig.authClient()), + child: Query( + options: QueryOptions( + document: gql(Queries().fetchJoinInOrgByName), + variables: { + 'nameStartsWith': model.searchController.text, + // fetch 30 items only, will fetch more when scrolling index is at the 3rd last item! + 'first': 30, + 'skip': 0, + }, + ), + builder: ( + QueryResult result, { + Future Function(FetchMoreOptions)? fetchMore, + Future Function()? refetch, + }) { + // checking for any errors, if true fetch again! + if (result.hasException) { + final isException = databaseFunctions.encounteredExceptionOrError( + result.exception!, + showSnackBar: false, + ); + if (isException!) { + refetch!(); + } else { + refetch!(); + } + } else { + // If the result is still loading! + if (!result.isLoading) { + model.organizations = OrgInfo().fromJsonToList( + result.data!['organizationsConnection'] as List, + ); + } + // return the Scroll bar widget for scrolling down the organizations. + return Scrollbar( + thumbVisibility: true, + interactive: true, + controller: model.controller, + // Listview is a scrollable list of widgets arranged linearly. + child: ListView.separated( + controller: model.controller, + padding: EdgeInsets.zero, + shrinkWrap: true, + itemCount: result.isLoading + ? model.organizations.length + 1 + : model.organizations.length, + itemBuilder: (BuildContext context, int index) { + // If the index is at the end of the list! + if (index == model.organizations.length) { + // return the ListTile showing the loading icon! + return ListTile( + title: Center( + child: CupertinoActivityIndicator( + radius: SizeConfig.screenWidth! * 0.065, + ), + ), + ); + } + // If the index is at the 3rd last item in the organization list. + if (index == model.organizations.length - 3) { + // return VisibilityDetector and fetch more items in the list to show up! + return VisibilityDetector( + key: const Key('OrgSelItem'), + onVisibilityChanged: (VisibilityInfo info) { + if (info.visibleFraction > 0) { + print(model.organizations.length); + model.fetchMoreHelper( + fetchMore!, + model.organizations, + ); + print(model.organizations.length); + } + }, + child: CustomListTile( + index: index, + type: TileType.org, + orgInfo: model.organizations[index], + onTapOrgInfo: (item) => model.selectOrg(item), + key: Key('OrgSelItem$index'), + ), + ); + } + // return CustomeTile that shows a particular item in the list! + return CustomListTile( + index: index, + type: TileType.org, + orgInfo: model.organizations[index], + onTapOrgInfo: (item) => model.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(); + }, + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList/model.md b/talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList/model.md new file mode 100644 index 000000000..5906910b4 --- /dev/null +++ b/talawa-mobile-docs/widgets_organization_search_list/OrganizationSearchList/model.md @@ -0,0 +1,32 @@ + + + +# model property + + + + + + + +[SelectOrganizationViewModel](../../view_model_pre_auth_view_models_select_organization_view_model/SelectOrganizationViewModel-class.md) model + +_final_ + + + + + + +## Implementation + +```dart +final SelectOrganizationViewModel model; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_organization_search_list/widgets_organization_search_list-library.md b/talawa-mobile-docs/widgets_organization_search_list/widgets_organization_search_list-library.md new file mode 100644 index 000000000..bfd5d1159 --- /dev/null +++ b/talawa-mobile-docs/widgets_organization_search_list/widgets_organization_search_list-library.md @@ -0,0 +1,39 @@ + + + + +# organization_search_list library + + + + + + + + + + + +## Classes + +##### [OrganizationSearchList](../widgets_organization_search_list/OrganizationSearchList-class.md) + + + +OrganizationSearchList class return a widget that shows all +the matching organizations searched on the search bar. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller-class.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller-class.md new file mode 100644 index 000000000..cf25bd381 --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller-class.md @@ -0,0 +1,209 @@ + + + +# CustomCarouselScroller class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- CustomCarouselScroller + + + + + + +**Annotations** + +- @[visibleForTesting](https://pub.dev/documentation/meta/1.8.0/meta/visibleForTesting-constant.html) + + +## Constructors + +[CustomCarouselScroller](../widgets_pinned_carousel_widget/CustomCarouselScroller/CustomCarouselScroller.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../models_post_post_model/Post-class.md)> pinnedPosts, required [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) navigateToIndividualPostPage}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [navigateToIndividualPostPage](../widgets_pinned_carousel_widget/CustomCarouselScroller/navigateToIndividualPostPage.md) → [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) + + + + +_final_ + + + +##### [pinnedPosts](../widgets_pinned_carousel_widget/CustomCarouselScroller/pinnedPosts.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../models_post_post_model/Post-class.md)> + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../widgets_pinned_carousel_widget/CustomCarouselScroller/createState.md)() [CustomCarouselScrollerState](../widgets_pinned_carousel_widget/CustomCarouselScrollerState-class.md) + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/CustomCarouselScroller.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/CustomCarouselScroller.md new file mode 100644 index 000000000..5cb9c6ebd --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/CustomCarouselScroller.md @@ -0,0 +1,33 @@ + + + +# CustomCarouselScroller constructor + + + + + + +const +CustomCarouselScroller({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../../models_post_post_model/Post-class.md)> pinnedPosts, required [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) navigateToIndividualPostPage}) + + + + + +## Implementation + +```dart +const CustomCarouselScroller({ + Key? key, + required this.pinnedPosts, + required this.navigateToIndividualPostPage, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/createState.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/createState.md new file mode 100644 index 000000000..581e73be4 --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[CustomCarouselScrollerState](../../widgets_pinned_carousel_widget/CustomCarouselScrollerState-class.md) createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +CustomCarouselScrollerState createState() => CustomCarouselScrollerState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/navigateToIndividualPostPage.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/navigateToIndividualPostPage.md new file mode 100644 index 000000000..362a98fd3 --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/navigateToIndividualPostPage.md @@ -0,0 +1,32 @@ + + + +# navigateToIndividualPostPage property + + + + + + + +[Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) navigateToIndividualPostPage + +_final_ + + + + + + +## Implementation + +```dart +final Function navigateToIndividualPostPage; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/pinnedPosts.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/pinnedPosts.md new file mode 100644 index 000000000..4071846ea --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScroller/pinnedPosts.md @@ -0,0 +1,32 @@ + + + +# pinnedPosts property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../../models_post_post_model/Post-class.md)> pinnedPosts + +_final_ + + + + + + +## Implementation + +```dart +final List pinnedPosts; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState-class.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState-class.md new file mode 100644 index 000000000..3af904b51 --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState-class.md @@ -0,0 +1,268 @@ + + + +# CustomCarouselScrollerState class + + + + + + + + + +

CustomCarouselScrollerState class return a widget that is +used to generate slider for pinned post on the top of the Home Screen.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [State](https://api.flutter.dev/flutter/widgets/State-class.html)<[CustomCarouselScroller](../widgets_pinned_carousel_widget/CustomCarouselScroller-class.md)> +- CustomCarouselScrollerState + + + + +**Available Extensions** + +- [StateExt](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/StateExt.html) + + +**Annotations** + +- @[visibleForTesting](https://pub.dev/documentation/meta/1.8.0/meta/visibleForTesting-constant.html) + + +## Constructors + +[CustomCarouselScrollerState](../widgets_pinned_carousel_widget/CustomCarouselScrollerState/CustomCarouselScrollerState.md) () + + + + +## Properties + +##### [context](https://api.flutter.dev/flutter/widgets/State/context.html) → [BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) + + + +The location in the tree where this widget builds. +_read-onlyinherited_ + + + +##### [controller](../widgets_pinned_carousel_widget/CustomCarouselScrollerState/controller.md) → [PageController](https://api.flutter.dev/flutter/widgets/PageController-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [mounted](https://api.flutter.dev/flutter/widgets/State/mounted.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether this State object is currently in a tree. +_read-onlyinherited_ + + + +##### [pindex](../widgets_pinned_carousel_widget/CustomCarouselScrollerState/pindex.md) ↔ [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [widget](https://api.flutter.dev/flutter/widgets/State/widget.html) → [CustomCarouselScroller](../widgets_pinned_carousel_widget/CustomCarouselScroller-class.md) + + + +The current configuration. +_read-onlyinherited_ + + + + + +## Methods + +##### [activate](https://api.flutter.dev/flutter/widgets/State/activate.html)() void + + + +Called when this object is reinserted into the tree after having been +removed via deactivate. +_inherited_ + + + +##### [build](../widgets_pinned_carousel_widget/CustomCarouselScrollerState/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [deactivate](https://api.flutter.dev/flutter/widgets/State/deactivate.html)() void + + + +Called when this object is removed from the tree. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/State/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [didChangeDependencies](https://api.flutter.dev/flutter/widgets/State/didChangeDependencies.html)() void + + + +Called when a dependency of this State object changes. +_inherited_ + + + +##### [didUpdateWidget](https://api.flutter.dev/flutter/widgets/State/didUpdateWidget.html)(covariant [CustomCarouselScroller](../widgets_pinned_carousel_widget/CustomCarouselScroller-class.md) oldWidget) void + + + +Called whenever the widget configuration changes. +_inherited_ + + + +##### [dispose](https://api.flutter.dev/flutter/widgets/State/dispose.html)() void + + + +Called when this object is removed from the tree permanently. +_inherited_ + + + +##### [initState](https://api.flutter.dev/flutter/widgets/State/initState.html)() void + + + +Called when this object is inserted into the tree. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [reassemble](https://api.flutter.dev/flutter/widgets/State/reassemble.html)() void + + + +Called whenever the application is reassembled during debugging, for +example during hot reload. +_inherited_ + + + +##### [setState](https://api.flutter.dev/flutter/widgets/State/setState.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) fn) void + + + +Notify the framework that the internal state of this object has changed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/Diagnosticable/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/foundation/Diagnosticable/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A brief description of this object, usually just the runtimeType and the +hashCode. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState/CustomCarouselScrollerState.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState/CustomCarouselScrollerState.md new file mode 100644 index 000000000..c6b1a3deb --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState/CustomCarouselScrollerState.md @@ -0,0 +1,24 @@ + + + +# CustomCarouselScrollerState constructor + + + + + + + +CustomCarouselScrollerState() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState/controller.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState/controller.md new file mode 100644 index 000000000..1ba09ce41 --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState/controller.md @@ -0,0 +1,32 @@ + + + +# controller property + + + + + + + +[PageController](https://api.flutter.dev/flutter/widgets/PageController-class.html) controller + +_final_ + + + + + + +## Implementation + +```dart +final PageController controller = PageController(initialPage: 0); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState/pindex.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState/pindex.md new file mode 100644 index 000000000..e609f0c28 --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/CustomCarouselScrollerState/pindex.md @@ -0,0 +1,32 @@ + + + +# pindex property + + + + + + + +[int](https://api.flutter.dev/flutter/dart-core/int-class.html) pindex + +_read / write_ + + + + + + +## Implementation + +```dart +int pindex = 0; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel-class.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel-class.md new file mode 100644 index 000000000..fc37c1891 --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel-class.md @@ -0,0 +1,218 @@ + + + +# PinnedPostCarousel class + + + + + + + + + +

PinnedPostCarousel class returns a widget for pinned posts in +the slider/carousel on the top of the Home Screen. +Tapping on a post will redirect you to the respective post screen.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- PinnedPostCarousel + + + + + + + + +## Constructors + +[PinnedPostCarousel](../widgets_pinned_carousel_widget/PinnedPostCarousel/PinnedPostCarousel.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../models_post_post_model/Post-class.md)> pinnedPosts, required [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) navigateToPinnedPostPage, required [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) navigateToIndividualPostPage}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [navigateToIndividualPostPage](../widgets_pinned_carousel_widget/PinnedPostCarousel/navigateToIndividualPostPage.md) → [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) + + + + +_final_ + + + +##### [navigateToPinnedPostPage](../widgets_pinned_carousel_widget/PinnedPostCarousel/navigateToPinnedPostPage.md) → [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) + + + + +_final_ + + + +##### [pinnedPosts](../widgets_pinned_carousel_widget/PinnedPostCarousel/pinnedPosts.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../models_post_post_model/Post-class.md)> + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_pinned_carousel_widget/PinnedPostCarousel/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/PinnedPostCarousel.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/PinnedPostCarousel.md new file mode 100644 index 000000000..f2cc5392f --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/PinnedPostCarousel.md @@ -0,0 +1,34 @@ + + + +# PinnedPostCarousel constructor + + + + + + +const +PinnedPostCarousel({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../../models_post_post_model/Post-class.md)> pinnedPosts, required [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) navigateToPinnedPostPage, required [Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) navigateToIndividualPostPage}) + + + + + +## Implementation + +```dart +const PinnedPostCarousel({ + Key? key, + required this.pinnedPosts, + required this.navigateToPinnedPostPage, + required this.navigateToIndividualPostPage, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/build.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/build.md new file mode 100644 index 000000000..8010d7a73 --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/build.md @@ -0,0 +1,119 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return Column( + children: [ + Container( + height: 220, + color: + Theme.of(context).colorScheme.primaryContainer.withOpacity(0.5), + child: CustomCarouselScroller( + pinnedPosts: pinnedPosts, + key: const Key('Carousel'), + navigateToIndividualPostPage: navigateToIndividualPostPage, + ), + ), + // Gesture Detector in Flutter is used to detect the user's gestures on the application. + // It is a non-visual widget. Inside the gesture detector, another widget is placed and + // the gesture detector will capture all these events (gestures) and execute the tasks accordingly. + GestureDetector( + onTap: () => navigateToPinnedPostPage(), + child: Container( + height: 50, + width: SizeConfig.screenWidth, + padding: const EdgeInsets.symmetric(horizontal: 16.0), + color: Theme.of(context).colorScheme.primaryContainer, + child: Row( + children: [ + Expanded( + flex: 1, + child: Padding( + padding: const EdgeInsets.only(right: 8.0), + child: Icon( + Icons.article, + color: Theme.of(context).colorScheme.secondary, + ), + ), + ), + Expanded( + flex: 8, + child: Text( + AppLocalizations.of(context)! + .strictTranslate("See all Pinned news"), + style: Theme.of(context).textTheme.titleLarge, + ), + ), + const Expanded(flex: 1, child: Icon(Icons.arrow_forward_ios)) + ], + ), + ), + ) + ], + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/navigateToIndividualPostPage.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/navigateToIndividualPostPage.md new file mode 100644 index 000000000..362a98fd3 --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/navigateToIndividualPostPage.md @@ -0,0 +1,32 @@ + + + +# navigateToIndividualPostPage property + + + + + + + +[Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) navigateToIndividualPostPage + +_final_ + + + + + + +## Implementation + +```dart +final Function navigateToIndividualPostPage; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/navigateToPinnedPostPage.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/navigateToPinnedPostPage.md new file mode 100644 index 000000000..9fbe8e275 --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/navigateToPinnedPostPage.md @@ -0,0 +1,32 @@ + + + +# navigateToPinnedPostPage property + + + + + + + +[Function](https://api.flutter.dev/flutter/dart-core/Function-class.html) navigateToPinnedPostPage + +_final_ + + + + + + +## Implementation + +```dart +final Function navigateToPinnedPostPage; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/pinnedPosts.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/pinnedPosts.md new file mode 100644 index 000000000..4071846ea --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/PinnedPostCarousel/pinnedPosts.md @@ -0,0 +1,32 @@ + + + +# pinnedPosts property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../../models_post_post_model/Post-class.md)> pinnedPosts + +_final_ + + + + + + +## Implementation + +```dart +final List pinnedPosts; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_pinned_carousel_widget/widgets_pinned_carousel_widget-library.md b/talawa-mobile-docs/widgets_pinned_carousel_widget/widgets_pinned_carousel_widget-library.md new file mode 100644 index 000000000..a40cca69e --- /dev/null +++ b/talawa-mobile-docs/widgets_pinned_carousel_widget/widgets_pinned_carousel_widget-library.md @@ -0,0 +1,55 @@ + + + + +# pinned_carousel_widget library + + + + + + + + + + + +## Classes + +##### [CustomCarouselScroller](../widgets_pinned_carousel_widget/CustomCarouselScroller-class.md) + + + + + + +##### [CustomCarouselScrollerState](../widgets_pinned_carousel_widget/CustomCarouselScrollerState-class.md) + + + +CustomCarouselScrollerState class return a widget that is +used to generate slider for pinned post on the top of the Home Screen. + + +##### [PinnedPostCarousel](../widgets_pinned_carousel_widget/PinnedPostCarousel-class.md) + + + +PinnedPostCarousel class returns a widget for pinned posts in +the slider/carousel on the top of the Home Screen. +Tapping on a post will redirect you to the respective post screen. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget-class.md b/talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget-class.md new file mode 100644 index 000000000..270bf50da --- /dev/null +++ b/talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget-class.md @@ -0,0 +1,201 @@ + + + +# DescriptionTextWidget class + + + + + + + + + +

This class sets up the post page. +To implement the "show less" and "show more" functions for the text, +we divide the text into two parts: firstHalf and secondHalf. A flag is set to +track whether to display either the firstHalf or both(the entire text).

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- DescriptionTextWidget + + + + + + + + +## Constructors + +[DescriptionTextWidget](../widgets_post_detailed_page/DescriptionTextWidget/DescriptionTextWidget.md) ({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) text}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [text](../widgets_post_detailed_page/DescriptionTextWidget/text.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../widgets_post_detailed_page/DescriptionTextWidget/createState.md)() _DescriptionTextWidgetState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget/DescriptionTextWidget.md b/talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget/DescriptionTextWidget.md new file mode 100644 index 000000000..9e9f4749e --- /dev/null +++ b/talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget/DescriptionTextWidget.md @@ -0,0 +1,29 @@ + + + +# DescriptionTextWidget constructor + + + + + + +const +DescriptionTextWidget({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) text}) + + + + + +## Implementation + +```dart +const DescriptionTextWidget({required this.text}); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget/createState.md b/talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget/createState.md new file mode 100644 index 000000000..334915de6 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_DescriptionTextWidgetState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_DescriptionTextWidgetState createState() => _DescriptionTextWidgetState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget/text.md b/talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget/text.md new file mode 100644 index 000000000..a7f6f7d63 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_detailed_page/DescriptionTextWidget/text.md @@ -0,0 +1,32 @@ + + + +# text property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) text + +_final_ + + + + + + +## Implementation + +```dart +final String text; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_detailed_page/widgets_post_detailed_page-library.md b/talawa-mobile-docs/widgets_post_detailed_page/widgets_post_detailed_page-library.md new file mode 100644 index 000000000..62d50933d --- /dev/null +++ b/talawa-mobile-docs/widgets_post_detailed_page/widgets_post_detailed_page-library.md @@ -0,0 +1,41 @@ + + + + +# post_detailed_page library + + + + + + + + + + + +## Classes + +##### [DescriptionTextWidget](../widgets_post_detailed_page/DescriptionTextWidget-class.md) + + + +This class sets up the post page. +To implement the "show less" and "show more" functions for the text, +we divide the text into two parts: firstHalf and secondHalf. A flag is set to +track whether to display either the firstHalf or both(the entire text). + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_list_widget/PostListWidget-class.md b/talawa-mobile-docs/widgets_post_list_widget/PostListWidget-class.md new file mode 100644 index 000000000..45a69dc1c --- /dev/null +++ b/talawa-mobile-docs/widgets_post_list_widget/PostListWidget-class.md @@ -0,0 +1,207 @@ + + + +# PostListWidget class + + + + + + + + + +

This class receives a List of all the Post widgets and returns a ListView.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- PostListWidget + + + + + + + + +## Constructors + +[PostListWidget](../widgets_post_list_widget/PostListWidget/PostListWidget.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../models_post_post_model/Post-class.md)> posts, dynamic function([Post](../models_post_post_model/Post-class.md))?}) + + _const_ + + +## Properties + +##### [function](../widgets_post_list_widget/PostListWidget/function.md) → (dynamic Function([Post](../models_post_post_model/Post-class.md))?) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [posts](../widgets_post_list_widget/PostListWidget/posts.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../models_post_post_model/Post-class.md)> + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_post_list_widget/PostListWidget/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_list_widget/PostListWidget/PostListWidget.md b/talawa-mobile-docs/widgets_post_list_widget/PostListWidget/PostListWidget.md new file mode 100644 index 000000000..de0623977 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_list_widget/PostListWidget/PostListWidget.md @@ -0,0 +1,33 @@ + + + +# PostListWidget constructor + + + + + + +const +PostListWidget({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../../models_post_post_model/Post-class.md)> posts, dynamic function([Post](../../models_post_post_model/Post-class.md))?}) + + + + + +## Implementation + +```dart +const PostListWidget({ + Key? key, + required this.posts, + this.function, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_list_widget/PostListWidget/build.md b/talawa-mobile-docs/widgets_post_list_widget/PostListWidget/build.md new file mode 100644 index 000000000..9bc187f9a --- /dev/null +++ b/talawa-mobile-docs/widgets_post_list_widget/PostListWidget/build.md @@ -0,0 +1,93 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return ListView.builder( + scrollDirection: Axis.vertical, + physics: const NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: posts.length, + itemBuilder: (BuildContext context, int index) { + return Column( + children: [ + NewsPost( + post: posts[index], + function: function, + ), + const Padding( + padding: EdgeInsets.symmetric(vertical: 10.0), + child: Divider( + height: 8, + thickness: 8, + ), + ) + ], + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_list_widget/PostListWidget/function.md b/talawa-mobile-docs/widgets_post_list_widget/PostListWidget/function.md new file mode 100644 index 000000000..4e87ea5a3 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_list_widget/PostListWidget/function.md @@ -0,0 +1,32 @@ + + + +# function property + + + + + + + +(dynamic Function([Post](../../models_post_post_model/Post-class.md))?) function + +_final_ + + + + + + +## Implementation + +```dart +final Function(Post)? function; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_list_widget/PostListWidget/posts.md b/talawa-mobile-docs/widgets_post_list_widget/PostListWidget/posts.md new file mode 100644 index 000000000..9a3b8ad65 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_list_widget/PostListWidget/posts.md @@ -0,0 +1,32 @@ + + + +# posts property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Post](../../models_post_post_model/Post-class.md)> posts + +_final_ + + + + + + +## Implementation + +```dart +final List posts; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_list_widget/widgets_post_list_widget-library.md b/talawa-mobile-docs/widgets_post_list_widget/widgets_post_list_widget-library.md new file mode 100644 index 000000000..4a511f63b --- /dev/null +++ b/talawa-mobile-docs/widgets_post_list_widget/widgets_post_list_widget-library.md @@ -0,0 +1,38 @@ + + + + +# post_list_widget library + + + + + + + + + + + +## Classes + +##### [PostListWidget](../widgets_post_list_widget/PostListWidget-class.md) + + + +This class receives a List of all the Post widgets and returns a ListView. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/NewsPost-class.md b/talawa-mobile-docs/widgets_post_widget/NewsPost-class.md new file mode 100644 index 000000000..181f9935b --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/NewsPost-class.md @@ -0,0 +1,206 @@ + + + +# NewsPost class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- NewsPost + + + + + + + + +## Constructors + +[NewsPost](../widgets_post_widget/NewsPost/NewsPost.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [Post](../models_post_post_model/Post-class.md) post, dynamic function([Post](../models_post_post_model/Post-class.md))?}) + + _const_ + + +## Properties + +##### [function](../widgets_post_widget/NewsPost/function.md) → (dynamic Function([Post](../models_post_post_model/Post-class.md))?) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [post](../widgets_post_widget/NewsPost/post.md) → [Post](../models_post_post_model/Post-class.md) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_post_widget/NewsPost/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/NewsPost/NewsPost.md b/talawa-mobile-docs/widgets_post_widget/NewsPost/NewsPost.md new file mode 100644 index 000000000..4f831c08b --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/NewsPost/NewsPost.md @@ -0,0 +1,33 @@ + + + +# NewsPost constructor + + + + + + +const +NewsPost({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [Post](../../models_post_post_model/Post-class.md) post, dynamic function([Post](../../models_post_post_model/Post-class.md))?}) + + + + + +## Implementation + +```dart +const NewsPost({ + Key? key, + required this.post, + this.function, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/NewsPost/build.md b/talawa-mobile-docs/widgets_post_widget/NewsPost/build.md new file mode 100644 index 000000000..3e6ebf469 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/NewsPost/build.md @@ -0,0 +1,164 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@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.primaryContainer.withOpacity(0.5), + child: PostContainer(id: post.sId), + ), + 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).colorScheme.secondary + : 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/talawa-mobile-docs/widgets_post_widget/NewsPost/function.md b/talawa-mobile-docs/widgets_post_widget/NewsPost/function.md new file mode 100644 index 000000000..4e87ea5a3 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/NewsPost/function.md @@ -0,0 +1,32 @@ + + + +# function property + + + + + + + +(dynamic Function([Post](../../models_post_post_model/Post-class.md))?) function + +_final_ + + + + + + +## Implementation + +```dart +final Function(Post)? function; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/NewsPost/post.md b/talawa-mobile-docs/widgets_post_widget/NewsPost/post.md new file mode 100644 index 000000000..e986becbc --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/NewsPost/post.md @@ -0,0 +1,32 @@ + + + +# post property + + + + + + + +[Post](../../models_post_post_model/Post-class.md) post + +_final_ + + + + + + +## Implementation + +```dart +final Post post; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/PostContainer-class.md b/talawa-mobile-docs/widgets_post_widget/PostContainer-class.md new file mode 100644 index 000000000..5ae9ca9e6 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/PostContainer-class.md @@ -0,0 +1,197 @@ + + + +# PostContainer class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- PostContainer + + + + + + + + +## Constructors + +[PostContainer](../widgets_post_widget/PostContainer/PostContainer.md) ({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) id, [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [id](../widgets_post_widget/PostContainer/id.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../widgets_post_widget/PostContainer/createState.md)() [PostContainerState](../widgets_post_widget/PostContainerState-class.md) + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/PostContainer/PostContainer.md b/talawa-mobile-docs/widgets_post_widget/PostContainer/PostContainer.md new file mode 100644 index 000000000..dc9ee62f1 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/PostContainer/PostContainer.md @@ -0,0 +1,32 @@ + + + +# PostContainer constructor + + + + + + +const +PostContainer({required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) id, [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const PostContainer({ + required this.id, + Key? key, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/PostContainer/createState.md b/talawa-mobile-docs/widgets_post_widget/PostContainer/createState.md new file mode 100644 index 000000000..85cd7e218 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/PostContainer/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[PostContainerState](../../widgets_post_widget/PostContainerState-class.md) createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +PostContainerState createState() => PostContainerState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/PostContainer/id.md b/talawa-mobile-docs/widgets_post_widget/PostContainer/id.md new file mode 100644 index 000000000..672a052c2 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/PostContainer/id.md @@ -0,0 +1,32 @@ + + + +# id property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) id + +_final_ + + + + + + +## Implementation + +```dart +final String id; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/PostContainerState-class.md b/talawa-mobile-docs/widgets_post_widget/PostContainerState-class.md new file mode 100644 index 000000000..e8506d7a1 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/PostContainerState-class.md @@ -0,0 +1,281 @@ + + + +# PostContainerState class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [State](https://api.flutter.dev/flutter/widgets/State-class.html)<[PostContainer](../widgets_post_widget/PostContainer-class.md)> +- PostContainerState + + + + +**Available Extensions** + +- [StateExt](https://pub.dev/documentation/tutorial_coach_mark/1.2.9/tutorial_coach_mark/StateExt.html) + + + + +## Constructors + +[PostContainerState](../widgets_post_widget/PostContainerState/PostContainerState.md) () + + + + +## Properties + +##### [context](https://api.flutter.dev/flutter/widgets/State/context.html) → [BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) + + + +The location in the tree where this widget builds. +_read-onlyinherited_ + + + +##### [controller](../widgets_post_widget/PostContainerState/controller.md) → [PageController](https://api.flutter.dev/flutter/widgets/PageController-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/dart-core/Object/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [inView](../widgets_post_widget/PostContainerState/inView.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read / write_ + + + +##### [mounted](https://api.flutter.dev/flutter/widgets/State/mounted.html) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +Whether this State object is currently in a tree. +_read-onlyinherited_ + + + +##### [pindex](../widgets_post_widget/PostContainerState/pindex.md) ↔ [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + + +_read / write_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [startedPlaying](../widgets_post_widget/PostContainerState/startedPlaying.md) ↔ [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_read / write_ + + + +##### [widget](https://api.flutter.dev/flutter/widgets/State/widget.html) → [PostContainer](../widgets_post_widget/PostContainer-class.md) + + + +The current configuration. +_read-onlyinherited_ + + + + + +## Methods + +##### [activate](https://api.flutter.dev/flutter/widgets/State/activate.html)() void + + + +Called when this object is reinserted into the tree after having been +removed via deactivate. +_inherited_ + + + +##### [build](../widgets_post_widget/PostContainerState/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [deactivate](https://api.flutter.dev/flutter/widgets/State/deactivate.html)() void + + + +Called when this object is removed from the tree. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/State/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [didChangeDependencies](https://api.flutter.dev/flutter/widgets/State/didChangeDependencies.html)() void + + + +Called when a dependency of this State object changes. +_inherited_ + + + +##### [didUpdateWidget](https://api.flutter.dev/flutter/widgets/State/didUpdateWidget.html)(covariant [PostContainer](../widgets_post_widget/PostContainer-class.md) oldWidget) void + + + +Called whenever the widget configuration changes. +_inherited_ + + + +##### [dispose](../widgets_post_widget/PostContainerState/dispose.md)() void + + + +Called when this object is removed from the tree permanently. +_override_ + + + +##### [initState](../widgets_post_widget/PostContainerState/initState.md)() void + + + +Called when this object is inserted into the tree. +_override_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [reassemble](https://api.flutter.dev/flutter/widgets/State/reassemble.html)() void + + + +Called whenever the application is reassembled during debugging, for +example during hot reload. +_inherited_ + + + +##### [setState](https://api.flutter.dev/flutter/widgets/State/setState.html)([VoidCallback](https://api.flutter.dev/flutter/dart-ui/VoidCallback.html) fn) void + + + +Notify the framework that the internal state of this object has changed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/Diagnosticable/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/foundation/Diagnosticable/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A brief description of this object, usually just the runtimeType and the +hashCode. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/dart-core/Object/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/PostContainerState/PostContainerState.md b/talawa-mobile-docs/widgets_post_widget/PostContainerState/PostContainerState.md new file mode 100644 index 000000000..14ae45f06 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/PostContainerState/PostContainerState.md @@ -0,0 +1,24 @@ + + + +# PostContainerState constructor + + + + + + + +PostContainerState() + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/PostContainerState/controller.md b/talawa-mobile-docs/widgets_post_widget/PostContainerState/controller.md new file mode 100644 index 000000000..1ba09ce41 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/PostContainerState/controller.md @@ -0,0 +1,32 @@ + + + +# controller property + + + + + + + +[PageController](https://api.flutter.dev/flutter/widgets/PageController-class.html) controller + +_final_ + + + + + + +## Implementation + +```dart +final PageController controller = PageController(initialPage: 0); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/PostContainerState/dispose.md b/talawa-mobile-docs/widgets_post_widget/PostContainerState/dispose.md new file mode 100644 index 000000000..74c5469f9 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/PostContainerState/dispose.md @@ -0,0 +1,65 @@ + + + +# dispose method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +void dispose +() + +_override_ + + + +

Called when this object is removed from the tree permanently.

+

The framework calls this method when this State object will never +build again. After the framework calls dispose, the State object is +considered unmounted and the mounted property is false. It is an error +to call setState at this point. This stage of the lifecycle is terminal: +there is no way to remount a State object that has been disposed.

+

Subclasses should override this method to release any resources retained +by this object (e.g., stop any active animations).

+

If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

+
    +
  • In initState, subscribe to the object.
  • +
  • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
  • +
  • In dispose, unsubscribe from the object.
  • +
+

Implementations of this method should end with a call to the inherited +method, as in super.dispose().

+

See also:

+ + + + +## Implementation + +```dart +@override +void dispose() { + controller.dispose(); + super.dispose(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/PostContainerState/inView.md b/talawa-mobile-docs/widgets_post_widget/PostContainerState/inView.md new file mode 100644 index 000000000..92c14bb97 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/PostContainerState/inView.md @@ -0,0 +1,32 @@ + + + +# inView property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) inView + +_read / write_ + + + + + + +## Implementation + +```dart +bool inView = true; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/PostContainerState/initState.md b/talawa-mobile-docs/widgets_post_widget/PostContainerState/initState.md new file mode 100644 index 000000000..7e0019516 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/PostContainerState/initState.md @@ -0,0 +1,62 @@ + + + +# initState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +void initState +() + +_override_ + + + +

Called when this object is inserted into the tree.

+

The framework will call this method exactly once for each State object +it creates.

+

Override this method to perform initialization that depends on the +location at which this object was inserted into the tree (i.e., context) +or on the widget used to configure this object (i.e., widget).

+

If a State's build method depends on an object that can itself +change state, for example a ChangeNotifier or Stream, or some +other object to which one can subscribe to receive notifications, then +be sure to subscribe and unsubscribe properly in initState, +didUpdateWidget, and dispose:

+
    +
  • In initState, subscribe to the object.
  • +
  • In didUpdateWidget unsubscribe from the old object and subscribe +to the new one if the updated widget configuration requires +replacing the object.
  • +
  • In dispose, unsubscribe from the object.
  • +
+

You cannot use BuildContext.dependOnInheritedWidgetOfExactType from this +method. However, didChangeDependencies will be called immediately +following this method, and BuildContext.dependOnInheritedWidgetOfExactType can +be used there.

+

Implementations of this method should start with a call to the inherited +method, as in super.initState().

+ + + +## Implementation + +```dart +@override +void initState() { + super.initState(); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/PostContainerState/pindex.md b/talawa-mobile-docs/widgets_post_widget/PostContainerState/pindex.md new file mode 100644 index 000000000..e609f0c28 --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/PostContainerState/pindex.md @@ -0,0 +1,32 @@ + + + +# pindex property + + + + + + + +[int](https://api.flutter.dev/flutter/dart-core/int-class.html) pindex + +_read / write_ + + + + + + +## Implementation + +```dart +int pindex = 0; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/PostContainerState/startedPlaying.md b/talawa-mobile-docs/widgets_post_widget/PostContainerState/startedPlaying.md new file mode 100644 index 000000000..765d3d6af --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/PostContainerState/startedPlaying.md @@ -0,0 +1,32 @@ + + + +# startedPlaying property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) startedPlaying + +_read / write_ + + + + + + +## Implementation + +```dart +bool startedPlaying = false; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_post_widget/widgets_post_widget-library.md b/talawa-mobile-docs/widgets_post_widget/widgets_post_widget-library.md new file mode 100644 index 000000000..88746391b --- /dev/null +++ b/talawa-mobile-docs/widgets_post_widget/widgets_post_widget-library.md @@ -0,0 +1,52 @@ + + + + +# post_widget library + + + + + + + + + + + +## Classes + +##### [NewsPost](../widgets_post_widget/NewsPost-class.md) + + + + + + +##### [PostContainer](../widgets_post_widget/PostContainer-class.md) + + + + + + +##### [PostContainerState](../widgets_post_widget/PostContainerState-class.md) + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton-class.md b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton-class.md new file mode 100644 index 000000000..f4dd829d2 --- /dev/null +++ b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton-class.md @@ -0,0 +1,253 @@ + + + +# RaisedRoundedButton class + + + + + + + + + +

This class returns a widget for a raised rounded button, +for example: login button in login screen.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- RaisedRoundedButton + + + + + + + + +## Constructors + +[RaisedRoundedButton](../widgets_raised_round_edge_button/RaisedRoundedButton/RaisedRoundedButton.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) buttonLabel, required [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) backgroundColor, required [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) textColor, required dynamic onTap(), [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? height, [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? width, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) showArrow = false}) + + _const_ + + +## Properties + +##### [backgroundColor](../widgets_raised_round_edge_button/RaisedRoundedButton/backgroundColor.md) → [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + +_final_ + + + +##### [buttonLabel](../widgets_raised_round_edge_button/RaisedRoundedButton/buttonLabel.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [height](../widgets_raised_round_edge_button/RaisedRoundedButton/height.md) → [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? + + + + +_final_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [onTap](../widgets_raised_round_edge_button/RaisedRoundedButton/onTap.md) → dynamic Function() + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [showArrow](../widgets_raised_round_edge_button/RaisedRoundedButton/showArrow.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_final_ + + + +##### [textColor](../widgets_raised_round_edge_button/RaisedRoundedButton/textColor.md) → [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) + + + + +_final_ + + + +##### [width](../widgets_raised_round_edge_button/RaisedRoundedButton/width.md) → [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? + + + + +_final_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../widgets_raised_round_edge_button/RaisedRoundedButton/createState.md)() _RaisedRoundedButtonState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/RaisedRoundedButton.md b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/RaisedRoundedButton.md new file mode 100644 index 000000000..99d95d5c8 --- /dev/null +++ b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/RaisedRoundedButton.md @@ -0,0 +1,38 @@ + + + +# RaisedRoundedButton constructor + + + + + + +const +RaisedRoundedButton({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) buttonLabel, required [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) backgroundColor, required [Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) textColor, required dynamic onTap(), [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? height, [double](https://api.flutter.dev/flutter/dart-core/double-class.html)? width, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) showArrow = false}) + + + + + +## Implementation + +```dart +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); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/backgroundColor.md b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/backgroundColor.md new file mode 100644 index 000000000..07df8f904 --- /dev/null +++ b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/backgroundColor.md @@ -0,0 +1,32 @@ + + + +# backgroundColor property + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) backgroundColor + +_final_ + + + + + + +## Implementation + +```dart +final Color backgroundColor; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/buttonLabel.md b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/buttonLabel.md new file mode 100644 index 000000000..9dad55b19 --- /dev/null +++ b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/buttonLabel.md @@ -0,0 +1,32 @@ + + + +# buttonLabel property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) buttonLabel + +_final_ + + + + + + +## Implementation + +```dart +final String buttonLabel; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/createState.md b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/createState.md new file mode 100644 index 000000000..153347625 --- /dev/null +++ b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_RaisedRoundedButtonState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_RaisedRoundedButtonState createState() => _RaisedRoundedButtonState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/height.md b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/height.md new file mode 100644 index 000000000..3db9a95b5 --- /dev/null +++ b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/height.md @@ -0,0 +1,32 @@ + + + +# height property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html)? height + +_final_ + + + + + + +## Implementation + +```dart +final double? height; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/onTap.md b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/onTap.md new file mode 100644 index 000000000..71f15a9ad --- /dev/null +++ b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/onTap.md @@ -0,0 +1,32 @@ + + + +# onTap property + + + + + + + +dynamic Function() onTap + +_final_ + + + + + + +## Implementation + +```dart +final Function() onTap; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/showArrow.md b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/showArrow.md new file mode 100644 index 000000000..989fd8683 --- /dev/null +++ b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/showArrow.md @@ -0,0 +1,32 @@ + + + +# showArrow property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) showArrow + +_final_ + + + + + + +## Implementation + +```dart +final bool showArrow; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/textColor.md b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/textColor.md new file mode 100644 index 000000000..7c04e7051 --- /dev/null +++ b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/textColor.md @@ -0,0 +1,32 @@ + + + +# textColor property + + + + + + + +[Color](https://api.flutter.dev/flutter/dart-ui/Color-class.html) textColor + +_final_ + + + + + + +## Implementation + +```dart +final Color textColor; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/width.md b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/width.md new file mode 100644 index 000000000..e35287c28 --- /dev/null +++ b/talawa-mobile-docs/widgets_raised_round_edge_button/RaisedRoundedButton/width.md @@ -0,0 +1,32 @@ + + + +# width property + + + + + + + +[double](https://api.flutter.dev/flutter/dart-core/double-class.html)? width + +_final_ + + + + + + +## Implementation + +```dart +final double? width; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_raised_round_edge_button/widgets_raised_round_edge_button-library.md b/talawa-mobile-docs/widgets_raised_round_edge_button/widgets_raised_round_edge_button-library.md new file mode 100644 index 000000000..e0cb23ea2 --- /dev/null +++ b/talawa-mobile-docs/widgets_raised_round_edge_button/widgets_raised_round_edge_button-library.md @@ -0,0 +1,39 @@ + + + + +# raised_round_edge_button library + + + + + + + + + + + +## Classes + +##### [RaisedRoundedButton](../widgets_raised_round_edge_button/RaisedRoundedButton-class.md) + + + +This class returns a widget for a raised rounded button, +for example: login button in login screen. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_rich_text/CustomRichText-class.md b/talawa-mobile-docs/widgets_rich_text/CustomRichText-class.md new file mode 100644 index 000000000..c57b561fd --- /dev/null +++ b/talawa-mobile-docs/widgets_rich_text/CustomRichText-class.md @@ -0,0 +1,199 @@ + + + +# CustomRichText class + + + + + + + + + +

CustomRichText class returns a widget for customized rich/bold text. +These rich text are being used in form for changing the password.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- CustomRichText + + + + + + + + +## Constructors + +[CustomRichText](../widgets_rich_text/CustomRichText/CustomRichText.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>> words}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [words](../widgets_rich_text/CustomRichText/words.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>> + + + + +_final_ + + + + + +## Methods + +##### [build](../widgets_rich_text/CustomRichText/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_rich_text/CustomRichText/CustomRichText.md b/talawa-mobile-docs/widgets_rich_text/CustomRichText/CustomRichText.md new file mode 100644 index 000000000..a8ef77480 --- /dev/null +++ b/talawa-mobile-docs/widgets_rich_text/CustomRichText/CustomRichText.md @@ -0,0 +1,30 @@ + + + +# CustomRichText constructor + + + + + + +const +CustomRichText({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>> words}) + + + + + +## Implementation + +```dart +const CustomRichText({required Key key, required this.words}) + : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_rich_text/CustomRichText/build.md b/talawa-mobile-docs/widgets_rich_text/CustomRichText/build.md new file mode 100644 index 000000000..47b346239 --- /dev/null +++ b/talawa-mobile-docs/widgets_rich_text/CustomRichText/build.md @@ -0,0 +1,86 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return RichText( + textAlign: TextAlign.start, + text: TextSpan( + text: + "${AppLocalizations.of(context)!.strictTranslate(words[0]['text'].toString().trim())} ", + style: words[0]['textStyle'] as TextStyle, + children: List.generate( + words.length - 1, + (index) => TextSpan( + text: + "${AppLocalizations.of(context)!.strictTranslate(words[index + 1]['text'].toString().trim())} ", + style: words[index + 1]['textStyle'] as TextStyle, + ), + ), + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_rich_text/CustomRichText/words.md b/talawa-mobile-docs/widgets_rich_text/CustomRichText/words.md new file mode 100644 index 000000000..6f9a30900 --- /dev/null +++ b/talawa-mobile-docs/widgets_rich_text/CustomRichText/words.md @@ -0,0 +1,32 @@ + + + +# words property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Map](https://api.flutter.dev/flutter/dart-core/Map-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html), dynamic>> words + +_final_ + + + + + + +## Implementation + +```dart +final List> words; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_rich_text/widgets_rich_text-library.md b/talawa-mobile-docs/widgets_rich_text/widgets_rich_text-library.md new file mode 100644 index 000000000..40221a34b --- /dev/null +++ b/talawa-mobile-docs/widgets_rich_text/widgets_rich_text-library.md @@ -0,0 +1,39 @@ + + + + +# rich_text library + + + + + + + + + + + +## Classes + +##### [CustomRichText](../widgets_rich_text/CustomRichText-class.md) + + + +CustomRichText class returns a widget for customized rich/bold text. +These rich text are being used in form for changing the password. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator-class.md b/talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator-class.md new file mode 100644 index 000000000..55f30f008 --- /dev/null +++ b/talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator-class.md @@ -0,0 +1,208 @@ + + + +# SignupProgressIndicator class + + + + + + + + + +

This class returns a widget for showing the +progress indicator/flow while Signing Up/ Registration.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- SignupProgressIndicator + + + + + + + + +## Constructors + +[SignupProgressIndicator](../widgets_signup_progress_indicator/SignupProgressIndicator/SignupProgressIndicator.md) ({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, required [int](https://api.flutter.dev/flutter/dart-core/int-class.html) currentPageIndex}) + + + + +## Properties + +##### [currentPageIndex](../widgets_signup_progress_indicator/SignupProgressIndicator/currentPageIndex.md) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [progressLabel](../widgets_signup_progress_indicator/SignupProgressIndicator/progressLabel.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html)> + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_signup_progress_indicator/SignupProgressIndicator/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/SignupProgressIndicator.md b/talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/SignupProgressIndicator.md new file mode 100644 index 000000000..a3b52a67b --- /dev/null +++ b/talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/SignupProgressIndicator.md @@ -0,0 +1,30 @@ + + + +# SignupProgressIndicator constructor + + + + + + + +SignupProgressIndicator({required [Key](https://api.flutter.dev/flutter/foundation/Key-class.html) key, required [int](https://api.flutter.dev/flutter/dart-core/int-class.html) currentPageIndex}) + + + + + +## Implementation + +```dart +SignupProgressIndicator({required Key key, required this.currentPageIndex}) + : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/build.md b/talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/build.md new file mode 100644 index 000000000..7ed129c74 --- /dev/null +++ b/talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/build.md @@ -0,0 +1,119 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@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.bodyMedium!.copyWith( + // If the flow index is greater than currentPageIndex then + // show green(visited) color else show fade(not visited) color. + color: index <= currentPageIndex + ? const Color(0xFF008A37) + : const Color(0xFF737373), + ), + textAlign: TextAlign.center, + ), + connectorBuilder: (_, index, __) { + return SolidLineConnector( + space: 30, + // If the flow index is greater than currentPageIndex then + // show green(visited) color else show fade(not visited) color. + 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/talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/currentPageIndex.md b/talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/currentPageIndex.md new file mode 100644 index 000000000..f5f2af3ea --- /dev/null +++ b/talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/currentPageIndex.md @@ -0,0 +1,32 @@ + + + +# currentPageIndex property + + + + + + + +[int](https://api.flutter.dev/flutter/dart-core/int-class.html) currentPageIndex + +_final_ + + + + + + +## Implementation + +```dart +final int currentPageIndex; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/progressLabel.md b/talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/progressLabel.md new file mode 100644 index 000000000..7bb05930d --- /dev/null +++ b/talawa-mobile-docs/widgets_signup_progress_indicator/SignupProgressIndicator/progressLabel.md @@ -0,0 +1,36 @@ + + + +# progressLabel property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[String](https://api.flutter.dev/flutter/dart-core/String-class.html)> progressLabel + +_final_ + + + + + + +## Implementation + +```dart +final List progressLabel = [ + 'Select\nOrganization', + 'Enter Details', + 'Final', +]; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_signup_progress_indicator/widgets_signup_progress_indicator-library.md b/talawa-mobile-docs/widgets_signup_progress_indicator/widgets_signup_progress_indicator-library.md new file mode 100644 index 000000000..4986b8387 --- /dev/null +++ b/talawa-mobile-docs/widgets_signup_progress_indicator/widgets_signup_progress_indicator-library.md @@ -0,0 +1,39 @@ + + + + +# signup_progress_indicator library + + + + + + + + + + + +## Classes + +##### [SignupProgressIndicator](../widgets_signup_progress_indicator/SignupProgressIndicator-class.md) + + + +This class returns a widget for showing the +progress indicator/flow while Signing Up/ Registration. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog-class.md b/talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog-class.md new file mode 100644 index 000000000..3718686e1 --- /dev/null +++ b/talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog-class.md @@ -0,0 +1,206 @@ + + + +# TalawaErrorDialog class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- TalawaErrorDialog + + + + + + + + +## Constructors + +[TalawaErrorDialog](../widgets_talawa_error_dialog/TalawaErrorDialog/TalawaErrorDialog.md) ([String](https://api.flutter.dev/flutter/dart-core/String-class.html) errorMessage, {[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [MessageType](../enums_enums/MessageType.md) messageType}) + + _const_ + + +## Properties + +##### [errorMessage](../widgets_talawa_error_dialog/TalawaErrorDialog/errorMessage.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [messageType](../widgets_talawa_error_dialog/TalawaErrorDialog/messageType.md) → [MessageType](../enums_enums/MessageType.md) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_talawa_error_dialog/TalawaErrorDialog/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/TalawaErrorDialog.md b/talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/TalawaErrorDialog.md new file mode 100644 index 000000000..7ae8a4bd2 --- /dev/null +++ b/talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/TalawaErrorDialog.md @@ -0,0 +1,33 @@ + + + +# TalawaErrorDialog constructor + + + + + + +const +TalawaErrorDialog([String](https://api.flutter.dev/flutter/dart-core/String-class.html) errorMessage, {[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [MessageType](../../enums_enums/MessageType.md) messageType}) + + + + + +## Implementation + +```dart +const TalawaErrorDialog( + this.errorMessage, { + Key? key, + required this.messageType, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/build.md b/talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/build.md new file mode 100644 index 000000000..a8c9273fa --- /dev/null +++ b/talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/build.md @@ -0,0 +1,168 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return SizedBox( + child: AlertDialog( + content: SizedBox( + width: 200, + height: 135, + child: Column( + children: [ + SvgPicture.asset( + messageType == MessageType.error + ? 'assets/images/Vector.svg' + : messageType == MessageType.warning + ? 'assets/images/Vector.svg' + : messageType == MessageType.info + ? 'assets/icons/Info.svg' + : 'assets/images/Vector.svg', + colorFilter: ColorFilter.mode( + messageType == MessageType.error + ? Colors.red + : messageType == MessageType.warning + ? Colors.yellow + : messageType == MessageType.info + ? Colors.green + : Colors.red, + BlendMode.srcIn, + ), + ), + const SizedBox( + height: 5, + ), + Text( + messageType == MessageType.error + ? AppLocalizations.of(context)!.strictTranslate('Error') + : messageType == MessageType.warning + ? AppLocalizations.of(context)! + .strictTranslate('Warning') + : messageType == MessageType.info + ? AppLocalizations.of(context)! + .strictTranslate('Information') + : AppLocalizations.of(context)! + .strictTranslate('Error'), + style: TextStyle( + color: messageType == MessageType.error + ? Colors.red + : messageType == MessageType.warning + ? Colors.yellow + : messageType == MessageType.info + ? Colors.green + : Colors.red, + fontSize: 20, + ), + textAlign: TextAlign.center, + ), + const SizedBox( + height: 5, + ), + AutoSizeText( + AppLocalizations.of(context)!.strictTranslate(errorMessage), + style: const TextStyle(fontSize: 16), + maxLines: 3, + ), + const SizedBox( + height: 19, + ), + ], + ), + ), + actions: [ + // Expanded( + // child: + TextButton( + style: TextButton.styleFrom( + backgroundColor: messageType == MessageType.error + ? Colors.red + : messageType == MessageType.warning + ? Colors.red + : messageType == MessageType.info + ? Colors.black26 + : Colors.red, + foregroundColor: Colors.red, + ), + child: Text( + messageType == MessageType.error + ? 'Dismiss' + : messageType == MessageType.warning + ? 'Dismiss' + : messageType == MessageType.info + ? 'Close' + : 'Dismiss', + style: const TextStyle(color: Color.fromRGBO(202, 202, 202, 1)), + ), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + // ), + ], + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/errorMessage.md b/talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/errorMessage.md new file mode 100644 index 000000000..b9844493a --- /dev/null +++ b/talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/errorMessage.md @@ -0,0 +1,32 @@ + + + +# errorMessage property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) errorMessage + +_final_ + + + + + + +## Implementation + +```dart +final String errorMessage; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/messageType.md b/talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/messageType.md new file mode 100644 index 000000000..62809db57 --- /dev/null +++ b/talawa-mobile-docs/widgets_talawa_error_dialog/TalawaErrorDialog/messageType.md @@ -0,0 +1,32 @@ + + + +# messageType property + + + + + + + +[MessageType](../../enums_enums/MessageType.md) messageType + +_final_ + + + + + + +## Implementation + +```dart +final MessageType messageType; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_talawa_error_dialog/widgets_talawa_error_dialog-library.md b/talawa-mobile-docs/widgets_talawa_error_dialog/widgets_talawa_error_dialog-library.md new file mode 100644 index 000000000..c5a3d6a1a --- /dev/null +++ b/talawa-mobile-docs/widgets_talawa_error_dialog/widgets_talawa_error_dialog-library.md @@ -0,0 +1,38 @@ + + + + +# talawa_error_dialog library + + + + + + + + + + + +## Classes + +##### [TalawaErrorDialog](../widgets_talawa_error_dialog/TalawaErrorDialog-class.md) + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar-class.md b/talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar-class.md new file mode 100644 index 000000000..8d8412b33 --- /dev/null +++ b/talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar-class.md @@ -0,0 +1,206 @@ + + + +# TalawaErrorSnackBar class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- TalawaErrorSnackBar + + + + + + + + +## Constructors + +[TalawaErrorSnackBar](../widgets_talawa_error_snackbar/TalawaErrorSnackBar/TalawaErrorSnackBar.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) errorMessage, required [MessageType](../enums_enums/MessageType.md) messageType}) + + _const_ + + +## Properties + +##### [errorMessage](../widgets_talawa_error_snackbar/TalawaErrorSnackBar/errorMessage.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [messageType](../widgets_talawa_error_snackbar/TalawaErrorSnackBar/messageType.md) → [MessageType](../enums_enums/MessageType.md) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_talawa_error_snackbar/TalawaErrorSnackBar/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/TalawaErrorSnackBar.md b/talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/TalawaErrorSnackBar.md new file mode 100644 index 000000000..c8d6fa0af --- /dev/null +++ b/talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/TalawaErrorSnackBar.md @@ -0,0 +1,33 @@ + + + +# TalawaErrorSnackBar constructor + + + + + + +const +TalawaErrorSnackBar({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) errorMessage, required [MessageType](../../enums_enums/MessageType.md) messageType}) + + + + + +## Implementation + +```dart +const TalawaErrorSnackBar({ + Key? key, + required this.errorMessage, + required this.messageType, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/build.md b/talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/build.md new file mode 100644 index 000000000..34867b9c1 --- /dev/null +++ b/talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/build.md @@ -0,0 +1,121 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return Row( + children: [ + Container( + width: 20, + height: 80, + decoration: BoxDecoration( + color: messageType == MessageType.error + ? Colors.red + : messageType == MessageType.warning + ? Colors.yellow + : messageType == MessageType.info + ? Colors.green + : Colors.red, + ), + ), + const SizedBox( + width: 10, + ), + Icon( + messageType == MessageType.error + ? Icons.error + : messageType == MessageType.warning + ? Icons.error + : messageType == MessageType.info + ? Icons.info_outline + : Icons.error, + // Icons.error, + color: messageType == MessageType.error + ? Colors.red + : messageType == MessageType.warning + ? Colors.yellow + : messageType == MessageType.info + ? Colors.green + : Colors.red, + size: 35, + ), + const SizedBox( + width: 10, + ), + Expanded( + flex: 1, + child: SingleChildScrollView( + scrollDirection: Axis.horizontal, + child: Text( + AppLocalizations.of(context)!.strictTranslate(errorMessage), + style: const TextStyle(color: Colors.white), + ), + ), + ) + ], + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/errorMessage.md b/talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/errorMessage.md new file mode 100644 index 000000000..b9844493a --- /dev/null +++ b/talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/errorMessage.md @@ -0,0 +1,32 @@ + + + +# errorMessage property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) errorMessage + +_final_ + + + + + + +## Implementation + +```dart +final String errorMessage; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/messageType.md b/talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/messageType.md new file mode 100644 index 000000000..62809db57 --- /dev/null +++ b/talawa-mobile-docs/widgets_talawa_error_snackbar/TalawaErrorSnackBar/messageType.md @@ -0,0 +1,32 @@ + + + +# messageType property + + + + + + + +[MessageType](../../enums_enums/MessageType.md) messageType + +_final_ + + + + + + +## Implementation + +```dart +final MessageType messageType; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_talawa_error_snackbar/widgets_talawa_error_snackbar-library.md b/talawa-mobile-docs/widgets_talawa_error_snackbar/widgets_talawa_error_snackbar-library.md new file mode 100644 index 000000000..cf70f2bf6 --- /dev/null +++ b/talawa-mobile-docs/widgets_talawa_error_snackbar/widgets_talawa_error_snackbar-library.md @@ -0,0 +1,38 @@ + + + + +# talawa_error_snackbar library + + + + + + + + + + + +## Classes + +##### [TalawaErrorSnackBar](../widgets_talawa_error_snackbar/TalawaErrorSnackBar-class.md) + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_form/DescriptionField-class.md b/talawa-mobile-docs/widgets_task_form/DescriptionField-class.md new file mode 100644 index 000000000..f6fad42ea --- /dev/null +++ b/talawa-mobile-docs/widgets_task_form/DescriptionField-class.md @@ -0,0 +1,188 @@ + + + +# DescriptionField class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- DescriptionField + + + + + + + + +## Constructors + +[DescriptionField](../widgets_task_form/DescriptionField/DescriptionField.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_task_form/DescriptionField/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_form/DescriptionField/DescriptionField.md b/talawa-mobile-docs/widgets_task_form/DescriptionField/DescriptionField.md new file mode 100644 index 000000000..cc0418776 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_form/DescriptionField/DescriptionField.md @@ -0,0 +1,29 @@ + + + +# DescriptionField constructor + + + + + + +const +DescriptionField({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const DescriptionField({Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_form/DescriptionField/build.md b/talawa-mobile-docs/widgets_task_form/DescriptionField/build.md new file mode 100644 index 000000000..27bb4f287 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_form/DescriptionField/build.md @@ -0,0 +1,100 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + final taskDescriptionTextController = context.select( + (CreateTaskViewModel model) => model.taskDescriptionTextController, + ); + + return TextFormField( + keyboardType: TextInputType.multiline, + controller: taskDescriptionTextController, + validator: (value) => Validator.validateEventForm(value!, 'Description'), + maxLines: 10, + minLines: 1, + decoration: InputDecoration( + hintText: 'Describe the task', + labelText: 'Add Description', + labelStyle: Theme.of(context).textTheme.titleMedium, + 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/talawa-mobile-docs/widgets_task_form/TaskForm-class.md b/talawa-mobile-docs/widgets_task_form/TaskForm-class.md new file mode 100644 index 000000000..6f56ca2b4 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_form/TaskForm-class.md @@ -0,0 +1,215 @@ + + + +# TaskForm class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- TaskForm + + + + + + + + +## Constructors + +[TaskForm](../widgets_task_form/TaskForm/TaskForm.md) ({required [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> onSave(), required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) title, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) actionText, [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [actionText](../widgets_task_form/TaskForm/actionText.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [onSave](../widgets_task_form/TaskForm/onSave.md) → [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> Function() + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [title](../widgets_task_form/TaskForm/title.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../widgets_task_form/TaskForm/createState.md)() [State](https://api.flutter.dev/flutter/widgets/State-class.html)<[TaskForm](../widgets_task_form/TaskForm-class.md)> + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_form/TaskForm/TaskForm.md b/talawa-mobile-docs/widgets_task_form/TaskForm/TaskForm.md new file mode 100644 index 000000000..4270294a8 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_form/TaskForm/TaskForm.md @@ -0,0 +1,34 @@ + + + +# TaskForm constructor + + + + + + +const +TaskForm({required [Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> onSave(), required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) title, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) actionText, [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const TaskForm({ + required this.onSave, + required this.title, + required this.actionText, + Key? key, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_form/TaskForm/actionText.md b/talawa-mobile-docs/widgets_task_form/TaskForm/actionText.md new file mode 100644 index 000000000..ca533420f --- /dev/null +++ b/talawa-mobile-docs/widgets_task_form/TaskForm/actionText.md @@ -0,0 +1,32 @@ + + + +# actionText property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) actionText + +_final_ + + + + + + +## Implementation + +```dart +final String actionText; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_form/TaskForm/createState.md b/talawa-mobile-docs/widgets_task_form/TaskForm/createState.md new file mode 100644 index 000000000..f74687116 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_form/TaskForm/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[State](https://api.flutter.dev/flutter/widgets/State-class.html)<[TaskForm](../../widgets_task_form/TaskForm-class.md)> createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +State createState() => _TaskFormState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_form/TaskForm/onSave.md b/talawa-mobile-docs/widgets_task_form/TaskForm/onSave.md new file mode 100644 index 000000000..3a1d1a70c --- /dev/null +++ b/talawa-mobile-docs/widgets_task_form/TaskForm/onSave.md @@ -0,0 +1,32 @@ + + + +# onSave property + + + + + + + +[Future](https://api.flutter.dev/flutter/dart-async/Future-class.html)<[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html)> Function() onSave + +_final_ + + + + + + +## Implementation + +```dart +final Future Function() onSave; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_form/TaskForm/title.md b/talawa-mobile-docs/widgets_task_form/TaskForm/title.md new file mode 100644 index 000000000..7c14a3864 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_form/TaskForm/title.md @@ -0,0 +1,32 @@ + + + +# title property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) title + +_final_ + + + + + + +## Implementation + +```dart +final String title; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_form/TitleField-class.md b/talawa-mobile-docs/widgets_task_form/TitleField-class.md new file mode 100644 index 000000000..3a1b005b5 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_form/TitleField-class.md @@ -0,0 +1,188 @@ + + + +# TitleField class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- TitleField + + + + + + + + +## Constructors + +[TitleField](../widgets_task_form/TitleField/TitleField.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_task_form/TitleField/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_form/TitleField/TitleField.md b/talawa-mobile-docs/widgets_task_form/TitleField/TitleField.md new file mode 100644 index 000000000..4ceaed2f9 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_form/TitleField/TitleField.md @@ -0,0 +1,29 @@ + + + +# TitleField constructor + + + + + + +const +TitleField({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const TitleField({Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_form/TitleField/build.md b/talawa-mobile-docs/widgets_task_form/TitleField/build.md new file mode 100644 index 000000000..8efb4db8d --- /dev/null +++ b/talawa-mobile-docs/widgets_task_form/TitleField/build.md @@ -0,0 +1,98 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + final taskTitleTextController = context + .select((CreateTaskViewModel model) => model.taskTitleTextController); + return TextFormField( + textInputAction: TextInputAction.next, + controller: taskTitleTextController, + keyboardType: TextInputType.name, + maxLength: 100, + validator: (value) => Validator.validateEventForm(value!, 'Title'), + decoration: InputDecoration( + labelText: 'Add Task Title', + isDense: true, + labelStyle: Theme.of(context).textTheme.titleMedium, + 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, + ), + ), + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_form/widgets_task_form-library.md b/talawa-mobile-docs/widgets_task_form/widgets_task_form-library.md new file mode 100644 index 000000000..a1a5faa5d --- /dev/null +++ b/talawa-mobile-docs/widgets_task_form/widgets_task_form-library.md @@ -0,0 +1,52 @@ + + + + +# task_form library + + + + + + + + + + + +## Classes + +##### [DescriptionField](../widgets_task_form/DescriptionField-class.md) + + + + + + +##### [TaskForm](../widgets_task_form/TaskForm-class.md) + + + + + + +##### [TitleField](../widgets_task_form/TitleField-class.md) + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_schedule/TaskCard-class.md b/talawa-mobile-docs/widgets_task_schedule/TaskCard-class.md new file mode 100644 index 000000000..75f697cb2 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_schedule/TaskCard-class.md @@ -0,0 +1,215 @@ + + + +# TaskCard class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- TaskCard + + + + + + + + +## Constructors + +[TaskCard](../widgets_task_schedule/TaskCard/TaskCard.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [Appointment](https://pub.dev/documentation/syncfusion_flutter_calendar/20.4.54/calendar/Appointment-class.html) appointment, required [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) showMoreOptions, required [Task](../models_task_task_model/Task-class.md) task}) + + _const_ + + +## Properties + +##### [appointment](../widgets_task_schedule/TaskCard/appointment.md) → [Appointment](https://pub.dev/documentation/syncfusion_flutter_calendar/20.4.54/calendar/Appointment-class.html) + + + + +_final_ + + + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [showMoreOptions](../widgets_task_schedule/TaskCard/showMoreOptions.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_final_ + + + +##### [task](../widgets_task_schedule/TaskCard/task.md) → [Task](../models_task_task_model/Task-class.md) + + + + +_final_ + + + + + +## Methods + +##### [build](../widgets_task_schedule/TaskCard/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_schedule/TaskCard/TaskCard.md b/talawa-mobile-docs/widgets_task_schedule/TaskCard/TaskCard.md new file mode 100644 index 000000000..1f611b973 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_schedule/TaskCard/TaskCard.md @@ -0,0 +1,34 @@ + + + +# TaskCard constructor + + + + + + +const +TaskCard({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [Appointment](https://pub.dev/documentation/syncfusion_flutter_calendar/20.4.54/calendar/Appointment-class.html) appointment, required [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) showMoreOptions, required [Task](../../models_task_task_model/Task-class.md) task}) + + + + + +## Implementation + +```dart +const TaskCard({ + Key? key, + required this.appointment, + required this.showMoreOptions, + required this.task, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_schedule/TaskCard/appointment.md b/talawa-mobile-docs/widgets_task_schedule/TaskCard/appointment.md new file mode 100644 index 000000000..7c06657a2 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_schedule/TaskCard/appointment.md @@ -0,0 +1,32 @@ + + + +# appointment property + + + + + + + +[Appointment](https://pub.dev/documentation/syncfusion_flutter_calendar/20.4.54/calendar/Appointment-class.html) appointment + +_final_ + + + + + + +## Implementation + +```dart +final Appointment appointment; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_schedule/TaskCard/build.md b/talawa-mobile-docs/widgets_task_schedule/TaskCard/build.md new file mode 100644 index 000000000..3ff8b0121 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_schedule/TaskCard/build.md @@ -0,0 +1,153 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return Container( + decoration: BoxDecoration( + color: appointment.color, + borderRadius: const BorderRadius.all( + Radius.circular(4), + ), + ), + padding: const EdgeInsets.only(left: 8), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + ' ${appointment.subject}', + style: const TextStyle( + fontWeight: FontWeight.w500, + fontSize: 18, + ), + ), + const SizedBox(height: 8), + Row( + children: [ + const Icon( + Icons.access_time_filled, + size: 16, + ), + const SizedBox(width: 4), + Text( + DateFormat('hh:mm a').format(appointment.endTime), + ), + ], + ), + ], + ), + showMoreOptions + ? IconButton( + onPressed: () { + navigationService.pushDialog( + AlertDialog( + title: Text( + 'User Actions', + style: TextStyle( + color: Theme.of(context).primaryColorLight, + ), + ), + actions: [ + TextButton( + child: const Text('Delete'), + onPressed: () { + context.read().deleteTask( + task.id, + task.creator.id!, + ); + navigationService.pop(); + }, + ), + TextButton( + child: const Text('Edit'), + onPressed: () { + navigationService.pop(); + navigationService.pushScreen( + Routes.editTask, + arguments: task, + ); + }, + ), + TextButton( + child: const Text('Cancel'), + onPressed: () => navigationService.pop(), + ), + ], + ), + ); + }, + icon: const Icon(Icons.more_vert), + ) + : Container(), + ], + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_schedule/TaskCard/showMoreOptions.md b/talawa-mobile-docs/widgets_task_schedule/TaskCard/showMoreOptions.md new file mode 100644 index 000000000..8ea655614 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_schedule/TaskCard/showMoreOptions.md @@ -0,0 +1,32 @@ + + + +# showMoreOptions property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) showMoreOptions + +_final_ + + + + + + +## Implementation + +```dart +final bool showMoreOptions; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_schedule/TaskCard/task.md b/talawa-mobile-docs/widgets_task_schedule/TaskCard/task.md new file mode 100644 index 000000000..3cf99076f --- /dev/null +++ b/talawa-mobile-docs/widgets_task_schedule/TaskCard/task.md @@ -0,0 +1,32 @@ + + + +# task property + + + + + + + +[Task](../../models_task_task_model/Task-class.md) task + +_final_ + + + + + + +## Implementation + +```dart +final Task task; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_schedule/TaskSchedule-class.md b/talawa-mobile-docs/widgets_task_schedule/TaskSchedule-class.md new file mode 100644 index 000000000..26e9e352d --- /dev/null +++ b/talawa-mobile-docs/widgets_task_schedule/TaskSchedule-class.md @@ -0,0 +1,215 @@ + + + +# TaskSchedule class + + + + + + + + + + + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- TaskSchedule + + + + + + + + +## Constructors + +[TaskSchedule](../widgets_task_schedule/TaskSchedule/TaskSchedule.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Task](../models_task_task_model/Task-class.md)> tasks, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) showMoreOptions = false}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [showMoreOptions](../widgets_task_schedule/TaskSchedule/showMoreOptions.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_final_ + + + +##### [tasks](../widgets_task_schedule/TaskSchedule/tasks.md) → [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Task](../models_task_task_model/Task-class.md)> + + + + +_final_ + + + + + +## Methods + +##### [build](../widgets_task_schedule/TaskSchedule/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [calendarTapped](../widgets_task_schedule/TaskSchedule/calendarTapped.md)([CalendarTapDetails](https://pub.dev/documentation/syncfusion_flutter_calendar/20.4.54/calendar/CalendarTapDetails-class.html) details) void + + + + + + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_schedule/TaskSchedule/TaskSchedule.md b/talawa-mobile-docs/widgets_task_schedule/TaskSchedule/TaskSchedule.md new file mode 100644 index 000000000..06e9a9ce6 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_schedule/TaskSchedule/TaskSchedule.md @@ -0,0 +1,33 @@ + + + +# TaskSchedule constructor + + + + + + +const +TaskSchedule({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Task](../../models_task_task_model/Task-class.md)> tasks, [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) showMoreOptions = false}) + + + + + +## Implementation + +```dart +const TaskSchedule({ + Key? key, + required this.tasks, + this.showMoreOptions = false, +}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_schedule/TaskSchedule/build.md b/talawa-mobile-docs/widgets_task_schedule/TaskSchedule/build.md new file mode 100644 index 000000000..88667691a --- /dev/null +++ b/talawa-mobile-docs/widgets_task_schedule/TaskSchedule/build.md @@ -0,0 +1,91 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + return SfCalendar( + view: CalendarView.schedule, + dataSource: _getCalendarDataSource(tasks), + scheduleViewSettings: const ScheduleViewSettings( + hideEmptyScheduleWeek: true, + appointmentItemHeight: 70, + monthHeaderSettings: MonthHeaderSettings( + height: 0, + ), + ), + onTap: calendarTapped, + appointmentBuilder: (context, appointments) { + final appointment = appointments.appointments.first as Appointment; + final task = tasks.firstWhere((task) => task.id == appointment.id); + return TaskCard( + appointment: appointment, + showMoreOptions: showMoreOptions, + task: task, + ); + }, + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_schedule/TaskSchedule/calendarTapped.md b/talawa-mobile-docs/widgets_task_schedule/TaskSchedule/calendarTapped.md new file mode 100644 index 000000000..8f719be54 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_schedule/TaskSchedule/calendarTapped.md @@ -0,0 +1,75 @@ + + + +# calendarTapped method + + + + + + + + +void calendarTapped +([CalendarTapDetails](https://pub.dev/documentation/syncfusion_flutter_calendar/20.4.54/calendar/CalendarTapDetails-class.html) details) + + + + + + + + +## Implementation + +```dart +void calendarTapped(CalendarTapDetails details) { + if (details.targetElement == CalendarElement.appointment || + details.targetElement == CalendarElement.agenda) { + final Appointment appointmentDetails = + details.appointments![0] as Appointment; + final subjectText = appointmentDetails.subject; + final dateText = + DateFormat('MMMM dd, yyyy').format(appointmentDetails.startTime); + final endTimeText = + DateFormat('hh:mm a').format(appointmentDetails.endTime); + final timeDetails = endTimeText; + + navigationService.pushDialog( + AlertDialog( + title: Text( + subjectText, + style: TextStyle( + color: Theme.of(navigationService.navigatorKey.currentContext!) + .primaryColorLight, + fontWeight: FontWeight.w500, + fontSize: 22, + ), + ), + content: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + Text(appointmentDetails.notes!), + const SizedBox(height: 10), + Text('$dateText $timeDetails') + ], + ), + actions: [ + TextButton( + onPressed: () => navigationService.pop(), + child: const Text('Close'), + ) + ], + ), + ); + } +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_schedule/TaskSchedule/showMoreOptions.md b/talawa-mobile-docs/widgets_task_schedule/TaskSchedule/showMoreOptions.md new file mode 100644 index 000000000..8ea655614 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_schedule/TaskSchedule/showMoreOptions.md @@ -0,0 +1,32 @@ + + + +# showMoreOptions property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) showMoreOptions + +_final_ + + + + + + +## Implementation + +```dart +final bool showMoreOptions; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_schedule/TaskSchedule/tasks.md b/talawa-mobile-docs/widgets_task_schedule/TaskSchedule/tasks.md new file mode 100644 index 000000000..d003e0b0e --- /dev/null +++ b/talawa-mobile-docs/widgets_task_schedule/TaskSchedule/tasks.md @@ -0,0 +1,32 @@ + + + +# tasks property + + + + + + + +[List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[Task](../../models_task_task_model/Task-class.md)> tasks + +_final_ + + + + + + +## Implementation + +```dart +final List tasks; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_task_schedule/widgets_task_schedule-library.md b/talawa-mobile-docs/widgets_task_schedule/widgets_task_schedule-library.md new file mode 100644 index 000000000..2510a7b76 --- /dev/null +++ b/talawa-mobile-docs/widgets_task_schedule/widgets_task_schedule-library.md @@ -0,0 +1,45 @@ + + + + +# task_schedule library + + + + + + + + + + + +## Classes + +##### [TaskCard](../widgets_task_schedule/TaskCard-class.md) + + + + + + +##### [TaskSchedule](../widgets_task_schedule/TaskSchedule-class.md) + + + + + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_theme_switch/ChangeThemeTile-class.md b/talawa-mobile-docs/widgets_theme_switch/ChangeThemeTile-class.md new file mode 100644 index 000000000..3a74a348c --- /dev/null +++ b/talawa-mobile-docs/widgets_theme_switch/ChangeThemeTile-class.md @@ -0,0 +1,190 @@ + + + +# ChangeThemeTile class + + + + + + + + + +

This class enables theme switch. +It returns a ListTile which contains a Toggle button to switch between Dark and Light Themes.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatelessWidget](https://api.flutter.dev/flutter/widgets/StatelessWidget-class.html) +- ChangeThemeTile + + + + + + + + +## Constructors + +[ChangeThemeTile](../widgets_theme_switch/ChangeThemeTile/ChangeThemeTile.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + + + +## Methods + +##### [build](../widgets_theme_switch/ChangeThemeTile/build.md)([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) + + + +Describes the part of the user interface represented by this widget. +_override_ + + + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatelessWidget/createElement.html)() [StatelessElement](https://api.flutter.dev/flutter/widgets/StatelessElement-class.html) + + + +Creates a StatelessElement to manage this widget's location in the tree. +_inherited_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_theme_switch/ChangeThemeTile/ChangeThemeTile.md b/talawa-mobile-docs/widgets_theme_switch/ChangeThemeTile/ChangeThemeTile.md new file mode 100644 index 000000000..88b586d9d --- /dev/null +++ b/talawa-mobile-docs/widgets_theme_switch/ChangeThemeTile/ChangeThemeTile.md @@ -0,0 +1,29 @@ + + + +# ChangeThemeTile constructor + + + + + + +const +ChangeThemeTile({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key}) + + + + + +## Implementation + +```dart +const ChangeThemeTile({Key? key}) : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_theme_switch/ChangeThemeTile/build.md b/talawa-mobile-docs/widgets_theme_switch/ChangeThemeTile/build.md new file mode 100644 index 000000000..bc0b2b30f --- /dev/null +++ b/talawa-mobile-docs/widgets_theme_switch/ChangeThemeTile/build.md @@ -0,0 +1,86 @@ + + + +# build method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +[Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) build +([BuildContext](https://api.flutter.dev/flutter/widgets/BuildContext-class.html) context) + +_override_ + + + +

Describes the part of the user interface represented by this widget.

+

The framework calls this method when this widget is inserted into the tree +in a given BuildContext and when the dependencies of this widget change +(e.g., an InheritedWidget referenced by this widget changes). This +method can potentially be called in every frame and should not have any side +effects beyond building a widget.

+

The framework replaces the subtree below this widget with the widget +returned by this method, either by updating the existing subtree or by +removing the subtree and inflating a new subtree, depending on whether the +widget returned by this method can update the root of the existing +subtree, as determined by calling Widget.canUpdate.

+

Typically implementations return a newly created constellation of widgets +that are configured with information from this widget's constructor and +from the given BuildContext.

+

The given BuildContext contains information about the location in the +tree at which this widget is being built. For example, the context +provides the set of inherited widgets for this location in the tree. A +given widget might be built with multiple different BuildContext +arguments over time if the widget is moved around the tree or if the +widget is inserted into the tree in multiple places at once.

+

The implementation of this method must only depend on:

+ +

If a widget's build method is to depend on anything else, use a +StatefulWidget instead.

+

See also:

+
    +
  • StatelessWidget, which contains the discussion on performance considerations.
  • +
+ + + +## Implementation + +```dart +@override +Widget build(BuildContext context) { + final themeProvider = Provider.of(context); + return ListTile( + key: const Key('ThemeSwitch'), + contentPadding: EdgeInsets.zero, + title: Text(AppLocalizations.of(context)!.strictTranslate("Dark Theme")), + trailing: Switch( + key: const Key('ToggleTheme'), + autofocus: true, + activeColor: Theme.of(context).colorScheme.primary, + value: themeProvider.isdarkTheme, + onChanged: (value) { + final provider = Provider.of(context, listen: false); + provider.switchTheme(isOn: value); + }, + ), + ); +} +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_theme_switch/widgets_theme_switch-library.md b/talawa-mobile-docs/widgets_theme_switch/widgets_theme_switch-library.md new file mode 100644 index 000000000..7eadafcb6 --- /dev/null +++ b/talawa-mobile-docs/widgets_theme_switch/widgets_theme_switch-library.md @@ -0,0 +1,39 @@ + + + + +# theme_switch library + + + + + + + + + + + +## Classes + +##### [ChangeThemeTile](../widgets_theme_switch/ChangeThemeTile-class.md) + + + +This class enables theme switch. +It returns a ListTile which contains a Toggle button to switch between Dark and Light Themes. + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_video_widget/VideoWidget-class.md b/talawa-mobile-docs/widgets_video_widget/VideoWidget-class.md new file mode 100644 index 000000000..162c160f8 --- /dev/null +++ b/talawa-mobile-docs/widgets_video_widget/VideoWidget-class.md @@ -0,0 +1,207 @@ + + + +# VideoWidget class + + + + + + + + + +

This class creates a video widget.

+ + + +**Inheritance** + +- [Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) +- [DiagnosticableTree](https://api.flutter.dev/flutter/foundation/DiagnosticableTree-class.html) +- [Widget](https://api.flutter.dev/flutter/widgets/Widget-class.html) +- [StatefulWidget](https://api.flutter.dev/flutter/widgets/StatefulWidget-class.html) +- VideoWidget + + + + + + + + +## Constructors + +[VideoWidget](../widgets_video_widget/VideoWidget/VideoWidget.md) ({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) url, required [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) play}) + + _const_ + + +## Properties + +##### [hashCode](https://api.flutter.dev/flutter/widgets/Widget/hashCode.html) → [int](https://api.flutter.dev/flutter/dart-core/int-class.html) + + + +The hash code for this object. +_read-onlyinherited_ + + + +##### [key](https://api.flutter.dev/flutter/widgets/Widget/key.html) → [Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? + + + +Controls how one widget replaces another widget in the tree. +_finalinherited_ + + + +##### [play](../widgets_video_widget/VideoWidget/play.md) → [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + + +_final_ + + + +##### [runtimeType](https://api.flutter.dev/flutter/dart-core/Object/runtimeType.html) → [Type](https://api.flutter.dev/flutter/dart-core/Type-class.html) + + + +A representation of the runtime type of the object. +_read-onlyinherited_ + + + +##### [url](../widgets_video_widget/VideoWidget/url.md) → [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + + +_final_ + + + + + +## Methods + +##### [createElement](https://api.flutter.dev/flutter/widgets/StatefulWidget/createElement.html)() [StatefulElement](https://api.flutter.dev/flutter/widgets/StatefulElement-class.html) + + + +Creates a StatefulElement to manage this widget's location in the tree. +_inherited_ + + + +##### [createState](../widgets_video_widget/VideoWidget/createState.md)() _VideoWidgetState + + + +Creates the mutable state for this widget at a given location in the tree. +_override_ + + + +##### [debugDescribeChildren](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/debugDescribeChildren.html)() [List](https://api.flutter.dev/flutter/dart-core/List-class.html)<[DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html)> + + + +Returns a list of DiagnosticsNode objects describing this node's +children. +_inherited_ + + + +##### [debugFillProperties](https://api.flutter.dev/flutter/widgets/Widget/debugFillProperties.html)([DiagnosticPropertiesBuilder](https://api.flutter.dev/flutter/foundation/DiagnosticPropertiesBuilder-class.html) properties) void + + + +Add additional properties associated with the node. +_inherited_ + + + +##### [noSuchMethod](https://api.flutter.dev/flutter/dart-core/Object/noSuchMethod.html)([Invocation](https://api.flutter.dev/flutter/dart-core/Invocation-class.html) invocation) dynamic + + + +Invoked when a non-existent method or property is accessed. +_inherited_ + + + +##### [toDiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toDiagnosticsNode.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html)? name, [DiagnosticsTreeStyle](https://api.flutter.dev/flutter/foundation/DiagnosticsTreeStyle.html)? style}) [DiagnosticsNode](https://api.flutter.dev/flutter/foundation/DiagnosticsNode-class.html) + + + +Returns a debug representation of the object that is used by debugging +tools and by DiagnosticsNode.toStringDeep. +_inherited_ + + + +##### [toString](https://api.flutter.dev/flutter/foundation/Diagnosticable/toString.html)({[DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.info}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A string representation of this object. +_inherited_ + + + +##### [toStringDeep](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringDeep.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) prefixLineOne = '', [String](https://api.flutter.dev/flutter/dart-core/String-class.html)? prefixOtherLines, [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a string representation of this node and its descendants. +_inherited_ + + + +##### [toStringShallow](https://api.flutter.dev/flutter/foundation/DiagnosticableTree/toStringShallow.html)({[String](https://api.flutter.dev/flutter/dart-core/String-class.html) joiner = ', ', [DiagnosticLevel](https://api.flutter.dev/flutter/foundation/DiagnosticLevel.html) minLevel = DiagnosticLevel.debug}) [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +Returns a one-line detailed description of the object. +_inherited_ + + + +##### [toStringShort](https://api.flutter.dev/flutter/widgets/Widget/toStringShort.html)() [String](https://api.flutter.dev/flutter/dart-core/String-class.html) + + + +A short, textual description of this widget. +_inherited_ + + + + + +## Operators + +##### [operator ==](https://api.flutter.dev/flutter/widgets/Widget/operator_equals.html)([Object](https://api.flutter.dev/flutter/dart-core/Object-class.html) other) [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) + + + +The equality operator. +_inherited_ + + + + + + + + + + + + + + + diff --git a/talawa-mobile-docs/widgets_video_widget/VideoWidget/VideoWidget.md b/talawa-mobile-docs/widgets_video_widget/VideoWidget/VideoWidget.md new file mode 100644 index 000000000..6e7a0763b --- /dev/null +++ b/talawa-mobile-docs/widgets_video_widget/VideoWidget/VideoWidget.md @@ -0,0 +1,30 @@ + + + +# VideoWidget constructor + + + + + + +const +VideoWidget({[Key](https://api.flutter.dev/flutter/foundation/Key-class.html)? key, required [String](https://api.flutter.dev/flutter/dart-core/String-class.html) url, required [bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) play}) + + + + + +## Implementation + +```dart +const VideoWidget({Key? key, required this.url, required this.play}) + : super(key: key); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_video_widget/VideoWidget/createState.md b/talawa-mobile-docs/widgets_video_widget/VideoWidget/createState.md new file mode 100644 index 000000000..723fd8374 --- /dev/null +++ b/talawa-mobile-docs/widgets_video_widget/VideoWidget/createState.md @@ -0,0 +1,49 @@ + + + +# createState method + + + + + + + +- @[override](https://api.flutter.dev/flutter/dart-core/override-constant.html) + +_VideoWidgetState createState +() + +_override_ + + + +

Creates the mutable state for this widget at a given location in the tree.

+

Subclasses should override this method to return a newly created +instance of their associated State subclass:

+
@override
+State<SomeWidget> createState() => _SomeWidgetState();
+
+

The framework can call this method multiple times over the lifetime of +a StatefulWidget. For example, if the widget is inserted into the tree +in multiple locations, the framework will create a separate State object +for each location. Similarly, if the widget is removed from the tree and +later inserted into the tree again, the framework will call createState +again to create a fresh State object, simplifying the lifecycle of +State objects.

+ + + +## Implementation + +```dart +@override +_VideoWidgetState createState() => _VideoWidgetState(); +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_video_widget/VideoWidget/play.md b/talawa-mobile-docs/widgets_video_widget/VideoWidget/play.md new file mode 100644 index 000000000..6a981df47 --- /dev/null +++ b/talawa-mobile-docs/widgets_video_widget/VideoWidget/play.md @@ -0,0 +1,32 @@ + + + +# play property + + + + + + + +[bool](https://api.flutter.dev/flutter/dart-core/bool-class.html) play + +_final_ + + + + + + +## Implementation + +```dart +final bool play; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_video_widget/VideoWidget/url.md b/talawa-mobile-docs/widgets_video_widget/VideoWidget/url.md new file mode 100644 index 000000000..872efdaa1 --- /dev/null +++ b/talawa-mobile-docs/widgets_video_widget/VideoWidget/url.md @@ -0,0 +1,32 @@ + + + +# url property + + + + + + + +[String](https://api.flutter.dev/flutter/dart-core/String-class.html) url + +_final_ + + + + + + +## Implementation + +```dart +final String url; +``` + + + + + + + diff --git a/talawa-mobile-docs/widgets_video_widget/widgets_video_widget-library.md b/talawa-mobile-docs/widgets_video_widget/widgets_video_widget-library.md new file mode 100644 index 000000000..bd07455d2 --- /dev/null +++ b/talawa-mobile-docs/widgets_video_widget/widgets_video_widget-library.md @@ -0,0 +1,38 @@ + + + + +# video_widget library + + + + + + + + + + + +## Classes + +##### [VideoWidget](../widgets_video_widget/VideoWidget-class.md) + + + +This class creates a video widget. + + + + + + + + + + + + + + + diff --git a/talawa_lint/bin/talawa_lint.dart b/talawa_lint/bin/talawa_lint.dart new file mode 100644 index 000000000..00f9a994e --- /dev/null +++ b/talawa_lint/bin/talawa_lint.dart @@ -0,0 +1,51 @@ +import 'dart:async'; +import 'dart:io'; + +import 'package:args/args.dart'; +import 'package:custom_lint/custom_lint.dart'; + +Future entrypoint([List args = const []]) async { + final parser = ArgParser() + ..addFlag( + 'watch', + help: "Watches plugins' sources and perform a hot-reload on change", + negatable: false, + ) + ..addFlag( + 'help', + abbr: 'h', + negatable: false, + help: 'Prints command usage', + ) + ..addMultiOption( + 'files', + abbr: 'f', + help: 'Takes a list of files as argument', + ); + final result = parser.parse(args); + + final help = result['help'] as bool; + if (help) { + stdout.writeln('Usage: custom_lint [--watch]'); + stdout.writeln(parser.usage); + return; + } + + final fileList = result['files'] as List; + + if (fileList.isNotEmpty) { + stdout.writeln("file mode"); + stdout.writeln(fileList[0]); + return; + } + + final watchMode = result['watch'] as bool; + + await customLint(workingDirectory: Directory.current, watchMode: watchMode); +} + +void main([List args = const []]) async { + await entrypoint(args); + // TODO figure out why this exit is necessary + exit(exitCode); +} diff --git a/talawa_lint/lib/helpers.dart b/talawa_lint/lib/helpers.dart new file mode 100644 index 000000000..bbb8ec0f9 --- /dev/null +++ b/talawa_lint/lib/helpers.dart @@ -0,0 +1,166 @@ +import 'package:analyzer/dart/ast/ast.dart'; +import 'package:analyzer/dart/ast/syntactic_entity.dart'; +import 'package:analyzer/dart/ast/token.dart'; +import 'package:analyzer/dart/element/element.dart'; +import 'package:analyzer/dart/element/type.dart'; +import 'package:analyzer/error/listener.dart'; +import 'package:custom_lint_builder/custom_lint_builder.dart'; + +SyntacticEntity? _getNodeToAnnotate(Declaration node) { + if (node is MethodDeclaration) { + return node.name; + } + if (node is ConstructorDeclaration) { + return node.name; + } + if (node is FieldDeclaration) { + return node.fields; + } + if (node is ClassTypeAlias) { + return node.name; + } + if (node is FunctionTypeAlias) { + return node.name; + } + if (node is ClassDeclaration) { + return node.name; + } + if (node is EnumDeclaration) { + return node.name; + } + if (node is ExtensionDeclaration) { + return node.name; + } + if (node is FunctionDeclaration) { + return node.name; + } + if (node is TopLevelVariableDeclaration) { + return node.variables; + } + if (node is EnumConstantDeclaration) { + return node.name; + } + if (node is TypeParameter) { + return node.name; + } + if (node is VariableDeclaration) { + return node.name; + } + return null; +} + +/// Returns the most specific AST node appropriate for associating errors. +SyntacticEntity getNodeToAnnotate(Declaration node) { + final mostSpecific = _getNodeToAnnotate(node); + return mostSpecific ?? node; +} + +Element? getOverriddenMember(Element? member) { + if (member == null) { + return null; + } + + return member.hasOverride ? member : null; + // final interfaceElement = member.thisOrAncestorOfType(); + // if (interfaceElement == null) { + // return null; + // } + // final name = member.name; + // if (name == null) { + // return null; + // } + + // final libraryUri = interfaceElement.library.source.uri; + // return context.inheritanceManager.getInherited( + // interfaceElement.thisType, + // Name(libraryUri, name), + // ); +} + +bool isOverridingMember(Declaration node) => + getOverriddenMember(node.declaredElement) != null; + +void checkMethods( + bool Function(Declaration) check, + List members, + ErrorReporter reporter, + LintRule rule, +) { + // Check methods + + final getters = {}; + final setters = []; + + // Non-getters/setters. + final methods = []; + + // Identify getter/setter pairs. + for (final member in members) { + // if (member is MethodDeclaration && !isPrivate(member.name)) { + if (member is MethodDeclaration) { + // print(member.parameters); + if (member.isGetter) { + getters[member.name.lexeme] = member; + } else if (member.isSetter) { + setters.add(member); + } else { + methods.add(member); + } + } + } + + // Check all getters, and collect offenders along the way. + final missingDocs = {}; + for (final getter in getters.values) { + if (check(getter)) { + missingDocs.add(getter); + } + } + + // But only setters whose getter is missing a doc. + for (final setter in setters) { + final getter = getters[setter.name.lexeme]; + if (getter != null && missingDocs.contains(getter)) { + check(setter); + } + } + + // Check remaining methods. + methods.forEach(check); +} + +/// Returns `true` if the given [id] is a Dart keyword. +bool isKeyWord(String id) => Keyword.keywords.containsKey(id); + +/// Returns `true` if the given [ClassMember] is a method. +bool isMethod(ClassMember m) => m is MethodDeclaration; + +/// Check if the given identifier has a private name. +bool isPrivate(Token? name) => + // ignore: avoid_bool_literals_in_conditional_expressions + name != null ? Identifier.isPrivateName(name.lexeme) : false; + +class TalawaLintHelpers { + static bool isVoid(Declaration node) { + return returnType(node) is VoidType || + returnType(node)?.getDisplayString( + withNullability: true, + ) == + "Future"; + } + + static bool isImplicitReturn(Declaration node) { + return ((node is FunctionDeclaration) + ? node.declaredElement?.hasImplicitReturnType + : (node as MethodDeclaration) + .declaredElement + ?.hasImplicitReturnType) ?? + false; + } + + static DartType? returnType(Declaration node) { + return (node is FunctionDeclaration) + ? node.returnType?.type + : (node as MethodDeclaration).returnType?.type; + } +} diff --git a/talawa_lint/lib/talawa_api_doc/talawa_api_doc.dart b/talawa_lint/lib/talawa_api_doc/talawa_api_doc.dart new file mode 100644 index 000000000..c9b7fd960 --- /dev/null +++ b/talawa_lint/lib/talawa_api_doc/talawa_api_doc.dart @@ -0,0 +1,85 @@ +import 'package:analyzer/error/error.dart'; +import 'package:analyzer/error/listener.dart'; +import 'package:custom_lint_builder/custom_lint_builder.dart'; +import 'package:talawa_lint/talawa_api_doc/talawa_api_doc_fixer.dart'; +import 'package:talawa_lint/talawa_api_doc/talawa_api_doc_visitor.dart'; + +class TalawaApiDocLintRule extends DartLintRule { + const TalawaApiDocLintRule() : super(code: _code); + + /// Metadata about the warning that will show-up in the IDE. + /// This is used for `// ignore: code` and enabling/disabling the lint + static const _code = LintCode( + name: 'talawa_api_doc', + problemMessage: 'No documentation found for this field.', + correctionMessage: "Add a valid documentation describing usecase.", + url: "https://docs.talawa.io/docs/developers/talawa/talawa-lint/", + errorSeverity: ErrorSeverity.WARNING, + ); + + @override + void run( + CustomLintResolver resolver, + ErrorReporter reporter, + CustomLintContext context, + ) { + final visitor = TalawaApiDocVisitor( + this, + context, + reporter, + ); + + if (reporter.source.fullName.contains(RegExp('.*/test/.*/.*test.dart')) || + reporter.source.fullName.contains(RegExp('.*/.*g.dart'))) { + return; + } + + context.registry.addClassDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addClassTypeAlias( + (node) => node.visitChildren(visitor), + ); + context.registry.addCompilationUnit( + (node) => node.visitChildren(visitor), + ); + context.registry.addConstructorDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addEnumConstantDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addEnumDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addExtensionDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addFieldDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addFunctionDeclaration( + (node) => visitor.check(node), + ); + context.registry.addFunctionTypeAlias( + (node) => node.visitChildren(visitor), + ); + context.registry.addGenericTypeAlias( + (node) => node.visitChildren(visitor), + ); + context.registry.addMixinDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addVariableDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addTopLevelVariableDeclaration( + (node) => node.visitChildren(visitor), + ); + } + + @override + List getFixes() => [ + TalawaAPIDocFixer(), + ]; +} diff --git a/talawa_lint/lib/talawa_api_doc/talawa_api_doc_fixer.dart b/talawa_lint/lib/talawa_api_doc/talawa_api_doc_fixer.dart new file mode 100644 index 000000000..f1136d71b --- /dev/null +++ b/talawa_lint/lib/talawa_api_doc/talawa_api_doc_fixer.dart @@ -0,0 +1,185 @@ +import 'package:analyzer/dart/ast/ast.dart'; +import 'package:analyzer/error/error.dart'; +import 'package:analyzer/source/source_range.dart'; +import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart'; +import 'package:custom_lint_builder/custom_lint_builder.dart'; +import 'package:talawa_lint/helpers.dart'; + +class TalawaAPIDocFixer extends DartFix { + @override + void run( + CustomLintResolver resolver, + ChangeReporter reporter, + CustomLintContext context, + AnalysisError analysisError, + List others, + ) { + context.registry.addVariableDeclaration( + (node) => fix(node, reporter, analysisError), + ); + context.registry.addClassDeclaration( + (node) => fix(node, reporter, analysisError), + ); + context.registry.addClassTypeAlias( + (node) => fix(node, reporter, analysisError), + ); + context.registry.addConstructorDeclaration( + (node) => fix(node, reporter, analysisError), + ); + context.registry.addEnumConstantDeclaration( + (node) => fix(node, reporter, analysisError), + ); + context.registry.addEnumDeclaration( + (node) => fix(node, reporter, analysisError), + ); + context.registry.addExtensionDeclaration( + (node) => fix(node, reporter, analysisError), + ); + context.registry.addFieldDeclaration( + (node) => fix(node, reporter, analysisError), + ); + context.registry.addFunctionDeclaration( + (node) => fix(node, reporter, analysisError), + ); + context.registry.addMethodDeclaration( + (node) => fix(node, reporter, analysisError), + ); + context.registry.addFunctionTypeAlias( + (node) => fix(node, reporter, analysisError), + ); + context.registry.addGenericTypeAlias( + (node) => fix(node, reporter, analysisError), + ); + context.registry.addMixinDeclaration( + (node) => fix(node, reporter, analysisError), + ); + context.registry.addTopLevelVariableDeclaration( + (node) => fix(node, reporter, analysisError), + ); + } + + void fix( + Declaration node, + ChangeReporter reporter, + AnalysisError analysisError, + ) { + // Verifying that the node and error offset match (collide) + + if (!analysisError.sourceRange.intersects(node.sourceRange)) return; + + // The [SourceRange] of the ClassDeclaration spans to the whole class + // and will intersect with everything inside it. This is a problem, as the + // error for it's fields will match to itself, and the fixes will be applied + // to the wrong place. + + if (node is ClassDeclaration && + !analysisError.sourceRange.intersects( + SourceRange( + node.offset, + node.leftBracket.offset - node.offset, + ), + )) return; + + // The same issue exists for Functions and Methods. We can define functions + // inside functions, and the same overlap of [SourceRange] occurs due to that + + if (node is FunctionDeclaration && + !analysisError.sourceRange.intersects( + SourceRange( + node.offset, + (node.functionExpression.parameters?.end ?? + node.name.length + node.name.offset) - + node.offset, + ), + )) return; + + if (node is MethodDeclaration && + !analysisError.sourceRange.intersects( + SourceRange( + node.offset, + (node.parameters?.offset ?? node.name.length + node.name.offset) - + node.offset, + ), + )) return; + + final changeBuilder = reporter.createChangeBuilder( + message: 'Insert Doc skeleton', + priority: 3, + ); + + changeBuilder.addDartFileEdit((builder) { + builder.addInsertion(node.offset, (builder) { + builder.write( + "/// a_line_ending_with_end_punctuation.\n" + "/// \n" + "/// more_info_if_required\n", + ); + + if (node is FunctionDeclaration || node is MethodDeclaration) { + fixFun( + node, + builder, + ); + } + }); + }); + } + + void fixFun( + Declaration node, + DartEditBuilder builder, + ) { + // Putting in these obvious checks because in the edge case when someone + // mistakenly calls this function on non-function type entities, the linter + // will simply crash without any plausible explanation. + + if (!(node is FunctionDeclaration || node is MethodDeclaration)) { + return; + } + + if (node is MethodDeclaration && (node.isGetter || node.isSetter)) { + return; + } + + final fnInfo = StringBuffer(); + + fnInfo.write( + "/// \n" + "/// **params**:\n", + ); + + final paramList = (node is FunctionDeclaration) + ? node.functionExpression.parameters?.parameters + : (node as MethodDeclaration).parameters?.parameters; + + if (paramList == null || paramList.isEmpty) { + fnInfo.write("/// None\n"); + } else { + for (final param in paramList) { + fnInfo.write("/// * `${param.name}`: define_the_param\n"); + } + } + + fnInfo.write( + "/// \n" + "/// **returns**:\n", + ); + + final isImplicitReturn = TalawaLintHelpers.isImplicitReturn(node); + final isVoid = TalawaLintHelpers.isVoid(node); + + final returnType = (node is FunctionDeclaration) + ? node.returnType + : (node as MethodDeclaration).returnType; + + if (isImplicitReturn || returnType == null) { + fnInfo.write("/// * `undef`: type_the_return\n"); + } else if (isVoid) { + fnInfo.write("/// None\n"); + } else { + fnInfo.write("/// * `$returnType`: define_the_return\n"); + } + + builder.write(fnInfo.toString()); + } +} diff --git a/talawa_lint/lib/talawa_api_doc/talawa_api_doc_visitor.dart b/talawa_lint/lib/talawa_api_doc/talawa_api_doc_visitor.dart new file mode 100644 index 000000000..fd64febd1 --- /dev/null +++ b/talawa_lint/lib/talawa_api_doc/talawa_api_doc_visitor.dart @@ -0,0 +1,168 @@ +import 'package:analyzer/dart/ast/ast.dart'; +import 'package:analyzer/dart/ast/token.dart'; +import 'package:analyzer/dart/ast/visitor.dart'; +import 'package:analyzer/error/listener.dart'; +import 'package:custom_lint_builder/custom_lint_builder.dart'; +import 'package:talawa_lint/helpers.dart'; + +class TalawaApiDocVisitor extends SimpleAstVisitor { + TalawaApiDocVisitor( + this.rule, + this.context, + this.reporter, + ); + + final LintRule rule; + final CustomLintContext context; + final ErrorReporter reporter; + + bool check(Declaration node) { + // if (node.documentationComment == null && !isOverridingMember(node)) { + // If the class extends [State], we don't want documentation + // for it + final extendsState = (node is ClassDeclaration) && + node.extendsClause?.superclass.element?.name == "State"; + final isMain = + (node is FunctionDeclaration) && node.declaredElement?.name == "main"; + + if (node.documentationComment == null && + !isOverridingMember(node) && + !extendsState && + !isMain) { + final errorNode = getNodeToAnnotate(node); + + reporter.reportErrorForOffset( + rule.code, + errorNode.offset, + errorNode.length, + ); + + return true; + } + + return false; + } + + @override + void visitClassDeclaration(ClassDeclaration node) { + _visitMembers(node, node.name, node.members); + } + + @override + void visitClassTypeAlias(ClassTypeAlias node) { + check(node); + } + + @override + void visitCompilationUnit(CompilationUnit node) { + final getters = {}; + final setters = []; + + // Check functions. + + // Non-getters/setters. + final functions = []; + + // Identify getter/setter pairs. + for (final member in node.declarations) { + if (member is FunctionDeclaration) { + final name = member.name; + if (!isPrivate(name) && name.lexeme != 'main') { + if (member.isGetter) { + getters[member.name.lexeme] = member; + } else if (member.isSetter) { + setters.add(member); + } else { + functions.add(member); + } + } + } + } + + // Check all getters, and collect offenders along the way. + final missingDocs = {}; + for (final getter in getters.values) { + if (check(getter)) { + missingDocs.add(getter); + } + } + + // But only setters whose getter is missing a doc. + for (final setter in setters) { + final getter = getters[setter.name.lexeme]; + if (getter != null && missingDocs.contains(getter)) { + check(setter); + } + } + + // Check remaining functions. + functions.forEach(check); + + super.visitCompilationUnit(node); + } + + @override + void visitConstructorDeclaration(ConstructorDeclaration node) { + // if (!inPrivateMember(node) && !isPrivate(node.name)) { + // check(node); + // } + } + + @override + void visitEnumConstantDeclaration(EnumConstantDeclaration node) { + check(node); + } + + @override + void visitEnumDeclaration(EnumDeclaration node) { + check(node); + checkMethods(check, node.members, reporter, rule); + } + + @override + void visitExtensionDeclaration(ExtensionDeclaration node) { + // if (node.name == null || isPrivate(node.name)) { + if (node.name == null) { + return; + } + + check(node); + checkMethods(check, node.members, reporter, rule); + } + + @override + void visitFieldDeclaration(FieldDeclaration node) { + for (final field in node.fields.variables) { + if (!isPrivate(field.name)) { + check(field); + } + } + } + + @override + void visitFunctionTypeAlias(FunctionTypeAlias node) { + check(node); + } + + @override + void visitGenericTypeAlias(GenericTypeAlias node) { + check(node); + } + + @override + void visitMixinDeclaration(MixinDeclaration node) { + _visitMembers(node, node.name, node.members); + } + + @override + void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { + for (final decl in node.variables.variables) { + check(decl); + } + } + + void _visitMembers(Declaration node, Token name, List members) { + check(node); + checkMethods(check, members, reporter, rule); + } +} diff --git a/talawa_lint/lib/talawa_good_doc/talawa_good_doc.dart b/talawa_lint/lib/talawa_good_doc/talawa_good_doc.dart new file mode 100644 index 000000000..4af28689d --- /dev/null +++ b/talawa_lint/lib/talawa_good_doc/talawa_good_doc.dart @@ -0,0 +1,80 @@ +import 'package:analyzer/error/error.dart'; +import 'package:analyzer/error/listener.dart'; +import 'package:custom_lint_builder/custom_lint_builder.dart'; +import 'package:talawa_lint/talawa_good_doc/talawa_good_doc_visitor.dart'; + +class TalawaGoodDocComments extends DartLintRule { + const TalawaGoodDocComments() : super(code: _code); + + /// Metadata about the warning that will show-up in the IDE. + /// This is used for `// ignore: code` and enabling/disabling the lint + static const _code = LintCode( + name: 'talawa_good_doc_comments', + problemMessage: 'Wrong comment format.', + correctionMessage: + 'Use "/// ..." for public api and "// ..." for other cases.', + url: "https://docs.talawa.io/docs/developers/talawa/talawa-lint/", + errorSeverity: ErrorSeverity.WARNING, + ); + + @override + void run( + CustomLintResolver resolver, + ErrorReporter reporter, + CustomLintContext context, + ) { + final visitor = TalawaGoodDocVisitor( + this, + context, + reporter, + ); + + if (reporter.source.fullName.contains(RegExp('.*/test/.*/.*test.dart')) || + reporter.source.fullName.contains(RegExp('.*/.*g.dart'))) { + return; + } + + context.registry.addClassDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addClassTypeAlias( + (node) => node.visitChildren(visitor), + ); + context.registry.addCompilationUnit( + (node) => node.visitChildren(visitor), + ); + context.registry.addConstructorDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addEnumConstantDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addEnumDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addExtensionDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addFieldDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addFunctionDeclaration( + visitor.check, + ); + context.registry.addFunctionTypeAlias( + (node) => node.visitChildren(visitor), + ); + context.registry.addGenericTypeAlias( + (node) => node.visitChildren(visitor), + ); + context.registry.addMixinDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addTopLevelVariableDeclaration( + (node) => node.visitChildren(visitor), + ); + context.registry.addComment( + (node) => node.visitChildren(visitor), + ); + } +} diff --git a/talawa_lint/lib/talawa_good_doc/talawa_good_doc_visitor.dart b/talawa_lint/lib/talawa_good_doc/talawa_good_doc_visitor.dart new file mode 100644 index 000000000..dcad849aa --- /dev/null +++ b/talawa_lint/lib/talawa_good_doc/talawa_good_doc_visitor.dart @@ -0,0 +1,413 @@ +// ignore_for_file: implementation_imports, depend_on_referenced_packages + +import 'package:_fe_analyzer_shared/src/scanner/token.dart'; +import 'package:analyzer/dart/ast/ast.dart'; +import 'package:analyzer/dart/ast/visitor.dart'; +import 'package:analyzer/error/listener.dart'; +import 'package:custom_lint_builder/custom_lint_builder.dart'; +import 'package:talawa_lint/helpers.dart'; +import 'package:talawa_lint/talawa_lint_rules.dart'; + +class TalawaGoodDocVisitor extends SimpleAstVisitor { + TalawaGoodDocVisitor( + this.rule, + this.context, + this.reporter, + ); + + final LintRule rule; + final CustomLintContext context; + final ErrorReporter reporter; + + @override + void visitClassDeclaration(ClassDeclaration node) { + _visitMembers(node, node.name, node.members); + } + + @override + void visitClassTypeAlias(ClassTypeAlias node) { + check(node); + } + + @override + void visitCompilationUnit(CompilationUnit node) { + final getters = {}; + final setters = []; + + // Non-getters/setters. + final functions = []; + + // Identify getter/setter pairs. + for (final member in node.declarations) { + if (member is FunctionDeclaration) { + final name = member.name; + if (!isPrivate(name) && name.lexeme != 'main') { + if (member.isGetter) { + getters[member.name.lexeme] = member; + } else if (member.isSetter) { + setters.add(member); + } else { + functions.add(member); + } + } + } + } + + // Check all getters, and collect offenders along the way. + final missingDocs = {}; + for (final getter in getters.values) { + if (check(getter)) { + missingDocs.add(getter); + } + } + + // But only setters whose getter is missing a doc. + for (final setter in setters) { + final getter = getters[setter.name.lexeme]; + if (getter != null && missingDocs.contains(getter)) { + check(setter); + } + } + + // Check remaining functions. + functions.forEach(check); + + super.visitCompilationUnit(node); + } + + @override + void visitConstructorDeclaration(ConstructorDeclaration node) { + check(node); + } + + @override + void visitEnumConstantDeclaration(EnumConstantDeclaration node) { + check(node); + } + + @override + void visitEnumDeclaration(EnumDeclaration node) { + check(node); + checkMethods(check, node.members, reporter, rule); + } + + @override + void visitExtensionDeclaration(ExtensionDeclaration node) { + if (node.name == null) { + return; + } + + check(node); + checkMethods(check, node.members, reporter, rule); + } + + @override + void visitFieldDeclaration(FieldDeclaration node) { + for (final field in node.fields.variables) { + if (!isPrivate(field.name)) { + check(field); + } + } + } + + @override + void visitFunctionTypeAlias(FunctionTypeAlias node) { + check(node); + } + + @override + void visitGenericTypeAlias(GenericTypeAlias node) { + check(node); + } + + @override + void visitMixinDeclaration(MixinDeclaration node) { + _visitMembers(node, node.name, node.members); + } + + @override + void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) { + for (final decl in node.variables.variables) { + check(decl); + } + } + + bool check(Declaration node) { + if (node.documentationComment == null) { + return false; + } + + final doc = node.documentationComment!.tokens; + if (!doc[0].lexeme.endsWith('.')) { + reporter.reportErrorForToken( + TalawaGoodDocLintRules.firstLineEndCode, + doc[0], + ); + } + + // Don't check for [setters] and [getters] + // TODO: Fix this completely + if (node is MethodDeclaration && (node.isGetter || node.isSetter)) { + return true; + } + + if (doc.length == 1) { + if (node is FunctionDeclaration || node is MethodDeclaration) { + reporter.reportErrorForNode( + TalawaGoodDocLintRules.includeParamsKeywordCode, + node.documentationComment!, + ); + + return false; + } else { + return true; + } + } + + // NOTE: The reason why we are checking for both '///' and '///' + // is because - + // + // 1. The extra space is automatically inserted whenever + // you hit 'enter' when on a line in documentation. + // 2. Flutter will automatically format and remove the extra + // space at the end when formatted + + if (doc[1].lexeme.trim() != '///') { + reporter.reportErrorForToken( + TalawaGoodDocLintRules.secondLineEmptyCode, + doc[1], + ); + } + + if (node is FunctionDeclaration || node is MethodDeclaration) { + if (checkContainsParams(doc, node)) { + checkContainsReturn(doc, node); + } + } + + return true; + } + + bool checkContainsParams(List doc, Declaration rawNode) { + final node = + rawNode is FunctionDeclaration ? rawNode : rawNode as MethodDeclaration; + + final params = rawNode is FunctionDeclaration + ? (node as FunctionDeclaration).functionExpression.parameters + : (node as MethodDeclaration).parameters; + + // If params is null or it is just '()' + // if (params == null || params.length == 2) { + // return; + // } + + bool containsParamsKeyword = false; + + // The line in the doc we are currently parsing + int currentDocLine = 0; + + for (; currentDocLine < doc.length; currentDocLine++) { + final line = doc[currentDocLine]; + if (line.lexeme == '/// **params**:') { + containsParamsKeyword = true; + currentDocLine++; + break; + } + } + + if (!containsParamsKeyword) { + reporter.reportErrorForNode( + TalawaGoodDocLintRules.includeParamsKeywordCode, + node.documentationComment!, + ); + + return false; + } + + final paramList = params?.parameterElements ?? []; + + if (paramList.isEmpty) { + if (currentDocLine == doc.length) { + return false; + } else if (doc[currentDocLine].lexeme != "/// None") { + reporter.reportErrorForToken( + TalawaGoodDocLintRules.noParamNone, + doc[currentDocLine], + ); + return false; + } + + return true; + } + + // The currentParam we are checking for + int currentParam = 0; + + for (; currentDocLine < doc.length; currentDocLine++) { + final line = doc[currentDocLine]; + + // If the line starts with '/// *', it must contain a param + if (line.length > 4 && line.lexeme[4] == '*') { + final paramRegex = RegExp( + '/// * `${paramList[currentParam]?.name}`:', + ); + + // TODO: RegExp.hasMatch() doesn't work for some reason. + if (!line.lexeme.startsWith(paramRegex.pattern)) { + if (line.lexeme.trim() == '/// **returns**:') { + reporter.reportErrorForToken( + TalawaGoodDocLintRules.allParamsNotDocumented, + line, + ); + + return false; + } + + reporter.reportErrorForToken( + TalawaGoodDocLintRules.startShouldFollowParam, + line, + ); + + return false; + } else { + if (line.lexeme.trim() == paramRegex.pattern) { + reporter.reportErrorForToken( + TalawaGoodDocLintRules.emptyParamDoc, + line, + ); + + return false; + } else { + currentParam++; + } + } + } + + if (currentParam == paramList.length) break; + } + + if (currentParam != paramList.length) { + reporter.reportErrorForNode( + TalawaGoodDocLintRules.allParamsNotDocumented, + node, + ); + + return false; + } + + return true; + } + + void checkContainsReturn( + List doc, + Declaration rawNode, + ) { + // Let the implicit_return_type warning be fixed first + + if (TalawaLintHelpers.isImplicitReturn(rawNode)) return; + + int currentDocLine = 0; + bool containsReturn = false; + + final node = + rawNode is FunctionDeclaration ? rawNode : rawNode as MethodDeclaration; + + for (; currentDocLine < doc.length; currentDocLine++) { + if (doc[currentDocLine].lexeme.trim() == '/// **returns**:') { + containsReturn = true; + break; + } + } + + final isVoid = TalawaLintHelpers.isVoid(node); + + if (!containsReturn) { + reporter.reportErrorForNode( + TalawaGoodDocLintRules.doesNotContainReturn, + node.documentationComment!, + ); + + return; + } + + // Check if there is atleast one blank line above + + if (doc[currentDocLine - 1].lexeme.trim() != '///') { + reporter.reportErrorForNode( + TalawaGoodDocLintRules.noBlankLineBWParamAndReturn, + node.documentationComment!, + ); + + return; + } + + // Uncomment below line if returns block is made optional for + // void types someday :) + + // if (isVoid && currentDocLine == doc.length) return; + + if (doc[currentDocLine].lexeme.trim() != '/// **returns**:') { + reporter.reportErrorForNode( + TalawaGoodDocLintRules.wrongReturnsDoc, + node.documentationComment!, + ); + + return; + } + + // Moving onto next lines and checking if documentation about + // the return type is found. + currentDocLine++; + + if (currentDocLine == doc.length) { + reporter.reportErrorForNode( + TalawaGoodDocLintRules.noReturnDoc, + node.documentationComment!, + ); + + return; + } + + // Moving ahead to find a line that contains information about the + // return type + currentDocLine++; + + // If return type is [void] and doc doesn't end with [None] or + // there are more lines to the doc + if (isVoid && + (doc[currentDocLine - 1].lexeme != '/// None' || + currentDocLine != doc.length)) { + reporter.reportErrorForNode( + TalawaGoodDocLintRules.noEndWithNoneForVoid, + node.documentationComment!, + ); + + return; + } + + final returnType = TalawaLintHelpers.returnType(node); + + // If return type is not [void] and doc doesn't end with [return_type] or + // there are more lines to the doc + final returnTypeDocPattern = RegExp( + '/// * `$returnType`:', + ); + + if (!isVoid && + !doc[currentDocLine - 1].lexeme.startsWith( + returnTypeDocPattern.pattern, + )) { + reporter.reportErrorForNode( + TalawaGoodDocLintRules.wrongReturnsDoc, + node.documentationComment!, + ); + + return; + } + } + + void _visitMembers(Declaration node, Token name, List members) { + check(node); + checkMethods(check, members, reporter, rule); + } +} diff --git a/talawa_lint/lib/talawa_lint.dart b/talawa_lint/lib/talawa_lint.dart new file mode 100644 index 000000000..a892f8433 --- /dev/null +++ b/talawa_lint/lib/talawa_lint.dart @@ -0,0 +1,16 @@ +// This is the entrypoint of our custom linter +import 'package:custom_lint_builder/custom_lint_builder.dart'; +import 'package:talawa_lint/talawa_api_doc/talawa_api_doc.dart'; +import 'package:talawa_lint/talawa_good_doc/talawa_good_doc.dart'; + +PluginBase createPlugin() => _ExampleLinter(); + +/// A plugin class is used to list all the assists/lints defined by a plugin. +class _ExampleLinter extends PluginBase { + /// We list all the custom warnings/infos/errors + @override + List getLintRules(CustomLintConfigs configs) => [ + const TalawaApiDocLintRule(), + const TalawaGoodDocComments(), + ]; +} diff --git a/talawa_lint/lib/talawa_lint_rules.dart b/talawa_lint/lib/talawa_lint_rules.dart new file mode 100644 index 000000000..54af9a3d4 --- /dev/null +++ b/talawa_lint/lib/talawa_lint_rules.dart @@ -0,0 +1,120 @@ +import 'package:analyzer/error/error.dart'; +import 'package:custom_lint_builder/custom_lint_builder.dart'; + +class TalawaAPIDocLintRules {} + +class TalawaGoodDocLintRules { + static const firstLineEndCode = LintCode( + name: 'talawa_good_doc_comments', + problemMessage: + "First line of the documentation doesn't end with end punctuation.", + correctionMessage: "End first line of documentation with '.', '!' etc", + url: "https://docs.talawa.io/docs/developers/talawa/talawa-lint/", + errorSeverity: ErrorSeverity.WARNING, + ); + + static const secondLineEmptyCode = LintCode( + name: 'talawa_good_doc_comments', + problemMessage: 'Second line of the doc is not empty.', + correctionMessage: + "Second line should be left empty to improve readability", + url: "https://docs.talawa.io/docs/developers/talawa/talawa-lint/", + errorSeverity: ErrorSeverity.WARNING, + ); + + static const includeParamsKeywordCode = LintCode( + name: 'talawa_good_doc_comments', + problemMessage: 'params block not found in the documentation.', + correctionMessage: "Include `**params**:` keyword in function/method doc", + url: "https://docs.talawa.io/docs/developers/talawa/talawa-lint/", + errorSeverity: ErrorSeverity.WARNING, + ); + + static const noParamNone = LintCode( + name: 'talawa_good_doc_comments', + problemMessage: 'Wrong doc format.', + correctionMessage: "Empty param list should be documented as `/// None`", + url: "https://docs.talawa.io/docs/developers/talawa/talawa-lint/", + errorSeverity: ErrorSeverity.WARNING, + ); + + static const startShouldFollowParam = LintCode( + name: 'talawa_good_doc_comments', + problemMessage: '* should follow a param name', + correctionMessage: "Make sure you have added a param name after *, and it\n" + "is in the same order as it appears in the function", + url: "https://docs.talawa.io/docs/developers/talawa/talawa-lint/", + errorSeverity: ErrorSeverity.WARNING, + ); + + static const emptyParamDoc = LintCode( + name: 'talawa_good_doc_comments', + problemMessage: 'No documentation is written for this parameter', + correctionMessage: "Param name should follow its documentation", + url: "https://docs.talawa.io/docs/developers/talawa/talawa-lint/", + errorSeverity: ErrorSeverity.WARNING, + ); + + static const allParamsNotDocumented = LintCode( + name: 'talawa_good_doc_comments', + problemMessage: 'Some parameters are missing documentation', + correctionMessage: "Please make sure that you have documented all\n" + "of the parameters in the same order as they appear in the function.", + url: "https://docs.talawa.io/docs/developers/talawa/talawa-lint/", + errorSeverity: ErrorSeverity.WARNING, + ); + + static const noBlankLineBWParamAndReturn = LintCode( + name: 'talawa_good_doc_comments', + problemMessage: 'Wrong doc format.', + correctionMessage: "Add a blank line between the end of 'params:' block\n" + "and start of 'returns:' block.", + url: "https://docs.talawa.io/docs/developers/talawa/talawa-lint/", + errorSeverity: ErrorSeverity.WARNING, + ); + + static const doesNotContainReturn = LintCode( + name: 'talawa_good_doc_comments', + problemMessage: 'Wrong doc format.', + correctionMessage: + "Documentation does not contain information about the return type.\n" + "Add '**returns**:' block followed by the return doc.", + url: "https://docs.talawa.io/docs/developers/talawa/talawa-lint/", + errorSeverity: ErrorSeverity.WARNING, + ); + + static const wrongReturnsDoc = LintCode( + name: 'talawa_good_doc_comments', + problemMessage: 'Wrong doc format.', + correctionMessage: + "Documentation format of return type is in wrong format.\n" + "For void type - \n" + "/// **returns**: \n/// None\n" + "For other types - \n" + "/// **returns**: \n" + "/// * `return_type`: documentation of the return type.", + url: "https://docs.talawa.io/docs/developers/talawa/talawa-lint/", + errorSeverity: ErrorSeverity.WARNING, + ); + + static const noReturnDoc = LintCode( + name: 'talawa_good_doc_comments', + problemMessage: 'Wrong doc format.', + correctionMessage: + "'**returns**:' should immediately be followed by documentation about\n" + "the return type", + url: "https://docs.talawa.io/docs/developers/talawa/talawa-lint/", + errorSeverity: ErrorSeverity.WARNING, + ); + + static const noEndWithNoneForVoid = LintCode( + name: 'talawa_good_doc_comments', + problemMessage: 'Wrong doc format.', + correctionMessage: + "A function/method with [void] return type must end with\n" + "`/// None`\n" + "without extra lines.", + url: "https://docs.talawa.io/docs/developers/talawa/talawa-lint/", + errorSeverity: ErrorSeverity.WARNING, + ); +} diff --git a/talawa_lint/pubspec.lock b/talawa_lint/pubspec.lock new file mode 100644 index 000000000..9469794a9 --- /dev/null +++ b/talawa_lint/pubspec.lock @@ -0,0 +1,357 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + sha256: "36a321c3d2cbe01cbcb3540a87b8843846e0206df3e691fa7b23e19e78de6d49" + url: "https://pub.dev" + source: hosted + version: "65.0.0" + analyzer: + dependency: "direct main" + description: + name: analyzer + sha256: dfe03b90ec022450e22513b5e5ca1f01c0c01de9c3fba2f7fd233cb57a6b9a07 + url: "https://pub.dev" + source: hosted + version: "6.3.0" + analyzer_plugin: + dependency: "direct main" + description: + name: analyzer_plugin + sha256: "9661b30b13a685efaee9f02e5d01ed9f2b423bd889d28a304d02d704aee69161" + url: "https://pub.dev" + source: hosted + version: "0.11.3" + args: + dependency: "direct main" + description: + name: args + sha256: eef6c46b622e0494a36c5a12d10d77fb4e855501a91c1b9ef9339326e58f0596 + url: "https://pub.dev" + source: hosted + version: "2.4.2" + async: + dependency: transitive + description: + name: async + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" + source: hosted + version: "2.11.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + checked_yaml: + dependency: transitive + description: + name: checked_yaml + sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff + url: "https://pub.dev" + source: hosted + version: "2.0.3" + ci: + dependency: transitive + description: + name: ci + sha256: "145d095ce05cddac4d797a158bc4cf3b6016d1fe63d8c3d2fbd7212590adca13" + url: "https://pub.dev" + source: hosted + version: "0.1.0" + cli_util: + dependency: transitive + description: + name: cli_util + sha256: c05b7406fdabc7a49a3929d4af76bcaccbbffcbcdcf185b082e1ae07da323d19 + url: "https://pub.dev" + source: hosted + version: "0.4.1" + collection: + dependency: transitive + description: + name: collection + sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a + url: "https://pub.dev" + source: hosted + version: "1.18.0" + convert: + dependency: transitive + description: + name: convert + sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" + url: "https://pub.dev" + source: hosted + version: "3.1.1" + crypto: + dependency: transitive + description: + name: crypto + sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab + url: "https://pub.dev" + source: hosted + version: "3.0.3" + custom_lint: + dependency: "direct main" + description: + name: custom_lint + sha256: dfb893ff17c83cf08676c6b64df11d3e53d80590978d7c1fb242afff3ba6dedb + url: "https://pub.dev" + source: hosted + version: "0.5.8" + custom_lint_builder: + dependency: "direct main" + description: + name: custom_lint_builder + sha256: "8df6634b38a36a6c6cb74a9c0eb02e9ba0b0ab89b29e38e6daa86e8ed2c6288d" + url: "https://pub.dev" + source: hosted + version: "0.5.8" + custom_lint_core: + dependency: transitive + description: + name: custom_lint_core + sha256: "2b235be098d157e244f18ea905a15a18c16a205e30553888fac6544bbf52f03f" + url: "https://pub.dev" + source: hosted + version: "0.5.8" + dart_style: + dependency: transitive + description: + name: dart_style + sha256: "40ae61a5d43feea6d24bd22c0537a6629db858963b99b4bc1c3db80676f32368" + url: "https://pub.dev" + source: hosted + version: "2.3.4" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + fixnum: + dependency: transitive + description: + name: fixnum + sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + freezed_annotation: + dependency: transitive + description: + name: freezed_annotation + sha256: c3fd9336eb55a38cc1bbd79ab17573113a8deccd0ecbbf926cca3c62803b5c2d + url: "https://pub.dev" + source: hosted + version: "2.4.1" + glob: + dependency: transitive + description: + name: glob + sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + hotreloader: + dependency: transitive + description: + name: hotreloader + sha256: "94ee21a60ea2836500799f3af035dc3212b1562027f1e0031c14e087f0231449" + url: "https://pub.dev" + source: hosted + version: "4.1.0" + json_annotation: + dependency: transitive + description: + name: json_annotation + sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 + url: "https://pub.dev" + source: hosted + version: "4.8.1" + lint: + dependency: "direct dev" + description: + name: lint + sha256: d758a5211fce7fd3f5e316f804daefecdc34c7e53559716125e6da7388ae8565 + url: "https://pub.dev" + source: hosted + version: "2.3.0" + logging: + dependency: transitive + description: + name: logging + sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + matcher: + dependency: transitive + description: + name: matcher + sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb + url: "https://pub.dev" + source: hosted + version: "0.12.16+1" + meta: + dependency: transitive + description: + name: meta + sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 + url: "https://pub.dev" + source: hosted + version: "1.11.0" + package_config: + dependency: transitive + description: + name: package_config + sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + path: + dependency: transitive + description: + name: path + sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" + url: "https://pub.dev" + source: hosted + version: "1.9.0" + pub_semver: + dependency: transitive + description: + name: pub_semver + sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + pubspec_parse: + dependency: transitive + description: + name: pubspec_parse + sha256: c63b2876e58e194e4b0828fcb080ad0e06d051cb607a6be51a9e084f47cb9367 + url: "https://pub.dev" + source: hosted + version: "1.2.3" + rxdart: + dependency: transitive + description: + name: rxdart + sha256: "0c7c0cedd93788d996e33041ffecda924cc54389199cde4e6a34b440f50044cb" + url: "https://pub.dev" + source: hosted + version: "0.27.7" + source_span: + dependency: transitive + description: + name: source_span + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" + url: "https://pub.dev" + source: hosted + version: "1.10.0" + sprintf: + dependency: transitive + description: + name: sprintf + sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" + url: "https://pub.dev" + source: hosted + version: "7.0.0" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + url: "https://pub.dev" + source: hosted + version: "1.11.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 + url: "https://pub.dev" + source: hosted + version: "2.1.2" + stream_transform: + dependency: transitive + description: + name: stream_transform + sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + url: "https://pub.dev" + source: hosted + version: "2.1.0" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" + source: hosted + version: "1.2.0" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" + source: hosted + version: "1.2.1" + test_api: + dependency: transitive + description: + name: test_api + sha256: "9955ae474176f7ac8ee4e989dadfb411a58c30415bcfb648fa04b2b8a03afa7f" + url: "https://pub.dev" + source: hosted + version: "0.7.0" + typed_data: + dependency: transitive + description: + name: typed_data + sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c + url: "https://pub.dev" + source: hosted + version: "1.3.2" + uuid: + dependency: transitive + description: + name: uuid + sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8 + url: "https://pub.dev" + source: hosted + version: "4.3.3" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 + url: "https://pub.dev" + source: hosted + version: "13.0.0" + watcher: + dependency: transitive + description: + name: watcher + sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + url: "https://pub.dev" + source: hosted + version: "1.1.0" + yaml: + dependency: transitive + description: + name: yaml + sha256: "75769501ea3489fca56601ff33454fe45507ea3bfb014161abc3b43ae25989d5" + url: "https://pub.dev" + source: hosted + version: "3.1.2" +sdks: + dart: ">=3.2.0 <4.0.0" diff --git a/talawa_lint/pubspec.yaml b/talawa_lint/pubspec.yaml new file mode 100644 index 000000000..e662f71c0 --- /dev/null +++ b/talawa_lint/pubspec.yaml @@ -0,0 +1,21 @@ +# pubspec.yaml +name: talawa_lint +environment: + sdk: ">=2.12.0 <4.0.0" + +dev_dependencies: + lint: ^2.3.0 + +dependencies: + # we will use analyzer for inspecting Dart files + # _fe_analyzer_shared: ^61.0.0 + analyzer: ">=5.12.0 <7.0.0" + analyzer_plugin: ^0.11.0 + # args: + + # custom_lint_builder will give us tools for writing lints + args: ^2.4.2 + custom_lint: 0.5.8 + custom_lint_builder: ^0.5.8 + # watcher: ^1.1.0 + diff --git a/test/flutter_test_config.dart b/test/flutter_test_config.dart new file mode 100644 index 000000000..a63fb510e --- /dev/null +++ b/test/flutter_test_config.dart @@ -0,0 +1,8 @@ +import 'dart:async'; + +import 'package:flutter_test/flutter_test.dart'; + +Future testExecutable(FutureOr Function() testMain) async { + WidgetController.hitTestWarningShouldBeFatal = true; + await testMain(); +} diff --git a/test/helpers/setup_firebase_mocks.dart b/test/helpers/setup_firebase_mocks.dart new file mode 100644 index 000000000..227194228 --- /dev/null +++ b/test/helpers/setup_firebase_mocks.dart @@ -0,0 +1,208 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +// ignore_for_file: return_of_invalid_type + +// import 'package:firebase_core/firebase_core.dart'; +// import 'package:firebase_core_platform_interface/firebase_core_platform_interface.dart'; +// import 'package:flutter/services.dart'; +// import 'package:flutter_test/flutter_test.dart'; +// import 'package:mockito/mockito.dart'; +// import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +// final kMockMessagingPlatform = MockFirebaseMessaging(); + +// Future neverEndingFuture() async { +// // ignore: literal_only_boolean_expressions +// while (true) { +// await Future.delayed(const Duration(minutes: 5)); +// } +// } + +// void setupFirebaseMocks() { +// TestWidgetsFlutterBinding.ensureInitialized(); + +// const firebaseChannel = MethodChannel( +// 'plugins.flutter.io/firebase_core', +// ); + +// // ignore: deprecated_member_use +// firebaseChannel.setMockMethodCallHandler((call) async { +// if (call.method == 'Firebase#initializeCore') { +// return [ +// { +// 'name': defaultFirebaseAppName, +// 'options': { +// 'apiKey': '123', +// 'appId': '123', +// 'messagingSenderId': '123', +// 'projectId': '123', +// }, +// 'pluginConstants': {}, +// } +// ]; +// } + +// if (call.method == 'Firebase#initializeApp') { +// final callArguments = call.arguments as Map; +// return { +// 'name': callArguments['appName'], +// 'options': callArguments['options'], +// 'pluginConstants': {}, +// }; +// } + +// return null; +// }); + +// when(kMockMessagingPlatform.delegateFor(app: anyNamed('app'))) +// .thenReturn(kMockMessagingPlatform); +// when( +// kMockMessagingPlatform.setInitialValues( +// isAutoInitEnabled: anyNamed('isAutoInitEnabled'), +// ), +// ).thenReturn(kMockMessagingPlatform); +// } + +// class MockFirebaseMessaging extends Mock +// with MockPlatformInterfaceMixin +// implements FirebaseMessagingPlatform { +// MockFirebaseMessaging() { +// TestFirebaseMessagingPlatform(); +// } + +// @override +// bool get isAutoInitEnabled { +// return super.noSuchMethod( +// Invocation.getter(#isAutoInitEnabled), +// returnValue: true, +// returnValueForMissingStub: true, +// ); +// } + +// @override +// FirebaseMessagingPlatform delegateFor({FirebaseApp? app}) { +// return super.noSuchMethod( +// Invocation.method(#delegateFor, [], {#app: app}), +// returnValue: TestFirebaseMessagingPlatform(), +// returnValueForMissingStub: TestFirebaseMessagingPlatform(), +// ); +// } + +// @override +// FirebaseMessagingPlatform setInitialValues({bool? isAutoInitEnabled}) { +// return super.noSuchMethod( +// Invocation.method( +// #setInitialValues, +// [], +// {#isAutoInitEnabled: isAutoInitEnabled}, +// ), +// returnValue: TestFirebaseMessagingPlatform(), +// returnValueForMissingStub: TestFirebaseMessagingPlatform(), +// ); +// } + +// @override +// Future getInitialMessage() { +// return super.noSuchMethod( +// Invocation.method(#getInitialMessage, []), +// returnValue: neverEndingFuture(), +// returnValueForMissingStub: neverEndingFuture(), +// ); +// } + +// @override +// Future deleteToken() { +// return super.noSuchMethod( +// Invocation.method(#deleteToken, []), +// returnValue: Future.value(), +// returnValueForMissingStub: Future.value(), +// ); +// } + +// @override +// Future getAPNSToken() { +// return super.noSuchMethod( +// Invocation.method(#getAPNSToken, []), +// returnValue: Future.value(''), +// returnValueForMissingStub: Future.value(''), +// ); +// } + +// @override +// Future getToken({String? vapidKey}) { +// return super.noSuchMethod( +// Invocation.method(#getToken, [], {#vapidKey: vapidKey}), +// returnValue: Future.value(''), +// returnValueForMissingStub: Future.value(''), +// ); +// } + +// @override +// Future setAutoInitEnabled(bool? enabled) { +// return super.noSuchMethod( +// Invocation.method(#setAutoInitEnabled, [enabled]), +// returnValue: Future.value(), +// returnValueForMissingStub: Future.value(), +// ); +// } + +// @override +// Stream get onTokenRefresh { +// return super.noSuchMethod( +// Invocation.getter(#onTokenRefresh), +// returnValue: const Stream.empty(), +// returnValueForMissingStub: const Stream.empty(), +// ); +// } + +// Comment out the notification logic for the MVP +// TODO: Re-enable notifications when needed for the final release. + +// @override +// Future requestPermission({ +// bool? alert = true, +// bool? announcement = false, +// bool? badge = true, +// bool? carPlay = false, +// bool? criticalAlert = false, +// bool? provisional = false, +// bool? sound = true, +// }) { +// return super.noSuchMethod( +// Invocation.method(#requestPermission, [], { +// #alert: alert, +// #announcement: announcement, +// #badge: badge, +// #carPlay: carPlay, +// #criticalAlert: criticalAlert, +// #provisional: provisional, +// #sound: sound, +// }), +// returnValue: neverEndingFuture(), +// returnValueForMissingStub: neverEndingFuture(), +// ); +// } + +// @override +// Future subscribeToTopic(String? topic) { +// return super.noSuchMethod( +// Invocation.method(#subscribeToTopic, [topic]), +// returnValue: Future.value(), +// returnValueForMissingStub: Future.value(), +// ); +// } + +// @override +// Future unsubscribeFromTopic(String? topic) { +// return super.noSuchMethod( +// Invocation.method(#unsubscribeFromTopic, [topic]), +// returnValue: Future.value(), +// returnValueForMissingStub: Future.value(), +// ); +// } +// } + +// class TestFirebaseMessagingPlatform extends FirebaseMessagingPlatform { +// TestFirebaseMessagingPlatform() : super(); +// } diff --git a/test/helpers/setup_hive.dart b/test/helpers/setup_hive.dart new file mode 100644 index 000000000..55cc63be5 --- /dev/null +++ b/test/helpers/setup_hive.dart @@ -0,0 +1,44 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:hive/hive.dart'; +import 'package:mockito/annotations.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; + +@GenerateMocks( + [ + HiveInterface, + Box, + ], + customMocks: [ + MockSpec( + as: Symbol('MockHiveBox'), + onMissingStub: OnMissingStub.returnDefault, + ), + ], +) +Future setUpUserInfoHive() async { + Hive + ..init("./temporaryPath") + ..registerAdapter(UserAdapter()) + ..registerAdapter(OrgInfoAdapter()); + + final userBox = await Hive.openBox('userInfo'); + return userBox; +} + +Future setUpURLHive() async { + Hive.init('test/fixtures/core'); + final urlBox = await Hive.openBox('url'); + return urlBox; +} + +Future setUpCurrentUserHive() async { + Hive + ..init('test/fixtures/core') + ..registerAdapter(UserAdapter()) + ..registerAdapter(OrgInfoAdapter()); + final user = await Hive.openBox('currentUser'); + return user; +} diff --git a/test/helpers/setup_hive.mocks.dart b/test/helpers/setup_hive.mocks.dart new file mode 100644 index 000000000..8b4dfda4a --- /dev/null +++ b/test/helpers/setup_hive.mocks.dart @@ -0,0 +1,837 @@ +// Mocks generated by Mockito 5.4.4 from annotations +// in talawa/test/helpers/setup_hive.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i3; +import 'dart:typed_data' as _i6; + +import 'package:hive/hive.dart' as _i2; +import 'package:hive/src/box/default_compaction_strategy.dart' as _i5; +import 'package:hive/src/box/default_key_comparator.dart' as _i4; +import 'package:mockito/mockito.dart' as _i1; +import 'package:mockito/src/dummies.dart' as _i7; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeBox_0 extends _i1.SmartFake implements _i2.Box { + _FakeBox_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeLazyBox_1 extends _i1.SmartFake implements _i2.LazyBox { + _FakeLazyBox_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// A class which mocks [HiveInterface]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockHiveInterface extends _i1.Mock implements _i2.HiveInterface { + MockHiveInterface() { + _i1.throwOnMissingStub(this); + } + + @override + void init( + String? path, { + _i2.HiveStorageBackendPreference? backendPreference = + _i2.HiveStorageBackendPreference.native, + }) => + super.noSuchMethod( + Invocation.method( + #init, + [path], + {#backendPreference: backendPreference}, + ), + returnValueForMissingStub: null, + ); + + @override + _i3.Future<_i2.Box> openBox( + String? name, { + _i2.HiveCipher? encryptionCipher, + _i2.KeyComparator? keyComparator = _i4.defaultKeyComparator, + _i2.CompactionStrategy? compactionStrategy = _i5.defaultCompactionStrategy, + bool? crashRecovery = true, + String? path, + _i6.Uint8List? bytes, + String? collection, + List? encryptionKey, + }) => + (super.noSuchMethod( + Invocation.method( + #openBox, + [name], + { + #encryptionCipher: encryptionCipher, + #keyComparator: keyComparator, + #compactionStrategy: compactionStrategy, + #crashRecovery: crashRecovery, + #path: path, + #bytes: bytes, + #collection: collection, + #encryptionKey: encryptionKey, + }, + ), + returnValue: _i3.Future<_i2.Box>.value(_FakeBox_0( + this, + Invocation.method( + #openBox, + [name], + { + #encryptionCipher: encryptionCipher, + #keyComparator: keyComparator, + #compactionStrategy: compactionStrategy, + #crashRecovery: crashRecovery, + #path: path, + #bytes: bytes, + #collection: collection, + #encryptionKey: encryptionKey, + }, + ), + )), + ) as _i3.Future<_i2.Box>); + + @override + _i3.Future<_i2.LazyBox> openLazyBox( + String? name, { + _i2.HiveCipher? encryptionCipher, + _i2.KeyComparator? keyComparator = _i4.defaultKeyComparator, + _i2.CompactionStrategy? compactionStrategy = _i5.defaultCompactionStrategy, + bool? crashRecovery = true, + String? path, + String? collection, + List? encryptionKey, + }) => + (super.noSuchMethod( + Invocation.method( + #openLazyBox, + [name], + { + #encryptionCipher: encryptionCipher, + #keyComparator: keyComparator, + #compactionStrategy: compactionStrategy, + #crashRecovery: crashRecovery, + #path: path, + #collection: collection, + #encryptionKey: encryptionKey, + }, + ), + returnValue: _i3.Future<_i2.LazyBox>.value(_FakeLazyBox_1( + this, + Invocation.method( + #openLazyBox, + [name], + { + #encryptionCipher: encryptionCipher, + #keyComparator: keyComparator, + #compactionStrategy: compactionStrategy, + #crashRecovery: crashRecovery, + #path: path, + #collection: collection, + #encryptionKey: encryptionKey, + }, + ), + )), + ) as _i3.Future<_i2.LazyBox>); + + @override + _i2.Box box(String? name) => (super.noSuchMethod( + Invocation.method( + #box, + [name], + ), + returnValue: _FakeBox_0( + this, + Invocation.method( + #box, + [name], + ), + ), + ) as _i2.Box); + + @override + _i2.LazyBox lazyBox(String? name) => (super.noSuchMethod( + Invocation.method( + #lazyBox, + [name], + ), + returnValue: _FakeLazyBox_1( + this, + Invocation.method( + #lazyBox, + [name], + ), + ), + ) as _i2.LazyBox); + + @override + bool isBoxOpen(String? name) => (super.noSuchMethod( + Invocation.method( + #isBoxOpen, + [name], + ), + returnValue: false, + ) as bool); + + @override + _i3.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future deleteBoxFromDisk( + String? name, { + String? path, + }) => + (super.noSuchMethod( + Invocation.method( + #deleteBoxFromDisk, + [name], + {#path: path}, + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future deleteFromDisk() => (super.noSuchMethod( + Invocation.method( + #deleteFromDisk, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + List generateSecureKey() => (super.noSuchMethod( + Invocation.method( + #generateSecureKey, + [], + ), + returnValue: [], + ) as List); + + @override + _i3.Future boxExists( + String? name, { + String? path, + }) => + (super.noSuchMethod( + Invocation.method( + #boxExists, + [name], + {#path: path}, + ), + returnValue: _i3.Future.value(false), + ) as _i3.Future); + + @override + void resetAdapters() => super.noSuchMethod( + Invocation.method( + #resetAdapters, + [], + ), + returnValueForMissingStub: null, + ); + + @override + void registerAdapter( + _i2.TypeAdapter? adapter, { + bool? internal = false, + bool? override = false, + }) => + super.noSuchMethod( + Invocation.method( + #registerAdapter, + [adapter], + { + #internal: internal, + #override: override, + }, + ), + returnValueForMissingStub: null, + ); + + @override + bool isAdapterRegistered(int? typeId) => (super.noSuchMethod( + Invocation.method( + #isAdapterRegistered, + [typeId], + ), + returnValue: false, + ) as bool); + + @override + void ignoreTypeId(int? typeId) => super.noSuchMethod( + Invocation.method( + #ignoreTypeId, + [typeId], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [Box]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockBox extends _i1.Mock implements _i2.Box { + MockBox() { + _i1.throwOnMissingStub(this); + } + + @override + Iterable get values => (super.noSuchMethod( + Invocation.getter(#values), + returnValue: [], + ) as Iterable); + + @override + String get name => (super.noSuchMethod( + Invocation.getter(#name), + returnValue: _i7.dummyValue( + this, + Invocation.getter(#name), + ), + ) as String); + + @override + bool get isOpen => (super.noSuchMethod( + Invocation.getter(#isOpen), + returnValue: false, + ) as bool); + + @override + bool get lazy => (super.noSuchMethod( + Invocation.getter(#lazy), + returnValue: false, + ) as bool); + + @override + Iterable get keys => (super.noSuchMethod( + Invocation.getter(#keys), + returnValue: [], + ) as Iterable); + + @override + int get length => (super.noSuchMethod( + Invocation.getter(#length), + returnValue: 0, + ) as int); + + @override + bool get isEmpty => (super.noSuchMethod( + Invocation.getter(#isEmpty), + returnValue: false, + ) as bool); + + @override + bool get isNotEmpty => (super.noSuchMethod( + Invocation.getter(#isNotEmpty), + returnValue: false, + ) as bool); + + @override + Iterable valuesBetween({ + dynamic startKey, + dynamic endKey, + }) => + (super.noSuchMethod( + Invocation.method( + #valuesBetween, + [], + { + #startKey: startKey, + #endKey: endKey, + }, + ), + returnValue: [], + ) as Iterable); + + @override + E? getAt(int? index) => (super.noSuchMethod(Invocation.method( + #getAt, + [index], + )) as E?); + + @override + Map toMap() => (super.noSuchMethod( + Invocation.method( + #toMap, + [], + ), + returnValue: {}, + ) as Map); + + @override + dynamic keyAt(int? index) => super.noSuchMethod(Invocation.method( + #keyAt, + [index], + )); + + @override + _i3.Stream<_i2.BoxEvent> watch({dynamic key}) => (super.noSuchMethod( + Invocation.method( + #watch, + [], + {#key: key}, + ), + returnValue: _i3.Stream<_i2.BoxEvent>.empty(), + ) as _i3.Stream<_i2.BoxEvent>); + + @override + bool containsKey(dynamic key) => (super.noSuchMethod( + Invocation.method( + #containsKey, + [key], + ), + returnValue: false, + ) as bool); + + @override + _i3.Future put( + dynamic key, + E? value, + ) => + (super.noSuchMethod( + Invocation.method( + #put, + [ + key, + value, + ], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future putAt( + int? index, + E? value, + ) => + (super.noSuchMethod( + Invocation.method( + #putAt, + [ + index, + value, + ], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future putAll(Map? entries) => (super.noSuchMethod( + Invocation.method( + #putAll, + [entries], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future add(E? value) => (super.noSuchMethod( + Invocation.method( + #add, + [value], + ), + returnValue: _i3.Future.value(0), + ) as _i3.Future); + + @override + _i3.Future> addAll(Iterable? values) => (super.noSuchMethod( + Invocation.method( + #addAll, + [values], + ), + returnValue: _i3.Future>.value([]), + ) as _i3.Future>); + + @override + _i3.Future delete(dynamic key) => (super.noSuchMethod( + Invocation.method( + #delete, + [key], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future deleteAt(int? index) => (super.noSuchMethod( + Invocation.method( + #deleteAt, + [index], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future deleteAll(Iterable? keys) => (super.noSuchMethod( + Invocation.method( + #deleteAll, + [keys], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future compact() => (super.noSuchMethod( + Invocation.method( + #compact, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future clear() => (super.noSuchMethod( + Invocation.method( + #clear, + [], + ), + returnValue: _i3.Future.value(0), + ) as _i3.Future); + + @override + _i3.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future deleteFromDisk() => (super.noSuchMethod( + Invocation.method( + #deleteFromDisk, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future flush() => (super.noSuchMethod( + Invocation.method( + #flush, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); +} + +/// A class which mocks [Box]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockHiveBox extends _i1.Mock implements _i2.Box { + @override + Iterable get values => (super.noSuchMethod( + Invocation.getter(#values), + returnValue: [], + returnValueForMissingStub: [], + ) as Iterable); + + @override + String get name => (super.noSuchMethod( + Invocation.getter(#name), + returnValue: _i7.dummyValue( + this, + Invocation.getter(#name), + ), + returnValueForMissingStub: _i7.dummyValue( + this, + Invocation.getter(#name), + ), + ) as String); + + @override + bool get isOpen => (super.noSuchMethod( + Invocation.getter(#isOpen), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + bool get lazy => (super.noSuchMethod( + Invocation.getter(#lazy), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + Iterable get keys => (super.noSuchMethod( + Invocation.getter(#keys), + returnValue: [], + returnValueForMissingStub: [], + ) as Iterable); + + @override + int get length => (super.noSuchMethod( + Invocation.getter(#length), + returnValue: 0, + returnValueForMissingStub: 0, + ) as int); + + @override + bool get isEmpty => (super.noSuchMethod( + Invocation.getter(#isEmpty), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + bool get isNotEmpty => (super.noSuchMethod( + Invocation.getter(#isNotEmpty), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + Iterable valuesBetween({ + dynamic startKey, + dynamic endKey, + }) => + (super.noSuchMethod( + Invocation.method( + #valuesBetween, + [], + { + #startKey: startKey, + #endKey: endKey, + }, + ), + returnValue: [], + returnValueForMissingStub: [], + ) as Iterable); + + @override + E? getAt(int? index) => (super.noSuchMethod( + Invocation.method( + #getAt, + [index], + ), + returnValueForMissingStub: null, + ) as E?); + + @override + Map toMap() => (super.noSuchMethod( + Invocation.method( + #toMap, + [], + ), + returnValue: {}, + returnValueForMissingStub: {}, + ) as Map); + + @override + dynamic keyAt(int? index) => super.noSuchMethod( + Invocation.method( + #keyAt, + [index], + ), + returnValueForMissingStub: null, + ); + + @override + _i3.Stream<_i2.BoxEvent> watch({dynamic key}) => (super.noSuchMethod( + Invocation.method( + #watch, + [], + {#key: key}, + ), + returnValue: _i3.Stream<_i2.BoxEvent>.empty(), + returnValueForMissingStub: _i3.Stream<_i2.BoxEvent>.empty(), + ) as _i3.Stream<_i2.BoxEvent>); + + @override + bool containsKey(dynamic key) => (super.noSuchMethod( + Invocation.method( + #containsKey, + [key], + ), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + _i3.Future put( + dynamic key, + E? value, + ) => + (super.noSuchMethod( + Invocation.method( + #put, + [ + key, + value, + ], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future putAt( + int? index, + E? value, + ) => + (super.noSuchMethod( + Invocation.method( + #putAt, + [ + index, + value, + ], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future putAll(Map? entries) => (super.noSuchMethod( + Invocation.method( + #putAll, + [entries], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future add(E? value) => (super.noSuchMethod( + Invocation.method( + #add, + [value], + ), + returnValue: _i3.Future.value(0), + returnValueForMissingStub: _i3.Future.value(0), + ) as _i3.Future); + + @override + _i3.Future> addAll(Iterable? values) => (super.noSuchMethod( + Invocation.method( + #addAll, + [values], + ), + returnValue: _i3.Future>.value([]), + returnValueForMissingStub: _i3.Future>.value([]), + ) as _i3.Future>); + + @override + _i3.Future delete(dynamic key) => (super.noSuchMethod( + Invocation.method( + #delete, + [key], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future deleteAt(int? index) => (super.noSuchMethod( + Invocation.method( + #deleteAt, + [index], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future deleteAll(Iterable? keys) => (super.noSuchMethod( + Invocation.method( + #deleteAll, + [keys], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future compact() => (super.noSuchMethod( + Invocation.method( + #compact, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future clear() => (super.noSuchMethod( + Invocation.method( + #clear, + [], + ), + returnValue: _i3.Future.value(0), + returnValueForMissingStub: _i3.Future.value(0), + ) as _i3.Future); + + @override + _i3.Future close() => (super.noSuchMethod( + Invocation.method( + #close, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future deleteFromDisk() => (super.noSuchMethod( + Invocation.method( + #deleteFromDisk, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); + + @override + _i3.Future flush() => (super.noSuchMethod( + Invocation.method( + #flush, + [], + ), + returnValue: _i3.Future.value(), + returnValueForMissingStub: _i3.Future.value(), + ) as _i3.Future); +} diff --git a/test/helpers/talawa_plugin_provider_test.dart b/test/helpers/talawa_plugin_provider_test.dart new file mode 100644 index 000000000..38c3c524f --- /dev/null +++ b/test/helpers/talawa_plugin_provider_test.dart @@ -0,0 +1,18 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/cupertino.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/plugins/talawa_plugin_provider.dart'; + +void main() { + test('TalwaPluginProvider Test', () async { + const talwaPluginProvider = TalawaPluginProvider( + pluginName: "sample", + visible: false, + child: Text("hi"), + ); + expect(talwaPluginProvider.visible, false); + expect(talwaPluginProvider.pluginName, "sample"); + }); +} diff --git a/test/helpers/test_helpers.dart b/test/helpers/test_helpers.dart new file mode 100644 index 000000000..dfdae1de6 --- /dev/null +++ b/test/helpers/test_helpers.dart @@ -0,0 +1,945 @@ +import 'dart:async'; +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:flutter/material.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:mockito/annotations.dart'; +import 'package:mockito/mockito.dart'; +import 'package:qr_code_scanner/qr_code_scanner.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/chats/chat_list_tile_data_model.dart'; +import 'package:talawa/models/chats/chat_message.dart'; +import 'package:talawa/models/chats/chat_user.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/chat_service.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/image_service.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/services/org_service.dart'; +import 'package:talawa/services/post_service.dart'; +import 'package:talawa/services/session_manager.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/services/third_party_service/multi_media_pick_service.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/utils/event_queries.dart'; +import 'package:talawa/utils/validators.dart'; +import 'package:talawa/view_model/after_auth_view_models/add_post_view_models/add_post_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/chat_view_models/direct_chat_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/chat_view_models/select_contact_view_model.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/event_info_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/profile_page_view_model.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/view_model/main_screen_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/signup_details_view_model.dart'; +import 'package:talawa/view_model/pre_auth_view_models/waiting_view_model.dart'; +import 'package:talawa/view_model/theme_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'; + +import '../service_tests/image_service_test.dart'; +import '../service_tests/user_config_test.dart'; +import '../views/main_screen_test.dart'; +import 'test_helpers.mocks.dart'; + +@GenerateMocks( + [], + customMocks: [ + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec( + onMissingStub: OnMissingStub.returnDefault, + ), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec( + onMissingStub: OnMissingStub.returnDefault, + ), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec( + onMissingStub: OnMissingStub.returnDefault, + ), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec( + onMissingStub: OnMissingStub.returnDefault, + ), + MockSpec( + onMissingStub: OnMissingStub.returnDefault, + ), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + MockSpec(onMissingStub: OnMissingStub.returnDefault), + ], +) + +/// member1 represents a member of the organization. +final User member1 = User(id: "testMem1"); + +/// member2 represents a member of the organization. +final User member2 = User(id: "testMem2"); + +/// admin1 represents an admin of the organization. +final User admin1 = User(id: "testAdmin1"); + +/// admin2 represents an admin of the organization. +final User admin2 = User(id: "testAdmin2"); + +/// members represents a list of members of the organization. +final List members = [member1, member2]; + +/// admins represents a list of admins of the organization. +final List admins = [admin1, admin2]; + +/// fakeOrgInfo represents a mock organization. +final fakeOrgInfo = OrgInfo( + id: "XYZ", + name: "Organization Name", + members: members, + admins: admins, + creatorInfo: User( + firstName: "ravidi", + lastName: "shaikh", + ), + userRegistrationRequired: true, +); + +/// `removeRegistrationIfExists` removes the registration of a service if it is already registered. +/// +/// **params**: +/// None +/// +/// **returns**: +/// None +void _removeRegistrationIfExists() { + if (locator.isRegistered()) { + locator.unregister(); + } +} + +/// `getAndRegisterNavigationService` returns a mock instance of the `NavigationService` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `NavigationService`: A mock instance of the `NavigationService` class. +NavigationService getAndRegisterNavigationService() { + _removeRegistrationIfExists(); + final service = MockNavigationService(); + when(service.navigatorKey).thenReturn(GlobalKey()); + when(service.removeAllAndPush(any, any, arguments: anyNamed('arguments'))) + .thenAnswer((_) async {}); + when(service.pushScreen(any, arguments: anyNamed('arguments'))) + .thenAnswer((_) async {}); + when(service.popAndPushScreen(any, arguments: '-1')).thenAnswer((_) async {}); + when(service.pushDialog(any)).thenAnswer((_) async {}); + locator.registerSingleton(service); + return service; +} + +/// `getAndRegisterOrganizationService` returns a mock instance of the `OrganizationService` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `OrganizationService`: A mock instance of the `OrganizationService` class. +OrganizationService getAndRegisterOrganizationService() { + _removeRegistrationIfExists(); + final service = MockOrganizationService(); + locator.registerSingleton(service); + + final User user1 = User( + id: "fakeUser1", + firstName: 'ayush', + lastName: 'chaudhary', + image: 'www.image.com', + ); + final User user2 = User( + id: "fakeUser2", + firstName: 'ayush', + lastName: 'chaudhary', + image: 'www.image.com', + ); + final List users = [user1, user2]; + when(service.getOrgMembersList('XYZ')).thenAnswer((realInvocation) async { + return users; + }); + return service; +} + +/// `getAndRegisterAppTheme` returns a mock instance of the `AppTheme` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `AppTheme`: A mock instance of the `AppTheme` class. +AppTheme getAndRegisterAppTheme() { + _removeRegistrationIfExists(); + final service = MockAppTheme(); + locator.registerSingleton(service); + return service; +} + +/// `getAndRegisterCommentService` returns a mock instance of the `CommentService` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `CommentService`: A mock instance of the `CommentService` class. +CommentService getAndRegisterCommentService() { + _removeRegistrationIfExists(); + final service = MockCommentService(); + locator.registerSingleton(service); + return service; +} + +/// `getAndRegisterSessionManager` returns a mock instance of the `SessionManager` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `SessionManager`: A mock instance of the `SessionManager` class. +SessionManager getAndRegisterSessionManager() { + _removeRegistrationIfExists(); + final service = MockSessionManger(); + locator.registerSingleton(service); + return service; +} + +/// `getAndRegisterChatService` returns a mock instance of the `ChatService` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `ChatService`: A mock instance of the `ChatService` class. +ChatService getAndRegisterChatService() { + _removeRegistrationIfExists(); + final service = MockChatService(); + final StreamController streamController = + StreamController(); + final Stream stream = + streamController.stream.asBroadcastStream(); + + final StreamController chatMessageController = + StreamController(); + final Stream messagestream = + chatMessageController.stream.asBroadcastStream(); + + when(service.chatListStream).thenAnswer((invocation) => stream); + when(service.chatMessagesStream).thenAnswer((invocation) => messagestream); + when(service.getDirectChatsByUserId()).thenAnswer( + (invocation) async => streamController.add( + ChatListTileDataModel( + [ + ChatUser( + firstName: 'test', + id: '1', + image: 'fakeHttp', + ), + ], + '1', + ), + ), + ); + locator.registerSingleton(service); + return service; +} + +/// `getAndRegisterAppLanguage` returns a mock instance of the `AppLanguage` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `AppLanguage`: A mock instance of the `AppLanguage` class. +AppLanguage getAndRegisterAppLanguage() { + _removeRegistrationIfExists(); + final service = MockAppLanguage(); + + when(service.appLocal).thenReturn(const Locale('en')); + + locator.registerSingleton(service); + return service; +} + +/// `getAndRegisterGraphqlConfig` returns a mock instance of the `GraphqlConfig` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `GraphqlConfig`: A mock instance of the `GraphqlConfig` class. +GraphqlConfig getAndRegisterGraphqlConfig() { + _removeRegistrationIfExists(); + final service = MockGraphqlConfig(); + + when(service.httpLink).thenReturn( + HttpLink( + 'https://talawa-graphql-api.herokuapp.com/graphql', + httpClient: MockHttpClient(), + ), + ); + + when(service.clientToQuery()).thenAnswer((realInvocation) { + // return GraphQLClient( + // cache: GraphQLCache(partialDataPolicy: PartialDataCachePolicy.accept), + // link: service.httpLink, + // ); + + return locator(); + }); + + when(service.authClient()).thenAnswer((realInvocation) { + // final AuthLink authLink = + // AuthLink(getToken: () async => 'Bearer ${GraphqlConfig.token}'); + // final Link finalAuthLink = authLink.concat(service.httpLink); + // return GraphQLClient( + // cache: GraphQLCache(partialDataPolicy: PartialDataCachePolicy.accept), + // link: finalAuthLink, + // ); + return locator(); + }); + + when(service.getToken()).thenAnswer((_) async => "sample_token"); + + locator.registerSingleton(service); + return service; +} + +/// `getAndRegisterGraphQLClient` returns a mock instance of the `GraphQLClient` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `GraphQLClient`: A mock instance of the `GraphQLClient` class. +GraphQLClient getAndRegisterGraphQLClient() { + _removeRegistrationIfExists(); + + final service = MockGraphQLClient(); + + // Either fill this with mock data or override this stub + // and return null + + when(service.query(any)).thenAnswer( + (realInvocation) async { + if (locator.isRegistered()) { + return Future.value( + QueryResult>( + source: QueryResultSource.network, + data: { + "getPlugins": null, + }, + options: QueryOptions( + document: gql(queries.getPluginsList()), + ), + ), + ); + } else { + return Future.value( + QueryResult>( + source: QueryResultSource.network, + data: null, + options: QueryOptions( + document: gql(queries.getPluginsList()), + ), + ), + ); + } + }, + ); + + when(service.defaultPolicies).thenAnswer( + (realInvocation) => DefaultPolicies(), + ); + when(service.queryManager).thenAnswer( + (realInvocation) => QueryManager( + link: HttpLink("testurl"), + cache: GraphQLCache(), + ), + ); + + locator.registerSingleton(service); + + return service; +} + +/// `getAndRegisterDatabaseMutationFunctions` returns a mock instance of the `DataBaseMutationFunctions` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `DataBaseMutationFunctions`: A mock instance of the `DataBaseMutationFunctions` class. +DataBaseMutationFunctions getAndRegisterDatabaseMutationFunctions() { + _removeRegistrationIfExists(); + final service = MockDataBaseMutationFunctions(); + when(service.refreshAccessToken('testtoken')).thenAnswer((_) async { + return true; + }); + when(service.fetchOrgById('fake_id')).thenAnswer((_) async { + return fakeOrgInfo; + }); + locator.registerSingleton(service); + return service; +} + +/// `getAndRegisterUserConfig` returns a mock instance of the `UserConfig` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `UserConfig`: A mock instance of the `UserConfig` class. +UserConfig getAndRegisterUserConfig() { + _removeRegistrationIfExists(); + final service = MockUserConfig(); + + when(service.userLoggedIn()).thenAnswer( + (realInvocation) => Future.value(false), + ); + + when(service.currentUser).thenReturn( + User( + id: 'id', + firstName: 'john', + lastName: 'snow', + ), + ); + + //Mock Data for current organizaiton. + when(service.currentOrg).thenReturn( + OrgInfo( + id: "XYZ", + name: "Organization Name", + members: members, + admins: admins, + ), + ); + + //Mock Stream for currentOrgStream + final StreamController streamController = StreamController(); + final Stream stream = streamController.stream.asBroadcastStream(); + when(service.currentOrgInfoController) + .thenAnswer((invocation) => streamController); + when(service.currentOrgInfoStream).thenAnswer((invocation) => stream); + + //Mkock current user + when(service.currentUser).thenReturn( + User( + id: "xzy1", + firstName: "Test", + lastName: "User", + email: "testuser@gmail.com", + refreshToken: "testtoken", + authToken: 'testtoken', + adminFor: [], + joinedOrganizations: [ + OrgInfo( + id: '3', + name: 'test org 3', + userRegistrationRequired: false, + creatorInfo: User(firstName: 'test', lastName: '1'), + ), + OrgInfo( + id: '4', + name: 'test org 4', + userRegistrationRequired: true, + creatorInfo: User(firstName: 'test', lastName: '2'), + ), + OrgInfo( + id: "XYZ", + name: "Organization Name", + ), + ], + membershipRequests: [ + OrgInfo( + id: '1', + name: 'test org', + userRegistrationRequired: true, + creatorInfo: User(firstName: 'test', lastName: 'test'), + ), + OrgInfo( + id: '2', + name: 'test org', + userRegistrationRequired: true, + creatorInfo: User(firstName: 'test', lastName: 'test'), + ), + ], + ), + ); + + locator.registerSingleton(service); + + return service; +} + +/// `getAndRegisterPostService` returns a mock instance of the `PostService` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `PostService`: A mock instance of the `PostService` class. +PostService getAndRegisterPostService() { + _removeRegistrationIfExists(); + final service = MockPostService(); + + //Mock Stream for currentOrgStream + final StreamController> streamController = StreamController(); + final Stream> stream = streamController.stream.asBroadcastStream(); + // _streamController.add(posts); + 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; +} + +/// `getAndRegisterMultiMediaPickerService` returns a mock instance of the `MultiMediaPickerService` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `MultiMediaPickerService`: A mock instance of the `MultiMediaPickerService` class. +MultiMediaPickerService getAndRegisterMultiMediaPickerService() { + _removeRegistrationIfExists(); + final service = MockMultiMediaPickerService(); + locator.registerSingleton(service); + return service; +} + +/// `getAndRegisterImageCropper` returns a mock instance of the `ImageCropper` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `ImageCropper`: A mock instance of the `ImageCropper` class. +ImageCropper getAndRegisterImageCropper() { + _removeRegistrationIfExists(); + final service = MockImageCropper(); + locator.registerLazySingleton(() => service); + return service; +} + +/// `getAndRegisterImageService` returns a mock instance of the `ImageService` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `ImageService`: A mock instance of the `ImageService` class. +ImageService getAndRegisterImageService() { + _removeRegistrationIfExists(); + final service = MockImageService(); + locator.registerLazySingleton(() => service); + return service; +} + +/// `getAndRegisterImagePicker` returns a mock instance of the `ImagePicker` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `ImagePicker`: A mock instance of the `ImagePicker` class. +ImagePicker getAndRegisterImagePicker() { + _removeRegistrationIfExists(); + final service = MockImagePicker(); + locator.registerLazySingleton(() => service); + return service; +} + +/// `getAndRegisterEventService` returns a mock instance of the `EventService` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `EventService`: A mock instance of the `EventService` class. +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); + when(service.getEvents()).thenAnswer( + (invocation) async => streamController.add( + Event( + id: '1', + title: 'test', + startTime: '10000', + endTime: '20000', + location: 'ABC', + description: 'test', + creator: User( + id: "xzy1", + firstName: "Test", + lastName: "User", + email: "testuser@gmail.com", + refreshToken: "testtoken", + authToken: 'testtoken', + ), + admins: [ + User( + id: "xzy1", + firstName: "Test", + lastName: "User", + ), + ], + isPublic: true, + organization: OrgInfo(id: 'XYZ'), + ), + ), + ); + const data = { + 'getEventAttendeesByEventId': [ + { + 'userId': 'xzy1', + } + ], + }; + when(service.fetchAttendeesByEvent('1')).thenAnswer( + (realInvocation) async => QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions( + document: gql( + EventQueries().attendeesByEvent('1'), + ), + ), + ), + ); + + locator.registerSingleton(service); + return service; +} + +/// `getAndRegisterConnectivityService` returns a mock instance of the `Connectivity` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `Connectivity`: A mock instance of the `Connectivity` class. +Connectivity getAndRegisterConnectivityService() { + _removeRegistrationIfExists(); + final service = MockConnectivity(); + locator.registerSingleton(service); + return service; +} + +/// `getPostMockModel` returns a mock instance of the `Post` class. +/// +/// **params**: +/// * `sId`: represent the post id. +/// * `description`: represent the post description. +/// * `duration`: represent the post duration. +/// +/// **returns**: +/// * `Post`: A mock instance of the `Post` class. +Post getPostMockModel({ + String sId = "PostID", + String description = "TestDescription", + String duration = "2 Months Ago", +}) { + final postMock = MockPost(); + when(postMock.sId).thenReturn(sId); + when(postMock.creator).thenReturn( + User( + firstName: "TestName", + ), + ); + when(postMock.description).thenReturn(description); + when(postMock.comments).thenReturn([]); + when(postMock.getPostCreatedDuration()).thenReturn(duration); + return postMock; +} + +/// `getAndRegisterCreateEventModel` returns a mock instance of the `CreateEventViewModel` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `CreateEventViewModel`: A mock instance of the `CreateEventViewModel` class. +CreateEventViewModel getAndRegisterCreateEventModel() { + _removeRegistrationIfExists(); + final cachedViewModel = MockCreateEventViewModel(); + + final formKey = GlobalKey(); + final textEditingController = TextEditingController(); + final focusNode = FocusNode(); + + when(cachedViewModel.formKey).thenReturn(formKey); + when(cachedViewModel.titleFocus).thenReturn(focusNode); + when(cachedViewModel.locationFocus).thenReturn(focusNode); + when(cachedViewModel.descriptionFocus).thenReturn(focusNode); + when(cachedViewModel.eventLocationTextController) + .thenReturn(textEditingController); + when(cachedViewModel.eventTitleTextController) + .thenReturn(textEditingController); + when(cachedViewModel.eventDescriptionTextController) + .thenReturn(textEditingController); + when(cachedViewModel.eventStartDate).thenReturn(DateTime.now()); + when(cachedViewModel.eventEndDate).thenReturn(DateTime.now()); + when(cachedViewModel.eventStartTime).thenReturn(TimeOfDay.now()); + when(cachedViewModel.eventEndTime).thenReturn(TimeOfDay.now()); + when(cachedViewModel.isPublicSwitch).thenReturn(true); + when(cachedViewModel.isRegisterableSwitch).thenReturn(true); + + final User user1 = User( + id: "fakeUser1", + firstName: 'r', + lastName: 'p', + ); + + final mapType = {user1.id!: true}; + + when(cachedViewModel.getCurrentOrgUsersList()) + .thenAnswer((realInvocation) async { + return [user1]; + }); + + when(cachedViewModel.selectedMembers).thenReturn([user1]); + when(cachedViewModel.orgMembersList).thenReturn([user1]); + when(cachedViewModel.memberCheckedMap).thenReturn(mapType); + when(cachedViewModel.isAllDay).thenReturn(true); + when(cachedViewModel.eventStartTime).thenReturn(TimeOfDay.now()); + + when(cachedViewModel.eventEndTime).thenReturn( + TimeOfDay.now().replacing( + hour: + (TimeOfDay.now().hour + (TimeOfDay.now().minute >= 30 ? 1 : 0)) % 24, + minute: (TimeOfDay.now().minute + 30) % 60, + ), + ); + + when(cachedViewModel.removeUserFromList(userId: "fakeUser1")) + .thenAnswer((realInvocation) async { + when(cachedViewModel.selectedMembers).thenReturn([]); + }); + + when(cachedViewModel.createEvent()).thenAnswer((realInvocation) async { + print('called'); + }); + + locator.registerSingleton(cachedViewModel); + return cachedViewModel; +} + +/// `getAndRegisterDirectChatViewModel` returns a mock instance of the `DirectChatViewModel` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `DirectChatViewModel`: A mock instance of the `DirectChatViewModel` class. +DirectChatViewModel getAndRegisterDirectChatViewModel() { + _removeRegistrationIfExists(); + final cachedViewModel = MockDirectChatViewModel(); + final formKey = GlobalKey(); + final ChatUser chatUser1 = + ChatUser(firstName: "XYZ", id: "XYZ", image: "XYZ"); + final ChatUser chatUser2 = + ChatUser(firstName: "ABC", id: "ABC", image: "ABC"); + final ChatMessage chatMessage1 = + ChatMessage("XYZ", chatUser1, "XYZ", chatUser2); + final ChatMessage chatMessage2 = + ChatMessage("XYZ", chatUser1, "Something", chatUser2); + final Map> messages = { + "XYZ": [chatMessage1], + }; + final ChatListTileDataModel chatListTileDataModel1 = + ChatListTileDataModel([chatUser1, chatUser2], "XYZ"); + + when(cachedViewModel.listKey).thenReturn(formKey); + // Default is the loaded state + when(cachedViewModel.chatState).thenReturn(ChatState.complete); + when(cachedViewModel.name).thenReturn("XYZ"); + when(cachedViewModel.chats).thenReturn([chatListTileDataModel1]); + when(cachedViewModel.chatMessagesByUser).thenReturn(messages); + when(cachedViewModel.initialise()).thenAnswer((realInvocation) async {}); + when(cachedViewModel.sendMessageToDirectChat("XYZ", "Something")) + .thenAnswer((realInvocation) async { + messages['XYZ']?.add(chatMessage2); + }); + when(cachedViewModel.getChatMessages("XYZ")) + .thenAnswer((realInvocation) async {}); + when(cachedViewModel.chatName("XYZ")).thenAnswer((realInvocation) {}); + + locator.registerSingleton(cachedViewModel); + return cachedViewModel; +} + +/// `getAndRegisterExploreEventsViewModel` returns a mock instance of the `ExploreEventsViewModel` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `ExploreEventsViewModel`: A mock instance of the `ExploreEventsViewModel` class. +ExploreEventsViewModel getAndRegisterExploreEventsViewModel() { + _removeRegistrationIfExists(); + final cachedViewModel = MockExploreEventsViewModel(); + + const String chosenValue = 'All Events'; + const String emptyListMessage = "Looks like there aren't any events."; + + final EventService mockEventService = EventService(); + + when(cachedViewModel.eventService).thenReturn(mockEventService); + when(cachedViewModel.chosenValue).thenReturn(chosenValue); + when(cachedViewModel.emptyListMessage).thenReturn(emptyListMessage); + + locator.registerSingleton(cachedViewModel); + return cachedViewModel; +} + +/// `getAndRegisterMainViewModel` returns a mock instance of the `MainScreenViewModel` class. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `MainScreenViewModel`: A mock instance of the `MainScreenViewModel` class. +MainScreenViewModel getAndRegisterMainViewModel() { + _removeRegistrationIfExists(); + final cachedViewModel = MockMainScreenViewModel(); + + locator.registerSingleton(cachedViewModel); + return cachedViewModel; +} + +/// `registerServices` registers all the services required for the test. +/// +/// **params**: +/// None +/// +/// **returns**: +/// None +void registerServices() { + getAndRegisterNavigationService(); + getAndRegisterAppLanguage(); + getAndRegisterGraphQLClient(); + getAndRegisterGraphqlConfig(); + getAndRegisterUserConfig(); + getAndRegisterPostService(); + getAndRegisterEventService(); + getAndRegisterMultiMediaPickerService(); + getAndRegisterConnectivityService(); + getAndRegisterDatabaseMutationFunctions(); + getAndRegisterOrganizationService(); + getAndRegisterCommentService(); + getAndRegisterChatService(); + getAndRegisterImageCropper(); + getAndRegisterImagePicker(); +} + +/// `unregisterServices` unregisters all the services required for the test. +/// +/// **params**: +/// None +/// +/// **returns**: +/// None +void unregisterServices() { + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); +} + +/// registerViewModels registers all the view models required for the test. +/// +/// **params**: +/// None +/// +/// **returns**: +/// None +void registerViewModels() { + locator.registerFactory(() => MainScreenViewModel()); + locator.registerFactory(() => OrganizationFeedViewModel()); + locator.registerFactory(() => ExploreEventsViewModel()); + locator + .registerFactory(() => MockCreateEventViewModel()); + locator.registerFactory(() => AddPostViewModel()); + locator.registerFactory(() => ProfilePageViewModel()); + locator.registerFactory(() => LikeButtonViewModel()); + locator.registerFactory(() => SizeConfig()); + locator.registerFactory(() => DirectChatViewModel()); + locator.registerFactory(() => WaitingViewModel()); + locator.registerFactory(() => EventInfoViewModel()); + locator.registerFactory(() => ProgressDialogViewModel()); + locator.registerFactory(() => SelectOrganizationViewModel()); + locator.registerFactory(() => CustomDrawerViewModel()); + locator.registerFactory(() => SelectContactViewModel()); +} + +/// `unregisterViewModels` unregisters all the view models required for the test. +/// +/// **params**: +/// None +/// +/// **returns**: +/// None +void unregisterViewModels() { + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + locator.unregister(); + 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..a62b80318 --- /dev/null +++ b/test/helpers/test_helpers.mocks.dart @@ -0,0 +1,4321 @@ +// Mocks generated by Mockito 5.4.4 from annotations +// in talawa/test/helpers/test_helpers.dart. +// Do not manually edit this file. + +// ignore_for_file: no_leading_underscores_for_library_prefixes +import 'dart:async' as _i5; +import 'dart:io' as _i19; +import 'dart:ui' as _i10; + +import 'package:connectivity_plus/connectivity_plus.dart' as _i27; +import 'package:connectivity_plus_platform_interface/connectivity_plus_platform_interface.dart' + as _i28; +import 'package:flutter/material.dart' as _i1; +import 'package:graphql_flutter/graphql_flutter.dart' as _i3; +import 'package:image_cropper/src/cropper.dart' as _i41; +import 'package:image_cropper_platform_interface/image_cropper_platform_interface.dart' + as _i42; +import 'package:image_picker/image_picker.dart' as _i13; +import 'package:mockito/mockito.dart' as _i2; +import 'package:mockito/src/dummies.dart' as _i25; +import 'package:qr_code_scanner/src/qr_code_scanner.dart' as _i34; +import 'package:qr_code_scanner/src/types/barcode.dart' as _i35; +import 'package:qr_code_scanner/src/types/camera.dart' as _i36; +import 'package:qr_code_scanner/src/types/features.dart' as _i12; +import 'package:talawa/enums/enums.dart' as _i14; +import 'package:talawa/models/chats/chat_list_tile_data_model.dart' as _i22; +import 'package:talawa/models/chats/chat_message.dart' as _i23; +import 'package:talawa/models/events/event_model.dart' as _i20; +import 'package:talawa/models/organization/org_info.dart' as _i6; +import 'package:talawa/models/post/post_model.dart' as _i17; +import 'package:talawa/models/user/user_info.dart' as _i7; +import 'package:talawa/services/chat_service.dart' as _i21; +import 'package:talawa/services/comment_service.dart' as _i37; +import 'package:talawa/services/database_mutation_functions.dart' as _i9; +import 'package:talawa/services/event_service.dart' as _i11; +import 'package:talawa/services/graphql_config.dart' as _i15; +import 'package:talawa/services/navigation_service.dart' as _i8; +import 'package:talawa/services/org_service.dart' as _i30; +import 'package:talawa/services/post_service.dart' as _i16; +import 'package:talawa/services/third_party_service/multi_media_pick_service.dart' + as _i18; +import 'package:talawa/services/user_config.dart' as _i24; +import 'package:talawa/utils/validators.dart' as _i33; +import 'package:talawa/view_model/after_auth_view_models/chat_view_models/direct_chat_view_model.dart' + as _i40; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart' + as _i39; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/explore_events_view_model.dart' + as _i31; +import 'package:talawa/view_model/after_auth_view_models/feed_view_models/organization_feed_view_model.dart' + as _i32; +import 'package:talawa/view_model/lang_view_model.dart' as _i26; +import 'package:talawa/view_model/pre_auth_view_models/signup_details_view_model.dart' + as _i29; +import 'package:talawa/view_model/theme_view_model.dart' as _i38; +import 'package:talawa/widgets/custom_alert_dialog.dart' as _i4; + +// ignore_for_file: type=lint +// ignore_for_file: avoid_redundant_argument_values +// ignore_for_file: avoid_setters_without_getters +// ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package +// ignore_for_file: implementation_imports +// ignore_for_file: invalid_use_of_visible_for_testing_member +// ignore_for_file: prefer_const_constructors +// ignore_for_file: unnecessary_parenthesis +// ignore_for_file: camel_case_types +// ignore_for_file: subtype_of_sealed_class + +class _FakeGlobalKey_0> + extends _i2.SmartFake implements _i1.GlobalKey { + _FakeGlobalKey_0( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeHttpLink_1 extends _i2.SmartFake implements _i3.HttpLink { + _FakeHttpLink_1( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeWebSocketLink_2 extends _i2.SmartFake implements _i3.WebSocketLink { + _FakeWebSocketLink_2( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeGraphQLClient_3 extends _i2.SmartFake implements _i3.GraphQLClient { + _FakeGraphQLClient_3( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeDefaultPolicies_4 extends _i2.SmartFake + implements _i3.DefaultPolicies { + _FakeDefaultPolicies_4( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeLink_5 extends _i2.SmartFake implements _i3.Link { + _FakeLink_5( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeGraphQLCache_6 extends _i2.SmartFake implements _i3.GraphQLCache { + _FakeGraphQLCache_6( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeQueryManager_7 extends _i2.SmartFake implements _i3.QueryManager { + _FakeQueryManager_7( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeObservableQuery_8 extends _i2.SmartFake + implements _i3.ObservableQuery { + _FakeObservableQuery_8( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeQueryResult_9 extends _i2.SmartFake + implements _i3.QueryResult { + _FakeQueryResult_9( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeCustomAlertDialog_10 extends _i2.SmartFake + implements _i4.CustomAlertDialog { + _FakeCustomAlertDialog_10( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); + + @override + String toString({_i1.DiagnosticLevel? minLevel = _i1.DiagnosticLevel.info}) => + super.toString(); +} + +class _FakeStreamController_11 extends _i2.SmartFake + implements _i5.StreamController { + _FakeStreamController_11( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeOrgInfo_12 extends _i2.SmartFake implements _i6.OrgInfo { + _FakeOrgInfo_12( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeUser_13 extends _i2.SmartFake implements _i7.User { + _FakeUser_13( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeNavigationService_14 extends _i2.SmartFake + implements _i8.NavigationService { + _FakeNavigationService_14( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeDataBaseMutationFunctions_15 extends _i2.SmartFake + implements _i9.DataBaseMutationFunctions { + _FakeDataBaseMutationFunctions_15( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeLocale_16 extends _i2.SmartFake implements _i10.Locale { + _FakeLocale_16( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeTextEditingController_17 extends _i2.SmartFake + implements _i1.TextEditingController { + _FakeTextEditingController_17( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeFocusNode_18 extends _i2.SmartFake implements _i1.FocusNode { + _FakeFocusNode_18( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); + + @override + String toString({_i1.DiagnosticLevel? minLevel = _i1.DiagnosticLevel.info}) => + super.toString(); +} + +class _FakeGraphQLError_19 extends _i2.SmartFake implements _i3.GraphQLError { + _FakeGraphQLError_19( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeEventService_20 extends _i2.SmartFake implements _i11.EventService { + _FakeEventService_20( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeSystemFeatures_21 extends _i2.SmartFake + implements _i12.SystemFeatures { + _FakeSystemFeatures_21( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeTimeOfDay_22 extends _i2.SmartFake implements _i1.TimeOfDay { + _FakeTimeOfDay_22( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeDateTime_23 extends _i2.SmartFake implements DateTime { + _FakeDateTime_23( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +class _FakeLostDataResponse_24 extends _i2.SmartFake + implements _i13.LostDataResponse { + _FakeLostDataResponse_24( + Object parent, + Invocation parentInvocation, + ) : super( + parent, + parentInvocation, + ); +} + +/// 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<_i1.NavigatorState> get navigatorKey => (super.noSuchMethod( + Invocation.getter(#navigatorKey), + returnValue: _FakeGlobalKey_0<_i1.NavigatorState>( + this, + Invocation.getter(#navigatorKey), + ), + returnValueForMissingStub: _FakeGlobalKey_0<_i1.NavigatorState>( + this, + Invocation.getter(#navigatorKey), + ), + ) as _i1.GlobalKey<_i1.NavigatorState>); + + @override + set navigatorKey(_i1.GlobalKey<_i1.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: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future popAndPushScreen( + String? routeName, { + dynamic arguments, + }) => + (super.noSuchMethod( + Invocation.method( + #popAndPushScreen, + [routeName], + {#arguments: arguments}, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future pushReplacementScreen( + String? routeName, { + dynamic arguments, + }) => + (super.noSuchMethod( + Invocation.method( + #pushReplacementScreen, + [routeName], + {#arguments: arguments}, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future removeAllAndPush( + String? routeName, + String? tillRoute, { + dynamic arguments, + }) => + (super.noSuchMethod( + Invocation.method( + #removeAllAndPush, + [ + routeName, + tillRoute, + ], + {#arguments: arguments}, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.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 showTalawaErrorSnackBar( + String? errorMessage, + _i14.MessageType? messageType, + ) => + super.noSuchMethod( + Invocation.method( + #showTalawaErrorSnackBar, + [ + errorMessage, + messageType, + ], + ), + returnValueForMissingStub: null, + ); + + @override + void showTalawaErrorDialog( + String? errorMessage, + _i14.MessageType? messageType, + ) => + super.noSuchMethod( + Invocation.method( + #showTalawaErrorDialog, + [ + errorMessage, + messageType, + ], + ), + 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 _i15.GraphqlConfig { + @override + _i3.HttpLink get httpLink => (super.noSuchMethod( + Invocation.getter(#httpLink), + returnValue: _FakeHttpLink_1( + this, + Invocation.getter(#httpLink), + ), + returnValueForMissingStub: _FakeHttpLink_1( + this, + Invocation.getter(#httpLink), + ), + ) as _i3.HttpLink); + + @override + set httpLink(_i3.HttpLink? _httpLink) => super.noSuchMethod( + Invocation.setter( + #httpLink, + _httpLink, + ), + returnValueForMissingStub: null, + ); + + @override + _i3.WebSocketLink get webSocketLink => (super.noSuchMethod( + Invocation.getter(#webSocketLink), + returnValue: _FakeWebSocketLink_2( + this, + Invocation.getter(#webSocketLink), + ), + returnValueForMissingStub: _FakeWebSocketLink_2( + this, + Invocation.getter(#webSocketLink), + ), + ) as _i3.WebSocketLink); + + @override + set webSocketLink(_i3.WebSocketLink? _webSocketLink) => super.noSuchMethod( + Invocation.setter( + #webSocketLink, + _webSocketLink, + ), + returnValueForMissingStub: null, + ); + + @override + set displayImgRoute(String? _displayImgRoute) => super.noSuchMethod( + Invocation.setter( + #displayImgRoute, + _displayImgRoute, + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future getToken() => (super.noSuchMethod( + Invocation.method( + #getToken, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + void getOrgUrl() => super.noSuchMethod( + Invocation.method( + #getOrgUrl, + [], + ), + returnValueForMissingStub: null, + ); + + @override + _i3.GraphQLClient clientToQuery() => (super.noSuchMethod( + Invocation.method( + #clientToQuery, + [], + ), + returnValue: _FakeGraphQLClient_3( + this, + Invocation.method( + #clientToQuery, + [], + ), + ), + returnValueForMissingStub: _FakeGraphQLClient_3( + this, + Invocation.method( + #clientToQuery, + [], + ), + ), + ) as _i3.GraphQLClient); + + @override + _i3.GraphQLClient authClient() => (super.noSuchMethod( + Invocation.method( + #authClient, + [], + ), + returnValue: _FakeGraphQLClient_3( + this, + Invocation.method( + #authClient, + [], + ), + ), + returnValueForMissingStub: _FakeGraphQLClient_3( + this, + Invocation.method( + #authClient, + [], + ), + ), + ) as _i3.GraphQLClient); + + @override + void test() => super.noSuchMethod( + Invocation.method( + #test, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [GraphQLClient]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockGraphQLClient extends _i2.Mock implements _i3.GraphQLClient { + @override + _i3.DefaultPolicies get defaultPolicies => (super.noSuchMethod( + Invocation.getter(#defaultPolicies), + returnValue: _FakeDefaultPolicies_4( + this, + Invocation.getter(#defaultPolicies), + ), + returnValueForMissingStub: _FakeDefaultPolicies_4( + this, + Invocation.getter(#defaultPolicies), + ), + ) as _i3.DefaultPolicies); + + @override + set defaultPolicies(_i3.DefaultPolicies? _defaultPolicies) => + super.noSuchMethod( + Invocation.setter( + #defaultPolicies, + _defaultPolicies, + ), + returnValueForMissingStub: null, + ); + + @override + _i3.Link get link => (super.noSuchMethod( + Invocation.getter(#link), + returnValue: _FakeLink_5( + this, + Invocation.getter(#link), + ), + returnValueForMissingStub: _FakeLink_5( + this, + Invocation.getter(#link), + ), + ) as _i3.Link); + + @override + _i3.GraphQLCache get cache => (super.noSuchMethod( + Invocation.getter(#cache), + returnValue: _FakeGraphQLCache_6( + this, + Invocation.getter(#cache), + ), + returnValueForMissingStub: _FakeGraphQLCache_6( + this, + Invocation.getter(#cache), + ), + ) as _i3.GraphQLCache); + + @override + _i3.QueryManager get queryManager => (super.noSuchMethod( + Invocation.getter(#queryManager), + returnValue: _FakeQueryManager_7( + this, + Invocation.getter(#queryManager), + ), + returnValueForMissingStub: _FakeQueryManager_7( + this, + Invocation.getter(#queryManager), + ), + ) as _i3.QueryManager); + + @override + set queryManager(_i3.QueryManager? _queryManager) => super.noSuchMethod( + Invocation.setter( + #queryManager, + _queryManager, + ), + returnValueForMissingStub: null, + ); + + @override + _i3.GraphQLClient copyWith({ + _i3.Link? link, + _i3.GraphQLCache? cache, + _i3.DefaultPolicies? defaultPolicies, + bool? alwaysRebroadcast, + }) => + (super.noSuchMethod( + Invocation.method( + #copyWith, + [], + { + #link: link, + #cache: cache, + #defaultPolicies: defaultPolicies, + #alwaysRebroadcast: alwaysRebroadcast, + }, + ), + returnValue: _FakeGraphQLClient_3( + this, + Invocation.method( + #copyWith, + [], + { + #link: link, + #cache: cache, + #defaultPolicies: defaultPolicies, + #alwaysRebroadcast: alwaysRebroadcast, + }, + ), + ), + returnValueForMissingStub: _FakeGraphQLClient_3( + this, + Invocation.method( + #copyWith, + [], + { + #link: link, + #cache: cache, + #defaultPolicies: defaultPolicies, + #alwaysRebroadcast: alwaysRebroadcast, + }, + ), + ), + ) as _i3.GraphQLClient); + + @override + _i3.ObservableQuery watchQuery( + _i3.WatchQueryOptions? options) => + (super.noSuchMethod( + Invocation.method( + #watchQuery, + [options], + ), + returnValue: _FakeObservableQuery_8( + this, + Invocation.method( + #watchQuery, + [options], + ), + ), + returnValueForMissingStub: _FakeObservableQuery_8( + this, + Invocation.method( + #watchQuery, + [options], + ), + ), + ) as _i3.ObservableQuery); + + @override + _i3.ObservableQuery watchMutation( + _i3.WatchQueryOptions? options) => + (super.noSuchMethod( + Invocation.method( + #watchMutation, + [options], + ), + returnValue: _FakeObservableQuery_8( + this, + Invocation.method( + #watchMutation, + [options], + ), + ), + returnValueForMissingStub: _FakeObservableQuery_8( + this, + Invocation.method( + #watchMutation, + [options], + ), + ), + ) as _i3.ObservableQuery); + + @override + _i5.Future<_i3.QueryResult> query( + _i3.QueryOptions? options) => + (super.noSuchMethod( + Invocation.method( + #query, + [options], + ), + returnValue: _i5.Future<_i3.QueryResult>.value( + _FakeQueryResult_9( + this, + Invocation.method( + #query, + [options], + ), + )), + returnValueForMissingStub: _i5.Future<_i3.QueryResult>.value( + _FakeQueryResult_9( + this, + Invocation.method( + #query, + [options], + ), + )), + ) as _i5.Future<_i3.QueryResult>); + + @override + _i5.Future<_i3.QueryResult> mutate( + _i3.MutationOptions? options) => + (super.noSuchMethod( + Invocation.method( + #mutate, + [options], + ), + returnValue: _i5.Future<_i3.QueryResult>.value( + _FakeQueryResult_9( + this, + Invocation.method( + #mutate, + [options], + ), + )), + returnValueForMissingStub: _i5.Future<_i3.QueryResult>.value( + _FakeQueryResult_9( + this, + Invocation.method( + #mutate, + [options], + ), + )), + ) as _i5.Future<_i3.QueryResult>); + + @override + _i5.Stream<_i3.QueryResult> subscribe( + _i3.SubscriptionOptions? options) => + (super.noSuchMethod( + Invocation.method( + #subscribe, + [options], + ), + returnValue: _i5.Stream<_i3.QueryResult>.empty(), + returnValueForMissingStub: _i5.Stream<_i3.QueryResult>.empty(), + ) as _i5.Stream<_i3.QueryResult>); + + @override + _i5.Future<_i3.QueryResult> fetchMore( + _i3.FetchMoreOptions? fetchMoreOptions, { + required _i3.QueryOptions? originalOptions, + required _i3.QueryResult? previousResult, + }) => + (super.noSuchMethod( + Invocation.method( + #fetchMore, + [fetchMoreOptions], + { + #originalOptions: originalOptions, + #previousResult: previousResult, + }, + ), + returnValue: _i5.Future<_i3.QueryResult>.value( + _FakeQueryResult_9( + this, + Invocation.method( + #fetchMore, + [fetchMoreOptions], + { + #originalOptions: originalOptions, + #previousResult: previousResult, + }, + ), + )), + returnValueForMissingStub: _i5.Future<_i3.QueryResult>.value( + _FakeQueryResult_9( + this, + Invocation.method( + #fetchMore, + [fetchMoreOptions], + { + #originalOptions: originalOptions, + #previousResult: previousResult, + }, + ), + )), + ) as _i5.Future<_i3.QueryResult>); + + @override + Map? readQuery( + _i3.Request? request, { + bool? optimistic = true, + }) => + (super.noSuchMethod( + Invocation.method( + #readQuery, + [request], + {#optimistic: optimistic}, + ), + returnValueForMissingStub: null, + ) as Map?); + + @override + Map? readFragment( + _i3.FragmentRequest? fragmentRequest, { + bool? optimistic = true, + }) => + (super.noSuchMethod( + Invocation.method( + #readFragment, + [fragmentRequest], + {#optimistic: optimistic}, + ), + returnValueForMissingStub: null, + ) as Map?); + + @override + void writeQuery( + _i3.Request? request, { + required Map? data, + bool? broadcast = true, + }) => + super.noSuchMethod( + Invocation.method( + #writeQuery, + [request], + { + #data: data, + #broadcast: broadcast, + }, + ), + returnValueForMissingStub: null, + ); + + @override + void writeFragment( + _i3.FragmentRequest? fragmentRequest, { + bool? broadcast = true, + required Map? data, + }) => + super.noSuchMethod( + Invocation.method( + #writeFragment, + [fragmentRequest], + { + #broadcast: broadcast, + #data: data, + }, + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future?>>? resetStore( + {bool? refetchQueries = true}) => + (super.noSuchMethod( + Invocation.method( + #resetStore, + [], + {#refetchQueries: refetchQueries}, + ), + returnValueForMissingStub: null, + ) as _i5.Future?>>?); +} + +/// A class which mocks [PostService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockPostService extends _i2.Mock implements _i16.PostService { + @override + _i5.Stream> get postStream => (super.noSuchMethod( + Invocation.getter(#postStream), + returnValue: _i5.Stream>.empty(), + returnValueForMissingStub: _i5.Stream>.empty(), + ) as _i5.Stream>); + + @override + _i5.Stream<_i17.Post> get updatedPostStream => (super.noSuchMethod( + Invocation.getter(#updatedPostStream), + returnValue: _i5.Stream<_i17.Post>.empty(), + returnValueForMissingStub: _i5.Stream<_i17.Post>.empty(), + ) as _i5.Stream<_i17.Post>); + + @override + void setOrgStreamSubscription() => super.noSuchMethod( + Invocation.method( + #setOrgStreamSubscription, + [], + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future getPosts() => (super.noSuchMethod( + Invocation.method( + #getPosts, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future refreshFeed() => (super.noSuchMethod( + Invocation.method( + #refreshFeed, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + void addNewpost(_i17.Post? newPost) => super.noSuchMethod( + Invocation.method( + #addNewpost, + [newPost], + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future addLike(String? postID) => (super.noSuchMethod( + Invocation.method( + #addLike, + [postID], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future removeLike(String? postID) => (super.noSuchMethod( + Invocation.method( + #removeLike, + [postID], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + void addCommentLocally(String? postID) => super.noSuchMethod( + Invocation.method( + #addCommentLocally, + [postID], + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future nextPage() => super.noSuchMethod( + Invocation.method( + #nextPage, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ); + + @override + _i5.Future previousPage() => super.noSuchMethod( + Invocation.method( + #previousPage, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ); +} + +/// A class which mocks [MultiMediaPickerService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockMultiMediaPickerService extends _i2.Mock + implements _i18.MultiMediaPickerService { + @override + _i5.Stream get fileStream => (super.noSuchMethod( + Invocation.getter(#fileStream), + returnValue: _i5.Stream.empty(), + returnValueForMissingStub: _i5.Stream.empty(), + ) as _i5.Stream); + + @override + _i5.Future<_i19.File?> getPhotoFromGallery({bool? camera = false}) => + (super.noSuchMethod( + Invocation.method( + #getPhotoFromGallery, + [], + {#camera: camera}, + ), + returnValue: _i5.Future<_i19.File?>.value(), + returnValueForMissingStub: _i5.Future<_i19.File?>.value(), + ) as _i5.Future<_i19.File?>); + + @override + _i4.CustomAlertDialog permissionDeniedDialog() => (super.noSuchMethod( + Invocation.method( + #permissionDeniedDialog, + [], + ), + returnValue: _FakeCustomAlertDialog_10( + this, + Invocation.method( + #permissionDeniedDialog, + [], + ), + ), + returnValueForMissingStub: _FakeCustomAlertDialog_10( + this, + Invocation.method( + #permissionDeniedDialog, + [], + ), + ), + ) as _i4.CustomAlertDialog); +} + +/// A class which mocks [EventService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockEventService extends _i2.Mock implements _i11.EventService { + @override + _i5.Stream<_i20.Event> get eventStream => (super.noSuchMethod( + Invocation.getter(#eventStream), + returnValue: _i5.Stream<_i20.Event>.empty(), + returnValueForMissingStub: _i5.Stream<_i20.Event>.empty(), + ) as _i5.Stream<_i20.Event>); + + @override + void setOrgStreamSubscription() => super.noSuchMethod( + Invocation.method( + #setOrgStreamSubscription, + [], + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future getEvents() => (super.noSuchMethod( + Invocation.method( + #getEvents, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future fetchAttendeesByEvent(String? eventId) => + (super.noSuchMethod( + Invocation.method( + #fetchAttendeesByEvent, + [eventId], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future registerForAnEvent(String? eventId) => + (super.noSuchMethod( + Invocation.method( + #registerForAnEvent, + [eventId], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future deleteEvent(String? eventId) => (super.noSuchMethod( + Invocation.method( + #deleteEvent, + [eventId], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future editEvent({ + required String? eventId, + required Map? variables, + }) => + (super.noSuchMethod( + Invocation.method( + #editEvent, + [], + { + #eventId: eventId, + #variables: variables, + }, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [ChatService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockChatService extends _i2.Mock implements _i21.ChatService { + @override + _i5.Stream<_i3.QueryResult> get chatStream => (super.noSuchMethod( + Invocation.getter(#chatStream), + returnValue: _i5.Stream<_i3.QueryResult>.empty(), + returnValueForMissingStub: _i5.Stream<_i3.QueryResult>.empty(), + ) as _i5.Stream<_i3.QueryResult>); + + @override + set chatStream(_i5.Stream<_i3.QueryResult>? _chatStream) => + super.noSuchMethod( + Invocation.setter( + #chatStream, + _chatStream, + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Stream<_i22.ChatListTileDataModel> get chatListStream => + (super.noSuchMethod( + Invocation.getter(#chatListStream), + returnValue: _i5.Stream<_i22.ChatListTileDataModel>.empty(), + returnValueForMissingStub: + _i5.Stream<_i22.ChatListTileDataModel>.empty(), + ) as _i5.Stream<_i22.ChatListTileDataModel>); + + @override + _i5.Stream<_i23.ChatMessage> get chatMessagesStream => (super.noSuchMethod( + Invocation.getter(#chatMessagesStream), + returnValue: _i5.Stream<_i23.ChatMessage>.empty(), + returnValueForMissingStub: _i5.Stream<_i23.ChatMessage>.empty(), + ) as _i5.Stream<_i23.ChatMessage>); + + @override + _i5.Future sendMessageToDirectChat( + String? chatId, + String? messageContent, + ) => + (super.noSuchMethod( + Invocation.method( + #sendMessageToDirectChat, + [ + chatId, + messageContent, + ], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future getDirectChatsByUserId() => (super.noSuchMethod( + Invocation.method( + #getDirectChatsByUserId, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future getDirectChatMessagesByChatId(dynamic chatId) => + (super.noSuchMethod( + Invocation.method( + #getDirectChatMessagesByChatId, + [chatId], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); +} + +/// A class which mocks [UserConfig]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockUserConfig extends _i2.Mock implements _i24.UserConfig { + @override + _i5.Stream<_i6.OrgInfo> get currentOrgInfoStream => (super.noSuchMethod( + Invocation.getter(#currentOrgInfoStream), + returnValue: _i5.Stream<_i6.OrgInfo>.empty(), + returnValueForMissingStub: _i5.Stream<_i6.OrgInfo>.empty(), + ) as _i5.Stream<_i6.OrgInfo>); + + @override + _i5.StreamController<_i6.OrgInfo> get currentOrgInfoController => + (super.noSuchMethod( + Invocation.getter(#currentOrgInfoController), + returnValue: _FakeStreamController_11<_i6.OrgInfo>( + this, + Invocation.getter(#currentOrgInfoController), + ), + returnValueForMissingStub: _FakeStreamController_11<_i6.OrgInfo>( + this, + Invocation.getter(#currentOrgInfoController), + ), + ) as _i5.StreamController<_i6.OrgInfo>); + + @override + _i6.OrgInfo get currentOrg => (super.noSuchMethod( + Invocation.getter(#currentOrg), + returnValue: _FakeOrgInfo_12( + this, + Invocation.getter(#currentOrg), + ), + returnValueForMissingStub: _FakeOrgInfo_12( + this, + Invocation.getter(#currentOrg), + ), + ) as _i6.OrgInfo); + + @override + String get currentOrgName => (super.noSuchMethod( + Invocation.getter(#currentOrgName), + returnValue: _i25.dummyValue( + this, + Invocation.getter(#currentOrgName), + ), + returnValueForMissingStub: _i25.dummyValue( + this, + Invocation.getter(#currentOrgName), + ), + ) as String); + + @override + bool get loggedIn => (super.noSuchMethod( + Invocation.getter(#loggedIn), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @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_13( + this, + Invocation.getter(#currentUser), + ), + returnValueForMissingStub: _FakeUser_13( + this, + Invocation.getter(#currentUser), + ), + ) as _i7.User); + + @override + set currentUser(_i7.User? user) => super.noSuchMethod( + Invocation.setter( + #currentUser, + user, + ), + returnValueForMissingStub: null, + ); + + @override + void initialiseStream() => super.noSuchMethod( + Invocation.method( + #initialiseStream, + [], + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future userLoggedIn() => (super.noSuchMethod( + Invocation.method( + #userLoggedIn, + [], + ), + returnValue: _i5.Future.value(false), + returnValueForMissingStub: _i5.Future.value(false), + ) as _i5.Future); + + @override + _i5.Future userLogOut() => (super.noSuchMethod( + Invocation.method( + #userLogOut, + [], + ), + returnValue: _i5.Future.value(false), + returnValueForMissingStub: _i5.Future.value(false), + ) as _i5.Future); + + @override + _i5.Future updateUserJoinedOrg(List<_i6.OrgInfo>? orgDetails) => + (super.noSuchMethod( + Invocation.method( + #updateUserJoinedOrg, + [orgDetails], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future updateUserCreatedOrg(List<_i6.OrgInfo>? orgDetails) => + (super.noSuchMethod( + Invocation.method( + #updateUserCreatedOrg, + [orgDetails], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future updateUserMemberRequestOrg(List<_i6.OrgInfo>? orgDetails) => + (super.noSuchMethod( + Invocation.method( + #updateUserMemberRequestOrg, + [orgDetails], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future updateUserAdminOrg(List<_i6.OrgInfo>? orgDetails) => + (super.noSuchMethod( + Invocation.method( + #updateUserAdminOrg, + [orgDetails], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future updateAccessToken({ + required String? accessToken, + required String? refreshToken, + }) => + (super.noSuchMethod( + Invocation.method( + #updateAccessToken, + [], + { + #accessToken: accessToken, + #refreshToken: refreshToken, + }, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future updateUser(_i7.User? updatedUserDetails) => + (super.noSuchMethod( + Invocation.method( + #updateUser, + [updatedUserDetails], + ), + returnValue: _i5.Future.value(false), + returnValueForMissingStub: _i5.Future.value(false), + ) as _i5.Future); + + @override + void saveUserInHive() => super.noSuchMethod( + Invocation.method( + #saveUserInHive, + [], + ), + returnValueForMissingStub: null, + ); + + @override + void saveCurrentOrgInHive(_i6.OrgInfo? saveOrgAsCurrent) => + super.noSuchMethod( + Invocation.method( + #saveCurrentOrgInHive, + [saveOrgAsCurrent], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [AppLanguage]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAppLanguage extends _i2.Mock implements _i26.AppLanguage { + @override + bool get isTest => (super.noSuchMethod( + Invocation.getter(#isTest), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + _i8.NavigationService get navigationService => (super.noSuchMethod( + Invocation.getter(#navigationService), + returnValue: _FakeNavigationService_14( + this, + Invocation.getter(#navigationService), + ), + returnValueForMissingStub: _FakeNavigationService_14( + this, + Invocation.getter(#navigationService), + ), + ) as _i8.NavigationService); + + @override + _i9.DataBaseMutationFunctions get databaseFunctions => (super.noSuchMethod( + Invocation.getter(#databaseFunctions), + returnValue: _FakeDataBaseMutationFunctions_15( + this, + Invocation.getter(#databaseFunctions), + ), + returnValueForMissingStub: _FakeDataBaseMutationFunctions_15( + this, + Invocation.getter(#databaseFunctions), + ), + ) as _i9.DataBaseMutationFunctions); + + @override + _i10.Locale get appLocal => (super.noSuchMethod( + Invocation.getter(#appLocal), + returnValue: _FakeLocale_16( + this, + Invocation.getter(#appLocal), + ), + returnValueForMissingStub: _FakeLocale_16( + this, + Invocation.getter(#appLocal), + ), + ) as _i10.Locale); + + @override + _i14.ViewState get state => (super.noSuchMethod( + Invocation.getter(#state), + returnValue: _i14.ViewState.idle, + returnValueForMissingStub: _i14.ViewState.idle, + ) as _i14.ViewState); + + @override + bool get isBusy => (super.noSuchMethod( + Invocation.getter(#isBusy), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + _i5.Future initialize() => (super.noSuchMethod( + Invocation.method( + #initialize, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future fetchLocale() => (super.noSuchMethod( + Invocation.method( + #fetchLocale, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future changeLanguage(_i10.Locale? type) => (super.noSuchMethod( + Invocation.method( + #changeLanguage, + [type], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future selectLanguagePress() => (super.noSuchMethod( + Invocation.method( + #selectLanguagePress, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future dbLanguageUpdate() => (super.noSuchMethod( + Invocation.method( + #dbLanguageUpdate, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future appLanguageQuery() => (super.noSuchMethod( + Invocation.method( + #appLanguageQuery, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future userLanguageQuery(String? userId) => (super.noSuchMethod( + Invocation.method( + #userLanguageQuery, + [userId], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + void setState(_i14.ViewState? viewState) => super.noSuchMethod( + Invocation.method( + #setState, + [viewState], + ), + returnValueForMissingStub: null, + ); + + @override + void addListener(_i10.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void removeListener(_i10.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [Connectivity]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockConnectivity extends _i2.Mock implements _i27.Connectivity { + @override + _i5.Stream<_i28.ConnectivityResult> get onConnectivityChanged => + (super.noSuchMethod( + Invocation.getter(#onConnectivityChanged), + returnValue: _i5.Stream<_i28.ConnectivityResult>.empty(), + returnValueForMissingStub: _i5.Stream<_i28.ConnectivityResult>.empty(), + ) as _i5.Stream<_i28.ConnectivityResult>); + + @override + _i5.Future<_i28.ConnectivityResult> checkConnectivity() => + (super.noSuchMethod( + Invocation.method( + #checkConnectivity, + [], + ), + returnValue: _i5.Future<_i28.ConnectivityResult>.value( + _i28.ConnectivityResult.bluetooth), + returnValueForMissingStub: _i5.Future<_i28.ConnectivityResult>.value( + _i28.ConnectivityResult.bluetooth), + ) as _i5.Future<_i28.ConnectivityResult>); +} + +/// A class which mocks [SignupDetailsViewModel]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockSignupDetailsViewModel extends _i2.Mock + implements _i29.SignupDetailsViewModel { + @override + _i1.GlobalKey<_i1.FormState> get formKey => (super.noSuchMethod( + Invocation.getter(#formKey), + returnValue: _FakeGlobalKey_0<_i1.FormState>( + this, + Invocation.getter(#formKey), + ), + returnValueForMissingStub: _FakeGlobalKey_0<_i1.FormState>( + this, + Invocation.getter(#formKey), + ), + ) as _i1.GlobalKey<_i1.FormState>); + + @override + List> get greeting => (super.noSuchMethod( + Invocation.getter(#greeting), + returnValue: >[], + returnValueForMissingStub: >[], + ) as List>); + + @override + set greeting(List>? _greeting) => super.noSuchMethod( + Invocation.setter( + #greeting, + _greeting, + ), + returnValueForMissingStub: null, + ); + + @override + _i6.OrgInfo get selectedOrganization => (super.noSuchMethod( + Invocation.getter(#selectedOrganization), + returnValue: _FakeOrgInfo_12( + this, + Invocation.getter(#selectedOrganization), + ), + returnValueForMissingStub: _FakeOrgInfo_12( + this, + Invocation.getter(#selectedOrganization), + ), + ) as _i6.OrgInfo); + + @override + set selectedOrganization(_i6.OrgInfo? _selectedOrganization) => + super.noSuchMethod( + Invocation.setter( + #selectedOrganization, + _selectedOrganization, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.TextEditingController get confirmPassword => (super.noSuchMethod( + Invocation.getter(#confirmPassword), + returnValue: _FakeTextEditingController_17( + this, + Invocation.getter(#confirmPassword), + ), + returnValueForMissingStub: _FakeTextEditingController_17( + this, + Invocation.getter(#confirmPassword), + ), + ) as _i1.TextEditingController); + + @override + set confirmPassword(_i1.TextEditingController? _confirmPassword) => + super.noSuchMethod( + Invocation.setter( + #confirmPassword, + _confirmPassword, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.TextEditingController get firstName => (super.noSuchMethod( + Invocation.getter(#firstName), + returnValue: _FakeTextEditingController_17( + this, + Invocation.getter(#firstName), + ), + returnValueForMissingStub: _FakeTextEditingController_17( + this, + Invocation.getter(#firstName), + ), + ) as _i1.TextEditingController); + + @override + set firstName(_i1.TextEditingController? _firstName) => super.noSuchMethod( + Invocation.setter( + #firstName, + _firstName, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.TextEditingController get lastName => (super.noSuchMethod( + Invocation.getter(#lastName), + returnValue: _FakeTextEditingController_17( + this, + Invocation.getter(#lastName), + ), + returnValueForMissingStub: _FakeTextEditingController_17( + this, + Invocation.getter(#lastName), + ), + ) as _i1.TextEditingController); + + @override + set lastName(_i1.TextEditingController? _lastName) => super.noSuchMethod( + Invocation.setter( + #lastName, + _lastName, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.TextEditingController get password => (super.noSuchMethod( + Invocation.getter(#password), + returnValue: _FakeTextEditingController_17( + this, + Invocation.getter(#password), + ), + returnValueForMissingStub: _FakeTextEditingController_17( + this, + Invocation.getter(#password), + ), + ) as _i1.TextEditingController); + + @override + set password(_i1.TextEditingController? _password) => super.noSuchMethod( + Invocation.setter( + #password, + _password, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.TextEditingController get email => (super.noSuchMethod( + Invocation.getter(#email), + returnValue: _FakeTextEditingController_17( + this, + Invocation.getter(#email), + ), + returnValueForMissingStub: _FakeTextEditingController_17( + this, + Invocation.getter(#email), + ), + ) as _i1.TextEditingController); + + @override + set email(_i1.TextEditingController? _email) => super.noSuchMethod( + Invocation.setter( + #email, + _email, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.AutovalidateMode get validate => (super.noSuchMethod( + Invocation.getter(#validate), + returnValue: _i1.AutovalidateMode.disabled, + returnValueForMissingStub: _i1.AutovalidateMode.disabled, + ) as _i1.AutovalidateMode); + + @override + set validate(_i1.AutovalidateMode? _validate) => super.noSuchMethod( + Invocation.setter( + #validate, + _validate, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.FocusNode get confirmFocus => (super.noSuchMethod( + Invocation.getter(#confirmFocus), + returnValue: _FakeFocusNode_18( + this, + Invocation.getter(#confirmFocus), + ), + returnValueForMissingStub: _FakeFocusNode_18( + this, + Invocation.getter(#confirmFocus), + ), + ) as _i1.FocusNode); + + @override + set confirmFocus(_i1.FocusNode? _confirmFocus) => super.noSuchMethod( + Invocation.setter( + #confirmFocus, + _confirmFocus, + ), + returnValueForMissingStub: null, + ); + + @override + bool get hidePassword => (super.noSuchMethod( + Invocation.getter(#hidePassword), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + set hidePassword(bool? _hidePassword) => super.noSuchMethod( + Invocation.setter( + #hidePassword, + _hidePassword, + ), + returnValueForMissingStub: null, + ); + + @override + _i14.ViewState get state => (super.noSuchMethod( + Invocation.getter(#state), + returnValue: _i14.ViewState.idle, + returnValueForMissingStub: _i14.ViewState.idle, + ) as _i14.ViewState); + + @override + bool get isBusy => (super.noSuchMethod( + Invocation.getter(#isBusy), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + void initialise(_i6.OrgInfo? org) => super.noSuchMethod( + Invocation.method( + #initialise, + [org], + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future signUp() => (super.noSuchMethod( + Invocation.method( + #signUp, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + void setState(_i14.ViewState? viewState) => super.noSuchMethod( + Invocation.method( + #setState, + [viewState], + ), + returnValueForMissingStub: null, + ); + + @override + void addListener(_i10.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void removeListener(_i10.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [Post]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockPost extends _i2.Mock implements _i17.Post { + @override + String get sId => (super.noSuchMethod( + Invocation.getter(#sId), + returnValue: _i25.dummyValue( + this, + Invocation.getter(#sId), + ), + returnValueForMissingStub: _i25.dummyValue( + this, + Invocation.getter(#sId), + ), + ) as String); + + @override + set sId(String? _sId) => super.noSuchMethod( + Invocation.setter( + #sId, + _sId, + ), + returnValueForMissingStub: null, + ); + + @override + set description(String? _description) => super.noSuchMethod( + Invocation.setter( + #description, + _description, + ), + returnValueForMissingStub: null, + ); + + @override + set createdAt(DateTime? _createdAt) => super.noSuchMethod( + Invocation.setter( + #createdAt, + _createdAt, + ), + returnValueForMissingStub: null, + ); + + @override + set imageUrl(String? _imageUrl) => super.noSuchMethod( + Invocation.setter( + #imageUrl, + _imageUrl, + ), + returnValueForMissingStub: null, + ); + + @override + set base64String(String? _base64String) => super.noSuchMethod( + Invocation.setter( + #base64String, + _base64String, + ), + returnValueForMissingStub: null, + ); + + @override + set videoUrl(String? _videoUrl) => super.noSuchMethod( + Invocation.setter( + #videoUrl, + _videoUrl, + ), + returnValueForMissingStub: null, + ); + + @override + set creator(_i7.User? _creator) => super.noSuchMethod( + Invocation.setter( + #creator, + _creator, + ), + returnValueForMissingStub: null, + ); + + @override + set organization(_i6.OrgInfo? _organization) => super.noSuchMethod( + Invocation.setter( + #organization, + _organization, + ), + returnValueForMissingStub: null, + ); + + @override + set likedBy(List<_i17.LikedBy>? _likedBy) => super.noSuchMethod( + Invocation.setter( + #likedBy, + _likedBy, + ), + returnValueForMissingStub: null, + ); + + @override + set comments(List<_i17.Comments>? _comments) => super.noSuchMethod( + Invocation.setter( + #comments, + _comments, + ), + returnValueForMissingStub: null, + ); + + @override + String getPostCreatedDuration() => (super.noSuchMethod( + Invocation.method( + #getPostCreatedDuration, + [], + ), + returnValue: _i25.dummyValue( + this, + Invocation.method( + #getPostCreatedDuration, + [], + ), + ), + returnValueForMissingStub: _i25.dummyValue( + this, + Invocation.method( + #getPostCreatedDuration, + [], + ), + ), + ) as String); +} + +/// A class which mocks [DataBaseMutationFunctions]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockDataBaseMutationFunctions extends _i2.Mock + implements _i9.DataBaseMutationFunctions { + @override + _i3.GraphQLClient get clientNonAuth => (super.noSuchMethod( + Invocation.getter(#clientNonAuth), + returnValue: _FakeGraphQLClient_3( + this, + Invocation.getter(#clientNonAuth), + ), + returnValueForMissingStub: _FakeGraphQLClient_3( + this, + Invocation.getter(#clientNonAuth), + ), + ) as _i3.GraphQLClient); + + @override + set clientNonAuth(_i3.GraphQLClient? _clientNonAuth) => super.noSuchMethod( + Invocation.setter( + #clientNonAuth, + _clientNonAuth, + ), + returnValueForMissingStub: null, + ); + + @override + _i3.GraphQLClient get clientAuth => (super.noSuchMethod( + Invocation.getter(#clientAuth), + returnValue: _FakeGraphQLClient_3( + this, + Invocation.getter(#clientAuth), + ), + returnValueForMissingStub: _FakeGraphQLClient_3( + this, + Invocation.getter(#clientAuth), + ), + ) as _i3.GraphQLClient); + + @override + set clientAuth(_i3.GraphQLClient? _clientAuth) => super.noSuchMethod( + Invocation.setter( + #clientAuth, + _clientAuth, + ), + returnValueForMissingStub: null, + ); + + @override + _i3.GraphQLError get userNotFound => (super.noSuchMethod( + Invocation.getter(#userNotFound), + returnValue: _FakeGraphQLError_19( + this, + Invocation.getter(#userNotFound), + ), + returnValueForMissingStub: _FakeGraphQLError_19( + this, + Invocation.getter(#userNotFound), + ), + ) as _i3.GraphQLError); + + @override + set userNotFound(_i3.GraphQLError? _userNotFound) => super.noSuchMethod( + Invocation.setter( + #userNotFound, + _userNotFound, + ), + returnValueForMissingStub: null, + ); + + @override + _i3.GraphQLError get userNotAuthenticated => (super.noSuchMethod( + Invocation.getter(#userNotAuthenticated), + returnValue: _FakeGraphQLError_19( + this, + Invocation.getter(#userNotAuthenticated), + ), + returnValueForMissingStub: _FakeGraphQLError_19( + this, + Invocation.getter(#userNotAuthenticated), + ), + ) as _i3.GraphQLError); + + @override + set userNotAuthenticated(_i3.GraphQLError? _userNotAuthenticated) => + super.noSuchMethod( + Invocation.setter( + #userNotAuthenticated, + _userNotAuthenticated, + ), + returnValueForMissingStub: null, + ); + + @override + _i3.GraphQLError get emailAccountPresent => (super.noSuchMethod( + Invocation.getter(#emailAccountPresent), + returnValue: _FakeGraphQLError_19( + this, + Invocation.getter(#emailAccountPresent), + ), + returnValueForMissingStub: _FakeGraphQLError_19( + this, + Invocation.getter(#emailAccountPresent), + ), + ) as _i3.GraphQLError); + + @override + set emailAccountPresent(_i3.GraphQLError? _emailAccountPresent) => + super.noSuchMethod( + Invocation.setter( + #emailAccountPresent, + _emailAccountPresent, + ), + returnValueForMissingStub: null, + ); + + @override + _i3.GraphQLError get wrongCredentials => (super.noSuchMethod( + Invocation.getter(#wrongCredentials), + returnValue: _FakeGraphQLError_19( + this, + Invocation.getter(#wrongCredentials), + ), + returnValueForMissingStub: _FakeGraphQLError_19( + this, + Invocation.getter(#wrongCredentials), + ), + ) as _i3.GraphQLError); + + @override + set wrongCredentials(_i3.GraphQLError? _wrongCredentials) => + super.noSuchMethod( + Invocation.setter( + #wrongCredentials, + _wrongCredentials, + ), + returnValueForMissingStub: null, + ); + + @override + _i3.GraphQLError get organizationNotFound => (super.noSuchMethod( + Invocation.getter(#organizationNotFound), + returnValue: _FakeGraphQLError_19( + this, + Invocation.getter(#organizationNotFound), + ), + returnValueForMissingStub: _FakeGraphQLError_19( + this, + Invocation.getter(#organizationNotFound), + ), + ) as _i3.GraphQLError); + + @override + set organizationNotFound(_i3.GraphQLError? _organizationNotFound) => + super.noSuchMethod( + Invocation.setter( + #organizationNotFound, + _organizationNotFound, + ), + returnValueForMissingStub: null, + ); + + @override + _i3.GraphQLError get refreshAccessTokenExpiredException => + (super.noSuchMethod( + Invocation.getter(#refreshAccessTokenExpiredException), + returnValue: _FakeGraphQLError_19( + this, + Invocation.getter(#refreshAccessTokenExpiredException), + ), + returnValueForMissingStub: _FakeGraphQLError_19( + this, + Invocation.getter(#refreshAccessTokenExpiredException), + ), + ) as _i3.GraphQLError); + + @override + set refreshAccessTokenExpiredException( + _i3.GraphQLError? _refreshAccessTokenExpiredException) => + super.noSuchMethod( + Invocation.setter( + #refreshAccessTokenExpiredException, + _refreshAccessTokenExpiredException, + ), + returnValueForMissingStub: null, + ); + + @override + _i3.GraphQLError get memberRequestExist => (super.noSuchMethod( + Invocation.getter(#memberRequestExist), + returnValue: _FakeGraphQLError_19( + this, + Invocation.getter(#memberRequestExist), + ), + returnValueForMissingStub: _FakeGraphQLError_19( + this, + Invocation.getter(#memberRequestExist), + ), + ) as _i3.GraphQLError); + + @override + set memberRequestExist(_i3.GraphQLError? _memberRequestExist) => + super.noSuchMethod( + Invocation.setter( + #memberRequestExist, + _memberRequestExist, + ), + returnValueForMissingStub: null, + ); + + @override + _i3.GraphQLError get notifFeatureNotInstalled => (super.noSuchMethod( + Invocation.getter(#notifFeatureNotInstalled), + returnValue: _FakeGraphQLError_19( + this, + Invocation.getter(#notifFeatureNotInstalled), + ), + returnValueForMissingStub: _FakeGraphQLError_19( + this, + Invocation.getter(#notifFeatureNotInstalled), + ), + ) as _i3.GraphQLError); + + @override + set notifFeatureNotInstalled(_i3.GraphQLError? _notifFeatureNotInstalled) => + super.noSuchMethod( + Invocation.setter( + #notifFeatureNotInstalled, + _notifFeatureNotInstalled, + ), + returnValueForMissingStub: null, + ); + + @override + void init() => super.noSuchMethod( + Invocation.method( + #init, + [], + ), + returnValueForMissingStub: null, + ); + + @override + void initClientNonAuth() => super.noSuchMethod( + Invocation.method( + #initClientNonAuth, + [], + ), + returnValueForMissingStub: null, + ); + + @override + bool? encounteredExceptionOrError( + _i3.OperationException? exception, { + bool? showSnackBar = true, + }) => + (super.noSuchMethod( + Invocation.method( + #encounteredExceptionOrError, + [exception], + {#showSnackBar: showSnackBar}, + ), + returnValueForMissingStub: null, + ) as bool?); + + @override + _i5.Future gqlAuthQuery( + String? query, { + Map? variables, + }) => + (super.noSuchMethod( + Invocation.method( + #gqlAuthQuery, + [query], + {#variables: variables}, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future gqlAuthMutation( + String? mutation, { + Map? variables, + }) => + (super.noSuchMethod( + Invocation.method( + #gqlAuthMutation, + [mutation], + {#variables: variables}, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future gqlNonAuthMutation( + String? mutation, { + Map? variables, + bool? reCall = true, + }) => + (super.noSuchMethod( + Invocation.method( + #gqlNonAuthMutation, + [mutation], + { + #variables: variables, + #reCall: reCall, + }, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future<_i3.QueryResult?> gqlNonAuthQuery( + String? query, { + Map? variables, + }) => + (super.noSuchMethod( + Invocation.method( + #gqlNonAuthQuery, + [query], + {#variables: variables}, + ), + returnValue: _i5.Future<_i3.QueryResult?>.value(), + returnValueForMissingStub: + _i5.Future<_i3.QueryResult?>.value(), + ) as _i5.Future<_i3.QueryResult?>); + + @override + _i5.Future refreshAccessToken(String? refreshToken) => + (super.noSuchMethod( + Invocation.method( + #refreshAccessToken, + [refreshToken], + ), + returnValue: _i5.Future.value(false), + returnValueForMissingStub: _i5.Future.value(false), + ) as _i5.Future); + + @override + _i5.Future fetchOrgById(String? id) => (super.noSuchMethod( + Invocation.method( + #fetchOrgById, + [id], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); +} + +/// A class which mocks [OrganizationService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockOrganizationService extends _i2.Mock + implements _i30.OrganizationService { + @override + _i5.Future> getOrgMembersList(String? orgId) => + (super.noSuchMethod( + Invocation.method( + #getOrgMembersList, + [orgId], + ), + returnValue: _i5.Future>.value(<_i7.User>[]), + returnValueForMissingStub: + _i5.Future>.value(<_i7.User>[]), + ) as _i5.Future>); +} + +/// A class which mocks [ExploreEventsViewModel]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockExploreEventsViewModel extends _i2.Mock + implements _i31.ExploreEventsViewModel { + @override + bool get demoMode => (super.noSuchMethod( + Invocation.getter(#demoMode), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + set demoMode(bool? _demoMode) => super.noSuchMethod( + Invocation.setter( + #demoMode, + _demoMode, + ), + returnValueForMissingStub: null, + ); + + @override + List<_i20.Event> get events => (super.noSuchMethod( + Invocation.getter(#events), + returnValue: <_i20.Event>[], + returnValueForMissingStub: <_i20.Event>[], + ) as List<_i20.Event>); + + @override + List<_i20.Event> get userEvents => (super.noSuchMethod( + Invocation.getter(#userEvents), + returnValue: <_i20.Event>[], + returnValueForMissingStub: <_i20.Event>[], + ) as List<_i20.Event>); + + @override + _i11.EventService get eventService => (super.noSuchMethod( + Invocation.getter(#eventService), + returnValue: _FakeEventService_20( + this, + Invocation.getter(#eventService), + ), + returnValueForMissingStub: _FakeEventService_20( + this, + Invocation.getter(#eventService), + ), + ) as _i11.EventService); + + @override + String get emptyListMessage => (super.noSuchMethod( + Invocation.getter(#emptyListMessage), + returnValue: _i25.dummyValue( + this, + Invocation.getter(#emptyListMessage), + ), + returnValueForMissingStub: _i25.dummyValue( + this, + Invocation.getter(#emptyListMessage), + ), + ) as String); + + @override + String get chosenValue => (super.noSuchMethod( + Invocation.getter(#chosenValue), + returnValue: _i25.dummyValue( + this, + Invocation.getter(#chosenValue), + ), + returnValueForMissingStub: _i25.dummyValue( + this, + Invocation.getter(#chosenValue), + ), + ) as String); + + @override + _i14.ViewState get state => (super.noSuchMethod( + Invocation.getter(#state), + returnValue: _i14.ViewState.idle, + returnValueForMissingStub: _i14.ViewState.idle, + ) as _i14.ViewState); + + @override + bool get isBusy => (super.noSuchMethod( + Invocation.getter(#isBusy), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + _i5.Future fetchNewEvents() => (super.noSuchMethod( + Invocation.method( + #fetchNewEvents, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future refreshEvents() => (super.noSuchMethod( + Invocation.method( + #refreshEvents, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future initialise() => (super.noSuchMethod( + Invocation.method( + #initialise, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future checkIfExistsAndAddNewEvent(_i20.Event? newEvent) => + (super.noSuchMethod( + Invocation.method( + #checkIfExistsAndAddNewEvent, + [newEvent], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future deleteEvent({required String? eventId}) => + (super.noSuchMethod( + Invocation.method( + #deleteEvent, + [], + {#eventId: eventId}, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future choseValueFromDropdown(String? value) => (super.noSuchMethod( + Invocation.method( + #choseValueFromDropdown, + [value], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + + @override + void setState(_i14.ViewState? viewState) => super.noSuchMethod( + Invocation.method( + #setState, + [viewState], + ), + returnValueForMissingStub: null, + ); + + @override + void addListener(_i10.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void removeListener(_i10.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [OrganizationFeedViewModel]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockOrganizationFeedViewModel extends _i2.Mock + implements _i32.OrganizationFeedViewModel { + @override + bool get istest => (super.noSuchMethod( + Invocation.getter(#istest), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + set istest(bool? _istest) => super.noSuchMethod( + Invocation.setter( + #istest, + _istest, + ), + returnValueForMissingStub: null, + ); + + @override + List<_i17.Post> get posts => (super.noSuchMethod( + Invocation.getter(#posts), + returnValue: <_i17.Post>[], + returnValueForMissingStub: <_i17.Post>[], + ) as List<_i17.Post>); + + @override + List<_i17.Post> get userPosts => (super.noSuchMethod( + Invocation.getter(#userPosts), + returnValue: <_i17.Post>[], + returnValueForMissingStub: <_i17.Post>[], + ) as List<_i17.Post>); + + @override + List<_i17.Post> get pinnedPosts => (super.noSuchMethod( + Invocation.getter(#pinnedPosts), + returnValue: <_i17.Post>[], + returnValueForMissingStub: <_i17.Post>[], + ) as List<_i17.Post>); + + @override + String get currentOrgName => (super.noSuchMethod( + Invocation.getter(#currentOrgName), + returnValue: _i25.dummyValue( + this, + Invocation.getter(#currentOrgName), + ), + returnValueForMissingStub: _i25.dummyValue( + this, + Invocation.getter(#currentOrgName), + ), + ) as String); + + @override + bool get isFetchingPosts => (super.noSuchMethod( + Invocation.getter(#isFetchingPosts), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + _i14.ViewState get state => (super.noSuchMethod( + Invocation.getter(#state), + returnValue: _i14.ViewState.idle, + returnValueForMissingStub: _i14.ViewState.idle, + ) as _i14.ViewState); + + @override + bool get isBusy => (super.noSuchMethod( + Invocation.getter(#isBusy), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + void setCurrentOrganizationName(String? updatedOrganization) => + super.noSuchMethod( + Invocation.method( + #setCurrentOrganizationName, + [updatedOrganization], + ), + returnValueForMissingStub: null, + ); + + @override + void fetchNewPosts() => super.noSuchMethod( + Invocation.method( + #fetchNewPosts, + [], + ), + returnValueForMissingStub: null, + ); + @override + void nextPage() => super.noSuchMethod( + Invocation.method( + #nextPage, + [], + ), + returnValueForMissingStub: null, + ); + + @override + void previousPage() => super.noSuchMethod( + Invocation.method( + #previousPage, + [], + ), + returnValueForMissingStub: null, + ); + @override + void initialise({bool? isTest = false}) => super.noSuchMethod( + Invocation.method( + #initialise, + [], + {#isTest: isTest}, + ), + returnValueForMissingStub: null, + ); + + @override + void buildNewPosts(List<_i17.Post>? newPosts) => super.noSuchMethod( + Invocation.method( + #buildNewPosts, + [newPosts], + ), + returnValueForMissingStub: null, + ); + + @override + void navigateToIndividualPage(_i17.Post? post) => super.noSuchMethod( + Invocation.method( + #navigateToIndividualPage, + [post], + ), + returnValueForMissingStub: null, + ); + + @override + void navigateToPinnedPostPage() => super.noSuchMethod( + Invocation.method( + #navigateToPinnedPostPage, + [], + ), + returnValueForMissingStub: null, + ); + + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + + @override + void addNewPost(_i17.Post? newPost) => super.noSuchMethod( + Invocation.method( + #addNewPost, + [newPost], + ), + returnValueForMissingStub: null, + ); + + @override + void updatedPost(_i17.Post? post) => super.noSuchMethod( + Invocation.method( + #updatedPost, + [post], + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future removePost(_i17.Post? post) => (super.noSuchMethod( + Invocation.method( + #removePost, + [post], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + void setState(_i14.ViewState? viewState) => super.noSuchMethod( + Invocation.method( + #setState, + [viewState], + ), + returnValueForMissingStub: null, + ); + + @override + void addListener(_i10.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void removeListener(_i10.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [Validator]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockValidator extends _i2.Mock implements _i33.Validator { + @override + _i5.Future validateUrlExistence(String? url) => (super.noSuchMethod( + Invocation.method( + #validateUrlExistence, + [url], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); +} + +/// A class which mocks [QRViewController]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockQRViewController extends _i2.Mock implements _i34.QRViewController { + @override + _i5.Stream<_i35.Barcode> get scannedDataStream => (super.noSuchMethod( + Invocation.getter(#scannedDataStream), + returnValue: _i5.Stream<_i35.Barcode>.empty(), + returnValueForMissingStub: _i5.Stream<_i35.Barcode>.empty(), + ) as _i5.Stream<_i35.Barcode>); + + @override + bool get hasPermissions => (super.noSuchMethod( + Invocation.getter(#hasPermissions), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + _i5.Future<_i36.CameraFacing> getCameraInfo() => (super.noSuchMethod( + Invocation.method( + #getCameraInfo, + [], + ), + returnValue: + _i5.Future<_i36.CameraFacing>.value(_i36.CameraFacing.back), + returnValueForMissingStub: + _i5.Future<_i36.CameraFacing>.value(_i36.CameraFacing.back), + ) as _i5.Future<_i36.CameraFacing>); + + @override + _i5.Future<_i36.CameraFacing> flipCamera() => (super.noSuchMethod( + Invocation.method( + #flipCamera, + [], + ), + returnValue: + _i5.Future<_i36.CameraFacing>.value(_i36.CameraFacing.back), + returnValueForMissingStub: + _i5.Future<_i36.CameraFacing>.value(_i36.CameraFacing.back), + ) as _i5.Future<_i36.CameraFacing>); + + @override + _i5.Future getFlashStatus() => (super.noSuchMethod( + Invocation.method( + #getFlashStatus, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future toggleFlash() => (super.noSuchMethod( + Invocation.method( + #toggleFlash, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future pauseCamera() => (super.noSuchMethod( + Invocation.method( + #pauseCamera, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future stopCamera() => (super.noSuchMethod( + Invocation.method( + #stopCamera, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future resumeCamera() => (super.noSuchMethod( + Invocation.method( + #resumeCamera, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future<_i12.SystemFeatures> getSystemFeatures() => (super.noSuchMethod( + Invocation.method( + #getSystemFeatures, + [], + ), + returnValue: + _i5.Future<_i12.SystemFeatures>.value(_FakeSystemFeatures_21( + this, + Invocation.method( + #getSystemFeatures, + [], + ), + )), + returnValueForMissingStub: + _i5.Future<_i12.SystemFeatures>.value(_FakeSystemFeatures_21( + this, + Invocation.method( + #getSystemFeatures, + [], + ), + )), + ) as _i5.Future<_i12.SystemFeatures>); + + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future scanInvert(bool? isScanInvert) => (super.noSuchMethod( + Invocation.method( + #scanInvert, + [isScanInvert], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); +} + +/// A class which mocks [CommentService]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockCommentService extends _i2.Mock implements _i37.CommentService { + @override + _i5.Future createComments( + String? postId, + String? text, + ) => + (super.noSuchMethod( + Invocation.method( + #createComments, + [ + postId, + text, + ], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future> getCommentsForPost(String? postId) => + (super.noSuchMethod( + Invocation.method( + #getCommentsForPost, + [postId], + ), + returnValue: _i5.Future>.value([]), + returnValueForMissingStub: _i5.Future>.value([]), + ) as _i5.Future>); +} + +/// A class which mocks [AppTheme]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockAppTheme extends _i2.Mock implements _i38.AppTheme { + @override + String get key => (super.noSuchMethod( + Invocation.getter(#key), + returnValue: _i25.dummyValue( + this, + Invocation.getter(#key), + ), + returnValueForMissingStub: _i25.dummyValue( + this, + Invocation.getter(#key), + ), + ) as String); + + @override + bool get isdarkTheme => (super.noSuchMethod( + Invocation.getter(#isdarkTheme), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + _i14.ViewState get state => (super.noSuchMethod( + Invocation.getter(#state), + returnValue: _i14.ViewState.idle, + returnValueForMissingStub: _i14.ViewState.idle, + ) as _i14.ViewState); + + @override + bool get isBusy => (super.noSuchMethod( + Invocation.getter(#isBusy), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + void initialize() => super.noSuchMethod( + Invocation.method( + #initialize, + [], + ), + returnValueForMissingStub: null, + ); + + @override + void switchTheme({required bool? isOn}) => super.noSuchMethod( + Invocation.method( + #switchTheme, + [], + {#isOn: isOn}, + ), + returnValueForMissingStub: null, + ); + + @override + void setState(_i14.ViewState? viewState) => super.noSuchMethod( + Invocation.method( + #setState, + [viewState], + ), + returnValueForMissingStub: null, + ); + + @override + void addListener(_i10.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void removeListener(_i10.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [CreateEventViewModel]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockCreateEventViewModel extends _i2.Mock + implements _i39.CreateEventViewModel { + @override + _i1.TextEditingController get eventTitleTextController => (super.noSuchMethod( + Invocation.getter(#eventTitleTextController), + returnValue: _FakeTextEditingController_17( + this, + Invocation.getter(#eventTitleTextController), + ), + returnValueForMissingStub: _FakeTextEditingController_17( + this, + Invocation.getter(#eventTitleTextController), + ), + ) as _i1.TextEditingController); + + @override + set eventTitleTextController( + _i1.TextEditingController? _eventTitleTextController) => + super.noSuchMethod( + Invocation.setter( + #eventTitleTextController, + _eventTitleTextController, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.TextEditingController get eventLocationTextController => + (super.noSuchMethod( + Invocation.getter(#eventLocationTextController), + returnValue: _FakeTextEditingController_17( + this, + Invocation.getter(#eventLocationTextController), + ), + returnValueForMissingStub: _FakeTextEditingController_17( + this, + Invocation.getter(#eventLocationTextController), + ), + ) as _i1.TextEditingController); + + @override + set eventLocationTextController( + _i1.TextEditingController? _eventLocationTextController) => + super.noSuchMethod( + Invocation.setter( + #eventLocationTextController, + _eventLocationTextController, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.TextEditingController get eventDescriptionTextController => + (super.noSuchMethod( + Invocation.getter(#eventDescriptionTextController), + returnValue: _FakeTextEditingController_17( + this, + Invocation.getter(#eventDescriptionTextController), + ), + returnValueForMissingStub: _FakeTextEditingController_17( + this, + Invocation.getter(#eventDescriptionTextController), + ), + ) as _i1.TextEditingController); + + @override + set eventDescriptionTextController( + _i1.TextEditingController? _eventDescriptionTextController) => + super.noSuchMethod( + Invocation.setter( + #eventDescriptionTextController, + _eventDescriptionTextController, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.TextEditingController get repeatsEveryCountController => + (super.noSuchMethod( + Invocation.getter(#repeatsEveryCountController), + returnValue: _FakeTextEditingController_17( + this, + Invocation.getter(#repeatsEveryCountController), + ), + returnValueForMissingStub: _FakeTextEditingController_17( + this, + Invocation.getter(#repeatsEveryCountController), + ), + ) as _i1.TextEditingController); + + @override + set repeatsEveryCountController( + _i1.TextEditingController? _repeatsEveryCountController) => + super.noSuchMethod( + Invocation.setter( + #repeatsEveryCountController, + _repeatsEveryCountController, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.TextEditingController get endOccurenceController => (super.noSuchMethod( + Invocation.getter(#endOccurenceController), + returnValue: _FakeTextEditingController_17( + this, + Invocation.getter(#endOccurenceController), + ), + returnValueForMissingStub: _FakeTextEditingController_17( + this, + Invocation.getter(#endOccurenceController), + ), + ) as _i1.TextEditingController); + + @override + set endOccurenceController( + _i1.TextEditingController? _endOccurenceController) => + super.noSuchMethod( + Invocation.setter( + #endOccurenceController, + _endOccurenceController, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.TimeOfDay get eventStartTime => (super.noSuchMethod( + Invocation.getter(#eventStartTime), + returnValue: _FakeTimeOfDay_22( + this, + Invocation.getter(#eventStartTime), + ), + returnValueForMissingStub: _FakeTimeOfDay_22( + this, + Invocation.getter(#eventStartTime), + ), + ) as _i1.TimeOfDay); + + @override + set eventStartTime(_i1.TimeOfDay? _eventStartTime) => super.noSuchMethod( + Invocation.setter( + #eventStartTime, + _eventStartTime, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.TimeOfDay get eventEndTime => (super.noSuchMethod( + Invocation.getter(#eventEndTime), + returnValue: _FakeTimeOfDay_22( + this, + Invocation.getter(#eventEndTime), + ), + returnValueForMissingStub: _FakeTimeOfDay_22( + this, + Invocation.getter(#eventEndTime), + ), + ) as _i1.TimeOfDay); + + @override + set eventEndTime(_i1.TimeOfDay? _eventEndTime) => super.noSuchMethod( + Invocation.setter( + #eventEndTime, + _eventEndTime, + ), + returnValueForMissingStub: null, + ); + + @override + DateTime get eventStartDate => (super.noSuchMethod( + Invocation.getter(#eventStartDate), + returnValue: _FakeDateTime_23( + this, + Invocation.getter(#eventStartDate), + ), + returnValueForMissingStub: _FakeDateTime_23( + this, + Invocation.getter(#eventStartDate), + ), + ) as DateTime); + + @override + set eventStartDate(DateTime? _eventStartDate) => super.noSuchMethod( + Invocation.setter( + #eventStartDate, + _eventStartDate, + ), + returnValueForMissingStub: null, + ); + + @override + set eventEndDate(DateTime? _eventEndDate) => super.noSuchMethod( + Invocation.setter( + #eventEndDate, + _eventEndDate, + ), + returnValueForMissingStub: null, + ); + + @override + bool get isPublicSwitch => (super.noSuchMethod( + Invocation.getter(#isPublicSwitch), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + set isPublicSwitch(bool? _isPublicSwitch) => super.noSuchMethod( + Invocation.setter( + #isPublicSwitch, + _isPublicSwitch, + ), + returnValueForMissingStub: null, + ); + + @override + bool get isRegisterableSwitch => (super.noSuchMethod( + Invocation.getter(#isRegisterableSwitch), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + set isRegisterableSwitch(bool? _isRegisterableSwitch) => super.noSuchMethod( + Invocation.setter( + #isRegisterableSwitch, + _isRegisterableSwitch, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.FocusNode get titleFocus => (super.noSuchMethod( + Invocation.getter(#titleFocus), + returnValue: _FakeFocusNode_18( + this, + Invocation.getter(#titleFocus), + ), + returnValueForMissingStub: _FakeFocusNode_18( + this, + Invocation.getter(#titleFocus), + ), + ) as _i1.FocusNode); + + @override + set titleFocus(_i1.FocusNode? _titleFocus) => super.noSuchMethod( + Invocation.setter( + #titleFocus, + _titleFocus, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.FocusNode get locationFocus => (super.noSuchMethod( + Invocation.getter(#locationFocus), + returnValue: _FakeFocusNode_18( + this, + Invocation.getter(#locationFocus), + ), + returnValueForMissingStub: _FakeFocusNode_18( + this, + Invocation.getter(#locationFocus), + ), + ) as _i1.FocusNode); + + @override + set locationFocus(_i1.FocusNode? _locationFocus) => super.noSuchMethod( + Invocation.setter( + #locationFocus, + _locationFocus, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.FocusNode get descriptionFocus => (super.noSuchMethod( + Invocation.getter(#descriptionFocus), + returnValue: _FakeFocusNode_18( + this, + Invocation.getter(#descriptionFocus), + ), + returnValueForMissingStub: _FakeFocusNode_18( + this, + Invocation.getter(#descriptionFocus), + ), + ) as _i1.FocusNode); + + @override + set descriptionFocus(_i1.FocusNode? _descriptionFocus) => super.noSuchMethod( + Invocation.setter( + #descriptionFocus, + _descriptionFocus, + ), + returnValueForMissingStub: null, + ); + + @override + set latitude(double? _latitude) => super.noSuchMethod( + Invocation.setter( + #latitude, + _latitude, + ), + returnValueForMissingStub: null, + ); + + @override + set longitude(double? _longitude) => super.noSuchMethod( + Invocation.setter( + #longitude, + _longitude, + ), + returnValueForMissingStub: null, + ); + + @override + bool get isAllDay => (super.noSuchMethod( + Invocation.getter(#isAllDay), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + set isAllDay(bool? _isAllDay) => super.noSuchMethod( + Invocation.setter( + #isAllDay, + _isAllDay, + ), + returnValueForMissingStub: null, + ); + + @override + bool get isRecurring => (super.noSuchMethod( + Invocation.getter(#isRecurring), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + set isRecurring(bool? _isRecurring) => super.noSuchMethod( + Invocation.setter( + #isRecurring, + _isRecurring, + ), + returnValueForMissingStub: null, + ); + + @override + int get recurranceCount => (super.noSuchMethod( + Invocation.getter(#recurranceCount), + returnValue: 0, + returnValueForMissingStub: 0, + ) as int); + + @override + set recurranceCount(int? _recurranceCount) => super.noSuchMethod( + Invocation.setter( + #recurranceCount, + _recurranceCount, + ), + returnValueForMissingStub: null, + ); + + @override + set recurrance(String? _recurrance) => super.noSuchMethod( + Invocation.setter( + #recurrance, + _recurrance, + ), + returnValueForMissingStub: null, + ); + + @override + String get recurranceFrequency => (super.noSuchMethod( + Invocation.getter(#recurranceFrequency), + returnValue: _i25.dummyValue( + this, + Invocation.getter(#recurranceFrequency), + ), + returnValueForMissingStub: _i25.dummyValue( + this, + Invocation.getter(#recurranceFrequency), + ), + ) as String); + + @override + set recurranceFrequency(String? _recurranceFrequency) => super.noSuchMethod( + Invocation.setter( + #recurranceFrequency, + _recurranceFrequency, + ), + returnValueForMissingStub: null, + ); + + @override + String get monthlyRecurrence => (super.noSuchMethod( + Invocation.getter(#monthlyRecurrence), + returnValue: _i25.dummyValue( + this, + Invocation.getter(#monthlyRecurrence), + ), + returnValueForMissingStub: _i25.dummyValue( + this, + Invocation.getter(#monthlyRecurrence), + ), + ) as String); + + @override + set monthlyRecurrence(String? _monthlyRecurrence) => super.noSuchMethod( + Invocation.setter( + #monthlyRecurrence, + _monthlyRecurrence, + ), + returnValueForMissingStub: null, + ); + + @override + Set get weekdays => (super.noSuchMethod( + Invocation.getter(#weekdays), + returnValue: {}, + returnValueForMissingStub: {}, + ) as Set); + + @override + set weekdays(Set? _weekdays) => super.noSuchMethod( + Invocation.setter( + #weekdays, + _weekdays, + ), + returnValueForMissingStub: null, + ); + + @override + String get eventEndType => (super.noSuchMethod( + Invocation.getter(#eventEndType), + returnValue: _i25.dummyValue( + this, + Invocation.getter(#eventEndType), + ), + returnValueForMissingStub: _i25.dummyValue( + this, + Invocation.getter(#eventEndType), + ), + ) as String); + + @override + set eventEndType(String? _eventEndType) => super.noSuchMethod( + Invocation.setter( + #eventEndType, + _eventEndType, + ), + returnValueForMissingStub: null, + ); + + @override + set eventEndOnEndDate(DateTime? _eventEndOnEndDate) => super.noSuchMethod( + Invocation.setter( + #eventEndOnEndDate, + _eventEndOnEndDate, + ), + returnValueForMissingStub: null, + ); + + @override + List<_i7.User> get orgMembersList => (super.noSuchMethod( + Invocation.getter(#orgMembersList), + returnValue: <_i7.User>[], + returnValueForMissingStub: <_i7.User>[], + ) as List<_i7.User>); + + @override + set orgMembersList(List<_i7.User>? _orgMembersList) => super.noSuchMethod( + Invocation.setter( + #orgMembersList, + _orgMembersList, + ), + returnValueForMissingStub: null, + ); + + @override + _i1.GlobalKey<_i1.FormState> get formKey => (super.noSuchMethod( + Invocation.getter(#formKey), + returnValue: _FakeGlobalKey_0<_i1.FormState>( + this, + Invocation.getter(#formKey), + ), + returnValueForMissingStub: _FakeGlobalKey_0<_i1.FormState>( + this, + Invocation.getter(#formKey), + ), + ) as _i1.GlobalKey<_i1.FormState>); + + @override + _i1.AutovalidateMode get validate => (super.noSuchMethod( + Invocation.getter(#validate), + returnValue: _i1.AutovalidateMode.disabled, + returnValueForMissingStub: _i1.AutovalidateMode.disabled, + ) as _i1.AutovalidateMode); + + @override + set validate(_i1.AutovalidateMode? _validate) => super.noSuchMethod( + Invocation.setter( + #validate, + _validate, + ), + returnValueForMissingStub: null, + ); + + @override + List<_i7.User> get selectedMembers => (super.noSuchMethod( + Invocation.getter(#selectedMembers), + returnValue: <_i7.User>[], + returnValueForMissingStub: <_i7.User>[], + ) as List<_i7.User>); + + @override + Map get memberCheckedMap => (super.noSuchMethod( + Invocation.getter(#memberCheckedMap), + returnValue: {}, + returnValueForMissingStub: {}, + ) as Map); + + @override + _i14.ViewState get state => (super.noSuchMethod( + Invocation.getter(#state), + returnValue: _i14.ViewState.idle, + returnValueForMissingStub: _i14.ViewState.idle, + ) as _i14.ViewState); + + @override + bool get isBusy => (super.noSuchMethod( + Invocation.getter(#isBusy), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + void initialize() => super.noSuchMethod( + Invocation.method( + #initialize, + [], + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future createEvent() => (super.noSuchMethod( + Invocation.method( + #createEvent, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future getImageFromGallery({bool? camera = false}) => + (super.noSuchMethod( + Invocation.method( + #getImageFromGallery, + [], + {#camera: camera}, + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + void removeImage() => super.noSuchMethod( + Invocation.method( + #removeImage, + [], + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future> getCurrentOrgUsersList() => (super.noSuchMethod( + Invocation.method( + #getCurrentOrgUsersList, + [], + ), + returnValue: _i5.Future>.value(<_i7.User>[]), + returnValueForMissingStub: + _i5.Future>.value(<_i7.User>[]), + ) as _i5.Future>); + + @override + void buildUserList() => super.noSuchMethod( + Invocation.method( + #buildUserList, + [], + ), + returnValueForMissingStub: null, + ); + + @override + void removeUserFromList({required String? userId}) => super.noSuchMethod( + Invocation.method( + #removeUserFromList, + [], + {#userId: userId}, + ), + returnValueForMissingStub: null, + ); + + @override + void setEventEndDate(DateTime? selectedEndDate) => super.noSuchMethod( + Invocation.method( + #setEventEndDate, + [selectedEndDate], + ), + returnValueForMissingStub: null, + ); + + @override + String? getRecurrance(String? frequency) => (super.noSuchMethod( + Invocation.method( + #getRecurrance, + [frequency], + ), + returnValueForMissingStub: null, + ) as String?); + + @override + void setState(_i14.ViewState? viewState) => super.noSuchMethod( + Invocation.method( + #setState, + [viewState], + ), + returnValueForMissingStub: null, + ); + + @override + void addListener(_i10.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void removeListener(_i10.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [DirectChatViewModel]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockDirectChatViewModel extends _i2.Mock + implements _i40.DirectChatViewModel { + @override + _i1.GlobalKey<_i1.AnimatedListState> get listKey => (super.noSuchMethod( + Invocation.getter(#listKey), + returnValue: _FakeGlobalKey_0<_i1.AnimatedListState>( + this, + Invocation.getter(#listKey), + ), + returnValueForMissingStub: _FakeGlobalKey_0<_i1.AnimatedListState>( + this, + Invocation.getter(#listKey), + ), + ) as _i1.GlobalKey<_i1.AnimatedListState>); + + @override + _i14.ChatState get chatState => (super.noSuchMethod( + Invocation.getter(#chatState), + returnValue: _i14.ChatState.initial, + returnValueForMissingStub: _i14.ChatState.initial, + ) as _i14.ChatState); + + @override + set chatState(_i14.ChatState? _chatState) => super.noSuchMethod( + Invocation.setter( + #chatState, + _chatState, + ), + returnValueForMissingStub: null, + ); + + @override + set name(String? _name) => super.noSuchMethod( + Invocation.setter( + #name, + _name, + ), + returnValueForMissingStub: null, + ); + + @override + List<_i22.ChatListTileDataModel> get chats => (super.noSuchMethod( + Invocation.getter(#chats), + returnValue: <_i22.ChatListTileDataModel>[], + returnValueForMissingStub: <_i22.ChatListTileDataModel>[], + ) as List<_i22.ChatListTileDataModel>); + + @override + Map> get chatMessagesByUser => + (super.noSuchMethod( + Invocation.getter(#chatMessagesByUser), + returnValue: >{}, + returnValueForMissingStub: >{}, + ) as Map>); + + @override + _i14.ViewState get state => (super.noSuchMethod( + Invocation.getter(#state), + returnValue: _i14.ViewState.idle, + returnValueForMissingStub: _i14.ViewState.idle, + ) as _i14.ViewState); + + @override + bool get isBusy => (super.noSuchMethod( + Invocation.getter(#isBusy), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + bool get hasListeners => (super.noSuchMethod( + Invocation.getter(#hasListeners), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); + + @override + void refreshChats() => super.noSuchMethod( + Invocation.method( + #refreshChats, + [], + ), + returnValueForMissingStub: null, + ); + + @override + _i5.Future initialise() => (super.noSuchMethod( + Invocation.method( + #initialise, + [], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future getChatMessages(String? chatId) => (super.noSuchMethod( + Invocation.method( + #getChatMessages, + [chatId], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + _i5.Future sendMessageToDirectChat( + String? chatId, + String? messageContent, + ) => + (super.noSuchMethod( + Invocation.method( + #sendMessageToDirectChat, + [ + chatId, + messageContent, + ], + ), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) as _i5.Future); + + @override + void dispose() => super.noSuchMethod( + Invocation.method( + #dispose, + [], + ), + returnValueForMissingStub: null, + ); + + @override + void chatName(dynamic chatId) => super.noSuchMethod( + Invocation.method( + #chatName, + [chatId], + ), + returnValueForMissingStub: null, + ); + + @override + void setState(_i14.ViewState? viewState) => super.noSuchMethod( + Invocation.method( + #setState, + [viewState], + ), + returnValueForMissingStub: null, + ); + + @override + void addListener(_i10.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #addListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void removeListener(_i10.VoidCallback? listener) => super.noSuchMethod( + Invocation.method( + #removeListener, + [listener], + ), + returnValueForMissingStub: null, + ); + + @override + void notifyListeners() => super.noSuchMethod( + Invocation.method( + #notifyListeners, + [], + ), + returnValueForMissingStub: null, + ); +} + +/// A class which mocks [ImageCropper]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockImageCropper extends _i2.Mock implements _i41.ImageCropper { + @override + _i5.Future<_i42.CroppedFile?> cropImage({ + required String? sourcePath, + int? maxWidth, + int? maxHeight, + _i42.CropAspectRatio? aspectRatio, + List<_i42.CropAspectRatioPreset>? aspectRatioPresets = const [ + _i42.CropAspectRatioPreset.original, + _i42.CropAspectRatioPreset.square, + _i42.CropAspectRatioPreset.ratio3x2, + _i42.CropAspectRatioPreset.ratio4x3, + _i42.CropAspectRatioPreset.ratio16x9, + ], + _i42.CropStyle? cropStyle = _i42.CropStyle.rectangle, + _i42.ImageCompressFormat? compressFormat = _i42.ImageCompressFormat.jpg, + int? compressQuality = 90, + List<_i42.PlatformUiSettings>? uiSettings, + }) => + (super.noSuchMethod( + Invocation.method( + #cropImage, + [], + { + #sourcePath: sourcePath, + #maxWidth: maxWidth, + #maxHeight: maxHeight, + #aspectRatio: aspectRatio, + #aspectRatioPresets: aspectRatioPresets, + #cropStyle: cropStyle, + #compressFormat: compressFormat, + #compressQuality: compressQuality, + #uiSettings: uiSettings, + }, + ), + returnValue: _i5.Future<_i42.CroppedFile?>.value(), + returnValueForMissingStub: _i5.Future<_i42.CroppedFile?>.value(), + ) as _i5.Future<_i42.CroppedFile?>); + + @override + _i5.Future<_i42.CroppedFile?> recoverImage() => (super.noSuchMethod( + Invocation.method( + #recoverImage, + [], + ), + returnValue: _i5.Future<_i42.CroppedFile?>.value(), + returnValueForMissingStub: _i5.Future<_i42.CroppedFile?>.value(), + ) as _i5.Future<_i42.CroppedFile?>); +} + +/// A class which mocks [ImagePicker]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockImagePicker extends _i2.Mock implements _i13.ImagePicker { + @override + _i5.Future<_i13.XFile?> pickImage({ + required _i13.ImageSource? source, + double? maxWidth, + double? maxHeight, + int? imageQuality, + _i13.CameraDevice? preferredCameraDevice = _i13.CameraDevice.rear, + bool? requestFullMetadata = true, + }) => + (super.noSuchMethod( + Invocation.method( + #pickImage, + [], + { + #source: source, + #maxWidth: maxWidth, + #maxHeight: maxHeight, + #imageQuality: imageQuality, + #preferredCameraDevice: preferredCameraDevice, + #requestFullMetadata: requestFullMetadata, + }, + ), + returnValue: _i5.Future<_i13.XFile?>.value(), + returnValueForMissingStub: _i5.Future<_i13.XFile?>.value(), + ) as _i5.Future<_i13.XFile?>); + + @override + _i5.Future> pickMultiImage({ + double? maxWidth, + double? maxHeight, + int? imageQuality, + bool? requestFullMetadata = true, + }) => + (super.noSuchMethod( + Invocation.method( + #pickMultiImage, + [], + { + #maxWidth: maxWidth, + #maxHeight: maxHeight, + #imageQuality: imageQuality, + #requestFullMetadata: requestFullMetadata, + }, + ), + returnValue: _i5.Future>.value(<_i13.XFile>[]), + returnValueForMissingStub: + _i5.Future>.value(<_i13.XFile>[]), + ) as _i5.Future>); + + @override + _i5.Future<_i13.XFile?> pickMedia({ + double? maxWidth, + double? maxHeight, + int? imageQuality, + bool? requestFullMetadata = true, + }) => + (super.noSuchMethod( + Invocation.method( + #pickMedia, + [], + { + #maxWidth: maxWidth, + #maxHeight: maxHeight, + #imageQuality: imageQuality, + #requestFullMetadata: requestFullMetadata, + }, + ), + returnValue: _i5.Future<_i13.XFile?>.value(), + returnValueForMissingStub: _i5.Future<_i13.XFile?>.value(), + ) as _i5.Future<_i13.XFile?>); + + @override + _i5.Future> pickMultipleMedia({ + double? maxWidth, + double? maxHeight, + int? imageQuality, + bool? requestFullMetadata = true, + }) => + (super.noSuchMethod( + Invocation.method( + #pickMultipleMedia, + [], + { + #maxWidth: maxWidth, + #maxHeight: maxHeight, + #imageQuality: imageQuality, + #requestFullMetadata: requestFullMetadata, + }, + ), + returnValue: _i5.Future>.value(<_i13.XFile>[]), + returnValueForMissingStub: + _i5.Future>.value(<_i13.XFile>[]), + ) as _i5.Future>); + + @override + _i5.Future<_i13.XFile?> pickVideo({ + required _i13.ImageSource? source, + _i13.CameraDevice? preferredCameraDevice = _i13.CameraDevice.rear, + Duration? maxDuration, + }) => + (super.noSuchMethod( + Invocation.method( + #pickVideo, + [], + { + #source: source, + #preferredCameraDevice: preferredCameraDevice, + #maxDuration: maxDuration, + }, + ), + returnValue: _i5.Future<_i13.XFile?>.value(), + returnValueForMissingStub: _i5.Future<_i13.XFile?>.value(), + ) as _i5.Future<_i13.XFile?>); + + @override + _i5.Future<_i13.LostDataResponse> retrieveLostData() => (super.noSuchMethod( + Invocation.method( + #retrieveLostData, + [], + ), + returnValue: + _i5.Future<_i13.LostDataResponse>.value(_FakeLostDataResponse_24( + this, + Invocation.method( + #retrieveLostData, + [], + ), + )), + returnValueForMissingStub: + _i5.Future<_i13.LostDataResponse>.value(_FakeLostDataResponse_24( + this, + Invocation.method( + #retrieveLostData, + [], + ), + )), + ) as _i5.Future<_i13.LostDataResponse>); + + @override + bool supportsImageSource(_i13.ImageSource? source) => (super.noSuchMethod( + Invocation.method( + #supportsImageSource, + [source], + ), + returnValue: false, + returnValueForMissingStub: false, + ) as bool); +} diff --git a/test/helpers/test_locator.dart b/test/helpers/test_locator.dart new file mode 100644 index 000000000..698696d44 --- /dev/null +++ b/test/helpers/test_locator.dart @@ -0,0 +1,123 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:get_it/get_it.dart'; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.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/image_service.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/services/org_service.dart'; +import 'package:talawa/services/post_service.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/services/third_party_service/multi_media_pick_service.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/utils/queries.dart'; +import 'package:talawa/view_model/access_request_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/add_post_view_models/add_post_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/chat_view_models/direct_chat_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/chat_view_models/select_contact_view_model.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/edit_event_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/event_info_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/after_auth_view_models/settings_view_models/app_setting_view_model.dart'; +import 'package:talawa/view_model/lang_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/theme_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(); +final appLanguageService = locator(); +final multimediaPickerService = locator(); +final organizationService = locator(); +final eventService = locator(); +final commentsService = locator(); +final postService = locator(); +final mainScreenViewModel = locator(); +final imageService = locator(); +final imagePicker = locator(); +final imageCropper = locator(); + +void testSetupLocator() { + //services + locator.registerSingleton(NavigationService()); + + //sizeConfig + locator.registerSingleton(SizeConfig()); + + //userConfig + locator.registerSingleton(UserConfig()); + + //Services + locator.registerLazySingleton(() => OrganizationService()); + locator.registerLazySingleton(() => PostService()); + locator.registerLazySingleton(() => EventService()); + locator.registerLazySingleton(() => CommentService()); + locator.registerLazySingleton(() => MultiMediaPickerService()); + locator.registerLazySingleton(() => ImageService()); + locator.registerLazySingleton(() => ImagePicker()); + locator.registerLazySingleton(() => ImageCropper()); + locator.registerSingleton(() => OrganizationService()); + + //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(() => AccessScreenViewModel()); + locator.registerFactory(() => SignupDetailsViewModel()); + locator.registerFactory(() => WaitingViewModel()); + locator.registerFactory(() => ExploreEventsViewModel()); + locator.registerFactory(() => MainScreenViewModel()); + locator.registerFactory(() => ProfilePageViewModel()); + locator.registerFactory(() => EditProfilePageViewModel()); + locator.registerFactory(() => CreateEventViewModel()); + locator.registerFactory(() => EditEventViewModel()); + locator.registerFactory(() => AddPostViewModel()); + locator.registerFactory(() => EventInfoViewModel()); + locator.registerFactory(() => AppSettingViewModel()); + + //Widgets viewModels + locator.registerFactory(() => ProgressDialogViewModel()); + locator.registerFactory(() => CustomDrawerViewModel()); + locator.registerFactory(() => LikeButtonViewModel()); + locator.registerFactory(() => AppLanguage(isTest: true)); + locator.registerFactory(() => CommentsViewModel()); + locator.registerFactory(() => AppTheme()); + locator.registerFactory(() => DirectChatViewModel()); + locator.registerFactory(() => SelectContactViewModel()); +} diff --git a/test/model_tests/app_tour_test.dart b/test/model_tests/app_tour_test.dart new file mode 100644 index 000000000..f9009417a --- /dev/null +++ b/test/model_tests/app_tour_test.dart @@ -0,0 +1,255 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/app_tour.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; + +class MockBuildContext extends Mock implements BuildContext {} + +class CustomTutorialController extends TutorialCoachMarkController { + @override + void next() {} + + @override + void previous() {} + + @override + void skip() {} +} + +class MockTutorialCoachMark extends Mock implements TutorialCoachMark { + @override + void next() {} +} + +class MockAppTour extends Mock implements AppTour { + MockAppTour({ + required this.model, + }); + + @override + TutorialCoachMark get tutorialCoachMark => MockTutorialCoachMark(); + + @override + void showTutorial({ + required Function(TargetFocus p1) onClickTarget, + required Function() onFinish, + required List targets, + }) { + onFinish(); + onClickTarget( + TargetFocus( + identify: MainScreenViewModel.keyDrawerCurOrg, + keyTarget: model.keyBNChat, + ), + ); + } + + @override + MainScreenViewModel model; +} + +/// Creates a MaterialApp widget with the given home widget and common localizations. +/// +/// **params**: +/// * `home`: The home widget of the MaterialApp. +/// +/// **returns**: +/// * `MaterialApp`: The MaterialApp widget. +/// +MaterialApp createMaterialApp({required Widget home}) { + return MaterialApp( + home: home, + localizationsDelegates: const [ + AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + supportedLocales: const [ + Locale('en', ''), + ], + ); +} + +void main() { + setupLocator(); + sizeConfig.test(); + // registerServices(); + + group('Tests for FocusTarget', () { + testWidgets('Test for first TargetContent builder in FocusTarget model.', + (tester) async { + AppTour? mockAppTour; + FocusTarget? mockFocusTarget; + BuildContext? capturedContext; + final app = BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: BaseView( + onModelReady: (model2) => model2.initialise( + context, + fromSignUp: false, + mainScreenIndex: 0, + demoMode: true, + testMode: true, + ), + builder: (context, model2, child) { + capturedContext = context; + mockAppTour = AppTour(model: model2); + mockFocusTarget = FocusTarget( + key: MainScreenViewModel.keyDrawerLeaveCurrentOrg, + keyName: 'keyDrawerLeaveCurrentOrg', + description: 'description', + next: () {}, + appTour: mockAppTour!, + ); + // SizeConfig().init(context); + model2.context = context; + return Scaffold( + drawer: const Drawer(), + key: MainScreenViewModel.scaffoldKey, + body: TextButton( + key: MainScreenViewModel.keyDrawerLeaveCurrentOrg, + child: const Text('tutorial'), + onPressed: () { + MainScreenViewModel.scaffoldKey.currentState! + .openDrawer(); + mockAppTour!.showTutorial( + onClickTarget: (x) {}, + onFinish: () {}, + targets: [ + mockFocusTarget!, + ], + ); + }, + ), + ); + }, + ), + navigatorKey: navigationService.navigatorKey, + // onGenerateRoute: router.generateRoute, + ); + }, + ); + + await tester.pumpWidget(app); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final tutorialBtn = + find.byKey(MainScreenViewModel.keyDrawerLeaveCurrentOrg); + + expect(tutorialBtn, findsOneWidget); + + (tester.widget(tutorialBtn) as TextButton).onPressed!(); + await tester.pumpAndSettle(); + + expect( + mockFocusTarget!.focusWidget.contents![0].builder!( + capturedContext!, + CustomTutorialController(), + ) as Container, + isA(), + ); + }); + + testWidgets('Test for showTutorial method.', (tester) async { + AppTour? mockAppTour; + FocusTarget? mockFocusTarget; + BuildContext? capturedContext; + final app = BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: BaseView( + onModelReady: (model2) => model2.initialise( + context, + fromSignUp: false, + mainScreenIndex: 0, + demoMode: true, + testMode: true, + ), + builder: (context, model2, child) { + capturedContext = context; + mockAppTour = AppTour(model: model2); + mockFocusTarget = FocusTarget( + key: MainScreenViewModel.keyDrawerLeaveCurrentOrg, + keyName: 'keyDrawerLeaveCurrentOrg', + description: 'description', + next: () {}, + appTour: mockAppTour!, + ); + // SizeConfig().init(context); + model2.context = context; + return Scaffold( + drawer: const Drawer(), + key: MainScreenViewModel.scaffoldKey, + body: TextButton( + key: MainScreenViewModel.keyDrawerLeaveCurrentOrg, + child: const Text('tutorial'), + onPressed: () { + MainScreenViewModel.scaffoldKey.currentState! + .openDrawer(); + mockAppTour!.showTutorial( + onClickTarget: (x) {}, + onFinish: () {}, + targets: [ + mockFocusTarget!, + ], + ); + }, + ), + ); + }, + ), + navigatorKey: navigationService.navigatorKey, + // onGenerateRoute: router.generateRoute, + ); + }, + ); + + await tester.pumpWidget(app); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final tutorialBtn = + find.byKey(MainScreenViewModel.keyDrawerLeaveCurrentOrg); + + expect(tutorialBtn, findsOneWidget); + + (tester.widget(tutorialBtn) as TextButton).onPressed!(); + await tester.pumpAndSettle(); + + mockAppTour!.tutorialCoachMark.onSkip!(); + mockAppTour!.tutorialCoachMark.onClickOverlay!( + TargetFocus( + identify: MainScreenViewModel.keyDrawerCurOrg, + keyTarget: MainScreenViewModel.keyDrawerCurOrg, + ), + ); + + (mockFocusTarget!.focusWidget.contents![1].builder!( + capturedContext!, + CustomTutorialController(), + ) as GestureDetector) + .onTap!(); + }); + }); +} diff --git a/test/model_tests/chat/chat_list_tile_data_model_test.dart b/test/model_tests/chat/chat_list_tile_data_model_test.dart new file mode 100644 index 000000000..0bda6029e --- /dev/null +++ b/test/model_tests/chat/chat_list_tile_data_model_test.dart @@ -0,0 +1,72 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/models/chats/chat_list_tile_data_model.dart'; +import 'package:talawa/models/chats/chat_user.dart'; + +void main() { + group('Test ChatListTileDataModel', () { + const int listLength = 4; + + final List users = List.generate(listLength, (index) { + return ChatUser( + id: '$index', + firstName: 'First$index', + image: 'Image$index', + ); + }); + + final ChatListTileDataModel chatListTileDataModel = ChatListTileDataModel( + users, + '123', + ); + + final Map json = { + '_id': '123', + 'users': List.generate(listLength, (index) { + return { + '_id': '$index', + 'firstName': 'First$index', + 'image': 'Image$index', + }; + }), + }; + + void checkUsers(List? users1, List? users2) { + if (users1 == null || users2 == null) { + expect(users1, users2); + return; + } + + for (int index = 0; index < users1.length; index++) { + expect(users1[index].id, users2[index].id); + expect(users1[index].firstName, users2[index].firstName); + expect(users1[index].image, users2[index].image); + } + } + + test('Test constructor', () { + expect(chatListTileDataModel.id, '123'); + checkUsers(chatListTileDataModel.users, users); + }); + + test('Test ChatListTileDataModel.fromJson', () { + final ChatListTileDataModel chatListTileDataModelFromJson = + ChatListTileDataModel.fromJson(json); + + expect(chatListTileDataModel.id, chatListTileDataModelFromJson.id); + checkUsers( + chatListTileDataModel.users, + chatListTileDataModelFromJson.users, + ); + }); + + test('Test toJson', () { + final Map json = chatListTileDataModel.toJson(); + + expect(json['_id'], chatListTileDataModel.id); + checkUsers(json['users'] as List, chatListTileDataModel.users); + }); + }); +} diff --git a/test/model_tests/chat/chat_message_test.dart b/test/model_tests/chat/chat_message_test.dart new file mode 100644 index 000000000..972a9231a --- /dev/null +++ b/test/model_tests/chat/chat_message_test.dart @@ -0,0 +1,28 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/models/chats/chat_message.dart'; +import 'package:talawa/models/chats/chat_user.dart'; + +final chatUserOne = + ChatUser(firstName: 'Ravidi', id: '1', image: "https://testimg.com"); +final chatUserTwo = + ChatUser(firstName: 'Sheikh', id: '2', image: "https://testimg.com"); +void main() { + group("Tests for ChatMessage.dart", () { + test('check if ChatMessage JSON serialization works', () { + final message = + ChatMessage('1', chatUserOne, 'Hello, how are you?', chatUserTwo); + + final messageJson = message.toJson(); + + final messageFromJson = ChatMessage.fromJson(messageJson); + + expect(messageFromJson.id, message.id); + expect(messageFromJson.sender!.firstName, message.sender!.firstName); + expect(messageFromJson.receiver!.id, message.receiver!.id); + expect(messageFromJson.messageContent, message.messageContent); + }); + }); +} diff --git a/test/model_tests/chat/chat_user_test.dart b/test/model_tests/chat/chat_user_test.dart new file mode 100644 index 000000000..f6a4793a1 --- /dev/null +++ b/test/model_tests/chat/chat_user_test.dart @@ -0,0 +1,30 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/models/chats/chat_user.dart'; + +void main() { + group('Test chat_user model', () { + final chatUser = ChatUser( + firstName: 'Ayush', + id: null, + image: 'random image url', + ); + final chatUserJson = { + 'firstName': 'Ayush', + '_id': null, + 'image': 'random image url', + }; + test('Test json to model', () { + final chatUserFromJson = ChatUser.fromJson(chatUserJson); + expect(chatUser.firstName, chatUserFromJson.firstName); + expect(chatUser.id, chatUserFromJson.id); + expect(chatUser.image, chatUserFromJson.image); + }); + test('Test model to json', () { + final json = chatUser.toJson(); + expect(json, chatUserJson); + }); + }); +} diff --git a/test/model_tests/chats/chat_message_test.dart b/test/model_tests/chats/chat_message_test.dart new file mode 100644 index 000000000..972a9231a --- /dev/null +++ b/test/model_tests/chats/chat_message_test.dart @@ -0,0 +1,28 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/models/chats/chat_message.dart'; +import 'package:talawa/models/chats/chat_user.dart'; + +final chatUserOne = + ChatUser(firstName: 'Ravidi', id: '1', image: "https://testimg.com"); +final chatUserTwo = + ChatUser(firstName: 'Sheikh', id: '2', image: "https://testimg.com"); +void main() { + group("Tests for ChatMessage.dart", () { + test('check if ChatMessage JSON serialization works', () { + final message = + ChatMessage('1', chatUserOne, 'Hello, how are you?', chatUserTwo); + + final messageJson = message.toJson(); + + final messageFromJson = ChatMessage.fromJson(messageJson); + + expect(messageFromJson.id, message.id); + expect(messageFromJson.sender!.firstName, message.sender!.firstName); + expect(messageFromJson.receiver!.id, message.receiver!.id); + expect(messageFromJson.messageContent, message.messageContent); + }); + }); +} diff --git a/test/model_tests/comment/comment_model_test.dart b/test/model_tests/comment/comment_model_test.dart new file mode 100644 index 000000000..dec61ce5e --- /dev/null +++ b/test/model_tests/comment/comment_model_test.dart @@ -0,0 +1,46 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/models/comment/comment_model.dart'; +import 'package:talawa/models/user/user_info.dart'; + +void main() { + group('Test Task model', () { + test('Test task json', () { + final comment = Comment( + creator: User( + id: '123', + firstName: 'John', + lastName: 'Doe', + email: 'test@test.com', + ), + createdAt: '123456', + text: 'test text', + post: 'test post', + likeCount: 'test count', + ); + final commentJson = { + 'creator': { + '_id': '123', + 'firstName': 'John', + 'lastName': 'Doe', + 'email': 'test@test.com', + }, + 'createdAt': '123456', + 'text': 'test text', + 'post': 'test post', + 'likeCount': 'test count', + }; + final commentFromJson = Comment.fromJson(commentJson); + expect(comment.creator?.id, commentFromJson.creator?.id); + expect(comment.creator?.firstName, commentFromJson.creator?.firstName); + expect(comment.creator?.lastName, commentFromJson.creator?.lastName); + expect(comment.creator?.email, commentFromJson.creator?.email); + expect(comment.createdAt, commentFromJson.createdAt); + expect(comment.text, commentFromJson.text); + expect(comment.post, commentFromJson.post); + expect(comment.likeCount, commentFromJson.likeCount); + }); + }); +} diff --git a/test/model_tests/events/event_model_test.dart b/test/model_tests/events/event_model_test.dart new file mode 100644 index 000000000..689472c0c --- /dev/null +++ b/test/model_tests/events/event_model_test.dart @@ -0,0 +1,135 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; + +void main() { + group('Test Event Model', () { + test('Test Event ', () { + final User user1 = User(id: "fakeUser1"); + final User user2 = User(id: "fakeUser2"); + final List users = [user1, user2]; + + final event = Event( + creator: User( + id: '123', + firstName: 'Ayush', + lastName: 'Chaudhary', + email: 'test@test.com', + ), + id: '12', + title: 'for test only', + description: 'for test only', + location: 'for test only', + latitude: 1233, + longitude: 123, + recurring: false, + allDay: false, + startDate: 'for test only', + endDate: 'for test only', + startTime: 'for test only', + endTime: 'for test only', + recurrence: 'for test only', + isPublic: true, + isRegistered: true, + isRegisterable: true, + organization: OrgInfo(admins: users), + admins: users, + attendees: [ + Attendee( + id: "attendee1", + firstName: "firstName1", + lastName: "lastName1", + image: null, + ), + ], + ); + + final eventJson = { + 'creator': { + '_id': '123', + 'firstName': 'Ayush', + 'lastName': 'Chaudhary', + 'email': 'test@test.com', + }, + '_id': '12', + 'title': 'for test only', + 'description': 'for test only', + 'location': 'for test only', + 'latitude': 1233.00, + 'longitude': 123.00, + 'recurring': false, + 'allDay': false, + 'startDate': 'for test only', + 'endDate': 'for test only', + 'startTime': 'for test only', + 'endTime': 'for test only', + 'recurrence': 'for test only', + 'isPublic': true, + 'isRegistered': true, + 'isRegisterable': true, + 'organization': { + 'admin': { + 'id': '123', + 'firstName': 'Ayush', + 'lastName': 'Chaudhary', + 'email': 'test@test.com', + }, + }, + 'admins': [ + { + 'id': '123', + 'firstName': 'Ayush', + 'lastName': 'Chaudhary', + 'email': 'test@test.com', + }, + { + 'id': '123', + 'firstName': 'Aykkush', + 'lastName': 'Chaudhary', + 'email': 'test@test.com', + }, + ], + 'attendees': [ + Attendee( + id: "attendee1", + firstName: "firstName1", + lastName: "lastName1", + image: null, + ).toJson(), + ], + }; + final eventFromJson = Event.fromJson(eventJson); + + expect(event.creator?.id, eventFromJson.creator?.id); + expect(event.creator?.firstName, eventFromJson.creator?.firstName); + expect(event.creator?.lastName, eventFromJson.creator?.lastName); + expect(event.creator?.email, eventFromJson.creator?.email); + expect(event.title, eventFromJson.title); + expect(event.id, eventFromJson.id); + expect(event.description, eventFromJson.description); + expect(event.attendees?[0].id, eventFromJson.attendees?[0].id); + expect( + event.attendees?[0].firstName, + eventFromJson.attendees?[0].firstName, + ); + expect( + event.attendees?[0].lastName, + eventFromJson.attendees?[0].lastName, + ); + expect(event.attendees?[0].image, eventFromJson.attendees?[0].image); + expect(event.location, eventFromJson.location); + expect(event.latitude, eventFromJson.latitude); + expect(event.longitude, eventFromJson.longitude); + expect(event.recurring, eventFromJson.recurring); + expect(event.allDay, eventFromJson.allDay); + expect(event.startDate, eventFromJson.startDate); + expect(event.startTime, eventFromJson.startTime); + expect(event.endTime, eventFromJson.endTime); + expect(event.recurrence, eventFromJson.recurrence); + expect(event.isPublic, eventFromJson.isPublic); + expect(event.isRegistered, eventFromJson.isRegistered); + expect(event.isRegisterable, eventFromJson.isRegisterable); + }); + }); +} diff --git a/test/model_tests/mainscreen_navigation_args_test.dart b/test/model_tests/mainscreen_navigation_args_test.dart new file mode 100644 index 000000000..fc25ccb78 --- /dev/null +++ b/test/model_tests/mainscreen_navigation_args_test.dart @@ -0,0 +1,33 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/models/mainscreen_navigation_args.dart'; + +void main() { + group('MainScreenArgs', () { + test('Equality', () { + // Test 1: Creating two equal instances of MainScreenArgs + final mainScreenArgs1 = MainScreenArgs( + fromSignUp: true, + mainScreenIndex: 1, + toggleDemoMode: false, + ); + final mainScreenArgs2 = MainScreenArgs( + fromSignUp: true, + mainScreenIndex: 1, + toggleDemoMode: false, + ); + + expect(mainScreenArgs1, equals(mainScreenArgs2)); + expect(mainScreenArgs1.hashCode, equals(mainScreenArgs2.hashCode)); + + // Test 2: Creating instances with different properties + final mainScreenArgs3 = MainScreenArgs( + fromSignUp: false, + mainScreenIndex: 2, + toggleDemoMode: true, + ); + + expect(mainScreenArgs1, isNot(equals(mainScreenArgs3))); + expect(mainScreenArgs1.hashCode, isNot(equals(mainScreenArgs3.hashCode))); + }); + }); +} diff --git a/test/model_tests/organization/org_info_address_test.dart b/test/model_tests/organization/org_info_address_test.dart new file mode 100644 index 000000000..c080b64b0 --- /dev/null +++ b/test/model_tests/organization/org_info_address_test.dart @@ -0,0 +1,31 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/models/organization/org_info_address.dart'; + +void main() { + group('Test OrgInfoAddress model', () { + final Map addressJson = { + "city": "Delhi", + "countryCode": "IN", + "dependentLocality": "Some Dependent Locality", + "line1": "123 Random Street", + "line2": "Apartment 456", + "postalCode": "110001", + "sortingCode": "ABC-123", + "state": "Delhi", + }; + test('Test fromJson function', () { + final Address result = Address.fromJson(addressJson); + expect(result.city, 'Delhi'); + expect(result.countryCode, 'IN'); + expect(result.dependentLocality, 'Some Dependent Locality'); + expect(result.line1, '123 Random Street'); + expect(result.line2, 'Apartment 456'); + expect(result.postalCode, '110001'); + expect(result.sortingCode, 'ABC-123'); + expect(result.state, 'Delhi'); + }); + }); +} diff --git a/test/model_tests/organization/org_info_test.dart b/test/model_tests/organization/org_info_test.dart new file mode 100644 index 000000000..9f2b25296 --- /dev/null +++ b/test/model_tests/organization/org_info_test.dart @@ -0,0 +1,213 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/organization/org_info.dart'; + +import '../../helpers/test_helpers.dart'; + +void main() { + setupLocator(); + sizeConfig.test(); + setUp(() { + registerServices(); + }); + + group('Test OrgInfo model', () { + final Map userJson = { + 'accessToken': ' ', + 'refreshToken': ' ', + '_id': 'user_id', + }; + final Map json1 = { + '_id': '123', + 'image': 'image_url', + 'name': 'Name', + 'description': 'Description', + 'userRegistrationRequired': false, + 'creator': userJson, + 'members': [userJson], + 'admins': [userJson], + 'address': { + "city": "Delhi", + "countryCode": "IN", + "dependentLocality": "Some Dependent Locality", + "line1": "123 Random Street", + "line2": "Apartment 456", + "postalCode": "110001", + "sortingCode": "ABC-123", + "state": "Delhi", + }, + }; + final Map json2 = { + '_id': '321', + 'image': 'image_url', + 'name': 'Name', + 'description': 'Description', + 'userRegistrationRequired': false, + 'creator': userJson, + 'members': [userJson], + 'admins': [userJson], + 'address': { + "city": "Delhi", + "countryCode": "IN", + "dependentLocality": "Some Dependent Locality", + "line1": "123 Random Street", + "line2": "Apartment 456", + "postalCode": "110001", + "sortingCode": "ABC-123", + "state": "Delhi", + }, + }; + + test('Test fromJson function with memberRequest false', () { + final OrgInfo result = OrgInfo.fromJson(json1, memberRequest: false); + + expect(result.id, '123'); + expect(result.image, 'image_url'); + expect(result.name, 'Name'); + expect(result.description, 'Description'); + expect(result.userRegistrationRequired, false); + expect(result.creatorInfo!.authToken, ' '); + expect(result.creatorInfo!.refreshToken, ' '); + expect(result.creatorInfo!.id, 'user_id'); + expect(result.members!.length, 1); + expect(result.members![0].authToken, ' '); + expect(result.members![0].refreshToken, ' '); + expect(result.members![0].id, 'user_id'); + expect(result.admins!.length, 1); + expect(result.admins![0].authToken, ' '); + expect(result.admins![0].refreshToken, ' '); + expect(result.admins![0].id, 'user_id'); + expect(result.address!.city, 'Delhi'); + expect(result.address!.countryCode, "IN"); + expect(result.address!.state, 'Delhi'); + }); + + test('Test fromJson function with memberRequest true', () { + final Map json = { + 'organization': json1, + }; + + final OrgInfo result = OrgInfo.fromJson(json, memberRequest: true); + + expect(result.id, '123'); + expect(result.image, 'image_url'); + expect(result.name, 'Name'); + expect(result.description, 'Description'); + expect(result.userRegistrationRequired, false); + expect(result.creatorInfo!.authToken, ' '); + expect(result.creatorInfo!.refreshToken, ' '); + expect(result.creatorInfo!.id, 'user_id'); + expect(result.members!.length, 1); + expect(result.members![0].authToken, ' '); + expect(result.members![0].refreshToken, ' '); + expect(result.members![0].id, 'user_id'); + expect(result.admins!.length, 1); + expect(result.admins![0].authToken, ' '); + expect(result.admins![0].refreshToken, ' '); + expect(result.admins![0].id, 'user_id'); + expect(result.address!.city, 'Delhi'); + expect(result.address!.countryCode, "IN"); + expect(result.address!.state, 'Delhi'); + }); + + test('Test fromJsonToList', () { + final List res = OrgInfo().fromJsonToList([json1, json2]); + + expect(res.length, 2); + for (int i = 0; i < 2; i++) { + final result = res[i]; + if (i == 0) { + expect(result.id, '123'); + } else { + expect(result.id, '321'); + } + expect(result.image, 'image_url'); + expect(result.name, 'Name'); + expect(result.description, 'Description'); + expect(result.userRegistrationRequired, false); + expect(result.creatorInfo!.authToken, ' '); + expect(result.creatorInfo!.refreshToken, ' '); + expect(result.creatorInfo!.id, 'user_id'); + expect(result.members!.length, 1); + expect(result.members![0].authToken, ' '); + expect(result.members![0].refreshToken, ' '); + expect(result.members![0].id, 'user_id'); + expect(result.admins!.length, 1); + expect(result.admins![0].authToken, ' '); + expect(result.admins![0].refreshToken, ' '); + expect(result.admins![0].id, 'user_id'); + expect(result.address!.city, 'Delhi'); + expect(result.address!.countryCode, "IN"); + expect(result.address!.state, 'Delhi'); + } + }); + + test('Test fromJsonToList with nested structures', () { + final List nestedJson = [ + [json1, json2], // Nested list with org information + json1, // Single org information + ]; + + final List res = OrgInfo().fromJsonToList(nestedJson); + + expect( + res.length, + 3, + ); // There are two orgs in the nested list and one in the single org information + + expect(res[0].id, '123'); + expect(res[0].image, 'image_url'); + expect(res[0].name, 'Name'); + expect(res[0].description, 'Description'); + expect(res[0].userRegistrationRequired, false); + expect(res[0].creatorInfo!.authToken, ' '); + expect(res[0].creatorInfo!.refreshToken, ' '); + expect(res[0].creatorInfo!.id, 'user_id'); + expect(res[0].members!.length, 1); + expect(res[0].members![0].authToken, ' '); + expect(res[0].members![0].refreshToken, ' '); + expect(res[0].members![0].id, 'user_id'); + expect(res[0].admins!.length, 1); + expect(res[0].admins![0].authToken, ' '); + expect(res[0].admins![0].refreshToken, ' '); + expect(res[0].admins![0].id, 'user_id'); + + expect(res[1].id, '321'); + expect(res[1].image, 'image_url'); + expect(res[1].name, 'Name'); + expect(res[1].description, 'Description'); + expect(res[1].userRegistrationRequired, false); + expect(res[1].creatorInfo!.authToken, ' '); + expect(res[1].creatorInfo!.refreshToken, ' '); + expect(res[1].creatorInfo!.id, 'user_id'); + expect(res[1].members!.length, 1); + expect(res[1].members![0].authToken, ' '); + expect(res[1].members![0].refreshToken, ' '); + expect(res[1].members![0].id, 'user_id'); + expect(res[1].admins!.length, 1); + expect(res[1].admins![0].authToken, ' '); + expect(res[1].admins![0].refreshToken, ' '); + expect(res[1].admins![0].id, 'user_id'); + + expect(res[2].id, '123'); + expect(res[2].image, 'image_url'); + expect(res[2].name, 'Name'); + expect(res[2].description, 'Description'); + expect(res[2].userRegistrationRequired, false); + expect(res[2].creatorInfo!.authToken, ' '); + expect(res[2].creatorInfo!.refreshToken, ' '); + expect(res[2].creatorInfo!.id, 'user_id'); + expect(res[2].members!.length, 1); + expect(res[2].members![0].authToken, ' '); + expect(res[2].members![0].refreshToken, ' '); + expect(res[2].members![0].id, 'user_id'); + expect(res[2].admins!.length, 1); + expect(res[2].admins![0].authToken, ' '); + expect(res[2].admins![0].refreshToken, ' '); + expect(res[2].admins![0].id, 'user_id'); + }); + }); +} diff --git a/test/model_tests/post/post_model_test.dart b/test/model_tests/post/post_model_test.dart new file mode 100644 index 000000000..89c849ace --- /dev/null +++ b/test/model_tests/post/post_model_test.dart @@ -0,0 +1,274 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.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'; + +void main() { + group('Test Post model', () { + final u1 = User( + id: '123', + firstName: 'John', + lastName: 'Doe', + email: 'test@test.com', + ); + final u2 = User( + id: '123', + firstName: 'Ayush', + lastName: 'Chaudhary', + email: 'test@test.com', + ); + final List users = [u1, u2]; + + final LikedBy l1 = LikedBy(sId: 'test1'); + final LikedBy l2 = LikedBy(sId: 'test2'); + final List likeby = [l1, l2]; + + final comment1 = Comments(sId: 'comment1'); + final comment2 = Comments(sId: 'comment2'); + final comment3 = Comments(sId: 'comment3'); + final List comments = [comment1, comment2, comment3]; + + test('Test Post model', () { + final myBirthday = DateTime.utc(2004, DateTime.june, 16, 5, 30, 0, 0, 0); + final post = Post( + creator: User( + id: '123', + firstName: 'John', + lastName: 'Doe', + email: 'test@test.com', + ), + sId: "sid", + createdAt: myBirthday, + description: 'test description', + imageUrl: 'https://image.com', + videoUrl: 'https://image.com', + organization: OrgInfo(admins: users), + likedBy: likeby, + comments: comments, + ); + final postJson = { + 'creator': { + '_id': '123', + 'firstName': 'John', + 'lastName': 'Doe', + 'email': 'test@test.com', + }, + '_id': '1222', + 'createdAt': '2023-03-15T15:28:52.122Z', + 'description': 'test description', + 'imageUrl': 'https://image.com', + 'videoUrl': 'https://image.com', + 'organization': { + 'admins': [ + { + 'id': '123', + 'firstName': 'Ayush', + 'lastName': 'Chaudhary', + 'email': 'test@test.com', + }, + { + 'id': '123', + 'firstName': 'John', + 'lastName': 'Doe', + 'email': 'test@test.com', + } + ], + }, + 'likedBy': [ + {'_id': 'test1'}, + {'_id': 'test2'}, + ], + 'comments': [ + { + '_id': 'comment1', + }, + { + '_id': 'comment2', + }, + { + '_id': 'comment3', + } + ], + }; + final postFromJson = Post.fromJson(postJson); + post.getPostCreatedDuration(); + expect(post.creator?.id, postFromJson.creator?.id); + expect(post.creator?.firstName, postFromJson.creator?.firstName); + expect(post.creator?.lastName, postFromJson.creator?.lastName); + expect(post.creator?.email, postFromJson.creator?.email); + }); + // final post = Post( + // creator: User( + // id: '123', + // firstName: 'John', + // lastName: 'Doe', + // email: 'test@test.com', + // ), + // sId: "sid", + // createdAt: myBirthday, + // description: 'test description', + // imageUrl: 'https://image.com', + // videoUrl: 'https://image.com', + // organization: OrgInfo(admins: users), + // likedBy: likeby, + // comments: comments, + // ); + group('check if getPostCreatedBuration is working', () { + test('check if getPostCreatedBuration is working', () { + final myBirthday = + DateTime.utc(2004, DateTime.june, 16, 5, 30, 0, 0, 0); + final post = Post( + creator: User( + id: '123', + firstName: 'John', + lastName: 'Doe', + email: 'test@test.com', + ), + sId: "sid", + createdAt: myBirthday, + description: 'test description', + imageUrl: 'https://image.com', + videoUrl: 'https://image.com', + organization: OrgInfo(admins: users), + likedBy: likeby, + comments: comments, + ); + post.getPostCreatedDuration(); + }); + test( + 'Check if getPostCreatedBuration work when time is less than 60 seconds', + () { + final myBirthday30 = + DateTime.now().subtract(const Duration(seconds: 30)); + final post = Post( + creator: User( + id: '123', + firstName: 'John', + lastName: 'Doe', + email: 'test@test.com', + ), + sId: "sid", + createdAt: myBirthday30, + description: 'test description', + imageUrl: 'https://image.com', + videoUrl: 'https://image.com', + organization: OrgInfo(admins: users), + likedBy: likeby, + comments: comments, + ); + post.getPostCreatedDuration(); + }); + test( + 'Check if getPostCreatedBuration work when time is less than 60 minutes', + () { + final myBirthday30 = + DateTime.now().subtract(const Duration(minutes: 30)); + final post = Post( + creator: User( + id: '123', + firstName: 'John', + lastName: 'Doe', + email: 'test@test.com', + ), + sId: "sid", + createdAt: myBirthday30, + description: 'test description', + imageUrl: 'https://image.com', + videoUrl: 'https://image.com', + organization: OrgInfo(admins: users), + likedBy: likeby, + comments: comments, + ); + post.getPostCreatedDuration(); + }); + test( + 'Check if getPostCreatedBuration work when time is less than 12 hours', + () { + final myBirthday12 = DateTime.now().subtract(const Duration(hours: 12)); + final post = Post( + creator: User( + id: '123', + firstName: 'John', + lastName: 'Doe', + email: 'test@test.com', + ), + sId: "sid", + createdAt: myBirthday12, + description: 'test description', + imageUrl: 'https://image.com', + videoUrl: 'https://image.com', + organization: OrgInfo(admins: users), + likedBy: likeby, + comments: comments, + ); + post.getPostCreatedDuration(); + }); + test( + 'Check if getPostCreatedBuration work when time is less than 15 days', + () { + final myBirthday15 = DateTime.now().subtract(const Duration(days: 15)); + final post = Post( + creator: User( + id: '123', + firstName: 'John', + lastName: 'Doe', + email: 'test@test.com', + ), + sId: "sid", + createdAt: myBirthday15, + description: 'test description', + imageUrl: 'https://image.com', + videoUrl: 'https://image.com', + organization: OrgInfo(admins: users), + likedBy: likeby, + comments: comments, + ); + post.getPostCreatedDuration(); + }); + test( + 'Check if getPostCreatedBuration work when time is less than 200 days', + () { + final myBirthday200 = + DateTime.now().subtract(const Duration(days: 200)); + final post = Post( + creator: User( + id: '123', + firstName: 'John', + lastName: 'Doe', + email: 'test@test.com', + ), + sId: "sid", + createdAt: myBirthday200, + description: 'test description', + imageUrl: 'https://image.com', + videoUrl: 'https://image.com', + organization: OrgInfo(admins: users), + likedBy: likeby, + comments: comments, + ); + post.getPostCreatedDuration(); + }); + }); + group('check if LikedBy toJson works', () { + test('LikeBy model toJson', () { + final likedBy = LikedBy(sId: "test"); + final likeByJson = { + '_id': 'test', + }; + expect(likedBy.toJson(), likeByJson); + }); + }); + group('check if Comment toJson works', () { + test('Comment model toJson', () { + final comment = Comments(sId: 'test'); + final commentJson = { + '_id': 'test', + }; + expect(comment.toJson(), commentJson); + }); + }); + }); +} diff --git a/test/model_tests/user/user_info_test.dart b/test/model_tests/user/user_info_test.dart new file mode 100644 index 000000000..0d9e7de24 --- /dev/null +++ b/test/model_tests/user/user_info_test.dart @@ -0,0 +1,248 @@ +// ignore_for_file: talawa_api_doc + +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:hive/hive.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; + +/// Encoded Organization. +final encodedOrg = { + "name": 'test_org', + "image": 'https://testimg.com', + "userRegistrationRequired": true, +}; + +/// Updated Organization. +final updatedOrg = OrgInfo.fromJson({ + "name": 'test_org_updated', + "image": 'https://testimg_updated.com', + "userRegistrationRequired": false, +}); + +/// Membership Request Organization. +final membershipRequestOrg = { + "organization": encodedOrg, +}; + +/// Updated Membership Request Organization. +final updatedMembershipRequestOrg = { + "organization": updatedOrg, +}; + +/// Test Organization List. +final testOrgList = [ + encodedOrg, + encodedOrg, +]; + +/// Membership Request Organization List. +final membershipRequestOrgList = [ + membershipRequestOrg, + membershipRequestOrg, +]; + +/// Test Data From Organization. +final testDataFromOrg = { + "firstName": "ravidi", + "lastName": "sheikh", + "email": "ravidisheikh@test.com", + "image": "https://testimg.com", + "accessToken": "randomAccessToken", + "authToken": "randomAuthToken", + "refreshToken": "randomRefreshToken", + "adminFor": testOrgList, + 'createdOrganizations': testOrgList, + 'joinedOrganizations': testOrgList, + 'membershipRequests': membershipRequestOrgList, +}; + +/// Test Data Not From Organization. +final testDataNotFromOrg = { + "user": { + "id": "1234567890", + "firstName": "ravidi", + "lastName": "sheikh", + "email": "ravidisheikh@test.com", + "image": "https://testimg.com", + "accessToken": "randomAccessToken", + "authToken": "randomAuthToken", + "refreshToken": "randomRefreshToken", + 'joinedOrganizations': testOrgList, + 'membershipRequests': membershipRequestOrgList, + }, + 'appUserProfile': { + 'createdOrganizations': testOrgList, + "adminFor": testOrgList, + }, +}; + +void main() { + group("Tests for UserInfo.dart", () { + test('Check if UserInfo.fromJson works with fromOrg', () async { + final userInfo = User.fromJson(testDataFromOrg, fromOrg: true); + + expect(userInfo.firstName, "ravidi"); + expect(userInfo.lastName, "sheikh"); + expect(userInfo.email, "ravidisheikh@test.com"); + expect(userInfo.image, "https://testimg.com"); + expect(userInfo.authToken, " "); + }); + + test('Check if UserInfo.fromJson works without fromOrg', () async { + final userInfo = User.fromJson(testDataNotFromOrg); + + expect(userInfo.firstName, "ravidi"); + expect(userInfo.lastName, "sheikh"); + expect(userInfo.email, "ravidisheikh@test.com"); + expect(userInfo.image, "https://testimg.com"); + expect(userInfo.authToken, null); + }); + + test('Check if the method "update" works', () async { + final userInfo = User.fromJson(testDataFromOrg, fromOrg: true); + + expect(userInfo.firstName, "ravidi"); + expect(userInfo.lastName, "sheikh"); + expect(userInfo.email, "ravidisheikh@test.com"); + expect(userInfo.image, "https://testimg.com"); + expect(userInfo.authToken, " "); + + userInfo.update( + User( + firstName: "ravidi_updated", + lastName: "sheikh_updated", + email: "updatedemail@test.com", + image: "https://testimgupdated.com", + authToken: "randomAuthToken_updated", + ), + ); + + expect(userInfo.firstName, "ravidi_updated"); + expect(userInfo.lastName, "sheikh_updated"); + expect(userInfo.email, "updatedemail@test.com"); + expect(userInfo.image, "https://testimgupdated.com"); + expect(userInfo.authToken, "randomAuthToken_updated"); + }); + + test('Check if print method works', () async { + final userInfo = User.fromJson(testDataFromOrg, fromOrg: true); + + // No way to test this. Calling here to increase + userInfo.print(); + }); + + test('Check if the method updateJoinedOrg works', () async { + final userInfo = User.fromJson(testDataFromOrg, fromOrg: true); + + expect(userInfo.joinedOrganizations!.length, 2); + expect(userInfo.joinedOrganizations![0].name, 'test_org'); + expect(userInfo.joinedOrganizations![0].image, 'https://testimg.com'); + expect(userInfo.joinedOrganizations![0].userRegistrationRequired, true); + + userInfo.updateJoinedOrg([updatedOrg, updatedOrg, updatedOrg]); + + expect(userInfo.joinedOrganizations!.length, 3); + expect(userInfo.joinedOrganizations![0].name, 'test_org_updated'); + expect( + userInfo.joinedOrganizations![0].image, + 'https://testimg_updated.com', + ); + expect(userInfo.joinedOrganizations![0].userRegistrationRequired, false); + }); + + test('Check if the method updateCreatedOrg works', () async { + final userInfo = User.fromJson(testDataFromOrg, fromOrg: true); + + expect(userInfo.createdOrganizations!.length, 2); + expect(userInfo.createdOrganizations![0].name, 'test_org'); + expect(userInfo.createdOrganizations![0].image, 'https://testimg.com'); + expect(userInfo.createdOrganizations![0].userRegistrationRequired, true); + + userInfo.updateCreatedOrg([updatedOrg, updatedOrg, updatedOrg]); + + expect(userInfo.createdOrganizations!.length, 3); + expect(userInfo.createdOrganizations![0].name, 'test_org_updated'); + expect( + userInfo.createdOrganizations![0].image, + 'https://testimg_updated.com', + ); + expect(userInfo.createdOrganizations![0].userRegistrationRequired, false); + }); + + test('Check if the method updateMemberRequestOrg works', () async { + final userInfo = User.fromJson(testDataFromOrg, fromOrg: true); + + expect(userInfo.membershipRequests!.length, 2); + expect(userInfo.membershipRequests![0].name, 'test_org'); + expect(userInfo.membershipRequests![0].image, 'https://testimg.com'); + expect(userInfo.membershipRequests![0].userRegistrationRequired, true); + + userInfo.updateMemberRequestOrg([updatedOrg, updatedOrg, updatedOrg]); + + expect(userInfo.membershipRequests!.length, 5); + expect(userInfo.membershipRequests![3].name, 'test_org_updated'); + expect( + userInfo.membershipRequests![3].image, + 'https://testimg_updated.com', + ); + expect(userInfo.membershipRequests![3].userRegistrationRequired, false); + }); + + test('Check if the method updateAdminFor works', () async { + final userInfo = User.fromJson(testDataFromOrg, fromOrg: true); + + expect(userInfo.adminFor!.length, 2); + expect(userInfo.adminFor![0].name, 'test_org'); + expect(userInfo.adminFor![0].image, 'https://testimg.com'); + expect(userInfo.adminFor![0].userRegistrationRequired, true); + + userInfo.updateAdminFor([updatedOrg, updatedOrg, updatedOrg]); + + expect(userInfo.adminFor!.length, 3); + expect(userInfo.adminFor![0].name, 'test_org_updated'); + expect(userInfo.adminFor![0].image, 'https://testimg_updated.com'); + expect(userInfo.adminFor![0].userRegistrationRequired, false); + }); + + test('Check if Hive storage works', () async { + Hive + ..init("./temporaryPath") + ..registerAdapter(UserAdapter()) + ..registerAdapter(OrgInfoAdapter()); + + final userBox = await Hive.openBox('userInfo'); + expect(userBox.isOpen, true); + + final userInfo = User.fromJson(testDataFromOrg, fromOrg: true); + userBox.put('user', userInfo); + + final newUserBox = await Hive.openBox('userInfo'); + final loadedUserInfo = newUserBox.get('user') as User; + + expect(loadedUserInfo.firstName, "ravidi"); + expect(loadedUserInfo.lastName, "sheikh"); + expect(loadedUserInfo.email, "ravidisheikh@test.com"); + expect(loadedUserInfo.image, "https://testimg.com"); + expect(loadedUserInfo.authToken, " "); + + File('temporaryPath/userinfo.hive').delete(); + File('temporaryPath/userinfo.lock').delete(); + }); + + test('Test hashCode', () { + final userAdapter = UserAdapter(); + + final int hashCode = userAdapter.hashCode; + expect(userAdapter.hashCode, hashCode); + }); + + test('Test ==', () { + final userAdapter1 = UserAdapter(); + final userAdapter2 = UserAdapter(); + + expect(userAdapter1 == userAdapter2, true); + }); + }); +} diff --git a/test/plugins/fetch_plugin_list_test.dart b/test/plugins/fetch_plugin_list_test.dart new file mode 100644 index 000000000..f8dc27d93 --- /dev/null +++ b/test/plugins/fetch_plugin_list_test.dart @@ -0,0 +1,86 @@ +import 'dart:io'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:hive/hive.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/plugins/fetch_plugin_list.dart'; +import 'package:talawa/services/graphql_config.dart'; + +import '../helpers/test_helpers.dart'; +import '../helpers/test_locator.dart'; + +/// Tests fetch_plugin_list.dart. +/// +/// more_info_if_required +/// +/// **params**: +/// None +/// +/// **returns**: +/// None +void main() async { + testSetupLocator(); + locator().test(); + late FetchPluginList fetchPluginList; + + final Directory dir = await Directory.systemTemp.createTemp('talawa_test'); + Hive.init(dir.path); + await Hive.openBox('pluginBox'); + + setUp(() { + registerServices(); + locator.allowReassignment = true; + + locator.registerLazySingleton(() => FetchPluginList()); + fetchPluginList = locator(); + }); + group('FetchPluginList', () { + test('fetchList should fetch plugins and store them in Hive', () async { + final queryResult = QueryResult( + data: { + 'getPlugins': [ + { + '_id': '1', + 'pluginName': 'Plugin 1', + 'pluginCreatedBy': 'User A', + 'pluginDesc': 'Description A', + 'pluginInstallStatus': true, + 'installedOrgs': ['Org A'], + }, + ], + }, + options: QueryOptions( + document: gql(queries.getPluginsList()), + ), + source: QueryResultSource.network, + ); + + when(locator().clientToQuery()).thenAnswer( + (_) => locator(), + ); + when( + locator().query( + QueryOptions( + document: gql(queries.getPluginsList()), + ), + ), + ).thenAnswer((_) async => queryResult); + await fetchPluginList.fetchList(); + + verify(locator().clientToQuery()).called(2); + verify( + locator().query( + QueryOptions( + document: gql(queries.getPluginsList()), + ), + ), + ).called(2); + + expect(fetchPluginList.box, isNotNull); + expect( + fetchPluginList.box.get('plugins'), + equals(queryResult.data!["getPlugins"]), + ); + }); + }); +} diff --git a/test/plugins/talawa_plugin_provider_test.dart b/test/plugins/talawa_plugin_provider_test.dart new file mode 100644 index 000000000..940dd09c1 --- /dev/null +++ b/test/plugins/talawa_plugin_provider_test.dart @@ -0,0 +1,246 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:hive/hive.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/plugins/talawa_plugin_provider.dart'; + +import '../helpers/test_helpers.dart'; +import '../helpers/test_locator.dart'; + +/// Test for talawa_plugin_provider_test.dart. +/// +/// more_info_if_required +/// +/// **params**: +/// None +/// +/// **returns**: +/// None +void main() { + testSetupLocator(); + TestWidgetsFlutterBinding.ensureInitialized(); + late Box box; + + final OrgInfo org = OrgInfo( + id: 'org1', + name: 'test org 3', + ); + + setUpAll(() async { + registerServices(); + final Directory dir = await Directory.systemTemp.createTemp('talawa_test'); + Hive.init(dir.path); + box = await Hive.openBox('pluginBox'); + }); + + tearDownAll(() { + unregisterServices(); + box.close(); + Hive.deleteBoxFromDisk('pluginBox'); + Hive.close(); + }); + + group('TalawaPluginProvider Tests', () { + testWidgets('Widget displays child when visible and plugins are installed', + (WidgetTester tester) async { + box.put( + 'plugins', + [ + { + '_id': '1', + 'pluginName': 'Plugin 1', + 'pluginCreatedBy': 'User A', + 'pluginDesc': 'Description A', + 'pluginInstallStatus': true, + 'installedOrgs': ['org1'], + }, + ], + ); + + when(userConfig.currentOrg).thenReturn(org); + + await tester.pumpWidget( + const MaterialApp( + home: TalawaPluginProvider( + visible: true, + pluginName: 'Plugin 1', + child: Text('Test Plugin'), + ), + ), + ); + + expect(find.text('Test Plugin'), findsOneWidget); + }); + + testWidgets( + 'Widget hides child when not visible and plugins are not installed also plugin not installed in org', + (WidgetTester tester) async { + box.put( + 'plugins', + [ + { + '_id': '1', + 'pluginName': 'Plugin 1', + 'pluginCreatedBy': 'User A', + 'pluginDesc': 'Description A', + 'pluginInstallStatus': false, + 'installedOrgs': ['org2'], + }, + ], + ); + + when(userConfig.currentOrg).thenReturn(org); + await tester.pumpWidget( + const MaterialApp( + home: TalawaPluginProvider( + visible: false, + pluginName: 'Plugin 1', + child: Text('Test Plugin'), + ), + ), + ); + + expect(find.text('Test Plugin'), findsNothing); + }); + testWidgets( + 'Widget displays child when not visible and plugins are installed', + (WidgetTester tester) async { + box.put( + 'plugins', + [ + { + '_id': '1', + 'pluginName': 'Plugin 1', + 'pluginCreatedBy': 'User A', + 'pluginDesc': 'Description A', + 'pluginInstallStatus': true, + 'installedOrgs': ['org1'], + }, + ], + ); + + when(userConfig.currentOrg).thenReturn(org); + await tester.pumpWidget( + const MaterialApp( + home: TalawaPluginProvider( + visible: false, + pluginName: 'Plugin 1', + child: Text('Test Plugin'), + ), + ), + ); + + expect(find.text('Test Plugin'), findsOneWidget); + }); + testWidgets( + 'Widget displays child when not visible but plugin is already installed in that org', + (WidgetTester tester) async { + box.put( + 'plugins', + [ + { + '_id': '1', + 'pluginName': 'Plugin 1', + 'pluginCreatedBy': 'User A', + 'pluginDesc': 'Description A', + 'pluginInstallStatus': false, + 'installedOrgs': ['org1'], + }, + ], + ); + + when(userConfig.currentOrg).thenReturn(org); + await tester.pumpWidget( + const MaterialApp( + home: TalawaPluginProvider( + visible: false, + pluginName: 'Plugin 1', + child: Text('Test Plugin'), + ), + ), + ); + + expect(find.text('Test Plugin'), findsOneWidget); + }); + testWidgets( + 'Widget displays child when visible but plugins are not installed', + (WidgetTester tester) async { + box.put( + 'plugins', + [ + { + '_id': '1', + 'pluginName': 'Plugin 1', + 'pluginCreatedBy': 'User A', + 'pluginDesc': 'Description A', + 'pluginInstallStatus': false, + 'installedOrgs': ['org1'], + }, + ], + ); + + when(userConfig.currentOrg).thenReturn(org); + await tester.pumpWidget( + const MaterialApp( + home: TalawaPluginProvider( + visible: true, + pluginName: 'Plugin 1', + child: Text('Test Plugin'), + ), + ), + ); + + expect(find.text('Test Plugin'), findsOneWidget); + }); + testWidgets('Widget hides child when not visible and plugins is null', + (WidgetTester tester) async { + box.put('plugins', null); + + when(userConfig.currentOrg).thenReturn(org); + await tester.pumpWidget( + const MaterialApp( + home: TalawaPluginProvider( + visible: false, + pluginName: 'Plugin 1', + child: Text('Test Plugin'), + ), + ), + ); + + expect(find.text('Test Plugin'), findsNothing); + }); + testWidgets( + 'Widget hides child when not visible and Current Organization is Not Set ', + (WidgetTester tester) async { + box.put( + 'plugins', + [ + { + '_id': '1', + 'pluginName': 'Plugin 1', + 'pluginCreatedBy': 'User A', + 'pluginDesc': 'Description A', + 'pluginInstallStatus': false, + 'installedOrgs': [''], + }, + ], + ); + + when(userConfig.currentOrg).thenReturn(org); + await tester.pumpWidget( + const MaterialApp( + home: TalawaPluginProvider( + visible: false, + pluginName: 'Plugin 1', + child: Text('Test Plugin'), + ), + ), + ); + + expect(find.text('Test Plugin'), findsNothing); + }, + ); + }); +} diff --git a/test/router_test.dart b/test/router_test.dart new file mode 100644 index 000000000..748f8fa9f --- /dev/null +++ b/test/router_test.dart @@ -0,0 +1,408 @@ +// ignore_for_file: talawa_api_doc + +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/main.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/models/mainscreen_navigation_args.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/router.dart'; +import 'package:talawa/splash_screen.dart'; +import 'package:talawa/view_model/after_auth_view_models/chat_view_models/direct_chat_view_model.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/add_post_page.dart'; +import 'package:talawa/views/after_auth_screens/app_settings/app_settings_page.dart'; +import 'package:talawa/views/after_auth_screens/chat/chat_message_screen.dart'; +import 'package:talawa/views/after_auth_screens/chat/select_contact.dart'; +import 'package:talawa/views/after_auth_screens/events/create_custom_recurring_event.dart'; +import 'package:talawa/views/after_auth_screens/events/create_event_page.dart'; +import 'package:talawa/views/after_auth_screens/events/edit_event_page.dart'; +import 'package:talawa/views/after_auth_screens/events/event_calendar.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_org_after_auth/access_request_screen.dart'; +import 'package:talawa/views/after_auth_screens/join_org_after_auth/join_organisation_after_auth.dart'; +import 'package:talawa/views/after_auth_screens/org_info_screen.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/demo_screens/explore_events_demo.dart'; +import 'package:talawa/views/demo_screens/organization_feed_demo.dart'; +import 'package:talawa/views/demo_screens/profile_page_demo.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/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/waiting_screen.dart'; + +class MockBuildContext extends Mock implements BuildContext {} + +void main() { + setupLocator(); + + group('Tests for router', () { + testWidgets('Test SplashScreen route', (WidgetTester tester) async { + final route = generateRoute( + const RouteSettings(name: Routes.splashScreen, arguments: 0), + ); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test SelectLanguage route', (WidgetTester tester) async { + final route = generateRoute( + const RouteSettings(name: Routes.languageSelectionRoute), + ); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test SelectOrganization route', (WidgetTester tester) async { + const orgId = 'exampleOrgId'; // Provide an example organization ID + final route = generateRoute( + const RouteSettings(name: Routes.selectOrgScreen, arguments: orgId), + ); + expect(route, isA()); + if (route is CupertinoPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + final selectOrganizationWidget = widget as SelectOrganization; + expect(selectOrganizationWidget.selectedOrgId, orgId); + } + }); + + testWidgets('Test WaitingPage route', (WidgetTester tester) async { + final route = generateRoute( + const RouteSettings(name: Routes.waitingScreen, arguments: 0), + ); + expect(route, isA()); + if (route is CupertinoPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test ChangePass route', (WidgetTester tester) async { + final route = generateRoute( + const RouteSettings(name: Routes.updateScreen, arguments: 0), + ); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test OrganizationFeed route', (WidgetTester tester) async { + final route = generateRoute( + const RouteSettings(name: Routes.homeScreen, arguments: 0), + ); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test MainScreen route', (WidgetTester tester) async { + final mainScreenArgs = MainScreenArgs(mainScreenIndex: 1); + + final route = generateRoute( + RouteSettings(name: Routes.mainScreen, arguments: mainScreenArgs), + ); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test IndividualPostView route', (WidgetTester tester) async { + final post = Post(sId: "testId", creator: User()); + + final route = generateRoute( + RouteSettings(name: Routes.individualPost, arguments: post), + ); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test PinnedPostPage route', (WidgetTester tester) async { + final List pinnedPosts = [Post(sId: "testId", creator: User())]; + + final route = generateRoute( + RouteSettings(name: Routes.pinnedPostPage, arguments: pinnedPosts), + ); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test ExploreEvents route', (WidgetTester tester) async { + final route = + generateRoute(const RouteSettings(name: Routes.exploreEventsScreen)); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test CreateEventPage route', (WidgetTester tester) async { + final route = + generateRoute(const RouteSettings(name: Routes.createEventPage)); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test createCustomRecurringEvent route', + (WidgetTester tester) async { + final route = generateRoute( + RouteSettings( + name: Routes.customRecurrencePage, + arguments: CreateEventViewModel(), + ), + ); + expect( + route, + isA(), + ); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test ProfilePage route', (WidgetTester tester) async { + final route = + generateRoute(const RouteSettings(name: Routes.profilePage)); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test EditProfilePage route', (WidgetTester tester) async { + final route = + generateRoute(const RouteSettings(name: Routes.editProfilePage)); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test JoinOrganisationAfterAuth route', + (WidgetTester tester) async { + const orgId = 'orgId'; + final route = generateRoute( + const RouteSettings(name: Routes.joinOrg, arguments: orgId), + ); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test for requestAccess route', (WidgetTester tester) async { + final OrgInfo orgInfo = OrgInfo(); + final route = generateRoute( + RouteSettings(name: Routes.requestAccess, arguments: orgInfo), + ); + expect(route, isA()); + if (route is CupertinoPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test for editEventPage route', (WidgetTester tester) async { + final Event event = Event(); + final route = generateRoute( + RouteSettings(name: Routes.editEventPage, arguments: event), + ); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test AppSettingsPage route', (WidgetTester tester) async { + final route = generateRoute( + const RouteSettings(name: Routes.appSettings, arguments: 0), + ); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test for chatMessageScreen route', + (WidgetTester tester) async { + final List arguments = [ + 'ChatId', + DirectChatViewModel(), + ]; + final route = generateRoute( + RouteSettings(name: Routes.chatMessageScreen, arguments: arguments), + ); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test for calendar route', (WidgetTester tester) async { + final List events = [ + Event(), + ]; + final route = generateRoute( + RouteSettings(name: Routes.calendar, arguments: events), + ); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test for selectContact route', (WidgetTester tester) async { + final route = + generateRoute(const RouteSettings(name: Routes.selectContact)); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test for addPostpage route', (WidgetTester tester) async { + final route = + generateRoute(const RouteSettings(name: Routes.addPostScreen)); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test for setUrl route', (WidgetTester tester) async { + final route = generateRoute( + const RouteSettings(name: Routes.setUrlScreen, arguments: ''), + ); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test for demoProfilePage route', (WidgetTester tester) async { + final route = + generateRoute(const RouteSettings(name: Routes.demoProfilePage)); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test for demoExploreEventsScreen route', + (WidgetTester tester) async { + final route = generateRoute( + const RouteSettings(name: Routes.demoExploreEventsScreen), + ); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test for demoHomeScreen route', (WidgetTester tester) async { + final route = + generateRoute(const RouteSettings(name: Routes.demoHomeScreen)); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test for default DemoPage route', (WidgetTester tester) async { + final route = generateRoute(const RouteSettings(name: 'default')); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + + testWidgets('Test for default orgInfoScreen route', + (WidgetTester tester) async { + final route = generateRoute( + RouteSettings(name: Routes.orgInfoScreen, arguments: OrgInfo()), + ); + expect(route, isA()); + if (route is MaterialPageRoute) { + final builder = route.builder; + final widget = builder(MockBuildContext()); + expect(widget, isA()); + } + }); + }); +} diff --git a/test/service_tests/chat_service_test.dart b/test/service_tests/chat_service_test.dart new file mode 100644 index 000000000..cd6da0d8d --- /dev/null +++ b/test/service_tests/chat_service_test.dart @@ -0,0 +1,105 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/chat_service.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/utils/chat_queries.dart'; +import '../helpers/test_helpers.dart'; + +void main() { + setUp(() { + registerServices(); + }); + group('Test ChatService', () { + test('Test SendMessageToDirectChat Method', () async { + final dataBaseMutationFunctions = locator(); + const id = "1"; + const messageContent = "test"; + + final query = ChatQueries().sendMessageToDirectChat(); + when( + dataBaseMutationFunctions.gqlAuthMutation( + query, + variables: { + "chatId": id, + "messageContent": messageContent, + }, + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: { + 'sendMessageToDirectChat': { + '_id': id, + 'messageContent': messageContent, + 'sender': { + 'firstName': 'Mohamed', + }, + 'receiver': { + 'firstName': 'Ali', + }, + }, + }, + source: QueryResultSource.network, + ), + ); + final service = ChatService(); + await service.sendMessageToDirectChat( + id, + messageContent, + ); + }); + test('getDirectChatsByUserId Method', () async { + final dataBaseMutationFunctions = locator(); + const userId = "xzy1"; + final query = ChatQueries().fetchDirectChatsByUserId(userId); + // when(locator()).thenAnswer((_) => UserConfig()); + when(dataBaseMutationFunctions.gqlAuthQuery(query)).thenAnswer( + (_) async => QueryResult( + options: QueryOptions( + document: gql(query), + ), + data: { + 'directChatsByUserID': [ + { + 'users': [], + '_id': 'xzy1', + } + ], + }, + source: QueryResultSource.network, + ), + ); + final service = ChatService(); + await service.getDirectChatsByUserId(); + }); + test("getDirectChatMessagesByChatId Method", () async { + final dataBaseMutationFunctions = locator(); + const chatId = 'test'; + final query = ChatQueries().fetchDirectChatMessagesByChatId(chatId); + when(dataBaseMutationFunctions.gqlAuthQuery(query)).thenAnswer( + (_) async => QueryResult( + options: QueryOptions( + document: gql(query), + ), + data: { + 'directChatsMessagesByChatID': [ + { + '_id': 'test', + 'messageContent': 'test', + } + ], + }, + source: QueryResultSource.network, + ), + ); + + final service = ChatService(); + await service.getDirectChatMessagesByChatId(chatId); + }); + }); +} diff --git a/test/service_tests/comment_service_test.dart b/test/service_tests/comment_service_test.dart new file mode 100644 index 000000000..4a8af5695 --- /dev/null +++ b/test/service_tests/comment_service_test.dart @@ -0,0 +1,373 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/comment_service.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/utils/comment_queries.dart'; +import '../helpers/test_helpers.dart'; + +void main() { + setUp(() { + registerServices(); + }); + group('test for comment servicce', () { + test('test for createComments', () async { + final dataBaseMutationFunctions = locator(); + + final query = CommentQueries().createComment(); + when( + dataBaseMutationFunctions.gqlAuthMutation( + query, + variables: { + 'postId': 'ayush post', //Add your variables here + 'text': 'hey Ayush here!', + }, + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: { + 'text': 'hey Ayush here!', + 'postId': 'ayush post', + }, + source: QueryResultSource.network, + ), + ); + + final service = CommentService(); + + await service.createComments( + 'ayush post', + 'hey Ayush here!', + ); + }); + test('test for createComments when throws exception', () async { + final dataBaseMutationFunctions = locator(); + + final query = CommentQueries().createComment(); + when( + dataBaseMutationFunctions.gqlAuthMutation( + query, + variables: { + 'postId': 'ayush post', + 'text': 'hey Ayush here!', + }, + ), + ).thenThrow(Exception('Your error message here')); + + final service = CommentService(); + + await service.createComments( + 'ayush post', + 'hey Ayush here!', + ); + + verify( + navigationService.showTalawaErrorSnackBar( + "Something went wrong", + MessageType.error, + ), + ).called(1); + }); + test('test for getCommentsForPost', () async { + final dataBaseMutationFunctions = locator(); + final String getCommmentQuery = + CommentQueries().getPostsComments('Ayush s postid'); + + when( + dataBaseMutationFunctions.gqlAuthMutation(getCommmentQuery), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(getCommmentQuery)), + data: { + 'post': { + 'comments': [ + { + 'creator': { + '_id': '123', + 'firstName': 'John', + 'lastName': 'Doe', + 'email': 'test@test.com', + }, + 'createdAt': '123456', + 'text': 'test text', + 'post': 'test post', + 'likeCount': 'test count', + }, + { + 'creator': { + '_id': '123', + 'firstName': 'Ayush', + 'lastName': 'Doe', + 'email': 'test@test.com', + }, + 'createdAt': '123456', + 'text': 'test text', + 'post': 'test post', + 'likeCount': 'test count', + }, + { + 'creator': { + '_id': '123', + 'firstName': 'john', + 'lastName': 'chauhdary', + 'email': 'test@test.com', + }, + 'createdAt': '123456', + 'text': 'test text', + 'post': 'test post', + 'likeCount': 'test count', + } + ], + }, + }, + source: QueryResultSource.network, + ), + ); + + final service = CommentService(); + final result = await service.getCommentsForPost('Ayush s postid'); + + if (result.toString().contains('[{creator: ' + '{' + '_id: 123, ' + 'firstName: John, ' + 'lastName: Doe, ' + 'email: test@test.com},' + ' createdAt: 123456, ' + 'text: test text, ' + 'post: test post, ' + 'likeCount: test count}, ' + '{creator: ' + '{_id: 123, ' + 'firstName: Ayush, ' + 'lastName: Doe, ' + 'email: test@test.com}, ' + 'createdAt: 123456, ' + 'text: test text, ' + 'post: test post, ' + 'likeCount: test count}, ' + '{creator: {_id: 123,' + ' firstName: john, ' + 'lastName: chauhdary, ' + 'email: test@test.com}, ' + 'createdAt: 123456, ' + 'text: test text, ' + 'post: test post, ' + 'likeCount: test count}]')) { + } else { + fail('the result is not maatching'); + } + expect(result, isNotEmpty); + }); + test('test for getCommentsForPost for wrong post idd', () async { + final dataBaseMutationFunctions = locator(); + + final String getCommmentQuery = + CommentQueries().getPostsComments('Ayush s postid'); + when( + dataBaseMutationFunctions.gqlAuthMutation(getCommmentQuery), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(getCommmentQuery)), + data: { + 'post': { + 'comments': [], + }, + }, + source: QueryResultSource.network, + ), + ); + + final service = CommentService(); + final result = await service.getCommentsForPost('Ayush postid'); + + if (result.toString().contains('[{creator: ' + '{' + '_id: 123, ' + 'firstName: John, ' + 'lastName: Doe, ' + 'email: test@test.com},' + ' createdAt: 123456, ' + 'text: test text, ' + 'post: test post, ' + 'likeCount: test count}, ' + '{creator: ' + '{_id: 123, ' + 'firstName: Ayush, ' + 'lastName: Doe, ' + 'email: test@test.com}, ' + 'createdAt: 123456, ' + 'text: test text, ' + 'post: test post, ' + 'likeCount: test count}, ' + '{creator: {_id: 123,' + ' firstName: john, ' + 'lastName: chauhdary, ' + 'email: test@test.com}, ' + 'createdAt: 123456, ' + 'text: test text, ' + 'post: test post, ' + 'likeCount: test count}]')) { + fail('the result is not maatching'); + } + expect(result, isEmpty); + }); + + test('test for zero comments on post', () async { + final dataBaseMutationFunctions = locator(); + + final String getCommmentQuery = + CommentQueries().getPostsComments('Ayush s postid'); + when( + dataBaseMutationFunctions.gqlAuthMutation(getCommmentQuery), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(getCommmentQuery)), + data: { + 'post': {'comments': []}, + }, + source: QueryResultSource.network, + ), + ); + + final service = CommentService(); + final result = await service.getCommentsForPost('Ayush postid'); + + if (result.toString().contains('[{creator: ' + '{' + '_id: 123, ' + 'firstName: John, ' + 'lastName: Doe, ' + 'email: test@test.com},' + ' createdAt: 123456, ' + 'text: test text, ' + 'post: test post, ' + 'likeCount: test count}, ' + '{creator: ' + '{_id: 123, ' + 'firstName: Ayush, ' + 'lastName: Doe, ' + 'email: test@test.com}, ' + 'createdAt: 123456, ' + 'text: test text, ' + 'post: test post, ' + 'likeCount: test count}, ' + '{creator: {_id: 123,' + ' firstName: john, ' + 'lastName: chauhdary, ' + 'email: test@test.com}, ' + 'createdAt: 123456, ' + 'text: test text, ' + 'post: test post, ' + 'likeCount: test count}]')) { + fail('the result is not maatching'); + } + expect(result, isEmpty); + }); + + test('test when post is null', () async { + final dataBaseMutationFunctions = locator(); + + final String getCommmentQuery = + CommentQueries().getPostsComments('Ayush s postid'); + when( + dataBaseMutationFunctions.gqlAuthMutation(getCommmentQuery), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(getCommmentQuery)), + data: { + 'post': null, + }, + source: QueryResultSource.network, + ), + ); + + final service = CommentService(); + final result = await service.getCommentsForPost('Ayush postid'); + + if (result.toString().contains('[{creator: ' + '{' + '_id: 123, ' + 'firstName: John, ' + 'lastName: Doe, ' + 'email: test@test.com},' + ' createdAt: 123456, ' + 'text: test text, ' + 'post: test post, ' + 'likeCount: test count}, ' + '{creator: ' + '{_id: 123, ' + 'firstName: Ayush, ' + 'lastName: Doe, ' + 'email: test@test.com}, ' + 'createdAt: 123456, ' + 'text: test text, ' + 'post: test post, ' + 'likeCount: test count}, ' + '{creator: {_id: 123,' + ' firstName: john, ' + 'lastName: chauhdary, ' + 'email: test@test.com}, ' + 'createdAt: 123456, ' + 'text: test text, ' + 'post: test post, ' + 'likeCount: test count}]')) { + fail('the result is not maatching'); + } + expect(result, isEmpty); + }); + + test('test when result is null', () async { + final dataBaseMutationFunctions = locator(); + + final String getCommmentQuery = + CommentQueries().getPostsComments('Ayush s postid'); + when( + dataBaseMutationFunctions.gqlAuthMutation(getCommmentQuery), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(getCommmentQuery)), + data: null, + source: QueryResultSource.network, + ), + ); + + final service = CommentService(); + final result = await service.getCommentsForPost('Ayush postid'); + + if (result.toString().contains('[{creator: ' + '{' + '_id: 123, ' + 'firstName: John, ' + 'lastName: Doe, ' + 'email: test@test.com},' + ' createdAt: 123456, ' + 'text: test text, ' + 'post: test post, ' + 'likeCount: test count}, ' + '{creator: ' + '{_id: 123, ' + 'firstName: Ayush, ' + 'lastName: Doe, ' + 'email: test@test.com}, ' + 'createdAt: 123456, ' + 'text: test text, ' + 'post: test post, ' + 'likeCount: test count}, ' + '{creator: {_id: 123,' + ' firstName: john, ' + 'lastName: chauhdary, ' + 'email: test@test.com}, ' + 'createdAt: 123456, ' + 'text: test text, ' + 'post: test post, ' + 'likeCount: test count}]')) { + fail('the result is not maatching'); + } + expect(result, isEmpty); + }); + }); +} diff --git a/test/service_tests/database_mutations_function_test.dart b/test/service_tests/database_mutations_function_test.dart new file mode 100644 index 000000000..061924ee3 --- /dev/null +++ b/test/service_tests/database_mutations_function_test.dart @@ -0,0 +1,1080 @@ +import 'dart:io'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:hive/hive.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/services/graphql_config.dart'; +import 'package:talawa/utils/queries.dart'; +import '../helpers/test_helpers.dart'; +import '../helpers/test_locator.dart'; + +/// Tests database_mutations_functions.dart. +/// +/// more_info_if_required +/// +/// **params**: +/// None +/// +/// **returns**: +/// None +void main() async { + testSetupLocator(); + locator().test(); + late DataBaseMutationFunctions functionsClass; + final Directory dir = await Directory.systemTemp.createTemp('talawa_test'); + Hive.init(dir.path); + await Hive.openBox('url'); + + const userNotAuthenticated = + GraphQLError(message: 'User is not authenticated'); + + const userNotAuthenticatedrand = + GraphQLError(message: 'User is not authenticatedrand'); + const userNotFound = GraphQLError(message: 'User not found'); + const refreshAccessTokenExpiredException = GraphQLError( + message: + 'Access Token has expired. Please refresh session.: Undefined location', + ); + + const wrongCredentials = GraphQLError(message: 'Invalid credentials'); + + const organizationNotFound = GraphQLError(message: 'Organization not found'); + + const memberRequestExist = + GraphQLError(message: 'Membership Request already exists'); + + const notifFeatureNotInstalled = GraphQLError( + message: + 'Failed to determine project ID: Error while making request: getaddrinfo ENOTFOUND metadata.google.internal. Error code: ENOTFOUND', + ); + + const emailAccountPresent = + GraphQLError(message: 'Email address already exists'); + + final testOrg = OrgInfo.fromJson({ + 'image': 'sampleimg', + 'id': 'XYZ', + 'name': 'Sample1', + 'userRegistrationRequired': false, + 'creator': {'firstName': 'Shivam', 'lastName': 'Gupta'}, + }); + + setUpAll(() { + registerServices(); + functionsClass = DataBaseMutationFunctions(); + functionsClass.init(); + functionsClass.initClientNonAuth(); + }); + + group('Database Mutation Functions Tests', () { + testWidgets('Widget Testing 1', (tester) async { + final String query = Queries().fetchOrgDetailsById('XYZ'); + + when(locator().query(QueryOptions(document: gql(query)))) + .thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + exception: OperationException( + graphqlErrors: [userNotAuthenticated], + linkException: UnknownException( + userNotAuthenticated, + StackTrace.current, + ), + ), + source: QueryResultSource.network, + ), + ); + + await functionsClass.gqlNonAuthQuery(query); + + tester.binding.addPostFrameCallback((_) { + navigationService.showTalawaErrorSnackBar( + "Server not running/wrong url", + MessageType.error, + ); + }); + + await tester.pump(); + }); + + testWidgets('Widget Testing 2', (tester) async { + final String query = Queries().fetchOrgDetailsById('XYZ'); + + when(locator().query(QueryOptions(document: gql(query)))) + .thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + exception: OperationException( + graphqlErrors: [userNotAuthenticatedrand], + ), + source: QueryResultSource.network, + ), + ); + + await functionsClass.gqlNonAuthQuery(query); + + tester.binding.addPostFrameCallback((_) { + navigationService.showTalawaErrorSnackBar( + "Something went wrong!", + MessageType.error, + ); + }); + + await tester.pump(); + }); + + test('fetchOrgById test in case of successful results', () async { + when(locator().clientToQuery()).thenAnswer( + (_) => locator(), + ); + + when( + locator().mutate( + MutationOptions( + document: gql(queries.fetchOrgById('XYZ')), + ), + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(queries.fetchOrgById('XYZ'))), + data: { + 'organizations': [ + { + 'id': 'XYZ', + 'image': 'sampleimg', + 'name': 'Sample1', + 'userRegistrationRequired': false, + 'creator': {'firstName': 'Shivam', 'lastName': 'Gupta'}, + }, + ], + }, + source: QueryResultSource.network, + ), + ); + + final org = await functionsClass.fetchOrgById('XYZ') as OrgInfo; + + expect(org.id, testOrg.id); + expect(org.name, testOrg.name); + expect(org.image, testOrg.image); + expect(org.userRegistrationRequired, testOrg.userRegistrationRequired); + expect(org.creatorInfo!.firstName, testOrg.creatorInfo!.firstName); + }); + + test('fetchOrgById test in case of exception', () async { + final String query = Queries().fetchOrgById('XYZ'); + final String query2 = Queries().refreshToken('abc'); + final String query3 = Queries().refreshToken('xyz'); + + userConfig.currentUser.refreshToken = 'abc'; + + /// Returns the exception to be thrown in case of refresh token expired + /// + /// more_info_if_required + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Map`: Map of exception to be thrown + Map exp2() { + if (userConfig.currentUser.refreshToken == 'abc') { + userConfig.currentUser.refreshToken = 'xyz'; + return Map.from({ + 'val': OperationException( + graphqlErrors: [userNotAuthenticated], + ), + }); + } else { + return Map.from({ + 'val': OperationException( + graphqlErrors: [userNotFound], + ), + }); + } + } + + when( + locator().mutate( + MutationOptions(document: gql(query)), + ), + ).thenAnswer( + (_) async => QueryResult( + options: MutationOptions(document: gql(query)), + exception: exp2()['val'], + source: QueryResultSource.network, + ), + ); + + when( + locator().mutate(MutationOptions(document: gql(query2))), + ).thenAnswer( + (_) async => QueryResult( + options: MutationOptions(document: gql(query2)), + data: { + 'refreshToken': { + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, + }, + source: QueryResultSource.network, + ), + ); + + when( + locator().mutate(MutationOptions(document: gql(query3))), + ).thenAnswer( + (_) async => QueryResult( + options: MutationOptions(document: gql(query3)), + data: { + 'refreshToken': { + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, + }, + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.fetchOrgById('XYZ'); + expect(res, false); + }); + + test('Testing wrong credential error', () async { + when(locator().clientToQuery()).thenAnswer( + (_) => locator(), + ); + + when( + locator().mutate( + MutationOptions( + document: gql( + queries.fetchOrgById('XYZ'), + ), + ), + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(queries.fetchOrgById('XYZ'))), + exception: OperationException(graphqlErrors: [wrongCredentials]), + source: QueryResultSource.network, + ), + ); + + final org = await functionsClass.fetchOrgById('XYZ'); + expect(org, false); + }); + + test('Testing organization not found error', () async { + when(locator().clientToQuery()).thenAnswer( + (_) => locator(), + ); + + when( + locator().mutate( + MutationOptions( + document: gql( + queries.fetchOrgById('XYZ'), + ), + ), + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(queries.fetchOrgById('XYZ'))), + exception: OperationException(graphqlErrors: [organizationNotFound]), + source: QueryResultSource.network, + ), + ); + + final org = await functionsClass.fetchOrgById('XYZ'); + expect(org, false); + }); + + test('Testing memberRequestExist error', () async { + when(locator().clientToQuery()).thenAnswer( + (_) => locator(), + ); + + when( + locator().mutate( + MutationOptions( + document: gql(queries.fetchOrgById('XYZ')), + ), + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(queries.fetchOrgById('XYZ'))), + exception: OperationException(graphqlErrors: [memberRequestExist]), + source: QueryResultSource.network, + ), + ); + + final org = await functionsClass.fetchOrgById('XYZ'); + expect(org, false); + }); + + test('Testing emailAccountPresent error', () async { + when(locator().clientToQuery()).thenAnswer( + (_) => locator(), + ); + + when( + locator().mutate( + MutationOptions(document: gql(queries.fetchOrgById('XYZ'))), + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(queries.fetchOrgById('XYZ'))), + exception: OperationException( + graphqlErrors: [emailAccountPresent], + ), + source: QueryResultSource.network, + ), + ); + + final org = await functionsClass.fetchOrgById('XYZ'); + expect(org, false); + }); + + test('Testing notifFeatureNotInstalled error', () async { + when(locator().clientToQuery()).thenAnswer( + (_) => locator(), + ); + + when( + locator().mutate( + MutationOptions(document: gql(queries.fetchOrgById('XYZ'))), + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(queries.fetchOrgById('XYZ'))), + exception: OperationException( + graphqlErrors: [notifFeatureNotInstalled], + ), + source: QueryResultSource.network, + ), + ); + + final org = await functionsClass.fetchOrgById('XYZ'); + expect(org, false); + }); + + test('Testing gqlAuthQuery function without exception', () async { + final String query = Queries().fetchOrgDetailsById('XYZ'); + + when(locator().query(QueryOptions(document: gql(query)))) + .thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: { + 'organizations': [ + { + 'id': 'XYZ', + 'image': 'sampleimg', + 'name': 'Sample1', + 'userRegistrationRequired': false, + 'creator': {'firstName': 'Shivam', 'lastName': 'Gupta'}, + }, + ], + }, + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.gqlAuthQuery(query) as QueryResult; + final org = OrgInfo.fromJson( + (res.data!['organizations'] as List>)[0], + ); + + expect(org.id, testOrg.id); + expect(org.name, testOrg.name); + expect(org.image, testOrg.image); + expect(org.userRegistrationRequired, testOrg.userRegistrationRequired); + expect(org.creatorInfo!.firstName, testOrg.creatorInfo!.firstName); + }); + + test('Testing gqlAuthQuery with false exception', () async { + final String query = Queries().fetchOrgDetailsById('XYZ'); + + when(locator().query(QueryOptions(document: gql(query)))) + .thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + exception: OperationException(graphqlErrors: [userNotFound]), + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.gqlAuthQuery(query); + expect(res, null); + }); + + test('Testing gqlAuthQuery with true exception', () async { + final String query = Queries().fetchOrgDetailsById('XYZ'); + final String query2 = Queries().refreshToken('abc'); + final String query3 = Queries().refreshToken('xyz'); + + userConfig.currentUser.refreshToken = 'abc'; + + /// Returns the exception to be thrown in case of refresh token expired + /// + /// more_info_if_required + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Map`: Map of exception to be thrown + Map exp2() { + if (userConfig.currentUser.refreshToken == 'abc') { + userConfig.currentUser.refreshToken = 'xyz'; + return Map.from({ + 'val': OperationException( + graphqlErrors: [userNotAuthenticated], + ), + }); + } else { + return Map.from({ + 'val': OperationException( + graphqlErrors: [userNotFound], + ), + }); + } + } + + when(locator().query(QueryOptions(document: gql(query)))) + .thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + exception: exp2()['val'], + source: QueryResultSource.network, + ), + ); + + when( + locator().mutate(MutationOptions(document: gql(query2))), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query2)), + data: { + 'refreshToken': { + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, + }, + source: QueryResultSource.network, + ), + ); + + when( + locator().mutate(MutationOptions(document: gql(query3))), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query3)), + data: { + 'refreshToken': { + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, + }, + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.gqlAuthQuery(query); + expect(res, null); + }); + + test('Test for gql auth mutation', () async { + final String query = Queries().fetchOrgDetailsById('XYZ'); + + when( + locator().mutate(MutationOptions(document: gql(query))), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: { + 'organizations': [ + { + 'id': 'XYZ', + 'image': 'sampleimg', + 'name': 'Sample1', + 'userRegistrationRequired': false, + 'creator': {'firstName': 'Shivam', 'lastName': 'Gupta'}, + }, + ], + }, + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.gqlAuthMutation(query) as QueryResult; + final org = OrgInfo.fromJson( + (res.data!['organizations'] as List>)[0], + ); + + expect(org.id, testOrg.id); + expect(org.name, testOrg.name); + expect(org.image, testOrg.image); + expect(org.userRegistrationRequired, testOrg.userRegistrationRequired); + expect(org.creatorInfo!.firstName, testOrg.creatorInfo!.firstName); + }); + + test('Test for gql auth mutation with false exception', () async { + final String query = Queries().fetchOrgDetailsById('XYZ'); + + when( + locator().mutate(MutationOptions(document: gql(query))), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + exception: OperationException(graphqlErrors: [userNotFound]), + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.gqlAuthMutation(query); + expect(res, null); + }); + + test('Test for gql auth mutation with true exception', () async { + final String query = Queries().fetchOrgDetailsById('XYZ'); + final String query2 = Queries().refreshToken('abc'); + final String query3 = Queries().refreshToken('xyz'); + + userConfig.currentUser.refreshToken = 'abc'; + + /// Returns the exception to be thrown in case of refresh token expired + /// + /// more_info_if_required + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Map`: Map of exception to be thrown + Map exp2() { + if (userConfig.currentUser.refreshToken == 'abc') { + userConfig.currentUser.refreshToken = 'xyz'; + return Map.from({ + 'val': OperationException( + graphqlErrors: [userNotAuthenticated], + ), + }); + } else { + return Map.from({ + 'val': OperationException( + graphqlErrors: [userNotFound], + ), + }); + } + } + + when( + locator().mutate(MutationOptions(document: gql(query))), + ).thenAnswer( + (_) async => QueryResult( + options: MutationOptions(document: gql(query)), + exception: exp2()['val'], + source: QueryResultSource.network, + ), + ); + + when( + locator().mutate(MutationOptions(document: gql(query2))), + ).thenAnswer( + (_) async => QueryResult( + options: MutationOptions(document: gql(query2)), + data: { + 'refreshToken': { + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, + }, + source: QueryResultSource.network, + ), + ); + + when( + locator().mutate(MutationOptions(document: gql(query3))), + ).thenAnswer( + (_) async => QueryResult( + options: MutationOptions(document: gql(query3)), + data: { + 'refreshToken': { + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, + }, + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.gqlAuthMutation(query); + expect(res, null); + }); + + test('Test for gql non auth query', () async { + final String query = Queries().fetchOrgDetailsById('XYZ'); + + when(locator().query(QueryOptions(document: gql(query)))) + .thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: { + 'organizations': [ + { + 'id': 'XYZ', + 'image': 'sampleimg', + 'name': 'Sample1', + 'userRegistrationRequired': false, + 'creator': {'firstName': 'Shivam', 'lastName': 'Gupta'}, + }, + ], + }, + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.gqlNonAuthQuery(query); + final org = OrgInfo.fromJson( + (res!.data!['organizations'] as List>)[0], + ); + + expect(org.id, testOrg.id); + expect(org.name, testOrg.name); + expect(org.image, testOrg.image); + expect(org.userRegistrationRequired, testOrg.userRegistrationRequired); + expect(org.creatorInfo!.firstName, testOrg.creatorInfo!.firstName); + }); + + test('Test for gql non auth mutation', () async { + final String query = Queries().fetchOrgDetailsById('XYZ'); + + when( + locator().mutate(MutationOptions(document: gql(query))), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: { + 'organizations': [ + { + 'id': 'XYZ', + 'image': 'sampleimg', + 'name': 'Sample1', + 'userRegistrationRequired': false, + 'creator': {'firstName': 'Shivam', 'lastName': 'Gupta'}, + }, + ], + }, + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.gqlNonAuthMutation(query) as QueryResult; + final org = OrgInfo.fromJson( + (res.data!['organizations'] as List>)[0], + ); + + expect(org.id, testOrg.id); + expect(org.name, testOrg.name); + expect(org.image, testOrg.image); + expect(org.userRegistrationRequired, testOrg.userRegistrationRequired); + expect(org.creatorInfo!.firstName, testOrg.creatorInfo!.firstName); + }); + + test('Test for gql non auth mutation with false exception', () async { + final String query = Queries().fetchOrgDetailsById('XYZ'); + + when( + locator().mutate(MutationOptions(document: gql(query))), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + exception: OperationException(graphqlErrors: [userNotFound]), + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.gqlNonAuthMutation(query); + expect(res, null); + }); + + test('Test for gql non auth mutation with true exception', () async { + final String query = Queries().fetchOrgDetailsById('XYZ'); + final String query2 = Queries().refreshToken('abc'); + final String query3 = Queries().refreshToken('xyz'); + + userConfig.currentUser.refreshToken = 'abc'; + + /// Returns the exception to be thrown in case of refresh token expired + /// + /// more_info_if_required + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Map`: Map of exception to be thrown + Map exp2() { + if (userConfig.currentUser.refreshToken == 'abc') { + userConfig.currentUser.refreshToken = 'xyz'; + return Map.from({ + 'val': OperationException( + graphqlErrors: [userNotAuthenticated], + ), + }); + } else { + return Map.from({ + 'val': OperationException( + graphqlErrors: [userNotFound], + ), + }); + } + } + + when( + locator().mutate(MutationOptions(document: gql(query))), + ).thenAnswer( + (_) async => QueryResult( + options: MutationOptions(document: gql(query)), + exception: exp2()['val'], + source: QueryResultSource.network, + ), + ); + + when( + locator().mutate(MutationOptions(document: gql(query2))), + ).thenAnswer( + (_) async => QueryResult( + options: MutationOptions(document: gql(query2)), + data: { + 'refreshToken': { + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, + }, + source: QueryResultSource.network, + ), + ); + + when( + locator().mutate(MutationOptions(document: gql(query3))), + ).thenAnswer( + (_) async => QueryResult( + options: MutationOptions(document: gql(query3)), + data: { + 'refreshToken': { + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, + }, + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.gqlNonAuthMutation(query); + expect(res, null); + }); + + test('Test for refresh access token', () async { + final String query = Queries().refreshToken('reftok123'); + + when( + locator().mutate(MutationOptions(document: gql(query))), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: { + 'refreshToken': { + 'accessToken': 'acctok123', + 'refreshToken': 'reftok123', + }, + }, + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.refreshAccessToken('reftok123'); + verify( + userConfig.updateAccessToken( + accessToken: 'acctok123', + refreshToken: 'reftok123', + ), + ); + verify(databaseFunctions.init()); + expect(res, true); + }); + + test('Test for refresh access token with false exception', () async { + final String query = Queries().refreshToken('reftok123'); + + when( + locator().mutate(MutationOptions(document: gql(query))), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + exception: OperationException(graphqlErrors: [userNotFound]), + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.refreshAccessToken('reftok123'); + verify(navigationService.pop()); + expect(res, false); + }); + + test('Test for refresh access token with true exception', () async { + final String query = Queries().refreshToken('x'); + final String query2 = Queries().refreshToken('abc'); + final String query3 = Queries().refreshToken('xyz'); + + userConfig.currentUser.refreshToken = 'abc'; + + /// Returns the exception to be thrown in case of refresh token expired + /// + /// more_info_if_required + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Map`: Map of exception to be thrown + Map exp2() { + if (userConfig.currentUser.refreshToken == 'abc') { + userConfig.currentUser.refreshToken = 'xyz'; + return Map.from({ + 'val': OperationException( + graphqlErrors: [userNotAuthenticated], + ), + }); + } else { + return Map.from({ + 'val': OperationException( + graphqlErrors: [userNotFound], + ), + }); + } + } + + when( + locator().mutate(MutationOptions(document: gql(query))), + ).thenAnswer( + (_) async => QueryResult( + options: MutationOptions(document: gql(query)), + exception: exp2()['val'], + source: QueryResultSource.network, + ), + ); + + when( + locator().mutate(MutationOptions(document: gql(query2))), + ).thenAnswer( + (_) async => QueryResult( + options: MutationOptions(document: gql(query2)), + data: { + 'refreshToken': { + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, + }, + source: QueryResultSource.network, + ), + ); + + when( + locator().mutate(MutationOptions(document: gql(query3))), + ).thenAnswer( + (_) async => QueryResult( + options: MutationOptions(document: gql(query3)), + data: { + 'refreshToken': { + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, + }, + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.refreshAccessToken('x'); + expect(res, false); + }); + + test('Test for gql non auth query with link exception', () async { + final String query = Queries().fetchOrgDetailsById('XYZ'); + + when(locator().query(QueryOptions(document: gql(query)))) + .thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + exception: OperationException( + graphqlErrors: [userNotFound], + linkException: UnknownException( + userNotFound, + StackTrace.current, + ), + ), + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.gqlNonAuthQuery(query); + expect(res, null); + }); + + test('Test for gql non auth query with true exception', () async { + final String query = Queries().fetchOrgDetailsById('XYZ'); + final String query2 = Queries().refreshToken('abc'); + final String query3 = Queries().refreshToken('xyz'); + + userConfig.currentUser.refreshToken = 'abc'; + + /// Returns the exception to be thrown in case of refresh token expired + /// + /// more_info_if_required + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Map`: Map of exception to be thrown + Map exp2() { + if (userConfig.currentUser.refreshToken == 'abc') { + userConfig.currentUser.refreshToken = 'xyz'; + return Map.from({ + 'val': OperationException( + graphqlErrors: [refreshAccessTokenExpiredException], + ), + }); + } else { + return Map.from({ + 'val': OperationException( + graphqlErrors: [userNotFound], + ), + }); + } + } + + when(locator().query(QueryOptions(document: gql(query)))) + .thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + exception: exp2()['val'], + source: QueryResultSource.network, + ), + ); + + when( + locator().mutate(MutationOptions(document: gql(query2))), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query2)), + data: { + 'refreshToken': { + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, + }, + source: QueryResultSource.network, + ), + ); + + when( + locator().mutate(MutationOptions(document: gql(query3))), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query3)), + data: { + 'refreshToken': { + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, + }, + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.gqlNonAuthQuery(query); + expect(res, null); + }); + test('Test for gql non auth query with false exception', () async { + final String query = Queries().fetchOrgDetailsById('XYZ'); + final String query2 = Queries().refreshToken('abc'); + final String query3 = Queries().refreshToken('xyz'); + + userConfig.currentUser.refreshToken = 'abc'; + + /// Returns the exception to be thrown in case of refresh token expired + /// + /// more_info_if_required + /// + /// **params**: + /// None + /// + /// **returns**: + /// * `Map`: Map of exception to be thrown + Map exp2() { + if (userConfig.currentUser.refreshToken == 'abc') { + userConfig.currentUser.refreshToken = 'xyz'; + return Map.from({ + 'val': OperationException( + graphqlErrors: [userNotAuthenticated], + ), + }); + } else { + return Map.from({ + 'val': OperationException( + graphqlErrors: [userNotFound], + ), + }); + } + } + + when(locator().query(QueryOptions(document: gql(query)))) + .thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + exception: exp2()['val'], + source: QueryResultSource.network, + ), + ); + + when( + locator().mutate(MutationOptions(document: gql(query2))), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query2)), + data: { + 'refreshToken': { + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, + }, + source: QueryResultSource.network, + ), + ); + + when( + locator().mutate(MutationOptions(document: gql(query3))), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query3)), + data: { + 'refreshToken': { + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, + }, + source: QueryResultSource.network, + ), + ); + + final res = await functionsClass.gqlNonAuthQuery(query); + expect(res, null); + }); + }); +} diff --git a/test/service_tests/event_service_test.dart b/test/service_tests/event_service_test.dart new file mode 100644 index 000000000..76c461bbd --- /dev/null +++ b/test/service_tests/event_service_test.dart @@ -0,0 +1,184 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:mockito/mockito.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/event_service.dart'; +import 'package:talawa/utils/event_queries.dart'; + +import '../helpers/test_helpers.dart'; +import '../helpers/test_locator.dart'; +import '../model_tests/user/user_info_test.dart'; + +void main() { + testSetupLocator(); + + setUp(() { + registerServices(); + }); + group('Test EventService', () { + test('Test editEvent method', () async { + final dataBaseMutationFunctions = locator(); + const query = ''; + final Map variables = {}; + when( + dataBaseMutationFunctions.gqlAuthMutation( + EventQueries().updateEvent(eventId: 'eventId'), + variables: variables, + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: { + 'updateEvent': { + '_id': 'eventId', + 'title': 'Test task', + 'description': 'Test description', + }, + }, + source: QueryResultSource.network, + ), + ); + + final service = EventService(); + await service.editEvent( + eventId: 'eventId', + variables: variables, + ); + + verify( + navigationService.pop(), + ); + }); + + test('Test deleteEvent method', () async { + final dataBaseMutationFunctions = locator(); + const query = ''; + when( + dataBaseMutationFunctions.gqlAuthMutation( + EventQueries().deleteEvent('eventId'), + ), + ).thenAnswer( + (realInvocation) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: { + 'deleteEvent': { + '_id': 'eventId', + 'title': 'Test task', + 'description': 'Test description', + }, + }, + source: QueryResultSource.network, + ), + ); + final services = EventService(); + await services.deleteEvent('eventId'); + }); + + test('Test registerForAnEvent method', () async { + final dataBaseMutationFunctions = locator(); + const query = ''; + when( + dataBaseMutationFunctions.gqlAuthMutation( + EventQueries().registerForEvent(), + ), + ).thenAnswer( + (realInvocation) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: { + 'register for an event': { + '_id': 'eventId', + }, + }, + source: QueryResultSource.network, + ), + ); + final services = EventService(); + await services.registerForAnEvent('eventId'); + }); + + test('Test fetchAttendeesByEvent method', () async { + final dataBaseMutationFunctions = locator(); + const query = ''; + when( + dataBaseMutationFunctions.gqlAuthQuery( + EventQueries().attendeesByEvent('eventId'), + ), + ).thenAnswer( + (realInvocation) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: { + 'getEventAttendeesByEventId': {'userId': 'userId'}, + }, + source: QueryResultSource.network, + ), + ); + final services = EventService(); + services.fetchAttendeesByEvent('eventId'); + }); + + test('Test getEvents method', () async { + final dataBaseMutationFunctions = locator(); + const query = ''; + userConfig.currentOrg = OrgInfo(name: 'org', id: 'id'); + when( + dataBaseMutationFunctions.gqlAuthMutation( + EventQueries().fetchOrgEvents('XYZ'), + ), + ).thenAnswer( + (realInvocation) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: { + 'eventsByOrganizationConnection': [ + { + "_id": "1234567890", + "title": "Sample Event", + "description": "This is a sample event description.", + "location": "Sample Location", + "longitude": -73.935242, + "latitude": 40.73061, + "recurring": true, + "allDay": false, + "startDate": "2024-01-15", + "endDate": "2024-01-16", + "startTime": "10:00 AM", + "endTime": "4:00 PM", + "recurrence": "Weekly", + "isPublic": true, + "isRegistered": true, + "isRegisterable": true, + "creator": { + "id": "user123", + "name": "Creator Name", + "email": "creator@example.com", + }, + "organization": { + "id": "org123", + "name": "Organization Name", + "description": "Sample organization description.", + }, + "attendees": [ + testDataNotFromOrg, + ], + } + ], + }, + source: QueryResultSource.network, + ), + ); + final services = EventService(); + services.getEvents(); + }); + + test('Test dispose method', () { + final eventService = EventService(); + eventService.dispose(); + }); + + test('Test for getters', () { + final model = EventService(); + expect(model.eventStream, isA>()); + }); + }); +} diff --git a/test/service_tests/graphql_config_test.dart b/test/service_tests/graphql_config_test.dart new file mode 100644 index 000000000..201b1aafc --- /dev/null +++ b/test/service_tests/graphql_config_test.dart @@ -0,0 +1,33 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:talawa/services/graphql_config.dart'; +import '../helpers/test_helpers.dart'; +import '../helpers/test_locator.dart'; + +void main() { + testSetupLocator(); + + setUp(() { + registerServices(); + }); + group('Testing Graphql Config', () { + test('test httpLink with MockHttpClient', () async { + final graphqlConfig = GraphqlConfig(); + final mockHttpClient = MockHttpClient(); + final mockUri = Uri.parse('https://example.com/graphql'); + + graphqlConfig.httpLink = HttpLink( + mockUri.toString(), + httpClient: mockHttpClient, + ); + + final response = await graphqlConfig + .clientToQuery() + .query(QueryOptions(document: gql('query {}'))); + expect( + response.data, + isNull, + ); + }); + }); +} diff --git a/test/service_tests/image_service_test.dart b/test/service_tests/image_service_test.dart new file mode 100644 index 000000000..cce18ff63 --- /dev/null +++ b/test/service_tests/image_service_test.dart @@ -0,0 +1,101 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'dart:convert'; +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:image_cropper/image_cropper.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/services/image_service.dart'; + +import '../helpers/test_helpers.dart'; +import '../helpers/test_locator.dart'; + +class MockImageService extends Mock implements ImageService { + @override + Future convertToBase64(File file) async { + return ""; + } +} + +void main() { + testSetupLocator(); + + setUpAll(() { + registerServices(); + }); + + group('Tests for Crop Image', () { + test("test no image provided for the image cropper", () async { + const path = 'test'; + final file = await imageService.cropImage(imageFile: File(path)); + expect(file?.path, null); + }); + + test("crop image method", () async { + final mockImageCropper = imageCropper; + + const path = "test"; + final fakefile = File(path); + final croppedFile = CroppedFile("fakeCropped"); + + when( + mockImageCropper.cropImage( + sourcePath: "test", + aspectRatioPresets: [ + CropAspectRatioPreset.square, + CropAspectRatioPreset.original, + ], + uiSettings: anyNamed('uiSettings'), + ), + ).thenAnswer((realInvocation) async => croppedFile); + + final file = await imageService.cropImage(imageFile: fakefile); + + expect(file?.path, croppedFile.path); + }); + + test("error in crop image", () async { + final mockImageCropper = locator(); + const path = "test"; + final fakefile = File(path); + when( + mockImageCropper.cropImage( + sourcePath: "test", + aspectRatioPresets: [ + CropAspectRatioPreset.square, + CropAspectRatioPreset.original, + ], + uiSettings: anyNamed('uiSettings'), + ), + ).thenThrow(Exception()); + expect( + imageService.cropImage(imageFile: fakefile), + throwsException, + ); + }); + }); + + group('Tests for convertToBase64', () { + test('convertToBase64 converts file to base64 string', () async { + //using this asset as the test asset + final file = File('assets/images/Group 8948.png'); + final List encodedBytes = file.readAsBytesSync(); + + final fileString = await imageService.convertToBase64(file); + + final List decodedBytes = base64Decode(fileString!); + + expect(decodedBytes, equals(encodedBytes)); + }); + + test( + 'Check if convertToBase64 is working even if wrong file path is provided', + () async { + final file = File('fakePath'); + final fileString = await imageService.convertToBase64(file); + expect(null, fileString); + }); + }); +} diff --git a/test/service_tests/multi_media_pick_service_test.dart b/test/service_tests/multi_media_pick_service_test.dart new file mode 100644 index 000000000..1205bc509 --- /dev/null +++ b/test/service_tests/multi_media_pick_service_test.dart @@ -0,0 +1,151 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:image_cropper/image_cropper.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/services/third_party_service/multi_media_pick_service.dart'; +import 'package:talawa/utils/app_localization.dart'; +import '../helpers/test_helpers.dart'; +import '../helpers/test_locator.dart'; + +void main() { + testSetupLocator(); + setUp(() { + registerServices(); + }); + tearDown(() { + unregisterServices(); + }); + SizeConfig().test(); + group('MultiMediaPickerService test', () { + test("test get photo from gallery method if camera option is false", + () async { + final mockImageCropper = locator(); + final mockPicker = imagePicker; + final model = MultiMediaPickerService(); + const path = 'test'; + final image = XFile(path); + when(mockPicker.pickImage(source: ImageSource.gallery)) + .thenAnswer((realInvocation) async => image); + when( + mockImageCropper.cropImage( + sourcePath: "test", + aspectRatioPresets: [ + CropAspectRatioPreset.square, + CropAspectRatioPreset.original, + ], + uiSettings: anyNamed('uiSettings'), + ), + ).thenAnswer((realInvocation) async => CroppedFile(path)); + + final result = await model.getPhotoFromGallery(camera: false); + + expect(result?.path, path); + }); + test("test get photo from gallery method if camera option is true", + () async { + final mockImageCropper = locator(); + final mockPicker = locator(); + final model = MultiMediaPickerService(); + const path = 'test'; + final image = XFile(path); + when(mockPicker.pickImage(source: ImageSource.camera)) + .thenAnswer((realInvocation) async => image); + when( + mockImageCropper.cropImage( + sourcePath: "test", + aspectRatioPresets: [ + CropAspectRatioPreset.square, + CropAspectRatioPreset.original, + ], + uiSettings: anyNamed('uiSettings'), + ), + ).thenAnswer((realInvocation) async => CroppedFile(path)); + + final result = await model.getPhotoFromGallery(camera: true); + + expect(result?.path, path); + }); + test("test no photo provided for the pick image", () async { + final model = MultiMediaPickerService(); + final file = await model.getPhotoFromGallery(camera: false); + expect(file?.path, null); + }); + test("camera access denied", () async { + final mockPicker = locator(); + final model = MultiMediaPickerService(); + final printed = []; + + final error = PlatformException(code: 'camera_access_denied'); + when(mockPicker.pickImage(source: ImageSource.camera)).thenThrow(error); + runZoned( + () async { + await model.getPhotoFromGallery(camera: true); + }, + zoneSpecification: ZoneSpecification( + print: (self, parent, zone, line) { + printed.add(line); + }, + ), + ); + expect( + printed[0], + "MultiMediaPickerService : Exception occurred while choosing photo from the gallery $error", + ); + }); + + testWidgets('Test for permission_denied_dialog success action.', + (tester) async { + final service = MultiMediaPickerService(); + + final Widget app = MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold(body: service.permissionDeniedDialog()), + ); + + await tester.pumpWidget(app); + await tester.pumpAndSettle(); + + final settingsFinder = find.textContaining('SETTINGS'); + + expect(settingsFinder, findsOneWidget); + + await tester.tap(settingsFinder); + + verify(navigationService.pop()); + }); + + test("test get fileStream", () async { + final model = MultiMediaPickerService(); + expect( + model.fileStream.toString(), + "Instance of '_AsBroadcastStream'", + ); + }); + }); +} diff --git a/test/service_tests/navigation_service_test.dart b/test/service_tests/navigation_service_test.dart new file mode 100644 index 000000000..564cc28b5 --- /dev/null +++ b/test/service_tests/navigation_service_test.dart @@ -0,0 +1,608 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/enums/enums.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/widgets/talawa_error_dialog.dart'; +import 'package:talawa/widgets/talawa_error_snackbar.dart'; + +/// This methods tries to cover all the cases which can be there in future. +/// +/// **params**: +/// * `settings`: RouteSettings +/// +/// **returns**: +/// * `Route`: Returns Route Type +Route _onGenerateTestRoute(RouteSettings settings) { + if (settings.name == '/second-screen') { + if (settings.arguments == null) { + return MaterialPageRoute(builder: (context) => const SecondTestScreen()); + } else { + if (settings.arguments is String) { + return MaterialPageRoute( + builder: (context) => SecondTestScreen( + arguments: settings.arguments! as String, + ), + ); + } else if (settings.arguments is Function) { + return MaterialPageRoute( + builder: (context) => SecondTestScreen( + onclick: settings.arguments! as VoidCallback, + ), + ); + } else if (settings.arguments is Map) { + final map = settings.arguments! as Map; + return MaterialPageRoute( + builder: (context) => SecondTestScreen( + arguments: map['Argument'] as String, + onclick: map['Function'] as VoidCallback, + ), + ); + } + } + } + if (settings.name == '/first-screen') { + if (settings.arguments == null) { + return MaterialPageRoute( + builder: (context) => FirstTestScreen( + onClick: () {}, + ), + ); + } else { + return MaterialPageRoute( + builder: (context) => FirstTestScreen( + onClick: () {}, + arguments: settings.arguments! as String, + ), + ); + } + } + if (settings.name == '/third-screen') { + if (settings.arguments == null) { + return MaterialPageRoute(builder: (context) => const ThirdTestScreen()); + } else { + return MaterialPageRoute( + builder: (context) => ThirdTestScreen( + arguments: settings.arguments! as String, + ), + ); + } + } + return MaterialPageRoute( + builder: (context) => FirstTestScreen( + onClick: () {}, + ), + ); +} + +class HomeApp extends StatefulWidget { + const HomeApp({ + super.key, + required this.onClick, + required this.navigateorKey, + }); + final GlobalKey navigateorKey; + final VoidCallback onClick; + + @override + State createState() => _HomeAppState(); +} + +class _HomeAppState extends State { + @override + Widget build(BuildContext context) { + return MaterialApp( + navigatorKey: widget.navigateorKey, + initialRoute: '/', + onGenerateRoute: _onGenerateTestRoute, + home: FirstTestScreen( + onClick: () { + widget.onClick(); + }, + ), + ); + } +} + +class HomeApp2 extends StatefulWidget { + const HomeApp2({ + super.key, + required this.onClick, + required this.navigateorKey, + }); + final GlobalKey navigateorKey; + final VoidCallback onClick; + + @override + State createState() => _HomeAppState2(); +} + +class _HomeAppState2 extends State { + @override + Widget build(BuildContext context) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + navigatorKey: widget.navigateorKey, + initialRoute: '/', + onGenerateRoute: _onGenerateTestRoute, + home: FirstTestScreen( + onClick: () { + widget.onClick(); + }, + ), + ); + } +} + +class FirstTestScreen extends StatefulWidget { + const FirstTestScreen({super.key, required this.onClick, this.arguments}); + final VoidCallback onClick; + final String? arguments; + + @override + State createState() => _FirstScrenState(); +} + +class _FirstScrenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + Center( + child: ElevatedButton( + child: const Text('Button'), + onPressed: () { + widget.onClick(); + }, + ), + ), + const Text('First Screen'), + Center( + child: Text(widget.arguments == null ? 'null' : widget.arguments!), + ), + ], + ), + ); + } +} + +class SecondTestScreen extends StatefulWidget { + const SecondTestScreen({super.key, this.arguments, this.onclick}); + final String? arguments; + final VoidCallback? onclick; + + @override + State createState() => _SecondTestScreenState(); +} + +class _SecondTestScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + const Center(child: Text('Second Screen')), + Center( + child: Text(widget.arguments == null ? 'null' : widget.arguments!), + ), + ElevatedButton( + onPressed: () { + if (widget.onclick != null) { + widget.onclick?.call(); + } + }, + child: const Text('Button 2'), + ), + ], + ), + ); + } +} + +class ThirdTestScreen extends StatefulWidget { + const ThirdTestScreen({super.key, this.arguments}); + final String? arguments; + @override + State createState() => _ThirdTestScreenState(); +} + +class _ThirdTestScreenState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: Column( + children: [ + const Text('Third Screen'), + Center( + child: Text(widget.arguments == null ? 'null' : widget.arguments!), + ), + ], + ), + ); + } +} + +class TalawaErrorWidget extends StatelessWidget { + const TalawaErrorWidget({ + super.key, + required this.navigationService, + required this.onClick, + }); + final NavigationService navigationService; + final VoidCallback onClick; + + @override + Widget build(BuildContext context) { + return MaterialApp( + navigatorKey: navigationService.navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: TextButton( + child: const Text('Open'), + onPressed: () { + onClick(); + }, + ), + ), + ); + } +} + +void main() { + SizeConfig().test(); + group('Navigation Services Tests', () { + late NavigationService navigationService; + late GlobalKey mockKey; + setUp(() { + navigationService = NavigationService(); + mockKey = navigationService.navigatorKey; + }); + testWidgets('pushScreen() test without arguments', + (WidgetTester tester) async { + await tester.pumpWidget( + HomeApp( + navigateorKey: mockKey, + onClick: () async { + await navigationService.pushScreen('/second-screen'); + }, + ), + ); + await tester.tap(find.byType(ElevatedButton)); + await tester.pumpAndSettle(); + expect(find.textContaining('Second Screen'), findsOneWidget); + expect(find.textContaining('null'), findsOneWidget); + }); + testWidgets('pushScreen() test with arguments', (tester) async { + await tester.pumpWidget( + HomeApp( + navigateorKey: mockKey, + onClick: () async { + await navigationService.pushScreen( + '/second-screen', + arguments: 'Hello Talawa', + ); + }, + ), + ); + await tester.tap(find.byType(ElevatedButton)); + await tester.pumpAndSettle(); + expect(find.textContaining('Second Screen'), findsOneWidget); + expect(find.textContaining('Hello Talawa'), findsOneWidget); + }); + testWidgets('popAndPushScreen() test without arguments', (tester) async { + await tester.pumpWidget( + HomeApp( + navigateorKey: mockKey, + onClick: () async { + await mockKey.currentState!.pushNamed('/second-screen'); + }, + ), + ); + await tester.tap(find.byType(ElevatedButton)); + await tester.pumpAndSettle(); + final initialPageLength = mockKey.currentState!.widget.pages.length; + navigationService.popAndPushScreen('/first-screen'); + await tester.pumpAndSettle(); + final finalPageLength = mockKey.currentState!.widget.pages.length; + expect(find.textContaining('null'), findsOneWidget); + expect(find.textContaining('First Screen'), findsOneWidget); + expect(finalPageLength, initialPageLength); + }); + testWidgets('popAndPushScreen() test with arguments', (tester) async { + await tester.pumpWidget( + HomeApp( + navigateorKey: mockKey, + onClick: () async { + await mockKey.currentState!.pushNamed('/second-screen'); + }, + ), + ); + await tester.tap(find.byType(ElevatedButton)); + await tester.pumpAndSettle(); + final initialPageLength = mockKey.currentState!.widget.pages.length; + navigationService.popAndPushScreen( + '/first-screen', + arguments: 'Hello Talawa', + ); + await tester.pumpAndSettle(); + final finalPageLength = mockKey.currentState!.widget.pages.length; + expect(find.textContaining('Hello Talawa'), findsOneWidget); + expect(find.textContaining('First Screen'), findsOneWidget); + expect(finalPageLength, initialPageLength); + }); + testWidgets('pushReplacementScreen() test without arguments', + (tester) async { + await tester.pumpWidget( + HomeApp( + navigateorKey: mockKey, + onClick: () async { + await mockKey.currentState!.pushNamed( + '/second-screen', + arguments: mockKey.currentState!.pushNamed('/first-screen'), + ); + }, + ), + ); + await tester.tap(find.byType(ElevatedButton)); + await tester.pumpAndSettle(); + navigationService.pushReplacementScreen('/first-screen'); + await tester.pumpAndSettle(); + expect(find.textContaining('null'), findsOneWidget); + expect(find.textContaining('First Screen'), findsOneWidget); + }); + testWidgets('pushReplacementScreen() test with arguments', (tester) async { + await tester.pumpWidget( + HomeApp( + navigateorKey: mockKey, + onClick: () async { + await mockKey.currentState!.pushNamed( + '/second-screen', + arguments: mockKey.currentState!.pushNamed('/first-screen'), + ); + }, + ), + ); + await tester.tap(find.byType(ElevatedButton)); + await tester.pumpAndSettle(); + navigationService.pushReplacementScreen( + '/first-screen', + arguments: 'Hello Talawa', + ); + await tester.pumpAndSettle(); + expect(find.textContaining('Hello Talawa'), findsOneWidget); + expect(find.textContaining('First Screen'), findsOneWidget); + }); + testWidgets('removeAllAndPush() test without arguments', (tester) async { + void functionToTest() { + navigationService.removeAllAndPush( + '/third-screen', + '/second-screen', + ); + } + + await tester.pumpWidget( + HomeApp( + navigateorKey: mockKey, + onClick: () async { + await mockKey.currentState!.pushNamed( + '/second-screen', + arguments: functionToTest, + ); + }, + ), + ); + await tester.tap(find.byType(ElevatedButton)); + await tester.pumpAndSettle(); + await tester.tap(find.byType(ElevatedButton)); + await tester.pumpAndSettle(); + expect(find.textContaining('null'), findsOneWidget); + expect(find.textContaining('Third Screen'), findsOneWidget); + expect(mockKey.currentState!.widget.pages.length, 0); + }); + testWidgets('removeAllAndPush() test with arguments', (tester) async { + void functionToTest() { + navigationService.removeAllAndPush( + '/third-screen', + '/second-screen', + arguments: 'Hello Talawa', + ); + } + + await tester.pumpWidget( + HomeApp( + navigateorKey: mockKey, + onClick: () async { + await mockKey.currentState!.pushNamed( + '/second-screen', + arguments: functionToTest, + ); + }, + ), + ); + await tester.tap(find.byType(ElevatedButton)); + await tester.pumpAndSettle(); + await tester.tap(find.byType(ElevatedButton)); + await tester.pumpAndSettle(); + expect(find.textContaining('Hello Talawa'), findsOneWidget); + expect(find.textContaining('Third Screen'), findsOneWidget); + expect(mockKey.currentState!.widget.pages.length, 0); + }); + testWidgets('pushDialog() test', (tester) async { + Widget testDialog() { + return const AlertDialog( + title: Text('Test Dialog'), + content: Text('This is a test dialog.'), + ); + } + + void functionForOnClick() { + navigationService.pushDialog(testDialog()); + } + + await tester.pumpWidget( + HomeApp(navigateorKey: mockKey, onClick: functionForOnClick), + ); + await tester.pumpAndSettle(); + await tester.tap(find.byType(ElevatedButton)); + await tester.pumpAndSettle(); + expect(find.byWidget(testDialog()), findsOneWidget); + await tester.tap(find.byType(FirstTestScreen), warnIfMissed: false); + await tester.pumpAndSettle(); + expect(find.byWidget(testDialog()), findsOneWidget); + }); + testWidgets('showSnackBar() test with default duration', (tester) async { + await tester.pumpWidget( + HomeApp2( + navigateorKey: mockKey, + onClick: () { + navigationService.showSnackBar('Hello Talawa'); + }, + ), + ); + await tester.pumpAndSettle(); + await tester.tap(find.byType(ElevatedButton)); + await tester.pumpAndSettle(); + expect(find.textContaining('Hello Talawa'), findsOneWidget); + final snackBarFinder = find.byType(SnackBar); + final snackBarWidget = tester.widget(snackBarFinder); + expect(snackBarWidget.behavior, equals(SnackBarBehavior.floating)); + expect(snackBarWidget.duration, equals(const Duration(seconds: 2))); + }); + testWidgets('showSnackBar() test with custom duration', (tester) async { + await tester.pumpWidget( + HomeApp2( + navigateorKey: mockKey, + onClick: () { + navigationService.showSnackBar( + 'Hello Talawa', + duration: const Duration(seconds: 3), + ); + }, + ), + ); + await tester.pumpAndSettle(); + await tester.tap(find.byType(ElevatedButton)); + await tester.pumpAndSettle(); + expect(find.textContaining('Hello Talawa'), findsOneWidget); + final snackBarFinder = find.byType(SnackBar); + final snackBarWidget = tester.widget(snackBarFinder); + expect(snackBarWidget.behavior, equals(SnackBarBehavior.floating)); + expect(snackBarWidget.duration, equals(const Duration(seconds: 3))); + }); + testWidgets('showTalawaErrorSnackBar() test with default duration', + (tester) async { + await tester.pumpWidget( + TalawaErrorWidget( + navigationService: navigationService, + onClick: () { + navigationService.showTalawaErrorSnackBar( + 'Error Message', + MessageType.error, + ); + }, + ), + ); + await tester.pumpAndSettle(); + await tester.tap(find.byType(TextButton)); + await tester.pumpAndSettle(); + expect(find.byType(TalawaErrorSnackBar), findsOneWidget); + final snackBarFinder = find.byType(SnackBar); + final snackBarWidget = tester.widget(snackBarFinder); + expect( + snackBarWidget.duration, + equals(const Duration(milliseconds: 1040)), + ); + expect( + snackBarWidget.backgroundColor, + const Color.fromRGBO(65, 65, 66, 1), + ); + }); + testWidgets('showTalawaErrorSnackBar() test with custom duration', + (tester) async { + await tester.pumpWidget( + TalawaErrorWidget( + navigationService: navigationService, + onClick: () { + navigationService.showTalawaErrorSnackBar( + 'Error Message', + MessageType.error, + ); + }, + ), + ); + await tester.pumpAndSettle(); + await tester.tap(find.byType(TextButton)); + await tester.pumpAndSettle(); + expect(find.byType(TalawaErrorSnackBar), findsOneWidget); + final snackBarFinder = find.byType(SnackBar); + final snackBarWidget = tester.widget(snackBarFinder); + expect( + snackBarWidget.duration, + equals(const Duration(milliseconds: 1040)), + ); + expect( + snackBarWidget.backgroundColor, + const Color.fromRGBO(65, 65, 66, 1), + ); + }); + testWidgets('showTalawaErrorDialog() test with custom duration', + (tester) async { + await tester.pumpWidget( + TalawaErrorWidget( + navigationService: navigationService, + onClick: () { + navigationService.showTalawaErrorDialog( + 'Hello Talawa', + MessageType.error, + ); + }, + ), + ); + await tester.pumpAndSettle(); + await tester.tap(find.byType(TextButton)); + await tester.pumpAndSettle(); + expect(find.byType(TalawaErrorDialog), findsOneWidget); + await tester.tap(find.byType(TalawaErrorWidget), warnIfMissed: false); + await tester.pumpAndSettle(); + expect(find.byType(TalawaErrorDialog), findsOneWidget); + }); + testWidgets('pop() method test', (tester) async { + await tester.pumpWidget( + HomeApp( + navigateorKey: mockKey, + onClick: () { + navigationService.pop(); + }, + ), + ); + await tester.pumpAndSettle(); + await tester.tap(find.byType(ElevatedButton)); + await tester.pumpAndSettle(); + expect(mockKey.currentState!.canPop(), false); + }); + }); +} diff --git a/test/service_tests/org_service_test.dart b/test/service_tests/org_service_test.dart new file mode 100644 index 000000000..736e6cd77 --- /dev/null +++ b/test/service_tests/org_service_test.dart @@ -0,0 +1,95 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/services/org_service.dart'; + +import '../helpers/test_helpers.dart'; + +/// Tests org_service.dart. +void main() { + registerServices(); + + group('Test OrganizationService', () { + final OrganizationService organizationService = OrganizationService(); + final dbFunctions = locator(); + + test('Test getOrgMembersList', () async { + const String orgId = '123'; + const String query = ''' + query{ + organizations(id: "$orgId"){ + image + _id + name + admins{ + _id + } + description + userRegistrationRequired + creator{ + _id + firstName + lastName + } + members{ + _id + firstName + lastName + image + } + } + } + '''; + + final List> userJsonList = [ + { + '_id': 'user_id_1', + 'accessToken': ' ', + 'refreshToken': ' ', + 'firstName': 'Some', + 'lastName': 'Name', + }, + { + '_id': 'user_id_2', + 'accessToken': ' ', + 'refreshToken': ' ', + 'firstName': 'Name', + 'lastName': 'Some', + }, + ]; + + final QueryResult queryResult = QueryResult.internal( + parserFn: (map) => '123', + source: null, + data: { + 'organizations': [ + { + 'members': userJsonList, + }, + ], + }, + ); + when(dbFunctions.gqlAuthMutation(query)) + .thenAnswer((realInvocation) async => queryResult); + + final result = await organizationService.getOrgMembersList(orgId); + + expect(result.length, 2); + for (int index = 0; index < result.length; index++) { + final User user = User.fromJson(userJsonList[index], fromOrg: true); + + expect(result[index].id, user.id); + expect(result[index].authToken, user.authToken); + expect(result[index].refreshToken, user.refreshToken); + expect(result[index].firstName, user.firstName); + expect(result[index].lastName, user.lastName); + } + }); + }); +} diff --git a/test/service_tests/post_service_test.dart b/test/service_tests/post_service_test.dart new file mode 100644 index 000000000..988100c36 --- /dev/null +++ b/test/service_tests/post_service_test.dart @@ -0,0 +1,491 @@ +import 'dart:async'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:mockito/mockito.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/models/user/user_info.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/services/post_service.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/utils/post_queries.dart'; + +import '../helpers/test_helpers.dart'; + +/// Tests post_service.dart. +/// +/// **params**: +/// None +/// +/// **returns**: +/// None +void main() { + setUp(() { + registerServices(); + }); + final demoJson = { + '__typename': 'Query', + 'organizations': [ + { + '__typename': 'Organization', + 'posts': { + '__typename': 'PostsConnection', + 'edges': [ + { + '__typename': 'PostEdge', + 'node': { + '__typename': 'Post', + '_id': '65e1aac38836aa003e4b8318', + 'title': 'testing', + 'text': 'test post', + 'imageUrl': + 'http://10.0.2.2:4000/images/5vFxR-8xE2GD-5Tu3E1QYimage.png', + 'videoUrl': null, + 'creator': { + '__typename': 'User', + '_id': '65378abd85008f171cf2990d', + 'firstName': 'Vyvyan', + 'lastName': 'Kerry', + 'email': 'testadmin1@example.com', + }, + 'createdAt': '2024-03-01T10:15:31.168Z', + 'likeCount': 0, + 'commentCount': 0, + 'likedBy': [], + 'comments': [], + 'pinned': true, + }, + 'cursor': '65e1aac38836aa003e4b8318', + }, + { + '__typename': 'PostEdge', + 'node': { + '__typename': 'Post', + '_id': '6589bdd92caa9d8d69087515', + 'title': 'Winter Wonderland: Ice Skating Extravaganza', + 'text': + 'Gliding gracefully on frozen lakes, surrounded by enchanting winter landscape—ice skating extravaganza, a dance in a winter wonderland.', + 'imageUrl': null, + 'videoUrl': null, + 'creator': { + '__typename': 'User', + '_id': '658938ba2caa9d8d6908748a', + 'firstName': 'Peggy', + 'lastName': 'Bowers', + 'email': 'testuser11@example.com', + }, + 'createdAt': '2024-03-01T10:15:31.168Z', + 'likeCount': 0, + 'commentCount': 0, + 'likedBy': [], + 'comments': [], + }, + 'cursor': '6589bdd92caa9d8d69087515', + } + ], + 'pageInfo': { + '__typename': 'DefaultConnectionPageInfo', + 'startCursor': '65e1aac38836aa003e4b8318', + 'endCursor': '6589bd9b2caa9d8d6908750f', + 'hasNextPage': true, + 'hasPreviousPage': false, + }, + }, + } + ], + }; + final demoJsonPage2 = { + '__typename': 'Query', + 'organizations': [ + { + '__typename': 'Organization', + 'posts': { + '__typename': 'PostsConnection', + 'edges': [ + { + '__typename': 'PostEdge', + 'node': { + '__typename': 'Post', + '_id': '65e1aac38836aa003e4b8319', + 'title': 'Second Page Post 1', + 'text': 'This is the first post on the second page', + 'imageUrl': 'http://example.com/image2.jpg', + 'videoUrl': null, + 'creator': { + '__typename': 'User', + '_id': 'user_id_2', + 'firstName': 'John', + 'lastName': 'Doe', + 'email': 'john.doe@example.com', + }, + 'createdAt': '2024-03-02T10:15:31.168Z', + 'likeCount': 5, + 'commentCount': 2, + 'likedBy': [], + 'comments': [ + {'commentId': 'comment_id_1', 'text': 'Comment 1'}, + {'commentId': 'comment_id_2', 'text': 'Comment 2'}, + ], + 'pinned': false, + }, + 'cursor': '65e1aac38836aa003e4b8319', + }, + { + '__typename': 'PostEdge', + 'node': { + '__typename': 'Post', + '_id': '65e1aac38836aa003e4b8320', + 'title': 'Second Page Post 2', + 'text': 'This is the second post on the second page', + 'imageUrl': 'http://example.com/image3.jpg', + 'videoUrl': null, + 'creator': { + '__typename': 'User', + '_id': 'user_id_3', + 'firstName': 'Jane', + 'lastName': 'Doe', + 'email': 'jane.doe@example.com', + }, + 'createdAt': '2024-03-02T10:30:00.000Z', + 'likeCount': 10, + 'commentCount': 3, + 'likedBy': [], + 'comments': [ + {'commentId': 'comment_id_3', 'text': 'Comment 3'}, + {'commentId': 'comment_id_4', 'text': 'Comment 4'}, + {'commentId': 'comment_id_5', 'text': 'Comment 5'}, + ], + 'pinned': false, + }, + 'cursor': '65e1aac38836aa003e4b8320', + }, + // Add more posts as needed + ], + 'pageInfo': { + '__typename': 'DefaultConnectionPageInfo', + 'startCursor': '65e1aac38836aa003e4b8319', + 'endCursor': '65e1aac38836aa003e4b8320', + 'hasNextPage': false, + 'hasPreviousPage': true, + }, + }, + } + ], + }; + + //Fake CurrentOrgID + const currentOrgID = 'XYZ'; + //Fake PostID + const postID = '65e1aac38836aa003e4b8318'; + + group('Test PostService', () { + test('Test refreshFeed method', () async { + final service = PostService(); + // Populating refreshing feed + await service.refreshFeed(); + verify(service.getPosts()).called(2); + }); + + test('Test addNewPost method', () async { + final dataBaseMutationFunctions = locator(); + final query = + PostQueries().getPostsById(currentOrgID, null, null, 5, null); + when( + dataBaseMutationFunctions.gqlAuthQuery( + query, + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: demoJson, + source: QueryResultSource.network, + ), + ); + when( + dataBaseMutationFunctions.gqlAuthQuery( + query, + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: demoJson, + source: QueryResultSource.network, + ), + ); + + final service = PostService(); + await service.getPosts(); + service.addNewpost(Post(sId: '1', creator: User())); + + final List posts = await service.postStream.first; + expect(posts.length, 3); + }); + test('Test getPosts Method', () async { + final dataBaseMutationFunctions = locator(); + //Setting up Demo data to be returned + final query = + PostQueries().getPostsById(currentOrgID, null, null, 5, null); + when( + dataBaseMutationFunctions.gqlAuthQuery( + query, + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: demoJson, + source: QueryResultSource.network, + ), + ); + + final service = PostService(); + await service.getPosts(); + //Fetching Post Stream + final List posts = await service.postStream.first; + //Testing if Two Mock posts got added + expect(posts.length, 2); + }); + + test('Test addLike Method', () async { + final dataBaseMutationFunctions = locator(); + + final query = + PostQueries().getPostsById(currentOrgID, null, null, 5, null); + //Mocking GetPosts + when( + dataBaseMutationFunctions.gqlAuthQuery( + query, + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: demoJson, + source: QueryResultSource.network, + ), + ); + + final service = PostService(); + //Populating posts Stream + await service.getPosts(); + //Calling AddLike + await service.addLike(postID); + //Fetching Post Stream + final List posts = await service.postStream.first; + //Finding The Post which is supposed to be Liked + final Post likedPost = + posts.firstWhere((element) => element.sId == postID); + //Testing if the post got liked + expect(likedPost.likedBy!.length, 1); + }); + + test('Test removeLike Method', () async { + final dataBaseMutationFunctions = locator(); + + final query = + PostQueries().getPostsById(currentOrgID, null, null, 5, null); + //Mocking GetPosts + when( + dataBaseMutationFunctions.gqlAuthQuery( + query, + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: demoJson, + source: QueryResultSource.network, + ), + ); + + final service = PostService(); + //Populating posts Stream + await service.getPosts(); + //Liking Post which is to be Unliked + await service.addLike(postID); + //Unliking Post + await service.removeLike(postID); + //Fetching Post Stream + final List posts = await service.postStream.first; + //Finding The Post which is supposed to be Unliked + final Post likedPost = + posts.firstWhere((element) => element.sId == postID); + //Testing if the post got unliked + expect(likedPost.likedBy!.length, 0); + }); + + test('Test addCommentLocally Method', () async { + final dataBaseMutationFunctions = locator(); + + final query = + PostQueries().getPostsById(currentOrgID, null, null, 5, null); + //Mocking GetPosts + when( + dataBaseMutationFunctions.gqlAuthQuery( + query, + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: demoJson, + source: QueryResultSource.network, + ), + ); + + final service = PostService(); + //Populating posts Stream + await service.getPosts(); + //Adding Comment to a Post + service.addCommentLocally(postID); + //Fetching Post Stream + final List posts = await service.postStream.first; + //Finding The Post which is supposed to be commented + final Post commentedPost = + posts.firstWhere((element) => element.sId == postID); + //Testing if the post got a comment + expect(commentedPost.comments!.length, 1); + }); + test('Test updatedPostStream Stream', () async { + final dataBaseMutationFunctions = locator(); + + final query = + PostQueries().getPostsById(currentOrgID, null, null, 5, null); + // Mocking GetPosts + when( + dataBaseMutationFunctions.gqlAuthQuery( + query, + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: demoJson, + source: QueryResultSource.network, + ), + ); + + final service = PostService(); + // Populating posts Stream + await service.getPosts(); + + // Listen to updatedPostStream and collect emitted values + final List updatedPosts = []; + final subscription = service.updatedPostStream.listen((post) { + updatedPosts.add(post); + }); + + // Trigger an event that should update the post + await service.addLike(postID); + + // Wait for the stream to emit values + await Future.delayed( + const Duration(seconds: 1), + ); // Adjust the delay as needed + + // Verify that the correct post was emitted + expect(updatedPosts.length, 1); + expect(updatedPosts[0].sId, postID); + // Cancel the subscription to avoid memory leaks + await subscription.cancel(); + }); + test( + 'Test setOrgStreamSubscription method after the organization is updated', + () async { + final dataBaseMutationFunctions = locator(); + + final query = + PostQueries().getPostsById(currentOrgID, null, null, 5, null); + // Mocking GetPosts + when( + dataBaseMutationFunctions.gqlAuthQuery( + query, + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: demoJson, + source: QueryResultSource.network, + ), + ); + + final service = PostService(); + // Populating posts Stream + await service.getPosts(); + + // Set up mock for currentOrgInfoStream + final mockUserConfig = locator(); + final orgInfoStreamController = StreamController(); + when(mockUserConfig.currentOrgInfoStream) + .thenAnswer((_) => orgInfoStreamController.stream); + + // Call setOrgStreamSubscription + service.setOrgStreamSubscription(); + + // Trigger an event that should update the organization + orgInfoStreamController.add(OrgInfo(id: 'newOrgId')); + + // Wait for the setOrgStreamSubscription logic to execute + await Future.delayed( + const Duration(seconds: 1), + ); // Adjust the delay as needed + + // Verify that refresh token was called to check getPost method was called correctly. + verify(service.getPosts()).called(1); + + // Close the stream controller to avoid memory leaks + await orgInfoStreamController.close(); + }); + test("Test the nextPage and previous page funcitonality", () async { + final dataBaseMutationFunctions = locator(); + + final query = + PostQueries().getPostsById(currentOrgID, null, null, 5, null); + // Mocking GetPosts + when( + dataBaseMutationFunctions.gqlAuthQuery( + query, + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query)), + data: demoJson, + source: QueryResultSource.network, + ), + ); + final query2 = PostQueries().getPostsById( + currentOrgID, + "6589bd9b2caa9d8d6908750f", + null, + 5, + null, + ); + when( + dataBaseMutationFunctions.gqlAuthQuery( + query2, + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions(document: gql(query2)), + data: demoJsonPage2, + source: QueryResultSource.network, + ), + ); + + final service = PostService(); + // Populating posts Stream + await service.getPosts(); + //Fetching next posts + await service.nextPage(); + expect(service.after, "6589bd9b2caa9d8d6908750f"); + expect(service.first, 5); + expect(service.before, null); + expect(service.last, null); + verify(service.getPosts()).called(1); + + await service.previousPage(); + expect(service.after, null); + expect(service.last, 5); + expect(service.before, "65e1aac38836aa003e4b8319"); + expect(service.first, null); + verify(service.getPosts()).called(1); + }); + }); +} diff --git a/test/service_tests/session_manager_test.dart b/test/service_tests/session_manager_test.dart new file mode 100644 index 000000000..1834c561c --- /dev/null +++ b/test/service_tests/session_manager_test.dart @@ -0,0 +1,41 @@ +import 'package:fake_async/fake_async.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/session_manager.dart'; + +import '../helpers/test_helpers.dart'; + +void main() { + setupLocator(); + group('Test Session Manger', () { + setUpAll(() { + getAndRegisterDatabaseMutationFunctions(); + }); + test('Test Session Manager Constructor', () { + SessionManager(); + }); + + test('initialize refresh interval', () { + userConfig.currentUser = User( + id: "99", + firstName: 'Azad', + refreshToken: 'refreshToken', + ); + fakeAsync((async) { + sessionManager.initializeSessionRefresher(); + async.elapse(const Duration(seconds: 600)); + }); + }); + + test('Refresh Interval is set.', () { + expect(sessionManager.refreshInterval, 600); + }); + + test('Refresh Token Method', () { + sessionManager.refreshSession(); + verify(databaseFunctions.refreshAccessToken("refreshToken")); + }); + }); +} diff --git a/test/service_tests/size_config_test.dart b/test/service_tests/size_config_test.dart new file mode 100644 index 000000000..c9f674ebd --- /dev/null +++ b/test/service_tests/size_config_test.dart @@ -0,0 +1,79 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/services/size_config.dart'; + +void main() { + late double safeAreaHorizontal; + late double safeAreaVertical; + const MediaQueryData mediaQueryData = MediaQueryData( + size: Size(360, 684), + padding: EdgeInsets.zero, + ); + + group( + 'Test SizeConfig', + () { + testWidgets('Test init method', (WidgetTester tester) async { + await tester.pumpWidget( + MediaQuery( + data: mediaQueryData, + child: Builder( + builder: (BuildContext context) { + final config = SizeConfig(); + config.init(context); + safeAreaHorizontal = + mediaQueryData.padding.left + mediaQueryData.padding.right; + safeAreaVertical = + mediaQueryData.padding.top + mediaQueryData.padding.bottom; + expect(SizeConfig.screenWidth, mediaQueryData.size.width); + expect(SizeConfig.screenHeight, mediaQueryData.size.height); + expect( + SizeConfig.blockSizeHorizontal, + SizeConfig.screenWidth! / 100, + ); + expect( + SizeConfig.blockSizeVertical, + SizeConfig.screenHeight! / 100, + ); + expect( + SizeConfig.safeBlockHorizontal, + (SizeConfig.screenWidth! - safeAreaHorizontal) / 100, + ); + expect( + SizeConfig.safeBlockVertical, + (SizeConfig.screenHeight! - safeAreaVertical) / 100, + ); + + return const Placeholder(); + }, + ), + ), + ); + }); + + test('Test test method', () async { + final config = SizeConfig(); + config.test(); + safeAreaHorizontal = + mediaQueryData.padding.left + mediaQueryData.padding.right; + safeAreaVertical = + mediaQueryData.padding.top + mediaQueryData.padding.bottom; + expect(SizeConfig.screenWidth, mediaQueryData.size.width); + expect(SizeConfig.screenHeight, mediaQueryData.size.height); + expect(SizeConfig.blockSizeHorizontal, SizeConfig.screenWidth! / 100); + expect(SizeConfig.blockSizeVertical, SizeConfig.screenHeight! / 100); + expect( + SizeConfig.safeBlockHorizontal, + (SizeConfig.screenWidth! - safeAreaHorizontal) / 100, + ); + expect( + SizeConfig.safeBlockVertical, + (SizeConfig.screenHeight! - safeAreaVertical) / 100, + ); + }); + }, + ); +} diff --git a/test/service_tests/user_config_test.dart b/test/service_tests/user_config_test.dart new file mode 100644 index 000000000..74575c598 --- /dev/null +++ b/test/service_tests/user_config_test.dart @@ -0,0 +1,307 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'dart:async'; +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:hive/hive.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/session_manager.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/widgets/custom_progress_dialog.dart'; + +import '../helpers/test_helpers.dart'; +import '../helpers/test_locator.dart'; + +class MockBox extends Mock implements Box {} + +// class MockUser extends Mock implements User { +// @override +// void updateJoinedOrg(List orgList) { +// // TODO: implement updateJoinedOrg +// } + +// @override +// void updateMemberRequestOrg(List orgList) { +// // TODO: implement updateMemberRequestOrg +// } +// } + +class MockSessionManger extends Mock implements SessionManager { + @override + Future refreshSession() { + // TODO: implement refreshSession + return Future.value(true); + } +} + +void main() async { + testSetupLocator(); + + final Directory dir = Directory('test/fixtures/core'); + + Hive + ..init(dir.path) + ..registerAdapter(UserAdapter()) + ..registerAdapter(OrgInfoAdapter()); + + final userBox = await Hive.openBox('currentUser'); + final urlBox = await Hive.openBox('url'); + final orgBox = await Hive.openBox('currentOrg'); + + getAndRegisterSessionManager(); + + final mockUser = User( + adminFor: [ + OrgInfo(id: 'org1', name: 'orga'), + OrgInfo(id: 'org2', name: 'orgb'), + ], + createdOrganizations: [ + OrgInfo(id: 'org1', name: 'orga'), + OrgInfo(id: 'org2', name: 'orgb'), + ], + email: 'test@gmail.com', + firstName: 'user', + lastName: 'one', + image: 'sample.jpg', + joinedOrganizations: [ + OrgInfo(id: 'org1', name: 'orga'), + OrgInfo(id: 'org2', name: 'orgb'), + ], + authToken: 'AuthToken', + refreshToken: 'Refreshtoken', + membershipRequests: [ + OrgInfo(id: 'org1', name: 'orga'), + OrgInfo(id: 'org2', name: 'orgb'), + ], + ); + + final mockOrgDetails = [ + OrgInfo(id: 'org3', name: 'orgc'), + OrgInfo(id: 'org4', name: 'orgd'), + ]; + + group('Test UserConfig service', () { + setUpAll(() { + registerServices(); + }); + + test('Test for getters & setters.', () { + final model = UserConfig(); + + // model.currentOrgInfoController + expect(model.currentOrgInfoController, isA>()); + + // model.currentOrgName + expect(model.currentOrgName, isA()); + + // model.currenOrg (setter) + model.currentOrg = OrgInfo(name: 'org'); + + // print(model.currentOrgInfoController); + }); + + test('Test for userLoggedIn method.', () async { + final model = UserConfig(); + model.currentUser.id = 'fake_id'; + + userBox.put('user', User(id: 'fake', firstName: 'first')); + + final Map data = { + 'users': [ + { + "user": { + "id": "1234567890", + "firstName": "ravidi", + "lastName": "sheikh", + "email": "ravidisheikh@test.com", + "image": "https://testimg.com", + "accessToken": "randomAccessToken", + "authToken": "randomAuthToken", + "refreshToken": "randomRefreshToken", + }, + 'appUserProfile': { + 'createdOrganizations': [ + { + "name": 'test_org', + "image": 'https://testimg.com', + } + ], + "adminFor": [ + { + "name": 'test_org1', + "image": 'https://testimg.com', + } + ], + }, + } + ], + }; + + when( + databaseFunctions.gqlAuthQuery( + queries.fetchUserInfo, + variables: anyNamed('variables'), + ), + ).thenAnswer((_) async { + return QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions(document: gql(queries.fetchUserInfo)), + ); + }); + + // if there is _currentUser. + bool loggedIn = await model.userLoggedIn(); + expect(loggedIn, true); + + userBox.delete('user'); + + // if there is no _currentUser. + loggedIn = await model.userLoggedIn(); + expect(loggedIn, false); + + // print(model.currentUser); + }); + + test('test user loggedin when result throws an exception', () async { + final model = UserConfig(); + + when( + databaseFunctions.gqlAuthQuery( + queries.fetchUserInfo, + variables: anyNamed('variables'), + ), + ).thenAnswer((_) async { + throw Exception('Simulated Exception.'); + }); + + // show couldn't update errorsnackbar. + final loggedIn = await model.userLoggedIn(); + expect(loggedIn, true); + }); + + test('Test for User log out method.', () async { + databaseFunctions.init(); + + when(databaseFunctions.gqlAuthMutation(queries.logout())) + .thenAnswer((realInvocation) async { + final data = { + 'logout': true, + }; + return QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions(document: gql(queries.logout())), + ); + }); + + when(navigationService.pop()).thenAnswer((_) async {}); + when( + navigationService.pushDialog( + const CustomProgressDialog( + key: Key('LogoutProgress'), + ), + ), + ).thenAnswer((realInvocation) async {}); + + bool loggedOut = await UserConfig().userLogOut(); + + expect(loggedOut, true); + + expect(userBox.isEmpty, true); + expect(urlBox.isEmpty, true); + expect(orgBox.isEmpty, true); + + when(databaseFunctions.gqlAuthMutation(queries.logout())) + .thenAnswer((realInvocation) async { + throw Exception('test exception'); + }); + + loggedOut = await UserConfig().userLogOut(); + expect(loggedOut, false); + }); + + test('Test for updateUserJoinedOrg method', () async { + final model = UserConfig(); + model.currentUser = mockUser; + + await model.updateUserJoinedOrg(mockOrgDetails); + + expect(mockUser.joinedOrganizations, mockOrgDetails); + }); + + test('Test for updateUserCreatedOrg method', () async { + final model = UserConfig(); + model.currentUser = mockUser; + + await model.updateUserCreatedOrg(mockOrgDetails); + + expect(mockUser.createdOrganizations, mockOrgDetails); + }); + + test('Test for updateUserMemberRequestOrg method', () async { + final model = UserConfig(); + model.currentUser = mockUser; + final expected = [...mockUser.membershipRequests!, ...mockOrgDetails]; + await model.updateUserMemberRequestOrg(mockOrgDetails); + + expect(mockUser.membershipRequests, expected); + }); + + test('Test for updateUserAdminOrg method', () async { + final model = UserConfig(); + model.currentUser = mockUser; + + await model.updateUserAdminOrg(mockOrgDetails); + + expect(mockUser.adminFor, mockOrgDetails); + }); + + test('Test for updateAccessToken method.', () async { + final model = UserConfig(); + model.currentUser = mockUser; + const newAuthToken = 'newAccessToken'; + const newRefreshToken = 'newRefreshToken'; + + await model.updateAccessToken( + accessToken: newAuthToken, + refreshToken: newRefreshToken, + ); + + expect(mockUser.authToken, newAuthToken); + expect(mockUser.refreshToken, newRefreshToken); + }); + + test('Test for saveCurrentOrgInHive method.', () async { + final model = UserConfig(); + model.currentUser = mockUser; + + // To test the box.get('org') != null condition. + orgBox.put('org', OrgInfo(id: 'fakeId', name: 'org')); + model.saveCurrentOrgInHive(mockOrgDetails[0]); + + // To test the box.get('org') == null condition. + orgBox.delete('org'); + model.saveCurrentOrgInHive(mockOrgDetails[0]); + }); + + test('Test for updateUser method.', () async { + final model = UserConfig(); + + when(databaseFunctions.init()).thenAnswer((_) { + throw Exception('simulated exception.'); + }); + + final updated = await model.updateUser(User(id: 'sampleId')); + + // user updation failed. + expect(!updated, true); + }); + }); +} diff --git a/test/utils/app_localization_test.dart b/test/utils/app_localization_test.dart new file mode 100644 index 000000000..6a49121b3 --- /dev/null +++ b/test/utils/app_localization_test.dart @@ -0,0 +1,95 @@ +// ignore_for_file: talawa_api_doc + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/utils/app_localization.dart'; + +void main() { + group("Test for App Localization Class", () { + WidgetsFlutterBinding.ensureInitialized(); + + test("Load JSON File for localizations", () async { + final appLocalizations = AppLocalizations(const Locale('en')); + final result = await appLocalizations.load(); + expect(result, true); + }); + + test("Test mode working properly", () async { + final appLocalizations = + AppLocalizations(const Locale('hi'), isTest: true); + final result = await appLocalizations.load(); + expect(result, true); + + // expect(appLocalizations.strictTranslate("Recover"), "Recover"); + }); + + test("Translate and strict translate", () async { + final appLocalizations = AppLocalizations(const Locale('en')); + final result = await appLocalizations.load(); + expect(result, true); + + // Translate known value + const key = "Please verify URL first"; + const trueData = "Please verify URL first"; + final checkData = appLocalizations.translate(key); + expect(checkData, trueData); + + // Translate unknown value + const key2 = "Lorem ipsum"; + expect(appLocalizations.translate(key2), null); + + // Translate null value + expect(appLocalizations.translate(null), "..."); + + //Strict translate known value + expect(appLocalizations.strictTranslate("Liked by"), "Liked by"); + + // Strict translate unknown value + expect(appLocalizations.strictTranslate(key2), key2); + }); + }); + + group("Test for App Localization Delegate", () { + WidgetsFlutterBinding.ensureInitialized(); + const appLocalizationsDelgate = AppLocalizationsDelegate(); + + test("Language is supported or not", () { + // A supported language + expect(appLocalizationsDelgate.isSupported(const Locale('hi')), true); + + // An unsupported language + expect(appLocalizationsDelgate.isSupported(const Locale('or')), false); + }); + + test("Localization loaded and changed properly", () async { + var testAppLocalization = + await appLocalizationsDelgate.load(const Locale('hi')); + + // In test mode + testAppLocalization.isTest = true; + expect(testAppLocalization.strictTranslate("Recover"), "Recover"); + + // In prod mode + testAppLocalization.isTest = false; + expect(testAppLocalization.strictTranslate("Recover"), "रिकवर कर लेंगे"); + + testAppLocalization = + await appLocalizationsDelgate.load(const Locale('fr')); + + // In test mode + testAppLocalization.isTest = true; + expect(testAppLocalization.strictTranslate("Recover"), "Recover"); + + // In prod mode + testAppLocalization.isTest = false; + expect(testAppLocalization.strictTranslate("Recover"), "votre mot"); + }); + + test("App Localization Delegate should not reload", () async { + expect( + appLocalizationsDelgate.shouldReload(appLocalizationsDelgate), + false, + ); + }); + }); +} diff --git a/test/utils/comment_queries_test.dart b/test/utils/comment_queries_test.dart new file mode 100644 index 000000000..d9b34b9b7 --- /dev/null +++ b/test/utils/comment_queries_test.dart @@ -0,0 +1,43 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/utils/comment_queries.dart'; + +void main() { + group("Tests for comment_queries.dart", () { + test("Check if getPostsComments works correctly", () { + const data = """ + query { + post(id: "abc") + { _id, + comments{ + _id, + text, + createdAt + creator{ + firstName + lastName + } + } + } + } +"""; + final fnData = CommentQueries().getPostsComments("abc"); + expect(fnData, data); + }); + + test("Check if createComment works correctly", () { + const data = """ + mutation createComment(\$postId: ID!, \$text: String!) { + createComment(postId: \$postId, + data:{ + text: \$text, + } + ){ + _id + } + } + """; + final fnData = CommentQueries().createComment(); + expect(fnData, data); + }); + }); +} diff --git a/test/utils/encryptor_test.dart b/test/utils/encryptor_test.dart new file mode 100644 index 000000000..4c311a665 --- /dev/null +++ b/test/utils/encryptor_test.dart @@ -0,0 +1,139 @@ +import 'dart:convert'; +import 'dart:typed_data'; + +import 'package:crypto/crypto.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:pointycastle/api.dart' as pointy; +import 'package:pointycastle/asymmetric/oaep.dart'; +import 'package:pointycastle/asymmetric/rsa.dart'; +import 'package:pointycastle/pointycastle.dart'; +import 'package:talawa/models/asymetric_keys/asymetric_keys.dart'; +import 'package:talawa/utils/encryptor.dart'; +import '../helpers/setup_hive.mocks.dart'; + +// This test is being written believing that in future when Encryptor class will get rid of shouldEncrypt variable then all the tests using that variable can be removed +void main() { + group('When shouldEncrypt is true', () { + test('encryptString method should return the encrypted string', () { + Encryptor.shouldEncrypt = true; + const String inputString = 'password123'; + final String outputString = + sha256.convert(utf8.encode(inputString)).toString(); + expect(Encryptor.encryptString(inputString), outputString); + }); + }); +// As the bool variable is not used anywhere except in this method so moving ahead with making this variable as false +// On getting rid of this variable the above test can be removed + group('When shouldEncrypt is false', () { + late Encryptor encryptor; + late AsymmetricKeyPair keyPair; + late pointy.PublicKey publicKey; + late MockHiveInterface mockHiveInterface; + late MockBox mockHiveBox; + setUpAll(() { + encryptor = Encryptor(); + Encryptor.shouldEncrypt = false; + keyPair = encryptor.generateRSAKeyPair(); + publicKey = keyPair.publicKey; + mockHiveInterface = MockHiveInterface(); + mockHiveBox = MockBox(); + }); + test('encryptString method should return the same string', () { + const String inputString = 'password123'; + expect(Encryptor.encryptString(inputString), inputString); + }); + test( + 'Correct security options are added while generating keys from generateRSAKeyPair method', + () { + expect(publicKey, isA()); + final RSAPublicKey key = publicKey as RSAPublicKey; + expect(key.publicExponent, BigInt.parse('65537')); + expect(key.modulus!.bitLength, 2048); + }); + test( + 'Checking whether Box Names and Key Names are appropriate for Hive or not', + () async { + when(mockHiveInterface.openBox('user_keys')) + .thenAnswer((realInvocation) async { + return mockHiveBox; + }); + await encryptor.saveKeyPair(keyPair, mockHiveInterface); + verify(mockHiveInterface.openBox('user_keys')); + verify(mockHiveBox.put('key_pair', any)); + }); + test('For loadPairKey()', () async { + when(mockHiveInterface.openBox('user_keys')) + .thenAnswer((realInvocation) async { + return mockHiveBox; + }); + when(mockHiveBox.get('key_pair')) + .thenAnswer((realInvocation) => AsymetricKeys(keyPair: keyPair)); + await encryptor.loadKeyPair(mockHiveInterface); + verify(mockHiveBox.get('key_pair')); + }); + test( + 'For checking whether the data is properly encrypted through RSA by assymetricEncryptString()', + () { + const String data = 'Hello Talawa'; + final output = encryptor.assymetricEncryptString( + data, + keyPair.publicKey as RSAPublicKey, + ); + final cipher = OAEPEncoding(RSAEngine()) + ..init(false, PrivateKeyParameter(keyPair.privateKey)); + final decryptedBytes = cipher.process(base64Decode(output)); + expect(String.fromCharCodes(decryptedBytes), data); + }); + test( + 'For checking whether the data is getting decrypted properly through assymetricDecryptString()', + () { + const String data = 'Hello Talawa'; + final cipher = OAEPEncoding(RSAEngine()) + ..init(true, PublicKeyParameter(keyPair.publicKey)); + final encryptedBytes = cipher.process(Uint8List.fromList(data.codeUnits)); + final output = encryptor.assymetricDecryptString( + base64Encode(encryptedBytes), + keyPair.privateKey as RSAPrivateKey, + ); + expect(output, data); + }); + test('Test for wrong message sent to receiveMessage()', () { + const Map message = {"message": "Hello Talawa"}; + expect( + encryptor.receiveMessage(message, mockHiveInterface), + throwsException, + ); + }); + test('Unencrypted message sent to receiveMessage()', () { + const Map message = {"encryptedMessage": "Hello Talawa"}; + when(mockHiveInterface.openBox('user_keys')) + .thenAnswer((realInvocation) async { + return mockHiveBox; + }); + when(mockHiveBox.get('key_pair')) + .thenAnswer((realInvocation) => AsymetricKeys(keyPair: keyPair)); + expect( + encryptor.receiveMessage(message, mockHiveInterface), + throwsException, + ); + }); + test('Encrypted Message sent to receiveMessage()', () { + const String data = 'Hello Talawa'; + final cipher = OAEPEncoding(RSAEngine()) + ..init(true, PublicKeyParameter(keyPair.publicKey)); + final encryptedBytes = cipher.process(Uint8List.fromList(data.codeUnits)); + final String encryptedMessge = base64Encode(encryptedBytes); + final Map message = { + "encryptedMessage": encryptedMessge, + }; + when(mockHiveInterface.openBox('user_keys')) + .thenAnswer((realInvocation) async { + return mockHiveBox; + }); + when(mockHiveBox.get('key_pair')) + .thenAnswer((realInvocation) => AsymetricKeys(keyPair: keyPair)); + expect(encryptor.receiveMessage(message, mockHiveInterface), completes); + }); + }); +} diff --git a/test/utils/event_queries_test.dart b/test/utils/event_queries_test.dart new file mode 100644 index 000000000..83342ae37 --- /dev/null +++ b/test/utils/event_queries_test.dart @@ -0,0 +1,151 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/utils/event_queries.dart'; + +void main() { + group("Tests for event_queries.dart", () { + test("Check if fetchOrgEvents works correctly", () { + const data = """ + query { + eventsByOrganizationConnection( + where: { + organization_id: "sampleID" + } + ) { + _id + organization { + _id + image + } + title + description + isPublic + isRegisterable + recurring + startDate + endDate + allDay + startTime + endTime + location + creator { + _id + firstName + lastName + } + admins { + _id + firstName + lastName + } + attendees { + _id + firstName + lastName + image + } + } + } + """; + + final fnData = EventQueries().fetchOrgEvents("sampleID"); + expect(fnData, data); + }); + + test("Check if attendeesByEvent works correctly", () { + const data = ''' + query { + getEventAttendeesByEventId(eventId: "sampleID") { + eventId + userId + isRegistered + isInvited + isCheckedIn + isCheckedOut + } + } + '''; + + final fnData = EventQueries().attendeesByEvent("sampleID"); + expect(fnData, data); + }); + + test("Check if addEvent works correctly", () { + const data = """ + mutation Mutation(\$data: EventInput!, \$recurrenceRuleData: RecurrenceRuleInput) { + createEvent(data: \$data, recurrenceRuleData: \$recurrenceRuleData) { + _id + title + description + } + } + """; + + final fnData = EventQueries().addEvent(); + expect(fnData, data); + }); + + test("Check if registerForEvent works correctly", () { + const data = """ + mutation registerForEvent(\$eventId: ID!) { + registerForEvent(id: \$eventId) { + _id + } + } + """; + + final fnData = EventQueries().registerForEvent(); + expect(fnData, data); + }); + + test("Check if deleteEvent works correctly", () { + const data = """ + mutation { + removeEvent( + id: "sampleID", + ){ + _id + } + } + """; + + final fnData = EventQueries().deleteEvent("sampleID"); + expect(fnData, data); + }); + + test("Check if updateEvent works correctly", () { + const data = """mutation updateEvent( + \$title:String!, + \$description: String!, + \$startTime: Time, + \$endTime: Time, + \$allDay: Boolean!, + \$recurring: Boolean!, + \$isPublic: Boolean!, + \$isRegisterable: Boolean!, + \$location: String, + ) { + updateEvent( + id: "sampleID" + data:{ + title: \$title, + description: \$description, + isPublic: \$isPublic, + isRegisterable: \$isRegisterable, + recurring: \$recurring, + allDay: \$allDay, + startTime: \$startTime + endTime: \$endTime + location: \$location + } + ){ + _id + title + description + } + }"""; + + final fnData = EventQueries().updateEvent(eventId: "sampleID"); + expect(fnData, data); + }); + }); +} diff --git a/test/utils/post_queries_test.dart b/test/utils/post_queries_test.dart new file mode 100644 index 000000000..ae4ee73bb --- /dev/null +++ b/test/utils/post_queries_test.dart @@ -0,0 +1,188 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/utils/post_queries.dart'; + +void main() { + group("Tests for post_queries.dart", () { + test("Check if getPostsById works correctly", () { + const first = 5; + const last = 5; + const data = """ + query { + organizations(id: "sampleID") { + posts(first: $first, last:$last,after: "1", before: "2") { + edges { + node { + _id + title + text + imageUrl + videoUrl + creator { + _id + firstName + lastName + email + } + createdAt + likeCount + commentCount + likedBy{ + _id + } + comments{ + _id + } + pinned + } + cursor + } + pageInfo { + startCursor + endCursor + hasNextPage + hasPreviousPage + } + totalCount + } + } + } +"""; + final fnData = PostQueries().getPostsById("sampleID", "1", "2", 5, 5); + expect(fnData, data); + }); + + test("Check if addLike works correctly", () { + const data = """ + mutation likePost(\$postID: ID!) { + likePost( id: \$postID,) + { + _id + } + } + """; + final fnData = PostQueries().addLike(); + expect(fnData, data); + }); + + test("Check if getPostById works correctly", () { + const data = """ + query { + post(id: "abc") + { + _id + text + createdAt + imageUrl + videoUrl + title + commentCount + likeCount + creator{ + _id + firstName + lastName + image + } + organization{ + _id + } + likedBy{ + _id + } + comments{ + _id, + text, + createdAt + creator{ + firstName + lastName + } + } + } + } +"""; + final fnData = PostQueries().getPostById("abc"); + expect(fnData, data); + }); + + test("Check if removeLike works correctly", () { + const data = """ + mutation unlikePost(\$postID: ID!) { + unlikePost( id: \$postID,) + { + _id + likedBy{ + _id + } + } + } + """; + final fnData = PostQueries().removeLike(); + expect(fnData, data); + }); + + test("Check if removePost works correctly", () { + const data = ''' + mutation RemovePost(\$id: ID!) { + removePost(id: \$id) { + _id + } + } + '''; + final fnData = PostQueries().removePost(); + expect(fnData, data); + }); + test("Check if uploadPost works correctly", () { + const data = ''' + mutation CreatePost( + \$text: String! + \$title: String! + \$imageUrl: URL + \$videoUrl: URL + \$organizationId: ID! + \$file: String + ) { + createPost( + data: { + text: \$text + title: \$title + imageUrl: \$imageUrl + videoUrl: \$videoUrl + organizationId: \$organizationId + } + file: \$file + ) { + _id + text + createdAt + imageUrl + videoUrl + title + commentCount + likeCount + creator{ + _id + firstName + lastName + image + } + organization{ + _id + } + likedBy{ + _id + } + comments{ + _id + } + } + } + '''; + final fnData = PostQueries().uploadPost(); + expect(fnData, data); + }); + }); +} diff --git a/test/utils_tests/chat_queries_test.dart b/test/utils_tests/chat_queries_test.dart new file mode 100644 index 000000000..0930af861 --- /dev/null +++ b/test/utils_tests/chat_queries_test.dart @@ -0,0 +1,141 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/utils/chat_queries.dart'; + +void main() { + group("Tests for chat_queries.dart", () { + test("Check if fetchDirectChatsByUserId works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = ChatQueries().fetchDirectChatsByUserId('Ayush'); + if (fnData.contains(''' + query { + directChatsByUserID(id: "Ayush") { + _id + users{ + _id + firstName + email + } + } + } + ''')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if fetchDirectChatMessagesByChatId works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = ChatQueries().fetchDirectChatMessagesByChatId('Ayush'); + if (fnData.contains(''' + query { + directChatsMessagesByChatID(id: "Ayush") { + _id + messageContent + sender { + _id + firstName + image + } + receiver { + _id + firstName + image + } + } + } + ''')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if messageSentToDirectChatsubscription works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = ChatQueries().messageSentToDirectChatsubscription; + if (fnData.contains(''' + subscription{ + messageSentToDirectChat{ + _id + messageContent + sender { + _id + firstName + image + } + receiver { + _id + firstName + image + } + } + } + ''')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if sendMessageToDirectChat works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = ChatQueries().sendMessageToDirectChat(); + if (fnData.contains(''' + mutation sendMessageToDirectChat( + \$chatId: ID! + \$messageContent: String! + ){ + sendMessageToDirectChat( + chatId: \$chatId + messageContent: \$messageContent + ) { + messageContent + sender{ + firstName + } + receiver{ + firstName + } + } + } + ''')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if sendMessageToDirectChat works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = ChatQueries().sendMessageToDirectChat(); + if (fnData.contains(''' + mutation sendMessageToDirectChat( + \$chatId: ID! + \$messageContent: String! + ){ + sendMessageToDirectChat( + chatId: \$chatId + messageContent: \$messageContent + ) { + messageContent + sender{ + firstName + } + receiver{ + firstName + } + } + } + ''')) { + mutation = true; + } + expect(mutation, true); + }); + }); +} diff --git a/test/utils_tests/queries_test.dart b/test/utils_tests/queries_test.dart new file mode 100644 index 000000000..cdb43da4d --- /dev/null +++ b/test/utils_tests/queries_test.dart @@ -0,0 +1,225 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/utils/queries.dart'; + +void main() { + group("Tests for queries.dart", () { + test("Check if registerUser works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = Queries().registerUser( + 'Ayush', + 'Chaudhary', + 'ayush@gmail.com', + 'password', + 'orgId123', + ); + if (fnData.contains('Ayush')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if loginUser works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = Queries().loginUser('ayush@gmail.com', 'password'); + if (fnData.contains('ayush@gmail.com')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if logout works correctly", () { + const mutation = false; + expect(mutation, false); + + const data = """ + mutation { + logout + } + """; + final fnData = Queries().logout(); + expect(fnData, data); + }); + test("Check if fetchJoinInOrg works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = Queries(); + final ff = fnData.fetchJoinInOrg; + if (ff.contains('query organizationsConnection')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if newUserLanguage works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = Queries().newUserLanguage('12345'); + if (fnData.contains('12345')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if fetchJoinInOrgByName works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = Queries(); + final ff = fnData.fetchJoinInOrgByName; + if (ff.contains('query organizationsConnection')) { + mutation = true; + } + expect(mutation, true); + }); + + test("Check if joinOrgById works correctly", () { + var mutation = false; + + expect(mutation, false); + + final fnData = Queries().joinOrgById('orgId123'); + if (fnData.contains('orgId123')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if sendMembershipRequest works correctly", () { + var mutation = false; + + expect(mutation, false); + + final fnData = Queries().sendMembershipRequest('orgId123'); + if (fnData.contains('orgId123')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if refreshToken works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = Queries().refreshToken('orgId123'); + if (fnData.contains('orgId123')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if updateLanguage works correctly", () { + var mutation = false; + + expect(mutation, false); + final fnData = Queries().updateLanguage('orgId123'); + if (fnData.contains('orgId123')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if getPluginsList works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = Queries().getPluginsList(); + if (fnData.contains('getPlugins')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if fetchOrgById works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = Queries().fetchOrgById('orgId123'); + if (fnData.contains('orgId123')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if userlanguage works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = Queries().userLanguage(); + if (fnData.contains('myLanguage')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if fetchJoinInOrgByName works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = Queries(); + final ff = fnData.fetchJoinInOrgByName; + if (ff.contains('query organizationsConnection')) { + mutation = true; + } + expect(mutation, true); + }); + + test("Check if newUserLanguage works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = Queries().newUserLanguage('12345'); + if (fnData.contains('12345')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if fetchOrgDetailsById works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = Queries().fetchOrgDetailsById('12345'); + if (fnData.contains('12345')) { + mutation = true; + } + expect(mutation, true); + }); + + test("Check if getPluginsList works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = Queries().getPluginsList(); + if (fnData.contains('getPlugins')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if createDonation works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = Queries().createDonation( + 'userId', + 'userId', + 'userId', + 'userId', + 'userId', + 12, + ); + if (fnData.contains('userId')) { + mutation = true; + } + expect(mutation, true); + }); + test("Check if updateUserProfile works correctly", () { + var mutation = false; + expect(mutation, false); + + final fnData = Queries().updateUserProfile(); + + if (fnData.contains('mutation UpdateUserProfile') && + fnData.contains('updateUserProfile')) { + mutation = true; + } + expect(mutation, true); + }); + }); +} diff --git a/test/utils_tests/validators_test.dart b/test/utils_tests/validators_test.dart new file mode 100644 index 000000000..97ed6f72b --- /dev/null +++ b/test/utils_tests/validators_test.dart @@ -0,0 +1,244 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/utils/validators.dart'; + +void main() { + group( + 'Test Validator', + () { + group('Test validateURL', () { + test('Test validateURL when value is empty', () { + final result = Validator.validateURL(''); + + expect(result, 'Please verify URL first'); + }); + + test('Test validateURL when value is not absolute', () { + final result = Validator.validateURL('path/resource'); + + expect(result, 'Enter a valid URL'); + }); + + test('Test validateURL when value is not absolute', () { + final result = Validator.validateURL('https://domain/path/resource'); + + expect(result, null); + }); + }); + + group('Test validateFirstName', () { + test('Test validateFirstName when value is empty', () { + final result = Validator.validateFirstName(''); + + expect(result, 'Firstname must not be left blank.'); + }); + + test('Test validateFirstName when value does not match regex pattern', + () { + final result = Validator.validateFirstName('123'); + + expect(result, 'Invalid Firstname'); + }); + + test('Test validateFirstName when value match regex pattern', () { + final result = Validator.validateFirstName('Name'); + + expect(result, null); + }); + }); + + group('Test validateLastName', () { + test('Test validateLastName when value is empty', () { + final result = Validator.validateLastName(''); + + expect(result, 'Lastname must not be left blank.'); + }); + + test('Test validateLastName when value does not match regex pattern', + () { + final result = Validator.validateLastName('123'); + + expect(result, 'Invalid Lastname'); + }); + + test('Test validateLastName when value match regex pattern', () { + final result = Validator.validateLastName('Name'); + + expect(result, null); + }); + }); + + group('Test validateEmail', () { + test('Test validateEmail when value is empty', () { + final result = Validator.validateEmail(''); + + expect(result, 'Email must not be left blank'); + }); + + test('Test validateEmail when value does not match regex pattern', () { + final List invalidEmailList = [ + 'plainaddress', + '#@%^%#\$@#\$@#.com', + '@example.com', + 'Joe Smith ', + 'email.example.com', + 'email@example@example.com', + 'email@example.com (Joe Smith)', + ]; + + for (final String email in invalidEmailList) { + final result = Validator.validateEmail(email); + + expect(result, 'Please enter a valid Email Address'); + } + }); + + test('Test validateEmail when value match regex pattern', () { + final List validEmailList = [ + 'email@example.com', + 'firstname.lastname@example.com', + 'firstname+lastname@example.com', + 'email@example.name', + 'email@example.museum', + 'email@example.co.jp', + 'firstname-lastname@example.com', + ]; + + for (final String email in validEmailList) { + final result = Validator.validateEmail(email); + + expect(result, null); + } + }); + }); + + group( + 'Test validatePassword', + () { + test('Test validatePassword when value is empty', () { + final result = Validator.validatePassword(''); + + expect(result, 'Password must not be left blank'); + }); + + test('Test validatePassword when value has spaces', () { + final result = Validator.validatePassword('password with spaces'); + + expect(result, 'Password must not contain spaces'); + }); + + test('Test validatePassword when value does not match regex pattern', + () { + final List invalidPassword = [ + '12345678', + 'not8len', + 'notcapital', + 'NOSMALL', + 'nonum', + 'NoSpecialChar123', + ]; + + for (final String password in invalidPassword) { + final result = Validator.validatePassword(password); + + expect( + result, + 'Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,\$,etc.)', + ); + } + }); + + test('Test validatePassword when value match regex pattern', () { + final result = Validator.validatePassword('ValidPassword123@'); + + expect(result, null); + }); + }, + ); + + group( + 'Test validateUrlExistence', + () { + test('Test validateUrlExistence when url is not present', () async { + final result = await Validator() + .validateUrlExistence('https://nnnoootttaaasssiiittteee.com'); + + expect(result, false); + }); + + test('Test validateUrlExistence when url is not present', () async { + final result = await Validator().validateUrlExistence( + 'https://www.google.com', + ); + + expect(result, true); + }); + }, + ); + + group( + 'Test validatePasswordConfirm', + () { + test( + 'Test validatePasswordConfirm when value is not matching with comparator', + () { + final result = Validator.validatePasswordConfirm( + 'Password123@', + 'Password1234@', + ); + + expect(result, 'Password does not match original'); + }); + + test( + 'Test validatePasswordConfirm when value is matching with comparator', + () { + final result = Validator.validatePasswordConfirm( + 'Password123@', + 'Password123@', + ); + + expect(result, null); + }); + }, + ); + + group( + 'Test validateEventForm', + () { + test('Test validateEventForm when value is empty', () { + final result = Validator.validateEventForm('', 'label'); + + expect(result, 'label must not be left blank.'); + }); + + test('Test validateEventForm when value does not match regex pattern', + () { + final result = Validator.validateEventForm('12345', 'label'); + + expect(result, 'Invalid label'); + }); + + test('Test validateEventForm when value match regex pattern', () { + final result = Validator.validateEventForm('12345Name', 'label'); + + expect(result, null); + }); + + test('Test validateEventTime for start time greater than end time', + () { + const startTime = TimeOfDay(hour: 14, minute: 30); + const endTime = TimeOfDay(hour: 12, minute: 30); + + final result = Validator.validateEventTime(startTime, endTime); + + expect(result, 'Start time must be before or equal to end time'); + }); + }, + ); + }, + ); +} diff --git a/test/view_model_tests/access_request_view_model_test.dart b/test/view_model_tests/access_request_view_model_test.dart new file mode 100644 index 000000000..e6a63d6a5 --- /dev/null +++ b/test/view_model_tests/access_request_view_model_test.dart @@ -0,0 +1,139 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/view_model/access_request_view_model.dart'; +import '../helpers/test_helpers.dart'; +import '../helpers/test_locator.dart'; + +class MockCallbackFunction extends Mock { + void call(); +} + +void main() { + testSetupLocator(); + + setUpAll(() { + registerServices(); + }); + + group( + "AccessScreenViewModel Test- ", + () { + test("Check if it's initialized correctly", () { + final org = userConfig.currentOrg; + final model = AccessScreenViewModel(); + expect(model.selectedOrganization.id, '-1'); + model.initialise(org); + expect(model.selectedOrganization.id, 'XYZ'); + }); + + test( + "Check if snackbar is showing in case of not empty joined organization", + () async { + final org = userConfig.currentOrg; + final model = AccessScreenViewModel(); + model.initialise(org); + + when( + databaseFunctions.gqlAuthMutation( + queries.sendMembershipRequest(org.id!), + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions( + document: gql(queries.sendMembershipRequest(org.id!)), + ), + data: { + 'sendMembershipRequest': { + 'organization': { + '_id': 'XYZ', + 'name': 'Organization Name', + 'image': null, + 'description': null, + 'userRegistrationRequired': true, + 'creator': { + 'firstName': 'ravidi', + 'lastName': 'shaikh', + 'image': null, + }, + }, + }, + }, + source: QueryResultSource.network, + ), + ); + + await model.sendMembershipRequest(); + + verify( + databaseFunctions.gqlAuthMutation( + queries.sendMembershipRequest(org.id!), + ), + ); + + verify(locator().pop()); + verify( + locator().showTalawaErrorSnackBar( + "Join in request sent to Organization Name successfully", + MessageType.info, + ), + ); + }); + + test("Removing joined organizations for testing", () async { + getAndRegisterUserConfig(); + final org = userConfig.currentOrg; + userConfig.currentUser.joinedOrganizations = []; + final model = AccessScreenViewModel(); + model.initialise(org); + + when( + databaseFunctions.gqlAuthMutation( + queries.sendMembershipRequest(org.id!), + ), + ).thenAnswer( + (_) async => QueryResult( + options: QueryOptions( + document: gql(queries.sendMembershipRequest(org.id!)), + ), + data: { + 'sendMembershipRequest': { + 'organization': { + '_id': 'XYZ', + 'name': 'Organization Name', + 'image': null, + 'description': null, + 'userRegistrationRequired': true, + 'creator': { + 'firstName': 'ravidi', + 'lastName': 'shaikh', + 'image': null, + }, + }, + }, + }, + source: QueryResultSource.network, + ), + ); + + await model.sendMembershipRequest(); + + verify( + databaseFunctions.gqlAuthMutation( + queries.sendMembershipRequest(org.id!), + ), + ); + + verify( + locator().removeAllAndPush( + Routes.waitingScreen, + Routes.splashScreen, + ), + ); + }); + }, + ); +} diff --git a/test/view_model_tests/after_auth_view_model_tests/add_post_view_model_test.dart b/test/view_model_tests/after_auth_view_model_tests/add_post_view_model_test.dart new file mode 100644 index 000000000..2a00ad6dd --- /dev/null +++ b/test/view_model_tests/after_auth_view_model_tests/add_post_view_model_test.dart @@ -0,0 +1,261 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/services/third_party_service/multi_media_pick_service.dart'; +import 'package:talawa/utils/post_queries.dart'; +import 'package:talawa/view_model/after_auth_view_models/add_post_view_models/add_post_view_model.dart'; + +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_locator.dart'; + +class MockCallbackFunction extends Mock { + void call(); +} + +final demoJson = { + 'createPost': { + '__typename': 'Post', + '_id': '1', + 'text': 'text #hastag', + 'createdAt': '2023-11-13T19:28:21.095Z', + 'imageUrl': 'https://imageurl', + 'videoUrl': 'https://videoUrl', + 'title': 'demo title', + 'commentCount': 0, + 'likeCount': 0, + 'creator': { + '__typename': 'User', + '_id': '1', + 'firstName': 'Ayush', + 'lastName': 'Raghuwanshi', + 'image': 'https://imageUrl', + }, + 'organization': {'__typename': 'Organization', '_id': '1'}, + 'likedBy': [], + 'comments': [], + }, +}; + +void main() { + testSetupLocator(); + setUp(() { + registerServices(); + getAndRegisterImageService(); + }); + group("AddPostViewModel Test - ", () { + test("Check if it's initialized correctly", () { + final model = AddPostViewModel(); + model.initialise(); + + expect(model.imageFile, null); + expect(model.orgName, userConfig.currentOrg.name); + expect( + model.userName, + userConfig.currentUser.firstName! + userConfig.currentUser.lastName!, + ); + }); + + test('Test for imageInBase64 getter', () async { + final model = AddPostViewModel(); + model.initialise(); + expect(model.imageInBase64, null); + }); + + test("Check if getImageFromGallery() is working fine", () async { + final model = AddPostViewModel(); + model.initialise(); + + when(locator().getPhotoFromGallery()) + .thenAnswer((_) async { + return null; + }); + + await model.getImageFromGallery(); + verify(locator().getPhotoFromGallery()); + expect(model.imageFile, null); + }); + test("Check if getImageFromGallery() is working fine (camera is true)", + () async { + final notifyListenerCallback = MockCallbackFunction(); + final model = AddPostViewModel()..addListener(notifyListenerCallback); + model.initialise(); + + final file = File('fakePath'); + when(locator().getPhotoFromGallery(camera: true)) + .thenAnswer((_) async { + return file; + }); + + await model.getImageFromGallery(camera: true); + + verify( + locator().getPhotoFromGallery(camera: true), + ); + verify( + locator().showTalawaErrorSnackBar( + "Image is added", + MessageType.info, + ), + ); + + expect(model.imageFile, file); + + verify(notifyListenerCallback()); + }); + test("Check if upload post works correctly", () async { + final dataBaseMutationFunctions = locator(); + final notifyListenerCallback = MockCallbackFunction(); + final model = AddPostViewModel()..addListener(notifyListenerCallback); + model.initialise(); + when( + dataBaseMutationFunctions.gqlAuthMutation( + PostQueries().uploadPost(), + variables: { + "text": " #", + "organizationId": 'XYZ', + "title": '', + }, + ), + ).thenAnswer( + (realInvocation) async => QueryResult( + options: QueryOptions(document: gql(PostQueries().uploadPost())), + data: demoJson, + source: QueryResultSource.network, + ), + ); + + await model.uploadPost(); + verify( + locator().showTalawaErrorSnackBar( + "Post is uploaded", + MessageType.info, + ), + ); + // verify( + // locator().gqlAuthMutation( + // query, + // variables: { + // "text": "", + // "organizationId": "XYZ", + // "title": "", + // "file":"", + // }, + // ), + // ); + verify(notifyListenerCallback()); + }); + test('uploadPost with _imageFile != null and throws no exception', + () async { + final dataBaseMutationFunctions = locator(); + final viewModel = AddPostViewModel(); + viewModel.initialise(); + final mockImageFile = File( + 'path/to/mockImage.png', + ); + viewModel.setImageFile(mockImageFile); + + await viewModel.setImageInBase64(mockImageFile); + + viewModel.controller.text = "Some post content"; + viewModel.textHashTagController.text = "hashtag"; + viewModel.titleController.text = "Post Title"; + when( + dataBaseMutationFunctions.gqlAuthMutation( + PostQueries().uploadPost(), + variables: { + "text": 'Some post content', + "organizationId": 'XYZ', + "title": 'Post Title', + "file": 'data:image/png;base64,', + }, + ), + ).thenAnswer( + (realInvocation) async => QueryResult( + options: QueryOptions(document: gql(PostQueries().uploadPost())), + data: demoJson, + source: QueryResultSource.network, + ), + ); + + await viewModel.uploadPost(); + verify( + locator().showTalawaErrorSnackBar( + "Post is uploaded", + MessageType.info, + ), + ).called(1); + }); + test('uploadPost with _imageFile == null', () async { + final viewModel = AddPostViewModel(); + viewModel.initialise(); + viewModel.controller.text = "Some post content"; + viewModel.textHashTagController.text = "hashtag"; + viewModel.titleController.text = "Post Title"; + when( + locator().gqlAuthMutation( + PostQueries().uploadPost(), + variables: anyNamed('variables'), + ), + ).thenThrow(Exception("exception")); + + await viewModel.uploadPost(); + verify( + locator().showTalawaErrorSnackBar( + "Something went wrong", + MessageType.error, + ), + ).called(1); + }); + test('uploadPost with _imageFile != null', () async { + final viewModel = AddPostViewModel(); + viewModel.initialise(); + final mockImageFile = File( + 'path/to/mockImage.png', + ); + viewModel.setImageFile(mockImageFile); + + await viewModel.setImageInBase64(mockImageFile); + viewModel.controller.text = "Some post content"; + viewModel.textHashTagController.text = "hashtag"; + viewModel.titleController.text = "Post Title"; + when( + locator().gqlAuthMutation( + PostQueries().uploadPost(), + variables: anyNamed('variables'), + ), + ).thenThrow(Exception("exception")); + + await viewModel.uploadPost(); + verify( + locator().showTalawaErrorSnackBar( + "Something went wrong", + MessageType.error, + ), + ).called(1); + }); + test("Check if remove_image method works correctly", () async { + final notifyListenerCallback = MockCallbackFunction(); + final model = AddPostViewModel()..addListener(notifyListenerCallback); + + model.initialise(); + + final file = File('fakePath'); + when(locator().getPhotoFromGallery(camera: true)) + .thenAnswer((_) async { + return file; + }); + + await model.getImageFromGallery(camera: true); + model.removeImage(); + expect(model.imageFile, null); + }); + }); +} diff --git a/test/view_model_tests/after_auth_view_model_tests/chat_view_models_test/direct_chat_view_model_test.dart b/test/view_model_tests/after_auth_view_model_tests/chat_view_models_test/direct_chat_view_model_test.dart new file mode 100644 index 000000000..f460d80a8 --- /dev/null +++ b/test/view_model_tests/after_auth_view_model_tests/chat_view_models_test/direct_chat_view_model_test.dart @@ -0,0 +1,149 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'dart:async'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/models/chats/chat_list_tile_data_model.dart'; +import 'package:talawa/models/chats/chat_message.dart'; +import 'package:talawa/models/chats/chat_user.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/chat_service.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/view_model/after_auth_view_models/chat_view_models/direct_chat_view_model.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +void main() { + registerServices(); + + group('Test DirectChatViewModel', () { + final DirectChatViewModel directChatViewModel = DirectChatViewModel(); + final ChatService chatService = locator(); + final UserConfig userConfig = locator(); + + test('Test DirectChatViewModel extends BaseModel', () { + expect(directChatViewModel, isA()); + }); + + test('Test initial value of fields in DirectChatViewModel', () { + expect(directChatViewModel.listKey, isA>()); + expect(directChatViewModel.chatState, ChatState.initial); + expect(directChatViewModel.chats, []); + expect(directChatViewModel.chatMessagesByUser, {}); + }); + + test('Test refreshChats', () { + directChatViewModel.refreshChats(); + expect(directChatViewModel.chats, []); + }); + + test('Test initialise', () async { + final chats = directChatViewModel.chats; + + final future = directChatViewModel.initialise(); + + expect(directChatViewModel.chatState, ChatState.loading); + await future; + expect(directChatViewModel.chats, chats); + expect(directChatViewModel.chatState, ChatState.complete); + }); + + test('Test getChatMessages', () async { + final ChatMessage chatMessage = + ChatMessage('11', null, 'message11', null); + final StreamController chatMessageController = + StreamController(); + final Stream messagestream = + chatMessageController.stream.asBroadcastStream(); + + when(chatService.chatMessagesStream) + .thenAnswer((realInvocation) => messagestream); + when(chatService.getDirectChatMessagesByChatId('1')).thenAnswer( + (realInvocation) async => chatMessageController.add(chatMessage), + ); + + final future = directChatViewModel.getChatMessages('1'); + + expect(directChatViewModel.chatMessagesByUser, {}); + expect(directChatViewModel.chatState, ChatState.loading); + + await future; + + expect(directChatViewModel.chatMessagesByUser['1'], [chatMessage]); + expect(directChatViewModel.chatState, ChatState.complete); + }); + + test('Test sendMessageToDirectChat', () async { + final List chatMessages = [ + ChatMessage('11', null, 'message11', null), + ChatMessage('22', null, 'message22', null), + ]; + final StreamController chatMessageController = + StreamController(); + final Stream messagestream = + chatMessageController.stream.asBroadcastStream(); + + when(chatService.chatMessagesStream) + .thenAnswer((realInvocation) => messagestream); + when(chatService.getDirectChatMessagesByChatId('1')).thenAnswer( + (realInvocation) async => chatMessageController.add(chatMessages[0]), + ); + when(chatService.sendMessageToDirectChat('1', 'content')).thenAnswer( + (realInvocation) async => chatMessageController.add(chatMessages[1]), + ); + + await directChatViewModel.getChatMessages('1'); + final future = + directChatViewModel.sendMessageToDirectChat('1', 'content'); + + expect(directChatViewModel.chatState, ChatState.loading); + + await future; + + for (int index = 0; index < chatMessages.length; index++) { + final message = directChatViewModel.chatMessagesByUser['1']![index]; + expect(message.id, chatMessages[index].id); + } + + expect(directChatViewModel.chatState, ChatState.complete); + }); + + test('Test chatName', () async { + final User currentUser = User(id: '1', firstName: 'first_user'); + final ChatUser user1 = ChatUser(id: '1', firstName: 'first_user'); + final ChatUser user2 = ChatUser(id: '2', firstName: 'second_user'); + final List users = [ + user1, + user2, + ]; + final ChatListTileDataModel chatListTileDataModel = + ChatListTileDataModel(users, 'chat_id'); + final StreamController controller = + StreamController(); + final Stream stream = controller.stream; + + when(chatService.chatListStream).thenAnswer((realInvocation) { + return stream; + }); + when(chatService.getDirectChatsByUserId()).thenAnswer( + (realInvocation) async => controller.add(chatListTileDataModel), + ); + when(userConfig.currentUser).thenAnswer((realInvocation) => currentUser); + + await directChatViewModel.initialise(); + directChatViewModel.chatName('chat_id'); + + expect(directChatViewModel.name, 'second_user'); + }); + + test('Test dispose', () { + directChatViewModel.dispose(); + }); + }); +} diff --git a/test/view_model_tests/after_auth_view_model_tests/chat_view_models_test/select_contact_view_model_test.dart b/test/view_model_tests/after_auth_view_model_tests/chat_view_models_test/select_contact_view_model_test.dart new file mode 100644 index 000000000..e9bcc87d3 --- /dev/null +++ b/test/view_model_tests/after_auth_view_model_tests/chat_view_models_test/select_contact_view_model_test.dart @@ -0,0 +1,52 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/graphql_config.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/view_model/after_auth_view_models/chat_view_models/select_contact_view_model.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +void main() { + testSetupLocator(); + locator().test(); + locator().test(); + + setUp(() { + registerServices(); + locator().test(); + }); + + tearDown(() { + unregisterServices(); + }); + test("test initialise function of model", () async { + final model = SelectContactViewModel(); + model.initialise(); + }); + test("test to check if getOrgMembersList is working", () async { + final model = SelectContactViewModel(); + model.initialise(); + final User user1 = User(id: "fakeUser1"); + final User user2 = User(id: "fakeUser2"); + final List users = [user1, user2]; + + when(organizationService.getOrgMembersList("XYZ")) + .thenAnswer((realInvocation) async { + return users; + }); + await model.getCurrentOrgUsersList(); + bool working = true; + model.orgMembersList.forEach((user) { + if (user.id == null) { + working = false; + } + }); + + expect(working, true); + }); +} diff --git a/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/create_event_view_model_test.dart b/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/create_event_view_model_test.dart new file mode 100644 index 000000000..7c444d6c2 --- /dev/null +++ b/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/create_event_view_model_test.dart @@ -0,0 +1,324 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:intl/intl.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/constants/recurrence_values.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/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/utils/event_queries.dart'; +import 'package:talawa/utils/validators.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/create_event_view_model.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +class MockBuildContext extends Mock implements BuildContext {} + +class MockCallbackFunction extends Mock { + void call(); +} + +Widget createApp( + GlobalKey formKey, + TextEditingController eventTitleTextController, + TextEditingController eventLocationTextController, + TextEditingController eventDescriptionTextController, +) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: Container( + child: Form( + key: formKey, + child: Column( + children: [ + TextFormField( + controller: eventTitleTextController, + ), + TextFormField( + controller: eventLocationTextController, + ), + TextFormField( + controller: eventDescriptionTextController, + ), + ], + ), + ), + ), + ), + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + ); +} + +void main() { + testSetupLocator(); + locator().test(); + locator().test(); + + setUp(() { + registerServices(); + locator().test(); + }); + + tearDown(() { + unregisterServices(); + }); + + group('Create Event Tests', () { + test("test getCurrentOrgUsersList with isAdmin false", () async { + final model = CreateEventViewModel(); + model.initialize(); + + final User user1 = User(id: "fakeUser1"); + final User user2 = User(id: "fakeUser2"); + final List users = [user1, user2]; + + when(organizationService.getOrgMembersList("XYZ")) + .thenAnswer((realInvocation) async { + return users; + }); + + await model.getCurrentOrgUsersList(); + + bool isListCorrect = true; + + users.forEach((user) { + final bool x = model.memberCheckedMap.containsKey(user.id); + if (!x) { + isListCorrect = false; + } + }); + + expect(isListCorrect, true); + }); + + testWidgets("testing createEvent function", (tester) async { + final model = CreateEventViewModel(); + model.initialize(); + await tester.pumpWidget( + createApp( + model.formKey, + model.eventTitleTextController, + model.eventLocationTextController, + model.eventDescriptionTextController, + ), + ); + + final DateTime startMoment = DateTime( + model.eventStartDate.year, + model.eventStartDate.month, + model.eventStartDate.day, + model.eventStartTime.hour, + model.eventStartTime.minute, + ); + final DateTime endMoment = DateTime( + model.eventEndDate!.year, + model.eventEndDate!.month, + model.eventEndDate!.day, + model.eventEndTime.hour, + model.eventEndTime.minute, + ); + + await tester.pump(); + await tester.pumpAndSettle(); + + await tester.enterText( + find.byType(TextFormField).first, + 'fakeEventTitle', + ); + await tester.enterText( + find.byType(TextFormField).last, + 'fakeEventDescription', + ); + await tester.enterText( + find.byType(TextFormField).at(1), + 'fakeEventLocation', + ); + databaseFunctions.init(); + + when(databaseFunctions.refreshAccessToken("testtoken")) + .thenAnswer((realInvocation) async { + return true; + }); + + when( + databaseFunctions.gqlAuthMutation( + EventQueries().addEvent(), + variables: { + 'data': { + 'startDate': DateFormat('yyyy-MM-dd').format(startMoment), + 'endDate': DateFormat('yyyy-MM-dd').format(endMoment), + 'organizationId': 'XYZ', + 'title': model.eventTitleTextController.text, + 'description': model.eventDescriptionTextController.text, + 'location': model.eventLocationTextController.text, + 'isPublic': model.isPublicSwitch, + 'isRegisterable': model.isRegisterableSwitch, + 'recurring': true, + 'recurrance': 'WEEKLY', + 'allDay': true, + 'startTime': '${DateFormat('HH:mm:ss').format(startMoment)}Z', + 'endTime': '${DateFormat('HH:mm:ss').format(endMoment)}Z', + }, + 'recurrenceRuleData': { + 'frequency': 'WEEKLY', + 'weekDays': ['TU'], + }, + }, + ), + ).thenAnswer((_) async { + return true; + }); + + await model.createEvent(); + + verify( + databaseFunctions.gqlAuthMutation( + EventQueries().addEvent(), + variables: { + 'data': { + 'startDate': DateFormat('yyyy-MM-dd').format(startMoment), + 'endDate': DateFormat('yyyy-MM-dd').format(endMoment), + 'organizationId': 'XYZ', + 'title': model.eventTitleTextController.text, + 'description': model.eventDescriptionTextController.text, + 'location': model.eventLocationTextController.text, + 'isPublic': model.isPublicSwitch, + 'isRegisterable': model.isRegisterableSwitch, + 'recurring': true, + 'recurrance': 'WEEKLY', + 'allDay': true, + 'startTime': '${DateFormat('HH:mm:ss').format(startMoment)}Z', + 'endTime': '${DateFormat('HH:mm:ss').format(endMoment)}Z', + }, + 'recurrenceRuleData': { + 'frequency': 'WEEKLY', + 'weekDays': ['TU'], + }, + }, + ), + ); + + verify(navigationService.pop()); + }); + + test("test getImageFromGallery and removeImage functions", () async { + final notifyListenerCallback = MockCallbackFunction(); + final model = CreateEventViewModel()..addListener(notifyListenerCallback); + model.initialize(); + + // testing getImageFromGallery + // with camera false + when(multimediaPickerService.getPhotoFromGallery(camera: false)) + .thenAnswer((realInvocation) async { + return null; + }); + + await model.getImageFromGallery(); + verify(multimediaPickerService.getPhotoFromGallery(camera: false)); + expect(model.imageFile, null); + + // with camera true + final file = File('fakePath'); + when(multimediaPickerService.getPhotoFromGallery(camera: true)) + .thenAnswer((_) async { + return file; + }); + await model.getImageFromGallery(camera: true); + verify(multimediaPickerService.getPhotoFromGallery(camera: true)); + expect(model.imageFile, file); + verify(notifyListenerCallback()); + + // testing removeImage + model.removeImage(); + expect(model.imageFile, null); + verify(notifyListenerCallback()); + }); + + test('check that empty values are not accepted for required fields', () { + final String? emptyTitle = Validator.validateEventForm("", "Title"); + expect(emptyTitle, "Title must not be left blank."); + + final String? emptyLocation = Validator.validateEventForm("", "Location"); + expect(emptyLocation, "Location must not be left blank."); + + final String? emptyDescription = + Validator.validateEventForm("", "Description"); + expect(emptyDescription, "Description must not be left blank."); + }); + + test('Check validators return null for valid values', () { + final String? validTitle = + Validator.validateEventForm("Test Title", "Title"); + expect(validTitle, null); + + final String? validLocation = + Validator.validateEventForm("Test Location", "Location"); + expect(validLocation, null); + + final String? validDescription = + Validator.validateEventForm("Test Description", "Description"); + expect(validDescription, null); + }); + + test('Check addition of members', () { + final model = CreateEventViewModel(); + model.initialize(); + + final List allMembers = + userConfig.currentOrg.members! + userConfig.currentOrg.admins!; + model.orgMembersList = allMembers; + + // non admins (normal members) + final List usersInCurrentOrg = userConfig.currentOrg.members!; + model.memberCheckedMap[usersInCurrentOrg.first.id!] = true; + model.buildUserList(); + final bool isMemberFound = + model.selectedMembers.contains(usersInCurrentOrg.first); + expect(isMemberFound, true); + }); + + test('Removing of members from event', () { + final model = CreateEventViewModel(); + model.initialize(); + final List allMembers = + userConfig.currentOrg.members! + userConfig.currentOrg.admins!; + model.orgMembersList = allMembers; + + // non admins (normal members) + // to remove, first we need to add a member + final List usersInCurrentOrg = userConfig.currentOrg.members!; + model.memberCheckedMap[usersInCurrentOrg.first.id!] = true; + model.buildUserList(); + model.removeUserFromList( + userId: usersInCurrentOrg.first.id!, + ); + final bool isMemberFound = + model.selectedMembers.contains(usersInCurrentOrg.first); + expect(isMemberFound, false); + }); + + test('getRecurrence method', () { + final model = CreateEventViewModel(); + model.initialize(); + expect(model.getRecurrance(Recurrance.monthly), 'MONTHLY'); + expect(model.getRecurrance(Recurrance.yearly), 'YEARLY'); + expect(model.getRecurrance(Recurrance.once), null); + }); + }); +} diff --git a/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/edit_event_view_model_test.dart b/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/edit_event_view_model_test.dart new file mode 100644 index 000000000..b31c18c69 --- /dev/null +++ b/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/edit_event_view_model_test.dart @@ -0,0 +1,76 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:intl/intl.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/edit_event_view_model.dart'; + +import '../../../helpers/test_helpers.dart'; + +final testEvent = Event( + id: '1', + title: 'test', + startDate: '01/30/2022', // mm/dd/yyyy + endDate: '01/30/2022', + startTime: '06:40 PM', + endTime: '07:40 PM', + location: 'ABC', + description: 'test', + creator: User( + id: 'xzy1', + firstName: 'Test', + lastName: 'User', + email: 'testuser@gmail.com', + refreshToken: 'testtoken', + authToken: 'testtoken', + ), + isPublic: true, + isRegisterable: true, + organization: OrgInfo(id: 'XYZ'), +); + +void main() { + setUp(() { + registerServices(); + }); + group('EditEventViewModel Test -', () { + test("Check if it's initialized correctly", () { + final model = EditEventViewModel(); + model.initialize(testEvent); + + expect(model.eventTitleTextController.text, 'test'); + expect(model.eventLocationTextController.text, 'ABC'); + expect(model.eventDescriptionTextController.text, 'test'); + expect(model.isPublicSwitch, true); + expect(model.isRegisterableSwitch, true); + expect(model.eventStartDate, DateFormat().add_yMd().parse('01/30/2022')); + expect(model.eventEndDate, DateFormat().add_yMd().parse('01/30/2022')); + expect( + model.eventStartTime, + TimeOfDay.fromDateTime(DateFormat('h:mm a').parse('06:40 PM')), + ); + expect( + model.eventEndTime, + TimeOfDay.fromDateTime(DateFormat('h:mm a').parse('07:40 PM')), + ); + }); + testWidgets('Check if updateEvent() is working fine', (tester) async { + final model = EditEventViewModel(); + model.initialize(testEvent); + await tester.pumpWidget( + Form( + key: model.formKey, + child: Container(), + ), + ); + + await model.updateEvent(); + + expect(model.validate, AutovalidateMode.disabled); + }); + }); +} diff --git a/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/event_info_view_model_test.dart b/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/event_info_view_model_test.dart new file mode 100644 index 000000000..d36af3eaa --- /dev/null +++ b/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/event_info_view_model_test.dart @@ -0,0 +1,90 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/services/graphql_config.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/event_info_view_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/explore_events_view_model.dart'; +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +class MockBuildContext extends Mock implements BuildContext {} + +void main() { + testSetupLocator(); + locator().test(); + locator().test(); + + setUp(() { + registerServices(); + locator().test(); + }); + + tearDown(() { + unregisterServices(); + }); + + group('Event Info Tests', () { + final model = EventInfoViewModel(); + + test("test initialization", () { + final Event event = + Event(id: "1", isRegisterable: true, isRegistered: false); + final ExploreEventsViewModel exploreEventsViewModel = + ExploreEventsViewModel(); + model.initialize( + args: { + "event": event, + "exploreEventViewModel": exploreEventsViewModel, + }, + ); + expect(model.fabTitle, "Register"); + }); + + test("Test register for event", () async { + final Event event1 = + Event(id: "1", isRegisterable: true, isRegistered: false); + model.event = event1; + + final eventService = getAndRegisterEventService(); + when(eventService.registerForAnEvent(model.event.id!)) + .thenAnswer((realInvocation) async { + return "Event Registered"; + }); + await model.registerForEvent(); + + verify(navigationService.pop()); + + verify(eventService.registerForAnEvent(model.event.id!)); + expect(model.event.isRegistered, true); + expect(model.fabTitle, "Registered"); + + // now make the event non registrable + model.event.isRegistered = false; + model.event.isRegisterable = false; + await model.registerForEvent(); + verifyNever(eventService.registerForAnEvent(model.event.id!)); + expect(model.event.isRegistered, false); + }); + + test("Test getFabTitle function", () { + final Event event1 = Event(id: "1", isRegisterable: false); + model.event = event1; + expect(model.getFabTitle(), "Not Registrable"); + + final Event event2 = + Event(id: "2", isRegisterable: true, isRegistered: false); + model.event = event2; + expect(model.getFabTitle(), "Register"); + + final Event event3 = + Event(id: "3", isRegisterable: true, isRegistered: true); + model.event = event3; + expect(model.getFabTitle(), "Registered"); + }); + }); +} diff --git a/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/explore_events_view_model_test.dart b/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/explore_events_view_model_test.dart new file mode 100644 index 000000000..7c157e70b --- /dev/null +++ b/test/view_model_tests/after_auth_view_model_tests/event_view_model_tests/explore_events_view_model_test.dart @@ -0,0 +1,239 @@ +import 'dart:async'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/models/organization/org_info.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/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/widgets/custom_alert_dialog.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +class MockBuildContext extends Mock implements BuildContext {} + +class MockCallbackFunction extends Mock { + void call(); +} + +class _MockStreamSubscription extends Mock + implements StreamSubscription {} + +class _MockStream extends Mock implements Stream { + @override + StreamSubscription listen( + void Function(T event)? onData, { + Function? onError, + void Function()? onDone, + bool? cancelOnError, + }) => + _MockStreamSubscription(); +} + +class _MockNavigationService extends Mock implements NavigationService { + @override + GlobalKey navigatorKey = GlobalKey(); + @override + void pushDialog(Widget dialog) { + showDialog( + context: navigatorKey.currentContext!, + barrierColor: Colors.transparent, + barrierDismissible: false, + builder: (BuildContext context) { + return dialog; + }, + ); + } +} + +void main() { + testSetupLocator(); + locator().test(); + locator().test(); + + late Event newEvent; + setUp(() async { + registerServices(); + await locator.unregister(); + locator.registerSingleton(_MockNavigationService()); + locator().test(); + newEvent = Event( + id: "1", + title: "fake_event_title", + description: "fake_event_desc", + attendees: [Attendee(id: 'Test Id')], + location: "fake_event_loc", + recurring: false, + startDate: '2024-01-14', + endDate: '2024-01-14', + startTime: '08:01:00.000Z', + endTime: '08:50:00.000Z', + recurrence: "none", + creator: User(id: 'Test Id'), + isPublic: true, + isRegistered: true, + isRegisterable: true, + organization: OrgInfo(id: 'XYZ'), + ); + }); + + tearDown(() { + unregisterServices(); + }); + + group('Explore Event Tests', () { + test("Test fetchNewEvents and refreshEvents", () async { + final model = ExploreEventsViewModel(); + await model.initialise(); + when(eventService.getEvents()).thenAnswer((realInvocation) async {}); + await model.fetchNewEvents(); + verify(eventService.getEvents()); + + model.refreshEvents(); + verify(eventService.getEvents()); + }); + + test("Test checkIfExistsAndAddNewEvent function", () async { + final model = ExploreEventsViewModel(); + await model.initialise(); + await model.checkIfExistsAndAddNewEvent(newEvent); + expect(model.events.isNotEmpty, true); + expect(model.events.first.id, newEvent.id); + }); + + test( + "Test checkIfExistsAndAddNewEvent function when start time is not parsable", + () async { + final model = ExploreEventsViewModel(); + newEvent.startTime = "09:00:00"; + newEvent.organization!.id = 'Test Id 1'; + await model.checkIfExistsAndAddNewEvent(newEvent); + expect(model.events, isEmpty); + expect(model.events.length, 0); + // expect(model.events.first.id, '1'); + }); + testWidgets( + "Test function of CustomAlertDialog when deleteEvent function is executed", + (tester) async { + final model = ExploreEventsViewModel(); + when(model.eventService.deleteEvent(newEvent.id!)) + .thenAnswer((realInvocation) async => 1); + + await tester.pumpWidget( + MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + navigatorKey: navigationService.navigatorKey, + home: Scaffold(body: Container()), + ), + ); + await tester.pumpAndSettle(); + await model.checkIfExistsAndAddNewEvent(newEvent); + await model.deleteEvent(eventId: newEvent.id!); + await tester.pumpAndSettle(); + final customFinder = find.byType(CustomAlertDialog); + expect(customFinder, findsOneWidget); + + final successFinder = find.byKey(const Key('Delete')); + await tester.tap(successFinder); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + expect(model.events, isEmpty); + }); + + test("Test chooseValueFromDropdown function", () async { + final model = ExploreEventsViewModel(); + await model.initialise(); + + await model.choseValueFromDropdown('All Events'); + expect(model.emptyListMessage, "Looks like there aren't any events."); + + await model.choseValueFromDropdown("My Events"); + bool allCreated = true; + final userConfig = getAndRegisterUserConfig(); + for (int i = 0; i < model.events.length; i++) { + if (model.events[i].creator?.id != userConfig.currentUser.id) { + allCreated = false; + } + } + expect(allCreated, true); + expect(model.emptyListMessage, "You have not created any event."); + + await model.choseValueFromDropdown("Registered Events"); + + allCreated = true; + bool allRegistered = true; + for (int i = 0; i < model.events.length; i++) { + if (model.events[i].creator?.id != userConfig.currentUser.id) { + allCreated = false; + } + if (model.events[i].isRegistered == false) { + allRegistered = false; + } + } + expect(allCreated, true); + expect(allRegistered, true); + expect(model.emptyListMessage, "No registered events are present"); + + await model.choseValueFromDropdown('Public Events'); + bool allPublic = true; + for (int i = 0; i < model.events.length; i++) { + if (model.events[i].isPublic == false) { + allPublic = false; + } + } + expect(allPublic, true); + expect(model.emptyListMessage, "There aren't any public events."); + + await model.choseValueFromDropdown('Private Events'); + bool allPrivate = true; + for (int i = 0; i < model.events.length; i++) { + if (model.events[i].isPublic == true) { + allPrivate = false; + } + } + expect(allPrivate, true); + expect(model.emptyListMessage, "There aren't any private events."); + + //run default block + await model.choseValueFromDropdown("Events"); + }); + test("Test get event service", () async { + final model = ExploreEventsViewModel(); + expect(model.eventService, isA()); + }); + test( + "Test chooseValueFromDropdown when value is Registered Events and _bufferEvents is not empty", + () async { + final model = ExploreEventsViewModel(); + when(userConfig.currentOrg) + .thenAnswer((realInvocation) => OrgInfo(id: '1')); + when(userConfig.currentOrgInfoStream) + .thenAnswer((realInvocation) => _MockStream()); + when(eventService.eventStream) + .thenAnswer((realInvocation) => _MockStream()); + + await model.checkIfExistsAndAddNewEvent(newEvent); + await model.initialise(); + await model.choseValueFromDropdown('Registered Events'); + expect(model.emptyListMessage, "No registered events are present"); + }); + test( + "Test chooseValueFromDropdown when value is Registered Events and _bufferEvents is not empty", + () async { + final model = ExploreEventsViewModel(); + final List userEvents = model.userEvents; + expect(userEvents, []); + }); + }); +} diff --git a/test/view_model_tests/after_auth_view_model_tests/feed_view_models_test/organization_feed_view_model_test.dart b/test/view_model_tests/after_auth_view_model_tests/feed_view_models_test/organization_feed_view_model_test.dart new file mode 100644 index 000000000..19cfdf60e --- /dev/null +++ b/test/view_model_tests/after_auth_view_model_tests/feed_view_models_test/organization_feed_view_model_test.dart @@ -0,0 +1,159 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/constants/routing_constants.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/navigation_service.dart'; +import 'package:talawa/services/post_service.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/view_model/after_auth_view_models/feed_view_models/organization_feed_view_model.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_helpers.mocks.dart'; +import '../../../helpers/test_locator.dart'; + +class MockCallbackFunction extends Mock { + void call(); +} + +void main() { + testSetupLocator(); + late OrganizationFeedViewModel model; + final notifyListenerCallback = MockCallbackFunction(); + + setUp(() { + registerServices(); + model = OrganizationFeedViewModel()..addListener(notifyListenerCallback); + }); + tearDown(() { + unregisterServices(); + }); + + group('OrganizationFeedViewModel Tests:', () { + test('Test initialise function', () { + expect(model.currentOrgName, ''); + model.initialise(isTest: true); + expect(model.currentOrgName, 'Organization Name'); + + locator() + .currentOrgInfoController + .add(OrgInfo(name: 'Updated Organization Name')); + + expect(model.posts.length, 0); + }); + + test('Test pinnedPosts getter when istest is true', () { + model.istest = true; + + final pinnedPosts = model.pinnedPosts; + + expect(pinnedPosts, isEmpty); + }); + + test('Test pinnedPosts getter when istest is false', () { + model.istest = false; + + final pinnedPosts = model.pinnedPosts; + + expect(pinnedPosts.length, 4); + + expect(pinnedPosts[0].sId, '1'); + }); + + test('Test setCurrentOrganizationName function', () { + model.setCurrentOrganizationName('Updated Organization Name'); + expect(model.posts.length, 0); + expect(model.userPosts.length, 0); + expect(model.currentOrgName, 'Updated Organization Name'); + }); + + test('Test fetchNewPosts function', () { + model.fetchNewPosts(); + verify(locator().refreshFeed()); + }); + + test('Test buildNewPosts function', () { + when(userConfig.currentUser).thenReturn(User(id: 'a')); + model.buildNewPosts([ + Post(sId: '1', creator: User(id: 'a')), + Post(sId: '2', creator: User(id: 'a')), + ]); + + expect(model.posts.length, 2); + expect(model.userPosts.length, 2); + verify(notifyListenerCallback()); + }); + + test('Test navigateToIndividualPage function', () { + final post = Post(sId: '1', creator: User()); + + model.navigateToIndividualPage(post); + + verify( + locator().pushScreen( + Routes.individualPost, + arguments: post, + ), + ); + }); + + test('Test navigateToPinnedPostPage function', () { + model.navigateToPinnedPostPage(); + + final captured = verify( + (locator() as MockNavigationService).pushScreen( + Routes.pinnedPostPage, + arguments: captureAnyNamed('arguments'), + ), + ).captured; + + expect((captured[0] as List).length, 4); + }); + + test('Test addNewPost function', () { + final post = Post(sId: '1', creator: User()); + + model.addNewPost(post); + + expect(model.posts[0], post); + verify(notifyListenerCallback()); + }); + + test('Test updatedPost function', () { + final post = Post(sId: '1', creator: User()); + model.addNewPost(post); + + final updatedPost = Post( + sId: '1', + description: 'updated', + creator: User(), + ); + model.updatedPost(updatedPost); + + expect(model.posts[0], updatedPost); + verify(notifyListenerCallback()).called(2); + }); + }); + + test('Test removePost function', () async { + final post = Post(sId: '1', creator: User()); + model.addNewPost(post); + model.initialise(); + + await model.removePost(post); + + expect(model.posts.isEmpty, true); + }); + test("test nextpage", () { + model.nextPage(); + expect(model.posts.isEmpty, true); + }); + test("test previousPage", () { + model.previousPage(); + expect(model.posts.isEmpty, true); + }); +} diff --git a/test/view_model_tests/after_auth_view_model_tests/profile_view_model_tests/edit_profile_view_model_test.dart b/test/view_model_tests/after_auth_view_model_tests/profile_view_model_tests/edit_profile_view_model_test.dart new file mode 100644 index 000000000..f3230fe2a --- /dev/null +++ b/test/view_model_tests/after_auth_view_model_tests/profile_view_model_tests/edit_profile_view_model_test.dart @@ -0,0 +1,333 @@ +import 'dart:io'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/services/third_party_service/multi_media_pick_service.dart'; +import 'package:talawa/view_model/after_auth_view_models/profile_view_models/edit_profile_view_model.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +/// MockCallbackFunction class is used to mock callback function. +class MockCallbackFunction extends Mock { + /// `call` function is a placeholder function. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void call(); +} + +void main() { + testSetupLocator(); + SizeConfig().test(); + setUpAll(() { + registerServices(); + graphqlConfig.test(); + sizeConfig.test(); + }); + + tearDownAll(() { + unregisterServices(); + }); + + group('EditProfilePageViewModel Test -', () { + test("Check if it's initialized correctly", () { + final model = EditProfilePageViewModel(); + model.initialize(); + expect(model.imageFile, null); + }); + test('Profile shoud be edited if new values are given', () async { + final model = EditProfilePageViewModel(); + model.initialize(); + final Map mockData = { + 'updateUserProfile': { + '_id': '64378abd85008f171cf2990d', + }, + }; + final String a = await model.convertToBase64(File('path/to/newImage')); + final Map data = { + 'users': [ + { + '__typename': 'UserData', + 'appUserProfile': { + '__typename': 'AppUserProfile', + 'adminFor': [], + 'createdOrganizations': [], + }, + 'user': { + '__typename': 'User', + '_id': '1234567890', + 'firstName': 'John', + 'lastName': 'Doe', + 'email': 'johndoe@example.com', + 'image': 'https://example.com/profile.jpg', + 'joinedOrganizations': [ + { + '__typename': 'Organization', + '_id': '6537904485008f171cf29924', + 'name': 'Unity Foundation', + 'image': null, + 'description': + 'We are aimed at improving the education spaces for the under privileged girl child.', + 'userRegistrationRequired': false, + 'creator': { + '__typename': 'User', + '_id': '64378abd85008f171cf2990d', + 'firstName': 'Wilt', + 'lastName': 'Shepherd', + 'image': null, + }, + } + ], + 'membershipRequests': [], + }, + } + ], + }; + when( + databaseFunctions.gqlAuthMutation( + queries.updateUserProfile(), + variables: { + 'firstName': 'NewFirstName', + 'lastName': 'NewLastName', + 'newImage': 'data:image/png;base64,$a', + }, + ), + ).thenAnswer( + (_) async => QueryResult( + data: mockData, + source: QueryResultSource.network, + options: QueryOptions(document: gql(queries.updateUserProfile())), + ), + ); + when( + databaseFunctions.gqlAuthQuery( + queries.fetchUserInfo, + variables: {'id': model.user.id}, + ), + ).thenAnswer((_) async { + return QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions(document: gql(queries.fetchUserInfo)), + ); + }); + await model.updateUserProfile( + firstName: 'NewFirstName', + lastName: 'NewLastName', + newImage: File('path/to/newImage'), + ); + + verify( + databaseFunctions.gqlAuthMutation( + queries.updateUserProfile(), + variables: { + "firstName": "NewFirstName", + "lastName": "NewLastName", + "file": 'data:image/png;base64,$a', + }, + ), + ).called(1); + verify( + navigationService.showTalawaErrorSnackBar( + "Profile updated successfully", + MessageType.info, + ), + ); + }); + + test('Test UpdateUserProfile when throwing exception', () async { + final model = EditProfilePageViewModel(); + model.initialize(); + final String b = await model.convertToBase64(File('path/to/newIma')); + when( + databaseFunctions.gqlAuthMutation( + queries.updateUserProfile(), + variables: { + 'firstName': 'NewFirstNa', + 'lastName': 'NewLastNa', + 'newImage': 'data:image/png;base64,$b', + }, + ), + ).thenThrow(Exception()); + when( + databaseFunctions.gqlAuthQuery( + queries.fetchUserInfo, + variables: {'id': model.user.id}, + ), + ).thenThrow(Exception()); + await model.updateUserProfile( + firstName: 'NewFirstNa', + lastName: 'NewLastNa', + newImage: File('path/to/newIma'), + ); + verify( + navigationService.showTalawaErrorSnackBar( + "Something went wrong", + MessageType.error, + ), + ); + }); + testWidgets('Test if SelectImage from camera method works', + (WidgetTester tester) async { + final model = EditProfilePageViewModel(); + model.initialize(); + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Builder( + builder: (BuildContext context) { + return ElevatedButton( + key: const Key('btn1'), + onPressed: () => model.selectImage(camera: true), + child: const Text('listner'), + ); + }, + ), + ), + ), + ); + final file = File('fakePath'); + when(locator().getPhotoFromGallery(camera: true)) + .thenAnswer((realInvocation) async { + return file; + }); + await tester.tap(find.byKey(const Key('btn1'))); + await tester.pumpAndSettle(); + verify(multimediaPickerService.getPhotoFromGallery(camera: true)) + .called(1); + expect(model.imageFile, file); + }); + + testWidgets('Test if selectImage from gallery method works', + (WidgetTester tester) async { + final model = EditProfilePageViewModel(); + model.initialize(); + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Builder( + builder: (BuildContext context) { + return ElevatedButton( + key: const Key('btn1'), + onPressed: () => model.selectImage(), + child: const Text('listner'), + ); + }, + ), + ), + ), + ); + final file = File('fakePath'); + when(locator().getPhotoFromGallery()) + .thenAnswer((realInvocation) async { + return file; + }); + await tester.tap(find.byKey(const Key('btn1'))); + await tester.pumpAndSettle(); + + expect(model.imageFile, file); + }); + testWidgets( + 'Test if SelectImage from camera method works if null is returned', + (WidgetTester tester) async { + final model = EditProfilePageViewModel(); + model.initialize(); + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Builder( + builder: (BuildContext context) { + return ElevatedButton( + key: const Key('btn1'), + onPressed: () => model.selectImage(camera: true), + child: const Text('listner'), + ); + }, + ), + ), + ), + ); + when(locator().getPhotoFromGallery(camera: true)) + .thenAnswer((realInvocation) async { + return null; + }); + await tester.tap(find.byKey(const Key('btn1'))); + await tester.pumpAndSettle(); + verify(multimediaPickerService.getPhotoFromGallery(camera: true)) + .called(1); + expect(model.imageFile, null); + }); + testWidgets( + 'Test if selectImage from gallery method works when null is returned', + (WidgetTester tester) async { + final model = EditProfilePageViewModel(); + model.initialize(); + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Builder( + builder: (BuildContext context) { + return ElevatedButton( + key: const Key('btn1'), + onPressed: () => model.selectImage(), + child: const Text('listner'), + ); + }, + ), + ), + ), + ); + when(locator().getPhotoFromGallery()) + .thenAnswer((realInvocation) async { + return null; + }); + await tester.tap(find.byKey(const Key('btn1'))); + await tester.pumpAndSettle(); + expect(model.imageFile, null); + }); + + test('No update performed if inputs are the same as existing data', + () async { + final model = EditProfilePageViewModel(); + model.initialize(); + await model.updateUserProfile( + firstName: model.user.firstName, + lastName: model.user.lastName, + newImage: null, + ); + verifyNever( + databaseFunctions.gqlAuthMutation( + queries.updateUserProfile(), + variables: {'id': 'xzy1'}, + ), + ); + }); + + test('convertToBase64 converts file to base64 string', () async { + final model = EditProfilePageViewModel(); + model.initialize(); + //using this asset as the test asset + final file = File('assets/images/Group 8948.png'); + final fileString = await model.convertToBase64(file); + expect(model.base64Image, fileString); + }); + + test('Check if removeImage() is working fine', () async { + final notifyListenerCallback = MockCallbackFunction(); + final model = EditProfilePageViewModel() + ..addListener(notifyListenerCallback); + + model.removeImage(); + + expect(model.imageFile, null); + verify(notifyListenerCallback()).called(1); + }); + }); +} diff --git a/test/view_model_tests/after_auth_view_model_tests/profile_view_model_tests/profile_page_view_model_test.dart b/test/view_model_tests/after_auth_view_model_tests/profile_view_model_tests/profile_page_view_model_test.dart new file mode 100644 index 000000000..0b51b0f6f --- /dev/null +++ b/test/view_model_tests/after_auth_view_model_tests/profile_view_model_tests/profile_page_view_model_test.dart @@ -0,0 +1,279 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:qr_flutter/qr_flutter.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/after_auth_view_models/profile_view_models/profile_page_view_model.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +class MockCallbackFunction extends Mock { + void call(); +} + +class MockBuildContext extends Mock implements BuildContext {} + +void verifyInteraction(dynamic x, {required String mockName}) { + // Ensures that navigation service was called + try { + verifyZeroInteractions(x); + //If 0 interactions passes that means mock was not called hence test fails + throw Exception("Expected interaction but found 0 with $mockName"); + } on TestFailure { + //If test fails then 1 or more interactions with navigation service hence test passes + expect(true, true); + } +} + +void main() async { + testSetupLocator(); + + group('ProfilePageViewModel Tests -', () { + setUpAll(() { + registerServices(); + graphqlConfig.test(); + sizeConfig.test(); + }); + + tearDownAll(() { + unregisterServices(); + }); + + test("Test initialization", () { + final model = ProfilePageViewModel(); + model.initialize(); + expect(model.currentOrg, userConfig.currentOrg); + expect(model.currentUser, userConfig.currentUser); + }); + testWidgets('changeCurrency test', (WidgetTester tester) async { + final model = ProfilePageViewModel(); + model.initialize(); + void mockSetter(void Function() innerFunction) { + innerFunction(); + } + + await tester.pumpWidget( + MaterialApp( + home: Builder( + builder: (context) { + return ElevatedButton( + key: const Key('btn1'), + onPressed: () { + model.changeCurrency(context, mockSetter); + }, + child: const Text('Change Currency'), + ); + }, + ), + ), + ); + + await tester.tap(find.byKey(const Key('btn1'))); + await tester.pumpAndSettle(); + await tester.tap(find.text('USD')); + expect(find.byType(BottomSheet), findsOneWidget); + }); + + test("Test showSnackBar and popBottomSheet function", () { + final model = ProfilePageViewModel(); + model.initialize(); + + model.showSnackBar("fake_message"); + verify( + navigationService.showTalawaErrorDialog( + "fake_message", + MessageType.error, + ), + ).called(1); + + model.popBottomSheet(); + verify(navigationService.pop()); + }); + + test("Test updateSheetHeight function", () { + final model = ProfilePageViewModel(); + model.initialize(); + model.updateSheetHeight(); + expect(model.bottomSheetHeight, SizeConfig.screenHeight! * 0.65); + }); + + testWidgets("Test iconButton function", (tester) async { + final model = ProfilePageViewModel(); + model.initialize(); + bool setterCalled = false; + void mockSetter() { + setterCalled = true; + } + + const Icon testIcon = Icon(Icons.cancel); + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: model.iconButton(testIcon, mockSetter), + ), + ), + ); + await tester.tap(find.byKey(const Key('iconbtn1'))); + expect(setterCalled, true); + final iconButtonFinder = find.byType(IconButton); + final iconButton = tester.firstWidget(iconButtonFinder); + expect((iconButton as IconButton).icon, testIcon); + }); + + testWidgets("Test dominationButton function", (tester) async { + final mockContext = MockBuildContext(); + final model = ProfilePageViewModel(); + model.initialize(); + const String amt = "test_amt"; + model.donationAmount.text = amt; + + bool setterCalled = false; + void mockSetter(void Function() innerFunction) { + setterCalled = true; + innerFunction(); + } + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: model.dominationButton( + amt, + mockContext, + mockSetter, + ), + ), + ), + ); + await tester.tap(find.byKey(const Key('domBtn_$amt'))); + await tester.pump(); + await tester.pumpAndSettle(); + expect(setterCalled, true); + final containerFinder = find.byType(Container); + final Container container = tester.firstWidget(containerFinder); + expect( + container.padding, + EdgeInsets.symmetric( + vertical: SizeConfig.screenHeight! * 0.02, + horizontal: SizeConfig.screenWidth! * 0.075, + ), + ); + }); + testWidgets("Test invite method", (WidgetTester tester) async { + final model = ProfilePageViewModel(); + model.initialize(); + await tester.pumpWidget( + MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: Builder( + builder: (BuildContext context) { + // Trigger the invite method on button press + return ElevatedButton( + key: const Key('inviteButton'), + onPressed: () => model.invite(context), + child: const Text('Invoke Invite'), + ); + }, + ), + ), + ), + ); + await tester.pumpAndSettle(); + + // model.invite(mockContext); + + await tester.tap(find.byKey(const Key('inviteButton'))); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key('iconbtn1'))); + + expect(find.byType(Dialog), findsOneWidget); + expect(find.byType(QrImageView), findsOneWidget); + }); + + testWidgets('attachListener test', (WidgetTester tester) async { + final viewModel = ProfilePageViewModel(); + viewModel.initialize(); + double bottomSheetHeight = 0; + final FocusNode focusNode = viewModel.donationField; + const testFocus = Key('testFocus'); + const testFocus1 = Key('testFocus1'); + + void mockSetter(void Function() innerFunction) { + innerFunction(); + } + + await tester.pumpWidget( + MaterialApp( + home: Scaffold( + body: Builder( + builder: (BuildContext context) { + return Scaffold( + body: Container( + child: Column( + children: [ + TextField( + key: testFocus, + focusNode: focusNode, + ), + TextField( + key: testFocus1, + focusNode: FocusNode(), + ), + ], + ), + ), + ); + }, + ), + ), + ), + ); + + viewModel.attachListener(mockSetter); + await tester.enterText(find.byKey(testFocus), 'test attach listener'); + mockSetter(() { + bottomSheetHeight = SizeConfig.screenHeight! * 0.8725; + }); + await tester.pump(); + expect(bottomSheetHeight, SizeConfig.screenHeight! * 0.8725); + await tester.enterText( + find.byKey(testFocus1), + 'viewmodel.dontaionField out of focus', + ); + + await tester.pump(const Duration(milliseconds: 300)); + + mockSetter(() { + bottomSheetHeight = SizeConfig.screenHeight! * 0.68; + }); + expect(bottomSheetHeight, SizeConfig.screenHeight! * 0.68); + }); + + // test('logout success', () { + // final model = ProfilePageViewModel(); + // when(userConfig.loggedIn).thenReturn(true); + // model.logoutSuccess(); + + // // when(userConfig.loggedIn).thenReturn(false); + // // model.logoutSuccess(); + + // // verify( navigationService.removeAllAndPush( + // // '/selectLang', + // // '/', + // // arguments: '0', + // // )); + // }); + }); +} diff --git a/test/view_model_tests/after_auth_view_model_tests/settings_view_models_test/app_setting_view_model_test.dart b/test/view_model_tests/after_auth_view_model_tests/settings_view_models_test/app_setting_view_model_test.dart new file mode 100644 index 000000000..3827b490f --- /dev/null +++ b/test/view_model_tests/after_auth_view_model_tests/settings_view_models_test/app_setting_view_model_test.dart @@ -0,0 +1,79 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:hive/hive.dart'; +import 'package:mockito/mockito.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/view_model/after_auth_view_models/settings_view_models/app_setting_view_model.dart'; +import 'package:url_launcher_platform_interface/url_launcher_platform_interface.dart'; +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +class MockUrlLauncher extends Mock + with MockPlatformInterfaceMixin + implements UrlLauncherPlatform { + @override + Future launchUrl(String url, LaunchOptions? options) { + if (url == 'http://www.success.com') return Future.value(true); + return Future.value(false); + } +} + +void main() async { + SizeConfig().test(); + testSetupLocator(); + + final Directory dir = Directory('test/fixtures/core1'); + + Hive + ..init(dir.path) + ..registerAdapter(UserAdapter()) + ..registerAdapter(OrgInfoAdapter()); + + await Hive.openBox('currentUser'); + await Hive.openBox('url'); + await Hive.openBox('currentOrg'); + + group('Test for appSettingviewModel', () { + setUpAll(() async { + getAndRegisterNavigationService(); + getAndRegisterUserConfig(); + final mock = MockUrlLauncher(); + UrlLauncherPlatform.instance = mock; + }); + + tearDownAll(() async { + await Hive.close(); + + // Clean up the test directory if needed + dir.delete(recursive: true); + }); + + test('Test logout function.', () { + final model = AppSettingViewModel(); + model.logout(); + }); + + test('test for launchWebsite method', () async { + final model = AppSettingViewModel(); + const successUrl = 'http://www.success.com'; + const failUrl = 'http://www.fail.com'; + + bool opened = false; + + // if successfully launches the website. + opened = await model.launchWebsite(successUrl); + expect(opened, true); + + // if failed to launch the website. + opened = await model.launchWebsite(failUrl); + expect(opened, false); + }); + }); +} diff --git a/test/view_model_tests/base_view_model_test.dart b/test/view_model_tests/base_view_model_test.dart new file mode 100644 index 000000000..3d62f6559 --- /dev/null +++ b/test/view_model_tests/base_view_model_test.dart @@ -0,0 +1,48 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/view_model/base_view_model.dart'; + +class MockCallbackFunction extends Mock { + void call(); +} + +void main() { + BaseModel getBaseModel() { + final model = BaseModel(); + return model; + } + + group("BaseViewModel Test- ", () { + final callback = MockCallbackFunction(); + + test("When initialized viewstate should be ViewState.idle", () { + final model = getBaseModel(); + expect(model.state, ViewState.idle); + }); + test("When initialized isBusy should be false ", () { + final model = getBaseModel(); + expect(model.isBusy, false); + }); + + test( + "When setState is called the state should reflect the state passed to the setState function ", + () { + final model = getBaseModel(); + model.setState(ViewState.busy); + expect(model.state, ViewState.busy); + model.setState(ViewState.idle); + expect(model.state, ViewState.idle); + }); + + test("When setState is called, BaseModel should call notifyListners", () { + final model = getBaseModel(); + model.addListener(callback); + model.setState(ViewState.busy); + verify(callback()); + }); + }); +} diff --git a/test/view_model_tests/custom_drawer_view_model_test.dart b/test/view_model_tests/custom_drawer_view_model_test.dart new file mode 100644 index 000000000..3d5f92550 --- /dev/null +++ b/test/view_model_tests/custom_drawer_view_model_test.dart @@ -0,0 +1,284 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/graphql_config.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/view_model/widgets_view_models/custom_drawer_view_model.dart'; +import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; + +import '../helpers/test_helpers.dart'; +import '../helpers/test_locator.dart'; + +/// Mocked context. +/// +/// more_info_if_required +class MockBuildContext extends Mock implements BuildContext {} + +/// Main. +/// +/// more_info_if_required +/// +/// **params**: +/// None +/// +/// **returns**: +/// None +void main() { + testSetupLocator(); + locator().test(); + locator().test(); + locator(); + + setUp(() { + registerServices(); + locator().test(); + }); + + tearDown(() { + unregisterServices(); + }); + group('CustomDrawerViewModel Tests', () { + test('switchAbleOrg should correctly get and set value', () { + final model = CustomDrawerViewModel(); + final orgList = [ + OrgInfo(name: 'Test Org 1'), + OrgInfo(name: 'Test Org 2'), + ]; + + model.switchAbleOrg = orgList; + + expect(model.switchAbleOrg, equals(orgList)); + }); + test("initialize should setup the model with user's joined organizations", + () { + final homeModel = MainScreenViewModel(); + final MockBuildContext mockContext = MockBuildContext(); + final model = CustomDrawerViewModel(); + final user = User(joinedOrganizations: [OrgInfo(name: 'Test Org')]); + + when(userConfig.currentOrgInfoStream) + .thenAnswer((_) => Stream.value(OrgInfo())); + when(userConfig.currentUser).thenReturn(user); + when(userConfig.currentOrg).thenReturn(OrgInfo()); + + model.initialize(homeModel, mockContext); + + expect(model.switchAbleOrg, equals(user.joinedOrganizations)); + }); + + test('switchOrg should show info message if different organization', () { + final model = CustomDrawerViewModel(); + final orgInfo = OrgInfo(name: 'Test Org'); + + when(userConfig.currentOrg).thenReturn(OrgInfo(name: 'Current Org')); + model.switchAbleOrg = [orgInfo]; + + model.switchOrg(orgInfo); + + verify( + navigationService.showTalawaErrorSnackBar( + 'Switched to ${orgInfo.name}', + MessageType.info, + ), + ); + }); + + test('switchOrg should pop navigation after switching or showing error', + () { + final model = CustomDrawerViewModel(); + final orgInfo = OrgInfo(name: 'Test Org'); + + when(userConfig.currentOrg).thenReturn(OrgInfo(name: 'Current Org')); + model.switchAbleOrg = [orgInfo]; + + model.switchOrg(orgInfo); + + verify(navigationService.pop()); + }); + + test('initialize should setup the model with userConfig values', () { + final homeModel = MainScreenViewModel(); + final MockBuildContext mockContext = MockBuildContext(); + final model = CustomDrawerViewModel(); + final user = User(joinedOrganizations: [OrgInfo(name: 'Test Org')]); + + when(userConfig.currentOrgInfoStream) + .thenAnswer((_) => Stream.value(OrgInfo())); + when(userConfig.currentUser).thenReturn(user); + when(userConfig.currentOrg).thenReturn(OrgInfo()); + + model.initialize(homeModel, mockContext); + + expect(model.switchAbleOrg, equals(user.joinedOrganizations)); + expect(model.selectedOrg, equals(userConfig.currentOrg)); + }); + test( + 'switchOrg should save new organization in userConfig if different organization', + () { + final model = CustomDrawerViewModel(); + final orgInfo = OrgInfo(name: 'Test Org'); + + when(userConfig.currentOrg).thenReturn(OrgInfo(name: 'Current Org')); + model.switchAbleOrg = [orgInfo]; + + model.switchOrg(orgInfo); + + verify(userConfig.saveCurrentOrgInHive(orgInfo)); + verify( + navigationService.showTalawaErrorSnackBar( + 'Switched to ${orgInfo.name}', + MessageType.info, + ), + ); + }); + + test('check if switchOrg is working with zero switchable orgs', () { + final model = CustomDrawerViewModel(); + model.setSelectedOrganizationName(userConfig.currentOrg); + + //No switchable org are present in the model + model.switchAbleOrg = []; + + //Acess mock joined Organisation for the mock user + final OrgInfo mockJoinedOrg = + userConfig.currentUser.joinedOrganizations!.first; + + //check if selected org is mocked joined org .Expectation-false. + expect(model.selectedOrg, isNot(mockJoinedOrg)); + }); + + test('check if switchOrg is working with wrong switchable org being passed', + () { + final model = CustomDrawerViewModel(); + model.setSelectedOrganizationName(userConfig.currentOrg); + + //Mock switchable org are present in the model + model.switchAbleOrg = userConfig.currentUser.joinedOrganizations!; + + //Mock fake org which is not present in the mock switchableOrg + + //Acess mock joined Organisation for the mock user + final OrgInfo fakeOrg = OrgInfo( + id: '5', + name: 'fake org 1', + userRegistrationRequired: true, + creatorInfo: User(firstName: 'fake', lastName: 'user'), + ); + //check if the mocked org is present or not + + final isPresent = model.isPresentinSwitchableOrg(fakeOrg); + + //expecting that the org is not present so will return false + expect(isPresent, false); + //check if selected org is changed or not. Expected-Not changing + expect(model.selectedOrg, isNot(fakeOrg)); + }); + + test('check if switchOrg is working with mock joined orgs', () async { + final model = CustomDrawerViewModel(); + final homeModel = MainScreenViewModel(); + final MockBuildContext mockContext = MockBuildContext(); + //Intializing a mock model with mockBuildContext + model.initialize(homeModel, mockContext); + //Storing the first switchable org in mockOrgInfo + final OrgInfo mockChangeOrgTo = model.switchAbleOrg.first; + + //Calling the switchOrg function + model.switchOrg(mockChangeOrgTo); + + //expecting the selected org will be equal to the mockChangeOrgto returns true + expect(model.selectedOrg, mockChangeOrgTo); + }); + + test('setSelectedOrganizationName should update selectedOrg if different', + () { + final model = CustomDrawerViewModel(); + final orgInfo = OrgInfo(name: 'Test Org'); + + model.setSelectedOrganizationName(orgInfo); + + expect(model.selectedOrg, equals(orgInfo)); + }); + + test('Check if OrgInfo is present in switchAbleOrg', () { + final model = CustomDrawerViewModel(); + model.switchAbleOrg = [ + OrgInfo(id: '1'), + OrgInfo(id: '2'), + OrgInfo(id: '3'), + ]; + final switchToOrg = OrgInfo(id: '2'); + + final result = model.isPresentinSwitchableOrg(switchToOrg); + + expect(result, true); + }); + + test('Check if OrgInfo is not present in switchAbleOrg', () { + final model = CustomDrawerViewModel(); + model.switchAbleOrg = [ + OrgInfo(id: '1'), + OrgInfo(id: '2'), + OrgInfo(id: '3'), + ]; + final switchToOrg = OrgInfo(id: '4'); + + final result = model.isPresentinSwitchableOrg(switchToOrg); + + expect(result, false); + }); + + test( + 'setSelectedOrganizationName should show error snackbar if org is same as selected', + () { + final homeModel = MainScreenViewModel(); + final MockBuildContext mockContext = MockBuildContext(); + final model = CustomDrawerViewModel(); + final user = + User(joinedOrganizations: [OrgInfo(id: '1', name: 'Test Org1')]); + + when(userConfig.currentOrgInfoStream) + .thenAnswer((_) => Stream.value(OrgInfo(id: '1', name: 'Test Org1'))); + when(userConfig.currentUser).thenReturn(user); + when(userConfig.currentOrg) + .thenReturn(OrgInfo(id: '1', name: 'Test Org1')); + model.initialize(homeModel, mockContext); + final switchToOrg = OrgInfo(id: '1', name: 'Test Org1'); + model.setSelectedOrganizationName(switchToOrg); + final result1 = model.isPresentinSwitchableOrg(switchToOrg); + + expect(result1, true); + // expect(model.selectedOrg, equals(userConfig.currentOrg)); + model.switchOrg(switchToOrg); + final result = model.isPresentinSwitchableOrg(switchToOrg); + + expect(result, true); + expect(model.selectedOrg, equals(switchToOrg)); + verify( + navigationService.showTalawaErrorSnackBar( + '${switchToOrg.name} already selected', + MessageType.warning, + ), + ).called(1); + }); + test('controller should return ScrollController instance', () { + final model = CustomDrawerViewModel(); + expect(model.controller, isA()); + }); + + test('targets should return List instance', () { + final model = CustomDrawerViewModel(); + expect(model.targets, isA>()); + }); + + test('selectedOrg should be initially null', () { + final model = CustomDrawerViewModel(); + expect(model.selectedOrg, isNull); + }); + }); +} diff --git a/test/view_model_tests/lang_view_model_test.dart b/test/view_model_tests/lang_view_model_test.dart new file mode 100644 index 000000000..d1a9491ab --- /dev/null +++ b/test/view_model_tests/lang_view_model_test.dart @@ -0,0 +1,193 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/models/mainscreen_navigation_args.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/graphql_config.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; + +import '../helpers/test_helpers.dart'; +import '../helpers/test_locator.dart'; + +class MockBuildContext extends Mock implements BuildContext {} + +void main() { + WidgetsFlutterBinding.ensureInitialized(); + SharedPreferences.setMockInitialValues({}); + + testSetupLocator(); + locator().test(); + + setUp(() { + registerServices(); + }); + + tearDown(() { + unregisterServices(); + }); + + group('Language View Model Tests', () { + test("test change language", () async { + final model = AppLanguage(isTest: true); + model.initialize(); + + // check that initially the app language is set to english + final Locale locale = model.appLocal; + expect(locale, const Locale('en')); + + // test changeLanguage function with same language as before + model.changeLanguage(const Locale('en')); + expect(model.appLocal, const Locale('en')); + + // test changeLanguage function with different language + model.changeLanguage(const Locale('es')); + final Locale changedLocale = model.appLocal; + expect(changedLocale, const Locale('es')); + }); + + test('change language with isTest false', () async { + final model = AppLanguage(isTest: false); + model.initialize(); + + // check that initially the app language is set to english + final Locale locale = model.appLocal; + expect(locale, const Locale('en')); + + // test changeLanguage function with same language as before + await model.changeLanguage(const Locale('en')); + expect(model.appLocal, const Locale('en')); + + // test changeLanguage function with different languages + await model.changeLanguage(const Locale('es')); + Locale changedLocale = model.appLocal; + expect(model.appLocal, const Locale('es')); + + await model.changeLanguage(const Locale('fr')); + changedLocale = model.appLocal; + expect(changedLocale, const Locale('fr')); + + await model.changeLanguage(const Locale('hi')); + changedLocale = model.appLocal; + expect(changedLocale, const Locale('hi')); + + await model.changeLanguage(const Locale('zh')); + changedLocale = model.appLocal; + expect(changedLocale, const Locale('zh')); + + await model.changeLanguage(const Locale('de')); + changedLocale = model.appLocal; + expect(changedLocale, const Locale('de')); + + await model.changeLanguage(const Locale('ja')); + changedLocale = model.appLocal; + expect(changedLocale, const Locale('ja')); + + await model.changeLanguage(const Locale('pt')); + changedLocale = model.appLocal; + expect(changedLocale, const Locale('pt')); + + await model.changeLanguage(const Locale('en')); + changedLocale = model.appLocal; + expect(changedLocale, const Locale('en')); + }); + + test("test functions", () async { + final model = AppLanguage(isTest: true); + await model.initialize(); + + // consider if user is not logged in. + when(userConfig.currentUser).thenReturn(User(id: 'null')); + + when( + navigationService.pushScreen( + Routes.mainScreen, + arguments: MainScreenArgs( + mainScreenIndex: 0, + fromSignUp: false, + toggleDemoMode: true, + ), + ), + ).thenAnswer((_) async {}); + + await model.selectLanguagePress(); + verify( + navigationService.pushScreen( + Routes.mainScreen, + arguments: MainScreenArgs( + mainScreenIndex: 0, + fromSignUp: false, + toggleDemoMode: true, + ), + ), + ); + + // consider if user is logged in. + when(userConfig.currentUser).thenReturn(User(id: 'xyz1')); + + when( + navigationService.popAndPushScreen( + '/appSettingsPage', + arguments: '', + ), + ).thenAnswer((_) async {}); + + databaseFunctions.init(); + + when( + databaseFunctions.gqlAuthMutation( + queries.updateLanguage(model.appLocal.languageCode), + ), + ).thenAnswer((_) async {}); + + await model.selectLanguagePress(); + + verify( + databaseFunctions.gqlAuthMutation( + queries.updateLanguage(model.appLocal.languageCode), + ), + ); + verify( + navigationService.popAndPushScreen( + '/appSettingsPage', + arguments: '', + ), + ); + + // testing userLanguageQuery function + const userId = "xyz1"; + when(databaseFunctions.gqlAuthQuery(queries.newUserLanguage(userId))) + .thenAnswer((_) async {}); + await model.userLanguageQuery(userId); + verify(databaseFunctions.gqlAuthQuery(queries.newUserLanguage(userId))); + + //testing appLanguageQueryFunction + when(databaseFunctions.gqlAuthQuery(queries.userLanguage())) + .thenAnswer((_) async {}); + await model.appLanguageQuery(); + verify(databaseFunctions.gqlAuthQuery(queries.userLanguage())); + + //testing catch block in userLanguageQuery + when(databaseFunctions.gqlAuthQuery(queries.newUserLanguage(userId))) + .thenThrow(Error()); + await model.userLanguageQuery(userId); + + //testing catch block in appLanguageQuery + when(databaseFunctions.gqlAuthQuery(queries.userLanguage())) + .thenThrow(Error()); + await model.appLanguageQuery(); + + //testing catch block in dbLanguageUpdate + when( + databaseFunctions.gqlAuthMutation( + queries.updateLanguage(model.appLocal.languageCode), + ), + ).thenThrow(Error()); + await model.dbLanguageUpdate(); + }); + }); +} diff --git a/test/view_model_tests/main_screen_view_model_test.dart b/test/view_model_tests/main_screen_view_model_test.dart new file mode 100644 index 000000000..0d07f071d --- /dev/null +++ b/test/view_model_tests/main_screen_view_model_test.dart @@ -0,0 +1,751 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +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:mockito/mockito.dart'; +import 'package:talawa/models/app_tour.dart'; +import 'package:talawa/router.dart' as router; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/utils/queries.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/view_model/theme_view_model.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_alert_dialog.dart'; +import 'package:talawa/widgets/custom_drawer.dart'; +import 'package:talawa/widgets/theme_switch.dart'; +import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; + +// import 'package:tutorial_coach_mark/tutorial_coach_mark.dart'; + +import '../helpers/test_helpers.dart'; +// import '../helpers/test_helpers.mocks.dart'; +import '../helpers/test_locator.dart'; +import '../model_tests/app_tour_test.dart'; + +class MockLocalMainScreenViewModel extends MainScreenViewModel { + int stackLength = 0; + @override + void tourEventTargets() { + stackLength++; + // TODO: implement tourEventTargets + super.tourEventTargets(); + } + + @override + void tourProfile() { + stackLength++; + // TODO: implement tourProfile + super.tourProfile(); + } +} + +typedef FunctionType = void Function(MainScreenViewModel model2); + +Widget createMainScreenViewModelScreen(FunctionType onTap) { + final GlobalKey key = MainScreenViewModel.scaffoldKey; + return MaterialApp( + builder: (context, child) => BaseView( + builder: (context, model2, child) { + model2.context = context; + model2.testMode = true; + model2.appTour = MockAppTour(model: model2); + model2.currentPageIndex = 0; + return Scaffold( + key: key, + drawer: const Text('drawer123'), + body: TextButton( + onPressed: () { + onTap(model2); + }, + child: const Text('tour home'), + ), + ); + }, + ), + ); +} + +Widget createAppTourDialog({bool demoMode = true}) => BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: BaseView( + onModelReady: (model2) => model2.initialise( + context, + fromSignUp: false, + mainScreenIndex: 0, + demoMode: demoMode, + testMode: true, + ), + builder: (context, model2, child) { + model2.context = context; + model2.appTour = MockAppTour(model: model2); + model2.pluginPrototypeData.putIfAbsent( + "Plugin1", + () => { + "pluginName": "Plugin1", + "pluginInstallStatus": true, + 'icon': Icons.abc, + 'class': const ChangeThemeTile(), + }, + ); + model2.fetchAndAddPlugins(context); + return Scaffold( + drawer: CustomDrawer(homeModel: model2), + key: MainScreenViewModel.scaffoldKey, + body: model2.appTourDialog(context), + ); + }, + ), + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + +class MockCallBack extends Mock { + void call(); +} + +class MockBuildContext extends Mock implements BuildContext {} + +MainScreenViewModel getModel() { + final model = MainScreenViewModel(); + model.context = MockBuildContext(); + return model; +} + +void verifyInteraction(dynamic x, {required String mockName}) { + // Ensures that navigation service was called + try { + verifyZeroInteractions(x); + //If 0 interactions passes that means mock was not called hence test fails + throw Exception("Expected interaction but found 0 with $mockName"); + } on TestFailure { + //If test fails then 1 or more interactions with navigation service hence test passes + expect(true, true); + } +} + +void main() async { + final Directory dir = Directory('test/fixtures/core'); + + Hive.init(dir.path); + // ..registerAdapter(UserAdapter()) + // ..registerAdapter(OrgInfoAdapter()); + + // final userBox = await Hive.openBox('currentUser'); + // final urlBox = await Hive.openBox('url'); + // final orgBox = await Hive.openBox('currentOrg'); + final pluginBox = await Hive.openBox('pluginBox'); + + final List> samplePluginData = [ + { + "pluginName": "Plugin1", + "pluginInstallStatus": true, + }, + // Add more sample plugin data as needed + ]; + + // Store the sample data in the 'plugins' key of 'pluginBox' + pluginBox.put('plugins', samplePluginData); + + // No need to change + setUpAll(() { + locator.registerFactory(() => CustomDrawerViewModel()); + locator.registerFactory(() => MainScreenViewModel()); + locator.registerFactory(() => AppTheme()); + locator.registerSingleton(SizeConfig()); + locator.registerFactory(() => Queries()); + locator().test(); + }); + + tearDownAll(() { + locator.unregister(); + File('test/fixtures/core/currentorg.hive').delete(); + File('test/fixtures/core/currentorg.lock').delete(); + File('test/fixtures/core/currentuser.hive').delete(); + File('test/fixtures/core/currentuser.lock').delete(); + File('test/fixtures/core/pluginbox.hive').delete(); + File('test/fixtures/core/pluginbox.lock').delete(); + }); + + group("MainScreen ViewModel Tests - ", () { + test("When initialized current index should be 0", () { + final mainTestModel = getModel(); + expect(mainTestModel.currentPageIndex, 0); + }); + }); + + // May need to change + group("onTabTapped -", () { + test("When an index is passed that, current index should equal that index", + () { + final mainTestModel = getModel(); + mainTestModel.onTabTapped(4); + expect(mainTestModel.currentPageIndex, 4); + }); + + test("When called function should notify listeners of tab change", () { + final mockcallback = MockCallBack(); + final mainTestModel = getModel(); + mainTestModel.addListener(mockcallback); + + mainTestModel.onTabTapped(0); + verify(mockcallback()).called(1); + }); + }); + + group("initialize", () { + final context = MockBuildContext(); + SizeConfig().test(); + setUp(() => registerServices()); + tearDown(() => unregisterServices()); + + void runIntialize({ + required bool fSignUp, + int mainIndex = 1, + required MainScreenViewModel model, + BuildContext? pcontext, + }) { + model.initialise( + pcontext ?? context, + fromSignUp: fSignUp, + mainScreenIndex: mainIndex, + ); + } + + test( + "MainScreenViewModel showAppTour and currentIndex should equal values passed to fromSignUp and mainScreenIndex", + () { + const bool fSignup = true; + const int mainIndex = 1; + final mainTestModel = getModel(); + runIntialize( + fSignUp: fSignup, + mainIndex: mainIndex, + model: mainTestModel, + ); + + expect(mainTestModel.showAppTour, fSignup); + expect(mainTestModel.currentPageIndex, mainIndex); + }); + + test('Test for showHome method', () { + final model = getModel(); + + model.showHome( + TargetFocus( + identify: "keyDrawerLeaveCurrentOrg", + keyTarget: MainScreenViewModel.keyDrawerLeaveCurrentOrg, + ), + ); + }); + + test( + "When fromSignUp is false tourComplete should equal true, tourSkipped and showApptour false", + () { + final mainTestModel = getModel(); + runIntialize(fSignUp: false, model: mainTestModel); + expect(mainTestModel.tourComplete, true); + expect(mainTestModel.tourSkipped, false); + expect(mainTestModel.showAppTour, false); + }); + + test("When fromSignUp is false, App Tour dialog should not be displayed", + () async { + final mocknav = getAndRegisterNavigationService(); + final mainTestModel = getModel(); + + mainTestModel.initialise( + MockBuildContext(), + fromSignUp: false, + mainScreenIndex: 0, + ); + + // Ensures that navigation service was not called + verifyZeroInteractions(mocknav); + }); + + testWidgets('Test for apptour dialog skip action.', (tester) async { + await tester.pumpWidget(createAppTourDialog()); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + expect(find.byType(CustomAlertDialog), findsOneWidget); + + // await tester.pumpAndSettle(); + + final skipBtn = find.textContaining('Skip'); + + expect(skipBtn, findsOneWidget); + + await tester.tap(skipBtn); + await tester.pumpAndSettle( + const Duration(seconds: 1), + ); + }); + + testWidgets('Test for apptour dialog success action.', (tester) async { + await tester.pumpWidget(createAppTourDialog()); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final mockUserConfig = getAndRegisterUserConfig(); + when(mockUserConfig.loggedIn).thenReturn(true); + + MainScreenViewModel.scaffoldKey.currentState?.openDrawer(); + + expect(find.byType(CustomAlertDialog), findsOneWidget); + + final startBtn = find.textContaining('Start').last; + + expect(startBtn, findsOneWidget); + + await tester.tap(startBtn); + + await tester.pumpAndSettle(const Duration(seconds: 2)); + }); + + testWidgets('Test for fetchAndAddPlugins when not in demoMode', + (tester) async { + final app = createAppTourDialog(demoMode: false); + + await tester.pumpWidget(app); + await tester.pumpAndSettle(const Duration(seconds: 1)); + }); + + group('Tests for tour', () { + late UserConfig model; + late List expectedTargets; + late Map keysMap; + final GlobalKey key = MainScreenViewModel.scaffoldKey; + setUp(() { + keysMap = {}; + expectedTargets = []; + model = getAndRegisterUserConfig(); + }); + testWidgets('Test for tourhomeTargets when userconfig.loggedin is true.', + (tester) async { + const val1 = true; + when(model.loggedIn).thenAnswer((_) => val1); + await tester.pumpWidget( + createMainScreenViewModelScreen((model2) { + model2.showHome( + TargetFocus( + identify: "keySHMenuIcon", + keyTarget: model2.keySHMenuIcon, + ), + ); + model2.tourComplete = true; + model2.tourHomeTargets(); + for (int i = 0; i < model2.targets.length; i++) { + expectedTargets.add(model2.targets[i]); + } + // ignore: avoid_dynamic_calls + model2.targets[1].next!(); + // ignore: avoid_dynamic_calls + model2.targets[5].next!(); + keysMap = { + 'keySHOrgName': model2.keySHOrgName, + 'keySHMenuIcon': model2.keySHMenuIcon, + 'keyDrawerCurOrg': MainScreenViewModel.keyDrawerCurOrg, + 'keyDrawerSwitchableOrg': + MainScreenViewModel.keyDrawerSwitchableOrg, + 'keyDrawerJoinOrg': MainScreenViewModel.keyDrawerJoinOrg, + 'keyDrawerLeaveCurrentOrg': + MainScreenViewModel.keyDrawerLeaveCurrentOrg, + 'keyBNHome': model2.keyBNHome, + 'keySHPinnedPost': model2.keySHPinnedPost, + 'keySHPost': model2.keySHPost, + }; + }), + ); + + await tester.pumpAndSettle(const Duration(seconds: 1)); + + expect(find.textContaining('tour home'), findsOneWidget); + + await tester.tap(find.textContaining('tour home')); + + await tester.pump(); + + expect(find.text('drawer123'), findsOneWidget); + + expect(expectedTargets.length, 9); + + final List keyNames = keysMap.keys.toList(); + + for (int i = 0; i < expectedTargets.length; i++) { + expect(expectedTargets[i].keyName, keyNames[i]); + expect(expectedTargets[i].key, keysMap[keyNames[i]]); + if (i != 1 && i != 4 && i != 5) { + expect(expectedTargets[i].next, null); + } else { + expect(expectedTargets[i].next, isNotNull); + } + } + }); + testWidgets('Whether AppTour is initialized or not', (tester) async { + const val1 = false; + when(model.loggedIn).thenAnswer((_) => val1); + late AppTour appTour; + + await tester.pumpWidget( + createMainScreenViewModelScreen((model2) { + model2.showHome( + TargetFocus( + identify: "keySHMenuIcon", + keyTarget: model2.keySHMenuIcon, + ), + ); + appTour = model2.appTour; + }), + ); + + await tester.pumpAndSettle(const Duration(seconds: 1)); + + expect(find.textContaining('tour home'), findsOneWidget); + + await tester.tap(find.textContaining('tour home')); + + await tester.pump(); + + expect(appTour, isNotNull); + }); + + testWidgets('Test for tourhomeTargets when userconfig.loggedin is false.', + (tester) async { + const val1 = false; + when(model.loggedIn).thenAnswer((_) => val1); + + await tester.pumpWidget( + createMainScreenViewModelScreen((model2) { + model2.showHome( + TargetFocus( + identify: "keySHMenuIcon", + keyTarget: model2.keySHMenuIcon, + ), + ); + model2.tourComplete = true; + model2.tourHomeTargets(model); + for (int i = 0; i < model2.targets.length; i++) { + expectedTargets.add(model2.targets[i]); + } + // ignore: avoid_dynamic_calls + model2.targets[4].next!(); + keysMap = { + 'keySHOrgName': model2.keySHOrgName, + 'keySHMenuIcon': model2.keySHMenuIcon, + 'keyDrawerCurOrg': MainScreenViewModel.keyDrawerCurOrg, + 'keyDrawerSwitchableOrg': + MainScreenViewModel.keyDrawerSwitchableOrg, + 'keyDrawerJoinOrg': MainScreenViewModel.keyDrawerJoinOrg, + 'keyBNHome': model2.keyBNHome, + 'keySHPinnedPost': model2.keySHPinnedPost, + 'keySHPost': model2.keySHPost, + }; + }), + ); + + await tester.pumpAndSettle(const Duration(seconds: 1)); + + expect(find.textContaining('tour home'), findsOneWidget); + + await tester.tap(find.textContaining('tour home')); + + await tester.pump(); + + expect(expectedTargets.length, 8); + + final List keyNames = keysMap.keys.toList(); + + for (int i = 0; i < expectedTargets.length; i++) { + expect(expectedTargets[i].keyName, keyNames[i]); + expect(expectedTargets[i].key, keysMap[keyNames[i]]); + if (i != 1 && i != 4) { + expect(expectedTargets[i].next, null); + } else { + expect(expectedTargets[i].next, isNotNull); + } + } + }); + testWidgets( + 'Test for tourhomeTargets whether correct function is called when tour is not exited.', + (tester) async { + await tester.pumpWidget( + MaterialApp( + home: MaterialApp( + home: Scaffold( + key: key, + body: Container(), + ), + ), + ), + ); + final BuildContext context = tester.element(find.byType(Container)); + final MainScreenViewModel modelForKeys = MainScreenViewModel(); + final MockLocalMainScreenViewModel model = + MockLocalMainScreenViewModel(); + model.context = context; + model.testMode = true; + model.appTour = MockAppTour(model: model); + model.currentPageIndex = 0; + model.showHome( + TargetFocus( + identify: "keySHMenuIcon", + keyTarget: modelForKeys.keySHMenuIcon, + ), + ); + model.tourHomeTargets(); + expect(model.stackLength, 2); + }); + + testWidgets('Test for tourEventTargets.', (tester) async { + const val1 = false; + when(model.loggedIn).thenAnswer((_) => val1); + + await tester.pumpWidget( + createMainScreenViewModelScreen((model2) { + model2.showHome( + TargetFocus( + identify: "keySHMenuIcon", + keyTarget: model2.keySHMenuIcon, + ), + ); + model2.tourComplete = true; + model2.tourEventTargets(); + for (int i = 0; i < model2.targets.length; i++) { + expectedTargets.add(model2.targets[i]); + } + keysMap = { + 'keyBNEvents': model2.keyBNEvents, + 'keySECategoryMenu': model2.keySECategoryMenu, + 'keySEDateFilter': model2.keySEDateFilter, + 'keySECard': model2.keySECard, + 'keySEAdd': model2.keySEAdd, + }; + }), + ); + + await tester.pumpAndSettle(const Duration(seconds: 1)); + + expect(find.textContaining('tour home'), findsOneWidget); + + await tester.tap(find.textContaining('tour home')); + + await tester.pump(); + + expect(expectedTargets.length, 5); + + final List keyNames = keysMap.keys.toList(); + + for (int i = 0; i < expectedTargets.length; i++) { + expect(expectedTargets[i].keyName, keyNames[i]); + expect(expectedTargets[i].key, keysMap[keyNames[i]]); + expect(expectedTargets[i].next, null); + } + }); + + testWidgets('Test for tourChats.', (tester) async { + const val1 = false; + when(model.loggedIn).thenAnswer((_) => val1); + + await tester.pumpWidget( + createMainScreenViewModelScreen((model2) { + model2.showHome( + TargetFocus( + identify: "keySHMenuIcon", + keyTarget: model2.keySHMenuIcon, + ), + ); + model2.tourComplete = true; + model2.tourChat(); + for (int i = 0; i < model2.targets.length; i++) { + expectedTargets.add(model2.targets[i]); + } + // ignore: avoid_dynamic_calls + keysMap = {'keyBNChat': model2.keyBNChat}; + }), + ); + + await tester.pumpAndSettle(const Duration(seconds: 1)); + + expect(find.textContaining('tour home'), findsOneWidget); + + await tester.tap(find.textContaining('tour home')); + + await tester.pump(); + + expect(expectedTargets.length, 1); + + final List keyNames = keysMap.keys.toList(); + + expect(expectedTargets[0].keyName, keyNames[0]); + expect(expectedTargets[0].key, keysMap[keyNames[0]]); + expect(expectedTargets[0].next, null); + }); + testWidgets( + 'Test for tourChat whether correct function is called when tour is not exited.', + (tester) async { + await tester.pumpWidget( + MaterialApp( + home: MaterialApp( + home: Scaffold( + key: key, + body: Container(), + ), + ), + ), + ); + final BuildContext context = tester.element(find.byType(Container)); + final MainScreenViewModel modelForKeys = MainScreenViewModel(); + final MockLocalMainScreenViewModel model = + MockLocalMainScreenViewModel(); + model.context = context; + model.testMode = true; + model.appTour = MockAppTour(model: model); + model.currentPageIndex = 0; + model.showHome( + TargetFocus( + identify: "keySHMenuIcon", + keyTarget: modelForKeys.keySHMenuIcon, + ), + ); + model.tourChat(); + expect(model.stackLength, 1); + }); + + testWidgets('Test for addPost.', (tester) async { + const val1 = false; + when(model.loggedIn).thenAnswer((_) => val1); + + await tester.pumpWidget( + createMainScreenViewModelScreen((model2) { + model2.showHome( + TargetFocus( + identify: "keySHMenuIcon", + keyTarget: model2.keySHMenuIcon, + ), + ); + model2.tourComplete = true; + model2.tourAddPost(); + for (int i = 0; i < model2.targets.length; i++) { + expectedTargets.add(model2.targets[i]); + } + // ignore: avoid_dynamic_calls + keysMap = {'keyBNPost': model2.keyBNPost}; + }), + ); + + await tester.pumpAndSettle(const Duration(seconds: 1)); + + expect(find.textContaining('tour home'), findsOneWidget); + + await tester.tap(find.textContaining('tour home')); + + await tester.pump(); + + expect(expectedTargets.length, 1); + + final List keyNames = keysMap.keys.toList(); + + expect(expectedTargets[0].keyName, keyNames[0]); + expect(expectedTargets[0].key, keysMap[keyNames[0]]); + expect(expectedTargets[0].next, null); + }); + testWidgets( + 'Test for tourAddPost whether correct function is called when tour is not exited.', + (tester) async { + await tester.pumpWidget( + MaterialApp( + home: MaterialApp( + home: Scaffold( + key: key, + body: Container(), + ), + ), + ), + ); + final BuildContext context = tester.element(find.byType(Container)); + final MainScreenViewModel modelForKeys = MainScreenViewModel(); + final MockLocalMainScreenViewModel model = + MockLocalMainScreenViewModel(); + model.context = context; + model.testMode = true; + model.appTour = MockAppTour(model: model); + model.currentPageIndex = 0; + model.showHome( + TargetFocus( + identify: "keySHMenuIcon", + keyTarget: modelForKeys.keySHMenuIcon, + ), + ); + model.tourAddPost(); + expect(model.stackLength, 1); + }); + + testWidgets('Test for profile tour.', (tester) async { + const val1 = false; + when(model.loggedIn).thenAnswer((_) => val1); + late MainScreenViewModel mainScreenViewModel; + + await tester.pumpWidget( + createMainScreenViewModelScreen((model2) { + model2.showHome( + TargetFocus( + identify: "keySHMenuIcon", + keyTarget: model2.keySHMenuIcon, + ), + ); + model2.tourProfile(); + for (int i = 0; i < model2.targets.length; i++) { + expectedTargets.add(model2.targets[i]); + } + keysMap = { + 'keyBNProfile': model2.keyBNProfile, + 'keySPAppSetting': model2.keySPAppSetting, + 'keySPHelp': model2.keySPHelp, + 'keySPDonateUs': model2.keySPDonateUs, + 'keySPPalisadoes': model2.keySPPalisadoes, + }; + mainScreenViewModel = model2; + }), + ); + + await tester.pumpAndSettle(const Duration(seconds: 1)); + + expect(find.textContaining('tour home'), findsOneWidget); + + await tester.tap(find.textContaining('tour home')); + + await tester.pump(); + + expect(expectedTargets.length, 5); + + final List keyNames = keysMap.keys.toList(); + + for (int i = 0; i < expectedTargets.length; i++) { + expect(expectedTargets[i].keyName, keyNames[i]); + expect(expectedTargets[i].key, keysMap[keyNames[i]]); + expect(expectedTargets[i].next, null); + } + expect(mainScreenViewModel.currentPageIndex, 0); + expect(mainScreenViewModel.tourComplete, true); + }); + }); + }); +} diff --git a/test/view_model_tests/pre_auth_view_models/login_view_model_test.dart b/test/view_model_tests/pre_auth_view_models/login_view_model_test.dart new file mode 100644 index 000000000..b9f1c737e --- /dev/null +++ b/test/view_model_tests/pre_auth_view_models/login_view_model_test.dart @@ -0,0 +1,173 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +// import 'package:flutter/material.dart'; +import 'package:flutter/widgets.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +// import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/locator.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/services/user_config.dart'; +import 'package:talawa/utils/queries.dart'; +import 'package:talawa/view_model/pre_auth_view_models/login_view_model.dart'; + +import '../../helpers/test_helpers.dart'; +// import 'package:talawa/utils/queries.dart'; +// import 'package:talawa/view_model/pre_auth_view_models/login_view_model.dart'; + +// import '../../helpers/test_helpers.dart'; + +final data = { + 'login': { + 'user': { + '_id': 'xzy1', + 'firstName': 'Test', + 'lastName': 'User', + 'email': 'testuser@gmail.com', + }, + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, +}; + +bool empty = false; + +Future main() async { + // setupFirebaseMocks(); + // await Firebase.initializeApp(); + // FirebaseMessagingPlatform.instance = kMockMessagingPlatform; + + setUp(() async { + locator.registerSingleton(Queries()); + registerServices(); + await locator.unregister(); + }); + tearDown(() async { + await locator.unregister(); + }); + + group('LoginViewModel Test -', () { + testWidgets( + 'Check if login() is working fine when organisation is not empty', + (tester) async { + locator.registerSingleton(MockUserConfig()); + + final model = LoginViewModel(); + + await tester.pumpWidget( + Form( + key: model.formKey, + child: Container(), + ), + ); + + final result = QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions(document: gql(queries.loginUser('', ''))), + ); + + when(databaseFunctions.gqlNonAuthMutation(queries.loginUser('', ''))) + .thenAnswer((_) async => result); + + await model.login(); + expect(model.validate, AutovalidateMode.disabled); + verify(databaseFunctions.gqlNonAuthMutation(queries.loginUser('', ''))); + }); + testWidgets('Check if login() is working fine when organisation empty', + (tester) async { + empty = true; + locator.registerSingleton(MockUserConfig()); + + final model = LoginViewModel(); + + await tester.pumpWidget( + Form( + key: model.formKey, + child: Container(), + ), + ); + + final result = QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions(document: gql(queries.loginUser('', ''))), + ); + + when(databaseFunctions.gqlNonAuthMutation(queries.loginUser('', ''))) + .thenAnswer((_) async => result); + + await model.login(); + expect(model.validate, AutovalidateMode.disabled); + verify(databaseFunctions.gqlNonAuthMutation(queries.loginUser('', ''))); + }); + testWidgets('Check if login() is working fine when invalid credentials', + (tester) async { + reset(navigationService); + final model = LoginViewModel(); + + await tester.pumpWidget( + Form( + key: model.formKey, + child: Container(), + ), + ); + + when(databaseFunctions.gqlNonAuthMutation(queries.loginUser('', ''))) + .thenAnswer((_) async => null); + + await model.login(); + expect(model.validate, AutovalidateMode.disabled); + verify(databaseFunctions.gqlNonAuthMutation(queries.loginUser('', ''))); + verifyNever( + navigationService.removeAllAndPush( + Routes.waitingScreen, + Routes.splashScreen, + ), + ); + }); + testWidgets('Check if login() is working fine when throws error', + (tester) async { + final model = LoginViewModel(); + + await tester.pumpWidget( + Form( + key: model.formKey, + child: Container(), + ), + ); + + when(databaseFunctions.gqlNonAuthMutation(queries.loginUser('', ''))) + .thenThrow(Exception()); + + await model.login(); + expect(model.validate, AutovalidateMode.disabled); + verify(databaseFunctions.gqlNonAuthMutation(queries.loginUser('', ''))); + }); + }); +} + +class MockUserConfig extends Mock implements UserConfig { + @override + User get currentUser => User( + joinedOrganizations: empty + ? [] + : [ + OrgInfo( + id: '3', + name: 'test org 3', + userRegistrationRequired: false, + creatorInfo: User(firstName: 'test', lastName: '1'), + ), + ], + ); + + @override + Future updateUser(User user) async => true; +} diff --git a/test/view_model_tests/pre_auth_view_models/select_organization_view_model_test.dart b/test/view_model_tests/pre_auth_view_models/select_organization_view_model_test.dart new file mode 100644 index 000000000..880fafdc5 --- /dev/null +++ b/test/view_model_tests/pre_auth_view_models/select_organization_view_model_test.dart @@ -0,0 +1,779 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/mainscreen_navigation_args.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/services/user_config.dart'; +import 'package:talawa/utils/queries.dart'; + +import 'package:talawa/view_model/pre_auth_view_models/select_organization_view_model.dart'; + +import '../../helpers/test_helpers.dart'; + +class SelectOrganizationViewModelWidget extends StatelessWidget { + const SelectOrganizationViewModelWidget({ + required this.qrKey, + this.child, + this.focusNode, + this.autoFocus, + super.key, + }); + final GlobalKey qrKey; + final FocusNode? focusNode; + final bool? autoFocus; + final Widget? child; + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Scaffold( + body: Container( + key: qrKey, + child: child ?? + TextField( + autofocus: autoFocus ?? false, + focusNode: focusNode, + ), + ), + ), + navigatorKey: navigationService.navigatorKey, + ); + } +} + +const initialiseString = "Org Id"; +late OrgInfo org; + +class _MockUserConfig extends Mock implements UserConfig { + @override + Future updateUserMemberRequestOrg(List? orgDetails) async => + Future.value(1); + + @override + User get currentUser => _user; + + @override + Future userLoggedIn() async => _userLoggedIn; + + @override + Future updateUserJoinedOrg(List orgDetails) async => 1; + + @override + int saveCurrentOrgInHive(OrgInfo saveOrgAsCurrent) => 1; +} + +User _user = User(); +bool _userLoggedIn = true; + +void main() { + SizeConfig().test(); + setUp(() async { + org = OrgInfo( + id: '3', + name: 'test org 3', + userRegistrationRequired: false, + creatorInfo: User(firstName: 'test', lastName: '1'), + ); + locator.registerSingleton(Queries()); + registerServices(); + locator.unregister(); + _user = User(); + _userLoggedIn = true; + }); + + tearDown(() async { + await locator.unregister(); + unregisterServices(); + }); + + group('Test for select organization view model - ', () { + testWidgets('Test for search Active function when focusNode has focus', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + focusNode: selectOrganizationViewModel.searchFocus, + autoFocus: true, + ), + ); + selectOrganizationViewModel.searchFocus.requestFocus(); + expect(selectOrganizationViewModel.searchFocus.hasFocus, true); + selectOrganizationViewModel.searchActive(); + + expect(selectOrganizationViewModel.organizations, []); + expect(selectOrganizationViewModel.searching, true); + expect(selectOrganizationViewModel.isBusy, false); + }); + + testWidgets( + 'Test for search Active function when focusNode does not have focus', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + focusNode: selectOrganizationViewModel.searchFocus, + ), + ); + expect(selectOrganizationViewModel.searchFocus.hasFocus, false); + selectOrganizationViewModel.searchActive(); + + expect(selectOrganizationViewModel.organizations, []); + expect(selectOrganizationViewModel.searching, false); + expect(selectOrganizationViewModel.isBusy, false); + }); + testWidgets('Test for successful initialise function', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + _user = User(refreshToken: ''); + + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + ), + ); + + when(databaseFunctions.fetchOrgById(initialiseString)) + .thenAnswer((realInvocation) async => org); + + await selectOrganizationViewModel.initialise(initialiseString); + verify( + navigationService.pushScreen( + Routes.signupDetailScreen, + arguments: org, + ), + ); + + expect(selectOrganizationViewModel.isBusy, false); + }); + testWidgets('Test for initialise function when initialise data contains -1', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + + await selectOrganizationViewModel.initialise('-1 $initialiseString'); + verifyNever( + navigationService.pushScreen( + Routes.signupDetailScreen, + arguments: org, + ), + ); + + expect(selectOrganizationViewModel.isBusy, false); + }); + testWidgets( + 'Test for initialise function when fetch.runtimeType is != OrgInfo', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + ), + ); + + when(databaseFunctions.fetchOrgById(initialiseString)) + .thenAnswer((realInvocation) async => 'hey'); + + await selectOrganizationViewModel.initialise(initialiseString); + + verifyNever( + navigationService.pushScreen( + Routes.signupDetailScreen, + arguments: org, + ), + ); + + expect(selectOrganizationViewModel.isBusy, false); + }); + testWidgets('Test for initialise function when refreshToken is not empty', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + _user = User(refreshToken: 'testtoken'); + _userLoggedIn = false; + + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + ), + ); + + when(databaseFunctions.fetchOrgById(initialiseString)) + .thenAnswer((realInvocation) async => org); + + await selectOrganizationViewModel.initialise(initialiseString); + + verifyNever( + navigationService.pushScreen( + Routes.signupDetailScreen, + arguments: org, + ), + ); + + expect(selectOrganizationViewModel.isBusy, false); + }); + testWidgets('Test for successful selectOrg function', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + ), + ); + + selectOrganizationViewModel.selectedOrganization = org; + + when(databaseFunctions.gqlAuthMutation(queries.joinOrgById(org.id!))) + .thenAnswer((realInvocation) async { + final data = { + 'joinPublicOrganization': { + 'joinedOrganizations': [], + }, + }; + + return QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions(document: gql(queries.joinOrgById(org.id!))), + ); + }); + + _userLoggedIn = true; + _user = User( + joinedOrganizations: [ + OrgInfo( + id: '1', + ), + ], + membershipRequests: [ + OrgInfo( + id: '1', + ), + ], + ); + + await selectOrganizationViewModel.selectOrg(org); + + expect(selectOrganizationViewModel.selectedOrganization, org); + }); + testWidgets( + 'Test for successful selectOrg function when org requires userRegistration', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + ), + ); + org.userRegistrationRequired = true; + selectOrganizationViewModel.selectedOrganization = org; + + when(databaseFunctions.gqlAuthMutation(queries.joinOrgById(org.id!))) + .thenAnswer((realInvocation) async { + final data = { + 'joinPublicOrganization': { + 'joinedOrganizations': [], + }, + }; + + return QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions(document: gql(queries.joinOrgById(org.id!))), + ); + }); + + _userLoggedIn = true; + _user = User( + joinedOrganizations: [ + OrgInfo( + id: '1', + ), + ], + membershipRequests: [ + OrgInfo( + id: '1', + ), + ], + ); + + await selectOrganizationViewModel.selectOrg(org); + + expect(selectOrganizationViewModel.selectedOrganization, org); + }); + + testWidgets('Test for selectOrg function when userLoggedIn is false', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + ), + ); + _userLoggedIn = false; + + await selectOrganizationViewModel.selectOrg(org); + + expect(selectOrganizationViewModel.selectedOrganization, org); + }); + testWidgets( + 'Test for selectOrg function when orgAlreadyJoined is true and orgRequestAlreadyPresent is false', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + ), + ); + _user = User( + joinedOrganizations: [org], + membershipRequests: [ + OrgInfo( + id: '1', + ), + ], + ); + _userLoggedIn = true; + + await selectOrganizationViewModel.selectOrg(org); + + final orgTest = selectOrganizationViewModel.selectedOrganization; + expect(orgTest.id, '-1'); + verify( + navigationService.showTalawaErrorSnackBar( + 'Organisation already joined', + MessageType.warning, + ), + ); + }); + testWidgets( + 'Test for selectOrg function when orgAlreadyJoined is false and orgRequestAlreadyPresent is true', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + ), + ); + _userLoggedIn = true; + _user = User( + joinedOrganizations: [ + OrgInfo( + id: '1', + ), + ], + membershipRequests: [org], + ); + + await selectOrganizationViewModel.selectOrg(org); + + final orgTest = selectOrganizationViewModel.selectedOrganization; + expect(orgTest.id, '-1'); + verify( + navigationService.showTalawaErrorSnackBar( + 'Membership request already sent', + MessageType.warning, + ), + ); + }); + testWidgets('Test for successful onTapContinue function', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + ), + ); + + selectOrganizationViewModel.selectedOrganization = org; + + selectOrganizationViewModel.onTapContinue(); + + verify( + navigationService.pushScreen( + Routes.signupDetailScreen, + arguments: org, + ), + ); + }); + testWidgets( + 'Test for successful onTapContinue function when selected organization id is -1', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + ), + ); + + selectOrganizationViewModel.selectedOrganization = OrgInfo(id: '-1'); + + selectOrganizationViewModel.onTapContinue(); + + verify( + navigationService.showTalawaErrorSnackBar( + 'Select one organization to continue', + MessageType.warning, + ), + ); + }); + testWidgets('Test for successful onTapJoin function', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + ), + ); + + selectOrganizationViewModel.selectedOrganization = org; + + when(databaseFunctions.gqlAuthMutation(queries.joinOrgById(org.id!))) + .thenAnswer((realInvocation) async { + final data = { + 'joinPublicOrganization': { + 'joinedOrganizations': [], + }, + }; + + return QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions(document: gql(queries.joinOrgById(org.id!))), + ); + }); + + _user = User( + joinedOrganizations: [org], + ); + + await selectOrganizationViewModel.onTapJoin(); + + verify(databaseFunctions.gqlAuthMutation(queries.joinOrgById(org.id!))); + verify( + navigationService.removeAllAndPush( + Routes.mainScreen, + Routes.splashScreen, + arguments: isA().having( + (main) => main.mainScreenIndex, + "main screen index", + 0, + ), + ), + ); + }); + + testWidgets( + 'Test for onTapJoin function when joined organization length is not 1', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + ), + ); + + selectOrganizationViewModel.selectedOrganization = org; + + when(databaseFunctions.gqlAuthMutation(queries.joinOrgById(org.id!))) + .thenAnswer((realInvocation) async { + final data = { + 'joinPublicOrganization': { + 'joinedOrganizations': [], + }, + }; + + return QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions(document: gql(queries.joinOrgById(org.id!))), + ); + }); + _user = User( + joinedOrganizations: [], + ); + + await selectOrganizationViewModel.onTapJoin(); + + verify(databaseFunctions.gqlAuthMutation(queries.joinOrgById(org.id!))); + verify(navigationService.pop()); + verify( + navigationService.showTalawaErrorSnackBar( + 'Joined ${org.name} successfully', + MessageType.info, + ), + ); + }); + + /// we no longer have the tap button to join a org + // testWidgets('Test for successful onTapJoin function when userRegistrationRequired is false', + // (WidgetTester tester) async { + // locator.registerSingleton(_MockUserConfig()); + // final selectOrganizationViewModel = SelectOrganizationViewModel(); + // + // await tester.pumpWidget( + // SelectOrganizationViewModelWidget( + // qrKey: selectOrganizationViewModel.qrKey, + // ), + // ); + // + // org.userRegistrationRequired = false; + // selectOrganizationViewModel.selectedOrganization = org; + // _user = User(joinedOrganizations: []); + // + // when( + // databaseFunctions + // .gqlAuthMutation(queries.sendMembershipRequest(org.id!)), + // ).thenAnswer((realInvocation) async { + // final data = { + // 'sendMembershipRequest': { + // 'organization': {}, + // }, + // }; + // + // return QueryResult( + // source: QueryResultSource.network, + // data: data, + // options: QueryOptions(document: gql(queries.joinOrgById(org.id!))), + // ); + // }); + // + // await selectOrganizationViewModel.selectOrg(org); + // + // verify( + // databaseFunctions + // .gqlAuthMutation(queries.sendMembershipRequest(org.id!)), + // ); + // verify( + // navigationService.removeAllAndPush( + // Routes.waitingScreen, + // Routes.splashScreen, + // ), + // ); + // }); + // testWidgets( + // 'Test for successful onTapJoin function when userRegistrationRequired is false and joined orgnazation is not empty', + // (WidgetTester tester) async { + // locator.registerSingleton(_MockUserConfig()); + // final selectOrganizationViewModel = SelectOrganizationViewModel(); + // + // await tester.pumpWidget( + // SelectOrganizationViewModelWidget( + // qrKey: selectOrganizationViewModel.qrKey, + // ), + // ); + // + // org.userRegistrationRequired = false; + // selectOrganizationViewModel.selectedOrganization = org; + // _user = User(joinedOrganizations: [org]); + // + // when( + // databaseFunctions + // .gqlAuthMutation(queries.sendMembershipRequest(org.id!)), + // ).thenAnswer((realInvocation) async { + // final data = { + // 'sendMembershipRequest': { + // 'organization': {}, + // }, + // }; + // + // return QueryResult( + // source: QueryResultSource.network, + // data: data, + // options: QueryOptions(document: gql(queries.joinOrgById(org.id!))), + // ); + // }); + // + // await selectOrganizationViewModel.onTapJoin(); + // + // verify( + // databaseFunctions + // .gqlAuthMutation(queries.sendMembershipRequest(org.id!)), + // ); + // verify(navigationService.pop()); + // verify( + // navigationService.showTalawaErrorSnackBar( + // 'Join in request sent to ${org.name} successfully', + // MessageType.info, + // ), + // ); + // }); + // testWidgets( + // 'Test for successful onTapJoin function when userRegistrationRequired is false and result is null', + // (WidgetTester tester) async { + // locator.registerSingleton(_MockUserConfig()); + // final selectOrganizationViewModel = SelectOrganizationViewModel(); + // + // await tester.pumpWidget( + // SelectOrganizationViewModelWidget( + // qrKey: selectOrganizationViewModel.qrKey, + // ), + // ); + // + // org.userRegistrationRequired = false; + // selectOrganizationViewModel.selectedOrganization = org; + // + // when( + // databaseFunctions + // .gqlAuthMutation(queries.sendMembershipRequest(org.id!)), + // ).thenAnswer((realInvocation) async { + // return null; + // }); + // + // await selectOrganizationViewModel.onTapJoin(); + // + // verify( + // databaseFunctions + // .gqlAuthMutation(queries.sendMembershipRequest(org.id!)), + // ); + // verifyNever(navigationService.pop()); + // verifyNever( + // navigationService.showTalawaErrorSnackBar( + // 'Join in request sent to ${org.name} successfully', + // MessageType.info, + // ), + // ); + // verifyNever( + // navigationService.removeAllAndPush( + // Routes.waitingScreen, + // Routes.splashScreen, + // ), + // ); + // }); + testWidgets( + 'Test for successful onTapJoin function when userRegistrationRequired is false and throws exception', + (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + ), + ); + + selectOrganizationViewModel.selectedOrganization = org; + + when(databaseFunctions.gqlAuthMutation(queries.joinOrgById(org.id!))) + .thenThrow(Exception()); + + await selectOrganizationViewModel.onTapJoin(); + + verify( + navigationService.showTalawaErrorSnackBar( + 'Something went wrong', + MessageType.error, + ), + ); + verify(databaseFunctions.gqlAuthMutation(queries.joinOrgById(org.id!))); + }); + // testWidgets( + // 'Test for successful onTapJoin function when userRegistrationRequired is false and throws exception', + // (WidgetTester tester) async { + // locator.registerSingleton(_MockUserConfig()); + // final selectOrganizationViewModel = SelectOrganizationViewModel(); + // + // await tester.pumpWidget( + // SelectOrganizationViewModelWidget( + // qrKey: selectOrganizationViewModel.qrKey, + // ), + // ); + // org.userRegistrationRequired = false; + // + // selectOrganizationViewModel.selectedOrganization = org; + // + // when( + // databaseFunctions + // .gqlAuthMutation(queries.sendMembershipRequest(org.id!)), + // ).thenThrow(Exception()); + // + // await selectOrganizationViewModel.onTapJoin(); + // + // verify( + // navigationService.showTalawaErrorSnackBar( + // 'SomeThing went wrong', + // MessageType.error, + // ), + // ); + // }); + testWidgets('Test for organization list', (WidgetTester tester) async { + locator.registerSingleton(_MockUserConfig()); + final selectOrganizationViewModel = SelectOrganizationViewModel(); + + await tester.pumpWidget( + SelectOrganizationViewModelWidget( + qrKey: selectOrganizationViewModel.qrKey, + ), + ); + + Map? expected; + + selectOrganizationViewModel.fetchMoreHelper( + (FetchMoreOptions options) async { + expected = options.updateQuery( + { + "organizationsConnection": [ + {"one": 1}, + {"two": 2}, + ], + }, + { + "organizationsConnection": [ + {"three": 3}, + {"four": 4}, + ], + }, + ); + return Future.value( + QueryResult( + source: QueryResultSource.network, + options: QueryOptions(document: gql(queries.fetchJoinInOrg)), + ), + ); + }, + [], + ); + + expect(expected, { + 'organizationsConnection': [ + {"one": 1}, + {"two": 2}, + {"three": 3}, + {"four": 4}, + ], + }); + }); + }); +} diff --git a/test/view_model_tests/pre_auth_view_models/set_url_view_model_test.dart b/test/view_model_tests/pre_auth_view_models/set_url_view_model_test.dart new file mode 100644 index 000000000..59c9c5259 --- /dev/null +++ b/test/view_model_tests/pre_auth_view_models/set_url_view_model_test.dart @@ -0,0 +1,366 @@ +// ignore_for_file: talawa_api_doc + +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:mockito/mockito.dart'; +import 'package:qr_code_scanner/qr_code_scanner.dart'; +import 'package:qr_flutter/qr_flutter.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/router.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/utils/validators.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/widgets/custom_progress_dialog.dart'; + +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_helpers.mocks.dart'; + +/// This is a TestWidget class. +class TestWidget extends StatelessWidget { + const TestWidget(this.model, {super.key}); + + /// State. + final SetUrlViewModel model; + @override + Widget build(BuildContext context) { + return Scaffold( + body: FloatingActionButton( + onPressed: () => model.scanQR(context), + ), + ); + } +} + +/// This is a class for mock url for testing. +class SetUrlMock extends StatelessWidget { + const SetUrlMock({required this.formKey, super.key}); + + /// formKey. + final GlobalKey formKey; + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Form( + key: formKey, + child: Container(), + ), + navigatorKey: navigationService.navigatorKey, + ); + } +} + +/// This is a class for mock url for testing. +/// +/// **params**: +/// * `themeMode`: dark +/// +/// **returns**: +/// * `Widget`: widget + +Widget forTest({ThemeMode themeMode = ThemeMode.dark}) => BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + final model1 = SetUrlViewModel(); + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + themeMode: themeMode, + theme: TalawaTheme.darkTheme, + home: FloatingActionButton( + onPressed: () async { + model1.initialise(); + }, + ), + navigatorKey: locator().navigatorKey, + onGenerateRoute: generateRoute, + ); + }, + ); + +Future main() async { + SizeConfig().test(); + + Hive.init('test/fixtures/core'); + await Hive.openBox('url'); + + late SetUrlViewModel model; + + setUp(() async { + registerServices(); + registerViewModels(); + model = SetUrlViewModel(); + }); + tearDown(() async { + unregisterViewModels(); + }); + + group('SetUrlViewModel Test -', () { + testWidgets( + 'Check if checkURLandNavigate() is working fine when urlPresent is true', + (tester) async { + locator.registerSingleton(Validator()); + + await tester.pumpWidget(Form(key: model.formKey, child: Container())); + + await model.checkURLandNavigate('/', 'arguments'); + + final captured = verify( + (navigationService as MockNavigationService).pushDialog(captureAny), + ).captured; + expect( + captured[0], + isA().having( + (e) => e.key, + 'key', + const Key('UrlCheckProgress'), + ), + ); + verify(navigationService.pop()); + verify(navigationService.pushScreen('/', arguments: 'arguments')); + verify(graphqlConfig.getOrgUrl()); + + final box = Hive.box('url'); + expect(box.get(SetUrlViewModel.urlKey), ''); + expect(box.get(SetUrlViewModel.imageUrlKey), '/talawa/'); + + File('test/fixtures/core/url.hive').delete(); + File('test/fixtures/core/url.lock').delete(); + }); + testWidgets('Check if initialize is working fine ', (tester) async { + final model = SetUrlViewModel(); + + await tester.pumpWidget(SetUrlMock(formKey: model.formKey)); + + model.initialise(); + }); + testWidgets('Check if initialize is working fine when we give url', + (tester) async { + final model = SetUrlViewModel(); + + await tester.pumpWidget(SetUrlMock(formKey: model.formKey)); + + model.initialise(inviteUrl: "http://www.youtube.com"); + }); + + testWidgets( + 'Check if checkURLandNavigate() is working fine when urlPresent is false', + (tester) async { + await locator.unregister(); + final service = MockValidator(); + + locator.registerSingleton(service); + + await tester.pumpWidget(Form(key: model.formKey, child: Container())); + + when(service.validateUrlExistence('')).thenAnswer((_) async => false); + + await model.checkURLandNavigate('/', 'arguments'); + + verify( + navigationService.showTalawaErrorSnackBar( + "URL doesn't exist/no connection please check", + MessageType.error, + ), + ); + + locator.unregister(); + }); + + testWidgets( + 'Check if checkURLandShowPopUp() is working fine when urlPresent is true', + (tester) async { + locator.registerSingleton(Validator()); + + await tester.pumpWidget(Form(key: model.formKey, child: Container())); + + await model.checkURLandShowPopUp('arguments'); + + final captured = verify( + (navigationService as MockNavigationService).pushDialog(captureAny), + ).captured; + expect( + captured[0], + isA().having( + (e) => e.key, + 'key', + const Key('UrlCheckProgress'), + ), + ); + verify(navigationService.pop()); + verify(graphqlConfig.getOrgUrl()); + verify(navigationService.showSnackBar("Url is valid")); + + final box = Hive.box('url'); + expect(box.get(SetUrlViewModel.urlKey), ''); + expect(box.get(SetUrlViewModel.imageUrlKey), '/talawa/'); + + File('test/fixtures/core/url.hive').delete(); + File('test/fixtures/core/url.lock').delete(); + }); + + testWidgets( + 'Check if checkURLandShowPopUp() is working fine when urlPresent is false', + (tester) async { + //await locator.unregister(); + final service = MockValidator(); + //locator.registerSingleton(service); + + await tester.pumpWidget(Form(key: model.formKey, child: Container())); + + when(service.validateUrlExistence('')).thenAnswer((_) async => false); + + await model.checkURLandShowPopUp('arguments'); + + verify(navigationService.pop()); + verifyNever( + navigationService.showTalawaErrorSnackBar( + "URL doesn't exist/no connection please check", + MessageType.info, + ), + ); + }); + + testWidgets('Check if scanQR() is working fine', (tester) async { + await tester.pumpWidget(MaterialApp(home: TestWidget(model))); + + await tester.tap(find.byType(FloatingActionButton)); + await tester.pump(); + + expect(find.byType(ClipRRect), findsOneWidget); + expect(find.byType(QRView), findsOneWidget); + }); + + testWidgets('Check if _onQRViewCreated() is working fine', (tester) async { + await tester.pumpWidget( + MaterialApp( + home: TestWidget(model), + navigatorKey: navigationService.navigatorKey, + ), + ); + + final controller = MockQRViewController(); + when(controller.scannedDataStream).thenAnswer((_) async* { + yield Barcode('qr?orgId=1&scan', BarcodeFormat.qrcode, null); + }); + + await tester.tap(find.byType(FloatingActionButton)); + await tester.pump(); + + (tester.widget(find.byType(QRView)) as QRView) + .onQRViewCreated(controller); + }); + + testWidgets( + 'Check if _onQRViewCreated() is working fine when throws CameraException', + (tester) async { + await tester.pumpWidget( + MaterialApp( + home: TestWidget(model), + navigatorKey: navigationService.navigatorKey, + ), + ); + + final controller = MockQRViewController(); + when(controller.scannedDataStream).thenAnswer((_) async* { + yield Barcode('qr?orgId=1&scan', BarcodeFormat.qrcode, null); + }); + // when(controller.stopCamera()) + // .thenThrow(Exception({"errorType": "error"})); + + when(controller.stopCamera()) + .thenThrow(CameraException("200", "cameraException")); + await tester.tap(find.byType(FloatingActionButton)); + await tester.pump(); + + (tester.widget(find.byType(QRView)) as QRView) + .onQRViewCreated(controller); + }); + testWidgets( + 'Check if _onQRViewCreated() is working fine when throws QrEmbeddedImageException', + (tester) async { + await tester.pumpWidget( + MaterialApp( + home: TestWidget(model), + navigatorKey: navigationService.navigatorKey, + ), + ); + + final controller = MockQRViewController(); + when(controller.scannedDataStream).thenAnswer((_) async* { + yield Barcode('qr?orgId=1&scan', BarcodeFormat.qrcode, null); + }); + // when(controller.stopCamera()) + // .thenThrow(Exception({"errorType": "error"})); + + when(controller.stopCamera()) + .thenThrow(QrEmbeddedImageException("error")); + await tester.tap(find.byType(FloatingActionButton)); + await tester.pump(); + + (tester.widget(find.byType(QRView)) as QRView) + .onQRViewCreated(controller); + }); + testWidgets( + 'Check if _onQRViewCreated() is working fine when throws QrUnsupportedVersionException', + (tester) async { + await tester.pumpWidget( + MaterialApp( + home: TestWidget(model), + navigatorKey: navigationService.navigatorKey, + ), + ); + + final controller = MockQRViewController(); + when(controller.scannedDataStream).thenAnswer((_) async* { + yield Barcode('qr?orgId=1&scan', BarcodeFormat.qrcode, null); + }); + // when(controller.stopCamera()) + // .thenThrow(Exception({"errorType": "error"})); + + when(controller.stopCamera()).thenThrow(QrUnsupportedVersionException(0)); + await tester.tap(find.byType(FloatingActionButton)); + await tester.pump(); + + (tester.widget(find.byType(QRView)) as QRView) + .onQRViewCreated(controller); + }); + testWidgets( + 'Check if _onQRViewCreated() is working fine when throws Exception', + (tester) async { + await tester.pumpWidget( + MaterialApp( + home: TestWidget(model), + navigatorKey: navigationService.navigatorKey, + ), + ); + + final controller = MockQRViewController(); + when(controller.scannedDataStream).thenAnswer((_) async* { + yield Barcode('qr?orgId=1&scan', BarcodeFormat.qrcode, null); + }); + // when(controller.stopCamera()) + // .thenThrow(Exception({"errorType": "error"})); + + when(controller.stopCamera()).thenThrow(Exception(0)); + await tester.tap(find.byType(FloatingActionButton)); + await tester.pump(); + + (tester.widget(find.byType(QRView)) as QRView) + .onQRViewCreated(controller); + }); + }); +} diff --git a/test/view_model_tests/pre_auth_view_models/signup_details_view_model_test.dart b/test/view_model_tests/pre_auth_view_models/signup_details_view_model_test.dart new file mode 100644 index 000000000..a98bf1a02 --- /dev/null +++ b/test/view_model_tests/pre_auth_view_models/signup_details_view_model_test.dart @@ -0,0 +1,561 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/mainscreen_navigation_args.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/utils/queries.dart'; +import 'package:talawa/view_model/pre_auth_view_models/signup_details_view_model.dart'; + +import '../../helpers/test_helpers.dart'; + +bool empty = true; +bool userSaved = true; +bool userRegistrationRequired = false; +final data = { + 'signUp': { + 'user': { + '_id': 'xzy1', + 'firstName': 'Test', + 'lastName': 'User', + 'email': 'testuser@gmail.com', + }, + 'accessToken': 'testtoken', + 'refreshToken': 'testtoken', + }, +}; + +class SignUpMock extends StatelessWidget { + const SignUpMock({required this.formKey, super.key}); + + final GlobalKey formKey; + @override + Widget build(BuildContext context) { + return MaterialApp( + home: Form( + key: formKey, + child: Container(), + ), + navigatorKey: navigationService.navigatorKey, + ); + } +} + +OrgInfo get org => OrgInfo( + id: '', + name: 'test org 3', + userRegistrationRequired: userRegistrationRequired, + creatorInfo: User(firstName: 'test', lastName: '1'), + ); + +void main() { + setUp(() async { + locator.registerSingleton(Queries()); + registerServices(); + await locator.unregister(); + userSaved = true; + empty = true; + userRegistrationRequired = false; + }); + tearDown(() async { + await locator.unregister(); + }); + + group('SignupDetailsViewModel Test -', () { + testWidgets( + 'Check if signup() is working fine when selected organization is not empty and public', + (tester) async { + locator.registerSingleton(MockUserConfig()); + + final model = SignupDetailsViewModel(); + + await tester.pumpWidget(SignUpMock(formKey: model.formKey)); + + model.initialise(org); + + final result = QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions( + document: gql(queries.registerUser('', '', '', '', '')), + ), + ); + when(graphqlConfig.getToken()).thenAnswer((_) async => true); + when( + databaseFunctions.gqlNonAuthMutation( + queries.registerUser('', '', '', '', ''), + ), + ).thenAnswer((_) async => result); + when(databaseFunctions.gqlAuthMutation(queries.joinOrgById(org.id!))) + .thenAnswer((realInvocation) async { + final data = { + 'joinPublicOrganization': { + 'joinedOrganizations': [], + }, + }; + + return QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions(document: gql(queries.joinOrgById(org.id!))), + ); + }); + empty = false; + + await model.signUp(); + + expect(model.validate, AutovalidateMode.disabled); + + verify(databaseFunctions.gqlAuthMutation(queries.joinOrgById(org.id!))); + verify( + databaseFunctions.gqlNonAuthMutation( + queries.registerUser('', '', '', '', ''), + ), + ); + verify( + navigationService.removeAllAndPush( + Routes.mainScreen, + Routes.splashScreen, + arguments: isA() + .having( + (mainScreenArgs) => mainScreenArgs.mainScreenIndex, + "main screen index", + 0, + ) + .having( + (mainScreenArgs) => mainScreenArgs.fromSignUp, + "from sign up", + true, + ), + ), + ); + }); + testWidgets( + 'Check if signup() is working fine when credentials are invalid', + (tester) async { + locator.registerSingleton(MockUserConfig()); + + final model = SignupDetailsViewModel(); + model.selectedOrganization = OrgInfo(id: ""); + await tester.pumpWidget(SignUpMock(formKey: model.formKey)); + + when( + databaseFunctions.gqlNonAuthMutation( + queries.registerUser('', '', '', '', ''), + ), + ).thenAnswer((_) async => null); + + await model.signUp(); + + verifyNever( + navigationService.removeAllAndPush( + Routes.waitingScreen, + Routes.splashScreen, + ), + ); + verifyNever( + navigationService.removeAllAndPush( + Routes.mainScreen, + Routes.splashScreen, + arguments: isA() + .having( + (mainScreenArgs) => mainScreenArgs.mainScreenIndex, + "main screen index", + 0, + ) + .having( + (mainScreenArgs) => mainScreenArgs.fromSignUp, + "from sign up", + true, + ), + ), + ); + }); + testWidgets( + 'Check if signup() is working fine when user is not save and/or token not refreshed', + (tester) async { + userSaved = false; + locator.registerSingleton(MockUserConfig()); + + final model = SignupDetailsViewModel(); + + await tester.pumpWidget(SignUpMock(formKey: model.formKey)); + + model.initialise(org); + + final result = QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions( + document: gql(queries.registerUser('', '', '', '', '')), + ), + ); + when(graphqlConfig.getToken()).thenAnswer((_) async => false); + when( + databaseFunctions.gqlNonAuthMutation( + queries.registerUser('', '', '', '', ''), + ), + ).thenAnswer((_) async => result); + + // Test for user not saved and user token not refreshed + await model.signUp(); + verifyNever( + navigationService.removeAllAndPush( + Routes.waitingScreen, + Routes.splashScreen, + ), + ); + verifyNever( + navigationService.removeAllAndPush( + Routes.mainScreen, + Routes.splashScreen, + arguments: isA() + .having( + (mainScreenArgs) => mainScreenArgs.mainScreenIndex, + "main screen index", + 0, + ) + .having( + (mainScreenArgs) => mainScreenArgs.fromSignUp, + "from sign up", + true, + ), + ), + ); + + // Test for user saved and user token not refreshed + userSaved = true; + await model.signUp(); + verifyNever( + navigationService.removeAllAndPush( + Routes.waitingScreen, + Routes.splashScreen, + ), + ); + verifyNever( + navigationService.removeAllAndPush( + Routes.mainScreen, + Routes.splashScreen, + arguments: isA() + .having( + (mainScreenArgs) => mainScreenArgs.mainScreenIndex, + "main screen index", + 0, + ) + .having( + (mainScreenArgs) => mainScreenArgs.fromSignUp, + "from sign up", + true, + ), + ), + ); + + // Test for user not saved and user token refreshed + userSaved = false; + when(graphqlConfig.getToken()).thenAnswer((_) async => true); + await model.signUp(); + verifyNever( + navigationService.removeAllAndPush( + Routes.waitingScreen, + Routes.splashScreen, + ), + ); + verifyNever( + navigationService.removeAllAndPush( + Routes.mainScreen, + Routes.splashScreen, + arguments: isA() + .having( + (mainScreenArgs) => mainScreenArgs.mainScreenIndex, + "main screen index", + 0, + ) + .having( + (mainScreenArgs) => mainScreenArgs.fromSignUp, + "from sign up", + true, + ), + ), + ); + }); + testWidgets( + 'Check if signup() is working fine when selected organization requires userRegistration', + (tester) async { + userRegistrationRequired = true; + locator.registerSingleton(MockUserConfig()); + + final model = SignupDetailsViewModel(); + + await tester.pumpWidget(SignUpMock(formKey: model.formKey)); + + model.initialise(org); + + final result = QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions( + document: gql(queries.registerUser('', '', '', '', '')), + ), + ); + when(graphqlConfig.getToken()).thenAnswer((_) async => true); + when( + databaseFunctions.gqlNonAuthMutation( + queries.registerUser('', '', '', '', ''), + ), + ).thenAnswer((_) async => result); + when( + databaseFunctions + .gqlAuthMutation(queries.sendMembershipRequest(org.id!)), + ).thenAnswer((realInvocation) async { + final data = { + 'sendMembershipRequest': { + 'organization': {}, + }, + }; + + return QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions( + document: gql(queries.sendMembershipRequest(org.id!)), + ), + ); + }); + empty = false; + + await model.signUp(); + + expect(model.validate, AutovalidateMode.disabled); + + verify( + databaseFunctions + .gqlAuthMutation(queries.sendMembershipRequest(org.id!)), + ); + verify( + databaseFunctions.gqlNonAuthMutation( + queries.registerUser('', '', '', '', ''), + ), + ); + verify( + navigationService.removeAllAndPush( + Routes.waitingScreen, + Routes.splashScreen, + ), + ); + }); + testWidgets( + 'Check if signup() works fine when process of register user throws exception', + (tester) async { + locator.registerSingleton(MockUserConfig()); + + final model = SignupDetailsViewModel(); + + await tester.pumpWidget(SignUpMock(formKey: model.formKey)); + + model.initialise(org); + + when(graphqlConfig.getToken()).thenAnswer((_) async => true); + when( + databaseFunctions.gqlNonAuthMutation( + queries.registerUser('', '', '', '', ''), + ), + ).thenThrow(Exception()); + + await model.signUp(); + + expect(model.validate, AutovalidateMode.disabled); + + verify( + databaseFunctions.gqlNonAuthMutation( + queries.registerUser('', '', '', '', ''), + ), + ); + verifyNever( + navigationService.removeAllAndPush( + Routes.waitingScreen, + Routes.splashScreen, + ), + ); + verifyNever( + navigationService.removeAllAndPush( + Routes.mainScreen, + Routes.splashScreen, + arguments: isA() + .having( + (mainScreenArgs) => mainScreenArgs.mainScreenIndex, + "main screen index", + 0, + ) + .having( + (mainScreenArgs) => mainScreenArgs.fromSignUp, + "from sign up", + true, + ), + ), + ); + }); + testWidgets( + 'Check if signup() works fine when process of user joining org throws exception', + (tester) async { + locator.registerSingleton(MockUserConfig()); + + final model = SignupDetailsViewModel(); + + await tester.pumpWidget(SignUpMock(formKey: model.formKey)); + + model.initialise(org); + + final result = QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions( + document: gql( + queries.registerUser('', '', '', '', ''), + ), + ), + ); + when(graphqlConfig.getToken()).thenAnswer((_) async => true); + when( + databaseFunctions.gqlNonAuthMutation( + queries.registerUser('', '', '', '', ''), + ), + ).thenAnswer((_) async => result); + when(databaseFunctions.gqlAuthMutation(queries.joinOrgById(org.id!))) + .thenThrow(Exception()); + + await model.signUp(); + + expect(model.validate, AutovalidateMode.disabled); + + verify(databaseFunctions.gqlAuthMutation(queries.joinOrgById(org.id!))); + verify( + databaseFunctions.gqlNonAuthMutation( + queries.registerUser('', '', '', '', ''), + ), + ); + verifyNever( + navigationService.removeAllAndPush( + Routes.waitingScreen, + Routes.splashScreen, + ), + ); + verifyNever( + navigationService.removeAllAndPush( + Routes.mainScreen, + Routes.splashScreen, + arguments: isA() + .having( + (mainScreenArgs) => mainScreenArgs.mainScreenIndex, + "main screen index", + 0, + ) + .having( + (mainScreenArgs) => mainScreenArgs.fromSignUp, + "from sign up", + true, + ), + ), + ); + }); + testWidgets( + 'Check if signup() is working fine when process of send membership request throws exception', + (tester) async { + userRegistrationRequired = true; + locator.registerSingleton(MockUserConfig()); + + final model = SignupDetailsViewModel(); + + await tester.pumpWidget(SignUpMock(formKey: model.formKey)); + + model.initialise(org); + + final result = QueryResult( + source: QueryResultSource.network, + data: data, + options: QueryOptions( + document: gql( + queries.registerUser('', '', '', '', ''), + ), + ), + ); + when(graphqlConfig.getToken()).thenAnswer((_) async => true); + when( + databaseFunctions.gqlNonAuthMutation( + queries.registerUser('', '', '', '', ''), + ), + ).thenAnswer((_) async => result); + when( + databaseFunctions + .gqlAuthMutation(queries.sendMembershipRequest(org.id!)), + ).thenThrow(Exception()); + empty = false; + + await model.signUp(); + + expect(model.validate, AutovalidateMode.disabled); + + verify( + databaseFunctions + .gqlAuthMutation(queries.sendMembershipRequest(org.id!)), + ); + verify( + databaseFunctions.gqlNonAuthMutation( + queries.registerUser('', '', '', '', ''), + ), + ); + verifyNever( + navigationService.removeAllAndPush( + Routes.waitingScreen, + Routes.splashScreen, + ), + ); + verifyNever( + navigationService.removeAllAndPush( + Routes.mainScreen, + Routes.splashScreen, + arguments: isA() + .having( + (mainScreenArgs) => mainScreenArgs.mainScreenIndex, + "main screen index", + 0, + ) + .having( + (mainScreenArgs) => mainScreenArgs.fromSignUp, + "from sign up", + true, + ), + ), + ); + }); + }); +} + +class MockUserConfig extends Mock implements UserConfig { + @override + User get currentUser => User( + joinedOrganizations: empty ? [] : [org], + ); + + @override + Future updateUserJoinedOrg(List orgs) { + return Future.value(2); + } + + @override + dynamic saveCurrentOrgInHive(OrgInfo org) { + return null; + } + + @override + Future updateUser(User user) async => userSaved; + + @override + Future updateUserMemberRequestOrg(List orgs) async => null; +} diff --git a/test/view_model_tests/pre_auth_view_models/waiting_view_model_test.dart b/test/view_model_tests/pre_auth_view_models/waiting_view_model_test.dart new file mode 100644 index 000000000..c74209b06 --- /dev/null +++ b/test/view_model_tests/pre_auth_view_models/waiting_view_model_test.dart @@ -0,0 +1,107 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:hive/hive.dart'; +import 'package:mockito/mockito.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/pre_auth_view_models/waiting_view_model.dart'; + +import '../../helpers/test_helpers.dart'; + +class MockBuildContext extends Mock implements BuildContext {} + +void main() { + setUp(() { + registerServices(); + }); + group("WaitingViewModel Test - ", () { + test("Check if it's initialized correctly", () { + final model = WaitingViewModel(); + final context = MockBuildContext(); + model.initialise(context); + + expect(model.currentUser, userConfig.currentUser); + expect( + model.pendingRequestOrg, + userConfig.currentUser.membershipRequests, + ); + expect( + model.greeting, + [ + { + 'text': "Please wait", + 'textStyle': Theme.of(context).textTheme.headlineSmall, + }, + { + 'text': " ${model.currentUser.firstName} ", + 'textStyle': + Theme.of(context).textTheme.titleLarge!.copyWith(fontSize: 24), + }, + { + 'text': "for organisation(s) to accept your invitation.", + 'textStyle': Theme.of(context).textTheme.headlineSmall, + }, + ], + ); + }); + test("Check if joinOrg() is pushing the joinOrg route", () { + final model = WaitingViewModel(); + final context = MockBuildContext(); + model.initialise(context); + when(navigationService.pushScreen(Routes.joinOrg, arguments: '-1')) + .thenAnswer((_) async {}); + + model.joinOrg(); + + verify(navigationService.pushScreen(Routes.joinOrg, arguments: '-1')); + }); + test("Check if logout() is working properly", () async { + final model = WaitingViewModel(); + final context = MockBuildContext(); + model.initialise(context); + + when( + navigationService.removeAllAndPush( + Routes.languageSelectionRoute, + Routes.splashScreen, + arguments: '0', + ), + ).thenAnswer((_) async {}); + + Hive + ..init('test/fixtures/core') + ..registerAdapter(UserAdapter()) + ..registerAdapter(OrgInfoAdapter()); + final user = await Hive.openBox('currentUser'); + final url = await Hive.openBox('url'); + + await user.put('test', model.currentUser); + await url.put('test', 'fakeUrl'); + + model.logout(); + + verify( + navigationService.removeAllAndPush( + Routes.languageSelectionRoute, + Routes.splashScreen, + arguments: '0', + ), + ); + + Future.delayed(Duration.zero).then((_) { + expect(user.get('test'), null); + expect(url.get('test'), null); + }); + + File('test/fixtures/core/url.hive').delete(); + File('test/fixtures/core/url.lock').delete(); + }); + }); +} diff --git a/test/view_model_tests/progress_dialog_view_model_test.dart b/test/view_model_tests/progress_dialog_view_model_test.dart new file mode 100644 index 000000000..bb5de02fb --- /dev/null +++ b/test/view_model_tests/progress_dialog_view_model_test.dart @@ -0,0 +1,45 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/view_model/widgets_view_models/progress_dialog_view_model.dart'; + +import '../helpers/test_helpers.dart'; + +void main() { + group('ProgressDialogViewModelTest -', () { + group('initialise -', () { + final mockConnectivity = getAndRegisterConnectivityService(); + final model = ProgressDialogViewModel(); + + test( + 'When called and connectivity is present, connectivityPresent must be set to true', + () async { + when(mockConnectivity.checkConnectivity()).thenAnswer( + (_) async => ConnectivityResult.mobile, + ); + + await model.initialise(); + + expect(model.connectivityPresent, true); + }); + + test( + 'When called and connectivity is not there, the screen must be popped after 2 seconds', + () async { + final mockNavigation = getAndRegisterNavigationService(); + + when(mockConnectivity.checkConnectivity()) + .thenAnswer((_) async => ConnectivityResult.none); + + await model.initialise(); + + await Future.delayed(const Duration(seconds: 2)) + .then((_) => verify(mockNavigation.pop())); + }, + ); + }); + }); +} diff --git a/test/view_model_tests/signup_details_view_model_test.dart b/test/view_model_tests/signup_details_view_model_test.dart new file mode 100644 index 000000000..6ac5ee5f7 --- /dev/null +++ b/test/view_model_tests/signup_details_view_model_test.dart @@ -0,0 +1,167 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +// import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/graphql_config.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/validators.dart'; +import '../helpers/test_helpers.dart'; +// import '../helpers/test_helpers.mocks.dart'; +import '../helpers/test_locator.dart'; + +class MockBuildContext extends Mock implements BuildContext {} + +void main() { + testSetupLocator(); + locator().test(); + locator().test(); + + setUp(() { + registerServices(); + locator().test(); + }); + + tearDown(() { + unregisterServices(); + }); + + group('SignUp Tests', () { + // final model = MockSignupDetailsViewModel(); + + test('Test validation for first and last name', () { + final String? blankFirstName = Validator.validateFirstName(""); + expect(blankFirstName, "Firstname must not be left blank."); + + final String? blankLastName = Validator.validateLastName(""); + expect(blankLastName, "Lastname must not be left blank."); + + final String? validFirstName = + Validator.validateFirstName("testFirstName"); + expect(validFirstName, null); + + final String? validLastName = Validator.validateLastName("testLastName"); + expect(validLastName, null); + }); + + test('Test validation for Email', () { + final String? blankEmail = Validator.validateEmail(""); + expect(blankEmail, "Email must not be left blank"); + + final String? invalidEmail1 = Validator.validateEmail("testInvalidEmail"); + expect(invalidEmail1, "Please enter a valid Email Address"); + + final String? invalidEmail2 = Validator.validateEmail("test@.com"); + expect(invalidEmail2, "Please enter a valid Email Address"); + + final String? invalidEmail3 = Validator.validateEmail("@test.com"); + expect(invalidEmail3, "Please enter a valid Email Address"); + + final String? validEmail = + Validator.validateEmail("testName@testOrg.com"); + expect(validEmail, null); + }); + + test('Test validation for password', () { + final String? blankPassword = Validator.validatePassword(""); + expect(blankPassword, "Password must not be left blank"); + + final String? invalidPassword1 = Validator.validatePassword("test"); + expect( + invalidPassword1, + "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,\$,etc.)", + ); + + final String? invalidPassword2 = Validator.validatePassword("123"); + expect( + invalidPassword2, + "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,\$,etc.)", + ); + + final String? invalidPassword3 = Validator.validatePassword("TEST"); + expect( + invalidPassword3, + "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,\$,etc.)", + ); + + final String? invalidPassword4 = Validator.validatePassword("test123"); + expect( + invalidPassword4, + "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,\$,etc.)", + ); + + final String? invalidPassword5 = Validator.validatePassword("test123!"); + expect( + invalidPassword5, + "Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,\$,etc.)", + ); + + final String? validPassword = Validator.validatePassword("tesT123!"); + expect(validPassword, null); + + // test for confirm password + final String? differentPassword = + Validator.validatePasswordConfirm("tesT123", "test1234"); + expect(differentPassword, "Password does not match original"); + + final String? matchingPassword = + Validator.validatePasswordConfirm("tesT123", "tesT123"); + expect(matchingPassword, null); + }); + + test('Test sign up function', () async { + // final User newUser = User(); + + // NOTE: This test is entirely WRONG. + // TODO: Fix by testing GraphQL mutations. + + // when(model.signUp()).thenAnswer((realInvocation) { + // if (newUser.id == null || newUser.id == "") { + // return "User Id can't be blank"; + // } + // if (newUser.firstName == null || newUser.firstName == "") { + // return "First Name can't be blank"; + // } + // if (newUser.lastName == null || newUser.lastName == "") { + // return "Last Name can't be blank"; + // } + // if (newUser.email == null || newUser.email == "") { + // return "Email can't be blank"; + // } + // return { + // "id": newUser.id, + // "firstName": newUser.firstName, + // "lastName": newUser.lastName, + // "email": newUser.email, + // }; + // }); + + // //checking with blank user Id + // expect(model.signUp(), "User Id can't be blank"); + + // newUser.id = "5"; + // //checking with blank first name + // expect(model.signUp(), "First Name can't be blank"); + + // newUser.firstName = "testFirstName"; + // //checking with blank last name + // expect(model.signUp(), "Last Name can't be blank"); + + // newUser.lastName = "testLastName"; + // //checking with blank email + // expect(model.signUp(), "Email can't be blank"); + + // newUser.email = "testName@testOrg.com"; + // // checking with all details + // // should give proper response + // expect(model.signUp(), { + // "id": newUser.id, + // "firstName": newUser.firstName, + // "lastName": newUser.lastName, + // "email": newUser.email, + // }); + }); + }); +} diff --git a/test/view_model_tests/theme_view_model_test.dart b/test/view_model_tests/theme_view_model_test.dart new file mode 100644 index 000000000..1b0525b85 --- /dev/null +++ b/test/view_model_tests/theme_view_model_test.dart @@ -0,0 +1,45 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:shared_preferences/shared_preferences.dart'; +import 'package:talawa/view_model/theme_view_model.dart'; +import '../helpers/test_helpers.dart'; +import '../helpers/test_locator.dart'; + +class MockBuildContext extends Mock implements BuildContext {} + +void main() { + WidgetsFlutterBinding.ensureInitialized(); + SharedPreferences.setMockInitialValues({}); + testSetupLocator(); + + setUp(() { + registerServices(); + }); + + tearDown(() { + unregisterServices(); + }); + + group('Theme View Model Tests', () { + test("test initialize function", () async { + final model = AppTheme(); + final prefs = await SharedPreferences.getInstance(); + model.initialize(); + expect(model.isdarkTheme, prefs.getBool("DynamicTheme") ?? true); + }); + + test("test switch theme function", () async { + final model = AppTheme(); + model.initialize(); + model.switchTheme(isOn: false); + expect(model.isdarkTheme, false); + + model.switchTheme(isOn: true); + expect(model.isdarkTheme, true); + }); + }); +} diff --git a/test/view_model_tests/widgets_view_model_test/comments_view_model_test.dart b/test/view_model_tests/widgets_view_model_test/comments_view_model_test.dart new file mode 100644 index 000000000..9ffecac01 --- /dev/null +++ b/test/view_model_tests/widgets_view_model_test/comments_view_model_test.dart @@ -0,0 +1,111 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/models/comment/comment_model.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/services/graphql_config.dart'; +import 'package:talawa/view_model/widgets_view_models/comments_view_model.dart'; + +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_locator.dart'; + +class MockBuildContext extends Mock implements BuildContext {} + +class MockCallbackFunction extends Mock { + void call(); +} + +void main() { + testSetupLocator(); + locator().test(); + + setUp(() { + registerServices(); + }); + + tearDown(() { + unregisterServices(); + }); + + final Post mockPost = Post( + sId: "1", + creator: userConfig.currentUser, + description: "mock post", + imageUrl: "mockImageUrl", + videoUrl: "mockVideoUrl", + organization: userConfig.currentOrg, + createdAt: DateTime.now(), + comments: [], + ); + + group('Comments View Model Tests', () { + test("Testing the functions", () async { + /// first testing initialize function + final model = CommentsViewModel(); + + when(commentsService.getCommentsForPost(mockPost.sId)) + .thenAnswer((realInvocation) async { + return []; + }); + + await model.initialise(mockPost.sId); + expect(model.commentList, []); + expect(model.postId, mockPost.sId); + + /// testing the get comments function + final commentJson1 = { + "text": "first comment", + "post": mockPost.sId, + }; + final commentJson2 = { + "text": "second comment", + "post": mockPost.sId, + }; + + final commentsJson = [commentJson1, commentJson2]; + + final comment1 = Comment( + text: "first comment", + post: mockPost.sId, + ); + final comment2 = Comment( + text: "second comment", + post: mockPost.sId, + ); + final comments = [comment1, comment2]; + when(commentsService.getCommentsForPost(mockPost.sId)) + .thenAnswer((realInvocation) async { + return commentsJson; + }); + + await model.getComments(); + + expect(model.commentList.length, comments.length); + expect(model.commentList.first.text, comment1.text); + expect(model.commentList.first.post, mockPost.sId); + expect(model.commentList.last.text, comment2.text); + expect(model.commentList.last.post, mockPost.sId); + + /// finally testing the create comment function + when(commentsService.getCommentsForPost(mockPost.sId)) + .thenAnswer((realInvocation) async { + return []; + }); + await model.initialise(mockPost.sId); + + when(commentsService.createComments(mockPost.sId, "fakeMsg")) + .thenAnswer((realInvocation) async {}); + when(postService.addCommentLocally(mockPost.sId)) + .thenAnswer((realInvocation) {}); + + await model.createComment("fakeMsg"); + + expect(model.commentList.length, 1); + expect(model.commentList.first.text, "fakeMsg"); + expect(model.commentList.first.creator!.id, "xzy1"); + }); + }); +} diff --git a/test/view_model_tests/widgets_view_model_test/like_button_view_model_test.dart b/test/view_model_tests/widgets_view_model_test/like_button_view_model_test.dart new file mode 100644 index 000000000..e140861cf --- /dev/null +++ b/test/view_model_tests/widgets_view_model_test/like_button_view_model_test.dart @@ -0,0 +1,97 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/view_model/widgets_view_models/like_button_view_model.dart'; + +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_locator.dart'; + +void main() { + registerServices(); + + final List likedBy0 = [ + LikedBy(sId: 'Test user 1'), + LikedBy(sId: 'Test user 2'), + ]; + + final post = Post( + sId: "test_post_id", + creator: userConfig.currentUser, + likedBy: likedBy0, + ); + + group("Tests for login_button_view_model", () { + test("Testing setIsLiked", () { + final model = LikeButtonViewModel(); + model.initialize(likedBy0, 'Test post_id'); + model.setIsLiked(); + expect(model.isLiked, true); + }); + test( + 'Testing checkAndSetTheIsLiked function when user is not present in likedby', + () { + final model = LikeButtonViewModel(); + model.initialize(likedBy0, 'Test post_id'); + model.checkAndSetTheIsLiked(); + expect(model.isLiked, false); + }); + + test( + 'Testing checkAndSetTheIsLiked function when user is present in likedby', + () { + final model = LikeButtonViewModel(); + likedBy0.add(LikedBy(sId: userConfig.currentUser.id)); + model.initialize(likedBy0, 'Test post_id'); + model.checkAndSetTheIsLiked(); + expect(model.isLiked, true); + likedBy0 + .removeWhere((element) => element.sId == userConfig.currentUser.id); + }); + + test("testing toggleIsLiked", () { + final model = LikeButtonViewModel(); + model.initialize(likedBy0, post.sId); + model.setIsLiked(val: false); + expect(model.isLiked, false); + final LikedBy likedBy = LikedBy( + sId: userConfig.currentUser.id, + ); + when(postService.addLike(post.sId)).thenAnswer((realInvocation) async { + model.likedBy.add(likedBy); + }); + model.toggleIsLiked(); + expect(model.likesCount, 3); + model.setIsLiked(val: true); + when(postService.removeLike(post.sId)).thenAnswer((realInvocation) async { + model.likedBy + .removeWhere((element) => element.sId == userConfig.currentUser.id); + }); + model.toggleIsLiked(); + // expect(model.likesCount, 2); + // expect(model.likedBy.contains(likedBy), false); + }); + + test("Testing updatePost", () { + final model = LikeButtonViewModel(); + model.initialize(likedBy0, post.sId); + final Post newPost = Post( + sId: "new_post_id", + creator: userConfig.currentUser, + likedBy: [], + ); + // with different post + model.updatePost(newPost); + // expect(model.likesCount, 2); + + final LikedBy likedBy3 = LikedBy(sId: "Test user 3"); + post.likedBy!.add(likedBy3); + // with same post + model.updatePost(post); + // expect(model.likesCount, 3); + // expect(model.likedBy.contains(likedBy3), true); + }); + }); +} diff --git a/test/views/after_auth_screens/add_post_page_test.dart b/test/views/after_auth_screens/add_post_page_test.dart new file mode 100644 index 000000000..4f42e79f6 --- /dev/null +++ b/test/views/after_auth_screens/add_post_page_test.dart @@ -0,0 +1,524 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/services/database_mutation_functions.dart'; +import 'package:talawa/services/third_party_service/multi_media_pick_service.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/utils/post_queries.dart'; +import 'package:talawa/view_model/after_auth_view_models/add_post_view_models/add_post_view_model.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/after_auth_screens/add_post_page.dart'; + +import '../../helpers/test_helpers.dart'; + +final homeModel = locator(); +bool removeImageCalled = false; + +class MockAddPostViewModel extends Mock implements AddPostViewModel { + final _textHashTagController = TextEditingController(text: ''); + final _controller = TextEditingController(text: ''); + final _titleController = TextEditingController(text: ''); + + @override + File? get imageFile { + return File('example'); + } + + @override + String get userName => 'UserName'; + + @override + String? get userPic => userConfig.currentUser.image; + + @override + String get orgName => 'orgName'; + + @override + TextEditingController get textHashTagController => _textHashTagController; + + @override + TextEditingController get controller => _controller; + + @override + TextEditingController get titleController => _titleController; + + // @override + // void removeImage() { + // removeImageCalled = true; + // } +} + +Widget createAddPostScreen({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, +}) { + return MaterialApp( + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + home: Scaffold( + /// MainScreenViewModel.scaffoldKey.currentState will return null + /// until and unless their is another widget with the same global key + key: MainScreenViewModel.scaffoldKey, + body: AddPost( + drawerKey: MainScreenViewModel.scaffoldKey, + ), + ), + ); +} + +final demoJson = { + 'createPost': { + '__typename': 'Post', + '_id': '1', + 'text': 'text #hastag', + 'createdAt': '2023-11-13T19:28:21.095Z', + 'imageUrl': 'https://imageurl', + 'videoUrl': 'https://videoUrl', + 'title': 'demo title', + 'commentCount': 0, + 'likeCount': 0, + 'creator': { + '__typename': 'User', + '_id': '1', + 'firstName': 'Ayush', + 'lastName': 'Raghuwanshi', + 'image': 'https://imageUrl', + }, + 'organization': {'__typename': 'Organization', '_id': '1'}, + 'likedBy': [], + 'comments': [], + }, +}; + +void main() { + // SizeConfig().test(); + setupLocator(); + // locator.registerSingleton(LikeButtonViewModel()); + sizeConfig.test(); + + setUp(() { + registerServices(); + getAndRegisterImageService(); + }); + + group('createAddPostScreen Test', () { + testWidgets('check if back button in app bar works', (tester) async { + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + final backButtonFinder = find.byKey(const Key('add_post_icon_button1')); + expect(backButtonFinder, findsOneWidget); + await tester.tap(backButtonFinder); + await tester.pump(); + verify(navigationService.pop()).called(1); + }); + + testWidgets('check if createAddPostScreen shows up', (tester) async { + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + + final finder = find.byType(Scaffold); + + expect(finder, findsNWidgets(2)); + }); + + group('checks if the upload post button is working properly', () { + testWidgets('checks if the upload post button is pressable', + (tester) async { + final dataBaseMutationFunctions = locator(); + when( + dataBaseMutationFunctions.gqlAuthMutation( + PostQueries().uploadPost(), + variables: { + "text": " #", + "organizationId": 'XYZ', + "title": '', + }, + ), + ).thenAnswer( + (realInvocation) async => QueryResult( + options: QueryOptions(document: gql(PostQueries().uploadPost())), + data: demoJson, + source: QueryResultSource.network, + ), + ); + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + + /// using the key of text button + /// because their are many text button + + final finder = find.byKey(const Key('add_post_text_btn1')); + await tester.tap(finder); + expect(finder, findsOneWidget); + await tester.pump(); + }); + testWidgets('checks if the upload post button shows correct text', + (tester) async { + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + + /// using the key of text button + /// because their are many text button + + final finder = find.byKey(const Key('add_post_text_btn1')); + final text = find.descendant(of: finder, matching: find.text('Post')); + + expect(finder, findsOneWidget); + expect(text, findsOneWidget); + }); + }); + + group('checks if the upload photo from gallery button is working properly', + () { + testWidgets( + 'checks if the upload photo from gallery button shows correct icon', + (tester) async { + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + + /// using the key of icon button + /// because their are many icon button + + final finder = find.byKey(const Key('add_post_icon_button2')); + + final icon = + find.descendant(of: finder, matching: find.byIcon(Icons.photo)); + + expect(finder, findsOneWidget); + expect(icon, findsOneWidget); + }); + + testWidgets( + 'checks if the upload photo from gallery button ad other process are working properly', + (tester) async { + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + + /// using the key of icon button + /// because their are many icon button + + final finder = find.byKey(const Key('add_post_icon_button2')); + + expect(finder, findsOneWidget); + + ///returning the file variable to the + ///result of function multimediaPickerService.getPhotoFromGallery + ///when this function is called in the + ///view model of add_post_page. + final file = File('fakePath'); + + /// using the new instance of multimediaPickerService + /// so that when statement can be used again, + /// else it gives null point exception + final multimediaPickerService = locator(); + + /// when is function provided by mockito lib + when(multimediaPickerService.getPhotoFromGallery(camera: false)) + .thenAnswer((_) async { + return file; + }); + + /// taping the button + await tester.tap(finder); + await tester.pump(); + }); + + testWidgets( + 'checks if the uploaded photo from gallery button is presented on the screen', + (tester) async { + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + + /// using the key of icon button + /// because their are many icon button + + final finder = find.byKey(const Key('add_post_icon_button2')); + + final finder2 = find.byType(Stack); + + final finder3 = find.byType(Positioned); + + expect(finder, findsOneWidget); + + ///returning the file variable to the + ///result of function multimediaPickerService.getPhotoFromGallery + ///when this function is called in the + ///view model of add_post_page. + final file = File('fakePath'); + + /// using the new instance of multimediaPickerService + /// so that when statement can be used again, + /// else it gives null point exception + final multimediaPickerService = locator(); + + /// when is function provided by mockito lib + when(multimediaPickerService.getPhotoFromGallery(camera: false)) + .thenAnswer((_) async { + return file; + }); + + await tester.tap(finder); + await tester.pump(); + + expect(finder2, findsNWidgets(3)); + + expect(finder3, findsNWidgets(1)); + }); + + testWidgets( + 'checks if the uploaded photo from gallery button is removed after pressing remove button', + (tester) async { + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + + /// using the key of icon button + /// because their are many icon button + + final finder = find.byKey(const Key('add_post_icon_button2')); + + final cancelBtn = find.byIcon(Icons.cancel); + + expect(finder, findsOneWidget); + + ///returning the file variable to the + ///result of function multimediaPickerService.getPhotoFromGallery + ///when this function is called in the + ///view model of add_post_page. + final file = File('fakePath'); + + /// using the new instance of multimediaPickerService + /// so that when statement can be used again, + /// else it gives null point exception + final multimediaPickerService = locator(); + + /// when is function provided by mockito lib + when(multimediaPickerService.getPhotoFromGallery(camera: false)) + .thenAnswer((_) async { + return file; + }); + + await tester.tap(finder); + await tester.pumpAndSettle(); + + final offSet = tester.getCenter(cancelBtn); + await tester.tapAt(offSet); + await tester.pump(); + }); + }); + + group('checks if the upload photo by camera button is working properly', + () { + testWidgets( + 'checks if the upload photo by camera button shows correct icon', + (tester) async { + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + + /// using the key of icon button + /// because their are many icon button + + final finder = find.byKey(const Key('add_post_icon_button3')); + + final icon = find.descendant( + of: finder, + matching: find.byIcon(Icons.camera_alt), + ); + + expect(finder, findsOneWidget); + expect(icon, findsOneWidget); + }); + + testWidgets( + 'checks if the upload by camera one button button is pressable', + (tester) async { + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + + /// using the key of icon button + /// because their are many icon button + + final finder = find.byKey(const Key('add_post_icon_button3')); + + expect(finder, findsOneWidget); + + ///returning the file variable to the + ///result of function multimediaPickerService.getPhotoFromGallery + ///when this function is called in the + ///view model of add_post_page. + final file = File('fakePath'); + + /// using the new instance of multimediaPickerService + /// so that when statement can be used again, + /// else it gives null point exception + final multimediaPickerService = locator(); + + /// when is function provided by mockito lib + when(multimediaPickerService.getPhotoFromGallery(camera: true)) + .thenAnswer((_) async { + return file; + }); + + await tester.tap(finder); + await tester.pump(); + }); + }); + + group('checks if the upload file button is working properly', () { + // testWidgets('checks if the upload file button button is pressable', + // (tester) async { + // await tester.pumpWidget(createAddPostScreen()); + // await tester.pump(); + // + // /// using the key of icon button + // /// because their are many icon button + // + // final finder = find.byKey(const Key('add_post_icon_button4')); + // + // expect(finder, findsOneWidget); + // + // await tester.tap(finder); + // await tester.pump(); + // }); + }); + + group('checks if the add hashtag button is working properly', () { + /// TODO: Hashtags implementation removed currently + testWidgets('checks if the add hashtag button shows correct text', + (tester) async { + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + + /// using the key of text button + /// because their are many text button + + final finder = find.byKey(const Key('add_post_text_btn2')); + + // final icon = + // find.descendant(of: finder, matching: find.text('Add tag')); + + expect(finder, findsOneWidget); + // expect(icon, findsOneWidget); + }); + + testWidgets('checks if the add hashtag button is pressable', + (tester) async { + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + + /// using the key of text button + /// because their are many text button + + final finder = find.byKey(const Key('add_post_text_btn2')); + + expect(finder, findsOneWidget); + + await tester.tap(finder); + await tester.pump(); + }); + testWidgets('checks if the add hashtag button add is pressable', + (tester) async { + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + + /// using the key of text button + /// because their are many text button + + final finder = find.byKey(const Key('add_post_text_btn2')); + + expect(finder, findsOneWidget); + + await tester.tap(finder); + await tester.pump(); + + final hashtag = find.byKey(const Key("add_hashtag_button")); + + expect(hashtag, findsOneWidget); + + await tester.tap(hashtag); + await tester.pump(); + }); + + testWidgets('checks if the cancel hashtag button add is pressable', + (tester) async { + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + + /// using the key of text button + /// because their are many text button + + final finder = find.byKey(const Key('add_post_text_btn2')); + + expect(finder, findsOneWidget); + + await tester.tap(finder); + await tester.pump(); + + final hashtag = find.byKey(const Key("cancel_hashtag_button")); + + expect(hashtag, findsOneWidget); + + await tester.tap(hashtag); + await tester.pump(); + }); + }); + +//TODO: null + testWidgets('Check if icon button is pressable.', (tester) async { + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + + /// using the key of icon button + /// because their are many icon button + + final finder = find.byKey(const Key('add_post_icon_button1')); + + expect(finder, findsOneWidget); + + await tester.tap(finder); + await tester.pump(); + }); + + testWidgets('check if remove Image button works', (tester) async { + locator.unregister(); + final mockModel = + locator.registerSingleton(MockAddPostViewModel()); + + when(mockModel.removeImage()).thenAnswer((_) {}); + + await tester.pumpWidget(createAddPostScreen()); + await tester.pump(); + + final removeImageBtn = + tester.widget(find.byKey(const Key('remove_icon'))) as IconButton; + + removeImageBtn.onPressed!(); + + verify(mockModel.removeImage()); + }); + }); +} diff --git a/test/views/after_auth_screens/chat/chat_message_screen_test/chat_message_screen_test.dart b/test/views/after_auth_screens/chat/chat_message_screen_test/chat_message_screen_test.dart new file mode 100644 index 000000000..0026ffb01 --- /dev/null +++ b/test/views/after_auth_screens/chat/chat_message_screen_test/chat_message_screen_test.dart @@ -0,0 +1,81 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/router.dart' as router; +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/after_auth_screens/chat/chat_message_screen.dart'; +import 'package:talawa/views/after_auth_screens/chat/widgets/chat_input_field.dart'; +import 'package:talawa/views/base_view.dart'; + +import '../../../../helpers/test_helpers.dart'; +import '../../../../helpers/test_locator.dart'; + +final directChatViewModel = getAndRegisterDirectChatViewModel(); + +Widget createApp() { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: ChatMessageScreen(chatId: "XYZ", model: directChatViewModel), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); +} + +Future showChatMessageScreen(WidgetTester tester) async { + await tester.pumpWidget(createApp()); + await tester.pumpAndSettle(); +} + +void main() { + SizeConfig().test(); + testSetupLocator(); + registerServices(); + + testWidgets('Check if Chat Message Screen page shows up', (tester) async { + await showChatMessageScreen(tester); + expect(find.byType(Scaffold), findsOneWidget); + }); + + testWidgets('Check if Back page button is working', (tester) async { + await showChatMessageScreen(tester); + await tester.tap(find.byIcon(Icons.arrow_back)); + + expect(find.byType(Scaffold), findsOneWidget); + }); + + testWidgets('Check if the Chat Input Field is in the widget tree', + (tester) async { + await showChatMessageScreen(tester); + + expect(find.byType(ChatInputField), findsOneWidget); + }); + + testWidgets( + 'Check if the circular progress indicator shows up on the loading state', + (tester) async { + when(directChatViewModel.chatState).thenReturn(ChatState.loading); + await tester.pumpWidget(createApp()); + await tester.pump(); + + expect(find.byType(CircularProgressIndicator), findsOneWidget); + }, + ); +} diff --git a/test/views/after_auth_screens/chat/select_contact_test.dart b/test/views/after_auth_screens/chat/select_contact_test.dart new file mode 100644 index 000000000..e581e4f52 --- /dev/null +++ b/test/views/after_auth_screens/chat/select_contact_test.dart @@ -0,0 +1,138 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/router.dart' as router; +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/after_auth_view_models/chat_view_models/select_contact_view_model.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/views/after_auth_screens/chat/chat_list_screen.dart'; +import 'package:talawa/views/after_auth_screens/chat/select_contact.dart'; +import 'package:talawa/views/base_view.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +Widget createApp() { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: const SelectContact(), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); +} + +Widget createChatListScreen() { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: const ChatPage(), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); +} + +Future showSelectContactScreen(WidgetTester tester) async { + await tester.pumpWidget(createApp()); + await tester.pump(); + await tester.tap(find.textContaining('Ayush')); + await tester.pumpAndSettle(); +} + +Future showSelectContactScreenByChatPage(WidgetTester tester) async { + await tester.pumpWidget(createChatListScreen()); + await tester.pump(); + await tester.tap(find.byIcon(Icons.add)); + await tester.pumpAndSettle(); +} + +void main() { + SizeConfig().test(); + // testSetupLocator(); + registerServices(); + registerViewModels(); + final model = SelectContactViewModel(); + model.initialise(); + final User user1 = User(id: "fakeUser1", firstName: "Shivam"); + final User user2 = User(id: "fakeUser2", firstName: "Talawa"); + final List users = [user1, user2]; + + when(organizationService.getOrgMembersList("XYZ")) + .thenAnswer((realInvocation) async { + return users; + }); + + testWidgets('Check if Select Contacts page shows up', (tester) async { + await tester.pumpWidget(createApp()); + await tester.pump(); + expect(find.byType(Scaffold), findsOneWidget); + + await showSelectContactScreenByChatPage(tester); + expect(find.byType(Scaffold), findsOneWidget); + }); + testWidgets('Check if Back page button is working', (tester) async { + await showSelectContactScreenByChatPage(tester); + await tester.tap(find.byIcon(Icons.arrow_back)); + + expect(find.byType(Scaffold), findsOneWidget); + }); + testWidgets( + 'Check if Select contact comes up when prompted fromm chat list screen', + (tester) async { + await showSelectContactScreenByChatPage(tester); + await tester.pump(); + + expect(find.byType(Scaffold), findsOneWidget); + }); + + testWidgets("Test if list view is visible", (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createApp()); + await tester.pump(); + await tester.pumpAndSettle(const Duration(milliseconds: 4000)); + + expect(find.byType(ListView), findsOneWidget); + expect( + find.byKey( + const ValueKey('select_contact_gesture_0'), + ), + findsNWidgets(1), + ); + expect( + find.byKey( + const ValueKey('select_contact_gesture_1'), + ), + findsNWidgets(1), + ); + final gesturedetect = find.byKey( + const ValueKey('select_contact_gesture_1'), + ); + await tester.tap(gesturedetect); + + expect(find.text('Shivam'), findsOneWidget); + expect(find.text('Talawa'), findsOneWidget); + }); + }); +} diff --git a/test/views/after_auth_screens/chat/widgets/chat_input_field_test.dart b/test/views/after_auth_screens/chat/widgets/chat_input_field_test.dart new file mode 100644 index 000000000..ed2a80187 --- /dev/null +++ b/test/views/after_auth_screens/chat/widgets/chat_input_field_test.dart @@ -0,0 +1,92 @@ +// ignore_for_file: talawa_api_doc + +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/router.dart' as router; +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/after_auth_screens/chat/widgets/chat_input_field.dart'; +import 'package:talawa/views/base_view.dart'; + +import '../../../../helpers/test_helpers.dart'; +import '../../../../helpers/test_locator.dart'; + +/// DirectChatViewModel mock. +final directChatViewModel = getAndRegisterDirectChatViewModel(); + +/// Function creates chatInputField. +/// +/// **params**: +/// None +/// +/// **returns**: +/// * `Widget`: The actual chatInputField to test +Widget createChatInputField() { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + theme: TalawaTheme.darkTheme, + home: Scaffold( + body: ChatInputField( + chatId: "XYZ", + model: directChatViewModel, + ), + ), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); +} + +void main() { + SizeConfig().test(); + testSetupLocator(); + registerServices(); + testWidgets("Check if chat input field shows up", (tester) async { + await tester.pumpWidget(createChatInputField()); + await tester.pumpAndSettle(); + + expect(find.byType(ChatInputField), findsOneWidget); + expect(find.byType(TextField), findsOneWidget); + + final textFieldWidget = find.byType(TextField); + await tester.enterText(textFieldWidget, 'Something'); + + final TextField textField = tester.widget(textFieldWidget); + expect(textField.controller!.text, 'Something'); + + expect(find.text('Type a message'), findsOneWidget); + + expect(find.text('Something'), findsOneWidget); + }); + testWidgets('Check if sending messages work', (tester) async { + await tester.pumpWidget(createChatInputField()); + await tester.pumpAndSettle(); + + final textFieldWidget = find.byType(TextField); + await tester.enterText(textFieldWidget, 'Something'); + await tester.pumpAndSettle(); + expect(find.text('Something'), findsOneWidget); + await tester.pump(); + final sendMessageButton = find.byKey(const Key('InputFieldGestureKey')); + await tester.tap(sendMessageButton); + + expect(directChatViewModel.chatMessagesByUser['XYZ']?.length, 2); + + final TextField textField = tester.widget(textFieldWidget); + expect(textField.controller!.text, ''); + }); +} diff --git a/test/views/after_auth_screens/chat/widgets/chat_message_bubble.dart b/test/views/after_auth_screens/chat/widgets/chat_message_bubble.dart new file mode 100644 index 000000000..0372f9808 --- /dev/null +++ b/test/views/after_auth_screens/chat/widgets/chat_message_bubble.dart @@ -0,0 +1,152 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/chats/chat_message.dart'; +import 'package:talawa/models/chats/chat_user.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/views/after_auth_screens/chat/widgets/chat_message_bubble.dart'; + +Widget createChatMessageBubble() { + return MaterialApp( + theme: TalawaTheme.darkTheme, + home: Scaffold( + body: Message( + message: ChatMessage( + "fake_id", + ChatUser( + firstName: "ravidi", + id: "chad", + image: "amogus", + ), + "fake_chat", + ChatUser( + firstName: "sheikh", + id: "gaad", + image: "amogus", + ), + ), + ), + ), + ); +} + +const remoteMessageBorderRadius = BorderRadius.only( + bottomRight: Radius.circular(15), + topRight: Radius.circular(15), + bottomLeft: Radius.circular(15), +); + +const localMessageBorderRadius = BorderRadius.only( + bottomRight: Radius.circular(15), + topLeft: Radius.circular(15), + bottomLeft: Radius.circular(15), +); + +void main() { + SizeConfig().test(); + setupLocator(); + + group("Tests for chat_message_bubble.dart", () { + testWidgets("Check if Message shows up", (tester) async { + await tester.pumpWidget(createChatMessageBubble()); + await tester.pump(); + + expect(find.byType(Message), findsOneWidget); + }); + + testWidgets("Check if chat text renders correctly", (tester) async { + userConfig.currentUser.firstName = "undef"; + await tester.pumpWidget(createChatMessageBubble()); + await tester.pump(); + + Finder chatTextBlack = find.byWidgetPredicate( + (widget) => + widget is Text && + widget.data == "fake_chat" && + widget.style!.color == + TalawaTheme.darkTheme.textTheme.bodyLarge!.color, + description: 'Text widget with color as black', + ); + + expect(chatTextBlack, findsOneWidget); + + userConfig.currentUser.firstName = "ravidi"; + + // Now the text color should change to black + chatTextBlack = find.byWidgetPredicate( + (widget) => + widget is Text && + widget.data == "fake_chat" && + widget.style!.color == Colors.black, + description: 'Text widget with color as black', + ); + + expect(chatTextBlack, findsNothing); + }); + + testWidgets("Check if remote chat aligns correctly", (tester) async { + userConfig.currentUser.firstName = "undef"; + + await tester.pumpWidget(createChatMessageBubble()); + await tester.pump(); + + // Remote message should be on the left + final chat = find.byWidgetPredicate( + (widget) => + widget is Padding && + widget.child is Row && + (widget.child! as Row).mainAxisAlignment == MainAxisAlignment.start, + description: 'A row aligned to left (remote message)', + ); + + expect(chat, findsOneWidget); + + find.byWidgetPredicate( + (widget) { + final chatContainer = + ((widget as Padding).child! as Row).children[0] as Container; + final chatDecoration = chatContainer.decoration! as BoxDecoration; + + return chatDecoration.color == Colors.green && + chatDecoration.borderRadius == remoteMessageBorderRadius; + }, + description: "Check if chat container is properly decorated", + ); + }); + + testWidgets("Check if local chat shows correctly", (tester) async { + userConfig.currentUser.firstName = "ravidi"; + + await tester.pumpWidget(createChatMessageBubble()); + await tester.pump(); + + // Local message should be on the right + expect( + find.byWidgetPredicate( + (widget) => + widget is Padding && + widget.child is Row && + (widget.child! as Row).mainAxisAlignment == MainAxisAlignment.end, + description: 'A row aligned to right (local message)', + ), + findsOneWidget, + ); + + find.byWidgetPredicate( + (widget) { + final chatContainer = + ((widget as Padding).child! as Row).children[0] as Container; + final chatDecoration = chatContainer.decoration! as BoxDecoration; + + return chatDecoration.color == Colors.white && + chatDecoration.borderRadius == localMessageBorderRadius; + }, + description: "Check if chat container is properly decorated", + ); + }); + }); +} diff --git a/test/views/after_auth_screens/events/create_custom_recurring_event_test.dart b/test/views/after_auth_screens/events/create_custom_recurring_event_test.dart new file mode 100644 index 000000000..b4997ad42 --- /dev/null +++ b/test/views/after_auth_screens/events/create_custom_recurring_event_test.dart @@ -0,0 +1,303 @@ +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/constants/recurrence_values.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/after_auth_view_models/event_view_models/create_event_view_model.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/create_custom_recurring_event.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/create_recurring_event_helper_widgets.dart'; +import 'package:talawa/widgets/custom_weekday_selector.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +/// Creates a EventScreen for tests. +/// +/// **params**: +/// * `themeMode`: ThemeMode +/// * `theme`: ThemeData of App +/// +/// **returns**: +/// * `Widget`: Event Screen Widget +Widget createCustomRecurrenceScreen({ + ThemeMode themeMode = ThemeMode.light, + required ThemeData theme, + CreateEventViewModel? model, +}) => + BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + themeMode: themeMode, + theme: theme, + home: Scaffold( + body: CustomRecurrencePage( + model: model ?? CreateEventViewModel(), + ), + ), + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + +void main() { + SizeConfig().test(); + testSetupLocator(); + getAndRegisterNavigationService(); + + // setUp(() { + // registerServices(); + // }); + + // tearDown(() { + // unregisterServices(); + // }); + group('Test custom recurrence page.', () { + testWidgets('Appbar is being rendered as expected.', (tester) async { + await tester.pumpWidget( + createCustomRecurrenceScreen( + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pump(); + + final appBarFinder = find.byType(AppBar); + + // verify if AppBar renders. + expect(appBarFinder, findsOne); + + // Verify if the AppBar renders with the correct title + expect(find.text('Custom recurrence'), findsOneWidget); + + // Verify if the Done button is present + expect(find.text('Done'), findsOneWidget); + }); + + testWidgets('Custom divider widget.', (tester) async { + await tester.pumpWidget( + createCustomRecurrenceScreen( + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pump(); + + final customDividerFinder = find.byType(Divider); + + expect(customDividerFinder, findsNWidgets(2)); + }); + + testWidgets('Custom inpurFieldHeading widgets.', (tester) async { + await tester.pumpWidget( + createCustomRecurrenceScreen( + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pump(); + + expect(find.text("Repeats every"), findsOne); + expect(find.text("Repeats on"), findsOne); + expect(find.text("Ends"), findsOne); + }); + + testWidgets('CustomRectangle & CustomTextField widgets.', (tester) async { + await tester.pumpWidget( + createCustomRecurrenceScreen( + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pump(); + + final customRectangleFinder = find.byType(CustomRectangle); + final customTextFieldFinder = find.byType(CustomTextField); + + expect(customRectangleFinder, findsNWidgets(2)); + expect(customTextFieldFinder, findsNWidgets(2)); + }); + + testWidgets('section1InputFields', (tester) async { + await tester.pumpWidget( + createCustomRecurrenceScreen( + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pump(); + + // Test text field. + final inputsection1TextField = + find.byKey(const Key('inputsection1TextField')); + + await tester.enterText(inputsection1TextField, "23"); + await tester.pumpAndSettle(); + + expect(find.text("23"), findsOne); + + await tester.enterText(inputsection1TextField, "235"); + await tester.pumpAndSettle(); + + // Testing the limit is set to 2. + expect(find.text("23"), findsOne); + + // Test RecurrenceFrequencyDropdown + expect(find.text("week"), findsOne); + + final popupMenuButton = find.byType(PopupMenuButton); + + await tester.tap(popupMenuButton); + await tester.pumpAndSettle(); + + expect(find.text("day"), findsOne); + expect(find.text("month"), findsOne); + expect(find.text("year"), findsOne); + + // Test dropdown selection working. + await tester.tap(find.text("month")); + await tester.pumpAndSettle(); + + expect(find.text("month"), findsOne); + + // check if monthly recurrence dropdown shows up. + await tester.tap(find.text('Monthly on day 3')); + await tester.pumpAndSettle(); + await tester.tap(find.text('Monthly on day 3').last); + await tester.pumpAndSettle(); + + // check if interval UI's middle part dissappears + // when clicked on day/year. + await tester.tap(find.text('month')); + await tester.pumpAndSettle(); + await tester.tap(find.text('year')); + await tester.pumpAndSettle(); + + expect(find.text('Monthly on day 3'), findsNothing); + }); + + testWidgets('CustomWeekDaySelector', (tester) async { + final widget = createCustomRecurrenceScreen( + theme: TalawaTheme.darkTheme, + ); + await tester.pumpWidget(widget); + await tester.pump(); + + // Test widget rendering. + expect(find.byType(CustomWeekDaySelector), findsOne); + + // Test widget functionality. + await tester.tap(find.text("M")); + await tester.pumpAndSettle(); + await tester.tap(find.text("W")); + await tester.pumpAndSettle(); + + expect(find.text("S"), findsNWidgets(2)); + expect(find.text("M"), findsNWidgets(1)); + expect(find.text("T"), findsNWidgets(2)); + expect(find.text("W"), findsNWidgets(1)); + expect(find.text("F"), findsNWidgets(1)); + }); + + testWidgets('EventEndOptions', (tester) async { + final CreateEventViewModel model = CreateEventViewModel(); + final widget = createCustomRecurrenceScreen( + theme: TalawaTheme.darkTheme, + model: model, + ); + await tester.pumpWidget(widget); + await tester.pump(); + + expect( + find.byKey( + const Key('neverRadioButton'), + ), + findsOne, + ); + expect( + find.byKey( + const Key('onRadioButton'), + ), + findsOne, + ); + expect(find.byKey(const Key('afterRadioButton')), findsOne); + + final afterFinder = find.byKey(const Key('afterRadioButton')); + + await tester.tap(afterFinder); + await tester.pumpAndSettle(); + + final dateSelectorCalendar = + find.byKey(const Key('dateSelectorCalendar')); + + await tester.tap(dateSelectorCalendar); + await tester.pumpAndSettle(); + + expect(find.byType(DatePickerDialog), findsOne); + + await tester.tap(find.text('15').last); + await tester.pumpAndSettle(); + await tester.tap(find.text('OK')); + await tester.pumpAndSettle(); + + expect(find.byType(DatePickerDialog), findsNothing); + + await tester.tap(find.text('Never')); + await tester.pumpAndSettle(); + + expect(model.eventEndType, EventEndTypes.never); + expect(model.eventEndDate, null); + + await tester.tap(find.text('On')); + await tester.pumpAndSettle(); + + expect(model.eventEndType, EventEndTypes.on); + }); + + testWidgets('Done button', (tester) async { + final CreateEventViewModel model = CreateEventViewModel(); + final widget = createCustomRecurrenceScreen( + theme: TalawaTheme.darkTheme, + model: model, + ); + await tester.pumpWidget(widget); + await tester.pump(); + + await tester.tap(find.text('Done')); + await tester.pumpAndSettle(); + + expect(model.eventEndDate, null); + + await tester.tap(find.text('On')); + await tester.pumpAndSettle(); + + await tester.tap(find.text('Done')); + await tester.pumpAndSettle(); + + expect(model.eventEndDate, model.eventEndOnEndDate); + + await tester.tap(find.text('After')); + await tester.pumpAndSettle(); + + final afterTextField = find.byType(CustomTextField).last; + + await tester.tap(afterTextField); + await tester.pumpAndSettle(); + + await tester.enterText(afterTextField, '2'); + + await tester.tap(find.text('Done')); + await tester.pumpAndSettle(); + + expect(model.endOccurenceController.text, '2'); + }); + }); +} diff --git a/test/views/after_auth_screens/events/create_event_page_test.dart b/test/views/after_auth_screens/events/create_event_page_test.dart new file mode 100644 index 000000000..5d5f5eb7a --- /dev/null +++ b/test/views/after_auth_screens/events/create_event_page_test.dart @@ -0,0 +1,755 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:intl/intl.dart'; +import 'package:mockito/mockito.dart'; +import 'package:mocktail_image_network/mocktail_image_network.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/router.dart' as router; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/services/third_party_service/multi_media_pick_service.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/view_model/lang_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/create_event_page.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/recurrence_dialog.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; +import '../../../widget_tests/after_auth_screens/events/create_event_form_test.dart'; + +class MockCallbackFunction extends Mock { + void call(); +} + +final setDateCallback = MockCallbackFunction(); +final setTimeCallback = MockCallbackFunction(); + +/// Creates a EventScreen for tests. +/// +/// **params**: +/// * `themeMode`: ThemeMode +/// * `theme`: ThemeData of App +/// +/// **returns**: +/// * `Widget`: Event Screen Widget +Widget createEventScreen({ + ThemeMode themeMode = ThemeMode.light, + required ThemeData theme, +}) => + BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + themeMode: themeMode, + theme: theme, + home: const Scaffold( + body: CreateEventPage( + key: Key('CreateEventScreen'), + ), + ), + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + +void main() { + SizeConfig().test(); + testSetupLocator(); + // locator.unregister(); + locator.unregister(); + // locator.registerSingleton(OrganizationService()); + // locator.registerSingleton(LikeButtonViewModel()); + + setUp(() { + registerServices(); + }); + + tearDown(() { + unregisterServices(); + }); + group('testing', () { + testWidgets("Checking tap Inkwell for setDate 1 datetime", (tester) async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pump(); + final inkwellFinder = find.byType(InkWell); + expect(inkwellFinder, findsNWidgets(8)); + // tester.allElements.forEach((element) { + // print(element); + // }); + + ///returning the file variable to the + ///result of function multimediaPickerService.getPhotoFromGallery + ///when this function is called in the + ///view model of add_post_page. + final file = File('fakePath'); + + /// using the new instance of multimediaPickerService + /// so that when statement can be used again, + /// else it gives null point exception + final multimediaPickerService = locator(); + + /// when is function provided by mockito lib + when(multimediaPickerService.getPhotoFromGallery(camera: false)) + .thenAnswer((_) async { + return file; + }); + + await tester.tap(inkwellFinder.at(1)); + await tester.pump(); + }); + + testWidgets("Checking tap Inkwell for setTime 1 datetime", (tester) async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pump(); + final inkwellFinder = find.byType(InkWell); + expect(inkwellFinder, findsNWidgets(8)); + + ///returning the file variable to the + ///result of function multimediaPickerService.getPhotoFromGallery + ///when this function is called in the + ///view model of add_post_page. + final file = File('fakePath'); + + /// using the new instance of multimediaPickerService + /// so that when statement can be used again, + /// else it gives null point exception + final multimediaPickerService = locator(); + + /// when is function provided by mockito lib + when(multimediaPickerService.getPhotoFromGallery(camera: false)) + .thenAnswer((_) async { + return file; + }); + + await tester.tap(inkwellFinder.at(2)); + await tester.pump(); + }); + testWidgets('Test Add Button', (tester) async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pumpAndSettle(); + + when(userConfig.loggedIn).thenReturn(true); + + final addBtn = find.byKey(const Key('addButton')); + + await tester.tap(addBtn); + await tester.pumpAndSettle(); + + expect(createEventViewModel.validate, AutovalidateMode.disabled); + }); + + testWidgets('recurrence button', (tester) async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pumpAndSettle(); + + const List frequencies = [ + "Does not repeat", + "Every day", + "Every week", + "Every month", + "Every year", + "Custom...", + ]; + + String prev = frequencies[0]; + for (int i = 1; i < 5; i++) { + expect(find.text(prev), findsAny); + await tester.tap(find.text(prev)); + await tester.pumpAndSettle(); + await tester.tap(find.text(frequencies[i]).last); + await tester.pumpAndSettle(); + expect(find.byType(ShowRecurrenceDialog), findsNothing); + expect(find.text(frequencies[i]), findsOneWidget); + prev = frequencies[i]; + } + + expect(find.text(prev), findsAny); + await tester.tap(find.text(prev)); + await tester.pumpAndSettle(); + await tester.tap(find.text(frequencies[5])); + await tester.pumpAndSettle(); + + expect(find.byType(ShowRecurrenceDialog), findsNothing); + }); + + testWidgets("Checking tap Inkwell for setDate 2 datetime", (tester) async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pump(); + final inkwellFinder = find.byType(InkWell); + expect(inkwellFinder, findsNWidgets(8)); + + ///returning the file variable to the + ///result of function multimediaPickerService.getPhotoFromGallery + ///when this function is called in the + ///view model of add_post_page. + final file = File('fakePath'); + + /// using the new instance of multimediaPickerService + /// so that when statement can be used again, + /// else it gives null point exception + final multimediaPickerService = locator(); + + /// when is function provided by mockito lib + when(multimediaPickerService.getPhotoFromGallery(camera: false)) + .thenAnswer((_) async { + return file; + }); + + await tester.tap(inkwellFinder.at(3)); + await tester.pump(); + }); + + testWidgets("Checking tap Inkwell for set time 2 datetime", (tester) async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pump(); + final inkwellFinder = find.byType(InkWell); + expect(inkwellFinder, findsNWidgets(8)); + // tester.allElements.forEach((element) { + // print(element); + // }); + + ///returning the file variable to the + ///result of function multimediaPickerService.getPhotoFromGallery + ///when this function is called in the + ///view model of add_post_page. + final file = File('fakePath'); + + /// using the new instance of multimediaPickerService + /// so that when statement can be used again, + /// else it gives null point exception + final multimediaPickerService = locator(); + + /// when is function provided by mockito lib + when(multimediaPickerService.getPhotoFromGallery(camera: false)) + .thenAnswer((_) async { + return file; + }); + + await tester.tap(inkwellFinder.at(4)); + await tester.pump(); + }); + + testWidgets('checks if the upload photo from button shows correct icon', + (tester) async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pump(); + + /// using the key of icon button + /// because their are many icon button + + final finder = find.byKey(const Key('txt_btn_cep')); + + expect(finder, findsOneWidget); + + ///returning the file variable to the + ///result of function multimediaPickerService.getPhotoFromGallery + ///when this function is called in the + ///view model of add_post_page. + final file = File('fakePath'); + + /// using the new instance of multimediaPickerService + /// so that when statement can be used again, + /// else it gives null point exception + final multimediaPickerServices = locator(); + + /// when is function provided by mockito lib + when(multimediaPickerServices.getPhotoFromGallery()) + .thenAnswer((_) async { + return file; + }); + + await tester.tap(finder); + await tester.pump(); + + expect(finder, findsOneWidget); + }); + + testWidgets( + 'checks if the uploaded photo from gallery button is removed after pressing remove button', + (tester) async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pump(); + + /// using the key of icon button + /// because their are many icon button + + final finder = find.byKey(const Key('txt_btn_cep')); + + final cancelBtn = find.byIcon(Icons.cancel); + + expect(finder, findsOneWidget); + + ///returning the file variable to the + ///result of function multimediaPickerService.getPhotoFromGallery + ///when this function is called in the + ///view model of add_post_page. + final file = File('fakePath'); + + /// using the new instance of multimediaPickerService + /// so that when statement can be used again, + /// else it gives null point exception + final multimediaPickerService = locator(); + + /// when is function provided by mockito lib + when(multimediaPickerService.getPhotoFromGallery(camera: false)) + .thenAnswer((_) async { + return file; + }); + + await tester.tap(finder); + await tester.pump(); + + await tester.tap(cancelBtn); + await tester.pump(); + }); + + testWidgets("Testing All day section", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final allDayText = find.descendant( + of: find.byType(Row), + matching: find.text( + appLocalization!.strictTranslate('All day'), + ), + ); + final switches = find.descendant( + of: find.byType(Row), + matching: find.byType(Switch), + ); + expect(allDayText, findsOneWidget); + expect(switches, findsNWidgets(3)); + expect( + (tester.widget(allDayText) as Text?)?.style!.fontSize, + 16, + ); + expect((tester.widgetList(switches).toList()[0] as Switch).value, true); + await tester.ensureVisible(switches.at(0)); + await tester.tap(switches.at(0)); + await tester.pumpAndSettle(); + expect((tester.widgetList(switches).toList()[0] as Switch).value, false); + }); + + testWidgets("Testing Keep Registerable section", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final keepRegisterableText = find.descendant( + of: find.byType(Row), + matching: find.text( + appLocalization!.strictTranslate('Keep Registerable'), + ), + ); + final switches = find.descendant( + of: find.byType(Row), + matching: find.byType(Switch), + ); + expect(keepRegisterableText, findsOneWidget); + expect(switches, findsNWidgets(3)); + expect( + (tester.widget(keepRegisterableText) as Text?)?.style!.fontSize, + 16, + ); + expect((tester.widgetList(switches).toList()[1] as Switch).value, true); + await tester.ensureVisible(switches.at(1)); + await tester.tap(switches.at(1)); + await tester.pumpAndSettle(); + expect((tester.widgetList(switches).toList()[1] as Switch).value, false); + }); + + testWidgets("Testing Keep public section", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final keepPublicText = find.descendant( + of: find.byType(Row), + matching: find.text( + appLocalization!.strictTranslate('Keep Public'), + ), + ); + final switches = find.descendant( + of: find.byType(Row), + matching: find.byType(Switch), + ); + expect(keepPublicText, findsOneWidget); + expect(switches, findsNWidgets(3)); + expect( + (tester.widget(keepPublicText) as Text?)?.style!.fontSize, + 16, + ); + expect((tester.widgetList(switches).toList()[2] as Switch).value, true); + await tester.ensureVisible(switches.at(2)); + await tester.tap(switches.at(2)); + await tester.pumpAndSettle(); + expect((tester.widgetList(switches).toList()[2] as Switch).value, false); + }); + + // testWidgets("Checking tap Inkwell work for admin list", (tester) async { + // await tester.pumpWidget( + // createEventScreen( + // themeMode: ThemeMode.dark, + // theme: TalawaTheme.darkTheme, + // ), + // ); + // await tester.pump(); + // final inkwellFinder = find.byType(InkWell); + // expect(inkwellFinder, findsNWidgets(8)); + + // ///returning the file variable to the + // ///result of function multimediaPickerService.getPhotoFromGallery + // ///when this function is called in the + // ///view model of add_post_page. + // final file = File('fakePath'); + + // /// using the new instance of multimediaPickerService + // /// so that when statement can be used again, + // /// else it gives null point exception + // final multimediaPickerService = locator(); + + // /// when is function provided by mockito lib + // when(multimediaPickerService.getPhotoFromGallery(camera: false)) + // .thenAnswer((_) async { + // return file; + // }); + + // await tester.ensureVisible(find.byKey(const Key('inwell_cep1'))); + // await tester.pumpAndSettle(); + + // await tester.tap(find.byKey(const Key('inwell_cep1'))); + // await tester.pump(); + + // //TODO: implement Rest of the test when the _adminCheckedMap or _memberCheckedMap return true for some id + // //TODO: for not it return false for all the ordMember.id + // // + // // orgMembersList.forEach((orgMember) { + // // if (isAdmin) { + // // _adminCheckedMap.putIfAbsent(orgMember.id!, () => false); + // // } else { + // // _memberCheckedMap.putIfAbsent(orgMember.id!, () => false); + // // } + // // _memberCheckedMap.putIfAbsent(orgMember.id!, () => false); + // // }); + // }); + + testWidgets("Checking tap Inkwell for second add to bottom sheet", + (tester) async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pump(); + final inkwellFinder = find.byType(InkWell); + expect(inkwellFinder, findsNWidgets(8)); + + await tester.ensureVisible(find.byKey(const Key('inwell_cep2'))); + await tester.pump(); + + // await tester.tap(find.byKey(const Key('text_btn_ambs'))); + await tester.tap( + find.byKey( + const Key('inwell_cep2'), + ), + ); + await tester.pump(); + + await tester.pump(); + await tester.ensureVisible(find.byKey(const Key('text_btn_ambs1'))); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key('text_btn_ambs1'))); + await tester.pump(); + }); + group('setState Coverage completion', () { + testWidgets('Tap on DateTimeTile date', (tester) async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pump(); + + await tester.tap(find.byKey(const Key('EventDateTimeTileDate')).first); + await tester.pump(); + + await tester.ensureVisible(find.byKey(const Key('key for test cep'))); + await tester.pump(); + + expect(find.byType(DatePickerDialog), findsOneWidget); + expect(find.byType(CalendarDatePicker), findsOneWidget); + + await tester.tap(find.text('OK')); + await tester.pumpAndSettle(); + + expect( + find.text(DateTime.now().toString().split(' ').first), + findsNWidgets(2), + ); + }); + testWidgets('Tap on DateTimeTile time', (tester) async { + final currentTime = DateTime.now(); + final futureTime = currentTime.add(const Duration(minutes: 30)); + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key('EventDateTimeTileTime')).first); + await tester.pump(); + + expect(find.byType(TimePickerDialog), findsOneWidget); + + await tester.tap(find.text('OK')); + await tester.pump(); + expect( + find.text(DateFormat.jm().format(currentTime)), + findsOneWidget, + ); + + expect( + find.text(DateFormat.jm().format(futureTime)), + findsOneWidget, + ); + }); + testWidgets('Tap on DateTimeTile date', (tester) async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pump(); + + await tester.tap(find.byKey(const Key('EventDateTimeTileDate')).last); + await tester.pump(); + + await tester.ensureVisible(find.byKey(const Key('key for test cep'))); + await tester.pump(); + + expect(find.byType(DatePickerDialog), findsOneWidget); + expect(find.byType(CalendarDatePicker), findsOneWidget); + + await tester.tap(find.text('OK')); + await tester.pumpAndSettle(); + expect( + find.text(DateTime.now().toString().split(' ').first), + findsNWidgets(2), + ); + }); + testWidgets('Tap on DateTimeTile time', (tester) async { + final currentTime = DateTime.now(); + final futureTime = currentTime.add(const Duration(minutes: 30)); + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key('EventDateTimeTileTime')).last); + await tester.pump(); + + expect(find.byType(TimePickerDialog), findsOneWidget); + + await tester.tap(find.text('OK')); + await tester.pump(); + expect( + find.text(DateFormat.jm().format(currentTime)), + findsOneWidget, + ); + + expect( + find.text(DateFormat.jm().format(futureTime)), + findsOneWidget, + ); + }); + }); + + group("Tests for integration with view model and services", () { + late final CreateEventViewModel cachedViewModel; + + testWidgets("setup MockCreateEventViewModel", (tester) async { + cachedViewModel = getAndRegisterCreateEventModel(); + }); + + testWidgets("Check if AppBar buttons work", (tester) async { + mockNetworkImages(() async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pumpAndSettle(); + + expect(find.byType(CreateEventPage), findsOneWidget); + + await tester.tap(find.text("Add")); + await tester.pumpAndSettle(); + + await tester.tap(find.byIcon(Icons.close)); + await tester.pumpAndSettle(); + + // expect(find.byType(CreateEventPage), findsNothing); + }); + }); + + testWidgets( + "Check if data coming from view model show up correctly", + (tester) async { + mockNetworkImages(() async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pumpAndSettle(); + }); + }, + ); + + testWidgets("Check if bottom sheet unticking works", (tester) async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pump(); + + await tester.ensureVisible(find.byKey(const Key('inwell_cep2'))); + await tester.pump(); + + // await tester.tap(find.byKey(const Key('text_btn_ambs'))); + await tester.tap( + find.byKey( + const Key('inwell_cep2'), + ), + ); + await tester.pump(); + + await tester.pump(); + await tester.ensureVisible(find.byKey(const Key('text_btn_ambs1'))); + await tester.pumpAndSettle(); + + await tester.tap(find.byType(CheckboxListTile)); + expect(cachedViewModel.memberCheckedMap['fakeUser1'], false); + await tester.pumpAndSettle(); + await tester.tap(find.byType(CheckboxListTile)); + expect(cachedViewModel.memberCheckedMap['fakeUser1'], true); + await tester.pump(); + }); + + testWidgets( + "Check if deleting members and admins works", + (tester) async { + mockNetworkImages(() async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pumpAndSettle(); + + //expect(find.text("p s"), findsOneWidget); + expect(find.text("r p"), findsOneWidget); + + //await tester.ensureVisible(find.text("p s")); + // await tester.pumpAndSettle(); + // await tester.tap(find.byIcon(Icons.cancel_rounded).at(0)); + // await tester.pumpAndSettle(const Duration(seconds: 1)); + + //expect(cachedViewModel.selectedAdmins, []); + expect(find.text("r p"), findsOneWidget); + + await tester.ensureVisible(find.text("r p")); + await tester.pumpAndSettle(); + await tester.tap(find.byIcon(Icons.cancel_rounded).at(0)); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + //expect(cachedViewModel.selectedAdmins, []); + expect(cachedViewModel.selectedMembers, []); + }); + }, + ); + }); + }); +} diff --git a/test/views/after_auth_screens/events/event_filter_bottomsheet_test.dart b/test/views/after_auth_screens/events/event_filter_bottomsheet_test.dart new file mode 100644 index 000000000..bd75c3302 --- /dev/null +++ b/test/views/after_auth_screens/events/event_filter_bottomsheet_test.dart @@ -0,0 +1,97 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:mocktail_image_network/mocktail_image_network.dart'; +import 'package:talawa/router.dart' as router; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/services/third_party_service/multi_media_pick_service.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/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/explore_events.dart'; +import 'package:talawa/widgets/custom_drawer.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +class MockCallbackFunction extends Mock { + void call(); +} + +final setDateCallback = MockCallbackFunction(); +final setTimeCallback = MockCallbackFunction(); + +/// Creates Explore Event Screen. +/// +/// **params**: +/// * `model`: Home Screen Model +/// +/// **returns**: +/// * `Widget`: Returns Explore Screen Widget +Widget createExploreEventsScreen(MainScreenViewModel model) => MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + home: Scaffold( + key: MainScreenViewModel.scaffoldKey, + drawer: CustomDrawer( + homeModel: model, + ), + body: const ExploreEvents( + key: Key('ExploreEvents'), + ), + ), + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + ); +void main() { + SizeConfig().test(); + testSetupLocator(); + locator.unregister(); + setUp(() { + registerServices(); + }); + tearDown(() { + unregisterServices(); + }); + group('testing filters bottomsheet', () { + testWidgets("Checking tap cross works", (tester) async { + await mockNetworkImages(() async { + locator.unregister(); + final model = ExploreEventsViewModel(); + locator.registerSingleton(model); + final homeModel = locator(); + await tester.pumpWidget(createExploreEventsScreen(homeModel)); + await tester.pumpAndSettle(); + await tester.tap(find.bySemanticsLabel('Filters')); + await tester.pumpAndSettle(); + final finder = find.byKey(const Key('close')); + expect(finder, findsOneWidget); + await tester.tap(finder); + await tester.pumpAndSettle(); + expect(find.bySemanticsLabel('Filters'), findsAtLeast(1)); + }); + }); + testWidgets("Testing if Filter button works", (tester) async { + await mockNetworkImages(() async { + locator.unregister(); + final model = ExploreEventsViewModel(); + locator.registerSingleton(model); + final homeModel = locator(); + await tester.pumpWidget(createExploreEventsScreen(homeModel)); + await tester.pumpAndSettle(); + await tester.tap(find.bySemanticsLabel('Filters')); + await tester.pumpAndSettle(); + await tester.pump(); + await tester.tap(find.byKey(const Key('Public Events'))); + await tester.pumpAndSettle(); + expect(model.chosenValue, 'Public Events'); + }); + }); + }); +} diff --git a/test/views/after_auth_screens/events/event_info_body_test.dart b/test/views/after_auth_screens/events/event_info_body_test.dart new file mode 100644 index 000000000..e1804b6cf --- /dev/null +++ b/test/views/after_auth_screens/events/event_info_body_test.dart @@ -0,0 +1,245 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/router.dart' as router; +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/after_auth_view_models/event_view_models/event_info_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/lang_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/event_info_body.dart'; +import 'package:talawa/views/base_view.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +Event getTestEvent({ + bool isPublic = false, + bool viewOnMap = true, + bool asAdmin = false, +}) { + return Event( + id: "1", + title: "test_event", + creator: User( + id: asAdmin ? "xzy1" : "acb1", + firstName: "ravidi", + lastName: "shaikh", + ), + isPublic: isPublic, + startDate: "00/00/0000", + endDate: "12/12/9999", + startTime: "00:00", + endTime: "24:00", + location: "iitbhu, varanasi", + latitude: viewOnMap ? 40.730610 : null, + longitude: viewOnMap ? -73.935242 : null, + description: "test_event_description", + admins: [ + User( + firstName: "ravidi_admin_one", + lastName: "shaikh_admin_one", + ), + User( + firstName: "ravidi_admin_two", + lastName: "shaikh_admin_two", + ), + ], + attendees: [ + Attendee( + id: "1", + firstName: "Test", + lastName: "User", + ), + ], + isRegisterable: true, + isRegistered: false, + ); +} + +final exploreEventsViewModel = ExploreEventsViewModel(); +late EventInfoViewModel _eventInfoViewModel; + +Widget createEventInfoBody({ + bool isPublic = true, + bool viewOnMap = true, + bool asAdmin = false, +}) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return BaseView( + onModelReady: (model) { + model.initialize( + args: { + "event": getTestEvent( + isPublic: isPublic, + viewOnMap: viewOnMap, + asAdmin: asAdmin, + ), + "exploreEventViewModel": exploreEventsViewModel, + }, + ); + + _eventInfoViewModel = model; + }, + builder: (context, model, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: const Scaffold( + body: CustomScrollView( + slivers: [ + EventInfoBody(), + ], + ), + ), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + }, + ); +} + +void main() { + testSetupLocator(); + // locator().test(); + TestWidgetsFlutterBinding.ensureInitialized(); + + setUp(() { + registerServices(); + locator().test(); + }); + + tearDown(() { + unregisterServices(); + }); + + group("Widget Tests for EventInfoBody", () { + testWidgets("Check if EventInfoBody shows up", (tester) async { + await tester.pumpWidget(createEventInfoBody()); + await tester.pumpAndSettle(); + + expect(find.byType(EventInfoBody), findsOneWidget); + expect(find.byType(SliverToBoxAdapter), findsOneWidget); + }); + + testWidgets("Check if all the text shows up correctly", (tester) async { + await tester.pumpWidget(createEventInfoBody()); + await tester.pumpAndSettle(); + + expect(find.text("test_event"), findsOneWidget); + expect(find.text("Created by: ravidi shaikh"), findsOneWidget); + expect(find.text("00/00/0000 - 12/12/9999"), findsOneWidget); + expect(find.text("00:00 - 24:00"), findsOneWidget); + expect(find.text("iitbhu, varanasi"), findsOneWidget); + expect(find.text("test_event_description"), findsOneWidget); + expect(find.text("ravidi_admin_one shaikh_admin_one"), findsOneWidget); + expect(find.text("Test User"), findsOneWidget); // Registrants + }); + + testWidgets( + "Check if all the children show up correctly", + (tester) async { + await tester.pumpWidget(createEventInfoBody()); + await tester.pumpAndSettle(); + }, + ); + + testWidgets("Check if all taps work", (tester) async { + await tester.pumpWidget(createEventInfoBody()); + await tester.pumpAndSettle(); + + // No way to test for now as onTap does nothing. + // Update this test accordingly in future. + + await tester.tap(find.byKey(const Key("Attendee0"))); + await tester.tap(find.byKey(const Key("Admins0"))); + + await tester.pumpAndSettle(); + }); + + testWidgets("Check if edit button appears for creator", (tester) async { + await tester.pumpWidget(createEventInfoBody(asAdmin: true)); + await tester.pumpAndSettle(); + + expect(find.byType(IconButton), findsOneWidget); + await tester.tap(find.byType(IconButton)); + // verify(navigationService.pushScreen("/editEventPage", + // arguments: getTestEvent()),); + }); + + testWidgets("Check if edit button doesn't appear for non creator", + (tester) async { + await tester.pumpWidget(createEventInfoBody(asAdmin: false)); + await tester.pumpAndSettle(); + + expect(find.byType(IconButton), findsNothing); + // verify(navigationService.pushScreen("/editEventPage", arguments: getTestEvent())); + }); + }); + + group("Check if conditional children show up", () { + testWidgets("Private event", (tester) async { + await tester.pumpWidget(createEventInfoBody(isPublic: false)); + await tester.pumpAndSettle(); + + expect(find.text("private"), findsOneWidget); + expect(find.byIcon(Icons.lock), findsOneWidget); + }); + + testWidgets("Public event", (tester) async { + await tester.pumpWidget(createEventInfoBody(isPublic: true)); + await tester.pumpAndSettle(); + + expect(find.text("public"), findsOneWidget); + expect(find.byIcon(Icons.lock_open), findsOneWidget); + }); + + testWidgets("Loading indicator", (tester) async { + // Don't show view on map + + await tester.pumpWidget(createEventInfoBody()); + await tester.pumpAndSettle(); + + // Fully loaded + expect( + find.byWidgetPredicate( + (widget) => + widget is SliverToBoxAdapter && + widget.child is Padding && + (widget.child! as Padding).child is Column && + ((widget.child! as Padding).child! as Column).children.last + is ListView, + ), + findsOneWidget, + ); + + // Model is loading + _eventInfoViewModel.setState(ViewState.busy); + await tester.pump(); + + expect( + find.byWidgetPredicate( + (widget) => + widget is SliverToBoxAdapter && + widget.child is Padding && + (widget.child! as Padding).child is Column && + ((widget.child! as Padding).child! as Column).children.last + is Padding, + ), + findsOneWidget, + ); + }); + }); +} diff --git a/test/views/after_auth_screens/feed/individual_post_test.dart b/test/views/after_auth_screens/feed/individual_post_test.dart new file mode 100644 index 000000000..19c8b6f2b --- /dev/null +++ b/test/views/after_auth_screens/feed/individual_post_test.dart @@ -0,0 +1,332 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/models/comment/comment_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/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/views/after_auth_screens/feed/individual_post.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/post_widget.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +Widget createIndividualPostViewWidget(Post post) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ + AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: IndividualPostView(post: post), + navigatorKey: navigationService.navigatorKey, + ); + }, + ); +} + +final LikedBy user = LikedBy(sId: "test_id"); + +final u1 = User( + id: '123', + firstName: 'Lakshay', + lastName: 'Gupta', + email: 'test@test.com', +); +final u2 = User( + id: '123', + firstName: 'Ankit', + lastName: 'Varshney', + email: 'test@test.com', +); +final List users = [u1, u2]; +List comments = [ + Comments(sId: 'comment1'), + Comments(sId: 'comment2'), + Comments(sId: 'comment3'), + Comments(sId: 'comment4'), + Comments(sId: 'comment5'), + Comments(sId: 'comment6'), +]; +final comment = Comment( + creator: User( + id: '123', + firstName: 'Ankit', + lastName: 'Varshney', + email: 'test@test.com', + ), + createdAt: '123456', + text: 'test text', + post: 'test post', + likeCount: 'test count', +); + +final LikedBy l1 = LikedBy(sId: 'test1'); +final LikedBy l2 = LikedBy(sId: 'test2'); +final List likeby = [l1, l2]; + +final comment1 = Comments(sId: 'comment1'); +final comment2 = Comments(sId: 'comment2'); +final comment3 = Comments(sId: 'comment3'); +final List comments1 = [comment1, comment2, comment3]; + +final myBirthday = DateTime.utc(2004, DateTime.june, 16, 5, 30, 0, 0, 0); +final post = Post( + creator: User( + id: '123', + firstName: 'John', + lastName: 'Doe', + email: 'test@test.com', + ), + sId: "sid", + createdAt: myBirthday, + description: 'test description', + organization: OrgInfo(admins: users), + likedBy: likeby, + comments: comments1, +); +Widget createLikedUserCircleAvatar(LikedBy user) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ + AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: likedUserCircleAvatar(user), + navigatorKey: navigationService.navigatorKey, + ); + }, + ); +} + +Widget createIndividualPageLikeSection() { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ + AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: IndividualPageLikeSection( + usersLiked: [ + LikedBy(sId: 'test1'), + LikedBy(sId: 'test2'), + LikedBy(sId: 'test3'), + LikedBy(sId: 'test4'), + ], + ), + navigatorKey: navigationService.navigatorKey, + ); + }, + ); +} + +Widget createIndividualPostCommentSectionWidget() { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ + AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: BaseView( + onModelReady: (model) { + model.initialize(); + }, + builder: (context, model, child) { + return IndividualPostCommentSection( + comments: comments, + postID: 'test post id', + ); + }, + ), + ); +} + +Widget createCommentTemplateWidget(Comment comment) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ + AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: BaseView( + onModelReady: (model) { + model.initialize(); + }, + builder: (context, model, child) { + return CommentTemplate(comment: comment); + }, + ), + ); +} + +void main() { + SizeConfig().test(); + testSetupLocator(); + + setUp(() { + registerServices(); + }); + + group("testing Individual Post View ", () { + testWidgets("Check if Send button is disabled", + (WidgetTester tester) async { + await tester.pumpWidget(createIndividualPostViewWidget(post)); + await tester.pumpAndSettle(); + + final textFieldFinder = find.byKey(const Key('indi_post_tf_key')); + final textButtonFinder = find.byKey(const Key('sendButton')); + expect(tester.widget(textButtonFinder).enabled, isFalse); + + // Clear the text field + await tester.enterText(textFieldFinder, ''); + await tester.pumpAndSettle(); + // The button should be disabled after clearing the text + expect(tester.widget(textButtonFinder).enabled, isFalse); + + expect(find.byType(NewsPost), findsOneWidget); + expect(find.byType(IndividualPageLikeSection), findsOneWidget); + expect(find.byType(IndividualPostCommentSection), findsOneWidget); + }); + testWidgets("Check if Send button is enabled and working", + (WidgetTester tester) async { + await tester.pumpWidget(createIndividualPostViewWidget(post)); + await tester.pumpAndSettle(); + + final textFieldFinder = find.byKey(const Key('indi_post_tf_key')); + final textButtonFinder = find.byKey(const Key('sendButton')); + expect(tester.widget(textButtonFinder).enabled, isFalse); + + // Clear the text field + await tester.enterText(textFieldFinder, ''); + await tester.pumpAndSettle(); + // The button should be disabled after clearing the text + expect(tester.widget(textButtonFinder).enabled, isFalse); + + // Enter non-empty text + await tester.enterText(textFieldFinder, 'Test Comment'); + await tester.pumpAndSettle(); + // The button should now be enabled + expect(tester.widget(textButtonFinder).enabled, isTrue); + + // Verify that the text field is cleared + expect(find.text('Test Comment'), findsOneWidget); + + // Tap the send button + await tester.tap(textButtonFinder); + await tester.pumpAndSettle(); + + expect(find.byType(NewsPost), findsOneWidget); + expect(find.byType(IndividualPageLikeSection), findsOneWidget); + expect(find.byType(IndividualPostCommentSection), findsOneWidget); + }); + testWidgets("Checking if state changes when text is cleared", + (WidgetTester tester) async { + await tester.pumpWidget(createIndividualPostViewWidget(post)); + await tester.pumpAndSettle(); + + final textFieldFinder = find.byKey(const Key('indi_post_tf_key')); + final textButtonFinder = find.byKey(const Key('sendButton')); + expect(tester.widget(textButtonFinder).enabled, isFalse); + + // Clear the text field + await tester.enterText(textFieldFinder, ''); + await tester.pumpAndSettle(); + // The button should be disabled after clearing the text + expect(tester.widget(textButtonFinder).enabled, isFalse); + + // Enter non-empty text + await tester.enterText(textFieldFinder, 'Test Comment'); + await tester.pumpAndSettle(); + // The button should now be enabled + expect(tester.widget(textButtonFinder).enabled, isTrue); + + // Verify that the text field is cleared + expect(find.text('Test Comment'), findsOneWidget); + + // Testing if state changes back + await tester.enterText(textFieldFinder, ''); + await tester.pumpAndSettle(); + expect(tester.widget(textButtonFinder).enabled, isFalse); + + // Tap the send button + await tester.tap(textButtonFinder); + await tester.pumpAndSettle(); + + expect(find.byType(NewsPost), findsOneWidget); + expect(find.byType(IndividualPageLikeSection), findsOneWidget); + expect(find.byType(IndividualPostCommentSection), findsOneWidget); + }); + }); + + group("Test for likedUserCircleAvatar", () { + testWidgets("checking if likedUserCircleAvatar widget correctly shows up", + (WidgetTester tester) async { + await tester.pumpWidget(createLikedUserCircleAvatar(user)); + await tester.pumpAndSettle(); + + expect(find.byType(CircleAvatar), findsOneWidget); + }); + }); + group("Test for IndividualPageLikeSection", () { + testWidgets( + "checking if IndividualPageLikeSection widget correctly shows up", + (WidgetTester tester) async { + await tester.pumpWidget(createIndividualPageLikeSection()); + await tester.pumpAndSettle(); + expect(find.text("Liked by"), findsOneWidget); + + expect(find.byType(Row), findsOneWidget); + expect( + find.byWidget(likedUserCircleAvatar(user)), + findsNWidgets(4), + ); + }); + }); + + group("Test for IndividualPostCommentSection", () { + testWidgets( + "checking if IndividualPostCommentSection widget correctly shows up", + (WidgetTester tester) async { + await tester.pumpWidget(createIndividualPostCommentSectionWidget()); + await tester.pumpAndSettle(); + + expect(find.text("Comments"), findsOneWidget); + }); + }); + group("Test for CommentTemplate", () { + testWidgets("checking the comment template widgets", + (WidgetTester tester) async { + await tester.pumpWidget(createCommentTemplateWidget(comment)); + await tester.pumpAndSettle(); + + expect(find.byType(Row), findsOneWidget); + expect(find.byType(CircleAvatar), findsOneWidget); + expect(find.byType(Column), findsOneWidget); + expect( + find.text( + "${comment.creator!.firstName!} ${comment.creator!.lastName!}", + ), + findsOneWidget, + ); + expect(find.text(comment.text!), findsOneWidget); + }); + }); +} diff --git a/test/views/after_auth_screens/feed/pinned_post_screen.dart b/test/views/after_auth_screens/feed/pinned_post_screen.dart new file mode 100644 index 000000000..0913743cd --- /dev/null +++ b/test/views/after_auth_screens/feed/pinned_post_screen.dart @@ -0,0 +1,144 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:file/local.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_cache_manager/flutter_cache_manager.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:get_it/get_it.dart'; +import 'package:mockito/mockito.dart'; +import 'package:network_image_mock/network_image_mock.dart'; +import 'package:talawa/router.dart' as router; +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/after_auth_screens/feed/pinned_post_screen.dart'; +import 'package:talawa/views/base_view.dart'; +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +class MockCacheManager extends Mock implements DefaultCacheManager { + static const fileSystem = LocalFileSystem(); + + @override + Stream getImageFile( + String url, { + String? key, + Map? headers, + bool withProgress = true, + int? maxHeight, + int? maxWidth, + }) async* { + if (url == "wrong_url") { + throw Exception("File not found"); + } else { + yield FileInfo( + fileSystem.file(url), + FileSource.Cache, + DateTime(2050), + url, + ); + } + } +} + +Widget createApp() { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: const PinnedPostScreen( + post: { + 'title': 'Sample Title', + 'time': '23:00', + 'postId': 'postId', + 'imageUrl': 'imageUrl', + }, + ), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); +} + +Future showPinnedPostScreen(WidgetTester tester) async { + await tester.pumpWidget(createApp()); + await tester.pumpAndSettle(); +} + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + setUp(() { + registerServices(); + locator().test(); + }); + GetIt.instance.registerSingleton( + MockCacheManager(), + ); + + GetIt.instance.registerSingleton( + NavigationService(), + ); + + GetIt.instance.registerSingleton( + SizeConfig(), + ); + + tearDown(() { + unregisterServices(); + }); + + testWidgets('Check if Pinned Post Screen page shows up', (tester) async { + await showPinnedPostScreen(tester); + expect(find.byType(SafeArea), findsOneWidget); + }); + + group('Check if Pinned Post Screen page has -', () { + testWidgets('Title', (tester) async { + await showPinnedPostScreen(tester); + expect(find.text('Sample Title'), findsOneWidget); + }); + + testWidgets('Time', (tester) async { + await showPinnedPostScreen(tester); + expect(find.text('23:00hr'), findsOneWidget); + }); + }); + + // Check if cached network image is working + testWidgets('Check if CachedNetworkImage is working', (tester) async { + await mockNetworkImagesFor(() async { + await showPinnedPostScreen(tester); + expect(find.byType(CachedNetworkImage), findsOneWidget); + }); + }); + + testWidgets('Check if CachedNetworkImage shows CircularProgressIndicator', + (tester) async { + await tester.pumpWidget( + MaterialApp( + home: PinnedPostScreen( + post: { + 'title': 'Sample Title', + 'time': '23:00', + 'postId': 'postId', + 'imageUrl': 'wrong_url', + }, + cacheManager: GetIt.instance.get(), + ), + ), + ); + await tester.pump(); + expect(find.byType(CircularProgressIndicator), findsOneWidget); + }); +} diff --git a/test/views/after_auth_screens/join_org_after_auth_test/access_request_screen_test.dart b/test/views/after_auth_screens/join_org_after_auth_test/access_request_screen_test.dart new file mode 100644 index 000000000..f061229e0 --- /dev/null +++ b/test/views/after_auth_screens/join_org_after_auth_test/access_request_screen_test.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/access_request_view_model.dart'; +import 'package:talawa/views/after_auth_screens/join_org_after_auth/access_request_screen.dart'; +import 'package:talawa/views/base_view.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +Widget accessRequestScreen() { + return BaseView( + onModelReady: (model) => model.initialise(fakeOrgInfo), + builder: (context, model, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ + AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: SendAccessRequest(org: fakeOrgInfo), + navigatorKey: navigationService.navigatorKey, + ); + }, + ); +} + +void main() { + testSetupLocator(); + setUp(() => registerServices()); + tearDown(() => unregisterServices()); + group("SendRequestAccess Screen test", () { + testWidgets("SendRequestAccess screen is build correctly", + (WidgetTester tester) async { + await tester.pumpWidget(accessRequestScreen()); + await tester.pumpAndSettle(); + + //Verify that appbar is present with transparent background color + expect(find.byType(AppBar), findsOneWidget); + final AppBar appBar = tester.firstWidget(find.byType(AppBar)); + expect(appBar.backgroundColor, Colors.transparent); + + //Verify that the image is present + expect(find.byType(Image), findsOneWidget); + expect(find.text("You need access"), findsOneWidget); + expect( + find.text("Request access, or switch to an account with access"), + findsOneWidget, + ); + expect(find.byType(TextField), findsOneWidget); + //Verify that the send request button is present + expect(find.text("Request Access"), findsOneWidget); + + //Tap the "Request Access" button and trigger a frame + await tester.tap(find.text("Request Access")); + await tester.pump(); + }); + }); +} diff --git a/test/views/after_auth_screens/join_org_after_auth_test/join_organisation_after_auth_test.dart b/test/views/after_auth_screens/join_org_after_auth_test/join_organisation_after_auth_test.dart new file mode 100644 index 000000000..448d301d8 --- /dev/null +++ b/test/views/after_auth_screens/join_org_after_auth_test/join_organisation_after_auth_test.dart @@ -0,0 +1,286 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:qr_code_scanner/qr_code_scanner.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/graphql_config.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/after_auth_screens/join_org_after_auth/join_organisation_after_auth.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/organization_search_list.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_helpers.mocks.dart'; +import '../../../helpers/test_locator.dart'; + +Widget createJoinOrgAfterAuth({ + String orgId = "fake_id", +}) { + return BaseView( + onModelReady: (model) => model.initialise(orgId), + builder: (context, model, child) { + return MaterialApp( + navigatorKey: navigationService.navigatorKey, + locale: const Locale('en'), + localizationsDelegates: const [ + AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: JoinOrganisationAfterAuth( + orgId: orgId, + ), + ); + }, + ); +} + +void main() { + testSetupLocator(); + locator().test(); + TestWidgetsFlutterBinding.ensureInitialized(); + + setUp(() { + registerServices(); + locator().test(); + }); + + tearDown(() { + unregisterServices(); + }); + + group("Tests for JoinOrganizationAfterAuth - widgets", () { + testWidgets('QR Scan Test', (WidgetTester tester) async { + final controller = MockQRViewController(); + when(controller.scannedDataStream).thenAnswer((_) async* { + yield Barcode( + ' ' + '?orgid=6737904485008f171cf29924', + BarcodeFormat.qrcode, + null, + ); + }); + when(controller.stopCamera()) + .thenAnswer((realInvocation) => Future.value()); + + await tester.pumpWidget( + createJoinOrgAfterAuth(), + ); + + await tester.pumpAndSettle(const Duration(seconds: 6)); + + await tester.tap(find.byIcon(Icons.qr_code_scanner)); + await tester.pumpAndSettle(); + + expect( + find.byWidgetPredicate( + (widget) => + widget is ClipRRect && + widget.child is Container && + (widget.child! as Container).child is Column, + ), + findsOneWidget, + ); + (tester.widget(find.byType(QRView)) as QRView) + .onQRViewCreated(controller); + }); + testWidgets('QR Scan Test when url != GraphqlConfig.orgURI', + (WidgetTester tester) async { + final controller = MockQRViewController(); + when(controller.scannedDataStream).thenAnswer((_) async* { + yield Barcode( + '1' + '?orgid=6737904485008f171cf29924', + BarcodeFormat.qrcode, + null, + ); + }); + when(controller.stopCamera()) + .thenAnswer((realInvocation) => Future.value()); + + await tester.pumpWidget( + createJoinOrgAfterAuth(), + ); + + await tester.pumpAndSettle(const Duration(seconds: 6)); + + await tester.tap(find.byIcon(Icons.qr_code_scanner)); + await tester.pumpAndSettle(); + + expect( + find.byWidgetPredicate( + (widget) => + widget is ClipRRect && + widget.child is Container && + (widget.child! as Container).child is Column, + ), + findsOneWidget, + ); + (tester.widget(find.byType(QRView)) as QRView) + .onQRViewCreated(controller); + }); + testWidgets('Test _onQRViewCreated when throwing exception', + (WidgetTester tester) async { + final controller = MockQRViewController(); + when(controller.scannedDataStream).thenAnswer((_) async* { + yield Barcode( + ' ' + '?orgid=6737904485008f171cf29924', + BarcodeFormat.qrcode, + null, + ); + }); + when(controller.stopCamera()) + .thenAnswer((realInvocation) => Future.value()); + + await tester.pumpWidget( + createJoinOrgAfterAuth(), + ); + when(controller.stopCamera()).thenThrow(Exception("exception")); + + await tester.pumpAndSettle(const Duration(seconds: 6)); + + await tester.tap(find.byIcon(Icons.qr_code_scanner)); + await tester.pumpAndSettle(); + + (tester.widget(find.byType(QRView)) as QRView) + .onQRViewCreated(controller); + }); + testWidgets( + "Check if JoinOrganizationsAfterAuth shows up", + (tester) async { + await tester.pumpWidget(createJoinOrgAfterAuth()); + await tester.pumpAndSettle(const Duration(seconds: 6)); + + expect(find.byType(JoinOrganisationAfterAuth), findsOneWidget); + }, + ); + + testWidgets( + "Check if children show up correctly", + (tester) async { + await tester.pumpWidget(createJoinOrgAfterAuth()); + await tester.pumpAndSettle(const Duration(seconds: 6)); + + expect( + find.byWidgetPredicate( + (widget) => widget is Scaffold && widget.body is Column, + ), + findsOneWidget, + ); + + // expect( + // find.byWidgetPredicate( + // (widget) => + // widget is Column && + // widget.children[0] is Padding && + // widget.children[1] is ColoredBox && + // widget.children[2] is Padding && + // widget.children[3] is Expanded && + // widget.children[4] is SizedBox && + // widget.children[5] is Column, + // ), + // findsOneWidget, + // ); + + // expect( + // find.byWidgetPredicate( + // (widget) => + // widget is Column && + // widget.children[0] is RaisedRoundedButton && + // (widget.children[0] as RaisedRoundedButton).buttonLabel == + // "Join selected organisation" && + // widget.children[1] is SizedBox, + // ), + // findsOneWidget, + // ); + }, + ); + }); + + group("Tests for JoinOrganizationAfterAuth - widgets", () { + testWidgets("Check if QR bottom model sheet shows up", (tester) async { + await tester.pumpWidget(createJoinOrgAfterAuth()); + await tester.pumpAndSettle(const Duration(seconds: 6)); + + await tester.tap(find.byIcon(Icons.qr_code_scanner)); + await tester.pumpAndSettle(); + + expect( + find.byWidgetPredicate( + (widget) => + widget is ClipRRect && + widget.child is Container && + (widget.child! as Container).child is Column, + ), + findsOneWidget, + ); + }); + + // If you happen to add more tests below this one, make sure to + // re-register SelectOrganizationViewModel in that test as it will + // be disposed once this test ends, or better, write any new tests + // before this one. + + /// Search is No-Longer is a feature, if it gets implemented in future use this test + /// Really good test to learn from so not deleting + testWidgets("Check if model related functions work", (tester) async { + final orgOne = OrgInfo( + name: "org_one", + creatorInfo: User( + firstName: "ravidi", + lastName: "shaikh", + ), + userRegistrationRequired: true, + ); + final orgTwo = OrgInfo( + name: "org_two", + creatorInfo: User( + firstName: "ravidi", + lastName: "shaikh", + ), + userRegistrationRequired: true, + ); + + final selectOrgInfoVM = locator.get(); + + await tester.pumpWidget(createJoinOrgAfterAuth()); + await tester.pumpAndSettle(const Duration(seconds: 6)); + + // This button comes from CupertinoSearchTextField + // await tester.tap(find.byType(CupertinoButton)); + // await tester.pumpAndSettle(const Duration(seconds: 6)); + + // Checking for text change + selectOrgInfoVM.setState(ViewState.busy); + selectOrgInfoVM.searchController.text = "tmmmext"; + await tester.pumpAndSettle(const Duration(seconds: 6)); + + // expect(find.text("tmmmext"), findsOneWidget); + + // Checking for Org selection + + expect(selectOrgInfoVM.organizations, []); + + selectOrgInfoVM.organizations = [ + orgOne, + orgTwo, + ]; + + selectOrgInfoVM.selectedOrganization = orgOne; + + selectOrgInfoVM.notifyListeners(); + await tester.pumpAndSettle(const Duration(seconds: 6)); + + selectOrgInfoVM.searching = true; + selectOrgInfoVM.notifyListeners(); + + expect(find.byType(OrganizationSearchList), findsNothing); + }); + }); +} diff --git a/test/views/after_auth_screens/org_info_screen_test.dart b/test/views/after_auth_screens/org_info_screen_test.dart new file mode 100644 index 000000000..d10e7e4b7 --- /dev/null +++ b/test/views/after_auth_screens/org_info_screen_test.dart @@ -0,0 +1,292 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:network_image_mock/network_image_mock.dart'; +import 'package:talawa/models/organization/org_info.dart'; +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/pre_auth_view_models/select_organization_view_model.dart'; +import 'package:talawa/views/after_auth_screens/org_info_screen.dart'; + +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_locator.dart'; + +final OrgInfo mockOrgInfo = OrgInfo.fromJson( + { + '_id': '123', + 'image': 'image_url', + 'name': 'Org_Name', + 'description': 'aabbcc', + 'userRegistrationRequired': false, + 'creator': { + 'accessToken': 'abc', + 'refreshToken': 'abc', + '_id': '123', + 'firstName': 'Parag', + 'lastName': 'Gupta', + }, + 'members': [ + { + 'accessToken': 'abc', + 'refreshToken': 'abc', + '_id': '123', + 'firstName': 'Parag', + 'lastName': 'Gupta', + }, + ], + 'admins': [ + { + 'firstName': 'Parag', + 'lastName': '1', + }, + { + 'firstName': 'Parag', + 'lastName': '2', + }, + { + 'firstName': 'Parag', + 'lastName': '3', + } + ], + 'address': { + "city": "Delhi", + "countryCode": "IN", + "dependentLocality": "Some Dependent Locality", + "line1": "123 Random Street", + "line2": "Apartment 456", + "postalCode": "110001", + "sortingCode": "ABC-123", + "state": "Delhi", + }, + }, + memberRequest: false, +); + +final OrgInfo mockOrgInfo2 = OrgInfo.fromJson( + { + '_id': '1234', + 'image': null, + 'name': 'Org_Name', + 'description': 'aabbcc', + 'userRegistrationRequired': true, + 'creator': { + 'accessToken': 'abc', + 'refreshToken': 'abc', + '_id': '123', + 'firstName': 'Parag', + 'lastName': 'Gupta', + }, + 'members': [ + { + 'firstName': 'Paul', + 'lastName': '1', + }, + { + 'firstName': 'jon', + 'lastName': '1', + }, + { + 'firstName': 'sean', + 'lastName': '1', + }, + { + 'firstName': 'Jay', + 'lastName': '1', + }, + { + 'firstName': 'Chris', + 'lastName': '1', + }, + ], + 'admins': [ + { + 'firstName': 'Parag', + 'lastName': 'Gupta', + }, + ], + 'address': { + "city": "Delhi", + "countryCode": "IN", + "dependentLocality": "Some Dependent Locality", + "line1": "123 Random Street", + "line2": "Apartment 456", + "postalCode": "110001", + "sortingCode": "ABC-123", + "state": "Delhi", + }, + }, + memberRequest: false, +); + +Widget createOrgInfoScreen1() { + return MaterialApp( + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + home: OrganisationInfoScreen( + orgInfo: mockOrgInfo, + ), + navigatorKey: locator().navigatorKey, + ); +} + +Widget createOrgInfoScreen2() { + return MaterialApp( + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + home: OrganisationInfoScreen( + orgInfo: mockOrgInfo2, + ), + navigatorKey: locator().navigatorKey, + ); +} + +void main() { + testSetupLocator(); + SizeConfig().test(); + GraphqlConfig().test(); + setUp(() { + registerServices(); + }); + group('OrganisationInfoScreen Tests', () { + testWidgets('Leave button shows when organization is joined', + (WidgetTester tester) async { + mockNetworkImagesFor(() async { + userConfig.currentUser.joinedOrganizations!.add(mockOrgInfo); + + await tester.pumpWidget(createOrgInfoScreen1()); + await tester.pumpAndSettle(); + + expect(find.text('Leave'), findsOneWidget); + await tester.tap(find.text('Leave')); + await tester.pumpAndSettle(); + + expect(find.byIcon(Icons.arrow_back), findsOneWidget); + await tester.tap(find.byIcon(Icons.arrow_back)); + await tester.pumpAndSettle(); + }); + }); + testWidgets('Displays the correct organization info', + (WidgetTester tester) async { + mockNetworkImagesFor(() async { + await tester.pumpWidget(createOrgInfoScreen1()); + await tester.pumpAndSettle(); + + expect(find.text('Org_Name'), findsOneWidget); + expect(find.text('aabbcc'), findsOneWidget); + expect(find.text('Delhi, IN'), findsOneWidget); + expect(find.text('Public'), findsOneWidget); + expect(find.byIcon(Icons.lock_open), findsOneWidget); + }); + }); + testWidgets('for private organisation', (WidgetTester tester) async { + mockNetworkImagesFor(() async { + await tester.pumpWidget(createOrgInfoScreen2()); + await tester.pumpAndSettle(); + + expect(find.text('Org_Name'), findsOneWidget); + expect(find.text('aabbcc'), findsOneWidget); + expect(find.text('Delhi, IN'), findsOneWidget); + expect(find.text('Private'), findsOneWidget); + expect(find.byIcon(Icons.lock), findsOneWidget); + }); + }); + + testWidgets('Join button shows when organization is not joined', + (WidgetTester tester) async { + mockNetworkImagesFor(() async { + final viewModel = SelectOrganizationViewModel(); + + await tester.pumpWidget(createOrgInfoScreen2()); + await tester.pumpAndSettle(); + + expect(find.text('Join'), findsOneWidget); + await tester.tap(find.byType(FloatingActionButton)); + await tester.pumpAndSettle(); + + verify(viewModel.selectOrg(mockOrgInfo)).called(1); + }); + }); + + testWidgets('Displays the default image when orgInfo.image is null', + (WidgetTester tester) async { + mockNetworkImagesFor(() async { + await tester.pumpWidget(createOrgInfoScreen2()); + await tester.pumpAndSettle(); + + expect(find.byType(Image), findsOneWidget); + expect(find.byKey(const Key('image_container')), findsOneWidget); + }); + }); + testWidgets('DropDown list for admins more than 2', + (WidgetTester tester) async { + mockNetworkImagesFor(() async { + await tester.pumpWidget(createOrgInfoScreen1()); + await tester.pumpAndSettle(); + + expect(find.text('Admins'), findsOneWidget); + expect(find.text('Parag 1'), findsOneWidget); + + expect(find.text('See all'), findsOneWidget); + await tester.tap(find.text('See all')); + await tester.pumpAndSettle(); + + expect(find.text('Parag 3'), findsOneWidget); + + expect(find.byKey(const Key('modalSheetbackBtn')), findsOneWidget); + await tester.tap(find.byKey(const Key('modalSheetbackBtn'))); + await tester.pumpAndSettle(); + }); + }); + testWidgets('DropDown list for members more than 4', + (WidgetTester tester) async { + mockNetworkImagesFor(() async { + await tester.pumpWidget(createOrgInfoScreen2()); + await tester.pumpAndSettle(); + + expect(find.text('Members'), findsOneWidget); + expect(find.text('Paul 1'), findsOneWidget); + + expect(find.text('See all'), findsOneWidget); + await tester.tap(find.text('See all')); + await tester.pumpAndSettle(); + + expect(find.text('Chris 1'), findsOneWidget); + }); + }); + }); +} diff --git a/test/views/after_auth_screens/profile/profile_page_test.dart b/test/views/after_auth_screens/profile/profile_page_test.dart new file mode 100644 index 000000000..93d11d001 --- /dev/null +++ b/test/views/after_auth_screens/profile/profile_page_test.dart @@ -0,0 +1,193 @@ +import 'dart:io'; + +import 'package:contained_tab_bar_view/contained_tab_bar_view.dart'; +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:mockito/mockito.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/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/main_screen_view_model.dart'; +import 'package:talawa/views/after_auth_screens/profile/profile_page.dart'; +import 'package:talawa/views/base_view.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +Widget createProfilePage({required MainScreenViewModel mainScreenViewModel}) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + key: MainScreenViewModel.scaffoldKey, + body: ProfilePage( + key: const Key('Profile Page'), + homeModel: mainScreenViewModel, + ), + ), + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + theme: TalawaTheme.darkTheme, + ); + }, + ); +} + +void main() async { + testSetupLocator(); + locator().test(); + final Directory dir = Directory('test/fixtures/coree'); + group('build', () { + setUpAll(() async { + registerServices(); + getAndRegisterAppTheme(); + Hive + ..init(dir.path) + ..registerAdapter(UserAdapter()) + ..registerAdapter(OrgInfoAdapter()); + await Hive.openBox('currentUser'); + await Hive.openBox('currentOrg'); + await Hive.openBox('pluginBox'); + }); + + tearDownAll(() async { + await Hive.close(); + Future safeDelete(String filePath) async { + final file = File(filePath); + if (await file.exists()) { + try { + await file.delete(); + } catch (e) { + print('Error deleting $filePath: $e'); + } + } + } + + await safeDelete('test/fixtures/coree/currentorg.hive'); + await safeDelete('test/fixtures/coree/currentorg.lock'); + await safeDelete('test/fixtures/coree/currentuser.hive'); + await safeDelete('test/fixtures/coree/currentuser.lock'); + await safeDelete('test/fixtures/coree/pluginbox.hive'); + }); + testWidgets('check if profilePage shows up and refreshIndicator work', + (tester) async { + await tester.pumpWidget( + createProfilePage( + mainScreenViewModel: locator(), + ), + ); + await tester.pumpAndSettle(); + expect(find.byType(RefreshIndicator), findsOneWidget); + await tester.drag( + find.byKey(const Key('profilepic')), + const Offset(0, 300), + ); + await tester.pumpAndSettle(); + }); + testWidgets('check if invitebutton work', (tester) async { + await tester.pumpWidget( + createProfilePage( + mainScreenViewModel: locator(), + ), + ); + await tester.pump(); + await tester.tap(find.byKey(const Key('inviteicon'))); + await tester.pump(); + }); + testWidgets('check if left drawer works', (tester) async { + await tester.pumpWidget( + createProfilePage( + mainScreenViewModel: locator(), + ), + ); + await tester.pumpAndSettle(); + await tester.tap(find.byIcon(Icons.menu)); + await tester.pumpAndSettle(); + }); + testWidgets('check if Donate button work', (tester) async { + await tester.pumpWidget( + createProfilePage( + mainScreenViewModel: locator(), + ), + ); + await tester.pump(); + await tester.tap(find.text('Donate to the Community')); + await tester.pump(); + }); + + testWidgets('check if settings page is opening up', (tester) async { + await tester.pumpWidget( + createProfilePage( + mainScreenViewModel: locator(), + ), + ); + await tester.pump(); + final settingsIcon = find.byKey(const Key('settingIcon')); + await tester.tap(settingsIcon); + verify(navigationService.navigatorKey); + }); + testWidgets('check if User Feed is present', (tester) async { + await tester.pumpWidget( + createProfilePage( + mainScreenViewModel: locator(), + ), + ); + await tester.pump(); + + expect(find.byType(ContainedTabBarView), findsOneWidget); + expect(find.byKey(const Key("UserFeed")), findsOneWidget); + }); + testWidgets('check if User Event is present', (tester) async { + await tester.pumpWidget( + createProfilePage( + mainScreenViewModel: locator(), + ), + ); + await tester.pump(); + + expect(find.byType(ContainedTabBarView), findsOneWidget); + await tester.tap(find.text('Events')); + await tester.pump(); + }); + testWidgets('Test donate bottom sheet', (tester) async { + await tester.pumpWidget( + createProfilePage( + mainScreenViewModel: locator(), + ), + ); + await tester.pumpAndSettle(); + + expect(find.byType(ContainedTabBarView), findsOneWidget); + final orgDonateBtn = find.text('Donate to the Community'); + expect(orgDonateBtn, findsOneWidget); + await tester.tap(orgDonateBtn); + await tester.pumpAndSettle(); + + final txtfield = find.byKey(const Key('custom_amt')); + await tester.enterText(txtfield, '25'); + await tester.pump(); + + final donateBtn = find.byKey(const Key('DONATE')); + await tester.ensureVisible(donateBtn); + await tester.pumpAndSettle(); + await tester.tap(donateBtn); + + final currencyBtn = find.byKey(const Key('currency_btn')); + await tester.tap(currencyBtn); + await tester.pumpAndSettle(); + }); + }); +} diff --git a/test/views/after_auth_screens/profile/user_event_test.dart b/test/views/after_auth_screens/profile/user_event_test.dart new file mode 100644 index 000000000..0d39be40d --- /dev/null +++ b/test/views/after_auth_screens/profile/user_event_test.dart @@ -0,0 +1,180 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/router.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/after_auth_view_models/event_view_models/explore_events_view_model.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/after_auth_screens/profile/user_event.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/event_card.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_helpers.mocks.dart'; +import '../../../helpers/test_locator.dart'; + +Widget userEventsScreen({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, + required bool isTest, +}) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + // return BaseView( + // onModelReady: (model) { + // model.initialize(likedBy0, 'test_post_id'); + // }, + // builder: (context, model, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + key: MainScreenViewModel.scaffoldKey, + body: const UserEvents( + key: Key('test_key'), + ), + ), + navigatorKey: locator().navigatorKey, + onGenerateRoute: generateRoute, + ); + }, + ); + // }, + // ); +} + +void main() { + SizeConfig().test(); + testSetupLocator(); + late MockExploreEventsViewModel mockViewModel; + setUp(() { + registerServices(); + mockViewModel = MockExploreEventsViewModel(); + locator.unregister(); + locator.registerSingleton(mockViewModel); + }); + tearDown(() { + unregisterServices(); + }); + group('tests for UserEvents Screen', () { + testWidgets('check if UserEvents Screen shows up', (tester) async { + when(mockViewModel.isBusy).thenReturn(true); + when(mockViewModel.initialise()).thenAnswer((_) async {}); + when(mockViewModel.events).thenReturn([]); + + await tester.pumpWidget(userEventsScreen(isTest: true)); + await tester.pump(); + final finder = find.byKey(const Key('test_key')); + expect(finder, findsOneWidget); + }); + testWidgets('check if CircularIndicator Shows up', (tester) async { + when(mockViewModel.isBusy).thenReturn(true); + when(mockViewModel.initialise()).thenAnswer((_) async {}); + when(mockViewModel.events).thenReturn([]); + + await tester.pumpWidget(userEventsScreen(isTest: false)); + await tester.pump(); + final finder = find.byType(CircularProgressIndicator); + expect(finder, findsOneWidget); + }); + testWidgets('check if No Events text shows up', (tester) async { + when(mockViewModel.isBusy).thenReturn(false); + when(mockViewModel.initialise()).thenAnswer((_) async {}); + when(mockViewModel.events).thenReturn([]); + + await tester.pumpWidget(userEventsScreen(isTest: true)); + await tester.pump(); + final finder = find.byType(CircularProgressIndicator); + expect(finder, findsNothing); + expect( + find.text('You have no event in this organization'), + findsOneWidget, + ); + }); + testWidgets('check if text button shows up', (tester) async { + when(mockViewModel.isBusy).thenReturn(false); + when(mockViewModel.initialise()).thenAnswer((_) async {}); + when(mockViewModel.events).thenReturn([]); + + await tester.pumpWidget(userEventsScreen(isTest: true)); + await tester.pump(); + + final finder = find.byType(CircularProgressIndicator); + expect(finder, findsNothing); + expect( + find.text('Create your first event'), + findsOneWidget, + ); + await tester.tap(find.text('Create your first event')); + await tester.pumpAndSettle(); + }); + testWidgets('check if User Event screen shows up', (tester) async { + when(mockViewModel.isBusy).thenReturn(false); + when(mockViewModel.initialise()).thenAnswer((_) async {}); + when(mockViewModel.events).thenReturn([]); + + await tester.pumpWidget(userEventsScreen(isTest: true)); + await tester.pumpAndSettle(); + expect(find.byKey(const Key('test_key')), findsOneWidget); + }); + testWidgets('check if User Events shows up if not null', (tester) async { + when(mockViewModel.isBusy).thenReturn(false); + when(mockViewModel.initialise()).thenAnswer((_) async {}); + when(mockViewModel.userEvents).thenReturn([ + Event( + id: 'a', + title: 'Sample Event', + description: 'This is a fake event description.', + location: 'City Park', + latitude: 40.7128, + longitude: -74.0060, + recurring: false, + allDay: false, + startDate: '2022-01-01', + endDate: '2022-01-02', + startTime: '12:00 PM', + endTime: '3:00 PM', + recurrence: 'Weekly', + isPublic: true, + isRegistered: false, + isRegisterable: true, + creator: User(id: 'creator'), + organization: OrgInfo(), + admins: [ + User(id: 'admin'), + ], + attendees: [ + Attendee(id: 'attendee1'), + ], + ), + ]); + + await tester.pumpWidget(userEventsScreen(isTest: true)); + await tester.pump(); + final finder = find.byType(CircularProgressIndicator); + expect(finder, findsNothing); + expect( + find.text('Create your first event'), + findsNothing, + ); + final finder1 = find.byType(SingleChildScrollView); + expect(finder1, findsOneWidget); + expect(find.byType(EventCard), findsOneWidget); + await tester.tap(find.byType(GestureDetector)); + await tester.pumpAndSettle(); + }); + }); +} diff --git a/test/views/after_auth_screens/profile/user_feed_test.dart b/test/views/after_auth_screens/profile/user_feed_test.dart new file mode 100644 index 000000000..dc9ee4659 --- /dev/null +++ b/test/views/after_auth_screens/profile/user_feed_test.dart @@ -0,0 +1,198 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/router.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/after_auth_view_models/feed_view_models/organization_feed_view_model.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/after_auth_screens/profile/user_feed.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/post_list_widget.dart'; +import 'package:talawa/widgets/post_widget.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_helpers.mocks.dart'; +import '../../../helpers/test_locator.dart'; + +Widget userFeedScreen({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, + required bool isTest, +}) { + return MaterialApp( + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + key: MainScreenViewModel.scaffoldKey, + body: UserFeed( + forTest: isTest, + key: const Key('test_key'), + ), + ), + ); +} + +Widget userFeedScreen1({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, + required bool isTest, +}) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + // return BaseView( + // onModelReady: (model) { + // model.initialize(likedBy0, 'test_post_id'); + // }, + // builder: (context, model, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + key: MainScreenViewModel.scaffoldKey, + body: UserFeed( + forTest: isTest, + key: const Key('test_key'), + ), + ), + navigatorKey: locator().navigatorKey, + onGenerateRoute: generateRoute, + ); + }, + ); + // }, + // ); +} + +final List likedBy0 = [ + LikedBy(sId: 'Test user 1'), + LikedBy(sId: 'Test user 2'), +]; + +final post = Post( + sId: "test_post_id", + creator: userConfig.currentUser, + likedBy: likedBy0, +); + +void main() { + SizeConfig().test(); + testSetupLocator(); + late MockOrganizationFeedViewModel mockViewModel; + + setUp(() { + registerServices(); + mockViewModel = MockOrganizationFeedViewModel(); + locator.unregister(); + locator.registerSingleton(mockViewModel); + }); + tearDown(() { + unregisterServices(); + }); + + TestWidgetsFlutterBinding.ensureInitialized(); + group('tests for User feed Screen', () { + testWidgets('check if UserFeedScreen shows up', (tester) async { + when(mockViewModel.isFetchingPosts).thenReturn(true); + when(mockViewModel.initialise()).thenReturn(null); + when(mockViewModel.userPosts).thenReturn([]); + await tester.pumpWidget(userFeedScreen(isTest: true)); + await tester.pump(); + final finder = find.byKey(const Key('test_key')); + expect(finder, findsOneWidget); + }); + + testWidgets('check if CircularIndicator Shows up', (tester) async { + when(mockViewModel.isFetchingPosts).thenReturn(true); + when(mockViewModel.initialise()).thenReturn(null); + when(mockViewModel.userPosts).thenReturn([]); + + await tester.pumpWidget(userFeedScreen(isTest: false)); + await tester.pump(); + final finder = find.byType(CircularProgressIndicator); + expect(finder, findsOneWidget); + }); + testWidgets('check if No posts text shows up', (tester) async { + when(mockViewModel.isFetchingPosts).thenReturn(false); + when(mockViewModel.initialise()).thenReturn(null); + when(mockViewModel.userPosts).thenReturn([]); + + await tester.pumpWidget(userFeedScreen(isTest: true)); + await tester.pump(); + final finder = find.byType(CircularProgressIndicator); + expect(finder, findsNothing); + expect( + find.text('You have no post in this organization'), + findsOneWidget, + ); + }); + testWidgets('check if text button shows up', (tester) async { + when(mockViewModel.isFetchingPosts).thenReturn(false); + when(mockViewModel.initialise()).thenReturn(null); + when(mockViewModel.userPosts).thenReturn([]); + + await tester.pumpWidget(userFeedScreen(isTest: true)); + await tester.pump(); + final finder = find.byType(CircularProgressIndicator); + expect(finder, findsNothing); + expect( + find.text('Create your first post'), + findsOneWidget, + ); + await tester.tap(find.text('Create your first post')); + await tester.pumpAndSettle(); + }); + testWidgets('check if PostListWIdget shows up', (tester) async { + when(mockViewModel.isFetchingPosts).thenReturn(false); + when(mockViewModel.userPosts).thenReturn([ + Post( + sId: "test_post_id", + creator: userConfig.currentUser, + likedBy: likedBy0, + description: 'Testing', + comments: [Comments(sId: 'cmmnt1')], + createdAt: DateTime.now(), + organization: userConfig.currentOrg, + ), + ]); + when(mockViewModel.initialise()).thenReturn(null); + + await tester.pumpWidget(userFeedScreen1(isTest: true)); + await tester.pumpAndSettle(); + final finder = find.byType(CircularProgressIndicator); + expect(finder, findsNothing); + final finder1 = find.byType(PostListWidget); + expect(finder1, findsOneWidget); + expect(find.byType(NewsPost), findsOneWidget); + }); + }); +} diff --git a/test/views/demo_screens/explore_events_demo_test.dart b/test/views/demo_screens/explore_events_demo_test.dart new file mode 100644 index 000000000..599982920 --- /dev/null +++ b/test/views/demo_screens/explore_events_demo_test.dart @@ -0,0 +1,226 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/models/user/user_info.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/after_auth_view_models/event_view_models/explore_events_view_model.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/explore_event_dialogue.dart'; +import 'package:talawa/views/demo_screens/explore_events_demo.dart'; +import 'package:talawa/widgets/custom_drawer.dart'; +import 'package:talawa/widgets/event_card.dart'; + +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_locator.dart'; + +// class MockBuildContext extends Mock implements BuildContext {} + +Widget createExploreEventsScreen(MainScreenViewModel model) => MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + home: Scaffold( + key: MainScreenViewModel.scaffoldKey, + drawer: CustomDrawer( + homeModel: model, + ), + body: const DemoExploreEvents( + key: Key('ExploreEvents'), + ), + ), + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + ); + +void main() async { + SizeConfig().test(); + + final mockEvents = [ + Event( + id: 'event1', + admins: [User(id: 'admin1')], + creator: User(id: 'admin2'), + startTime: DateTime.now().day.toString(), + endTime: DateTime.now().day.toString(), + title: 'event title', + startDate: DateTime.now().day.toString(), + endDate: DateTime.now().day.toString(), + location: 'location', + description: 'description', + isPublic: true, + ), + ]; + + late ExploreEventsViewModel exploreEventsViewModel; + group('Test for DemoExploreEventsPage', () { + setUpAll(() { + registerServices(); + registerViewModels(); + exploreEventsViewModel = getAndRegisterExploreEventsViewModel(); + }); + tearDownAll(() { + unregisterServices(); + unregisterViewModels(); + }); + testWidgets('Test for menu button.', (tester) async { + final model = MainScreenViewModel(); + await tester.pumpWidget(createExploreEventsScreen(model)); + + await tester.pumpAndSettle(); + + final menuButton = find.byIcon(Icons.menu); + + await tester.tap(menuButton); + await tester.pumpAndSettle(); + + expect(find.byType(CustomDrawer), findsOneWidget); + }); + + testWidgets('Test for AddDate button.', (tester) async { + final model = MainScreenViewModel(); + await tester.pumpWidget(createExploreEventsScreen(model)); + + await tester.pumpAndSettle(); + + final addDateButton = find.textContaining('Add Date'); + + await tester.tap(addDateButton); + await tester.pumpAndSettle(); + + expect(find.byType(ExploreEventDialog), findsOneWidget); + }); + + testWidgets('Test for Calendar button', (tester) async { + final model = MainScreenViewModel(); + final mockModel = ExploreEventsViewModel(); + await tester.pumpWidget(createExploreEventsScreen(model)); + + await tester.pumpAndSettle(); + + final calendarBtn = find.byIcon(Icons.calendar_month); + + expect(calendarBtn, findsOneWidget); + + await tester.tap(calendarBtn); + await tester.pumpAndSettle(); + + verify( + navigationService.pushScreen( + Routes.calendar, + arguments: mockModel.events, + ), + ); + }); + + testWidgets('Test for floatingAction button', (tester) async { + final model = MainScreenViewModel(); + await tester.pumpWidget(createExploreEventsScreen(model)); + + await tester.pumpAndSettle(); + + final floatingBtn = find.byType(FloatingActionButton); + + expect(floatingBtn, findsOneWidget); + + await tester.tap(floatingBtn); + await tester.pumpAndSettle(); + + verify( + navigationService.pushScreen( + "/createEventPage", + ), + ); + }); + + testWidgets('Test for eventCard.', (tester) async { + final model = MainScreenViewModel(); + when(exploreEventsViewModel.events).thenAnswer((_) { + return mockEvents; + }); + await tester.pumpWidget(createExploreEventsScreen(model)); + + await tester.pumpAndSettle(); + + final eventCard = find.byType(EventCard).first; + + expect(eventCard, findsOneWidget); + + await tester.tap(eventCard); + await tester.pumpAndSettle(); + + verify( + navigationService.navigatorKey, + ); + }); + + testWidgets('Test for dropDown button', (tester) async { + final model = MainScreenViewModel(); + await tester.pumpWidget(createExploreEventsScreen(model)); + + await tester.pumpAndSettle(); + + final dropDownBtn = find.byType(DropdownButton); + + await tester.tap(dropDownBtn); + await tester.pumpAndSettle(); + + final createEventsBtn = find.textContaining('Created Events'); + + expect(createEventsBtn, findsOneWidget); + + await tester.tap(createEventsBtn); + await tester.pumpAndSettle(); + }); + + testWidgets('Test for ExploreEvent dialog', (tester) async { + final model = MainScreenViewModel(); + await tester.pumpWidget(createExploreEventsScreen(model)); + + await tester.pumpAndSettle(); + + final dropDownBtn = find.byType(DropdownButton); + + await tester.tap(dropDownBtn); + await tester.pumpAndSettle(); + + final createEventsBtn = find.textContaining('Created Events'); + + expect(createEventsBtn, findsOneWidget); + + await tester.tap(createEventsBtn); + await tester.pumpAndSettle(); + }); + + testWidgets('Test for layout when zero events', (tester) async { + final model = MainScreenViewModel(); + when(exploreEventsViewModel.events).thenReturn([]); + await tester.pumpWidget(createExploreEventsScreen(model)); + + await tester.pumpAndSettle(); + + final dropDownBtn = find.byType(DropdownButton); + + await tester.tap(dropDownBtn); + await tester.pumpAndSettle(); + + final createEventsBtn = find.textContaining('Created Events'); + + expect(createEventsBtn, findsOneWidget); + + await tester.tap(createEventsBtn); + await tester.pumpAndSettle(); + }); + }); +} diff --git a/test/views/demo_screens/organization_feed_demo_test.dart b/test/views/demo_screens/organization_feed_demo_test.dart new file mode 100644 index 000000000..0767d0bea --- /dev/null +++ b/test/views/demo_screens/organization_feed_demo_test.dart @@ -0,0 +1,64 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/models/mainscreen_navigation_args.dart'; +import 'package:talawa/services/graphql_config.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/views/main_screen.dart'; + +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_locator.dart'; + +class MockBuildContext extends Mock implements BuildContext {} + +Widget createHomeScreen({required bool demoMode}) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + themeMode: ThemeMode.light, + theme: TalawaTheme.lightTheme, + home: MainScreen( + key: const Key('MainScreen'), + mainScreenArgs: MainScreenArgs( + mainScreenIndex: 0, + fromSignUp: false, + toggleDemoMode: demoMode, + ), + ), + ); +} + +void main() async { + testSetupLocator(); + + setUp(() { + registerServices(); + locator().test(); + locator().test(); + }); + + group('Home Page tests', () { + testWidgets('Test for menu button.', (tester) async { + await tester.pumpWidget(createHomeScreen(demoMode: true)); + + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final menuButton = find.byIcon(Icons.menu); + + await tester.tap(menuButton); + await tester.pumpAndSettle(); + + expect(find.byKey(const Key("Drawer")), findsOneWidget); + }); + }); +} diff --git a/test/views/demo_screens/profile_page_demo_test.dart b/test/views/demo_screens/profile_page_demo_test.dart new file mode 100644 index 000000000..7e9426c1b --- /dev/null +++ b/test/views/demo_screens/profile_page_demo_test.dart @@ -0,0 +1,88 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/models/mainscreen_navigation_args.dart'; +import 'package:talawa/services/graphql_config.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/views/main_screen.dart'; + +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_locator.dart'; + +class MockBuildContext extends Mock implements BuildContext {} + +Widget createProfileScreen({required bool demoMode}) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + themeMode: ThemeMode.light, + theme: TalawaTheme.lightTheme, + home: MainScreen( + key: const Key('MainScreen'), + mainScreenArgs: MainScreenArgs( + mainScreenIndex: 2, + fromSignUp: false, + toggleDemoMode: demoMode, + ), + ), + ); +} + +void main() async { + testSetupLocator(); + + group('Profile Page tests', () { + setUpAll(() { + registerServices(); + locator().test(); + locator().test(); + }); + testWidgets('Test for donate button.', (tester) async { + await tester.pumpWidget(createProfileScreen(demoMode: true)); + + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final donateButton = find.textContaining('Donate to the Community'); + + await tester.tap(donateButton); + await tester.pumpAndSettle(); + + expect(find.byKey(const Key("Drawer")), findsOneWidget); + }); + + testWidgets('Test for menu button.', (tester) async { + await tester.pumpWidget(createProfileScreen(demoMode: true)); + + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final menuButton = find.byIcon(Icons.menu); + + await tester.tap(menuButton); + await tester.pumpAndSettle(); + + expect(find.byKey(const Key("Drawer")), findsOneWidget); + }); + + testWidgets('check if settings page is opening up', (tester) async { + await tester.pumpWidget( + createProfileScreen( + demoMode: true, + ), + ); + await tester.pumpAndSettle(const Duration(seconds: 1)); + final settingsIcon = find.byKey(const Key('settingIcon')); + await tester.tap(settingsIcon); + verify(navigationService.pushScreen('/appSettingsPage')); + }); + }); +} diff --git a/test/views/helpers/test_locator.dart b/test/views/helpers/test_locator.dart new file mode 100644 index 000000000..b5e770e58 --- /dev/null +++ b/test/views/helpers/test_locator.dart @@ -0,0 +1,4 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +// TODO Implement this library. diff --git a/test/views/main_screen_test.dart b/test/views/main_screen_test.dart new file mode 100644 index 000000000..f9a5afc12 --- /dev/null +++ b/test/views/main_screen_test.dart @@ -0,0 +1,272 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:graphql_flutter/graphql_flutter.dart'; +import 'package:hive/hive.dart'; +import 'package:mockito/mockito.dart'; +// import 'package:mocktail_image_network/mocktail_image_network.dart'; +import 'package:provider/provider.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/models/mainscreen_navigation_args.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/view_model/main_screen_view_model.dart'; +import 'package:talawa/view_model/theme_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/views/main_screen.dart'; +// import 'package:talawa/widgets/custom_drawer.dart'; + +import '../helpers/test_helpers.dart'; +import '../helpers/test_locator.dart'; + +Widget createMainScreen({bool demoMode = true}) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, themeModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + theme: Provider.of(context, listen: true).isdarkTheme + ? TalawaTheme.darkTheme + : TalawaTheme.lightTheme, + home: Scaffold( + body: MainScreen( + mainScreenArgs: MainScreenArgs( + fromSignUp: false, + mainScreenIndex: 0, + toggleDemoMode: demoMode, + ), + ), + ), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + }, + ); +} + +class MockMainScreenViewModel extends Mock implements MainScreenViewModel { + @override + int get currentPageIndex => 0; + + @override + List get pages => [const Test(key: Key('key'))]; + + @override + List get navBarItems => [ + const BottomNavigationBarItem(icon: Icon(Icons.abc), label: 'label1'), + const BottomNavigationBarItem(icon: Icon(Icons.abc), label: 'label2'), + ]; +} + +class Test extends StatelessWidget { + const Test({super.key}); + + @override + Widget build(BuildContext context) { + return const Placeholder(); + } +} + +void main() async { + testSetupLocator(); + registerServices(); + + TestWidgetsFlutterBinding.ensureInitialized(); + locator().test(); + locator().test(); + + final Directory dir = Directory('temporaryPath'); + Hive + ..init(dir.path) + ..registerAdapter(UserAdapter()) + ..registerAdapter(OrgInfoAdapter()); + + await Hive.openBox('currentUser'); + await Hive.openBox('currentOrg'); + + await Hive.openBox('pluginBox'); + await Hive.openBox('url'); + + late GraphQLClient graphQLClient; + + setUp(() { + registerServices(); + locator().test(); + locator.unregister(); + locator + .registerFactory(() => MockMainScreenViewModel()); + + graphQLClient = locator(); + when( + graphQLClient.query( + QueryOptions( + document: gql(queries.getPluginsList()), + ), + ), + ).thenAnswer( + (realInvocation) async { + return QueryResult.internal( + source: QueryResultSource.network, + parserFn: (data) => {}, + data: { + "getPlugins": [], + }, + ); + }, + ); + }); + + tearDown(() { + unregisterServices(); + }); + + group("Test for main_screen.dart", () { + testWidgets('Test join org banner.', (tester) async { + await tester.pumpWidget(createMainScreen()); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final bannerFinder = find.byKey(const Key('banner')); + + await tester.tap(bannerFinder); + + verify(navigationService.pushScreen(Routes.setUrlScreen, arguments: '')); + }); + + testWidgets("Test if Join Org banner not visible.", (tester) async { + await tester.pumpWidget(createMainScreen(demoMode: false)); + await tester.pump(); + }); + // + // // Don't call pumpAndSettle as the BottomNavigationBar + // // of this widget builds itself repeatedly, causing an infinite + // // loop; making the test never stop + // + // // await tester.pumpAndSettle(); + // + // expect(find.byType(MainScreen), findsOneWidget); + // }); + // + // testWidgets("Check if all children shows up", (tester) async { + // // This stub shows its effect in the next test + // + // when( + // graphQLClient.query( + // QueryOptions( + // document: gql(queries.getPluginsList()), + // ), + // ), + // ).thenAnswer( + // (realInvocation) async { + // return QueryResult.internal( + // source: QueryResultSource.network, + // parserFn: (data) => {}, + // data: { + // "getPlugins": null, + // }, + // ); + // }, + // ); + // + // await tester.pumpWidget(createMainScreen()); + // await tester.pump(); + // + // expect( + // find.byWidgetPredicate( + // (widget) => + // widget is Scaffold && + // widget.drawer is CustomDrawer && + // widget.body is IndexedStack && + // widget.bottomNavigationBar is BottomNavigationBar, + // ), + // findsOneWidget, + // ); + // + // 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_outlined), findsOneWidget); + // expect(find.byIcon(Icons.account_circle), findsOneWidget); + // + // expect(find.byType(OrganizationFeed), findsOneWidget); + // expect(find.byType(ExploreEvents), findsOneWidget); + // expect(find.byType(AddPost), findsOneWidget); + // expect(find.byType(ProfilePage), findsOneWidget); + // }); + // + // testWidgets("Check if plugin loading works", (tester) async { + // mockNetworkImages(() async { + // await tester.pumpWidget(createMainScreen()); + // await tester.pump(); + // + // 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_outlined), findsOneWidget); + // expect(find.byIcon(Icons.account_circle), findsOneWidget); + // + // expect(find.byType(OrganizationFeed), findsOneWidget); + // expect(find.byType(ExploreEvents), findsOneWidget); + // expect(find.byType(AddPost), findsOneWidget); + // expect(find.byType(ProfilePage), findsOneWidget); + // + // // If MainScreen finds some plugins, it will add them dynamically + // + // // expect(find.byType(ChangeThemeTile), findsOneWidget); + // }); + // }); + // + // testWidgets("Check if changing pages works", (tester) async { + // mockNetworkImages(() async { + // await tester.pumpWidget(createMainScreen()); + // await tester.pump(); + // + // await tester.tap(find.byIcon(Icons.home)); + // await tester.pump(); + // expect(mainScreenViewModel.currentPageIndex, 0); + // + // await tester.tap(find.byIcon(Icons.event_note)); + // await tester.pump(); + // // expect(mainScreenViewModel.currentIndex, 1); + // + // await tester.tap(find.byIcon(Icons.add_box)); + // await tester.pump(); + // // expect(mainScreenViewModel.currentIndex, 2); + // + // await tester.tap(find.byIcon(Icons.chat_outlined)); + // await tester.pump(); + // // expect(mainScreenViewModel.currentIndex, 3); + // + // await tester.tap(find.byIcon(Icons.account_circle)); + // await tester.pump(); + // // expect(mainScreenViewModel.currentIndex, 4); + // }); + // }); + }); +} diff --git a/test/widget_tests/after_auth_screens/app_settings/app_setting_page_test.dart b/test/widget_tests/after_auth_screens/app_settings/app_setting_page_test.dart new file mode 100644 index 000000000..482866e45 --- /dev/null +++ b/test/widget_tests/after_auth_screens/app_settings/app_setting_page_test.dart @@ -0,0 +1,330 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:provider/provider.dart'; +import 'package:talawa/constants/constants.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/models/language/language_model.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/after_auth_view_models/settings_view_models/app_setting_view_model.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/view_model/theme_view_model.dart'; +import 'package:talawa/views/after_auth_screens/app_settings/app_settings_page.dart'; +import 'package:talawa/views/base_view.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +/// MockBuildContext class helps to mock the BuildContext class. +class MockBuildContext extends Mock implements BuildContext {} + +/// MockCallbackFunction class helps to mock the callback function. +class MockCallbackFunction extends Mock { + /// call function helps to mock the call function. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void call(); +} + +/// 'createAppSettingScreen' is used to create the AppSettingPage widget in light mode. +/// +/// **params**: +/// * `themeMode`: Represents the theme mode of the widget. +/// +/// **returns**: +/// * `Widget`: Returns the AppSettingPage widget. +Widget createAppSettingScreen({ThemeMode themeMode = ThemeMode.light}) => + BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, themeModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + themeMode: themeMode, + theme: Provider.of(context, listen: true).isdarkTheme + ? TalawaTheme.darkTheme + : TalawaTheme.lightTheme, + home: const AppSettingsPage( + key: Key('AppSettingsPage'), + ), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + }, + ); + +Future main() async { + testSetupLocator(); + TestWidgetsFlutterBinding.ensureInitialized(); + locator().test(); + SizeConfig().test(); + registerServices(); + + group('Setting Page Screen Widget Test in dark mode', () { + testWidgets("Testing if Settings Screen shows up", (tester) async { + await tester + .pumpWidget(createAppSettingScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('AppSettingScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + + final backButton = find.byIcon(Icons.arrow_back); + + await tester.tap(backButton); + await tester.pumpAndSettle(); + + verify(navigationService.navigatorKey); + }); + testWidgets( + "Testing if Settings Screen shows up in dark mode with Theme selection tile", + (tester) async { + await tester + .pumpWidget(createAppSettingScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('AppSettingScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + final switchThemeTile = find.byKey(const Key('ThemeSwitch')); + expect(switchThemeTile, findsOneWidget); + final themeToggleButton = find.byKey(const Key('ToggleTheme')); + expect(themeToggleButton, findsOneWidget); + expect((tester.firstWidget(themeToggleButton) as Switch).value, true); + }); + testWidgets( + "Testing if Settings Screen shows up in dark mode with language selection tile", + (tester) async { + await tester + .pumpWidget(createAppSettingScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('AppSettingScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + final languageSwitchTile = find.byKey(const Key('LanguageTile')); + expect(languageSwitchTile, findsOneWidget); + final languageSelectionButton = find.byKey(const Key('LanguageSelector')); + expect(languageSelectionButton, findsOneWidget); + final Language userLanguage = languages.firstWhere( + (element) => + element.langCode == + Provider.of( + locator().navigatorKey.currentContext!, + listen: false, + ).appLocal.languageCode, + ); + expect( + ((tester.firstWidget(languageSelectionButton) as TextButton).child! + as Text) + .data, + userLanguage.langName, + ); + await tester.tap(languageSelectionButton); + await tester.pumpAndSettle(const Duration(seconds: 1)); + }); + testWidgets("Testing if theme changes from dark mode to light mode", + (tester) async { + await tester + .pumpWidget(createAppSettingScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('AppSettingScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + final switchThemeTile = find.byKey(const Key('ThemeSwitch')); + expect(switchThemeTile, findsOneWidget); + final themeToggleButton = find.byKey(const Key('ToggleTheme')); + expect(themeToggleButton, findsOneWidget); + expect((tester.firstWidget(themeToggleButton) as Switch).value, true); + await tester.tap(themeToggleButton); + await tester.pumpAndSettle(const Duration(seconds: 1)); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.lightTheme.scaffoldBackgroundColor, + ); + }); + testWidgets( + "Testing if theme changes from dark mode to light mode then again back to dark mode", + (tester) async { + await tester + .pumpWidget(createAppSettingScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('AppSettingScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + final switchThemeTile = find.byKey(const Key('ThemeSwitch')); + expect(switchThemeTile, findsOneWidget); + final themeToggleButton = find.byKey(const Key('ToggleTheme')); + expect(themeToggleButton, findsOneWidget); + expect((tester.firstWidget(themeToggleButton) as Switch).value, true); + await tester.tap(themeToggleButton); + await tester.pumpAndSettle(const Duration(seconds: 1)); + expect((tester.firstWidget(themeToggleButton) as Switch).value, false); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.lightTheme.scaffoldBackgroundColor, + ); + await tester.tap(themeToggleButton); + await tester.pumpAndSettle(const Duration(seconds: 1)); + expect((tester.firstWidget(themeToggleButton) as Switch).value, true); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + }); + testWidgets('Test Edit Profile Tile is visible and works properly', + (tester) async { + when(userConfig.loggedIn).thenReturn(true); + await tester + .pumpWidget(createAppSettingScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + expect(find.text('Profile'), findsOneWidget); + + final editProfile = find.textContaining('Edit Profile'); + await tester.tap(editProfile); + + verify(navigationService.navigatorKey); + }); + testWidgets('Test if help and support tiles are working', (tester) async { + when(userConfig.loggedIn).thenReturn(true); + await tester + .pumpWidget(createAppSettingScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + + final talawaDocs = find.textContaining('Talawa Docs'); + final talawaGitHub = find.textContaining('Talawa GitHub'); + + await tester.tap(talawaDocs); + await tester.tap(talawaGitHub); + }); + testWidgets('Test if footerTile is working.', (tester) async { + const userLoggedIn = true; + when(userConfig.loggedIn).thenAnswer((_) => userLoggedIn); + + await tester + .pumpWidget(createAppSettingScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key('Logout'))); + await tester.pumpAndSettle(); + + final logoutButton = find.textContaining('LogOut'); + await tester.tap(logoutButton); + + unregisterServices(); + registerServices(); + + const loggedIn = false; + when(userConfig.loggedIn).thenAnswer((_) => loggedIn); + + await tester + .pumpWidget(createAppSettingScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + + final joinOrgButton = find.textContaining('Join an Organisation'); + await tester.tap(joinOrgButton); + + verify(navigationService.navigatorKey); + }); + testWidgets('Test if Logout is unsuccessful.', (tester) async { + final model = AppSettingViewModel(); + when(model.logout()).thenThrow(Exception('Test error')); + + const userLoggedIn = true; + when(userConfig.loggedIn).thenAnswer((_) => userLoggedIn); + + await tester + .pumpWidget(createAppSettingScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key('Logout'))); + await tester.pumpAndSettle(); + + final logoutButton = find.textContaining('LogOut'); + await tester.tap(logoutButton); + }); + + testWidgets('Test if Logout is successful', (tester) async { + final model = AppSettingViewModel(); + when(model.logout()).thenAnswer((_) async => true); + + await tester + .pumpWidget(createAppSettingScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key('Logout'))); + await tester.pumpAndSettle(); + + final logoutButton = find.textContaining('LogOut'); + await tester.tap(logoutButton); + + verify(navigationService.pop()); + verify( + navigationService.removeAllAndPush( + Routes.setUrlScreen, + Routes.splashScreen, + arguments: '', + ), + ); + }); + }); +} diff --git a/test/widget_tests/after_auth_screens/chat/direct_chats_test.dart b/test/widget_tests/after_auth_screens/chat/direct_chats_test.dart new file mode 100644 index 000000000..03a61ad19 --- /dev/null +++ b/test/widget_tests/after_auth_screens/chat/direct_chats_test.dart @@ -0,0 +1,76 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/chats/chat_list_tile_data_model.dart'; +import 'package:talawa/models/chats/chat_user.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/view_model/after_auth_view_models/chat_view_models/direct_chat_view_model.dart'; +import 'package:talawa/views/after_auth_screens/chat/direct_chats.dart'; + +import '../../../helpers/test_helpers.dart'; + +Widget createDirectChats() { + return const MaterialApp(home: Scaffold(body: DirectChats())); +} + +final model = locator(); +Widget createChatTile() { + return MaterialApp( + home: Scaffold( + body: ChatTile( + chat: ChatListTileDataModel( + [ + ChatUser( + firstName: 'test', + id: '1', + image: 'fakeHttp', + ), + ], + '1', + ), + model: model, + ), + ), + ); +} + +void main() { + setUp(() { + registerServices(); + registerViewModels(); + }); + + tearDown(() { + unregisterViewModels(); + unregisterServices(); + }); + + group('Tests for direct chats', () { + testWidgets('Check whether DirectChats shows up', (tester) async { + await tester.pumpWidget(createDirectChats()); + await tester.pump(); + + expect(find.byType(DirectChats), findsOneWidget); + expect(find.byType(ChatTile), findsOneWidget); + }); + testWidgets('Check whether ChatTile shows up', (tester) async { + await tester.pumpWidget(createChatTile()); + await tester.pump(); + + expect(find.byType(ChatTile), findsOneWidget); + + await tester.tap(find.byType(ListTile)); + verify( + locator().pushScreen( + Routes.chatMessageScreen, + arguments: ['1', model], + ), + ); + }); + }); +} diff --git a/test/widget_tests/after_auth_screens/events/create_event_form_test.dart b/test/widget_tests/after_auth_screens/events/create_event_form_test.dart new file mode 100644 index 000000000..a8ab9d116 --- /dev/null +++ b/test/widget_tests/after_auth_screens/events/create_event_form_test.dart @@ -0,0 +1,164 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/router.dart' as router; +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/after_auth_view_models/event_view_models/create_event_view_model.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/create_event_form.dart'; +import 'package:talawa/views/after_auth_screens/events/create_event_page.dart'; +import 'package:talawa/views/base_view.dart'; + +import '../../../helpers/test_helpers.dart'; + +var createEventViewModel = CreateEventViewModel(); + +// TextEditingController eventTitleTextController = TextEditingController(); +// createEventViewModel.eventTitleTextController = eventTitleTextController; + +Widget createCreateEventForm() { + final createEventViewModel = CreateEventViewModel(); + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold(body: CreateEventForm(model: createEventViewModel)), + ); +} + +Widget createEventScreen({ + ThemeMode themeMode = ThemeMode.light, + required ThemeData theme, +}) => + BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + themeMode: themeMode, + theme: theme, + home: const CreateEventPage( + key: Key('CreateEventScreen'), + ), + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + +void main() { + SizeConfig().test(); + locator.registerSingleton(NavigationService()); + setUp(() { + registerServices(); + registerViewModels(); + }); + + tearDown(() { + unregisterViewModels(); + unregisterServices(); + }); + group('Testing create event form', () { + testWidgets("Test if create event form shows up", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createCreateEventForm()); + await tester.pump(); + expect(find.byType(TextFormField), findsNWidgets(3)); + expect( + find.descendant( + of: find.byType(Form), + matching: find.byType(TextFormField), + ), + findsNWidgets(3), + ); + }); + }); + + testWidgets("Test if create event key are working", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createCreateEventForm()); + await tester.pump(); + expect(find.byKey(const Key('create_event_form_tff1')), findsOneWidget); + expect(find.byKey(const Key('create_event_form_tff2')), findsOneWidget); + expect(find.byKey(const Key('create_event_form_tff3')), findsOneWidget); + }); + }); + testWidgets( + 'Test if form of 1st TextField is submitted on pressing enter on mobile keyboard.', + (tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createCreateEventForm()); + await tester.pump(); + + await tester.enterText( + find.byKey(const Key('create_event_form_tff1')), + 'fakeEventTitle', + ); + await tester.pump(); + await tester.testTextInput.receiveAction(TextInputAction.next); + await tester.pump(); + }); + }); + testWidgets( + 'Test if form of 2nd TextField is submitted on pressing enter on mobile keyboard.', + (tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createCreateEventForm()); + await tester.pump(); + + await tester.enterText( + find.byKey(const Key('create_event_form_tff2')), + 'fakeEventTitle', + ); + await tester.pump(); + await tester.testTextInput.receiveAction(TextInputAction.next); + await tester.pump(); + }); + }); + testWidgets( + 'Test if form of 3rd TextField is submitted on pressing enter on mobile keyboard.', + (tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createCreateEventForm()); + await tester.pump(); + + await tester.enterText( + find.byKey(const Key('create_event_form_tff3')), + 'fakeEventTitle', + ); + await tester.pump(); + await tester.testTextInput.receiveAction(TextInputAction.next); + await tester.pump(); + }); + }); + }); +} diff --git a/test/widget_tests/after_auth_screens/events/create_event_page_test.dart b/test/widget_tests/after_auth_screens/events/create_event_page_test.dart new file mode 100644 index 000000000..55e8f5d6f --- /dev/null +++ b/test/widget_tests/after_auth_screens/events/create_event_page_test.dart @@ -0,0 +1,452 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +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/after_auth_screens/events/create_event_form.dart'; +import 'package:talawa/views/after_auth_screens/events/create_event_page.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/event_date_time_tile.dart'; +import 'package:talawa/widgets/member_name_tile.dart'; + +Widget createEventScreen({ + ThemeMode themeMode = ThemeMode.light, + required ThemeData theme, +}) => + BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + themeMode: themeMode, + theme: theme, + home: const CreateEventPage( + key: Key('CreateEventScreen'), + ), + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + +void main() { + SizeConfig().test(); + setupLocator(); + graphqlConfig.test(); + group("Create Event Screen Widget Test in dark mode", () { + group('Check if the validator of the create_event_form is working', () { + testWidgets("Testing if text field validator are working", + (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final addBtn = find.descendant( + of: find.byType(AppBar), + matching: find.byType(TextButton), + ); + await tester.tap(addBtn); + }); + }); + + testWidgets("Testing if dark mode is applied", (tester) async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pumpAndSettle(); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme + ?.scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + }); + }); + group("Create Event Screen Widget Test in light mode", () { + testWidgets("Testing if light mode is applied", (tester) async { + await tester.pumpWidget( + createEventScreen( + themeMode: ThemeMode.light, + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme + ?.scaffoldBackgroundColor, + TalawaTheme.lightTheme.scaffoldBackgroundColor, + ); + }); + }); + group('Create Event Screen Widget Test', () { + testWidgets("Testing if Create Event Screen shows up", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey(const Key('CreateEventScreen')); + expect(screenScaffoldWidget, findsOneWidget); + }); + + group("Testing app bar properties and contents", () { + testWidgets("Testing if app bar shows up", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appBar = find.byType(AppBar); + final appBarWidget = tester.firstWidget(appBar) as AppBar; + expect(appBar, findsOneWidget); + expect(appBarWidget.elevation, 1); + }); + testWidgets("Testing close button in app bar", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appBar = find.byType(AppBar); + final appBarWidget = tester.firstWidget(appBar) as AppBar; + final closeBtn = find.descendant( + of: find.byType(AppBar), + matching: find.byType(GestureDetector), + ); + final closeIcon = find.descendant( + of: closeBtn.first, + matching: find.byIcon(Icons.close), + ); + expect(appBarWidget.leading, tester.firstWidget(closeBtn)); + expect( + (appBarWidget.leading as GestureDetector?)?.child, + tester.firstWidget(closeIcon), + ); + }); + testWidgets("Testing title in app bar", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appBar = find.byType(AppBar); + final appBarWidget = tester.firstWidget(appBar) as AppBar; + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final title = find.descendant( + of: find.byType(AppBar), + matching: find.byType(Text), + ); + expect(appBarWidget.title, tester.firstWidget(title)); + expect(appBarWidget.centerTitle, true); + expect( + (appBarWidget.title as Text?)?.data, + appLocalization!.strictTranslate('Add Event'), + ); + expect( + (appBarWidget.title as Text?)?.style!.fontFamily, + TalawaTheme.lightTheme.textTheme.titleLarge!.fontFamily, + ); + expect( + (appBarWidget.title as Text?)?.style!.fontSize, + 20, + ); + }); + testWidgets("Testing add button in app bar", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appBar = find.byType(AppBar); + final appBarWidget = tester.firstWidget(appBar) as AppBar; + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final addBtn = find.descendant( + of: find.byType(AppBar), + matching: find.byType(TextButton), + ); + await tester.tap(addBtn); + final addText = + find.descendant(of: addBtn, matching: find.byType(Text)); + expect(appBarWidget.actions?.length, 1); + expect(appBarWidget.actions?.first, tester.firstWidget(addBtn)); + expect( + (appBarWidget.actions?.first as TextButton?)?.child, + tester.firstWidget(addText), + ); + expect( + ((appBarWidget.actions?.first as TextButton?)?.child as Text?)?.data, + appLocalization!.strictTranslate('Add'), + ); + expect( + ((appBarWidget.actions?.first as TextButton?)?.child as Text?) + ?.style! + .fontSize, + 16, + ); + expect( + ((appBarWidget.actions?.first as TextButton?)?.child as Text?) + ?.style! + .color, + TalawaTheme.lightTheme.colorScheme.secondary, + ); + }); + }); + + group("Testing body properties and contents", () { + testWidgets("Testing Add Image section", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final imageIcon = find.descendant( + of: find.byType(Row), + matching: find.byIcon(Icons.image), + ); + final addImageBtn = find.descendant( + of: find.byType(Row), + matching: find.byType(TextButton), + ); + final addImageText = find.descendant( + of: addImageBtn.first, + matching: find.byType(Text), + ); + final imageShowWidget = find.byType(Image); + expect(imageIcon, findsOneWidget); + expect(addImageText, findsOneWidget); + expect( + (tester.widget(addImageText) as Text?)?.data, + appLocalization!.strictTranslate("Add Image"), + ); + expect( + (tester.widget(addImageText) as Text?)?.style!.fontSize, + 16, + ); + expect(imageShowWidget, findsNothing); + }); + testWidgets("Testing if Create Event Form widget shows", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final createEventForm = find.byType(CreateEventForm); + expect(createEventForm, findsOneWidget); + }); + testWidgets("Testing Select Start Date and Time section", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final textDesc = find.text( + appLocalization!.strictTranslate('Select Start Date and Time'), + ); + final dateTimeTiles = find.byType(DateTimeTile); + expect(textDesc, findsOneWidget); + expect(dateTimeTiles, findsNWidgets(2)); + + expect( + (tester.widget(textDesc) as Text?)?.style!.fontSize, + 16, + ); + }); + testWidgets("Testing Select End Date and Time section", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final textDesc = find.text( + appLocalization!.strictTranslate('Select End Date and Time'), + ); + final dateTimeTiles = find.byType(DateTimeTile); + expect(textDesc, findsOneWidget); + expect(dateTimeTiles, findsNWidgets(2)); + + expect( + (tester.widget(textDesc) as Text?)?.style!.fontSize, + 16, + ); + }); + testWidgets("Testing Does not repeat section", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final restoreIcon = find.descendant( + of: find.byType(Row), + matching: find.byIcon(Icons.restore), + ); + final doesNotRepeatText = find.descendant( + of: find.byType(Row), + matching: find.text( + appLocalization!.strictTranslate('Does not repeat'), + ), + ); + expect(restoreIcon, findsOneWidget); + expect(doesNotRepeatText, findsOneWidget); + expect( + (tester.widget(doesNotRepeatText) as Text?)?.style!.fontSize, + 16, + ); + }); + testWidgets("Testing Keep public section", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final keepPublicText = find.descendant( + of: find.byType(Row), + matching: find.text( + appLocalization!.strictTranslate('Keep Public'), + ), + ); + final switches = find.descendant( + of: find.byType(Row), + matching: find.byType(Switch), + ); + expect(keepPublicText, findsOneWidget); + expect(switches, findsNWidgets(3)); + expect( + (tester.widget(keepPublicText) as Text?)?.style!.fontSize, + 16, + ); + expect((tester.firstWidget(switches) as Switch).value, true); + await tester.ensureVisible(switches.first); + await tester.tap(switches.first); + await tester.pumpAndSettle(); + expect((tester.firstWidget(switches) as Switch).value, false); + }); + testWidgets("Testing Keep Registerable section", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final keepRegisterableText = find.descendant( + of: find.byType(Row), + matching: find.text( + appLocalization!.strictTranslate('Keep Registerable'), + ), + ); + final switches = find.descendant( + of: find.byType(Row), + matching: find.byType(Switch), + ); + expect(keepRegisterableText, findsOneWidget); + expect(switches, findsNWidgets(3)); + expect( + (tester.widget(keepRegisterableText) as Text?)?.style!.fontSize, + 16, + ); + expect((tester.widgetList(switches).toList()[1] as Switch).value, true); + await tester.ensureVisible(switches.at(1)); + await tester.tap(switches.at(1)); + await tester.pumpAndSettle(); + expect( + (tester.widgetList(switches).toList()[1] as Switch).value, + false, + ); + }); + testWidgets("Testing Add Members section", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final addMembersText = find.descendant( + of: find.byType(Row), + matching: find.text("Add Members"), + ); + final addIcons = find.byIcon(Icons.add); + final memberNameTiles = find.byType(MemberNameTile); + expect(addMembersText, findsOneWidget); + expect(addIcons, findsNWidgets(1)); + expect( + (tester.widget(addMembersText) as Text?)?.style!.fontSize, + 16, + ); + expect(memberNameTiles, findsNothing); + await tester.ensureVisible(addMembersText.first); + await tester.tap(addMembersText.first); + await tester.pump(); + expect(find.byType(BottomSheet), findsOneWidget); + }); + testWidgets("Testing if cancel button in app bar works", (tester) async { + await tester.pumpWidget( + createEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appBar = find.byType(AppBar); + final closeBtn = find.descendant( + of: appBar, + matching: find.byType(GestureDetector), + ); + await tester.tap(closeBtn.first); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + final createEventScreenPage = + find.byKey(const Key('CreateEventScreen')); + expect(createEventScreenPage, findsNothing); + }); + }); + }); +} diff --git a/test/widget_tests/after_auth_screens/events/edit_event_page_test.dart b/test/widget_tests/after_auth_screens/events/edit_event_page_test.dart new file mode 100644 index 000000000..821cad531 --- /dev/null +++ b/test/widget_tests/after_auth_screens/events/edit_event_page_test.dart @@ -0,0 +1,542 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +// ignore_for_file: unused_import + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:intl/intl.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/router.dart' as router; +import 'package:talawa/services/database_mutation_functions.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/after_auth_screens/events/edit_event_page.dart'; +import 'package:talawa/views/after_auth_screens/events/edit_events_form.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/event_date_time_tile.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_helpers.mocks.dart'; + +Widget editEventScreen({ + ThemeMode themeMode = ThemeMode.light, + required ThemeData theme, +}) => + BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, langModel, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + themeMode: themeMode, + theme: theme, + home: EditEventPage( + key: const Key('EditEventScreen'), + event: Event( + id: '1', + admins: [], + startDate: DateFormat('yMd').format( + DateTime(2021, 1, 1), + ), + endDate: DateFormat('yMd').format( + DateTime(2022, 1, 1), + ), + startTime: DateFormat('h:mm a').format(DateTime(2021, 1, 1)), + endTime: DateFormat('h:mm a').format(DateTime(2022, 1, 1)), + isRegisterable: true, + isPublic: true, + isRegistered: true, + title: "Test Title", + description: "Description Title", + location: "Buea", + ), + ), + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + +void main() { + SizeConfig().test(); + setupLocator(); + graphqlConfig.test(); + + group("Edit Event Screen Widget Test in dark mode", () { + testWidgets("Testing if dark mode is applied", (tester) async { + await tester.pumpWidget( + editEventScreen( + themeMode: ThemeMode.dark, + theme: TalawaTheme.darkTheme, + ), + ); + await tester.pumpAndSettle(); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme + ?.scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + }); + testWidgets("Testing if tapping on Done works", (tester) async { + getAndRegisterUserConfig(); + final service = getAndRegisterEventService(); + locator().init(); + + await tester.pumpWidget(editEventScreen(theme: TalawaTheme.darkTheme)); + await tester.pumpAndSettle(); + + await tester.tap(find.text('Done')); + await tester.pump(); + + verify( + (service as MockEventService) + .editEvent(eventId: '1', variables: anyNamed('variables')), + ); + }); + testWidgets('Tap on Add Image', (tester) async { + await tester.pumpWidget(editEventScreen(theme: TalawaTheme.darkTheme)); + await tester.pumpAndSettle(); + + await tester.tap(find.text('Add Image')); + await tester.pump(); + }); + testWidgets('Tap on DataTimeTile date', (tester) async { + await tester.pumpWidget(editEventScreen(theme: TalawaTheme.darkTheme)); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key('EventDateTimeTileDate')).first); + await tester.pump(); + + expect(find.byType(DatePickerDialog), findsOneWidget); + + await tester.tap(find.text('31')); + await tester.tap(find.text('OK')); + await tester.pumpAndSettle(); + + expect(find.text('2021-01-31'), findsOneWidget); + }); + testWidgets('Tap on DataTimeTile time', (tester) async { + await tester.pumpWidget(editEventScreen(theme: TalawaTheme.darkTheme)); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key('EventDateTimeTileTime')).first); + await tester.pump(); + + expect(find.byType(TimePickerDialog), findsOneWidget); + + final center = tester + .getCenter(find.byKey(const ValueKey('time-picker-dial'))); + await tester.tapAt(Offset(center.dx - 10, center.dy)); + await tester.pump(); + await tester.tapAt(Offset(center.dx, center.dy + 10)); + await tester.tap(find.text('OK')); + await tester.pump(); + + expect(find.text('9:30 AM'), findsOneWidget); + }); + testWidgets('Tap on DataTimeTile date for end', (tester) async { + await tester.pumpWidget(editEventScreen(theme: TalawaTheme.darkTheme)); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key('EventDateTimeTileDate')).last); + await tester.pump(); + + expect(find.byType(DatePickerDialog), findsOneWidget); + + await tester.tap(find.text('31')); + await tester.tap(find.text('OK')); + await tester.pumpAndSettle(); + + expect(find.text('2022-01-31'), findsOneWidget); + }); + testWidgets('Tap on DataTimeTile time for end', (tester) async { + await tester.pumpWidget(editEventScreen(theme: TalawaTheme.darkTheme)); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key('EventDateTimeTileTime')).last); + await tester.pump(); + + expect(find.byType(TimePickerDialog), findsOneWidget); + + await tester.tap(find.text('PM')); + await tester.tap(find.text('OK')); + await tester.pump(); + + expect(find.text('12:00 PM'), findsOneWidget); + }); + }); + + group("Edit Event Screen Widget Test in light mode", () { + testWidgets("Testing if light mode is applied", (tester) async { + await tester.pumpWidget( + editEventScreen( + themeMode: ThemeMode.light, + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme + ?.scaffoldBackgroundColor, + TalawaTheme.lightTheme.scaffoldBackgroundColor, + ); + }); + }); + group('Edit Event Screen Widget Test', () { + testWidgets("Testing if Edit Event Screen shows up", (tester) async { + await tester.pumpWidget( + editEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey(const Key('EditEventScreen')); + expect(screenScaffoldWidget, findsOneWidget); + }); + + group("Testing app bar properties and contents", () { + testWidgets("Testing if app bar shows up", (tester) async { + await tester.pumpWidget( + editEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appBar = find.byType(AppBar); + final appBarWidget = tester.firstWidget(appBar) as AppBar; + expect(appBar, findsOneWidget); + expect(appBarWidget.elevation, 1); + }); + testWidgets("Testing close button in app bar", (tester) async { + await tester.pumpWidget( + editEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appBar = find.byType(AppBar); + final appBarWidget = tester.firstWidget(appBar) as AppBar; + final closeBtn = find.descendant( + of: find.byType(AppBar), + matching: find.byType(GestureDetector), + ); + final closeIcon = find.descendant( + of: closeBtn.first, + matching: find.byIcon(Icons.close), + ); + expect(appBarWidget.leading, tester.firstWidget(closeBtn)); + expect( + (appBarWidget.leading as GestureDetector?)?.child, + tester.firstWidget(closeIcon), + ); + }); + testWidgets("Testing title in app bar", (tester) async { + await tester.pumpWidget( + editEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appBar = find.byType(AppBar); + final appBarWidget = tester.firstWidget(appBar) as AppBar; + final title = find.descendant( + of: find.byType(AppBar), + matching: find.byType(Text), + ); + expect(appBarWidget.title, tester.firstWidget(title)); + expect(appBarWidget.centerTitle, true); + expect( + (appBarWidget.title as Text?)?.data, + 'Edit Event', + ); + expect( + (appBarWidget.title as Text?)?.style!.fontFamily, + TalawaTheme.lightTheme.textTheme.titleLarge!.fontFamily, + ); + expect( + (appBarWidget.title as Text?)?.style!.fontSize, + 20, + ); + }); + testWidgets("Testing done button in app bar", (tester) async { + await tester.pumpWidget( + editEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appBar = find.byType(AppBar); + final appBarWidget = tester.firstWidget(appBar) as AppBar; + final doneBtn = find.descendant( + of: find.byType(AppBar), + matching: find.byType(TextButton), + ); + final doneText = + find.descendant(of: doneBtn, matching: find.byType(Text)); + expect(appBarWidget.actions?.length, 1); + expect(appBarWidget.actions?.first, tester.firstWidget(doneBtn)); + expect( + (appBarWidget.actions?.first as TextButton?)?.child, + tester.firstWidget(doneText), + ); + expect( + ((appBarWidget.actions?.first as TextButton?)?.child as Text?)?.data, + 'Done', + ); + expect( + ((appBarWidget.actions?.first as TextButton?)?.child as Text?) + ?.style! + .fontSize, + 16, + ); + expect( + ((appBarWidget.actions?.first as TextButton?)?.child as Text?) + ?.style! + .color, + TalawaTheme.lightTheme.colorScheme.secondary, + ); + }); + }); + + group("Testing body properties and contents", () { + testWidgets("Testing Add Image section", (tester) async { + await tester.pumpWidget( + editEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final imageIcon = find.descendant( + of: find.byType(Row), + matching: find.byIcon(Icons.image), + ); + final addImageBtn = find.descendant( + of: find.byType(Row), + matching: find.byType(TextButton), + ); + final addImageText = find.descendant( + of: addImageBtn.first, + matching: find.byType(Text), + ); + final imageShowWidget = find.byType(Image); + expect(imageIcon, findsOneWidget); + expect(addImageText, findsOneWidget); + expect( + (tester.widget(addImageText) as Text?)?.data, + appLocalization!.strictTranslate("Add Image"), + ); + expect( + (tester.widget(addImageText) as Text?)?.style!.fontSize, + 16, + ); + expect(imageShowWidget, findsNothing); + }); + testWidgets("Testing if Edit Event Form widget shows", (tester) async { + await tester.pumpWidget( + editEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final editEventForm = find.byType(EditEventForm); + expect(editEventForm, findsOneWidget); + }); + testWidgets("Testing Select Start Date and Time section", (tester) async { + await tester.pumpWidget( + editEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final textDesc = find.text( + appLocalization!.strictTranslate('Select Start Date and Time'), + ); + final dateTimeTiles = find.byType(DateTimeTile); + expect(textDesc, findsOneWidget); + expect(dateTimeTiles, findsNWidgets(2)); + expect( + (tester.firstWidget(dateTimeTiles) as DateTimeTile).date, + DateTime(2021, 1, 1).toString().split(' ')[0], + ); + expect( + (tester.firstWidget(dateTimeTiles) as DateTimeTile).time, + TimeOfDay.fromDateTime(DateTime(2021, 1, 1)).format( + navigationService.navigatorKey.currentContext!, + ), + ); + expect( + (tester.widget(textDesc) as Text?)?.style!.fontSize, + 16, + ); + }); + testWidgets("Testing Select End Date and Time section", (tester) async { + await tester.pumpWidget( + editEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final textDesc = find.text( + appLocalization!.strictTranslate('Select End Date and Time'), + ); + final dateTimeTiles = find.byType(DateTimeTile); + expect(textDesc, findsOneWidget); + expect(dateTimeTiles, findsNWidgets(2)); + expect( + (tester.widgetList(dateTimeTiles).toList()[1] as DateTimeTile).date, + DateTime(2022, 1, 1).toString().split(' ')[0], + ); + expect( + (tester.widgetList(dateTimeTiles).toList()[1] as DateTimeTile).time, + TimeOfDay.fromDateTime(DateTime(2022, 1, 1)).format( + navigationService.navigatorKey.currentContext!, + ), + ); + expect( + (tester.widgetList(dateTimeTiles).toList()[1] as DateTimeTile).time, + TimeOfDay.fromDateTime(DateTime(2022, 1, 1)).format( + navigationService.navigatorKey.currentContext!, + ), + ); + expect( + (tester.widget(textDesc) as Text?)?.style!.fontSize, + 16, + ); + }); + testWidgets("Testing Does not repeat section", (tester) async { + await tester.pumpWidget( + editEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final restoreIcon = find.descendant( + of: find.byType(Row), + matching: find.byIcon(Icons.restore), + ); + final doesNotRepeatText = find.descendant( + of: find.byType(Row), + matching: find.text( + appLocalization!.strictTranslate('Does not repeat'), + ), + ); + expect(restoreIcon, findsOneWidget); + expect(doesNotRepeatText, findsOneWidget); + expect( + (tester.widget(doesNotRepeatText) as Text?)?.style!.fontSize, + 16, + ); + }); + testWidgets("Testing Keep public section", (tester) async { + await tester.pumpWidget( + editEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final keepPublicText = find.descendant( + of: find.byType(Row), + matching: find.text( + appLocalization!.strictTranslate('Keep Public'), + ), + ); + final switches = find.descendant( + of: find.byType(Row), + matching: find.byType(Switch), + ); + expect(keepPublicText, findsOneWidget); + expect(switches, findsNWidgets(2)); + expect( + (tester.widget(keepPublicText) as Text?)?.style!.fontSize, + 16, + ); + expect((tester.firstWidget(switches) as Switch).value, true); + await tester.ensureVisible(switches.first); + await tester.tap(switches.first); + await tester.pumpAndSettle(); + expect((tester.firstWidget(switches) as Switch).value, false); + }); + testWidgets("Testing Keep Registerable section", (tester) async { + await tester.pumpWidget( + editEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appLocalization = AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + ); + final keepRegisterableText = find.descendant( + of: find.byType(Row), + matching: find.text( + appLocalization!.strictTranslate('Keep Registerable'), + ), + ); + final switches = find.descendant( + of: find.byType(Row), + matching: find.byType(Switch), + skipOffstage: false, + ); + expect(keepRegisterableText, findsOneWidget); + expect(switches, findsNWidgets(2)); + expect( + (tester.widget(keepRegisterableText) as Text?)?.style!.fontSize, + 16, + ); + expect((tester.widgetList(switches).toList()[1] as Switch).value, true); + await tester.ensureVisible(switches.at(1)); + await tester.tap(switches.at(1)); + await tester.pumpAndSettle(); + expect( + (tester.widgetList(switches).toList()[1] as Switch).value, + false, + ); + }); + testWidgets("Testing if cancel button in app bar works", (tester) async { + await tester.pumpWidget( + editEventScreen( + theme: TalawaTheme.lightTheme, + ), + ); + await tester.pumpAndSettle(); + final appBar = find.byType(AppBar); + final closeBtn = find.descendant( + of: appBar, + matching: find.byType(GestureDetector), + ); + await tester.tap(closeBtn.first); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + final createEventScreenPage = find.byKey(const Key('EditEventScreen')); + expect(createEventScreenPage, findsNothing); + }); + }); + }); +} diff --git a/test/widget_tests/after_auth_screens/events/edit_events_form_test.dart b/test/widget_tests/after_auth_screens/events/edit_events_form_test.dart new file mode 100644 index 000000000..ea563160f --- /dev/null +++ b/test/widget_tests/after_auth_screens/events/edit_events_form_test.dart @@ -0,0 +1,60 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/edit_event_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/edit_events_form.dart'; + +import '../../../helpers/test_helpers.dart'; + +Widget createEditEventForm(EditEventViewModel model) => + MaterialApp(home: Scaffold(body: EditEventForm(model: model))); + +void main() { + SizeConfig().test(); + setUp(() { + registerServices(); + registerViewModels(); + }); + tearDown(() { + unregisterViewModels(); + }); + group('Test EditEventForm', () { + testWidgets('Test titleFocus', (tester) async { + final model = EditEventViewModel(); + + await tester.pumpWidget(createEditEventForm(model)); + + await tester.tap(find.byIcon(Icons.edit).first); + + expect(model.titleFocus.hasFocus, true); + }); + testWidgets('Test locationFocus', (tester) async { + final model = EditEventViewModel(); + + await tester.pumpWidget(createEditEventForm(model)); + + await tester.tap(find.byIcon(Icons.edit).at(1)); + + expect(model.locationFocus.hasFocus, true); + }); + testWidgets('Test descriptionFocus', (tester) async { + final model = EditEventViewModel(); + + await tester.pumpWidget(createEditEventForm(model)); + + await tester.tap(find.byIcon(Icons.edit).last); + + expect(model.descriptionFocus.hasFocus, true); + }); + testWidgets('Test descriptionFocus', (tester) async { + final model = EditEventViewModel(); + + await tester.pumpWidget(createEditEventForm(model)); + + expect(model.formKey.currentState!.validate(), false); + }); + }); +} diff --git a/test/widget_tests/after_auth_screens/events/event_calendar_test.dart b/test/widget_tests/after_auth_screens/events/event_calendar_test.dart new file mode 100644 index 000000000..77e87533d --- /dev/null +++ b/test/widget_tests/after_auth_screens/events/event_calendar_test.dart @@ -0,0 +1,185 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:intl/intl.dart'; +import 'package:syncfusion_flutter_datepicker/datepicker.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/view_model/after_auth_view_models/event_view_models/event_calendar_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/event_calendar.dart'; + +import '../../../helpers/test_helpers.dart'; + +Widget createEventCalendar() { + return MaterialApp( + navigatorKey: navigationService.navigatorKey, + home: EventCalendar([ + Event( + title: 'Test', + startDate: '07/14/2022', + startTime: '14:23:01', + endDate: '07/14/2022', + endTime: '21:23:01', + ), + ]), + ); +} + +Widget createEventCalender2() { + return MaterialApp( + navigatorKey: navigationService.navigatorKey, + home: EventCalendar([ + Event( + title: 'Test2', + startDate: '2022-07-14', + startTime: '14:23:01', + endDate: '2022-07-14', + endTime: '21:23:01', + ), + ]), + ); +} + +void main() { + setUp(() { + registerServices(); + }); + group("Test for _parseTime function", () { + test("Test parsing valid time string", () { + const timeString = "5:30 PM"; + final parsedTime = parseTime(timeString); + final expectedTime = DateFormat("h:mm a").parse(timeString); + expect(parsedTime, expectedTime); + }); + test("Test for invalid time string", () { + const timeString = "invalid String "; + + expect(() => parseTime(timeString), throwsException); + }); + test("Test parsing string in hms format", () { + const timeString = "12:12:12"; + + final parsedTime = parseTime(timeString); + final expectTime = DateFormat('Hms').parse(timeString); + + expect(expectTime, parsedTime); + }); + + group('Tests for EventCalendar', () { + setUp(() => locator.registerSingleton(EventCalendarViewModel())); + tearDown(() => locator.unregister()); + testWidgets('Testing if EventCalendar shows up', (tester) async { + await tester.pumpWidget(createEventCalendar()); + await tester.pump(); + + expect(find.byType(EventCalendar), findsOneWidget); + }); + testWidgets('Testing if tapping on date_range shows datePicker', + (tester) async { + await tester.pumpWidget(createEventCalendar()); + await tester.pump(); + + await tester.tap(find.byIcon(Icons.date_range)); + await tester.pumpAndSettle(); + + expect(find.byType(CalendarDatePicker), findsOneWidget); + + await tester.tap(find.text('16')); + await tester.tap(find.text('OK')); + await tester.pump(); + }); + + testWidgets('calendarViewSelection', (tester) async { + await tester.pumpWidget( + createEventCalendar(), + ); + + await tester.pump(); + + final popupButtonFinder = find.byType(PopupMenuButton); + + await tester.tap(popupButtonFinder); + await tester.pumpAndSettle(); + + await tester.tap(find.text("Day")); + await tester.pumpAndSettle(); + + await tester.tap(popupButtonFinder); + await tester.pumpAndSettle(); + + await tester.tap(find.text("Month")); + await tester.pumpAndSettle(); + + await tester.tap(popupButtonFinder); + await tester.pumpAndSettle(); + + await tester.tap(find.text("Schedule")); + await tester.pumpAndSettle(); + + await tester.tap(popupButtonFinder); + await tester.pumpAndSettle(); + + expect(find.text("Day"), findsOne); + expect(find.text("Month"), findsOne); + expect(find.text("Schedule"), findsOne); + }); + testWidgets('Testing if Event model parses dates correctly', + (tester) async { + await tester.pumpWidget(createEventCalendar()); + await tester.pump(); + + final eventCalendar = + tester.widget(find.byType(EventCalendar)); + final event = eventCalendar.eventList[0]; + + DateTime startDate; + DateTime endDate; + if (event.startDate!.contains('/')) { + startDate = DateFormat('MM/dd/yyyy').parse(event.startDate!); + } else { + startDate = DateFormat('yyyy-MM-dd').parse(event.startDate!); + } + if (event.endDate!.contains('/')) { + endDate = DateFormat('MM/dd/yyyy').parse(event.endDate!); + } else { + endDate = DateFormat('yyyy-MM-dd').parse(event.endDate!); + } + + expect(startDate, DateFormat('MM/dd/yyyy').parse('07/14/2022')); + expect(endDate, DateFormat('MM/dd/yyyy').parse('07/14/2022')); + }); + testWidgets("Testing if EventCalendar shows up", (tester) async { + await tester.pumpWidget(createEventCalender2()); + await tester.pump(); + + expect(find.byType(EventCalendar), findsOneWidget); + final eventCalendar = + tester.widget(find.byType(EventCalendar)); + final event = eventCalendar.eventList[0]; + + DateTime startDate; + DateTime endDate; + if (event.startDate!.contains('/')) { + startDate = DateFormat('MM/dd/yyyy').parse(event.startDate!); + } else { + startDate = DateFormat('yyyy-MM-dd').parse(event.startDate!); + } + if (event.endDate!.contains('/')) { + endDate = DateFormat('MM/dd/yyyy').parse(event.endDate!); + } else { + endDate = DateFormat('yyyy-MM-dd').parse(event.endDate!); + } + + expect(startDate, DateFormat('yyyy-MM-dd').parse('2022-07-14')); + expect(endDate, DateFormat('yyyy-MM-dd').parse('2022-07-14')); + }); + }); + test("dateRangePickerController getter", () async { + final EventCalendarViewModel model = EventCalendarViewModel(); + expect(model.dateRangePickerController, isA()); + expect(model.eventList, isA>()); + }); + }); +} diff --git a/test/widget_tests/after_auth_screens/events/event_info_page_test.dart b/test/widget_tests/after_auth_screens/events/event_info_page_test.dart new file mode 100644 index 000000000..752b2506c --- /dev/null +++ b/test/widget_tests/after_auth_screens/events/event_info_page_test.dart @@ -0,0 +1,117 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +// ignore_for_file: avoid_positional_boolean_parameters + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail_image_network/mocktail_image_network.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/user/user_info.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/after_auth_view_models/event_view_models/explore_events_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/event_info_page.dart'; + +import '../../../helpers/test_helpers.dart'; + +Event getEvent(bool isPublic, bool isCreator) { + return Event( + id: '1', + title: 'test', + startTime: '10000', + endTime: '20000', + location: 'ABC', + description: 'test', + creator: User( + id: isCreator ? "xzy1" : "abc1", + firstName: "Test", + lastName: "User", + email: "testuser@gmail.com", + refreshToken: "testtoken", + authToken: 'testtoken', + ), + startDate: '10000', + endDate: '20000', + latitude: 23.45, + longitude: -23.45, + admins: [ + User( + id: isCreator ? "xzy1" : "abc1", + firstName: "Test", + lastName: "User", + ), + ], + isPublic: isPublic, + organization: OrgInfo(id: 'XYZ'), + ); +} + +Widget createEventInfoPage(bool isPublic, bool isCreator) { + return MaterialApp( + localizationsDelegates: [ + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + const AppLocalizationsDelegate(isTest: true), + ], + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + home: EventInfoPage( + args: { + 'event': getEvent(isPublic, isCreator), + 'exploreEventViewModel': ExploreEventsViewModel(), + }, + ), + ); +} + +void main() { + setUp(() { + SizeConfig().test(); + registerServices(); + registerViewModels(); + }); + tearDown(() { + unregisterViewModels(); + }); + group('Test EventInfoPage', () { + // testWidgets('Test Share button', (tester) async { + // mockNetworkImages(() async { + // await tester.pumpWidget(createEventInfoPage(true, true)); + // await tester.pumpAndSettle(); + + // final shareButton = find.byIcon(Icons.share); + // expect(shareButton, findsOneWidget); + + // await tester.tap(shareButton); + // await tester.pumpAndSettle(); + // }); + // }); + + testWidgets('Test FloatingActionButton', (tester) async { + mockNetworkImages(() async { + await tester.pumpWidget(createEventInfoPage(true, true)); + await tester.pumpAndSettle(); + + expect(find.byType(FloatingActionButton), findsOneWidget); + + await tester.tap(find.byType(FloatingActionButton)); + }); + }); + + testWidgets('Test Delete FloatingActionButton', (tester) async { + mockNetworkImages(() async { + await tester.pumpWidget(createEventInfoPage(true, false)); + await tester.pumpAndSettle(); + + expect(find.byType(FloatingActionButton), findsOneWidget); + + await tester.tap(find.byType(FloatingActionButton)); + }); + }); + }); +} diff --git a/test/widget_tests/after_auth_screens/events/explore_event_dialogue_test.dart b/test/widget_tests/after_auth_screens/events/explore_event_dialogue_test.dart new file mode 100644 index 000000000..c286ff262 --- /dev/null +++ b/test/widget_tests/after_auth_screens/events/explore_event_dialogue_test.dart @@ -0,0 +1,277 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.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/views/after_auth_screens/events/explore_event_dialogue.dart'; +import 'package:talawa/widgets/date_time_picker.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +Widget createExploreEventDialog() { + return MaterialApp( + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + home: Builder( + builder: (context) { + return Container( + child: TextButton( + key: const Key('TextButtonKey'), + onPressed: () { + showDialog( + context: context, + builder: (_) => const ExploreEventDialog( + key: Key('ExploreEventDialog'), + ), + ); + }, + child: const Text('EventDialog'), + ), + ); + }, + ), + ); +} + +void main() { + DateTime startDate = DateTime.now().toLocal(); + // DateTime _endDate = DateTime.now().add(const Duration(days: 1)).toLocal(); + setUp(() { + registerServices(); + locator().test(); + }); + + tearDown(() { + unregisterServices(); + }); + + Future prepareDatePicker( + WidgetTester tester, + Future Function(Future date) callback, + ) async { + await tester.pumpWidget(createExploreEventDialog()); + await tester.pumpAndSettle(); + + await tester.tap(find.byKey(const Key('TextButtonKey'))); + final date = customDatePicker(initialDate: startDate); + await tester.pumpAndSettle(); + + final okButton = find.text('OK'); + + await tester.tap(okButton); + await tester.pumpAndSettle(); + + expect(find.text(startDate.toString().split(' ')[0]), findsOneWidget); + await tester.ensureVisible(find.byKey(const Key('StartDateSelector'))); + await tester.tap(find.byKey(const Key('StartDateSelector'))); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + callback(date); + } + + group('Tests for DatePicker', () { + testWidgets('Testing the OK button', (tester) async { + await prepareDatePicker(tester, (date) async { + expect(find.text('OK'), findsOneWidget); + await tester.tap(find.text('OK')); + await tester.pumpAndSettle(); + + expect( + (await date).toString().split(' ')[0], + DateTime.now().toLocal().toString().split(' ')[0], + ); + + expect( + find.textContaining( + (await date).toLocal().toString().split(' ')[0], + ), + findsOneWidget, + ); + }); + }); + testWidgets('Testing the Cancel button', (tester) async { + await prepareDatePicker(tester, (date) async { + final cancelBtnFinder = find.text('Cancel').last; + expect(cancelBtnFinder, findsOneWidget); + await tester.tap(cancelBtnFinder); + await tester.pumpAndSettle(); + expect( + find.textContaining( + (await date).toLocal().toString().split(' ')[0], + ), + findsOneWidget, + ); + }); + }); + + testWidgets('Changing Date test', (tester) async { + await prepareDatePicker(tester, (val) async { + expect(find.text('OK'), findsOneWidget); + await tester.tap(find.text('OK')); + await tester.pumpAndSettle(); + + final date = customDatePicker(initialDate: startDate); + await tester.pumpAndSettle(); + + await tester.tap(find.text('10')); + await tester.pumpAndSettle(const Duration(seconds: 1)); + await tester.tap(find.text('OK')); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + expect( + (await date).toString().split(' ')[0], + DateTime(DateTime.now().year, DateTime.now().month, 10) + .toString() + .split(' ')[0], + ); + startDate = await date; + await tester.pumpAndSettle(); + expect(find.byKey(const Key('TextButtonKey')), findsOneWidget); + + expect( + startDate, + DateTime(DateTime.now().year, DateTime.now().month, 10), + ); + }); + }); + }); + + group('Tests for Explore Event Dialogue', () { + locator.registerSingleton(SizeConfig()); + + testWidgets('Tap on StartDateSelector', (tester) async { + await tester.pumpWidget(createExploreEventDialog()); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key('TextButtonKey'))); + await tester.pump(); + + await tester.tap(find.byKey(const Key('StartDateSelector'))); + await tester.pump(); + + expect(find.byType(DatePickerDialog), findsOneWidget); + + await tester.tap(find.text('16')); + await tester.tap(find.text('OK')); + await tester.pumpAndSettle(); + }); + testWidgets('Tap on EndDateSelector', (tester) async { + await tester.pumpWidget(createExploreEventDialog()); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key('TextButtonKey'))); + await tester.pump(); + + await tester.tap(find.byKey(const Key('EndDateSelector'))); + await tester.pump(); + + expect(find.byType(DatePickerDialog), findsOneWidget); + + await tester.tap(find.text('16')); + await tester.tap(find.text('OK')); + await tester.pump(); + }); + + testWidgets('Testing Explore Event dialog layout', (tester) async { + await tester.pumpWidget(createExploreEventDialog()); + await tester.pumpAndSettle(); + + expect(find.byType(TextButton), findsOneWidget); + await tester.tap(find.byKey(const Key('TextButtonKey'))); + await tester.pump(); + + expect(find.byType(ExploreEventDialog), findsOneWidget); + + final startDateText = find.text('Start Date'); + expect(startDateText, findsOneWidget); + + final endDateText = find.text('End Date'); + expect(endDateText, findsOneWidget); + + final cancelButtonText = find.text('Cancel'); + expect(cancelButtonText, findsOneWidget); + + final doneButtonText = find.text('Done'); + expect(doneButtonText, findsOneWidget); + }); + + testWidgets('Test for Cancel button', (tester) async { + await tester.pumpWidget(createExploreEventDialog()); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key('TextButtonKey'))); + await tester.pump(); + expect(find.byType(ExploreEventDialog), findsOneWidget); + + final cancelButton = find.byKey(const Key('CancelButton')); + expect(cancelButton, findsOneWidget); + await tester.tap(cancelButton); + await tester.pumpAndSettle(); + }); + + testWidgets('Test for Done button', (tester) async { + await tester.pumpWidget(createExploreEventDialog()); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key('TextButtonKey'))); + await tester.pump(); + + expect(find.byType(ExploreEventDialog), findsOneWidget); + + final doneButton = find.byKey(const Key('DoneButton')); + expect(doneButton, findsOneWidget); + }); + + testWidgets('Test for selecting Start Date', (tester) async { + await tester.pumpWidget(createExploreEventDialog()); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key('TextButtonKey'))); + await tester.pump(); + + final startDateButton = find.byKey(const Key('StartDateSelector')); + expect(startDateButton, findsOneWidget); + }); + testWidgets('Test for selecting End Date', (tester) async { + await tester.pumpWidget(createExploreEventDialog()); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key('TextButtonKey'))); + await tester.pump(); + + final endDateButton = find.byKey(const Key('EndDateSelector')); + expect(endDateButton, findsOneWidget); + }); + + testWidgets('Testing the Cancel button', (tester) async { + await tester.pumpWidget(createExploreEventDialog()); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key('TextButtonKey'))); + await tester.pump(); + + // finding Cancel Button + final x = find.text('Cancel'); + expect(x, findsOneWidget); + + await tester.tap(x); + expect(find.byKey(const Key('TextButtonKey')), findsOneWidget); + }); + testWidgets('Testing the Done button', (tester) async { + await tester.pumpWidget(createExploreEventDialog()); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key('TextButtonKey'))); + await tester.pump(); + + // finding Done Button + final x = find.text('Done'); + expect(x, findsOneWidget); + + await tester.tap(x); + expect(find.byKey(const Key('TextButtonKey')), findsOneWidget); + }); + }); +} diff --git a/test/widget_tests/after_auth_screens/events/explore_events_test.dart b/test/widget_tests/after_auth_screens/events/explore_events_test.dart new file mode 100644 index 000000000..2d37da6ce --- /dev/null +++ b/test/widget_tests/after_auth_screens/events/explore_events_test.dart @@ -0,0 +1,205 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:mocktail_image_network/mocktail_image_network.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/router.dart' as router; +import 'package:talawa/services/event_service.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/after_auth_view_models/event_view_models/explore_events_view_model.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/event_calendar.dart'; +import 'package:talawa/views/after_auth_screens/events/explore_event_dialogue.dart'; +import 'package:talawa/views/after_auth_screens/events/explore_events.dart'; +import 'package:talawa/widgets/custom_drawer.dart'; +import 'package:talawa/widgets/event_card.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_helpers.mocks.dart'; +import '../../../helpers/test_locator.dart'; + +Widget createExploreEventsScreen(MainScreenViewModel model) => MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + home: Scaffold( + key: MainScreenViewModel.scaffoldKey, + drawer: CustomDrawer( + homeModel: model, + ), + body: const ExploreEvents( + key: Key('ExploreEvents'), + ), + ), + navigatorKey: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + ); + +void main() { + SizeConfig().test(); + setUp(() { + registerServices(); + registerViewModels(); + }); + tearDown(() { + unregisterViewModels(); + }); + group("Test Explore Events Screen Widget:", () { + testWidgets("Testing if drawer opens up", (tester) async { + await mockNetworkImages(() async { + final homeModel = locator(); + + await tester.pumpWidget(createExploreEventsScreen(homeModel)); + await tester.pump(); + // find by icon menu + expect(find.byIcon(Icons.menu), findsOneWidget); + // tap on icon menu + await tester.tap(find.byIcon(Icons.menu)); + await tester.pump(); + + // expect the drawer to be open + expect(find.byType(CustomDrawer), findsOneWidget); + }); + }); + testWidgets("Testing if showSearch works", (tester) async { + await mockNetworkImages(() async { + final homeModel = locator(); + + await tester.pumpWidget(createExploreEventsScreen(homeModel)); + await tester.pumpAndSettle(); + + expect(find.byIcon(Icons.search), findsOneWidget); + + await tester.tap(find.byIcon(Icons.search)); + await tester.pumpAndSettle(); + + expect(find.byIcon(Icons.clear), findsOneWidget); + expect(find.byIcon(Icons.arrow_back), findsOneWidget); + }); + }); + testWidgets("Testing if refresh works", (tester) async { + await mockNetworkImages(() async { + final homeModel = locator(); + + await tester.pumpWidget(createExploreEventsScreen(homeModel)); + await tester.pumpAndSettle(); + + await tester.drag( + find.byKey(const Key('ExploreEvents')), + const Offset(0, 500), + ); + await tester.pumpAndSettle(); + + verify(locator().refreshEvents()).called(2); + }); + }); + testWidgets("Testing if tapping on add icon and EventCard works", + (tester) async { + await mockNetworkImages(() async { + final homeModel = locator(); + + await tester.pumpWidget(createExploreEventsScreen(homeModel)); + await tester.pumpAndSettle(); + + await tester.tap(find.byIcon(Icons.add)); + await tester.pumpAndSettle(); + + verify(locator().pushScreen("/createEventPage")) + .called(1); + + await tester.tap(find.byType(EventCard)); + await tester.pumpAndSettle(); + + verify( + locator() + .pushScreen("/eventInfo", arguments: anyNamed('arguments')), + ).called(1); + }); + }); + testWidgets("Testing if drop down button works", (tester) async { + await mockNetworkImages(() async { + locator.unregister(); + + final model = ExploreEventsViewModel(); + locator.registerSingleton(model); + + final homeModel = locator(); + + await tester.pumpWidget(createExploreEventsScreen(homeModel)); + await tester.pumpAndSettle(); + + await tester.tap(find.bySemanticsLabel('Filters')); + await tester.pumpAndSettle(); + await tester.pump(); + await tester.tap(find.byKey(const Key('Public Events'))); + await tester.pumpAndSettle(); + expect(model.chosenValue, 'Public Events'); + }); + }); + testWidgets("Testing if tapping on calendar works", (tester) async { + await mockNetworkImages(() async { + final homeModel = locator(); + + await tester.pumpWidget(createExploreEventsScreen(homeModel)); + await tester.pumpAndSettle(); + + await tester.tap(find.text('Filter by Date')); + await tester.pump(); + + expect(find.byType(ExploreEventDialog), findsOneWidget); + }); + }); + testWidgets("Testing if tapping on calendar works", (tester) async { + await mockNetworkImages(() async { + locator.unregister(); + + final StreamController streamController = StreamController(); + final Stream stream = + streamController.stream.asBroadcastStream(); + + final service = MockEventService(); + when(service.eventStream).thenAnswer((invocation) => stream); + locator.registerSingleton(service); + + final homeModel = locator(); + + await tester.pumpWidget(createExploreEventsScreen(homeModel)); + await tester.pumpAndSettle(); + + expect( + find.text("Looks like there aren't any events."), + findsOneWidget, + ); + }); + }); + testWidgets("Testing if tapping on Calendar button works", (tester) async { + await mockNetworkImages(() async { + final homeModel = locator(); + + await tester.pumpWidget(createExploreEventsScreen(homeModel)); + await tester.pumpAndSettle(); + + expect(find.byType(EventCalendar), findsNothing); + + await tester.tap( + find.byIcon( + Icons.calendar_month, + ), + ); + await tester.pumpAndSettle(); + }); + }); + }); +} diff --git a/test/widget_tests/after_auth_screens/feed/individual_post_test.dart b/test/widget_tests/after_auth_screens/feed/individual_post_test.dart new file mode 100644 index 000000000..a70efc78e --- /dev/null +++ b/test/widget_tests/after_auth_screens/feed/individual_post_test.dart @@ -0,0 +1,427 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/models/comment/comment_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/navigation_service.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/views/after_auth_screens/feed/individual_post.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +final LikedBy user = LikedBy(sId: "test_id"); + +final u1 = User( + id: '123', + firstName: 'John', + lastName: 'Doe', + email: 'test@test.com', +); +final u2 = User( + id: '123', + firstName: 'Ayush', + lastName: 'Chaudhary', + email: 'test@test.com', +); +final List users = [u1, u2]; + +final LikedBy l1 = LikedBy(sId: 'test1'); +final LikedBy l2 = LikedBy(sId: 'test2'); +final List likeby = [l1, l2]; + +final comment1 = Comments(sId: 'comment1'); +final comment2 = Comments(sId: 'comment2'); +final comment3 = Comments(sId: 'comment3'); +final List comments1 = [comment1, comment2, comment3]; + +final myBirthday = DateTime.utc(2004, DateTime.june, 16, 5, 30, 0, 0, 0); +final post = Post( + creator: User( + id: '123', + firstName: 'John', + lastName: 'Doe', + email: 'test@test.com', + ), + sId: "sid", + createdAt: myBirthday, + description: 'test description', + imageUrl: 'https://image.com', + videoUrl: 'https://image.com', + organization: OrgInfo(admins: users), + likedBy: likeby, + comments: comments1, +); + +Widget createLikedUserCircleAvatarWidget({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, +}) { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: likedUserCircleAvatar(user), + ), + ); +} + +final comment = Comment( + creator: User( + id: '123', + firstName: 'Ayush', + lastName: 'Chaudhary', + email: 'test@test.com', + ), + createdAt: '123456', + text: 'test text', + post: 'test post', + likeCount: 'test count', +); + +List comments = [ + Comments(sId: 'comment1'), + Comments(sId: 'comment2'), + Comments(sId: 'comment3'), + Comments(sId: 'comment4'), + Comments(sId: 'comment5'), + Comments(sId: 'comment6'), +]; + +Widget createCommentTemplateWidget({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, +}) { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: CommentTemplate( + comment: comment, + ), + ), + ); +} + +Widget createIndividualPageLikeSectionWidget({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, +}) { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: IndividualPageLikeSection( + usersLiked: [ + LikedBy(sId: 'test1'), + LikedBy(sId: 'test2'), + LikedBy(sId: 'test3'), + LikedBy(sId: 'test4'), + ], + ), + ), + ); +} + +Widget createIndividualPostCommentSectionWidget({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, +}) { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: IndividualPostCommentSection( + comments: comments, + postID: 'test post id', + ), + ), + ); +} + +Widget createIndividualPostViewWidget({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, + required Post post1, +}) { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: IndividualPostView( + post: post1, + ), + ), + ); +} + +void main() { + SizeConfig().test(); + testSetupLocator(); + // locator.registerSingleton(LikeButtonViewModel()); + + setUp(() { + registerServices(); + }); + + group('Individualpostview tests', () { + // testWidgets("Check if the IndividualPostView shows up", + // (WidgetTester tester) async { + // await tester.runAsync(() async { + // ///making a sample data + // /// also wrote all the detail + // /// used in the individual post + // + // final commentJson1 = { + // 'creator': { + // '_id': '123', + // 'firstName': 'Ayush', + // 'lastName': 'Chaudhary', + // 'email': 'test@test.com', + // }, + // 'createdAt': '123456', + // 'text': 'test text', + // 'post': 'test post', + // 'likeCount': 'test count', + // }; + // final commentJson2 = { + // 'creator': { + // '_id': '123', + // 'firstName': 'John', + // 'lastName': 'Doe', + // 'email': 'test@test.com', + // }, + // 'createdAt': '123456', + // 'text': 'test text', + // 'post': 'test post', + // 'likeCount': 'test count', + // }; + // + // final commentsJson = [commentJson1, commentJson2]; + // + // ///returning a service response through mocking, + // ///this method was called in + // ///comment view model and was returning null + // ///until I made a mock response. + // + // when(commentsService.getCommentsForPost('PostID')) + // .thenAnswer((realInvocation) async { + // return commentsJson; + // }); + // + // /// using the mock post made before me + // + // final Post post = getPostMockModel(); + // + // ///returning mock reponse of post model when + // ///.likedby is called on the model + // + // when(post.likedBy).thenReturn([LikedBy(sId: "xzy1")]); + // + // await tester.pumpWidget(createIndividualPostViewWidget(post1: post)); + // await tester.pump(); + // + // /// checking if the individual post + // /// screen pops up + // + // expect(find.byType(Scaffold), findsNWidgets(2)); + // + // ///finding the text field via its ID + // + // final textfield = find.byKey(const Key('indi_post_tf_key')); + // + // /// check if the textfield shows up + // + // expect(textfield, findsOneWidget); + // + // ///finding the text field via its type + // + // final textbtn = find.byType(TextButton); + // + // ///check if btn exist + // + // expect(textbtn, findsOneWidget); + // + // ///checking if the onPressed of + // ///text button is working when tapped + // + // await tester.tap(textbtn); + // await tester.pump(); + // + // ///tapping the text field + // ///to check if it shows up + // + // await tester.tap(textfield); + // await tester.pump(); + // + // /// Checking if the submit button is working, + // /// when keyboard send action is called + // + // await tester.showKeyboard(textfield); + // + // /// keyboard action can be + // /// simulated using the + // /// testTextInput method + // + // await tester.testTextInput.receiveAction(TextInputAction.send); + // await tester.pump(); + // }); + // }); + }); + + group('Test for likedUserCircleAvatar', () { + testWidgets('Check if the likedUserCircleAvatar shows up', (tester) async { + await tester.pumpWidget(createLikedUserCircleAvatarWidget()); + await tester.pump(); + + final findStack = find.byType(Stack); + + expect(findStack, findsNWidgets(2)); + }); + }); + + group('Test for IndividualPageLikeSection', () { + testWidgets('Check if the IndividualPageLikeSection shows up', + (tester) async { + await tester.pumpWidget(createIndividualPageLikeSectionWidget()); + await tester.pump(); + + final findColumn = find.byType(Column); + + expect(findColumn, findsNWidgets(1)); + }); + + testWidgets( + 'Check if the likedUserCircleAvatar in IndividualPageLikeSection shows up', + (tester) async { + await tester.pumpWidget(createIndividualPageLikeSectionWidget()); + await tester.pump(); + + final findStack = find.byType(Stack); + + expect(findStack, findsNWidgets(5)); + }); + }); + + group('Test for CommentTemplate', () { + testWidgets('Check if the CommentTemplate shows up', (tester) async { + await tester.pumpWidget(createCommentTemplateWidget()); + await tester.pump(); + + final findStack = find.byType(Row); + + expect(findStack, findsNWidgets(1)); + }); + + testWidgets('Check if the name is displayed in CommentTemplate ', + (tester) async { + await tester.pumpWidget(createCommentTemplateWidget()); + await tester.pump(); + + final findStack = find.text('Ayush Chaudhary'); + + expect(findStack, findsNWidgets(1)); + }); + + testWidgets('Check if the comment text is displayed in CommentTemplate ', + (tester) async { + await tester.pumpWidget(createCommentTemplateWidget()); + await tester.pump(); + + final findStack = find.text('test text'); + + expect(findStack, findsNWidgets(1)); + }); + }); +} diff --git a/test/widget_tests/after_auth_screens/feed/organization_feed_test.dart b/test/widget_tests/after_auth_screens/feed/organization_feed_test.dart new file mode 100644 index 000000000..795cc445a --- /dev/null +++ b/test/widget_tests/after_auth_screens/feed/organization_feed_test.dart @@ -0,0 +1,288 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/router.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/after_auth_view_models/feed_view_models/organization_feed_view_model.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/after_auth_screens/feed/organization_feed.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/post_list_widget.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_helpers.mocks.dart'; +import '../../../helpers/test_locator.dart'; + +Widget createOrganizationFeedScreen({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, + required MainScreenViewModel homeModel, +}) { + return MaterialApp( + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + key: MainScreenViewModel.scaffoldKey, + body: OrganizationFeed( + homeModel: homeModel, + key: const Key('test_key'), + ), + ), + ); +} + +// late OrganizationFeedViewModel _organizationFeedViewModel; + +Widget createOrganizationFeedScreen2({ + bool viewOnMap = true, + required MainScreenViewModel homeModel, +}) { + return BaseView( + onModelReady: (model) => model.initialize(), + // builder: (context, langModel, child) { + // return BaseView( + // onModelReady: (model) { + // model.initialise(); + // _organizationFeedViewModel = model; + // }, + builder: (context, model, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + key: MainScreenViewModel.scaffoldKey, + body: OrganizationFeed( + homeModel: homeModel, + key: const Key('test_key'), + forTest: true, + ), + ), + navigatorKey: locator().navigatorKey, + onGenerateRoute: generateRoute, + ); + }, + // ); + // }, + ); +} + +final post = Post( + sId: "test_post_id", + creator: userConfig.currentUser, + likedBy: [], + description: 'Testing', + comments: [Comments(sId: 'cmmnt1')], + createdAt: DateTime.now(), + organization: userConfig.currentOrg, +); + +void main() { + SizeConfig().test(); + testSetupLocator(); + late MockOrganizationFeedViewModel mockViewModel; + + setUp(() { + registerServices(); + mockViewModel = MockOrganizationFeedViewModel(); + locator.unregister(); + locator.registerSingleton(mockViewModel); + }); + tearDown(() { + unregisterServices(); + }); + + TestWidgetsFlutterBinding.ensureInitialized(); + group('tests for Organizaiton feed Screen', () { + testWidgets('check if orgname is displayed shows up', (tester) async { + when(mockViewModel.currentOrgName).thenReturn('testOrg'); + when(mockViewModel.isFetchingPosts).thenReturn(true); + when(mockViewModel.initialise()).thenReturn(null); + when(mockViewModel.userPosts).thenReturn([]); + final model = locator(); + await tester.pumpWidget(createOrganizationFeedScreen(homeModel: model)); + await tester.pump(); + + final finder = find.text('testOrg'); + expect(finder, findsOneWidget); + }); + testWidgets('check if side drawer shows up', (tester) async { + when(mockViewModel.currentOrgName).thenReturn('testOrg'); + when(mockViewModel.isFetchingPosts).thenReturn(true); + when(mockViewModel.initialise()).thenReturn(null); + when(mockViewModel.userPosts).thenReturn([]); + final model = locator(); + await tester.pumpWidget(createOrganizationFeedScreen(homeModel: model)); + await tester.pump(); + + final finder = find.byIcon(Icons.menu); + + await tester.tap(finder); + await tester.pump(); + }); + testWidgets('check if Circular Indicator shows up when fetching posts', + (tester) async { + when(mockViewModel.currentOrgName).thenReturn('testOrg'); + when(mockViewModel.isFetchingPosts).thenReturn(true); + when(mockViewModel.initialise()).thenReturn(null); + when(mockViewModel.userPosts).thenReturn([]); + final model = locator(); + await tester.pumpWidget(createOrganizationFeedScreen(homeModel: model)); + await tester.pump(); + + final finder = find.byType(CircularProgressIndicator); + expect(finder, findsOneWidget); + }); + testWidgets("check if the refresh indicator works fine", (tester) async { + when(mockViewModel.currentOrgName).thenReturn('testOrg'); + when(mockViewModel.isFetchingPosts).thenReturn(false); + when(mockViewModel.isBusy).thenReturn(false); + when(mockViewModel.initialise()).thenReturn(null); + when(mockViewModel.posts) + .thenReturn([post, post, post, post, post, post]); + when(mockViewModel.pinnedPosts).thenReturn([post]); + final model = locator(); + + await tester.pumpWidget(createOrganizationFeedScreen(homeModel: model)); + await tester.pump(); + + bool refreshed = false; + when(mockViewModel.fetchNewPosts()).thenAnswer((_) async { + refreshed = true; + }); + await tester.drag( + find.byType(RefreshIndicator), + const Offset(0, 400), + ); + await tester.pumpAndSettle(); + + expect(refreshed, true); + }); + testWidgets('check if pinned posts shows up if not empty', (tester) async { + when(mockViewModel.currentOrgName).thenReturn('testOrg'); + when(mockViewModel.isFetchingPosts).thenReturn(false); + when(mockViewModel.isBusy).thenReturn(false); + when(mockViewModel.initialise()).thenReturn(null); + when(mockViewModel.posts).thenReturn([post]); + when(mockViewModel.pinnedPosts).thenReturn([post]); + + final model = locator(); + await tester.pumpWidget(createOrganizationFeedScreen2(homeModel: model)); + await tester.pumpAndSettle(); + + final finder = find.byKey(const Key('pinnedPosts')); + expect(finder, findsOneWidget); + }); + testWidgets('check if posts shows up if not empty', (tester) async { + when(mockViewModel.currentOrgName).thenReturn('testOrg'); + when(mockViewModel.isFetchingPosts).thenReturn(false); + when(mockViewModel.isBusy).thenReturn(false); + when(mockViewModel.initialise()).thenReturn(null); + when(mockViewModel.posts).thenReturn([post]); + when(mockViewModel.pinnedPosts).thenReturn([post]); + + final model = locator(); + await tester.pumpWidget(createOrganizationFeedScreen2(homeModel: model)); + await tester.pumpAndSettle(); + + final finder = find.byType(PostListWidget); + expect(finder, findsOneWidget); + }); + testWidgets('check if no posts shows up then No posts text is there', + (tester) async { + when(mockViewModel.currentOrgName).thenReturn('testOrg'); + when(mockViewModel.isFetchingPosts).thenReturn(false); + when(mockViewModel.isBusy).thenReturn(false); + when(mockViewModel.initialise()).thenReturn(null); + when(mockViewModel.posts).thenReturn([]); + when(mockViewModel.pinnedPosts).thenReturn([post]); + + final model = locator(); + await tester.pumpWidget(createOrganizationFeedScreen2(homeModel: model)); + await tester.pumpAndSettle(); + + final finder = find.text('There are no posts in this organization'); + expect(finder, findsOneWidget); + }); + testWidgets( + 'check if no posts shows up then create post textButton is present', + (tester) async { + when(mockViewModel.currentOrgName).thenReturn('testOrg'); + when(mockViewModel.isFetchingPosts).thenReturn(false); + when(mockViewModel.isBusy).thenReturn(false); + when(mockViewModel.initialise()).thenReturn(null); + when(mockViewModel.posts).thenReturn([]); + when(mockViewModel.pinnedPosts).thenReturn([post]); + + final model = locator(); + await tester.pumpWidget(createOrganizationFeedScreen2(homeModel: model)); + await tester.pumpAndSettle(); + + final finder = find.text('Create your first post'); + expect(finder, findsOneWidget); + await tester.tap(finder); + await tester.pumpAndSettle(); + }); + testWidgets( + 'check if nextPage function is called when scrolled to the bottom edge', + (tester) async { + when(mockViewModel.currentOrgName).thenReturn('testOrg'); + when(mockViewModel.isFetchingPosts).thenReturn(false); + when(mockViewModel.isBusy).thenReturn(false); + when(mockViewModel.initialise()).thenReturn(null); + when(mockViewModel.posts) + .thenReturn([post, post, post, post, post, post]); + when(mockViewModel.pinnedPosts).thenReturn([post]); + bool nextPageCalled = false; + when(mockViewModel.nextPage()).thenAnswer((_) async { + nextPageCalled = true; + }); + + final model = locator(); + await tester.pumpWidget(createOrganizationFeedScreen(homeModel: model)); + await tester.pumpAndSettle(); + + await tester.drag( + find.byKey(const Key('listView')), + const Offset(0, 10), + ); + + await tester.drag( + find.byKey(const Key('listView')), + const Offset(10, 20), + ); + print(nextPageCalled); + // Verify that nextPage function is called + expect(nextPageCalled, true); + verify(mockViewModel.nextPage()).called(1); + verify(mockViewModel.previousPage()).called(1); + }); + }); +} diff --git a/test/widget_tests/after_auth_screens/feed/pinned_post_page_test.dart b/test/widget_tests/after_auth_screens/feed/pinned_post_page_test.dart new file mode 100644 index 000000000..4d0b3957a --- /dev/null +++ b/test/widget_tests/after_auth_screens/feed/pinned_post_page_test.dart @@ -0,0 +1,62 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/router.dart' as router; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/views/after_auth_screens/feed/pinned_post_page.dart'; +import 'package:talawa/widgets/post_list_widget.dart'; +import 'package:talawa/widgets/post_widget.dart'; +import 'package:visibility_detector/visibility_detector.dart'; + +import '../../../helpers/test_helpers.dart'; + +Widget createPinnedPostPage() { + return MaterialApp( + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + home: PinnedPostPage( + pinnedPosts: [ + Post( + sId: 'post1', + creator: User(firstName: 'firstName1'), + createdAt: DateTime.now(), + description: 'description1', + comments: [], + ), + ], + ), + ); +} + +void main() { + setUp(() { + registerServices(); + registerViewModels(); + }); + + group('Tests for pinned post page', () { + testWidgets('Check whether PinnedPostPage shows up', (tester) async { + VisibilityDetectorController.instance.updateInterval = Duration.zero; + + await tester.pumpWidget(createPinnedPostPage()); + await tester.pump(); + + expect(find.byType(PinnedPostPage), findsOneWidget); + expect(find.byType(PostListWidget), findsOneWidget); + expect(find.byType(NewsPost), findsOneWidget); + expect(find.textContaining('firstName1'), findsOneWidget); + }); + }); +} diff --git a/test/widget_tests/after_auth_screens/feed/pinned_post_screen_test.dart b/test/widget_tests/after_auth_screens/feed/pinned_post_screen_test.dart new file mode 100644 index 000000000..cb4734321 --- /dev/null +++ b/test/widget_tests/after_auth_screens/feed/pinned_post_screen_test.dart @@ -0,0 +1,71 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.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/navigation_service.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/views/pre_auth_screens/signup_details.dart'; + +import '../../../helpers/test_locator.dart'; + +Widget createApp() { + final Map postDetails = { + 'title': 'Debate over stocks bybacks.', + 'postId': 'agdjvfhsjaf', + 'imageUrl': + 'https://m.wsj.net/video/20200105/wsjglossarystockbuybackssplash/wsjglossarystockbuybackssplash_640x360.jpg', + 'time': '9', + }; + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: TextButton( + onPressed: () async { + final OrgInfo org = OrgInfo( + id: '2', + name: 'test org', + userRegistrationRequired: false, + creatorInfo: User(firstName: 'test', lastName: 'test'), + ); + print(org); + await navigationService.pushScreen( + '/pinnedpostscreen', + arguments: postDetails, + ); + }, + child: const Text('Ayush'), + ), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); +} + +void main() { + SizeConfig().test(); + + testSetupLocator(); + + group('description', () { + testWidgets('Check if SignUp screen shows up', (tester) async { + await tester.pumpWidget(createApp()); + await tester.pump(); + + expect(find.byType(SignUpDetails), findsNothing); + + await tester.tap(find.textContaining('Ayush')); + await tester.pumpAndSettle(); + + // expect(find.byType(SignUpDetails), findsOneWidget); + }); + }); +} diff --git a/test/widget_tests/after_auth_screens/profile/edit_profile_page_test.dart b/test/widget_tests/after_auth_screens/profile/edit_profile_page_test.dart new file mode 100644 index 000000000..f14ce1800 --- /dev/null +++ b/test/widget_tests/after_auth_screens/profile/edit_profile_page_test.dart @@ -0,0 +1,478 @@ +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:mockito/mockito.dart'; +import 'package:mocktail_image_network/mocktail_image_network.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/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/after_auth_view_models/profile_view_models/edit_profile_view_model.dart'; +import 'package:talawa/view_model/lang_view_model.dart'; +import 'package:talawa/views/after_auth_screens/profile/edit_profile_page.dart'; +import 'package:talawa/views/base_view.dart'; + +import '../../../helpers/test_helpers.dart'; +import '../../../helpers/test_locator.dart'; + +/// MockBuildContext class helps to mock the BuildContext class. +class MockBuildContext extends Mock implements BuildContext {} + +/// MockEditProfilePageViewModel class helps to mock the EditProfilePageViewModel class. +class MockEditProfilePageViewModel extends Mock + implements EditProfilePageViewModel {} + +/// MockCallbackFunction class helps to mock the callback function. +class MockCallbackFunction extends Mock { + /// call function helps to mock the call function. + /// + /// **params**: + /// None + /// + /// **returns**: + /// None + void call(); +} + +/// 'createEditProfilePage' is used to create the EditProfilePage widget in light mode. +/// +/// **params**: +/// * `themeMode`: Represents the theme mode of the widget. +/// +/// **returns**: +/// * `Widget`: Returns the EditProfilePage widget. +Widget createEditProfilePage({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: themeMode == ThemeMode.light + ? TalawaTheme.lightTheme + : TalawaTheme.darkTheme, + home: const EditProfilePage(), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); +Future main() async { + TestWidgetsFlutterBinding.ensureInitialized(); + testSetupLocator(); + locator().test(); + locator().test(); + + final Directory dir = Directory('temporaryPath'); + Hive + ..init(dir.path) + ..registerAdapter(UserAdapter()) + ..registerAdapter(OrgInfoAdapter()); + await Hive.openBox('currentUser'); + await Hive.openBox('currentOrg'); + await Hive.openBox('url'); + group('Edit Profile Screen Widget Test in light mode', () { + testWidgets("Testing if Edit Profile Screen shows up", (tester) async { + userConfig.updateUser( + User(firstName: 'Test', lastName: 'Test', email: 'test@test.com'), + ); + await tester + .pumpWidget(createEditProfilePage(themeMode: ThemeMode.light)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('EditProfileScreenScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.lightTheme.scaffoldBackgroundColor, + ); + final appBarText = find.byKey( + const Key('ProfileText'), + ); + expect(appBarText, findsOneWidget); + }); + testWidgets("Testing if Edit Screen shows image when not exist in database", + (tester) async { + await mockNetworkImages(() async { + userConfig.updateUser(User()); + userConfig.updateUser( + User(firstName: 'Test', lastName: 'Test', email: 'test@test.com'), + ); + await tester + .pumpWidget(createEditProfilePage(themeMode: ThemeMode.light)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('EditProfileScreenScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.lightTheme.scaffoldBackgroundColor, + ); + final imageWidgetWithPicture = find.byKey( + const Key('profilepic'), + ); + expect(imageWidgetWithPicture, findsOneWidget); + }); + }); + testWidgets( + "Testing if Edit Screen shows image when already exist in database", + (tester) async { + await mockNetworkImages(() async { + userConfig.updateUser(User()); + userConfig.updateUser( + User( + firstName: 'Test', + lastName: 'Test', + email: 'test@test.com', + image: 'https://via.placeholder.com/150', + ), + ); + await tester + .pumpWidget(createEditProfilePage(themeMode: ThemeMode.light)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('EditProfileScreenScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.lightTheme.scaffoldBackgroundColor, + ); + final imageWidgetWithPicture = find.byKey( + const Key('profilepic'), + ); + expect(imageWidgetWithPicture, findsOneWidget); + }); + }); + testWidgets("Testing if image selection and removal works", (tester) async { + await mockNetworkImages(() async { + userConfig.updateUser(User()); + userConfig.updateUser( + User(firstName: 'Test', lastName: 'Test', email: 'test@test.com'), + ); + await tester + .pumpWidget(createEditProfilePage(themeMode: ThemeMode.light)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('EditProfileScreenScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.lightTheme.scaffoldBackgroundColor, + ); + final imageAvatar = find.byKey( + const Key('AddRemoveImageButton'), + ); + expect(imageAvatar, findsOneWidget); + tester.tap(imageAvatar); + }); + }); + }); + group('Edit Profile Screen Widget Test in dark mode', () { + testWidgets("Testing if Edit Profile Screen shows up", (tester) async { + userConfig.updateUser( + User(firstName: 'Test', lastName: 'Test', email: 'test@test.com'), + ); + await tester.pumpWidget(createEditProfilePage(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('EditProfileScreenScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + final appBarText = find.byKey( + const Key('ProfileText'), + ); + expect(appBarText, findsOneWidget); + }); + const Key('profilepic'); + testWidgets( + "Testing if Edit Screen shows image when already exist in database", + (tester) async { + await mockNetworkImages(() async { + userConfig.updateUser(User()); + + userConfig.updateUser( + User( + firstName: 'Test', + lastName: 'Test', + email: 'test@test.com', + image: 'https://via.placeholder.com/150', + ), + ); + await tester + .pumpWidget(createEditProfilePage(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('EditProfileScreenScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + final imageWidgetWithPicture = find.byKey( + const Key('profilepic'), + ); + expect(imageWidgetWithPicture, findsOneWidget); + }); + }); + testWidgets("Testing if modalSheet appears when changing profile picture", + (tester) async { + await mockNetworkImages(() async { + userConfig.updateUser(User()); + + userConfig.updateUser( + User( + firstName: 'Test', + lastName: 'Test', + email: 'test@test.com', + image: 'https://via.placeholder.com/150', + ), + ); + await tester + .pumpWidget(createEditProfilePage(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('EditProfileScreenScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + await tester.tap(find.byKey(const Key('AddRemoveImageButton'))); + await tester.pumpAndSettle(); + expect(find.text('Camera'), findsOneWidget); + expect(find.text('Gallery'), findsOneWidget); + expect(find.byIcon(Icons.camera_alt), findsOneWidget); + expect(find.byIcon(Icons.photo_library), findsOneWidget); + }); + }); + testWidgets("Testing if image selection from camera work fine", + (tester) async { + await mockNetworkImages(() async { + userConfig.updateUser(User()); + + userConfig.updateUser( + User( + firstName: 'Test', + lastName: 'Test', + email: 'test@test.com', + image: 'https://via.placeholder.com/150', + ), + ); + await tester + .pumpWidget(createEditProfilePage(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('EditProfileScreenScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + await tester.tap(find.byKey(const Key('AddRemoveImageButton'))); + await tester.pumpAndSettle(); + expect(find.text('Camera'), findsOneWidget); + expect(find.text('Gallery'), findsOneWidget); + expect(find.byIcon(Icons.camera_alt), findsOneWidget); + expect(find.byIcon(Icons.photo_library), findsOneWidget); + + await tester.ensureVisible(find.byIcon(Icons.camera_alt)); + await tester.tap(find.byIcon(Icons.camera_alt)); + }); + }); + testWidgets("Testing if image selection from gallery work fine", + (tester) async { + await mockNetworkImages(() async { + userConfig.updateUser(User()); + + userConfig.updateUser( + User( + firstName: 'Test', + lastName: 'Test', + email: 'test@test.com', + image: 'https://via.placeholder.com/150', + ), + ); + await tester + .pumpWidget(createEditProfilePage(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('EditProfileScreenScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + await tester.tap(find.byKey(const Key('AddRemoveImageButton'))); + await tester.pumpAndSettle(); + expect(find.text('Camera'), findsOneWidget); + expect(find.text('Gallery'), findsOneWidget); + expect(find.byIcon(Icons.camera_alt), findsOneWidget); + expect(find.byIcon(Icons.photo_library), findsOneWidget); + + await tester.ensureVisible(find.byIcon(Icons.photo_library)); + await tester.tap(find.byIcon(Icons.photo_library)); + }); + }); + testWidgets("Testing if image selection and removal works", (tester) async { + await mockNetworkImages(() async { + userConfig.updateUser(User()); + userConfig.updateUser( + User(firstName: 'Test', lastName: 'Test', email: 'test@test.com'), + ); + await tester + .pumpWidget(createEditProfilePage(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('EditProfileScreenScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + final imageAvatar = find.byKey( + const Key('AddRemoveImageButton'), + ); + expect(imageAvatar, findsOneWidget); + tester.tap(imageAvatar); + }); + }); + testWidgets("Testing Update butoon", (tester) async { + await mockNetworkImages(() async { + userConfig.updateUser(User()); + userConfig.updateUser( + User(firstName: 'Test', lastName: 'Test', email: 'test@test.com'), + ); + await tester + .pumpWidget(createEditProfilePage(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('EditProfileScreenScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + final updateButtonFinder = find.byKey(const Key('updatebtn')); + expect(updateButtonFinder, findsOneWidget); + await tester.tap(updateButtonFinder); + await tester.pumpAndSettle(); + }); + }); + }); + group('Testing image selection and removal in Edit Profile Screen', () { + setUp(() { + registerServices(); + //locator().test(); + }); + + tearDown(() { + unregisterServices(); + }); + + testWidgets( + 'Testing image selection when user is selecting image from device', + (tester) async { + final notifyListenerCallback = MockCallbackFunction(); + final model = EditProfilePageViewModel() + ..addListener(notifyListenerCallback); + model.initialize(); + + // with camera true + final file = File('fakePath'); + when(multimediaPickerService.getPhotoFromGallery(camera: true)) + .thenAnswer((_) async { + return file; + }); + await model.selectImage(camera: true); + verify(multimediaPickerService.getPhotoFromGallery(camera: true)); + expect(model.imageFile, file); + verify(notifyListenerCallback()); + await tester.pumpWidget(createEditProfilePage(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + expect(find.byKey(const Key('AddRemoveImageButton')), findsOneWidget); + await tester.tap(find.byKey(const Key('AddRemoveImageButton'))); + await tester.pumpAndSettle(); + await tester.tap(find.byIcon(Icons.camera_alt)); + await tester.pumpAndSettle(); + expect(model.imageFile, isNotNull); + }); + testWidgets('Testing if image removal work properly', (tester) async { + final notifyListenerCallback = MockCallbackFunction(); + final model = EditProfilePageViewModel() + ..addListener(notifyListenerCallback); + model.initialize(); + + // testing removeImage + model.removeImage(); + expect(model.imageFile, null); + verify(notifyListenerCallback()); + }); + + // Testing onPressed for firstName + testWidgets("Testing if firstName text field gets focus", (tester) async { + userConfig.updateUser( + User(firstName: 'Test', lastName: 'Test', email: 'test@test.com'), + ); + await tester.pumpWidget(createEditProfilePage(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + await tester.tap(find.byKey(const Key('FirstNameTextField'))); + await tester.pumpAndSettle(); + + // Verify the focus + expect( + FocusScope.of(tester.element(find.byType(EditProfilePage))) + .focusedChild! + .hasPrimaryFocus, + true, + ); + }); + }); +} diff --git a/test/widget_tests/pre_auth_screens/change_password_page_test.dart b/test/widget_tests/pre_auth_screens/change_password_page_test.dart new file mode 100644 index 000000000..7a6ad9f6b --- /dev/null +++ b/test/widget_tests/pre_auth_screens/change_password_page_test.dart @@ -0,0 +1,310 @@ +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/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/base_view.dart'; +import 'package:talawa/views/pre_auth_screens/change_password.dart'; +import 'package:talawa/widgets/rich_text.dart'; + +import '../../helpers/test_locator.dart'; + +/// 'createChangePassScreen' is used to create the EditProfilePage widget in light mode. +/// +/// **params**: +/// * `themeMode`: Represents the theme mode of the widget. +/// +/// **returns**: +/// * `Widget`: Returns the ChangePass widget. +Widget createChangePassScreen({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: themeMode == ThemeMode.light + ? TalawaTheme.lightTheme + : TalawaTheme.darkTheme, + home: const ChangePass(key: Key('ChangePass')), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + +void main() { + testSetupLocator(); + locator().test(); + locator().test(); + group('Change Password Screen Widget Test in light mode', () { + testWidgets("Testing if Change Password Screen shows up", (tester) async { + await tester + .pumpWidget(createChangePassScreen(themeMode: ThemeMode.light)); + await tester.pumpAndSettle(); + final iconButton = find.byIcon(Icons.arrow_back); + + final screenScaffoldWidget = find.byKey( + const Key('ChangePassScreenScaffold'), + ); + expect(iconButton, findsOneWidget); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.lightTheme.scaffoldBackgroundColor, + ); + await tester.tap(iconButton); + await tester.pumpAndSettle(); + }); + testWidgets("Testing if custom rich text shows up", (tester) async { + //pushing recover screen + await tester + .pumpWidget(createChangePassScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + + //initializing the custom rich text widget Finder + final customRichTextWidget = find.byKey( + const Key('ChangePageText'), + ); + + //initializing the greeting text + final greeting = [ + { + 'text': + "${AppLocalizations.of(navigationService.navigatorKey.currentContext!)!.translate("Hello")}, ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': + '${AppLocalizations.of(navigationService.navigatorKey.currentContext!)!.translate("User Name")} ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24), + }, + { + 'text': + "${AppLocalizations.of(navigationService.navigatorKey.currentContext!)!.translate("we've")} ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': + '${AppLocalizations.of(navigationService.navigatorKey.currentContext!)!.translate("got you covered")} ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + ]; + + //finding the custom rich text widget + expect(customRichTextWidget, findsOneWidget); + + //testing greeting text + expect( + (tester.firstWidget(customRichTextWidget) as CustomRichText).words, + greeting, + ); + }); + testWidgets("Testing the Password Input text form field", (tester) async { + //pushing change pass Screen + await tester + .pumpWidget(createChangePassScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + + //initializing the pass input field widget Finder + final passInputFieldWidget = find.byKey(const Key('PassInputField')); + //initializing the confirm pass input field widget Finder + final passConfirmInputFieldWidget = + find.byKey(const Key('PassRepeatInputField')); + //initializing the text field suffix button widget Finder + final findChangePassButton = + find.byKey(const Key('ChangePasswordButton')); + //initializing the null pass Submission widget Finder + final nullPassSubmission = find.text('Password must not be left blank'); + //initializing the invalid password submission widget Finder + final invalidPassSubmission = find.text( + 'Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,\$,etc.)', + ); + //initializing the invalid password submission widget Finder + final misMatchPassSubmission = + find.text('Password does not match original'); + + //finding the pass input text field + expect(passInputFieldWidget, findsOneWidget); + //finding the confirm pass input text field + expect(passConfirmInputFieldWidget, findsOneWidget); + //finding the recover button + expect(findChangePassButton, findsOneWidget); + + //inputting a invalid pass in the field + await tester.enterText(passInputFieldWidget, 'nontext'); + //submitting the field with invalid input + await tester.ensureVisible(findChangePassButton); + await tester.tap(findChangePassButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the invalidPassSubmission widget appears + expect(invalidPassSubmission, findsOneWidget); + + //without inputting text in the field + await tester.enterText(passInputFieldWidget, ''); + //submitting the field with null input + await tester.tap(findChangePassButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the nullPassSubmission widget appears + expect(nullPassSubmission, findsOneWidget); + + //not matching confirm pass + await tester.enterText(passInputFieldWidget, 'Test@123'); + await tester.enterText(passConfirmInputFieldWidget, 'Test@12'); + //submitting the field with mismatch password input + await tester.tap(findChangePassButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the nullPassSubmission widget appears + expect(misMatchPassSubmission, findsOneWidget); + }); + }); + group('Change Password Screen Widget Test in dark mode', () { + testWidgets("Testing if Change Password Screen shows up", (tester) async { + await tester + .pumpWidget(createChangePassScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + // finding scaffold is present + final screenScaffoldWidget = find.byKey( + const Key('ChangePassScreenScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + }); + testWidgets("Testing if custom rich text shows up", (tester) async { + //pushing recover screen + await tester + .pumpWidget(createChangePassScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + + //initializing the custom rich text widget Finder + final customRichTextWidget = find.byKey( + const Key('ChangePageText'), + ); + + //initializing the greeting text + final greeting = [ + { + 'text': + "${AppLocalizations.of(navigationService.navigatorKey.currentContext!)!.translate("Hello")}, ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': + '${AppLocalizations.of(navigationService.navigatorKey.currentContext!)!.translate("User Name")} ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24), + }, + { + 'text': + "${AppLocalizations.of(navigationService.navigatorKey.currentContext!)!.translate("we've")} ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': + '${AppLocalizations.of(navigationService.navigatorKey.currentContext!)!.translate("got you covered")} ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + ]; + + //finding the custom rich text widget + expect(customRichTextWidget, findsOneWidget); + + //testing greeting text + expect( + (tester.firstWidget(customRichTextWidget) as CustomRichText).words, + greeting, + ); + }); + testWidgets("Testing the Password Input text form field", (tester) async { + //pushing change pass Screen + await tester + .pumpWidget(createChangePassScreen(themeMode: ThemeMode.dark)); + await tester.pumpAndSettle(); + + //initializing the pass input field widget Finder + final passInputFieldWidget = find.byKey(const Key('PassInputField')); + //initializing the confirm pass input field widget Finder + final passConfirmInputFieldWidget = + find.byKey(const Key('PassRepeatInputField')); + //initializing the text field suffix button widget Finder + final findRecoverButton = find.byKey(const Key('ChangePasswordButton')); + //initializing the null pass Submission widget Finder + final nullPassSubmission = find.text('Password must not be left blank'); + //initializing the invalid password submission widget Finder + final invalidPassSubmission = find.text( + 'Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,\$,etc.)', + ); + //initializing the invalid password submission widget Finder + final misMatchPassSubmission = + find.text('Password does not match original'); + + //finding the pass input text field + expect(passInputFieldWidget, findsOneWidget); + //finding the confirm pass input text field + expect(passConfirmInputFieldWidget, findsOneWidget); + //finding the recover button + expect(findRecoverButton, findsOneWidget); + + //inputting a invalid pass in the field + await tester.enterText(passInputFieldWidget, 'nontext'); + //submitting the field with invalid input + await tester.ensureVisible(findRecoverButton); + await tester.tap(findRecoverButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the invalidPassSubmission widget appears + expect(invalidPassSubmission, findsOneWidget); + + //without inputting text in the field + await tester.enterText(passInputFieldWidget, ''); + //submitting the field with null input + await tester.tap(findRecoverButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the nullPassSubmission widget appears + expect(nullPassSubmission, findsOneWidget); + + //not matching confirm pass + await tester.enterText(passInputFieldWidget, 'Test@123'); + await tester.enterText(passConfirmInputFieldWidget, 'Test@12'); + //submitting the field with mismatch password input + await tester.tap(findRecoverButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the nullPassSubmission widget appears + expect(misMatchPassSubmission, findsOneWidget); + }); + }); +} diff --git a/test/widget_tests/pre_auth_screens/login_test.dart b/test/widget_tests/pre_auth_screens/login_test.dart new file mode 100644 index 000000000..75268cd74 --- /dev/null +++ b/test/widget_tests/pre_auth_screens/login_test.dart @@ -0,0 +1,253 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/router.dart' as router; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +// import 'package:talawa/views/main_screen.dart'; +import 'package:talawa/views/pre_auth_screens/login.dart'; +import 'package:talawa/views/pre_auth_screens/recover.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; +import 'package:talawa/widgets/rich_text.dart'; + +import '../../helpers/test_locator.dart'; + +Widget createApp() { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: TextButton( + onPressed: () async { + await navigationService.pushScreen('/login'); + }, + child: const Text('ravidi'), + ), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); +} + +Future showLoginScreen(WidgetTester tester) async { + await tester.pumpWidget(createApp()); + await tester.pump(); + await tester.tap(find.textContaining('ravidi')); + await tester.pumpAndSettle(); +} + +void main() { + SizeConfig().test(); + testSetupLocator(); + group('Test for Login screen', () { + testWidgets('Check if Login screen shows up', (tester) async { + await tester.pumpWidget(createApp()); + await tester.pump(); + + expect(find.byType(Login), findsNothing); + + await tester.tap(find.textContaining('ravidi')); + await tester.pumpAndSettle(); + + expect(find.byType(Login), findsOneWidget); + }); + + testWidgets('Check if back button works', (tester) async { + await tester.pumpWidget(createApp()); + await tester.pump(); + + expect(find.byType(Login), findsNothing); + + await tester.tap(find.textContaining('ravidi')); + await tester.pumpAndSettle(); + + expect(find.byType(Login), findsOneWidget); + + await tester.tap( + find.descendant( + of: find.byType(AppBar), + matching: find.byType(IconButton), + ), + ); + await tester.pumpAndSettle(); + + expect(find.byType(Login), findsNothing); + }); + + testWidgets('Check if all widgets are present', (tester) async { + await showLoginScreen(tester); + + expect(find.byType(Scaffold), findsOneWidget); + expect(find.byType(AppBar), findsOneWidget); + expect(find.byType(SingleChildScrollView), findsOneWidget); + expect(find.byType(CustomRichText), findsOneWidget); + expect(find.byType(TextFormField), findsNWidgets(2)); + expect(find.byType(RaisedRoundedButton), findsOneWidget); + }); + + testWidgets('Check if all texts show up properly', (tester) async { + await showLoginScreen(tester); + + // expect(find.text("We're Glad you're Back "), findsOneWidget); + expect( + find.textContaining("Enter your registered Email"), + findsOneWidget, + ); + expect(find.textContaining("Enter your password"), findsOneWidget); + expect(find.textContaining("Forgot password"), findsOneWidget); + }); + + testWidgets("Testing the email Input text form field", (tester) async { + //pushing setUrlScreen + await showLoginScreen(tester); + + //initializing the email input field widget Finder + final emailInputFieldWidget = find.byKey(const Key('EmailInputField')); + //initializing the text field suffix button widget Finder + final findLoginButton = find.byKey(const Key('LoginButton')); + //initializing the nullEmailSubmission widget Finder + final nullEmailSubmission = find.text('Email must not be left blank'); + //initializing the invalidEmailSubmission widget Finder + final invalidEmailSubmission = + find.text('Please enter a valid Email Address'); + + //finding the email input text field + expect(emailInputFieldWidget, findsOneWidget); + //finding the login button + expect(findLoginButton, findsOneWidget); + + //inputting a non email text in the field + await tester.enterText(emailInputFieldWidget, 'non-url text'); + //submitting the field with non url input + await tester.ensureVisible(findLoginButton); + await tester.tap(findLoginButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the invalidEmailSubmission widget appears + expect(invalidEmailSubmission, findsOneWidget); + + //without inputting text in the field + await tester.enterText(emailInputFieldWidget, ''); + //submitting the field with non url input + await tester.tap(findLoginButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the nullEmailSubmission widget appears + expect(nullEmailSubmission, findsOneWidget); + }); + + testWidgets("Testing the password Input text form field", (tester) async { + //pushing setUrlScreen + await showLoginScreen(tester); + + //initializing the password input field widget Finder + final passwordInputFieldWidget = + find.byKey(const Key('PasswordInputField')); + //initializing the pa Finder + final iconButton = find.byIcon(Icons.visibility_off); + //initializing the text field suffix button widget Finder + final findLoginButton = find.byKey(const Key('LoginButton')); + //initializing the nullPasswordSubmission widget Finder + final nullPasswordSubmission = + find.text('Password must not be left blank'); + //initializing the invalidPasswordSubmission widget Finder + final invalidPasswordSubmission = find.text( + 'Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,\$,etc.)', + ); + //initializing the spacePasswordSubmission widget Finder + final spacePasswordSubmission = + find.text('Password must not contain spaces'); + + //finding the password input text field + expect(passwordInputFieldWidget, findsOneWidget); + //finding the iconbutton + expect(iconButton, findsOneWidget); + //finding the login button + expect(findLoginButton, findsOneWidget); + + //inputting a invalid password text in the field + await tester.enterText(passwordInputFieldWidget, 'test'); + //submitting the field with invalid password input + await tester.ensureVisible(findLoginButton); + await tester.tap(findLoginButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the invalidPasswordSubmission widget appears + expect(invalidPasswordSubmission, findsOneWidget); + + //without inputting text in the field + await tester.enterText(passwordInputFieldWidget, ''); + //submitting the field without input + await tester.tap(findLoginButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the nullPasswordSubmission widget appears + expect(nullPasswordSubmission, findsOneWidget); + + //inputting a password with spaces in the field + await tester.enterText(passwordInputFieldWidget, 'testing spaces'); + //submitting the field with spaces input + await tester.tap(findLoginButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the spacePasswordSubmission widget appears + expect(spacePasswordSubmission, findsOneWidget); + + await tester.tap(iconButton); + await tester.pumpAndSettle(); + }); + + // TODO: uncomment after implementing mock LoginViewModel + + // testWidgets('Check if Login button works', (tester) async { + // await showLoginScreen(tester); + + // await tester.enterText(find.byType(TextFormField).first, 'ravidi'); + // await tester.enterText(find.byType(TextFormField).last, 'shaikh'); + + // await tester.tap(find.textContaining('Login')); + // await tester.pumpAndSettle(); + + // expect(find.byType(MainScreen), findsNothing); + + // await tester.enterText(find.byType(TextFormField).first, 'ravidi@ravidi.ravidi'); + // await tester.enterText(find.byType(TextFormField).last, 'Shaikh@1234'); + + // await tester.tap(find.textContaining('Login')); + // await tester.pumpAndSettle(); + + // expect(find.byType(MainScreen), findsOneWidget); + // }); + + testWidgets('Check if login button works', (tester) async { + await showLoginScreen(tester); + + final loginButton = find.byKey(const Key('LoginButton')); + expect(loginButton, findsOneWidget); + + await tester.tap(loginButton); + await tester.pumpAndSettle(); + }); + testWidgets('Check if tip button works', (tester) async { + await showLoginScreen(tester); + + final tipButton = find.text('Tip'); + expect(tipButton, findsOneWidget); + + await tester.tap(tipButton); + await tester.pumpAndSettle(); + }); + + testWidgets('Check if Recover button works', (tester) async { + await showLoginScreen(tester); + + expect(find.byType(Recover), findsNothing); + + await tester.tap(find.textContaining('Forgot password')); + await tester.pumpAndSettle(); + + expect(find.byType(Recover), findsOneWidget); + }); + }); +} diff --git a/test/widget_tests/pre_auth_screens/recover_page_test.dart b/test/widget_tests/pre_auth_screens/recover_page_test.dart new file mode 100644 index 000000000..7c3988a83 --- /dev/null +++ b/test/widget_tests/pre_auth_screens/recover_page_test.dart @@ -0,0 +1,186 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +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/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/base_view.dart'; +import 'package:talawa/views/pre_auth_screens/recover.dart'; +import 'package:talawa/widgets/rich_text.dart'; + +import '../../helpers/test_locator.dart'; + +Widget createRecoverScreenLight({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 Recover(key: Key('Recover')), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + +Widget createRecoverScreenDark({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, + theme: TalawaTheme.darkTheme, + home: const Recover(key: Key('Recover')), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + }, + ); + +void main() { + testSetupLocator(); + 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(createRecoverScreenLight()); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('RecoverScreenScaffold'), + ); + final iconButton = find.byIcon(Icons.arrow_back); + expect(screenScaffoldWidget, findsOneWidget); + expect(iconButton, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.lightTheme.scaffoldBackgroundColor, + ); + await tester.tap(iconButton); + await tester.pumpAndSettle(); + }); + }); + group('Select Language Screen Widget Test in dark mode', () { + testWidgets("Testing if Select Language Screen shows up", (tester) async { + await tester.pumpWidget(createRecoverScreenDark()); + await tester.pumpAndSettle(); + // finding scaffold is present + final screenScaffoldWidget = find.byKey( + const Key('RecoverScreenScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + }); + testWidgets("Testing if custom rich text shows up", (tester) async { + //pushing recover screen + await tester.pumpWidget(createRecoverScreenDark()); + await tester.pumpAndSettle(); + + //initializing the custom rich text widget Finder + final customRichTextWidget = find.byKey( + const Key('RecoverPageText'), + ); + + //initializing the greeting text + final greeting = [ + { + 'text': + "${AppLocalizations.of(navigationService.navigatorKey.currentContext!)!.translate("Sit back relax, we'll")} ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': + '${AppLocalizations.of(navigationService.navigatorKey.currentContext!)!.translate("Recover")} ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24), + }, + { + 'text': AppLocalizations.of( + navigationService.navigatorKey.currentContext!, + )! + .translate("your password"), + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + ]; + + //finding the custom rich text widget + expect(customRichTextWidget, findsOneWidget); + + //testing greeting text + expect( + (tester.firstWidget(customRichTextWidget) as CustomRichText).words, + greeting, + ); + }); + testWidgets("Testing the email Input text form field", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createRecoverScreenDark()); + await tester.pumpAndSettle(); + + //initializing the url input field widget Finder + final emailInputFieldWidget = find.byKey(const Key('EmailInputField')); + //initializing the text field suffix button widget Finder + final findRecoverButton = find.byKey(const Key('RecoverButton')); + //initializing the nullUrlSubmission widget Finder + final nullEmailSubmission = find.text('Email must not be left blank'); + //initializing the invalidUrlSubmission widget Finder + final invalidEmailSubmission = + find.text('Please enter a valid Email Address'); + + //finding the url input text field + expect(emailInputFieldWidget, findsOneWidget); + //finding the recover button + expect(findRecoverButton, findsOneWidget); + + //inputting a non email text in the field + await tester.enterText(emailInputFieldWidget, 'non-url text'); + //submitting the field with non url input + await tester.tap(findRecoverButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the invalidUrlSubmission widget appears + expect(invalidEmailSubmission, findsOneWidget); + + //without inputting text in the field + await tester.enterText(emailInputFieldWidget, ''); + //submitting the field with non url input + await tester.tap(findRecoverButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the nullEmailSubmission widget appears + expect(nullEmailSubmission, findsOneWidget); + }); + }); +} diff --git a/test/widget_tests/pre_auth_screens/select_language_page_test.dart b/test/widget_tests/pre_auth_screens/select_language_page_test.dart new file mode 100644 index 000000000..cafd870c4 --- /dev/null +++ b/test/widget_tests/pre_auth_screens/select_language_page_test.dart @@ -0,0 +1,300 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'dart:io'; +import 'dart:math'; + +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:talawa/constants/constants.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/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/base_view.dart'; +import 'package:talawa/views/pre_auth_screens/select_language.dart'; + +import '../../helpers/test_locator.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, + ); + }, + ); + +Future main() async { + TestWidgetsFlutterBinding.ensureInitialized(); + //initializing Hive + const testMockStorage = 'test/fixtures/core'; + Hive + ..init(testMockStorage) + ..registerAdapter(UserAdapter()) + ..registerAdapter(OrgInfoAdapter()); + //opening Hive Boxes + await Hive.openBox('currentUser'); + await Hive.openBox('currentOrg'); + // await Hive.openBox('url'); + + testSetupLocator(); + 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.headlineSmall!.color, + ); + + expect( + (tester.firstWidget(findAppNameWidget) as Text).style!.fontFamily, + TalawaTheme.lightTheme.textTheme.headlineSmall!.fontFamily, + ); + + expect( + (tester.firstWidget(findAppNameWidget) as Text).style!.fontSize, + TalawaTheme.lightTheme.textTheme.headlineSmall!.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); + await tester.pumpWidget(createSelectLanguageScreenLight()); + 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 navigate to MainScreen", (tester) async { + await tester.pumpWidget(createSelectLanguageScreenLight()); + await tester.pumpAndSettle(); + + final findAppNameWidget = find.byKey(const Key('NavigateToMainScreen')); + + 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.headlineSmall!.color, + ); + expect( + (tester.firstWidget(findAppNameWidget) as Text).style!.fontFamily, + TalawaTheme.darkTheme.textTheme.headlineSmall!.fontFamily, + ); + expect( + (tester.firstWidget(findAppNameWidget) as Text).style!.fontSize, + TalawaTheme.darkTheme.textTheme.headlineSmall!.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('NavigateToMainScreen')); + await tester.tap(findAppNameWidget); + await tester.pumpAndSettle(const Duration(seconds: 3)); + expect(findAppNameWidget, findsNothing); + }); + }); + File('test/fixtures/core/currentorg.hive').delete(); + File('test/fixtures/core/currentorg.lock').delete(); + File('test/fixtures/core/currentuser.hive').delete(); + File('test/fixtures/core/currentuser.lock').delete(); +} diff --git a/test/widget_tests/pre_auth_screens/select_organization_test.dart b/test/widget_tests/pre_auth_screens/select_organization_test.dart new file mode 100644 index 000000000..f42b3ae69 --- /dev/null +++ b/test/widget_tests/pre_auth_screens/select_organization_test.dart @@ -0,0 +1,84 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +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/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/utils/queries.dart'; +import 'package:talawa/views/pre_auth_screens/select_organization.dart'; + +import '../../helpers/test_helpers.dart'; + +void main() { + const Key selectOrgKey = Key("selectOrgKey"); + const String orgID = "-1"; + Widget createSelectOrgPage({String? customorgID}) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + themeMode: ThemeMode.light, + theme: TalawaTheme.lightTheme, + home: SelectOrganization( + key: selectOrgKey, + selectedOrgId: customorgID ?? orgID, + ), + ); + } + + SizeConfig().test(); + + group("Select Organization Test", () { + setUp(() { + registerViewModels(); + registerServices(); + locator.registerFactory(() => Queries()); + }); + + tearDown(() { + unregisterViewModels(); + unregisterServices(); + locator.unregister(); + }); + + testWidgets("Test if SelectOrganization Page is displayed ", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createSelectOrgPage()); + await tester.pump(); + final selectOrgFinder = find.byKey(selectOrgKey); + expect(selectOrgFinder, findsOneWidget); + }); + }); + + testWidgets("Test if back-arrow is present", (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createSelectOrgPage()); + await tester.pump(); + + final orgFinder = find.byKey(selectOrgKey); + final appBarFinder = + find.descendant(of: orgFinder, matching: find.byType(AppBar)); + expect(appBarFinder, findsOneWidget); + + // final appBarWidget = tester.firstWidget(appBarFinder) as AppBar; + + // expect( + // appBarWidget.leading, + // isA().having( + // (icon) => icon.icon, + // "icon", + // Icons.arrow_back, + // ), + // ); + }); + }); + }); +} diff --git a/test/widget_tests/pre_auth_screens/set_url_page_test.dart b/test/widget_tests/pre_auth_screens/set_url_page_test.dart new file mode 100644 index 000000000..65db66041 --- /dev/null +++ b/test/widget_tests/pre_auth_screens/set_url_page_test.dart @@ -0,0 +1,743 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +// import 'dart:io'; + +import 'package:flutter/material.dart'; +// import 'package:flutter/services.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:hive/hive.dart'; +import 'package:mockito/mockito.dart'; +// import 'package:path_provider/path_provider.dart' as path; +import 'package:provider/provider.dart'; +import 'package:qr_code_scanner/qr_code_scanner.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/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'; + +import '../../helpers/test_helpers.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: navigationService.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: navigationService.navigatorKey, + onGenerateRoute: router.generateRoute, + ), + ); + +Future main() async { + TestWidgetsFlutterBinding.ensureInitialized(); + const testMockStorage = 'test/fixtures/core'; + Hive + ..init(testMockStorage) + ..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(); + setUp(() async { + registerServices(); + }); + + //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 icon button shows up", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenLight()); + await tester.pumpAndSettle(); + + //initializing the logo Finder + final iconButton = find.byIcon(Icons.qr_code_scanner); + + //finding the logo + expect(iconButton, findsOneWidget); + //testing logo size + expect( + (tester.firstWidget(iconButton) as Icon).semanticLabel, + 'Join Organisation with QR', + ); + + expect((tester.firstWidget(iconButton) as Icon).size, 30); + await tester.tap(iconButton); + await tester.pumpAndSettle(); + }); + 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, + ), + ); + }); + + 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 + .titleLarge! + .copyWith(fontSize: 24, fontWeight: FontWeight.w700), + }, + { + 'text': 'and ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': 'Collaborate ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24, fontWeight: FontWeight.w700), + }, + { + 'text': 'with your ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': 'Organizations', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall! + .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:///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); + await tester.tap(changeLanguageWidget, warnIfMissed: false); + await tester.pumpAndSettle(); + }); + 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.secondaryContainer, + ); + expect( + (tester.firstWidget(loginButtonWidget) as RaisedRoundedButton) + .textColor, + TalawaTheme + .lightTheme.inputDecorationTheme.focusedBorder!.borderSide.color, + ); + expect( + (tester.firstWidget(loginButtonWidget) as RaisedRoundedButton) + .buttonLabel, + 'Login', + ); + await tester.ensureVisible(loginButtonWidget); + await tester.tap(loginButtonWidget); + await tester.pumpAndSettle(); + }); + + testWidgets("Check navigation to Login page when Login button is pressed.", + (tester) async { + await tester.pumpWidget(createSetUrlScreenDark()); + await tester.pump(); + expect(find.byKey(const Key('SetUrlScreenScaffold')), findsOneWidget); + + await tester.enterText( + find.byKey(const Key('UrlInputField')), + 'https:///graphql', + ); + + final finder = find.byKey(const Key('LoginButton')); + await tester.ensureVisible(finder); + await tester.tap(finder); + await tester.pumpAndSettle(); + expect(find.byKey(const Key('UrlPageText')), findsOneWidget); + }); + testWidgets("Testing if signup 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.secondaryContainer, + ); + expect( + (tester.firstWidget(signupButtonWidget) as RaisedRoundedButton) + .buttonLabel, + 'Sign Up', + ); + await tester.tap(signupButtonWidget, warnIfMissed: false); + await tester.pumpAndSettle(); + }); + testWidgets( + "Testing onFieldSubmitted in TextFormField by simulating keyboard hits", + (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenLight()); + await tester.pumpAndSettle(); + + final formFinder = find.ancestor( + of: find.byKey(const Key('UrlInputField')), + matching: find.byType(Form), + ); + final formWidget = tester.firstWidget(formFinder) as Form; + (formWidget.key! as GlobalKey).currentState!.save(); + + final textFinder = find.byKey(const Key('UrlInputField')); + await tester.tap(textFinder); + await tester.pump(); + await tester.showKeyboard(textFinder); + await tester.testTextInput.receiveAction(TextInputAction.done); + }); + testWidgets("Testing onTap in sign up button", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenLight()); + await tester.pumpAndSettle(); + + final btnFinder = find.byKey(const Key('SignUpButton')); + + await tester.dragUntilVisible( + btnFinder.first, + find.byType(SingleChildScrollView).first, + const Offset(100, 0), + ); + await tester.tap(btnFinder.first); + await tester.pump(); + }); + testWidgets("Testing onTap in Change Language Gesture Detector", + (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenLight()); + await tester.pumpAndSettle(); + + final gestureDetectorFinder = find.byKey(const Key('ChangeLanguage')); + + await tester.dragUntilVisible( + gestureDetectorFinder.first, + find.byType(SingleChildScrollView).first, + const Offset(100, 0), + ); + + final GlobalKey navigator = GlobalKey(); + + when(navigationService.navigatorKey).thenAnswer((_) => navigator); + when(navigationService.pop()).thenAnswer((_) async => 1); + + await tester.tap(gestureDetectorFinder.first); + await tester.pump(); + + verify(navigationService.pop()); + }); + }); + + //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 icon button shows up", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenLight()); + await tester.pumpAndSettle(); + + //initializing the logo Finder + final iconButton = find.byIcon(Icons.qr_code_scanner); + + //finding the logo + expect(iconButton, findsOneWidget); + //testing logo size + expect( + (tester.firstWidget(iconButton) as Icon).semanticLabel, + 'Join Organisation with QR', + ); + + expect((tester.firstWidget(iconButton) as Icon).size, 30); + await tester.tap(iconButton); + await tester.pumpAndSettle(); + }); + testWidgets("Check if QR button works", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenDark()); + await tester.pumpAndSettle(); + + final iconButton = find.byIcon(Icons.qr_code_scanner); + + // tapping the qr button + await tester.tap(iconButton); + await tester.pumpAndSettle(); + + expect(find.byType(ClipRRect), findsOneWidget); + expect(find.byType(QRView), findsOneWidget); + }); + 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, + ), + ); + }); + 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 + .titleLarge! + .copyWith(fontSize: 24, fontWeight: FontWeight.w700), + }, + { + 'text': 'and ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': 'Collaborate ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24, fontWeight: FontWeight.w700), + }, + { + 'text': 'with your ', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': 'Organizations', + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall! + .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:///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); + await tester.tap(changeLanguageWidget, warnIfMissed: false); + await tester.pumpAndSettle(); + }); + 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.secondaryContainer, + ); + expect( + (tester.firstWidget(loginButtonWidget) as RaisedRoundedButton) + .textColor, + TalawaTheme + .darkTheme.inputDecorationTheme.focusedBorder!.borderSide.color, + ); + expect( + (tester.firstWidget(loginButtonWidget) as RaisedRoundedButton) + .buttonLabel, + 'Login', + ); + + await tester.ensureVisible(loginButtonWidget); + await tester.tap(loginButtonWidget); + await tester.pumpAndSettle(); + }); + testWidgets("Testing if signup 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.secondaryContainer, + ); + expect( + (tester.firstWidget(signupButtonWidget) as RaisedRoundedButton) + .buttonLabel, + 'Sign Up', + ); + await tester.tap(signupButtonWidget, warnIfMissed: false); + await tester.pumpAndSettle(); + }); + testWidgets( + "Testing onFieldSubmitted in TextFormField by simulating keyboard hits", + (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenDark()); + await tester.pumpAndSettle(); + + final formFinder = find.ancestor( + of: find.byKey(const Key('UrlInputField')), + matching: find.byType(Form), + ); + final formWidget = tester.firstWidget(formFinder) as Form; + (formWidget.key! as GlobalKey).currentState!.save(); + + final textFinder = find.byKey(const Key('UrlInputField')); + await tester.tap(textFinder); + await tester.pump(); + await tester.showKeyboard(textFinder); + await tester.testTextInput.receiveAction(TextInputAction.done); + }); + testWidgets("Testing onTap in sign up button", (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenDark()); + await tester.pumpAndSettle(); + + final btnFinder = find.byKey(const Key('SignUpButton')); + + await tester.dragUntilVisible( + btnFinder.first, + find.byType(SingleChildScrollView).first, + const Offset(100, 0), + ); + await tester.tap(btnFinder.first); + await tester.pump(); + }); + testWidgets("Testing onTap in Change Language Gesture Detector", + (tester) async { + //pushing setUrlScreen + await tester.pumpWidget(createSetUrlScreenDark()); + await tester.pumpAndSettle(); + + final gestureDetectorFinder = find.byKey(const Key('ChangeLanguage')); + + await tester.dragUntilVisible( + gestureDetectorFinder.first, + find.byType(SingleChildScrollView).first, + const Offset(100, 0), + ); + + final GlobalKey navigator = GlobalKey(); + + when(navigationService.navigatorKey).thenAnswer((_) => navigator); + when(navigationService.pop()).thenAnswer((_) async => 1); + + await tester.tap(gestureDetectorFinder.first); + await tester.pump(); + + verify(navigationService.pop()); + }); + }); +} diff --git a/test/widget_tests/pre_auth_screens/signup_details_test.dart b/test/widget_tests/pre_auth_screens/signup_details_test.dart new file mode 100644 index 000000000..032b4af28 --- /dev/null +++ b/test/widget_tests/pre_auth_screens/signup_details_test.dart @@ -0,0 +1,278 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.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/navigation_service.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/views/pre_auth_screens/signup_details.dart'; + +import '../../helpers/test_locator.dart'; + +Widget createApp() { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: TextButton( + onPressed: () async { + final OrgInfo org = OrgInfo( + id: '2', + name: 'test org', + userRegistrationRequired: false, + creatorInfo: User(firstName: 'test', lastName: 'test'), + ); + + await navigationService.pushScreen('/signupDetails', arguments: org); + }, + child: const Text('Ayush'), + ), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); +} + +Future showSignUpScreen(WidgetTester tester) async { + await tester.pumpWidget(createApp()); + await tester.pump(); + await tester.tap(find.textContaining('Ayush')); + await tester.pumpAndSettle(); +} + +void main() { + SizeConfig().test(); + + testSetupLocator(); + + group('Test For SignUp Screen', () { + testWidgets('Check if SignUp screen shows up', (tester) async { + await tester.pumpWidget(createApp()); + await tester.pump(); + + expect(find.byType(SignUpDetails), findsNothing); + + await tester.tap(find.textContaining('Ayush')); + await tester.pumpAndSettle(); + + expect(find.byType(SignUpDetails), findsOneWidget); + }); + testWidgets('Check if arrow back works', (tester) async { + await tester.pumpWidget(createApp()); + await tester.pump(); + + expect(find.byType(SignUpDetails), findsNothing); + + await tester.tap(find.textContaining('Ayush')); + await tester.pumpAndSettle(); + + expect(find.byType(SignUpDetails), findsOneWidget); + + final finder = find.byIcon(Icons.arrow_back); + + await tester.tap(finder); + await tester.pump(); + + expect(find.text('Ayush'), findsOneWidget); + }); + + testWidgets("Testing if input field and signup button appear", + (tester) async { + await showSignUpScreen(tester); + + final firstNameInputFieldWidget = + find.byKey(const Key('FirstNameInputField')); + + final findSignUpButton = find.text('Next'); + expect(firstNameInputFieldWidget, findsOneWidget); + + expect(findSignUpButton, findsOneWidget); + }); +//.................................................................... + testWidgets('Testing validator for first name input form invalid', + (tester) async { + await showSignUpScreen(tester); + + final invalidFirstNameSubmission = find.text('Invalid Firstname'); + + final firstNameInputFieldWidget = + find.byKey(const Key('FirstNameInputField')); + + final findSignUpButton = find.text('Next'); + + await tester.enterText(firstNameInputFieldWidget, '<>'); + + await tester.dragUntilVisible( + findSignUpButton, + findSignUpButton, + const Offset(0, 50), + ); + + await tester.tap(findSignUpButton); + await tester.pumpAndSettle(const Duration(milliseconds: 1000)); + + expect(invalidFirstNameSubmission, findsOneWidget); + }); + testWidgets('Testing validator for first name input form null', + (tester) async { + await showSignUpScreen(tester); + + final nullSubmission = find.text('Firstname must not be left blank.'); + + final firstNameInputFieldWidget = + find.byKey(const Key('FirstNameInputField')); + + final findSignUpButton = find.text('Next'); + + await tester.enterText(firstNameInputFieldWidget, ''); + + await tester.dragUntilVisible( + findSignUpButton, + findSignUpButton, + const Offset(0, 50), + ); + + await tester.tap(findSignUpButton); + await tester.pumpAndSettle(const Duration(milliseconds: 1000)); + + expect(nullSubmission, findsOneWidget); + }); +//........................................................................... + + testWidgets('Testing validator for last name input form invalid', + (tester) async { + await showSignUpScreen(tester); + + final invalidLastNameSubmission = find.text('Invalid Lastname'); + + final lastNameInputFieldWidget = + find.byKey(const Key('LastNameInputField')); + + final findSignUpButton = find.text('Next'); + + await tester.enterText(lastNameInputFieldWidget, '<>'); + + await tester.dragUntilVisible( + findSignUpButton, + findSignUpButton, + const Offset(0, 50), + ); + + await tester.tap(findSignUpButton); + await tester.pumpAndSettle(const Duration(milliseconds: 1000)); + + expect(invalidLastNameSubmission, findsOneWidget); + }); + testWidgets('Testing validator for last name input form null', + (tester) async { + await showSignUpScreen(tester); + + final nullSubmission = find.text('Lastname must not be left blank.'); + + final lastNameInputFieldWidget = + find.byKey(const Key('LastNameInputField')); + + final findSignUpButton = find.text('Next'); + + await tester.enterText(lastNameInputFieldWidget, ''); + + await tester.dragUntilVisible( + findSignUpButton, + findSignUpButton, + const Offset(0, 50), + ); + + await tester.tap(findSignUpButton); + await tester.pumpAndSettle(const Duration(milliseconds: 1000)); + + expect(nullSubmission, findsOneWidget); + }); + }); + //...................................................................................... + testWidgets("Testing the password Input text form field", (tester) async { + //pushing setUrlScreen + await showSignUpScreen(tester); + + //initializing the password input field widget Finder + final passwordInputFieldWidget = find.byKey(const Key('signuppassword')); + //initializing the pa Finder + final iconButton = find.byIcon(Icons.visibility_off); + //initializing the text field suffix button widget Finder + final findSignUpButton = find.text('Next'); + //initializing the nullPasswordSubmission widget Finder + final nullPasswordSubmission = find.text('Password must not be left blank'); + //initializing the invalidPasswordSubmission widget Finder + final invalidPasswordSubmission = find.text( + 'Your password must be at least 8 characters long, contain at least one numeric, one uppercase and one lowercase letters and one special character (@,#,\$,etc.)', + ); + //initializing the spacePasswordSubmission widget Finder + final spacePasswordSubmission = + find.text('Password must not contain spaces'); + + await tester.dragUntilVisible( + findSignUpButton, + findSignUpButton, + const Offset(0, 50), + ); + //finding the password input text field + expect(passwordInputFieldWidget, findsOneWidget); + //finding the iconbutton + expect(iconButton, findsOneWidget); + //finding the login button + expect(findSignUpButton, findsOneWidget); + + //inputting a invalid password text in the field + await tester.enterText(passwordInputFieldWidget, 'test'); + //submitting the field with invalid password input + await tester.ensureVisible(findSignUpButton); + await tester.tap(findSignUpButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the invalidPasswordSubmission widget appears + expect(invalidPasswordSubmission, findsOneWidget); + + //without inputting text in the field + await tester.enterText(passwordInputFieldWidget, ''); + //submitting the field without input + await tester.ensureVisible(findSignUpButton); + await tester.tap(findSignUpButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the nullPasswordSubmission widget appears + expect(nullPasswordSubmission, findsOneWidget); + + //inputting a password with spaces in the field + await tester.enterText(passwordInputFieldWidget, 'testing spaces'); + //submitting the field with spaces input + await tester.ensureVisible(findSignUpButton); + await tester.tap(findSignUpButton); + await tester.pumpAndSettle(const Duration(milliseconds: 500)); + //testing the spacePasswordSubmission widget appears + expect(spacePasswordSubmission, findsOneWidget); + + await tester.tap(iconButton); + await tester.pumpAndSettle(); + }); + + testWidgets( + "Testing onFieldSubmitted in password TextFormField by simulating keyboard hits", + (tester) async { + await showSignUpScreen(tester); + // final formFinder = find.ancestor( + // of: find.byKey(const Key('signuppassword')), + // matching: find.byType(Form)); + // final formWidget = tester.firstWidget(formFinder) as Form; + // (formWidget.key! as GlobalKey).currentState!.save(); + + final textFinder = find.byKey(const Key('signuppassword')); + await tester.tap(textFinder); + await tester.pump(); + await tester.showKeyboard(textFinder); + await tester.testTextInput.receiveAction(TextInputAction.next); + }); +} diff --git a/test/widget_tests/pre_auth_screens/signup_progress_indicator_test.dart b/test/widget_tests/pre_auth_screens/signup_progress_indicator_test.dart new file mode 100644 index 000000000..3dab9721d --- /dev/null +++ b/test/widget_tests/pre_auth_screens/signup_progress_indicator_test.dart @@ -0,0 +1,73 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/widgets/signup_progress_indicator.dart'; +import 'package:timelines/timelines.dart'; + +Widget createSignupProgressIndicator() { + return MaterialApp( + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: SignupProgressIndicator( + key: const Key('pgIndicator'), + currentPageIndex: 1, + ), + ), + ); +} + +void main() { + SizeConfig().test(); + group('Test for SignupProgressIndicator', () { + testWidgets('Check if SignupProgressIndicator widget shows up', + (tester) async { + await tester.pumpWidget(createSignupProgressIndicator()); + await tester.pump(); + + expect(find.byType(Timeline), findsOneWidget); + expect(find.byType(DotIndicator), findsNWidgets(3)); + }); + + testWidgets('Check dotindicator color', (tester) async { + await tester.pumpWidget(createSignupProgressIndicator()); + await tester.pump(); + + final dotIndicatorFinder = find.byType(DotIndicator); + final dotIndicator = tester.widgetList(dotIndicatorFinder); + + expect( + (dotIndicator.elementAt(0) as DotIndicator).color, + const Color(0xFF008A37), + ); + expect( + (dotIndicator.elementAt(1) as DotIndicator).color, + const Color(0xFF008A37), + ); + expect( + (dotIndicator.elementAt(2) as DotIndicator).color, + const Color(0xFF737373), + ); + }); + testWidgets('Check dotindicator icon', (tester) async { + await tester.pumpWidget(createSignupProgressIndicator()); + await tester.pump(); + + final dotIndicatorFinder = find.byType(DotIndicator); + final dotIndicator = tester.widgetList(dotIndicatorFinder); + + expect( + (dotIndicator.elementAt(0) as DotIndicator).child, + isA(), + ); + }); + }); +} diff --git a/test/widget_tests/pre_auth_screens/splash_screen_test.dart b/test/widget_tests/pre_auth_screens/splash_screen_test.dart new file mode 100644 index 000000000..855d49189 --- /dev/null +++ b/test/widget_tests/pre_auth_screens/splash_screen_test.dart @@ -0,0 +1,321 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +// ignore_for_file: unused_import + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.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'; +import 'package:uni_links/uni_links.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, + ); + }, + ); + +Future main() async { + 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, + ), + ); + }); + 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.headlineMedium!.color, + ); + expect( + (tester.firstWidget(findAppNameWidget) as Text).style!.fontFamily, + TalawaTheme.lightTheme.textTheme.headlineMedium!.fontFamily, + ); + expect( + (tester.firstWidget(findAppNameWidget) as Text).style!.fontSize, + TalawaTheme.lightTheme.textTheme.headlineMedium!.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.bodySmall!.color, + ); + expect( + (tester.firstWidget(findProviderTextWidget) as Text).style!.fontFamily, + TalawaTheme.lightTheme.textTheme.bodySmall!.fontFamily, + ); + expect( + (tester.firstWidget(findProviderTextWidget) as Text).style!.fontSize, + TalawaTheme.lightTheme.textTheme.bodySmall!.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.titleSmall!.color, + ); + expect( + (tester.firstWidget(findProviderNameWidget) as Text).style!.fontFamily, + TalawaTheme.lightTheme.textTheme.titleSmall!.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, + ), + ); + }); + 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.headlineMedium!.color, + ); + expect( + (tester.firstWidget(findAppNameWidget) as Text).style!.fontFamily, + TalawaTheme.darkTheme.textTheme.headlineMedium!.fontFamily, + ); + expect( + (tester.firstWidget(findAppNameWidget) as Text).style!.fontSize, + TalawaTheme.darkTheme.textTheme.headlineMedium!.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.bodySmall!.color, + ); + expect( + (tester.firstWidget(findProviderTextWidget) as Text).style!.fontFamily, + TalawaTheme.darkTheme.textTheme.bodySmall!.fontFamily, + ); + expect( + (tester.firstWidget(findProviderTextWidget) as Text).style!.fontSize, + TalawaTheme.darkTheme.textTheme.bodySmall!.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.titleSmall!.color, + ); + expect( + (tester.firstWidget(findProviderNameWidget) as Text).style!.fontFamily, + TalawaTheme.darkTheme.textTheme.titleSmall!.fontFamily, + ); + }); + }); +} + +// Added the following test cases + +Future testWidgets1(WidgetTester tester) async { + await tester.pumpWidget(createSplashScreenLight()); + await tester.pumpAndSettle(); + + // Mock the uriLinkStream to emit a test URI + final testUri = Uri.parse("https://example.com"); + uriLinkStream.any(testUri as bool Function(Uri? element)); + + // Wait for the URI to be handled + await tester.pumpAndSettle(); + + // Verify that the latest URI is updated correctly + expect(find.text("Latest URI: $testUri"), findsOneWidget); +} + +Future testWidgets2(WidgetTester tester) async { + await tester.pumpWidget(createSplashScreenLight()); + await tester.pumpAndSettle(); + + // Mock the userConfig.userLoggedIn() to return true + when(userConfig.userLoggedIn()).thenAnswer((_) async => true); + + // Wait for the user log in to be handled + await tester.pumpAndSettle(); + + // Verify that the user log in is handled correctly + expect(find.text("User logged in"), findsOneWidget); +} + +Future testWidgets3(WidgetTester tester) async { + await tester.pumpWidget(createSplashScreenLight()); + await tester.pumpAndSettle(); + + // Mock the userConfig.userLoggedIn() to return true + when(userConfig.userLoggedIn()).thenAnswer((_) async => true); + + // Mock the uriLinkStream to emit a test URI + final testUri = Uri.parse("https://example.com"); + uriLinkStream.any(testUri as bool Function(Uri? element)); + + // Wait for the URI to be handled + await tester.pumpAndSettle(); + + // Verify that the user log in is not handled + expect(find.text("User logged in"), findsNothing); +} + +Future testWidgets4(WidgetTester tester) async { + await tester.pumpWidget(createSplashScreenLight()); + await tester.pumpAndSettle(); + + // Mock the userConfig.userLoggedIn() to return true + when(userConfig.userLoggedIn()).thenAnswer((_) async => true); + + // Wait for the user log in to be handled + await tester.pumpAndSettle(); + + // Verify that the user log in is handled correctly + expect(find.text("User logged in"), findsOneWidget); +} + +Future testWidgets5(WidgetTester tester) async { + await tester.pumpWidget(createSplashScreenLight()); + await tester.pumpAndSettle(); + + // Mock the userConfig.userLoggedIn() to return true + when(userConfig.userLoggedIn()).thenAnswer((_) async => true); + + // Mock the initial URI to be a test URI + final testUri = Uri.parse("https://example.com"); + when(getInitialUri()).thenAnswer((_) async => testUri); + + // Wait for the initial URI to be handled + await tester.pumpAndSettle(); + + // Verify that the user log in is not handled + expect(find.text("User logged in"), findsNothing); +} + +Future testWidgets6(WidgetTester tester) async { + await tester.pumpWidget(createSplashScreenLight()); + await tester.pumpAndSettle(); + + // Mock the userConfig.userLoggedIn() to return true + when(userConfig.userLoggedIn()).thenAnswer((_) async => true); + + // Wait for the user log in to be handled + await tester.pumpAndSettle(); + + // Verify that the user log in is handled correctly + expect(find.text("User logged in"), findsOneWidget); +} diff --git a/test/widget_tests/pre_auth_screens/waiting_page_test.dart b/test/widget_tests/pre_auth_screens/waiting_page_test.dart new file mode 100644 index 000000000..2d945e41c --- /dev/null +++ b/test/widget_tests/pre_auth_screens/waiting_page_test.dart @@ -0,0 +1,202 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +// import 'dart:io'; + +import 'package:flutter/material.dart'; +// import 'package:flutter/services.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: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/services/navigation_service.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/views/pre_auth_screens/waiting_screen.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; +import 'package:talawa/widgets/rich_text.dart'; + +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_locator.dart'; + +Widget createWaitingScreenLight({ThemeMode themeMode = ThemeMode.light}) => + 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 WaitingPage(key: Key('WaitingPage')), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + +Widget createWaitingScreenDark({ThemeMode themeMode = ThemeMode.dark}) => + MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + key: const Key('Root'), + themeMode: themeMode, + theme: TalawaTheme.darkTheme, + home: const WaitingPage(key: Key('WaitingPage')), + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + ); + +Future main() async { + TestWidgetsFlutterBinding.ensureInitialized(); + // const testMockStorage = './test/fixtures/core'; + // const channel = MethodChannel( + // 'plugins.flutter.io/path_provider', + // ); + // channel.setMockMethodCallHandler((MethodCall methodCall) async { + // return testMockStorage; + // }); //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'); + setUp(() { + registerServices(); + registerViewModels(); + locator().test(); + }); + tearDown(() { + unregisterServices(); + unregisterViewModels(); + }); + + group('Waiting Screen Widget Test in light mode', () { + testWidgets("Testing if Select Language Screen shows up", (tester) async { + await tester.pumpWidget(createWaitingScreenLight()); + await tester.pumpAndSettle(); + final screenScaffoldWidget = find.byKey( + const Key('WaitingPageScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.lightTheme.scaffoldBackgroundColor, + ); + }); + }); + group('Waiting Screen Widget Test in dark mode', () { + testWidgets("Testing if Select Language Screen shows up", (tester) async { + await tester.pumpWidget(createWaitingScreenDark()); + await tester.pumpAndSettle(); + // finding scaffold is present + final screenScaffoldWidget = find.byKey( + const Key('WaitingPageScaffold'), + ); + expect(screenScaffoldWidget, findsOneWidget); + expect( + (tester.firstWidget(find.byKey(const Key('Root'))) as MaterialApp) + .theme! + .scaffoldBackgroundColor, + TalawaTheme.darkTheme.scaffoldBackgroundColor, + ); + }); + }); + group('Testing for greeting text', () { + testWidgets("Testing if greeting text shows up", (tester) async { + await tester.pumpWidget(createWaitingScreenLight()); + await tester.pumpAndSettle(); + //initializing the custom rich text widget Finder + final customRichTextWidget = find.byKey( + const Key('WaitingPageText'), + ); + + //initializing the greeting text + final greeting = [ + { + 'text': "Please wait", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + { + 'text': " Test ", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .titleLarge! + .copyWith(fontSize: 24), + }, + { + 'text': "for organisation(s) to accept your invitation.", + 'textStyle': Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall, + }, + ]; + + //finding the custom rich text widget + expect(customRichTextWidget, findsOneWidget); + + //testing greeting text + expect( + (tester.firstWidget(customRichTextWidget) as CustomRichText).words, + greeting, + ); + }); + }); + group('Testing for pending request list', () { + testWidgets("Testing pending membership request list", (tester) async { + await tester.pumpWidget(createWaitingScreenLight()); + await tester.pumpAndSettle(); + //initializing the custom rich text widget Finder + final pendingRequestList = find.byKey( + const Key('PendingRequestList'), + ); + //initializing the custom rich text widget Finder + final pendingItem = find.byKey( + const Key('WaitingJoin'), + ); + + //finding the custom rich text widget + expect(pendingRequestList, findsOneWidget); + + //testing greeting text + expect(pendingItem, findsNWidgets(2)); + await tester.tap(pendingRequestList); + await tester.pumpAndSettle(); + }); + }); + group('Testing for join org button', () { + testWidgets("Testing Join org button", (tester) async { + await tester.pumpWidget(createWaitingScreenLight()); + await tester.pumpAndSettle(); + //initializing the join org button widget Finder + final joinOrgButton = find.byKey( + const Key('JoinOrg'), + ); + + //finding the join org button widget + expect(joinOrgButton, findsOneWidget); + + //testing greeting text + final RaisedRoundedButton joinButton = + tester.firstWidget(joinOrgButton) as RaisedRoundedButton; + await tester.pump(const Duration(milliseconds: 100)); + expect(joinButton.buttonLabel, "Join Organisation"); + }); + }); +} diff --git a/test/widget_tests/widgets/custom_alert_dialog_test.dart b/test/widget_tests/widgets/custom_alert_dialog_test.dart new file mode 100644 index 000000000..754b15650 --- /dev/null +++ b/test/widget_tests/widgets/custom_alert_dialog_test.dart @@ -0,0 +1,135 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.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/widgets/custom_alert_dialog.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; + +import '../../helpers/test_locator.dart'; + +bool success = false; +bool cancelled = false; + +void onSuccess() { + success = true; +} + +void onCancel() { + cancelled = true; +} + +Widget createCustomAlertDialog({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, +}) { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: TextButton( + child: const Text('Open'), + onPressed: () { + navigationService.pushDialog( + CustomAlertDialog( + success: onSuccess, + secondaryButtonTap: passSecondaryFunc ? onCancel : null, + dialogSubTitle: 'Yes Boi', + reverse: reverse, + ), + ); + }, + ), + ), + ); +} + +void main() { + SizeConfig().test(); + testSetupLocator(); + group('Test for CustomAlertDialog', () { + testWidgets('Check if the AlertDialog shows up', (tester) async { + await tester.pumpWidget(createCustomAlertDialog()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(AlertDialog), findsOneWidget); + }); + + testWidgets('Check for the RaisedRoundedButtons', (tester) async { + await tester.pumpWidget(createCustomAlertDialog()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(RaisedRoundedButton), findsNWidgets(2)); + }); + + testWidgets('Check if the Confirm button works', (tester) async { + await tester.pumpWidget(createCustomAlertDialog()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + final buttonFinder = find.byType(RaisedRoundedButton); + + await tester.tap(buttonFinder.last); + await tester.pump(); + + expect(success, true); + }); + + testWidgets('Check if the Cancel button works (with secondary func)', + (tester) async { + await tester.pumpWidget(createCustomAlertDialog()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + final buttonFinder = find.byType(RaisedRoundedButton); + + await tester.tap(buttonFinder.first); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(AlertDialog), findsOneWidget); + }); + + testWidgets('Check if the Cancel button works (without secondary func)', + (tester) async { + await tester + .pumpWidget(createCustomAlertDialog(passSecondaryFunc: false)); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + final buttonFinder = find.byType(RaisedRoundedButton); + + await tester.tap(buttonFinder.first); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(AlertDialog), findsNothing); + }); + }); +} diff --git a/test/widget_tests/widgets/custom_avatar_test.dart b/test/widget_tests/widgets/custom_avatar_test.dart new file mode 100644 index 000000000..79419bf51 --- /dev/null +++ b/test/widget_tests/widgets/custom_avatar_test.dart @@ -0,0 +1,330 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:shimmer/shimmer.dart'; +import 'package:talawa/widgets/custom_avatar.dart'; + +/// main function. +/// +/// **params**: +/// None +/// +/// **returns**: +/// None +void main() { + group('CustomAvatar', () { + testWidgets('renders correctly when image is not null', + (WidgetTester tester) async { + await tester.pumpWidget( + const MaterialApp( + home: CustomAvatar( + isImageNull: false, + imageUrl: 'https://example.com/image.jpg', + firstAlphabet: 'A', + fontSize: 40, + maxRadius: 16, + ), + ), + ); + + expect(find.byType(CachedNetworkImage), findsOneWidget); + }); + + testWidgets('renders correctly when image is null', + (WidgetTester tester) async { + await tester.pumpWidget( + const MaterialApp( + home: CustomAvatar( + isImageNull: true, + firstAlphabet: 'A', + fontSize: 40, + maxRadius: 16, + ), + ), + ); + + expect(find.text('A'), findsOneWidget); + }); + + testWidgets('renders correctly with default fontSize and maxRadius', + (WidgetTester tester) async { + await tester.pumpWidget( + const MaterialApp( + home: CustomAvatar( + isImageNull: true, + firstAlphabet: 'A', + ), + ), + ); + + final textFinder = find.text('A'); + final textWidget = tester.widget(textFinder); + expect(textWidget.style!.fontSize, 40); + + final circleAvatarFinder = find.byType(CircleAvatar); + final circleAvatarWidget = + tester.widget(circleAvatarFinder); + expect(circleAvatarWidget.maxRadius, 16); + }); + }); + + testWidgets( + 'CircularAvatar with error icon is shown when image fails to load', + (widgetTester) async { + await widgetTester.pumpWidget( + const MaterialApp( + home: CustomAvatar( + isImageNull: false, + imageUrl: ' ', + firstAlphabet: 'A', + fontSize: 40, + maxRadius: 16, + ), + ), + ); + + await widgetTester.pump(const Duration(seconds: 5)); + + expect( + find.byWidgetPredicate( + (widget) => + widget is CachedNetworkImage && + widget.errorWidget != null && + widget.errorWidget is Function && + widget.errorWidget!( + widgetTester.binding.rootElement!, + '', + Exception(), + ) is CircleAvatar && + (widget.errorWidget!( + widgetTester.binding.rootElement!, + '', + Exception(), + ) as CircleAvatar) + .child is Icon && + ((widget.errorWidget!( + widgetTester.binding.rootElement!, + '', + Exception(), + ) as CircleAvatar) + .child as Icon?) + ?.icon == + Icons.error, + ), + findsOneWidget, + ); + }); + testWidgets('renders correctly when image is null and checks for theme color', + (WidgetTester tester) async { + await tester.pumpWidget( + const MaterialApp( + home: CustomAvatar( + isImageNull: true, + firstAlphabet: 'A', + fontSize: 40, + maxRadius: 16, + ), + ), + ); + + final circleAvatarFinder = find.byType(CircleAvatar); + final circleAvatarWidget = tester.widget(circleAvatarFinder); + expect( + circleAvatarWidget.backgroundColor, + Theme.of(tester.element(circleAvatarFinder)) + .iconTheme + .color! + .withOpacity(0.2), + ); + }); + + testWidgets( + 'renders correctly when image is not null and checks for theme color', + (WidgetTester tester) async { + await tester.pumpWidget( + const MaterialApp( + home: CustomAvatar( + isImageNull: false, + imageUrl: 'https://example.com/image.jpg', + firstAlphabet: 'A', + fontSize: 40, + maxRadius: 16, + ), + ), + ); + + final cachedNetworkImageFinder = find.byType(CachedNetworkImage); + final cachedNetworkImageWidget = + tester.widget(cachedNetworkImageFinder); + expect(cachedNetworkImageWidget.imageUrl, 'https://example.com/image.jpg'); + }); + + testWidgets('renders placeholder correctly when image is loading', + (WidgetTester tester) async { + await tester.pumpWidget( + const MaterialApp( + home: CustomAvatar( + isImageNull: false, + imageUrl: 'https://example.com/image.jpg', + firstAlphabet: 'A', + fontSize: 40, + maxRadius: 16, + ), + ), + ); + + await tester.pump(Duration.zero); // Start loading image + + expect(find.byType(Shimmer), findsOneWidget); + }); + + testWidgets('CircleAvatar is shown when image fails to load', + (widgetTester) async { + await widgetTester.pumpWidget( + const MaterialApp( + home: CustomAvatar( + isImageNull: false, + imageUrl: ' ', + firstAlphabet: 'A', + fontSize: 40, + maxRadius: 16, + ), + ), + ); + + await widgetTester.pump(const Duration(seconds: 5)); + + expect( + find.byWidgetPredicate( + (widget) => + widget is CachedNetworkImage && + widget.errorWidget != null && + widget.errorWidget is Function && + widget.errorWidget!( + widgetTester.binding.rootElement!, + '', + Exception(), + ) is CircleAvatar, + ), + findsOneWidget, + ); + }); + testWidgets('CircleAvatar in image builder is shown', (widgetTester) async { + await widgetTester.pumpWidget( + const MaterialApp( + home: CustomAvatar( + isImageNull: false, + imageUrl: ' ', + firstAlphabet: 'A', + fontSize: 40, + maxRadius: 16, + ), + ), + ); + + await widgetTester.pump(const Duration(seconds: 5)); + + expect( + find.byWidgetPredicate( + (widget) => + widget is CachedNetworkImage && + widget.imageBuilder != null && + widget.imageBuilder is Function && + widget.imageBuilder!( + widgetTester.binding.rootElement!, + const NetworkImage( + 'https://imgs.search.brave.com/OHazbRf4oO5wuydAbr6061fUGuEw-rlDB1SuXWnJgTo/rs:fit:500:0:0/g:ce/aHR0cHM6Ly9pLnBp/bmltZy5jb20vb3Jp/Z2luYWxzLzZiLzIy/L2JhLzZiMjJiYTg2/Yzk3NjBiMzQ4YjNh/NTMzOGFjMzI4ZmJm/LmpwZw', + ), + ) is CircleAvatar, + ), + findsOneWidget, + ); + }); + + testWidgets('CircleAvatar in image builder is shown with correct image', + (widgetTester) async { + await widgetTester.pumpWidget( + const MaterialApp( + home: CustomAvatar( + isImageNull: false, + imageUrl: ' ', + firstAlphabet: 'A', + fontSize: 40, + maxRadius: 16, + ), + ), + ); + + await widgetTester.pump(const Duration(seconds: 5)); + + expect( + find.byWidgetPredicate( + (widget) => + widget is CachedNetworkImage && + widget.imageBuilder != null && + widget.imageBuilder is Function && + widget.imageBuilder!( + widgetTester.binding.rootElement!, + const NetworkImage( + 'https://imgs.search.brave.com/OHazbRf4oO5wuydAbr6061fUGuEw-rlDB1SuXWnJgTo/rs:fit:500:0:0/g:ce/aHR0cHM6Ly9pLnBp/bmltZy5jb20vb3Jp/Z2luYWxzLzZiLzIy/L2JhLzZiMjJiYTg2/Yzk3NjBiMzQ4YjNh/NTMzOGFjMzI4ZmJm/LmpwZw', + ), + ) is CircleAvatar && + (widget.imageBuilder!( + widgetTester.binding.rootElement!, + const NetworkImage( + 'https://imgs.search.brave.com/OHazbRf4oO5wuydAbr6061fUGuEw-rlDB1SuXWnJgTo/rs:fit:500:0:0/g:ce/aHR0cHM6Ly9pLnBp/bmltZy5jb20vb3Jp/Z2luYWxzLzZiLzIy/L2JhLzZiMjJiYTg2/Yzk3NjBiMzQ4YjNh/NTMzOGFjMzI4ZmJm/LmpwZw', + ), + ) as CircleAvatar) + .backgroundImage == + const NetworkImage( + 'https://imgs.search.brave.com/OHazbRf4oO5wuydAbr6061fUGuEw-rlDB1SuXWnJgTo/rs:fit:500:0:0/g:ce/aHR0cHM6Ly9pLnBp/bmltZy5jb20vb3Jp/Z2luYWxzLzZiLzIy/L2JhLzZiMjJiYTg2/Yzk3NjBiMzQ4YjNh/NTMzOGFjMzI4ZmJm/LmpwZw', + ), + ), + findsOneWidget, + ); + }); + + testWidgets('CircleAvatar in image builder is shown with correct theme', + (widgetTester) async { + await widgetTester.pumpWidget( + const MaterialApp( + home: CustomAvatar( + isImageNull: false, + imageUrl: ' ', + firstAlphabet: 'A', + fontSize: 40, + maxRadius: 16, + ), + ), + ); + + await widgetTester.pump(const Duration(seconds: 5)); + + expect( + find.byWidgetPredicate( + (widget) => + widget is CachedNetworkImage && + widget.imageBuilder != null && + widget.imageBuilder is Function && + widget.imageBuilder!( + widgetTester.binding.rootElement!, + const NetworkImage( + 'https://imgs.search.brave.com/OHazbRf4oO5wuydAbr6061fUGuEw-rlDB1SuXWnJgTo/rs:fit:500:0:0/g:ce/aHR0cHM6Ly9pLnBp/bmltZy5jb20vb3Jp/Z2luYWxzLzZiLzIy/L2JhLzZiMjJiYTg2/Yzk3NjBiMzQ4YjNh/NTMzOGFjMzI4ZmJm/LmpwZw', + ), + ) is CircleAvatar && + (widget.imageBuilder!( + widgetTester.binding.rootElement!, + const NetworkImage( + 'https://imgs.search.brave.com/OHazbRf4oO5wuydAbr6061fUGuEw-rlDB1SuXWnJgTo/rs:fit:500:0:0/g:ce/aHR0cHM6Ly9pLnBp/bmltZy5jb20vb3Jp/Z2luYWxzLzZiLzIy/L2JhLzZiMjJiYTg2/Yzk3NjBiMzQ4YjNh/NTMzOGFjMzI4ZmJm/LmpwZw', + ), + ) as CircleAvatar) + .backgroundColor == + Theme.of(widgetTester.binding.rootElement!) + .iconTheme + .color! + .withOpacity(0.2), + ), + findsOneWidget, + ); + }); +} diff --git a/test/widget_tests/widgets/custom_drawer_test.dart b/test/widget_tests/widgets/custom_drawer_test.dart new file mode 100644 index 000000000..08e6f9e11 --- /dev/null +++ b/test/widget_tests/widgets/custom_drawer_test.dart @@ -0,0 +1,317 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +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:mockito/mockito.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/constants/routing_constants.dart'; +import 'package:talawa/models/mainscreen_navigation_args.dart'; +import 'package:talawa/models/organization/org_info.dart'; +import 'package:talawa/models/user/user_info.dart'; +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/main_screen_view_model.dart'; +import 'package:talawa/view_model/widgets_view_models/custom_drawer_view_model.dart'; +// import 'package:talawa/view_model/main_screen_view_model.dart'; +import 'package:talawa/views/main_screen.dart'; +import 'package:talawa/widgets/custom_alert_dialog.dart'; +// import 'package:talawa/widgets/custom_alert_dialog.dart'; +import '../../helpers/test_helpers.dart'; +// import '../../helpers/test_helpers.mocks.dart'; +import '../../helpers/test_locator.dart'; + +class MockBuildContext extends Mock implements BuildContext {} + +bool _switchOrgcalled = false; + +class MockCustomDrawerViewModel extends Mock implements CustomDrawerViewModel { + final _scrollController = ScrollController(); + @override + ScrollController get controller => _scrollController; + @override + List get switchAbleOrg { + print("hi"); + return [OrgInfo(id: 'test1', name: 'name')]; + } + + @override + OrgInfo get selectedOrg => OrgInfo(id: 'test1', name: 'name'); + @override + void switchOrg(OrgInfo orginfo) { + _switchOrgcalled = true; + } +} + +class MockScrollController extends Mock implements ScrollController { + @override + ScrollPosition get position => MockScrollPosition(); +} + +class MockScrollPosition extends Mock implements ScrollPosition {} + +Widget createHomePageScreen({required bool demoMode}) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + themeMode: ThemeMode.light, + theme: TalawaTheme.lightTheme, + home: MainScreen( + key: const Key('MainScreen'), + mainScreenArgs: MainScreenArgs( + mainScreenIndex: 0, + fromSignUp: false, + toggleDemoMode: demoMode, + ), + ), + ); +} + +void main() async { + testSetupLocator(); + + setUp(() { + registerServices(); + locator().test(); + locator().test(); + }); + + final Directory dir = Directory('test/fixtures/core'); + + Hive + ..init(dir.path) + ..registerAdapter(UserAdapter()) + ..registerAdapter(OrgInfoAdapter()); + + await Hive.openBox('currentUser'); + await Hive.openBox('currentOrg'); + + await Hive.openBox('pluginBox'); + await Hive.openBox('url'); + + group('Exit Button', () { + testWidgets("Tapping Tests for Exit", (tester) async { + final customDrawerViewModel = CustomDrawerViewModel(); + + final Widget buildAlertDialog = MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + themeMode: ThemeMode.light, + theme: TalawaTheme.lightTheme, + home: customDrawerViewModel.exitAlertDialog(), + ); + + await tester.pumpWidget(buildAlertDialog); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + final exitDialog = find.byKey(const Key("Exit?")); + await tester.tap(find.text('Exit')); + + expect(exitDialog, findsOneWidget); + }); + }); + + group('Test Organization action Buttons', () { + testWidgets('Test Join Organization Button when user not logged in.', + (tester) async { + await tester.pumpWidget(createHomePageScreen(demoMode: true)); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + // if user not logged in + when(userConfig.loggedIn).thenReturn(false); + + MainScreenViewModel.scaffoldKey.currentState?.openDrawer(); + await tester.pumpAndSettle(); + + expect(find.byKey(const Key('Drawer')), findsOneWidget); + + final buttonFinder = find.byKey(MainScreenViewModel.keyDrawerJoinOrg); + + await tester.tap(buttonFinder); + await tester.pumpAndSettle(); + + when( + navigationService.popAndPushScreen( + Routes.setUrlScreen, + arguments: '', + ), + ).thenAnswer((_) async {}); + + verify( + navigationService.popAndPushScreen( + Routes.setUrlScreen, + arguments: '', + ), + ); + }); + + testWidgets('Test leave current Organization Button.', (tester) async { + await tester.pumpWidget(createHomePageScreen(demoMode: true)); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + // if user not logged in + when(userConfig.loggedIn).thenReturn(true); + + MainScreenViewModel.scaffoldKey.currentState?.openDrawer(); + await tester.pumpAndSettle(); + + expect(find.byKey(const Key('Drawer')), findsOneWidget); + + final buttonFinder = find.byKey( + MainScreenViewModel.keyDrawerLeaveCurrentOrg, + ); + + final tmp = CustomAlertDialog( + key: const Key("Exit?"), + reverse: true, + dialogSubTitle: 'Are you sure you want to exit this organization?', + successText: 'Exit', + success: () { + //Exit org + }, + ); + + when( + navigationService.pushDialog(tmp), + ).thenAnswer((realInvocation) async {}); + + await tester.ensureVisible(buttonFinder); + await tester.pumpAndSettle(); + + await tester.tap(buttonFinder); + await tester.pumpAndSettle(); + + verifyNever(navigationService.pushDialog(tmp)).called(0); + // expect(find.text('Exit'), findsOneWidget); + }); + + testWidgets('Test Join Organization Button when user logged in.', + (tester) async { + await tester.pumpWidget(createHomePageScreen(demoMode: true)); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + // if user not logged in + when(userConfig.loggedIn).thenReturn(true); + + MainScreenViewModel.scaffoldKey.currentState?.openDrawer(); + await tester.pumpAndSettle(); + + final buttonFinder = find.byKey(MainScreenViewModel.keyDrawerJoinOrg); + + await tester.tap(buttonFinder); + await tester.pumpAndSettle(); + + when( + navigationService.popAndPushScreen( + Routes.joinOrg, + arguments: '-1', + ), + ).thenAnswer((_) async {}); + + verify( + navigationService.popAndPushScreen( + Routes.joinOrg, + arguments: '-1', + ), + ); + }); + + testWidgets('Test Switch org list.', (tester) async { + await tester.pumpWidget(createHomePageScreen(demoMode: true)); + await tester.pumpAndSettle(const Duration(seconds: 1)); + + locator.unregister(); + + locator.registerSingleton( + MockCustomDrawerViewModel(), + ); + + // if user not logged in + when(userConfig.loggedIn).thenReturn(false); + + MainScreenViewModel.scaffoldKey.currentState?.openDrawer(); + await tester.pumpAndSettle(); + + expect(find.byKey(const Key('Switching Org')), findsOneWidget); + + final buttonFinder = find.byKey(const Key('Org')); + + await tester.tap(buttonFinder); + + expect(_switchOrgcalled, true); + }); + }); + + group('Custom Drawer Test', () { + /*testWidgets("Widget Testing", (tester) async { + // pumping the Widget + await tester.pumpWidget(createHomePageScreen()); + await tester.pumpAndSettle(); + // Opening the Drawer so that it can be loaded in the widget tree and built() is called + await tester.dragFrom( + tester.getTopLeft(find.byType(MaterialApp)), const Offset(300, 0)); + await tester.pumpAndSettle(); + // getting the Finders for Code Coverage + expect(find.byKey(const ValueKey("Drawer")), findsOneWidget); + expect(find.byKey(const ValueKey("Custom Drawer")), findsOneWidget); + expect(find.text("Selected Organization"), findsOneWidget); + expect(find.text("Switch Organization"), findsOneWidget); + final listOfOrgs = find.byKey(const ValueKey("Switching Org")); + expect(listOfOrgs, findsOneWidget); + expect(find.byKey(MainScreenViewModel.keyDrawerCurOrg), findsOneWidget); + expect(find.byKey(MainScreenViewModel.keyDrawerSwitchableOrg), + findsOneWidget); + expect(find.byType(UserAccountsDrawerHeader), findsOneWidget); + expect(find.text("Join new Organization"), findsOneWidget); + expect(find.text("Leave Current Organization"), findsOneWidget); + final fromPalisadoes = find.byKey(const ValueKey("From Palisadoes")); + expect(fromPalisadoes, findsOneWidget); + }); + testWidgets("Tapping Tests for Org", (tester) async { + await tester.pumpWidget(createHomePageScreen()); + await tester.pumpAndSettle(); + // Opening the Drawer so that it can be loaded in the widget tree and built() is called + await tester.dragFrom( + tester.getTopLeft(find.byType(MaterialApp)), const Offset(300, 0)); + await tester.pumpAndSettle(); + final orgs = find.byKey(const ValueKey("Org")); + // Atleast One Org should be there + // ignore: invalid_use_of_protected_member + expect(orgs.allCandidates.isEmpty, false); + await tester.tap(orgs.first); + // Was not required but done for code Coverage + // Sized + final sizedbox = find.byKey(const ValueKey("Sized Box Drawer")); + // ignore: invalid_use_of_protected_member + expect(sizedbox.allCandidates.isEmpty, false); + }); + testWidgets("Tapping Tests for Join", (tester) async { + await tester.pumpWidget(createHomePageScreen()); + await tester.pumpAndSettle(); + tester.binding.window.physicalSizeTestValue = const Size(800, 4000); + MainScreenViewModel.scaffoldKey.currentState?.openDrawer(); + await tester.pumpAndSettle(); + final joinOrg = find.byKey(MainScreenViewModel.keyDrawerJoinOrg); + await tester.tap(joinOrg); + // await tester.pumpAndSettle(); + });*/ + }); + + tearDown(() { + unregisterServices(); + }); +} diff --git a/test/widget_tests/widgets/custom_list_tile_test.dart b/test/widget_tests/widgets/custom_list_tile_test.dart new file mode 100644 index 000000000..dfc781cf8 --- /dev/null +++ b/test/widget_tests/widgets/custom_list_tile_test.dart @@ -0,0 +1,384 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.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/organization/org_info_address.dart'; +import 'package:talawa/models/user/user_info.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/widgets/custom_avatar.dart'; +import 'package:talawa/widgets/custom_list_tile.dart'; + +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_locator.dart'; + +TileType _tileType = TileType.org; +OrgInfo _orgInfo = OrgInfo(); +const Key _key = Key('CustomListTileKey'); +int _index = 0; +Options _option = Options( + icon: const Icon(Icons.add), + title: 'Test', + subtitle: 'Just a test', +); +bool _showIcon = false; +User _userInfo = User(); + +// ignore: prefer_function_declarations_over_variables +dynamic Function(OrgInfo)? _onTapOrgInfo = (OrgInfo orgInfo) => true; + +// ignore: prefer_function_declarations_over_variables +void Function()? _onTapOption = () => {}; + +// ignore: prefer_function_declarations_over_variables +dynamic Function()? _onTapUserInfo = () => {}; + +Widget _createCustomListTile() { + return MaterialApp( + navigatorKey: navigationService.navigatorKey, + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: CustomListTile( + key: _key, + index: _index, + type: _tileType, + option: _option, + showIcon: _showIcon, + onTapOrgInfo: _onTapOrgInfo, + onTapOption: _onTapOption, + userInfo: _userInfo, + orgInfo: _orgInfo, + onTapUserInfo: _onTapUserInfo, + ), + ), + ); +} + +void main() { + SizeConfig().test(); + setUp(() async { + _tileType = TileType.org; + _orgInfo = OrgInfo(); + _index = 0; + _option = Options( + icon: const Icon(Icons.add), + title: 'Test', + subtitle: 'Just a test', + ); + _showIcon = false; + _onTapOrgInfo = (OrgInfo orgInfo) => true; + + _userInfo = User(); + _onTapOption = () => {}; + _onTapUserInfo = () => {}; + registerServices(); + }); + tearDown(() { + unregisterServices(); + }); + group('Custom list tile test', () { + testWidgets("Test type is org ", (WidgetTester tester) async { + bool executed = false; + _orgInfo = OrgInfo( + name: 'Test Name', + userRegistrationRequired: false, + creatorInfo: User( + firstName: 'Test firstname', + lastName: 'Test lastname', + ), + address: Address( + city: 'Test City', + countryCode: 'TC', + ), + ); + _onTapOrgInfo = (OrgInfo orgInfo) { + executed = true; + }; + _tileType = TileType.org; + await tester.pumpWidget(_createCustomListTile()); + await tester.pumpAndSettle(); + + // test to see if custom list tile widget shows up + expect(find.byKey(_key), findsOneWidget); + + // test to see if onTap of Inkwell works + await tester.tap(find.byType(InkWell)); + await tester.pump(); + expect(executed, true); + + // test to check that there is no icon + expect(find.byIcon(Icons.add), findsNothing); + + // Testing Rich Text for org name and address shows up + final orgName = find.byKey(const Key('OrgNamewithOrgAddress')); + + expect(orgName, findsOneWidget); + + // Test for icon when is public is true + expect(find.byIcon(Icons.lock_open), findsOneWidget); + + final iconFinder = find.descendant( + of: find.byType(Expanded).at(1), + matching: find.byType(Icon), + ); + final iconWidget = tester.firstWidget(iconFinder) as Icon; + + expect(iconWidget.color, const Color(0xFF34AD64)); + + // Test for sized box when showIcon is false + final sizedBoxFinder = find + .descendant( + of: find.byType(Expanded).at(1), + matching: find.byType(SizedBox), + ) + .at(0); + expect(sizedBoxFinder, findsOneWidget); + }); + + testWidgets("Test for orgs when is Public is false ", + (WidgetTester tester) async { + _orgInfo = OrgInfo( + name: 'Test Name', + userRegistrationRequired: true, + creatorInfo: User( + firstName: 'Test firstname', + lastName: 'Test lastname', + ), + ); + _tileType = TileType.org; + + await tester.pumpWidget(_createCustomListTile()); + await tester.pumpAndSettle(); + + // Test for is public display + expect( + find.text( + AppLocalizations.of(navigationService.navigatorKey.currentContext!)! + .strictTranslate('Private'), + ), + findsNothing, + ); + + // Test for icon when is public is false + expect(find.byIcon(Icons.lock), findsOneWidget); + + final iconFinder = find.descendant( + of: find.byType(Expanded).at(1), + matching: find.byType(Icon), + ); + final iconWidget = tester.firstWidget(iconFinder) as Icon; + + expect(iconWidget.color, const Color(0xffFABC57)); + }); + + testWidgets("Test when type is user ", (WidgetTester tester) async { + bool executed = false; + _tileType = TileType.user; + _userInfo = User( + firstName: 'Test firstname', + lastName: 'Test lastname', + ); + _onTapUserInfo = () => {executed = true}; + await tester.pumpWidget(_createCustomListTile()); + await tester.pumpAndSettle(); + + // test to see if custom list tile widget shows up + expect(find.byKey(_key), findsOneWidget); + + // test to see if onTap of Inkwell works + await tester.tap(find.byType(InkWell)); + await tester.pump(); + expect(executed, true); + + // test to check that there is a custom avatar + // expect(find.byType(CustomAvatar), findsOneWidget); + + // test to check that there is no icon + expect(find.byIcon(Icons.add), findsNothing); + + // test the properties passed to CustomAvatar + // final customAvatarFinder = find.byType(CustomAvatar); + // final customAvatarWidget = + // tester.firstWidget(customAvatarFinder) as CustomAvatar; + // expect(customAvatarWidget.isImageNull, true); + // expect(customAvatarWidget.imageUrl, null); + // expect(customAvatarWidget.firstAlphabet, 'T'); + + // Testing Text for that contains user's name + final userNameFinder = find + .descendant( + of: find.byType(Expanded).at(0), + matching: find.byType(Text), + ) + .first; + + final userNameWidget = tester.firstWidget(userNameFinder) as Text; + + expect(userNameWidget.data, 'Test firstname Test lastname'); + // expect( + // userNameWidget.style, + // Theme.of(navigationService.navigatorKey.currentContext!) + // .textTheme + // .titleLarge, + // ); + + // Testing SizedBox for users fallback for creater info + // final userSizedBoxFallback = find + // .descendant( + // of: find.byType(Expanded).at(0), + // matching: find.byType(SizedBox), + // ) + // .first; + + // expect(userSizedBoxFallback, findsOneWidget); + + // Testing SizedBox for users fallback for userRegistrationRequired info + // final userSizedBoxFallback1 = find + // .descendant( + // of: find.byType(Expanded).at(1), + // matching: find.byType(SizedBox), + // ) + // .first; + // + // expect(userSizedBoxFallback1, findsOneWidget); + }); + testWidgets("Test when type is option", (WidgetTester tester) async { + bool executed = false; + _tileType = TileType.option; + _onTapOption = () => executed = true; + await tester.pumpWidget(_createCustomListTile()); + await tester.pumpAndSettle(); + + // test to see if custom list tile widget shows up + expect(find.byKey(_key), findsOneWidget); + + // test to see if onTap of Inkwell works + await tester.ensureVisible(find.byType(InkWell)); + await tester.tap(find.byType(InkWell)); + await tester.pump(); + expect(executed, true); + + // test to check that there is no custom avatar + expect(find.byType(CustomAvatar), findsNothing); + + // test to check that there is an icon + // expect(find.byIcon(Icons.add), findsOneWidget); + + // Testing Text that contains option's title + final optionTitleFinder = find + .descendant( + of: find.byType(Expanded).at(0), + matching: find.byType(Text), + ) + .first; + + final optionTitleWidget = tester.firstWidget(optionTitleFinder) as Text; + + expect(optionTitleWidget.data, 'Test'); + expect( + optionTitleWidget.style, + Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .bodyMedium + ?.copyWith(fontSize: 18, color: Colors.black), + ); + + // Testing Text that contains option's subtitle + final optionSubtitleFinder = find + .descendant( + of: find.byType(Expanded).at(0), + matching: find.byType(Text), + ) + .at(0); + + final optionSubtitleWidget = + tester.firstWidget(optionSubtitleFinder) as Text; + + expect(optionSubtitleWidget.data, 'Test'); + expect( + optionSubtitleWidget.style, + Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .bodyMedium + ?.copyWith( + color: Colors.black, + fontSize: 18, + ), + ); + + // Testing SizedBox for option when trailing icon button is null (fallback for creater info) + final optionSizedBoxFallback = find + .descendant( + of: find.byType(Expanded).at(1), + matching: find.byType(SizedBox), + ) + .first; + + expect(optionSizedBoxFallback, findsOneWidget); + }); + testWidgets("Test when option trailing icon button is not null", + (WidgetTester tester) async { + _tileType = TileType.option; + _option = Options( + icon: const Icon(Icons.add), + title: 'Test', + subtitle: 'Just a test', + trailingIconButton: IconButton( + icon: const Icon(Icons.send), + onPressed: () {}, + ), + ); + await tester.pumpWidget(_createCustomListTile()); + await tester.pumpAndSettle(); + + // Testing TextStyle that contains option's title + final optionTitleFinder = find + .descendant( + of: find.byType(Expanded).at(0), + matching: find.byType(Text), + ) + .first; + + final optionTitleWidget = tester.firstWidget(optionTitleFinder) as Text; + + expect( + optionTitleWidget.style, + Theme.of(navigationService.navigatorKey.currentContext!) + .textTheme + .headlineSmall! + .copyWith(fontSize: 18, color: Colors.black), + ); + + // Testing TextStyle that contains option's subtitle + // final optionSubtitleFinder = find + // .descendant( + // of: find.byType(Expanded).at(0), + // matching: find.byType(Text), + // ) + // .at(0); + + // final optionSubtitleWidget = + // tester.firstWidget(optionSubtitleFinder) as Text; + + // expect( + // optionSubtitleWidget.style, + // Theme.of(navigationService.navigatorKey.currentContext!) + // .textTheme + // .titleLarge?.copyWith(fontSize: 18, color: Colors.black,), + // ); + + // Test for checking if trailing icon button is shown + expect(find.byIcon(Icons.send), findsOneWidget); + }); + }); +} diff --git a/test/widget_tests/widgets/custom_progress_dialog_test.dart b/test/widget_tests/widgets/custom_progress_dialog_test.dart new file mode 100644 index 000000000..fe337fb3f --- /dev/null +++ b/test/widget_tests/widgets/custom_progress_dialog_test.dart @@ -0,0 +1,88 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:connectivity_plus/connectivity_plus.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/router.dart' as router; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/widgets/custom_progress_dialog.dart'; + +import '../../helpers/test_helpers.dart'; + +Widget createCustomProgressDialog() { + return MaterialApp( + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + home: const Scaffold( + body: SingleChildScrollView( + child: CustomProgressDialog( + key: Key('testing'), + ), + ), + ), + ); +} + +void main() { + SizeConfig().test(); + + setUp(() { + registerServices(); + registerViewModels(); + }); + + tearDown(() async { + unregisterViewModels(); + unregisterServices(); + }); + group('Test for CustomProgressDialog', () { + testWidgets( + 'Check if CustomProgressDialog widget shows up when connection available', + (tester) async { + // Setup connectivity for connection available + when(connectivity.checkConnectivity()) + .thenAnswer((_) async => ConnectivityResult.wifi); + + // Build the widget + await tester.pumpWidget(createCustomProgressDialog()); + await tester.pump(); + await tester.pump(); + + expect(find.byType(CupertinoActivityIndicator), findsOneWidget); + }); + testWidgets( + 'Check if CustomProgressDialog widget shows up when no connection', + (tester) async { + // Register navigation service + locator.unregister(); + locator.registerSingleton(NavigationService()); + + // Setup connectivity for connection not available + when(connectivity.checkConnectivity()) + .thenAnswer((_) async => ConnectivityResult.none); + + // Build the widget + await tester.pumpWidget(createCustomProgressDialog()); + await tester.pump(); + + expect(find.byType(Column), findsOneWidget); + expect(find.text("No Internet!"), findsOneWidget); + + // CustomProgressDialog should pop + await tester.pumpAndSettle(const Duration(seconds: 2)); + expect(find.byType(CustomProgressDialog), findsNothing); + }); + }); +} diff --git a/test/widget_tests/widgets/date_time_picker_test.dart b/test/widget_tests/widgets/date_time_picker_test.dart new file mode 100644 index 000000000..584e7b855 --- /dev/null +++ b/test/widget_tests/widgets/date_time_picker_test.dart @@ -0,0 +1,117 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/services/navigation_service.dart'; +import 'package:talawa/widgets/date_time_picker.dart'; + +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_locator.dart'; + +final chooseDate = DateTime(2020, 04, 03); +final cancelDate = DateTime(2017, 11, 16); +late DateTime testDate; + +const chooseTime = TimeOfDay(hour: 10, minute: 10); +const cancelTime = TimeOfDay(hour: 5, minute: 5); +late TimeOfDay testTime; + +Widget dateTimePicker({required dynamic checkProp, bool isTimeType = false}) { + return MaterialApp( + navigatorKey: locator().navigatorKey, + home: Scaffold( + body: Center( + child: ElevatedButton( + onPressed: () async { + if (isTimeType) { + testTime = + await customTimePicker(initialTime: checkProp as TimeOfDay); + } else { + testDate = + await customDatePicker(initialDate: checkProp as DateTime); + } + }, + child: const Text('Open'), + ), + ), + ), + ); +} + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + registerServices(); + + group('TimePicker tests', () { + testWidgets('Check if time picker shows up', (tester) async { + await tester.pumpWidget( + dateTimePicker(checkProp: TimeOfDay.now(), isTimeType: true), + ); + + await tester.tap(find.text('Open')); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TimePickerDialog), findsOneWidget); + }); + + testWidgets('Check if selecting a time works', (tester) async { + await tester + .pumpWidget(dateTimePicker(checkProp: chooseTime, isTimeType: true)); + + await tester.tap(find.text('Open')); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + await tester.tap(find.textContaining('OK')); + + expect(testTime, chooseTime); + }); + + testWidgets('Check if cancelling the time picker works', (tester) async { + await tester + .pumpWidget(dateTimePicker(checkProp: cancelTime, isTimeType: true)); + await tester.ensureVisible(find.text('Open')); + await tester.tap(find.text('Open')); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + await tester.tap(find.textContaining('Cancel')); + + expect(testTime, cancelTime); + }); + }); + + group('DatePicker tests', () { + testWidgets('Check if date picker shows up', (tester) async { + await tester.pumpWidget(dateTimePicker(checkProp: DateTime.now())); + + await tester.tap(find.text('Open')); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(DatePickerDialog), findsOneWidget); + }); + + testWidgets('Check if selecting a date works', (tester) async { + await tester.pumpWidget(dateTimePicker(checkProp: chooseDate)); + + await tester.tap(find.text('Open')); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + await tester.tap(find.textContaining('OK')); + + expect(testDate, chooseDate); + }); + + testWidgets('Check if cancelling the date picker works', (tester) async { + await tester.pumpWidget(dateTimePicker(checkProp: cancelDate)); + + await tester.tap(find.text('Open')); + await tester.pump(); + await tester.pump(const Duration(seconds: 1)); + await tester.tap(find.textContaining('Cancel')); + + expect(testDate, cancelDate); + }); + }); +} diff --git a/test/widget_tests/widgets/event_card_test.dart b/test/widget_tests/widgets/event_card_test.dart new file mode 100644 index 000000000..202d20e18 --- /dev/null +++ b/test/widget_tests/widgets/event_card_test.dart @@ -0,0 +1,198 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail_image_network/mocktail_image_network.dart'; +import 'package:talawa/models/events/event_model.dart'; +import 'package:talawa/models/user/user_info.dart'; + +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/widgets/event_card.dart'; + +import '../../helpers/test_locator.dart'; + +Event getEvent({bool? isRegistered, bool isPublic = false}) { + return Event( + title: "Testing", + location: "PyasePyasePyasePyasePyasePyase", + description: "Testing for the Event Card Widget", + startDate: "13 Dec", + endDate: "13 Dec", + startTime: "07:10PM", + endTime: "08:15PM", + isPublic: isPublic, + isRegistered: isRegistered, + attendees: [Attendee(id: "attendee1")], + creator: User(id: "ravidi"), + ); +} + +Widget createCustomEventCard( + Event event, { + bool isSearchItem = false, + String? eventTitleHighlightedText, +}) { + return MaterialApp( + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: EventCard( + key: const Key('event_card'), + event: event, + isSearchItem: isSearchItem, + eventTitleHighlightedText: eventTitleHighlightedText, + ), + ); +} + +void main() { + SizeConfig().test(); + testSetupLocator(); + + TestWidgetsFlutterBinding.ensureInitialized(); + + group("Test for EventCard widget", () { + testWidgets('Check if Event Card shows up', (tester) async { + mockNetworkImages(() async { + expect(find.byType(EventCard), findsNothing); + + await tester.pumpWidget(createCustomEventCard(getEvent())); + await tester.pump(); + + expect(find.byType(EventCard), findsOneWidget); + }); + }); + + testWidgets('Check for child(ren)', (tester) async { + mockNetworkImages(() async { + await tester.pumpWidget(createCustomEventCard(getEvent())); + await tester.pump(); + + expect( + find.descendant( + of: find.byType(EventCard), + matching: find.descendant( + of: find.byType(Padding), + matching: find.byType(Stack), + ), + ), + findsOneWidget, + ); + + expect( + find.descendant( + of: find.byType(Stack), + matching: find.byType(Card), + ), + findsOneWidget, + ); + + expect( + find.descendant( + of: find.byType(Stack), + matching: find.byType(Positioned), + ), + findsOneWidget, + ); + }); + }); + + testWidgets('Check for conditional widgets - false', (tester) async { + mockNetworkImages(() async { + const eventTitleHighlightedText = "ravidi"; + const eventTitle = "Testing"; + + await tester.pumpWidget( + createCustomEventCard( + getEvent(), + isSearchItem: false, + eventTitleHighlightedText: eventTitleHighlightedText, + ), + ); + await tester.pump(); + + expect( + find.descendant( + of: find.byType(Positioned), + matching: find.byType(DecoratedBox), + ), + findsNothing, + ); + expect(find.text("Registered"), findsNothing); + + expect( + find.text(eventTitleHighlightedText, findRichText: true), + findsNothing, + ); + expect(find.text(eventTitle), findsOneWidget); + expect(find.text('public'), findsNothing); + expect(find.text('private'), findsOneWidget); + }); + }); + + testWidgets('Check for conditional widgets - true', (tester) async { + mockNetworkImages(() async { + const eventTitleHighlightedText = "ravidi"; + const eventTitle = "Testing"; + + await tester.pumpWidget( + createCustomEventCard( + getEvent(isRegistered: true, isPublic: true), + isSearchItem: true, + eventTitleHighlightedText: eventTitleHighlightedText, + ), + ); + await tester.pump(); + + expect( + find.descendant( + of: find.byType(Positioned), + matching: find.byType(DecoratedBox), + ), + findsOneWidget, + ); + expect(find.text("Registered"), findsOneWidget); + + expect( + find.text(eventTitleHighlightedText, findRichText: true), + findsOneWidget, + ); + expect(find.text(eventTitle), findsNothing); + expect(find.text('public'), findsOneWidget); + expect(find.text('private'), findsNothing); + }); + }); + + testWidgets('Check for texts', (tester) async { + mockNetworkImages(() async { + await tester.pumpWidget(createCustomEventCard(getEvent())); + await tester.pump(); + + expect(find.text("13 Dec - 13 Dec"), findsOneWidget); // duration date + expect(find.text("07:10PM - 08:15PM"), findsOneWidget); // duration time + expect( + find.text("PyasePyasePyasePyase"), + findsOneWidget, + ); // trimmed location + expect( + find.text("Testing for the Event Card Widget"), + findsOneWidget, + ); // event description + expect(find.text("1"), findsOneWidget); + }); + }); + }); +} diff --git a/test/widget_tests/widgets/event_date_time_tile_test.dart b/test/widget_tests/widgets/event_date_time_tile_test.dart new file mode 100644 index 000000000..7e7291f70 --- /dev/null +++ b/test/widget_tests/widgets/event_date_time_tile_test.dart @@ -0,0 +1,154 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/widgets/event_date_time_tile.dart'; + +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_locator.dart'; + +class MockCallbackFunction extends Mock { + void call(); +} + +final setDateCallback = MockCallbackFunction(); +final setTimeCallback = MockCallbackFunction(); + +Widget createWidget() { + return MaterialApp( + home: Scaffold( + body: DateTimeTile( + date: "fakeDate", + time: "fakeTime", + setDate: setDateCallback, + setTime: setTimeCallback, + ), + ), + ); +} + +void main() { + testSetupLocator(); + locator().test(); + + setUp(() { + registerServices(); + locator().test(); + }); + + tearDown(() { + unregisterServices(); + }); + + group('Tests for DateTimeTile widget', () { + testWidgets('Checking if the widget shows up', (tester) async { + await tester.pumpWidget(createWidget()); + expect(find.byType(Container), findsWidgets); + }); + + testWidgets("Checking padding", (tester) async { + await tester.pumpWidget(createWidget()); + + final paddingFinder = find.byType(Padding); + final padding = tester.firstWidget(paddingFinder); + + expect(paddingFinder, findsOneWidget); + expect( + (padding as Padding).padding, + EdgeInsets.symmetric(horizontal: SizeConfig.screenWidth! * 0.083), + ); + }); + + testWidgets("Checking tap Inkwell for setDate", (tester) async { + await tester.pumpWidget(createWidget()); + + final inkwellFinder = find.byType(InkWell).first; + + await tester.tap(inkwellFinder); + await tester.pump(); + + expect(inkwellFinder, findsOneWidget); + + verify(setDateCallback()); + }); + + testWidgets("Checking tap Inkwell for setTime", (tester) async { + await tester.pumpWidget(createWidget()); + + final inkwellFinder = find.byType(InkWell).last; + + await tester.tap(inkwellFinder); + await tester.pump(); + + expect(inkwellFinder, findsOneWidget); + + verify(setTimeCallback()); + }); + + testWidgets("Testing the icons", (tester) async { + await tester.pumpWidget(createWidget()); + + final iconFinder = find.byType(Icon); + final icon = tester.firstWidget(iconFinder); + + expect( + (icon as Icon).color, + const Color(0xff524F4F), + ); + expect( + icon.size, + 19, + ); + expect( + icon.icon, + Icons.calendar_today, + ); + + final iconFinder2 = find.byType(Icon).last; + final icon2 = tester.firstWidget(iconFinder2); + + expect( + (icon2 as Icon).color, + const Color(0xff524F4F), + ); + expect( + icon2.size, + 19, + ); + expect( + icon2.icon, + Icons.schedule, + ); + }); + + testWidgets("Testing text widgets", (tester) async { + await tester.pumpWidget(createWidget()); + final textFinder = find.byType(Text).first; + final text = tester.firstWidget(textFinder); + + expect( + (text as Text).data, + "fakeDate", + ); + expect( + text.style, + const TextStyle(fontSize: 16), + ); + + final textFinder2 = find.byType(Text).last; + final text2 = tester.firstWidget(textFinder2); + + expect( + (text2 as Text).data, + "fakeTime", + ); + expect( + text2.style, + const TextStyle(fontSize: 16), + ); + }); + }); +} diff --git a/test/widget_tests/widgets/event_search_delegate_test.dart b/test/widget_tests/widgets/event_search_delegate_test.dart new file mode 100644 index 000000000..3e35fd0c2 --- /dev/null +++ b/test/widget_tests/widgets/event_search_delegate_test.dart @@ -0,0 +1,191 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:network_image_mock/network_image_mock.dart'; +import 'package:talawa/locator.dart'; +import 'package:talawa/router.dart' as router; +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/after_auth_view_models/event_view_models/explore_events_view_model.dart'; +import 'package:talawa/views/after_auth_screens/events/event_info_page.dart'; +import 'package:talawa/views/base_view.dart'; +import 'package:talawa/widgets/event_card.dart'; +import 'package:talawa/widgets/event_search_delegate.dart'; + +import '../../helpers/test_helpers.dart'; + +Widget createEventSearch() { + return MaterialApp( + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + home: Scaffold( + body: BaseView( + onModelReady: (model) => model.initialise(), + builder: (context, model, child) { + return IconButton( + onPressed: () { + showSearch( + context: context, + delegate: EventSearch( + eventList: model.events, + exploreEventsViewModel: model, + ), + ); + }, + icon: const Icon(Icons.search), + ); + }, + ), + ), + ); +} + +void main() { + SizeConfig().test(); + + setUp(() { + registerServices(); + registerViewModels(); + }); + + tearDown(() { + unregisterViewModels(); + unregisterServices(); + }); + + group('Test for EventSearch Delegate', () { + testWidgets('Check if EventSearch shows up', (tester) async { + mockNetworkImagesFor(() async { + await tester.pumpWidget(createEventSearch()); + await tester.pump(); + await tester.tap(find.byIcon(Icons.search)); + await tester.pumpAndSettle(); + + expect(find.byIcon(Icons.arrow_back), findsOneWidget); + expect(find.byIcon(Icons.clear), findsOneWidget); + expect(find.byType(TextField), findsOneWidget); + expect(find.byType(EventCard), findsOneWidget); + }); + }); + testWidgets('Check if back button works fine', (tester) async { + mockNetworkImagesFor(() async { + await tester.pumpWidget(createEventSearch()); + await tester.pump(); + await tester.tap(find.byIcon(Icons.search)); + await tester.pumpAndSettle(); + + final x = find.descendant( + of: find.byType(AppBar), + matching: find.byType(IconButton), + ); + await tester.tap(x.first); + await tester.pumpAndSettle(); + + expect(find.byIcon(Icons.arrow_back), findsNothing); + }); + }); + + testWidgets('Check if typing in textfield works', (tester) async { + mockNetworkImagesFor(() async { + await tester.pumpWidget(createEventSearch()); + await tester.pump(); + await tester.tap(find.byIcon(Icons.search)); + await tester.pumpAndSettle(); + + final textfield = find.byType(TextField); + await tester.enterText(textfield, 'te'); + await tester.pumpAndSettle(); + + expect(find.byType(EventCard), findsOneWidget); + + await tester.enterText(textfield, 'teste'); + await tester.pumpAndSettle(); + + expect(find.byType(EventCard), findsNothing); + }); + }); + + testWidgets('Check if buildResult works', (tester) async { + mockNetworkImagesFor(() async { + await tester.pumpWidget(createEventSearch()); + await tester.pump(); + await tester.tap(find.byIcon(Icons.search)); + await tester.pumpAndSettle(); + + final textfield = find.byType(TextField); + await tester.enterText(textfield, 'te'); + await tester.pumpAndSettle(); + + await tester.showKeyboard(textfield); + await tester.pump(); + + await tester.testTextInput.receiveAction(TextInputAction.send); + await tester.pump(); + + expect(find.byType(EventCard), findsOneWidget); + + await tester.enterText(textfield, 'teste'); + await tester.pumpAndSettle(); + + expect(find.byType(EventCard), findsNothing); + }); + }); + testWidgets('Check if clear button works fine', (tester) async { + mockNetworkImagesFor(() async { + await tester.pumpWidget(createEventSearch()); + await tester.pump(); + await tester.tap(find.byIcon(Icons.search)); + await tester.pumpAndSettle(); + + final x = find.descendant( + of: find.byType(AppBar), + matching: find.byType(IconButton), + ); + + final textfield = find.byType(TextField); + await tester.enterText(textfield, 'test'); + await tester.pumpAndSettle(); + + await tester.tap(x.last); + await tester.pumpAndSettle(); + final textWidget = tester.firstWidget(textfield); + expect((textWidget as TextField).controller!.text, ''); + + await tester.tap(x.last); + await tester.pumpAndSettle(); + expect(find.byIcon(Icons.clear), findsNothing); + }); + }); + + testWidgets('Check if tapping on event card works', (tester) async { + mockNetworkImagesFor(() async { + locator.unregister(); + locator.registerSingleton(NavigationService()); + + await tester.pumpWidget(createEventSearch()); + await tester.pump(); + await tester.tap(find.byIcon(Icons.search)); + await tester.pumpAndSettle(); + + final textfield = find.byType(TextField); + await tester.enterText(textfield, 'te'); + await tester.pumpAndSettle(); + + final eventCardFinder = find.byType(EventCard); + await tester.tap(eventCardFinder); + await tester.pumpAndSettle(); + + expect(find.byType(EventInfoPage), findsOneWidget); + }); + }); + }); +} diff --git a/test/widget_tests/widgets/from_palisadoes_test.dart b/test/widget_tests/widgets/from_palisadoes_test.dart new file mode 100644 index 000000000..dc3f9efa2 --- /dev/null +++ b/test/widget_tests/widgets/from_palisadoes_test.dart @@ -0,0 +1,43 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/widgets/from_palisadoes.dart'; + +Widget createFromPalisadoes() { + return const MaterialApp( + localizationsDelegates: [ + AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: FromPalisadoes(), + ), + ); +} + +void main() { + SizeConfig().test(); + group('Test for FromPalisadoes', () { + testWidgets('Check if FromPalisadoes widget shows up', (tester) async { + await tester.pumpWidget(createFromPalisadoes()); + await tester.pump(); + + expect(find.byType(Column), findsOneWidget); + }); + + testWidgets('Check if from Palisadoes text shows up', (tester) async { + await tester.pumpWidget(createFromPalisadoes()); + await tester.pump(); + + expect(find.byType(Text), findsNWidgets(2)); + expect(find.textContaining('from'), findsOneWidget); + expect(find.textContaining('PALISADOES'), findsOneWidget); + }); + }); +} diff --git a/test/widget_tests/widgets/lang_switch_test.dart b/test/widget_tests/widgets/lang_switch_test.dart new file mode 100644 index 000000000..02b6be38f --- /dev/null +++ b/test/widget_tests/widgets/lang_switch_test.dart @@ -0,0 +1,58 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/router.dart' as router; +import 'package:talawa/services/navigation_service.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/pre_auth_screens/select_language.dart'; +import 'package:talawa/widgets/lang_switch.dart'; + +import '../../helpers/test_locator.dart'; + +Widget createLanguageTile() { + return BaseView( + onModelReady: (appLanguageModel) => appLanguageModel.initialize(), + builder: (_, __, ___) => MaterialApp( + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + navigatorKey: locator().navigatorKey, + onGenerateRoute: router.generateRoute, + home: const Scaffold( + body: LanguageTile(), + ), + ), + ); +} + +void main() { + testSetupLocator(); + sizeConfig.test(); + group('Test for LanguageTile', () { + testWidgets('Check if LanguageTile widget shows up', (tester) async { + await tester.pumpWidget(createLanguageTile()); + await tester.pump(); + + expect(find.byType(ListTile), findsOneWidget); + expect(find.byType(TextButton), findsOneWidget); + }); + + testWidgets('Tapping on TextButton pushes SelectLanguage widget', + (tester) async { + await tester.pumpWidget(createLanguageTile()); + await tester.pump(); + + await tester.tap(find.byType(TextButton)); + await tester.pumpAndSettle(); + + expect(find.byType(SelectLanguage), findsOneWidget); + }); + }); +} diff --git a/test/widget_tests/widgets/member_name_tile_test.dart b/test/widget_tests/widgets/member_name_tile_test.dart new file mode 100644 index 000000000..21691f147 --- /dev/null +++ b/test/widget_tests/widgets/member_name_tile_test.dart @@ -0,0 +1,157 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:network_image_mock/network_image_mock.dart'; +import 'package:talawa/constants/custom_theme.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/widgets/member_name_tile.dart'; + +bool isDeleted = false; + +void onDelete() { + isDeleted = true; +} + +Widget createMemberNameTile({String? userImage}) { + return MaterialApp( + theme: TalawaTheme.darkTheme, + home: Material( + child: MemberNameTile( + userName: 'ravidev', + userImage: userImage, + onDelete: onDelete, + ), + ), + ); +} + +void main() { + SizeConfig().test(); + + group('Tests for MemberNameTile widget', () { + testWidgets('Checking if the widget shows up', (tester) async { + await tester.pumpWidget(createMemberNameTile()); + + expect(find.byType(Padding), findsWidgets); + }); + + testWidgets('Checking for the child Container', (tester) async { + await tester.pumpWidget(createMemberNameTile()); + + final containerFinder = find.byType(Container).first; + final container = tester.firstWidget(find.byType(Container)); + + expect(containerFinder, findsOneWidget); + + expect( + (container as Container).decoration, + BoxDecoration( + borderRadius: BorderRadius.circular(SizeConfig.screenHeight! * 0.02), + color: TalawaTheme.darkTheme.colorScheme.primaryContainer, + ), + ); + }); + + testWidgets('Checking for the Row', (tester) async { + await tester.pumpWidget(createMemberNameTile()); + + final rowFinder = find.byType(Row); + final row = tester.firstWidget(rowFinder); + + expect(rowFinder, findsOneWidget); + + expect((row as Row).mainAxisAlignment, MainAxisAlignment.spaceBetween); + expect(row.crossAxisAlignment, CrossAxisAlignment.center); + + expect(row.children[0], isA()); + expect(row.children[1], isA()); + expect(row.children[2], isA()); + }); + + testWidgets('Checking for CircleAvatar (without image)', (tester) async { + await tester.pumpWidget(createMemberNameTile()); + + final circleAvatarFinder = find.byType(CircleAvatar); + final circleAvatar = tester.firstWidget(circleAvatarFinder); + expect(circleAvatarFinder, findsOneWidget); + + expect( + (circleAvatar as CircleAvatar).radius, + SizeConfig.screenHeight! * 0.0201, + ); + expect( + circleAvatar.backgroundColor, + TalawaTheme.darkTheme.colorScheme.secondary, + ); + expect( + circleAvatar.child, + isA().having( + (text) => text.style, + 'Checking text style', + const TextStyle(color: Colors.white), + ), + ); + + expect(find.textContaining('R'), findsOneWidget); + }); + + testWidgets('Checking for CircleAvatar (with image)', (tester) async { + const String userImage = 'https://www.example.org/non-existent.png'; + + // Mock NetworkImages for CircularAvatar + await mockNetworkImagesFor( + () => tester.pumpWidget( + createMemberNameTile(userImage: userImage), + ), + ); + + final circleAvatarFinder = find.byType(CircleAvatar); + final circleAvatar = tester.firstWidget(circleAvatarFinder); + + expect(circleAvatarFinder, findsOneWidget); + + expect( + (circleAvatar as CircleAvatar).radius, + SizeConfig.screenHeight! * 0.0201, + ); + expect( + circleAvatar.backgroundImage, + const NetworkImage(userImage), + ); + expect( + circleAvatar.backgroundColor, + null, + ); + expect( + circleAvatar.child, + null, + ); + + expect(find.textContaining('R'), findsNWidgets(0)); + }); + + testWidgets('Checking for the cancel button', (tester) async { + await tester.pumpWidget(createMemberNameTile()); + + final iconButtonFinder = find.byType(IconButton); + final iconButton = tester.firstWidget(iconButtonFinder); + + expect(iconButtonFinder, findsOneWidget); + + expect((iconButton as IconButton).padding, EdgeInsets.zero); + expect( + iconButton.icon, + isA() + .having((icon) => icon.color, 'color', const Color(0xff524F4F)) + .having((icon) => icon.size, 'size', 19), + ); + + expect(isDeleted, false); + await tester.tap(iconButtonFinder); + await tester.pump(); + expect(isDeleted, true); + }); + }); +} diff --git a/test/widget_tests/widgets/pinned_carousel_widget_test.dart b/test/widget_tests/widgets/pinned_carousel_widget_test.dart new file mode 100644 index 000000000..2b68f2d43 --- /dev/null +++ b/test/widget_tests/widgets/pinned_carousel_widget_test.dart @@ -0,0 +1,152 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/models/user/user_info.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/widgets/pinned_carousel_widget.dart'; + +import '../../helpers/test_locator.dart'; + +List pinnedPosts = [ + Post(sId: 'ravidi', creator: User(), description: 'henlo_boi_'), + Post(sId: 'ravidi', creator: User(), description: 'henlo_boi_' * 10), +]; + +Widget createPinnedCarouselWidget() { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: PinnedPostCarousel( + pinnedPosts: pinnedPosts, + navigateToPinnedPostPage: () { + navigationService.pushDialog( + const AlertDialog(), + ); + }, + navigateToIndividualPostPage: + () {}, // Since it's not used in the widget file anywhere, so no way of testing it. + ), + ), + ); +} + +void main() { + testSetupLocator(); + SizeConfig().test(); + group('Test for PinnedPostCarousel', () { + testWidgets('Check if the widget shows up', (tester) async { + await tester.pumpWidget(createPinnedCarouselWidget()); + await tester.pump(); + + expect(find.byType(PinnedPostCarousel), findsOneWidget); + }); + + testWidgets('Check for inner children', (tester) async { + await tester.pumpWidget(createPinnedCarouselWidget()); + await tester.pump(); + + expect( + find.byType(Row), + findsNWidgets(2), + ); // 1 from CustomCarouselScroller + expect( + find.byType(Expanded), + findsNWidgets(7), + ); // 4 from CustomCarouselScroller + expect(find.byType(GestureDetector), findsNWidgets(2)); + }); + + testWidgets('Check if texts show up', (tester) async { + await tester.pumpWidget(createPinnedCarouselWidget()); + await tester.pump(); + + expect(find.textContaining("See all Pinned news"), findsOneWidget); + expect(find.textContaining("henlo_boi_"), findsOneWidget); + + // TODO: uncomment when page view gets implemented + + // await tester.scrollUntilVisible(find.byType(PageView), 10); // Future reference + // await tester.pump(const Duration(seconds: 1)); // Future reference + // expect(find.textContaining("${'henlo_boi_' * 9}..."), findsOneWidget); // Future reference + }); + + testWidgets('Check if navigating to pinned post works', (tester) async { + await tester.pumpWidget(createPinnedCarouselWidget()); + await tester.pump(); + + expect(find.byType(AlertDialog), findsNothing); + + await tester.tap(find.byType(GestureDetector).last); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(AlertDialog), findsOneWidget); + }); + + testWidgets('Testing for different lengths of description Strings', + (tester) async { + await tester.pumpWidget(createPinnedCarouselWidget()); + await tester.pumpAndSettle(); + }); + testWidgets('PageView onPageChanged test', (tester) async { + await tester.pumpWidget(createPinnedCarouselWidget()); + await tester.pumpAndSettle(); + final customCarouselScroller = find.byType(CustomCarouselScroller); + final CustomCarouselScrollerState customCarouselScrollerState = + tester.state(customCarouselScroller); + expect( + pinnedPosts[customCarouselScrollerState.pindex].description!.length, + lessThanOrEqualTo(90), + ); + customCarouselScrollerState.controller.jumpToPage(1); + expect(customCarouselScrollerState.pindex, 1); + expect( + pinnedPosts[customCarouselScrollerState.pindex].description!.length, + greaterThan(90), + ); + }); + + testWidgets('Test the text displayed based on length of description', + (tester) async { + await tester.pumpWidget(createPinnedCarouselWidget()); + await tester.pumpAndSettle(); + final customCarouselScroller = find.byType(CustomCarouselScroller); + final CustomCarouselScrollerState customCarouselScrollerState = + tester.state(customCarouselScroller); + int currentPage = customCarouselScrollerState.pindex; + + expect(find.text(pinnedPosts[currentPage].description!), findsOneWidget); + customCarouselScrollerState.controller.jumpToPage(1); + await tester.pump(); + currentPage = customCarouselScrollerState.pindex; + expect( + find.text( + '${pinnedPosts[currentPage].description!.substring(0, 90)}...', + ), + findsOneWidget, + ); + }); + }); +} diff --git a/test/widget_tests/widgets/pinned_post_test.dart b/test/widget_tests/widgets/pinned_post_test.dart new file mode 100644 index 000000000..51a1533bf --- /dev/null +++ b/test/widget_tests/widgets/pinned_post_test.dart @@ -0,0 +1,244 @@ +import 'package:cached_network_image/cached_network_image.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/models/post/post_model.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/views/after_auth_screens/feed/pinned_post_screen.dart'; +import 'package:talawa/widgets/pinned_post.dart'; +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_locator.dart'; + +/// List of pinned posts. +/// +///This file contains demo data for pinned posts. It contains a list of type Map and sample data. +const pinnedPostsDemoData = [ + { + "_id": "1", + "text": "church meeting", + "createdAt": "2023-03-15T15:28:52.122Z", + "imageUrl": + "https://imgs.search.brave.com/OHazbRf4oO5wuydAbr6061fUGuEw-rlDB1SuXWnJgTo/rs:fit:500:0:0/g:ce/aHR0cHM6Ly9pLnBp/bmltZy5jb20vb3Jp/Z2luYWxzLzZiLzIy/L2JhLzZiMjJiYTg2/Yzk3NjBiMzQ4YjNh/NTMzOGFjMzI4ZmJm/LmpwZw", + "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"}, + }, + ], + }, +]; + +///List of pinned post. +List _pinnedPosts = + pinnedPostsDemoData.map((e) => Post.fromJson(e)).toList(); + +/// getter for pinned post. +/// +/// **params**: + +List get pinnedPosts { + return _pinnedPosts; +} + +/// main function. +/// +/// **params**: +/// None +/// +/// **returns**: +/// None +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + testSetupLocator(); + locator().test(); + setUp(() { + registerServices(); + locator().test(); + }); + tearDown(() { + unregisterServices(); + }); + + testWidgets('If container is coming on calling pinnedwidget', + (widgetTester) async { + await widgetTester.pumpWidget( + MaterialApp( + home: PinnedPost( + pinnedPost: pinnedPosts, + model: mainScreenViewModel, + ), + ), + ); + await widgetTester.pump(const Duration(seconds: 5)); + expect(find.byKey(const Key('hello')), findsOneWidget); + }); + + testWidgets('Text widget is present when there are pinned posts', + (widgetTester) async { + await widgetTester.pumpWidget( + MaterialApp( + home: PinnedPost( + pinnedPost: pinnedPosts, + model: mainScreenViewModel, + ), + ), + ); + await widgetTester.pump(const Duration(seconds: 5)); + expect(find.byType(Text), findsWidgets); + }); + + testWidgets('Text widget displays the correct text', (widgetTester) async { + await widgetTester.pumpWidget( + MaterialApp( + home: PinnedPost( + pinnedPost: pinnedPosts, + model: mainScreenViewModel, + ), + ), + ); + await widgetTester.pump(const Duration(seconds: 5)); + expect(find.text('church meeting'), findsOneWidget); + }); + + testWidgets('Tapping on a post triggers navigation', (widgetTester) async { + await widgetTester.pumpWidget( + MaterialApp( + home: PinnedPost( + pinnedPost: pinnedPosts, + model: mainScreenViewModel, + ), + ), + ); + await widgetTester.pump(const Duration(seconds: 5)); + + await widgetTester.tap(find.byType(GestureDetector)); + await widgetTester.pumpAndSettle(); + expect(find.byType(PinnedPost), findsNothing); + expect(find.byType(PinnedPostScreen), findsOneWidget); + }); + + testWidgets('Container comes if list is empty', (widgetTester) async { + await widgetTester.pumpWidget( + MaterialApp( + home: PinnedPost(pinnedPost: [], model: mainScreenViewModel), + ), + ); + await widgetTester.pump(); + expect(find.byKey(const Key('hi')), findsOneWidget); + }); + testWidgets('Error widget is displayed when image fails to load', + (widgetTester) async { + await widgetTester.pumpWidget( + MaterialApp( + home: PinnedPost( + pinnedPost: pinnedPosts, + model: mainScreenViewModel, + ), + ), + ); + await widgetTester.pump(const Duration(seconds: 5)); + + expect( + find.byWidgetPredicate( + (widget) => widget is CachedNetworkImage && widget.errorWidget != null, + ), + findsOneWidget, + ); + }); + + testWidgets('CircularProgressIndicator is shown when image fails to load', + (widgetTester) async { + await widgetTester.pumpWidget( + MaterialApp( + home: PinnedPost( + pinnedPost: pinnedPosts, + model: mainScreenViewModel, + ), + ), + ); + + await widgetTester.pump(const Duration(seconds: 5)); + + expect( + find.byWidgetPredicate( + (widget) => + widget is CachedNetworkImage && + widget.errorWidget != null && + widget.errorWidget is Function && + widget.errorWidget!( + widgetTester.binding.rootElement!, + '', + Exception(), + ) is SizedBox, + ), + findsOneWidget, + ); + }); + testWidgets('CachedNetworkImage displays correct image', + (widgetTester) async { + await widgetTester.pumpWidget( + MaterialApp( + home: PinnedPost( + pinnedPost: pinnedPosts, + model: mainScreenViewModel, + ), + ), + ); + await widgetTester.pump(const Duration(seconds: 5)); + + expect( + find.byWidgetPredicate( + (widget) => + widget is CachedNetworkImage && + widget.imageUrl == pinnedPosts[0].imageUrl, + ), + findsOneWidget, + ); + }); + + testWidgets('CachedNetworkImage displays correct image', + (widgetTester) async { + await widgetTester.pumpWidget( + MaterialApp( + home: PinnedPost( + pinnedPost: pinnedPosts, + model: mainScreenViewModel, + ), + ), + ); + await widgetTester.pump(const Duration(seconds: 5)); + + final imageWidget = find.byWidgetPredicate( + (widget) => + widget is CachedNetworkImage && + widget.imageUrl == pinnedPosts[0].imageUrl, + ); + + expect(imageWidget, findsOneWidget); + }); +} diff --git a/test/widget_tests/widgets/post_container_test.dart b/test/widget_tests/widgets/post_container_test.dart new file mode 100644 index 000000000..af78704cc --- /dev/null +++ b/test/widget_tests/widgets/post_container_test.dart @@ -0,0 +1,155 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail_image_network/mocktail_image_network.dart'; +import 'package:talawa/widgets/post_container.dart'; + +/// main function. +/// +/// **params**: +/// None +/// +/// **returns**: +/// None +void main() { + group('PostContainer Widget Tests', () { + testWidgets('PostContainer should be built without crashing', + (WidgetTester tester) async { + await tester.runAsync(() async { + await mockNetworkImages(() async { + await tester.pumpWidget( + const MaterialApp( + home: PostContainer( + photoUrl: + 'https://www.fcbarcelona.com/fcbarcelona/photo/2022/08/02/ae5252d1-b79b-4950-9e34-6e67fac09bb0/LeoMessi20092010_pic_fcb-arsenal62.jpg', + ), + ), + ); + }); + + expect(find.byType(PostContainer), findsOneWidget); + }); + }); + testWidgets( + 'PostContainer should display an image when photoUrl is provided', + (tester) async { + await mockNetworkImages( + () async => tester.pumpWidget( + const MaterialApp( + home: PostContainer( + photoUrl: + 'https://www.fcbarcelona.com/fcbarcelona/photo/2022/08/02/ae5252d1-b79b-4950-9e34-6e67fac09bb0/LeoMessi20092010_pic_fcb-arsenal62.jpg', + ), + ), + ), + ); + + expect(find.byType(Image), findsOneWidget); + }); + + testWidgets( + 'PostContainer should not display an image when photoUrl is null', + (tester) async { + await tester.pumpWidget( + const MaterialApp( + home: PostContainer(photoUrl: null), + ), + ); + expect(find.byType(Image), findsNothing); + expect(find.byType(Container), findsOneWidget); + }); + + testWidgets( + 'initState should be called and variables should be initialized correctly', + (WidgetTester tester) async { + await tester.runAsync(() async { + await mockNetworkImages(() async { + await tester.pumpWidget( + const MaterialApp( + home: PostContainer( + photoUrl: + 'https://www.fcbarcelona.com/fcbarcelona/photo/2022/08/02/ae5252d1-b79b-4950-9e34-6e67fac09bb0/LeoMessi20092010_pic_fcb-arsenal62.jpg', + ), + ), + ); + }); + final postContainerState = + tester.state(find.byType(PostContainer)); + expect(postContainerState.startedPlaying, isFalse); + expect(postContainerState.inView, isTrue); + expect(find.byType(PostContainer), findsOneWidget); + }); + }); + + testWidgets( + 'PageController should be disposed when widget is removed from tree', + (WidgetTester tester) async { + await tester.runAsync(() async { + await mockNetworkImages(() async { + await tester.pumpWidget( + const MaterialApp( + home: PostContainer( + photoUrl: + 'https://www.fcbarcelona.com/fcbarcelona/photo/2022/08/02/ae5252d1-b79b-4950-9e34-6e67fac09bb0/LeoMessi20092010_pic_fcb-arsenal62.jpg', + ), + ), + ); + }); + final postContainerState = + tester.state(find.byType(PostContainer)); + final pageController = postContainerState.controller; + + await tester.pumpWidget( + MaterialApp(home: Container()), + ); + + try { + pageController.position; + fail('Should throw AssertionError'); + } catch (e) { + expect(e, isInstanceOf()); + } + }); + }); + + testWidgets('PostContainer should change inView to true when visible', + (WidgetTester tester) async { + await tester.runAsync(() async { + await mockNetworkImages(() async { + await tester.pumpWidget( + const MaterialApp( + home: PostContainer( + photoUrl: + 'https://www.fcbarcelona.com/fcbarcelona/photo/2022/08/02/ae5252d1-b79b-4950-9e34-6e67fac09bb0/LeoMessi20092010_pic_fcb-arsenal62.jpg', + ), + ), + ); + }); + + final postContainerState = + tester.state(find.byType(PostContainer)); + expect(postContainerState.inView, isTrue); + }); + }); + + testWidgets('PostContainer should change inView to false when not visible', + (WidgetTester tester) async { + await tester.runAsync(() async { + await mockNetworkImages(() async { + await tester.pumpWidget( + const MaterialApp( + home: PostContainer( + photoUrl: + 'https://www.fcbarcelona.com/fcbarcelona/photo/2022/08/02/ae5252d1-b79b-4950-9e34-6e67fac09bb0/LeoMessi20092010_pic_fcb-arsenal62.jpg', + ), + ), + ); + }); + + final postContainerState = + tester.state(find.byType(PostContainer)); + postContainerState.inView = false; + expect(postContainerState.inView, isFalse); + }); + }); + }); +} diff --git a/test/widget_tests/widgets/post_detailed_page_test.dart b/test/widget_tests/widgets/post_detailed_page_test.dart new file mode 100644 index 000000000..772298d02 --- /dev/null +++ b/test/widget_tests/widgets/post_detailed_page_test.dart @@ -0,0 +1,238 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.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/widgets/post_detailed_page.dart'; + +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_locator.dart'; + +const longString = + 'iloveicecreamiloveicecreamiloveicecreamiloveicecreamiloveicecreamiloveicecreamiloveicecreamiloveicecreamiloveicecreamiloveicecreamiloveicecreamil888890'; +const shortString = 'I love ice-cream'; +const tagString = 'I love ice-cream #icecream'; +const multiTagString = 'I love ice-cream #icec#ream'; +Widget createDescriptionTextWidgetWithShortText() { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: const Scaffold( + body: DescriptionTextWidget( + text: shortString, + ), + ), + ); +} + +Widget createDescriptionTextWidgetWithLongText() { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: const Scaffold( + body: DescriptionTextWidget( + text: longString, + ), + ), + ); +} + +Widget createDescriptionTextWidgetWithTag() { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: const Scaffold( + body: DescriptionTextWidget( + text: tagString, + ), + ), + ); +} + +Widget createDescriptionTextWidgetWithMultiTag() { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: const Scaffold( + body: DescriptionTextWidget( + text: multiTagString, + ), + ), + ); +} + +void main() { + SizeConfig().test(); + locator.registerSingleton(NavigationService()); + + setUp(() { + registerServices(); + registerViewModels(); + }); + + tearDown(() { + unregisterViewModels(); + unregisterServices(); + }); + group('Description Widget test', () { + testWidgets( + "Test if Description text Widget is displayed with text less than 150", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createDescriptionTextWidgetWithShortText()); + await tester.pump(); + expect(find.byType(DescriptionTextWidget), findsOneWidget); + }); + }); + testWidgets( + "Test if Description text Widget is displayed with text more than 150", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createDescriptionTextWidgetWithLongText()); + await tester.pump(); + expect(find.byType(DescriptionTextWidget), findsOneWidget); + }); + }); + testWidgets( + "Test if Description text Widget is displayed with text more than 150", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createDescriptionTextWidgetWithTag()); + await tester.pump(); + expect(find.byType(DescriptionTextWidget), findsOneWidget); + }); + }); + testWidgets( + "Test if Description text Widget is displayed with text more than 150", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createDescriptionTextWidgetWithMultiTag()); + await tester.pump(); + expect(find.byType(DescriptionTextWidget), findsOneWidget); + }); + }); + testWidgets("Test if 1 text Widget is displayed with text less than 150", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createDescriptionTextWidgetWithShortText()); + await tester.pump(); + expect(find.byType(Text), findsNWidgets(1)); + }); + }); + + testWidgets("Test if 2 text Widget is displayed with text more than 150", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createDescriptionTextWidgetWithLongText()); + await tester.pump(); + expect(find.byType(Text), findsNWidgets(2)); + }); + }); + + testWidgets( + "Test if text Widget display content properly with text more than 150", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createDescriptionTextWidgetWithLongText()); + await tester.pump(); + expect(find.text('${longString.substring(0, 150)}...'), findsOneWidget); + }); + }); + + testWidgets("Test if show more button is working", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createDescriptionTextWidgetWithLongText()); + await tester.pump(); + final showLessMore = find.byType(InkWell); + await tester.tap(showLessMore); + await tester.pump(); + //showing more + expect(find.text(longString), findsOneWidget); + }); + }); + testWidgets("Test if show less button is working", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createDescriptionTextWidgetWithLongText()); + await tester.pump(); + final showLessMore = find.byType(InkWell); + await tester.tap(showLessMore); + await tester.pump(); + + await tester.tap(showLessMore); + await tester.pump(); + //showing less + expect(find.text('${longString.substring(0, 150)}...'), findsOneWidget); + }); + }); + }); +} diff --git a/test/widget_tests/widgets/post_list_widget_test.dart b/test/widget_tests/widgets/post_list_widget_test.dart new file mode 100644 index 000000000..2097168c6 --- /dev/null +++ b/test/widget_tests/widgets/post_list_widget_test.dart @@ -0,0 +1,81 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +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/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/widgets/post_list_widget.dart'; + +import '../../helpers/test_helpers.dart'; + +void main() { + const Key postListKey = Key("postListKey"); + + Widget createPostListWidget(List postlist) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + themeMode: ThemeMode.light, + theme: TalawaTheme.lightTheme, + home: Scaffold( + body: PostListWidget( + posts: postlist, + key: postListKey, + ), + ), + ); + } + + group("Post List Widget Test-", () { + setUp(() { + registerServices(); + locator.registerFactory(() => LikeButtonViewModel()); + }); + + tearDown(() { + unregisterServices(); + locator.unregister(); + }); + + testWidgets("Test if PostList Widget is displayed ", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createPostListWidget([])); + await tester.pump(); + final postListFinder = find.byKey(postListKey); + expect(postListFinder, findsOneWidget); + }); + }); + + testWidgets("Test if PostList Widget is not scrollable", + (WidgetTester tester) async { + final mockPost1 = getPostMockModel(description: "MockPost1"); + final mockPost2 = getPostMockModel(description: "MockPost2"); + + final List postList = [mockPost1, mockPost2]; + //Extremely large screen to test if scrolling takes place + + // ignore: deprecated_member_use + tester.binding.window.physicalSizeTestValue = const Size(100000, 100000); + await tester.runAsync(() async { + await tester.pumpWidget(createPostListWidget(postList)); + await tester.pump(); + //Attempt to scroll + + // await tester.drag(find.byType(ListView), const Offset(0, -800)); + // await tester.pump(); + // First post in list should still be visible as scrolling is disabled + expect(find.text(mockPost1.description!), findsOneWidget); + }); + }); + }); +} diff --git a/test/widget_tests/widgets/post_modal_test.dart b/test/widget_tests/widgets/post_modal_test.dart new file mode 100644 index 000000000..0ee90eb12 --- /dev/null +++ b/test/widget_tests/widgets/post_modal_test.dart @@ -0,0 +1,202 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/enums/enums.dart'; +import 'package:talawa/models/comment/comment_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/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/base_view.dart'; +import 'package:talawa/widgets/post_modal.dart'; + +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_locator.dart'; + +//Mock classes +class MockFunction extends Mock { + void call(Post post); +} + +class MockNavigationService extends Mock implements NavigationService {} + +//test data +final MockFunction mockDeletePost = MockFunction(); +final LikedBy user = LikedBy(sId: "test_id"); + +//fake user data +final u1 = User( + id: '123', + firstName: 'Lakshay', + lastName: 'Gupta', + email: 'test@test.com', +); +final u2 = User( + id: '123', + firstName: 'Ankit', + lastName: 'Varshney', + email: 'test@test.com', +); +final List users = [u1, u2]; + +List comments = [ + Comments(sId: 'comment1'), + Comments(sId: 'comment2'), + Comments(sId: 'comment3'), + Comments(sId: 'comment4'), + Comments(sId: 'comment5'), + Comments(sId: 'comment6'), +]; + +//fake comment data +final comment = Comment( + creator: User( + id: '123', + firstName: 'Ankit', + lastName: 'Varshney', + email: 'test@test.com', + ), + createdAt: '123456', + text: 'test text', + post: 'test post', + likeCount: 'test count', +); + +final LikedBy l1 = LikedBy(sId: 'test1'); +final LikedBy l2 = LikedBy(sId: 'test2'); +final List likeby = [l1, l2]; + +final comment1 = Comments(sId: 'comment1'); +final comment2 = Comments(sId: 'comment2'); +final comment3 = Comments(sId: 'comment3'); +final List comments1 = [comment1, comment2, comment3]; + +final myBirthday = DateTime.utc(2004, DateTime.june, 16, 5, 30, 0, 0, 0); + +//fake post data +final post = Post( + creator: User( + id: '123', + firstName: 'John', + lastName: 'Doe', + email: 'test@test.com', + ), + sId: "sid", + createdAt: myBirthday, + description: 'test description', + organization: OrgInfo(admins: users), + likedBy: likeby, + comments: comments1, +); + +Widget createPostBottomModal() { + return BaseView( + onModelReady: (model) => model.initialize(), + builder: (context, model, child) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: const [ + AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: PostBottomModal( + post: post, + deletePost: mockDeletePost, + ), + navigatorKey: navigationService.navigatorKey, + ); + }, + ); +} + +void main() { + SizeConfig().test(); + testSetupLocator(); + + setUp(() { + registerServices(); + }); + + tearDown(() => unregisterServices()); + + group('PostBottomModalTest -', () { + testWidgets('has a post widget', (tester) async { + await tester.pumpWidget(createPostBottomModal()); + await tester.pumpAndSettle(); + + // Verify the existence of PostBottomModal widget and reportPost button + expect(find.byType(PostBottomModal), findsOneWidget); + expect(find.byKey(const Key('reportPost')), findsOneWidget); + + // Tap the reportPost button and verify the behavior + await tester.tap(find.byKey(const Key('reportPost'))); + await tester.pumpAndSettle(); + + verify( + navigationService.showTalawaErrorSnackBar( + 'Your Report has been sent to the Admin', + MessageType.info, + ), + ).called(1); + }); + + testWidgets('Testing the delete Post button', (tester) async { + await tester.pumpWidget(createPostBottomModal()); + await tester.pumpAndSettle(); + + // Verify the existence of delete Post button + expect(find.byIcon(Icons.delete), findsOneWidget); + expect(find.byKey(const Key('deletePost')), findsOneWidget); + + // Tap the delete Post button and verify the behavior + await tester.tap(find.byKey(const Key('deletePost'))); + await tester.pumpAndSettle(); + + verify(mockDeletePost.call(post)).called(1); + + // Verify the presence of AlertDialog and its elements + expect(find.byType(AlertDialog), findsOneWidget); + expect(find.byKey(const Key('alert_dialog_yes_btn')), findsOneWidget); + expect(find.text('The post was deleted'), findsOneWidget); + + // Tap the yes button in AlertDialog and verify the behavior + await tester.tap(find.byKey(const Key('alert_dialog_yes_btn'))); + await tester.pumpAndSettle(); + + verify( + navigationService.showTalawaErrorSnackBar( + 'Post was deleted if you had the rights!', + MessageType.info, + ), + ).called(1); + }); + + testWidgets("Testing no button of alertDialogBox", (tester) async { + await tester.pumpWidget(createPostBottomModal()); + await tester.pumpAndSettle(); + + // Tap the delete Post button and verify the behavior + expect(find.byKey(const Key('deletePost')), findsOneWidget); + await tester.tap(find.byKey(const Key('deletePost'))); + await tester.pumpAndSettle(); + + verify(mockDeletePost.call(post)).called(1); + + // Verify the presence of AlertDialog and its no button + expect(find.byType(AlertDialog), findsOneWidget); + expect(find.byKey(const Key('alert_dialog_no_btn')), findsOneWidget); + + // Tap the no button in AlertDialog and verify the behavior + await tester.tap(find.byKey(const Key('alert_dialog_no_btn'))); + await tester.pumpAndSettle(); + + // Verify that AlertDialog is dismissed + expect(find.byType(AlertDialog), findsNothing); + }); + }); +} diff --git a/test/widget_tests/widgets/post_widget_test.dart b/test/widget_tests/widgets/post_widget_test.dart new file mode 100644 index 000000000..20f266928 --- /dev/null +++ b/test/widget_tests/widgets/post_widget_test.dart @@ -0,0 +1,884 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +// import 'dart:convert'; + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:talawa/constants/custom_theme.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/size_config.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/multi_reaction.dart'; +import 'package:talawa/widgets/post_container.dart'; +import 'package:talawa/widgets/post_detailed_page.dart'; +import 'package:talawa/widgets/post_widget.dart'; +// import 'package:talawa/widgets/video_widget.dart'; +// import 'package:visibility_detector/visibility_detector.dart'; + +import '../../helpers/test_helpers.dart'; + +const Key newsPostKey = Key("newsPostKey"); +const Key postContainerKey = Key("postContainerKey"); + +Widget createNewsPostWidget([Function(Post)? function, Post? post]) { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + themeMode: ThemeMode.light, + theme: TalawaTheme.lightTheme, + home: Scaffold( + body: NewsPost( + key: newsPostKey, + post: post ?? getPostMockModel(), + function: function, + ), + ), + ); +} + +Widget createPostContainerWidget() { + return MaterialApp( + locale: const Locale('en'), + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + themeMode: ThemeMode.light, + theme: TalawaTheme.lightTheme, + home: const Scaffold( + body: PostContainer( + key: postContainerKey, + photoUrl: + "https://dcblog.b-cdn.net/wp-content/uploads/2021/02/Full-form-of-URL-1-1024x824.jpg", + ), + ), + ); +} + +void main() { + SizeConfig().test(); + locator.registerSingleton(NavigationService()); + + setUp(() { + registerServices(); + registerViewModels(); + }); + + tearDown(() { + unregisterViewModels(); + unregisterServices(); + }); + + group('Testing News Post Widget - ', () { + testWidgets("Test if News Post Widget is displayed ", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createNewsPostWidget()); + await tester.pump(); + final postFinder = find.byKey(newsPostKey); + expect(postFinder, findsOneWidget); + }); + }); + + group('Post Widget Test functionality-', () { + testWidgets("Test if like button changes colour if liked", + (WidgetTester tester) async { + await tester.runAsync(() async { + final Post post = getPostMockModel(); + when(post.likedBy).thenReturn([LikedBy(sId: "xzy1")]); + await tester.pumpWidget( + createNewsPostWidget( + null, + post, + ), + ); + await tester.pump(); + + final postFinder = find.byKey(newsPostKey); + final columnFinder = + find.descendant(of: postFinder, matching: find.byType(Column)); + final column2Finder = columnFinder.at(2); + final secondColumnWidget = + tester.firstWidget(column2Finder) as Column; + print(secondColumnWidget); + + // final thirdPaddingWidget = secondColumnWidget.children[2] as Padding; + // + // final first3GestureDetectorFinder = find.descendant( + // of: find.byWidget(thirdPaddingWidget), + // matching: find.byType(GestureDetector), + // ); + // final first3GestureDetectorWidget = tester + // .firstWidget(first3GestureDetectorFinder) as GestureDetector; + + // expect( + // (first3GestureDetectorWidget.child! as Icon).color, + // TalawaTheme.lightTheme.colorScheme.secondary, + // ); + }); + }); + testWidgets("Test if onTap is functional", (WidgetTester tester) async { + await tester.runAsync(() async { + int clicked = 0; + void func(Post post) { + clicked++; + } + + await tester.pumpWidget(createNewsPostWidget(func)); + await tester.pump(); + + final postFinder = find.byKey(newsPostKey); + final columnFinder = + find.descendant(of: postFinder, matching: find.byType(Column)); + final column2Finder = columnFinder.at(2); + final secondColumnWidget = + tester.firstWidget(column2Finder) as Column; + print(secondColumnWidget); + // final firstPaddingWidget = secondColumnWidget.children[0] as Padding; + // final firstGestureDetectorFinder = find.descendant( + // of: find.byWidget(firstPaddingWidget), + // matching: find.byType(GestureDetector), + // ); + // final firstGestureDetectorWidget = + // tester.firstWidget(firstGestureDetectorFinder) as GestureDetector; + // await tester.tap(find.byWidget(firstGestureDetectorWidget).first); + await tester.pump(); + expect(clicked, 0); + + // final secondGestureDetectorFinder = find.descendant( + // of: find.byWidget(firstPaddingWidget), + // matching: find.byType(GestureDetector), + // ); + // final secondGestureDetectorWidget = tester + // .firstWidget(secondGestureDetectorFinder.last) as GestureDetector; + // await tester.tap(find.byWidget(secondGestureDetectorWidget).first); + // await tester.pump(); + // expect(clicked, 0); + + // final thirdPaddingWidget = secondColumnWidget.children[2] as Padding; + // + // final second3GestureDetectorFinder = find.descendant( + // of: find.byWidget(thirdPaddingWidget), + // matching: find.byType(GestureDetector), + // ); + // final second3GestureDetectorWidget = + // tester.firstWidget(second3GestureDetectorFinder.last) + // as GestureDetector; + // await tester.tap(find.byWidget(second3GestureDetectorWidget)); + // await tester.pump(); + // expect(clicked, 3); + // + // final first3GestureDetectorFinder = find.descendant( + // of: find.byWidget(thirdPaddingWidget), + // matching: find.byType(GestureDetector), + // ); + // final first3GestureDetectorWidget = tester + // .firstWidget(first3GestureDetectorFinder) as GestureDetector; + // await tester.tap(find.byWidget(first3GestureDetectorWidget)); + // await tester.pump(); + + // expect( + // first3GestureDetectorWidget.child, + // isA() + // .having((icon) => icon.icon, "icon", Icons.thumb_up) + // .having( + // (icon) => icon.color, + // "color", + // equals( + // const Color(0xff737373), + // ), + // ), + // ); + }); + }); + }); + + group("Post Widget Test is all Widgets exist-", () { + testWidgets("Test if Column exists", (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createNewsPostWidget()); + await tester.pump(); + final postFinder = find.byKey(newsPostKey); + final firstColumnFinder = find + .descendant(of: postFinder, matching: find.byType(Column)) + .first; + + //Test if 3 Columns exists + expect(firstColumnFinder, findsOneWidget); + + final firstColumnWidget = + tester.firstWidget(firstColumnFinder) as Column; + + // Test if first column has cross axis alignment of start + expect( + firstColumnWidget.crossAxisAlignment, + CrossAxisAlignment.start, + ); + + // Testing if all direct children of column are there + expect(firstColumnWidget.children[0], isA()); + expect(firstColumnWidget.children[1], isA()); + expect(firstColumnWidget.children[2], isA()); + expect( + firstColumnWidget.children[3], + isA>(), + ); + }); + }); + testWidgets('Test Props of List Tile', (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createNewsPostWidget()); + await tester.pump(); + final postFinder = find.byKey(newsPostKey); + final columnFinder = find + .descendant(of: postFinder, matching: find.byType(Column)) + .first; + + final listTileFinder = find.descendant( + of: columnFinder, + matching: find.byType(ListTile), + ); + + // Tests if List Tile is a child of the first Column + expect(listTileFinder, findsOneWidget); + + final listTileWidget = tester.firstWidget(listTileFinder) as ListTile; + + // Tests if leading of list tile is custom avatar + expect(listTileWidget.leading.runtimeType, CustomAvatar); + + final customAvatarFinder = find.descendant( + of: listTileFinder.first, + matching: find.byType(CustomAvatar), + ); + + // Tests if Custom Avatar is a descendant of list tile + expect(customAvatarFinder, findsOneWidget); + + final customAvatarWidget = + tester.firstWidget(customAvatarFinder) as CustomAvatar; + + // Testing props of Custom Avatar Widget + expect(customAvatarWidget.isImageNull, true); + expect(customAvatarWidget.imageUrl, ' /null'); + expect(customAvatarWidget.fontSize, 20); + expect(customAvatarWidget.firstAlphabet, 'T'); + + // Tests if leading of list tile is custom avatar + expect(listTileWidget.title.runtimeType, Row); + + final textsOfListTileFinder = find.descendant( + of: listTileFinder.first, + matching: find.byType(Text), + ); + + // Testing if 3 Text Widget are children of list tile + // expect(textsOfListTileFinder, findsNWidgets(3)); + + final titleListTileFinder = textsOfListTileFinder.at(1); + final titleListTileWidget = + tester.firstWidget(titleListTileFinder) as Text; + + // Testing properties of title Text Widget of list tile + expect(titleListTileWidget.data, "TestName null"); + expect(titleListTileWidget.style!.fontSize, 16); + expect(titleListTileWidget.style!.fontWeight, FontWeight.w400); + + final subtitleListTileFinder = textsOfListTileFinder.at(1); + final subtitleListTileWidget = + tester.firstWidget(subtitleListTileFinder) as Text; + + // Testing properties of title Text Widget of list tile + expect(subtitleListTileWidget.data, "TestName null"); + }); + }); + testWidgets("Test props of DescriptionTextWidget", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createNewsPostWidget()); + await tester.pump(); + final postFinder = find.byKey(newsPostKey); + final columnFinder = find + .descendant(of: postFinder, matching: find.byType(Column)) + .first; + final descriptionTextWidgetFinder = find.descendant( + of: columnFinder, + matching: find.byType(DescriptionTextWidget), + ); + + // Testing if DescriptionTextWidget shows + expect(descriptionTextWidgetFinder, findsOneWidget); + + final descriptionTextWidget = + tester.firstWidget(descriptionTextWidgetFinder) + as DescriptionTextWidget; + + // Testing if the text description is correct + expect(descriptionTextWidget.text, "TestDescription"); + }); + }); + testWidgets("Test props of Container containing the Post Container", + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createNewsPostWidget()); + await tester.pump(); + final postFinder = find.byKey(newsPostKey); + final columnFinder = find + .descendant(of: postFinder, matching: find.byType(Column)) + .first; + + final containerWidget = (tester.firstWidget(columnFinder) as Column) + .children[2] as Container; + + // Testing if the text description is correct + // expect(containerWidget.constraints!.maxHeight, 400); + // expect(containerWidget.constraints!.minHeight, 400); + + expect( + containerWidget.color, + null, + ); + + final postContainerFinder = find.descendant( + of: find.byWidget(containerWidget), + matching: find.byType(PostContainer), + ); + expect(postContainerFinder, findsNothing); + }); + }); + testWidgets("Test props of Base view", (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createNewsPostWidget()); + await tester.pump(); + final postFinder = find.byKey(newsPostKey); + final columnFinder = + find.descendant(of: postFinder, matching: find.byType(Column)); + + final baseViewWidget = (tester.firstWidget(columnFinder) as Column) + .children[3] as BaseView; + + // Testing if the text description is correct + expect(baseViewWidget.onModelReady, isNotNull); + expect(baseViewWidget.builder, isNotNull); + final column2Finder = columnFinder.at(2); + expect(column2Finder, findsOneWidget); + + final secondColumnWidget = + tester.firstWidget(column2Finder) as Column; + print(secondColumnWidget); + // Testing if all direct children of column are there + // expect(secondColumnWidget.children[0], isA()); + // expect(secondColumnWidget.children[1], isA()); + // expect(secondColumnWidget.children[2], isA()); + }); + }); + + group('Test props of children for baseview', () { + testWidgets( + 'Test MultiReactButton presence and onReactionChanged property in NewsPostWidget', + (WidgetTester tester) async { + await tester.runAsync(() async { + // Variable to check if onReactionChanged is called + bool reactionChangedCalled = false; + + // Build the NewsPostWidget containing the MultiReactButton + await tester.pumpWidget( + MultiReactButton( + toggle: () { + // Set the flag when onReactionChanged is called + reactionChangedCalled = true; + }, + ), + ); + + // Find the MultiReactButton widget within the NewsPostWidget + final multiReactButtonFinder = find.byType(MultiReactButton); + + // Ensure the MultiReactButton widget is present in the widget tree + expect(multiReactButtonFinder, findsOneWidget); + + // Simulate a reaction change on the MultiReactButton + await tester.tap( + multiReactButtonFinder, + ); // Replace with your actual tap action + await tester.pump(); + + // Ensure that onReactionChanged callback was triggered + expect(reactionChangedCalled, true); + }); + }); + + testWidgets('Test props first padding widget', + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createNewsPostWidget()); + await tester.pump(); + final postFinder = find.byKey(newsPostKey); + final columnFinder = + find.descendant(of: postFinder, matching: find.byType(Column)); + final column2Finder = columnFinder.at(2); + final secondColumnWidget = + tester.firstWidget(column2Finder) as Column; + final firstPaddingWidget = + secondColumnWidget.children[0] as Padding; + + // expect( + // // firstPaddingWidget.padding, + // const EdgeInsets.symmetric(horizontal: 16, vertical: 10), + // ); + // expect( + // firstPaddingWidget.child, + // isA() + // .having( + // (row) => row.mainAxisAlignment, + // 'mainAxisAlignment', + // MainAxisAlignment.spaceBetween, + // ) + // .having( + // (row) => row.children, + // "children", + // [ + // isA(), + // isA(), + // ], + // ), + // ); + final firstGestureDetectorFinder = find.descendant( + of: find.byWidget(firstPaddingWidget), + matching: find.byType(GestureDetector), + ); + print(firstGestureDetectorFinder); + // final firstGestureDetectorWidget = tester + // .firstWidget(firstGestureDetectorFinder) as GestureDetector; + // expect(firstGestureDetectorWidget.onTap, isNotNull); + // expect(firstGestureDetectorWidget.onTap, isA()); + // expect( + // firstGestureDetectorWidget.child, + // isA().having((text) => text.data, "data", "0 Likes").having( + // (text) => text.style, + // "style", + // const TextStyle( + // fontFamily: 'open-sans', + // fontWeight: FontWeight.w800, + // ), + // ), + // ); + + final secondGestureDetectorFinder = find.descendant( + of: find.byWidget(firstPaddingWidget), + matching: find.byType(GestureDetector), + ); + print(secondGestureDetectorFinder); + // final secondGestureDetectorWidget = + // tester.firstWidget(secondGestureDetectorFinder.last) + // as GestureDetector; + // expect(secondGestureDetectorWidget.onTap, isNotNull); + // expect(secondGestureDetectorWidget.onTap, isA()); + // expect( + // secondGestureDetectorWidget.child, + // isA().having((text) => text.data, "data", "0 comments"), + // ); + }); + }); + + testWidgets('Test props second padding widget', + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createNewsPostWidget()); + await tester.pump(); + final postFinder = find.byKey(newsPostKey); + final columnFinder = + find.descendant(of: postFinder, matching: find.byType(Column)); + final column2Finder = columnFinder.at(2); + final secondColumnWidget = + tester.firstWidget(column2Finder) as Column; + final secondPaddingWidget = + secondColumnWidget.children[1] as Padding; + print(secondPaddingWidget); + }); + }); + + testWidgets('Test props third padding widget', + (WidgetTester tester) async { + await tester.runAsync(() async { + await tester.pumpWidget(createNewsPostWidget()); + await tester.pump(); + final postFinder = find.byKey(newsPostKey); + final columnFinder = + find.descendant(of: postFinder, matching: find.byType(Column)); + final column2Finder = columnFinder.at(2); + final secondColumnWidget = + tester.firstWidget(column2Finder) as Column; + print(secondColumnWidget); + // final thirdPaddingWidget = + // secondColumnWidget.children[2] as Padding; + // expect( + // thirdPaddingWidget.padding, + // const EdgeInsets.symmetric(horizontal: 16, vertical: 5), + // ); + // expect( + // thirdPaddingWidget.child, + // isA().having( + // (row) => row.children, + // "children", + // [ + // isA(), + // isA(), + // ], + // ), + // ); + // final first3GestureDetectorFinder = find.descendant( + // of: find.byWidget(thirdPaddingWidget), + // matching: find.byType(GestureDetector), + // ); + // final first3GestureDetectorWidget = tester + // .firstWidget(first3GestureDetectorFinder) as GestureDetector; + // expect(first3GestureDetectorWidget.onTap, isNotNull); + // expect(first3GestureDetectorWidget.onTap, isA()); + // expect( + // first3GestureDetectorWidget.child, + // isA() + // .having((icon) => icon.icon, "icon", Icons.thumb_up) + // .having( + // (icon) => icon.color, + // "color", + // const Color(0xff737373), + // ), + // ); + + // final second3GestureDetectorFinder = find.descendant( + // of: find.byWidget(thirdPaddingWidget), + // matching: find.byType(GestureDetector), + // ); + // final second3GestureDetectorWidget = + // tester.firstWidget(second3GestureDetectorFinder.last) + // as GestureDetector; + // expect(second3GestureDetectorWidget.onTap, isNotNull); + // expect(second3GestureDetectorWidget.onTap, isA()); + // expect( + // second3GestureDetectorWidget.child, + // isA() + // .having( + // (padding) => padding.padding, + // "padding", + // const EdgeInsets.only(left: 18.0), + // ) + // .having( + // (padding) => padding.child, + // "child", + // isA() + // .having((icon) => icon.icon, "icon", Icons.comment) + // .having( + // (icon) => icon.color, + // "color", + // const Color(0xff737373), + // ), + // ), + // ); + }); + }); + }); + }); + }); + // + // group('Testing Post Container Widget -', () { + // testWidgets('Test if Post Container Widget shows', + // (WidgetTester tester) async { + // await tester.runAsync(() async { + // // https://dcblog.b-cdn.net/wp-content/uploads/2021/02/Full-form-of-URL-1-1024x824.jpg + // nock('https://dcblog.b-cdn.net') + // .get('wp-content/uploads/2021/02/Full-form-of-URL-1-1024x824.jpg') + // .reply(200, json.encode('{"id": "49c23ebc-c107-4dae-b1c6-5d325b8f8b58", "name": "Example campus" }')); + // await tester.pumpWidget(createPostContainerWidget()); + // await tester.pump(); + // final postContainerFinder = find.byKey(postContainerKey); + // expect(postContainerFinder, findsOneWidget); + // }); + // }); + // testWidgets('Test props of Visibility Detector', + // (WidgetTester tester) async { + // await tester.runAsync(() async { + // await tester.pumpWidget(createPostContainerWidget()); + // await tester.pump(); + // final postContainerFinder = find.byKey(postContainerKey); + // final visibilityDetectorFinder = find.descendant( + // of: postContainerFinder, + // matching: find.byType(VisibilityDetector), + // ); + // final visibilityDetectorWidget = + // tester.firstWidget(visibilityDetectorFinder) as VisibilityDetector; + // + // expect(visibilityDetectorFinder, findsOneWidget); + // expect(visibilityDetectorWidget.key, const Key('Post Id')); + // expect(visibilityDetectorWidget.onVisibilityChanged, isNotNull); + // expect(visibilityDetectorWidget.onVisibilityChanged, isA()); + // expect( + // visibilityDetectorWidget.child, + // isA().having( + // (stack) => stack.children, + // "children", + // [ + // isA(), + // isA(), + // ], + // ), + // ); + // }); + // }); + // testWidgets('Test props of PageView', (WidgetTester tester) async { + // await tester.runAsync(() async { + // await tester.pumpWidget(createPostContainerWidget()); + // await tester.pump(); + // final postContainerFinder = find.byKey(postContainerKey); + // final pageViewFinder = find.descendant( + // of: postContainerFinder, + // matching: find.byType(PageView), + // ); + // final pageViewWidget = tester.firstWidget(pageViewFinder) as PageView; + // expect(pageViewFinder, findsOneWidget); + // expect(pageViewWidget.scrollDirection, Axis.horizontal); + // expect( + // pageViewWidget.controller, + // isA().having( + // (pageController) => pageController.initialPage, + // "initial page", + // 0, + // ), + // ); + // expect(pageViewWidget.onPageChanged, isA()); + // }); + // }); + // testWidgets('Test children of PageView', (WidgetTester tester) async { + // await tester.runAsync(() async { + // await mockNetworkImagesFor(() async { + // await tester.pumpWidget(createPostContainerWidget()); + // await tester.pump(); + // final postContainerFinder = find.byKey(postContainerKey); + // final pageViewFinder = find.descendant( + // of: postContainerFinder, + // matching: find.byType(PageView), + // ); + // final centerFinder = find.ancestor( + // of: find.byType(VideoWidget), + // matching: find.descendant( + // of: pageViewFinder, + // matching: find.byType(Center), + // ), + // ); + // final imageFinder = find.descendant( + // of: pageViewFinder, + // matching: find.byType(Image), + // ); + // + // expect(centerFinder, findsOneWidget); + // expect(imageFinder, findsNothing); + // + // final centerWidget = tester.firstWidget(centerFinder) as Center; + // expect( + // centerWidget.child, + // isA() + // .having( + // (video) => video.url, + // "url", + // 'https://flutter.github.io/assets-for-api-docs/assets/videos/bee.mp4', + // ) + // .having((video) => video.play, "play", true), + // ); + // + // await tester.dragFrom( + // Offset( + // SizeConfig.screenWidth!, + // tester.getCenter(pageViewFinder).dy, + // ), + // Offset(-SizeConfig.screenWidth! * 2, 0), + // ); + // await tester.pump(); + // + // expect(centerFinder, findsOneWidget); + // expect(imageFinder, findsOneWidget); + // expect( + // tester.firstWidget(imageFinder), + // isA().having( + // (image) => image.image, + // "image", + // const NetworkImage( + // 'https://flutter.github.io/assets-for-api-docs/assets/widgets/owl.jpg', + // ), + // ), + // ); + // + // final paddingFinder = find.descendant( + // of: postContainerFinder, + // matching: find.byType(Padding), + // ); + // final paddingFinders = find.descendant( + // of: paddingFinder.at(1), + // matching: find.byType(Padding), + // ); + // final padding1Widgets = + // tester.firstWidget(paddingFinders.at(0)) as Padding; + // final padding2Widgets = + // tester.firstWidget(paddingFinders.at(3)) as Padding; + // await tester.pump(); + // expect((padding1Widgets.child! as Divider).color, Colors.grey); + // expect( + // (padding2Widgets.child! as Divider).color, + // TalawaTheme.lightTheme.colorScheme.primary, + // ); + // expect( + // (tester.firstWidget(pageViewFinder) as PageView).controller.page, + // 0.9, + // ); + // }); + // }); + // }); + // testWidgets('Test props of Padding', (WidgetTester tester) async { + // await tester.runAsync(() async { + // await tester.pumpWidget(createPostContainerWidget()); + // await tester.pump(); + // final postContainerFinder = find.byKey(postContainerKey); + // final paddingFinder = find.descendant( + // of: postContainerFinder, + // matching: find.byType(Padding), + // ); + // final paddingWidget = tester.firstWidget(paddingFinder) as Padding; + // expect( + // paddingWidget.padding, + // const EdgeInsets.symmetric(horizontal: 8.0), + // ); + // expect( + // paddingWidget.child, + // isA() + // .having( + // (column) => column.crossAxisAlignment, + // "cross axis alignment", + // CrossAxisAlignment.center, + // ) + // .having( + // (column) => column.mainAxisAlignment, + // "main axis alignment", + // MainAxisAlignment.end, + // ) + // .having( + // (column) => column.mainAxisSize, + // "main axis size", + // MainAxisSize.max, + // ) + // .having( + // (column) => column.children, + // "children", + // [isA()], + // ), + // ); + // }); + // }); + // testWidgets('Test props of second Padding', (WidgetTester tester) async { + // await tester.runAsync(() async { + // await tester.pumpWidget(createPostContainerWidget()); + // await tester.pump(); + // final postContainerFinder = find.byKey(postContainerKey); + // final paddingFinder = find.descendant( + // of: postContainerFinder, + // matching: find.byType(Padding), + // ); + // final paddingWidget = + // tester.firstWidget(paddingFinder.at(1)) as Padding; + // expect( + // paddingWidget.padding, + // const EdgeInsets.symmetric( + // horizontal: 100.0, + // vertical: 10.0, + // ), + // ); + // expect( + // paddingWidget.child, + // isA().having( + // (row) => row.children, + // "children", + // [ + // isA().having( + // (expanded) => expanded.child, + // "child", + // isA(), + // ), + // isA().having( + // (expanded) => expanded.child, + // "child", + // isA(), + // ), + // isA().having( + // (expanded) => expanded.child, + // "child", + // isA(), + // ), + // isA().having( + // (expanded) => expanded.child, + // "child", + // isA(), + // ), + // ], + // ), + // ); + // final paddingFinders = find.descendant( + // of: paddingFinder.at(1), + // matching: find.byType(Padding), + // ); + // final padding1Widgets = + // tester.firstWidget(paddingFinders.at(0)) as Padding; + // final padding2Widgets = + // tester.firstWidget(paddingFinders.at(3)) as Padding; + // + // expect( + // padding1Widgets.padding, + // const EdgeInsets.symmetric(horizontal: 5.0), + // ); + // expect( + // padding1Widgets.child, + // isA() + // .having( + // (divider) => divider.thickness, + // "thickness", + // 3.0, + // ) + // .having( + // (divider) => divider.color, + // "color", + // TalawaTheme.lightTheme.colorScheme.primary, + // ), + // ); + // + // expect( + // padding2Widgets.padding, + // const EdgeInsets.symmetric(horizontal: 5.0), + // ); + // expect( + // padding2Widgets.child, + // isA() + // .having( + // (divider) => divider.thickness, + // "thickness", + // 3.0, + // ) + // .having( + // (divider) => divider.color, + // "color", + // Colors.grey, + // ), + // ); + // }); + // }); + // }); +} diff --git a/test/widget_tests/widgets/raised_round_edge_button_test.dart b/test/widget_tests/widgets/raised_round_edge_button_test.dart new file mode 100644 index 000000000..563d093ec --- /dev/null +++ b/test/widget_tests/widgets/raised_round_edge_button_test.dart @@ -0,0 +1,156 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/widgets/raised_round_edge_button.dart'; + +const backgroundColor = Colors.black; +const foregroundColor = Colors.white; +const key = Key('ravidi'); +const buttonLabel = 'm_button'; + +int count = 0; + +void onTap() { + count++; +} + +Widget createRaisedRoundButton({ + double? width, + double? height, + bool showArrow = false, +}) { + return MaterialApp( + home: Scaffold( + body: RaisedRoundedButton( + key: key, + backgroundColor: backgroundColor, + textColor: foregroundColor, + buttonLabel: buttonLabel, + onTap: onTap, + width: width, + height: height, + showArrow: showArrow, + ), + ), + ); +} + +void main() { + SizeConfig().test(); + group('Test for RaisedRoundButton widget', () { + testWidgets('Check if the widget shows up', (tester) async { + await tester.pumpWidget(createRaisedRoundButton()); + await tester.pump(); + + expect(find.byKey(key), findsOneWidget); + }); + + testWidgets('Check if tapping works', (tester) async { + await tester.pumpWidget(createRaisedRoundButton()); + await tester.pump(); + + expect(count, 0); + await tester.tap(find.byType(GestureDetector)); + expect(count, 1); + }); + + testWidgets('Check for size (without providing size)', (tester) async { + await tester.pumpWidget(createRaisedRoundButton()); + await tester.pump(); + + final containerFinder = find.byType(Container); + final container = tester.firstWidget(containerFinder); + + expect(containerFinder, findsOneWidget); + + expect( + (container as Container).constraints, + BoxConstraints( + minWidth: SizeConfig.screenWidth! * 0.94, + maxWidth: SizeConfig.screenWidth! * 0.94, + minHeight: SizeConfig.screenHeight! * 0.07, + maxHeight: SizeConfig.screenHeight! * 0.07, + ), + ); + }); + + testWidgets('Check for size (providing size)', (tester) async { + await tester.pumpWidget(createRaisedRoundButton(width: 100, height: 100)); + await tester.pump(); + + final containerFinder = find.byType(Container); + final container = tester.firstWidget(containerFinder); + + expect(containerFinder, findsOneWidget); + + expect( + (container as Container).constraints, + const BoxConstraints( + minWidth: 100, + maxWidth: 100, + minHeight: 100, + maxHeight: 100, + ), + ); + }); + + testWidgets('Check for inner widget (show arrow)', (tester) async { + await tester.pumpWidget(createRaisedRoundButton(showArrow: true)); + await tester.pump(); + + expect(find.byType(Row), findsOneWidget); + expect(find.byType(Expanded), findsNWidgets(3)); + + final iconFinder = find.byType(Icon); + expect(iconFinder, findsNWidgets(2)); + + final iconOne = tester.widgetList(iconFinder).first; + final iconTwo = tester.widgetList(iconFinder).last; + + expect( + iconOne, + isA() + .having( + (icon) => icon.icon, + 'icon', + Icons.arrow_forward, + ) + .having( + (icon) => icon.color, + 'color', + Colors.transparent, + ), + ); + + expect( + iconTwo, + isA() + .having( + (icon) => icon.icon, + 'icon', + Icons.arrow_forward, + ) + .having( + (icon) => icon.color, + 'color', + foregroundColor, + ), + ); + + expect(find.byType(Text), findsOneWidget); + expect(find.textContaining(buttonLabel), findsOneWidget); + }); + + testWidgets("Check for inner widget (don't show arrow)", (tester) async { + await tester.pumpWidget(createRaisedRoundButton()); + await tester.pump(); + + expect(find.byType(Row), findsNothing); + expect(find.textContaining(buttonLabel), findsOneWidget); + expect(find.byType(Text), findsOneWidget); + }); + }); +} diff --git a/test/widget_tests/widgets/rich_text_test.dart b/test/widget_tests/widgets/rich_text_test.dart new file mode 100644 index 000000000..428dcc5a0 --- /dev/null +++ b/test/widget_tests/widgets/rich_text_test.dart @@ -0,0 +1,94 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/widgets/rich_text.dart'; + +const List> words = [ + { + 'text': 'Hello', + 'textStyle': TextStyle(color: Colors.red, fontSize: 20), + }, + { + 'text': 'Hello', + 'textStyle': TextStyle(color: Colors.black, fontSize: 10), + }, + { + 'text': 'Hello', + 'textStyle': TextStyle(color: Colors.black, fontSize: 10), + } +]; + +Widget createCustomRichText(String locale) { + return MaterialApp( + locale: Locale(locale), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: const CustomRichText(key: Key('richText'), words: words), + ); +} + +void main() { + group('Tests for CustomRichText widget', () { + testWidgets('Check if CustomRichText shows up', (tester) async { + await tester.pumpWidget(createCustomRichText('en')); + await tester.pump(); + + expect(find.byType(RichText), findsOneWidget); + }); + + testWidgets('Check for TextSpan(s) (en)', (tester) async { + await tester.pumpWidget(createCustomRichText('en')); + await tester.pump(); + + // Since TextSpan isn't a widget, only way to check if it worked correctly + // is by looking at the text + expect( + (tester.firstWidget(find.byType(RichText)) as RichText) + .text + .toPlainText(), + 'Hello Hello Hello ', + ); + }); + + testWidgets('Check for individual TextSpan(s) (en)', (tester) async { + await tester.pumpWidget(createCustomRichText('en')); + await tester.pump(); + + // First + expect( + (tester.firstWidget(find.byType(RichText)) as RichText).text.style, + isA() + .having((style) => style.color, 'Color', Colors.red) + .having((style) => style.fontSize, 'Font size', 20.0), + ); + + // Second + expect( + ((tester.firstWidget(find.byType(RichText)) as RichText).text + as TextSpan) + .children![0] + .style, + isA() + .having((style) => style.color, 'Color', Colors.black) + .having((style) => style.fontSize, 'Font size', 10.0), + ); + }); + }); +} diff --git a/test/widget_tests/widgets/talawa_error_dialog_test.dart b/test/widget_tests/widgets/talawa_error_dialog_test.dart new file mode 100644 index 000000000..bcbe81e68 --- /dev/null +++ b/test/widget_tests/widgets/talawa_error_dialog_test.dart @@ -0,0 +1,351 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/enums/enums.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/widgets/talawa_error_dialog.dart'; + +import '../../helpers/test_locator.dart'; + +Widget createTalawaErrorWidget1({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, +}) { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: TextButton( + child: const Text('Open'), + onPressed: () { + navigationService.showTalawaErrorDialog( + "Test Error", + MessageType.error, + ); + }, + ), + ), + ); +} + +Widget createTalawaErrorWidget2({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, +}) { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: TextButton( + child: const Text('Open'), + onPressed: () { + navigationService.showTalawaErrorDialog( + "Test Error", + MessageType.warning, + ); + }, + ), + ), + ); +} + +Widget createTalawaErrorWidget3({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, +}) { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: TextButton( + child: const Text('Open'), + onPressed: () { + navigationService.showTalawaErrorDialog( + "Test Error", + MessageType.info, + ); + }, + ), + ), + ); +} + +Widget createTalawaErrorWidget4({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, +}) { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: TextButton( + child: const Text('Open'), + onPressed: () { + navigationService.showTalawaErrorDialog( + "Test Error", + MessageType.random, + ); + }, + ), + ), + ); +} + +void main() { + SizeConfig().test(); + testSetupLocator(); + group('Test for TalawaErrorWidget', () { + testWidgets('Check if the Error Widget shows up(error)', (tester) async { + await tester.pumpWidget(createTalawaErrorWidget1()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsOneWidget); + }); + testWidgets('Check if the Error Widget shows up(random)', (tester) async { + await tester.pumpWidget(createTalawaErrorWidget4()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsOneWidget); + }); + testWidgets('Check if the Error title shows up(error)', (tester) async { + await tester.pumpWidget(createTalawaErrorWidget1()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsOneWidget); + + final finder = find.text('Error'); + expect(finder, findsOneWidget); + }); + + testWidgets('Check if the Error Widget text shows up(error)', + (tester) async { + await tester.pumpWidget(createTalawaErrorWidget1()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsOneWidget); + + final finder = find.text('Test Error'); + expect(finder, findsOneWidget); + }); + + testWidgets('Check if the Error Widget icon shows up(error)', + (tester) async { + await tester.pumpWidget(createTalawaErrorWidget1()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsOneWidget); + + final finder = find.byType(SvgPicture); + expect(finder, findsOneWidget); + }); + + testWidgets('Check if the close Button is working', (tester) async { + await tester.pumpWidget(createTalawaErrorWidget1()); + await tester.pump(); + + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + await tester.tap(find.textContaining('Dismiss')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsNothing); + }); + testWidgets('Check if the Error text shows up(warning)', (tester) async { + await tester.pumpWidget(createTalawaErrorWidget2()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsOneWidget); + }); + testWidgets('Check if the Error text shows up(warning)', (tester) async { + await tester.pumpWidget(createTalawaErrorWidget2()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsOneWidget); + + final finder = find.text('Warning'); + expect(finder, findsOneWidget); + }); + testWidgets('Check if the Error Widget text shows up(warning)', + (tester) async { + await tester.pumpWidget(createTalawaErrorWidget2()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsOneWidget); + + final finder = find.text('Test Error'); + expect(finder, findsOneWidget); + }); + testWidgets('Check if the Error Widget icon shows up(warning)', + (tester) async { + await tester.pumpWidget(createTalawaErrorWidget2()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsOneWidget); + + final finder = find.byType(SvgPicture); + expect(finder, findsOneWidget); + }); + + testWidgets('Check if the close Button is working', (tester) async { + await tester.pumpWidget(createTalawaErrorWidget2()); + await tester.pump(); + + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + await tester.tap(find.textContaining('Dismiss')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsNothing); + }); + testWidgets('Check if the Error Widget shows up (info)', (tester) async { + await tester.pumpWidget(createTalawaErrorWidget3()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsOneWidget); + }); + testWidgets('Check if the Error Widget shows up (info)', (tester) async { + await tester.pumpWidget(createTalawaErrorWidget3()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsOneWidget); + final finder = find.text('Information'); + expect(finder, findsOneWidget); + }); + testWidgets('Check if the Error Widget shows up (info)', (tester) async { + await tester.pumpWidget(createTalawaErrorWidget3()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsOneWidget); + + final finder = find.text('Test Error'); + + expect(finder, findsOneWidget); + }); + + testWidgets('Check if the Error Widget icon shows up (info)', + (tester) async { + await tester.pumpWidget(createTalawaErrorWidget3()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsOneWidget); + + final finder = find.byType(SvgPicture); + expect(finder, findsOneWidget); + }); + + testWidgets('Check if the close Button is working', (tester) async { + await tester.pumpWidget(createTalawaErrorWidget3()); + await tester.pump(); + + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + await tester.tap(find.textContaining('Close')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorDialog), findsNothing); + }); + }); +} diff --git a/test/widget_tests/widgets/talawa_error_snackbar_test.dart b/test/widget_tests/widgets/talawa_error_snackbar_test.dart new file mode 100644 index 000000000..7469fe712 --- /dev/null +++ b/test/widget_tests/widgets/talawa_error_snackbar_test.dart @@ -0,0 +1,243 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:talawa/enums/enums.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/widgets/talawa_error_snackbar.dart'; + +import '../../helpers/test_locator.dart'; + +Widget createTalawaErrorWidget({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, +}) { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: TextButton( + child: const Text('Open'), + onPressed: () { + navigationService.showTalawaErrorSnackBar( + "Test Error", + MessageType.warning, + ); + }, + ), + ), + ); +} + +Widget createTalawaErrorWidget2({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, +}) { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: TextButton( + child: const Text('Open'), + onPressed: () { + navigationService.showTalawaErrorSnackBar( + "Test Error", + MessageType.error, + ); + }, + ), + ), + ); +} + +Widget createTalawaErrorWidget3({ + bool reverse = false, + String? dialogTitle, + bool passSecondaryFunc = true, +}) { + return MaterialApp( + navigatorKey: locator().navigatorKey, + navigatorObservers: [], + locale: const Locale('en'), + supportedLocales: [ + const Locale('en', 'US'), + const Locale('es', 'ES'), + const Locale('fr', 'FR'), + const Locale('hi', 'IN'), + const Locale('zh', 'CN'), + const Locale('de', 'DE'), + const Locale('ja', 'JP'), + const Locale('pt', 'PT'), + ], + localizationsDelegates: [ + const AppLocalizationsDelegate(isTest: true), + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + ], + home: Scaffold( + body: TextButton( + child: const Text('Open'), + onPressed: () { + navigationService.showTalawaErrorSnackBar( + "Test Error", + MessageType.info, + ); + }, + ), + ), + ); +} + +void main() { + SizeConfig().test(); + testSetupLocator(); + group('Test for TalawaErrorWidget', () { + testWidgets('Check if the Snackbar shows up in warning form', + (tester) async { + await tester.pumpWidget(createTalawaErrorWidget()); + await tester.pump(); + + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorSnackBar), findsOneWidget); + }); + testWidgets('Check if the Snackbar shows up in error form', (tester) async { + await tester.pumpWidget(createTalawaErrorWidget2()); + await tester.pump(); + + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorSnackBar), findsOneWidget); + }); + testWidgets('Check if the Snackbar shows up in info form', (tester) async { + await tester.pumpWidget(createTalawaErrorWidget3()); + await tester.pump(); + + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorSnackBar), findsOneWidget); + }); + testWidgets("Check if the Snackbar's text shows up in warning form", + (tester) async { + await tester.pumpWidget(createTalawaErrorWidget()); + await tester.pump(); + + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorSnackBar), findsOneWidget); + + final errorMesgFinder = find.text('Test Error'); + + expect(errorMesgFinder, findsOneWidget); + }); + testWidgets('Check if the Snackbar"s text shows up in error form', + (tester) async { + await tester.pumpWidget(createTalawaErrorWidget2()); + await tester.pump(); + + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorSnackBar), findsOneWidget); + + final errorMesgFinder = find.text('Test Error'); + + expect(errorMesgFinder, findsOneWidget); + }); + testWidgets('Check if the Snackbar"s text shows up in info form', + (tester) async { + await tester.pumpWidget(createTalawaErrorWidget3()); + await tester.pump(); + + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorSnackBar), findsOneWidget); + + final errorMesgFinder = find.text('Test Error'); + + expect(errorMesgFinder, findsOneWidget); + }); + + testWidgets('Check if the Snackbar icon shows up in info form', + (tester) async { + await tester.pumpWidget(createTalawaErrorWidget3()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorSnackBar), findsOneWidget); + + final iconFinder = find.byIcon(Icons.info_outline); + + expect(iconFinder, findsOneWidget); + }); + + testWidgets('Check if the Snackbar shows up in error form', (tester) async { + await tester.pumpWidget(createTalawaErrorWidget2()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + expect(find.byType(TalawaErrorSnackBar), findsOneWidget); + + final iconFinder = find.byIcon(Icons.error); + + expect(iconFinder, findsOneWidget); + }); + testWidgets('Check if the Snackbar shows up in warning form', + (tester) async { + await tester.pumpWidget(createTalawaErrorWidget()); + await tester.pump(); + await tester.tap(find.textContaining('Open')); + await tester.pump(const Duration(seconds: 1)); + + expect(find.byType(TalawaErrorSnackBar), findsOneWidget); + + final iconFinder = find.byIcon(Icons.error); + + expect(iconFinder, findsOneWidget); + }); + }); +} diff --git a/test/widget_tests/widgets/theme_switch_test.dart b/test/widget_tests/widgets/theme_switch_test.dart new file mode 100644 index 000000000..0da53d784 --- /dev/null +++ b/test/widget_tests/widgets/theme_switch_test.dart @@ -0,0 +1,93 @@ +// ignore_for_file: talawa_api_doc +// ignore_for_file: talawa_good_doc_comments + +import 'package:flutter/material.dart'; +import 'package:flutter_localizations/flutter_localizations.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:provider/provider.dart'; +import 'package:talawa/services/size_config.dart'; +import 'package:talawa/utils/app_localization.dart'; +import 'package:talawa/view_model/theme_view_model.dart'; +import 'package:talawa/widgets/theme_switch.dart'; + +import '../../helpers/test_helpers.dart'; +import '../../helpers/test_locator.dart'; + +Widget createApp() { + return const MaterialApp( + home: Scaffold( + body: ChangeThemeTile(), + ), + ); +} + +class LocalizationsInj extends StatelessWidget { + const LocalizationsInj({super.key, required this.child}); + final Widget child; + + @override + Widget build(BuildContext context) { + return MaterialApp( + localizationsDelegates: const [ + AppLocalizations.delegate, + GlobalMaterialLocalizations.delegate, + GlobalWidgetsLocalizations.delegate, + GlobalCupertinoLocalizations.delegate, + ], + supportedLocales: const [ + Locale('en', ''), + ], + home: child, + ); + } +} + +void main() { + testSetupLocator(); + locator().test(); + + setUp(() { + registerServices(); + locator().test(); + }); + + tearDown(() { + unregisterServices(); + }); + + group('Tests for theme_switch widget', () { + testWidgets("Testing the widget", (tester) async { + final mockAppTheme = getAndRegisterAppTheme(); + + when(mockAppTheme.isdarkTheme).thenReturn(true); + + await tester.pumpWidget( + ChangeNotifierProvider.value( + value: mockAppTheme, + child: const LocalizationsInj( + child: Scaffold( + body: ChangeThemeTile(), + ), + ), + ), + ); + await tester.pumpAndSettle(); + expect(find.byType(ListTile), findsOneWidget); + expect(find.byType(Text), findsOneWidget); + + final listTileFinder = find.byType(ListTile).first; + final listTile = tester.firstWidget(listTileFinder); + expect( + (listTile as ListTile).contentPadding, + const EdgeInsets.fromLTRB(3.6, 0.0, 3.6, 0.0), + ); + expect((listTile.trailing! as Switch).autofocus, true); + expect((listTile.trailing! as Switch).value, true); + + final switchWidget = listTile.trailing! as Switch; + switchWidget.onChanged!.call(true); + verify(mockAppTheme.switchTheme(isOn: true)); + }); + }); +}

_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 zcmcG%30z#|y*K_m=gb1bFbvELGr$0|Fbw;!4@=kyApsIX2!VtoWZy_aR#Bs-HnzE` zHMusmt)`l5t+m$L;WRGYbA7$mwyEW{)|=N-8*N|f^?I%KrdGXX_t58pu*1?~?PPr51zay#)VplO zs-DjeFuop_T?LC)tZY5|zxLEKzRJUx@#SSJLghPH=26D@Lntt^Y4?V)U;gALBa9_H z&6xb?ro#t4j_<@>hYt?p`RLZMZM*MmdFcbjk`CgX4cj&x7-KHx#rII2S+|W|zx8)d zE?UNz^C89y7i{0MVRP!pOIuKu+E=|DH=@E=5x=;+w!HXI{y22bDO7o zr)BdC@_AgwF^TTt5AVt6r)9>>FW`Bv`2|sv`b_Mly>tirCz**Y#9Yvq7|v0JWMVR| zby9$zVtU*;Ar0bLmwM#uSU=Cj-2|O1>m{8eAH`JA%i7QG3NZ-XV3!8~`%3fSQiZ;KAYcq36dsrub2lpFs{UnYBcwQMh zw&Gqs%DA!Jif@cFvwS!DJdUjo^;a?vM_Fn!jvoFZGxJLrol|UtN10n{#yci)bW1Mg z=73V%bE7Ra7^7k~HT`S;2b^DEHF7`7;=WXh=L=XRHaFjeKK+!r_(r^!#VXNGorH~F zWN~!PFW{Svfc!tA4UHJz6wF9$?8SGDxHrHSpe{3&k(?|KZL62;EQi00F)YGXj(Nh^ zi+iUqehcvq=7g8xyKUG`u`koNCBm=>=Ij((#NI)BbeNYS)P0GS%5m5lP|vFvI~wDc$!6AMB z1SpgqqSu}UzdmnQY z^M^5=f7IQCxqcG;1kMrM6At277`rYfJS1HB*duUM;K}?W!3fROKX?@QO?U>FLchdO z;5l&ZBgYCBBv_~UCio^8)A}{j&RBbBEP*?DG*(vrZx<~ag z;G5Jj9g$v~j&S>QMAqZ{ZftK(M^N80REB7r82{5aCl~=8qB)mqSb*?~=1;mEbgL0Z z%n5%Z*2cR;*-rj0;GO6j`YWdZMv1n)40_~Z1q2&{&JiuT418DVRS7% z1aLnGbcyIxjdYR~5e&s(MkmHmhi8OKkK;&m(TMY2y!SM&slMkx^Fi07M_483i5va< zi?~nk;5pp`4XTv-@x8BO3~-dk1+Egjb%JiVFb|#5Z_o$83iVyIA8@S81OK71_z!%G z#v_7lHO7m^AU1~DILbz~PWc#jvVqUO%x6}=sdK23jjLT766TUw`{UOFQPx9d& zHX2K5kmXDNj4_~lG%gk#iC2KG@JG;pg4fqrK#XH6-nk4|xQw~XL%DXe@0_?-BN@;Z zhWWV!{%=P;w1GB2x}j%o!ZXYt@u$BK++v*bW$;%~hT1{xp>NR+`fOFWEZiB8;WMt@&tD~N9izNYau)Jt{q?bJ8G80wabnMYTL?@zHj z9Bb$(>%_)pj_s^S{{M12hc-ThcE5@3=V^15&e@dV!IP%&=+|Xj%Tp}UUWHV zH*i(DAJ^C*9~Q}LA^WtlRH>S!vLCPlNrG&0irs~AZpQJrfMddEqBjsPW1Cx*9Qgx6 zW&}(^x*%D19XO+&W#KH5-OS5)6Yu0V^E>&plp%$spGq%DQ}QACX8DACyZkTm59H_M z7vvXp>vjLEo5;E?>%TpAPr4_|OAe9gPsRG-}F4OYA3kD>lMG;cRV(a%i|XH z*NXbThWfuH>VI-p{qpqRrvLBs)6-8)|LgSm>2FVWOqWdCqPIm4MGs#2-Id>5nY{9= zE6-i|<&_IpetzX=SI%A;yVCcEV}EeH^8PFDzVg>s-g)KEul(+n7hd`LE7!ep;FbNa z?0aSJD?47<_Da$v`=yka#4Wn;|I5w*?8YAidz!1+f1GK0f^PQhYnOJ2*|{|XJb~p%*XtY+yg9^1pzhr;0%SJ z@Wrfzg&={Kv2s?yDp?h)W?^7z^s zVN2OE*2|W&KHz3QTge94DmKW5*lM?0f9T>__Y;>^y2X$hNX= zY!~R=4eV=dKiiFa;|w|*JHgIie+V06JJ|K&$oTCz?g88%W)HI;vQM)uYz#BeB%bbN zw?MDi%#N|ovaj$IZj;PXqLeJ9NERsxn8(=v;x&NcEGZRoxB7RZWQ9J%*k{-s>^63i z-Om1*-O0YdPO&esFXR4Q>|S;s`zre@@8Z4e0Po>T`7(BdUgq5lT`TH}#P<$PaDK7{n zvVHEsg%PHLf%2UKen44PPP^1PXI^fa2fG%t&OvRsdIu9G{ zAdq{luvu6kUs^#nB{{%2WJ>xgne}foyPY@l*QGnvX@<0eX|JZ|rN5L>nsFo};?}u`-Dlh{X8JO#GmmEe z5dSV`-JJDq_Ghv`0MC8ho8$eluhZA>+v7XzPxn{*Z}EBa?a#D zkn?8Fdx5xsE07oXOyEr5T;Q3&%YkU_vD|lqcLg5}o)11Bd?(M8=gX_hJD&G?KFfFI zm*#iokK`ZCzfiEb;7Gygf=3E26#TKUy6~aGbA{&%FBD!Z{A1zUMb8!QFTT0>MDbn4 z_ZL4}{Qcr*N>WPBms}{hSn|h`w@W?@#f7>_#NYzprWp9tR-ekS~U_>J(pHH|g*)+jZTHLurPu4T36 zT6=9#ZF_BR?Qre(+Jm)6YoD*ns;jPRty@~Rx^92n&2_KUch+yL-&6mY`aA0%uYYDi ze}lcDsG+8zy`i^Zd&9wo+Z(>z5NY^f;|)zqng*ISHa*=u*gV#Ju_deJRLesx=USd? zd8y@{mT0THHLtb1b-4AJwgqkdZ6j^tZO7V9wLR2!uI=Y-FSfnf_E!7q_O}*JE_{9A zXUCC_2RfeXcyEz=(Vj(*EIPO7+0N9?g3ix$KG69{=Va&Q#rDND zi`Okaw)mmNk;P9gKEF7+#IVG&Bz4KbB}bMVTk_r!`f_YZrlJ*7R(J-t06JqLTf+;euRYw5bBPc187c6{0My^Xycy?6Ic_5N}B>g5}k zKiX&R8|!Ml?PW&4M+pNfl~ty4LrLlZ`JBm zldCSSx-?icSULFMQ2Nl=(D9+OLr)G}9{Os{3-IKdt+Wp$@clNM7S$j(M^zAvk=fORX?qz#_ zJa%}WY2VrXS^H1#fA&D>fpZ6Q4*vMy^x@N|Pe1j=^e-O!;=Pa&VV~vifcD9d{>l}m zmkSjgmkYt_77j)Xp^OPbQR9%f(Bnd%(>OH2ESDn&>x68%Tv`_PCVM%yQ0Kg4C@8z^~+Ti4x8QJ z_vKbqR#%j#e!0^$oEpq@=jFLGgD-RQtFK1;)r%k~HtYj$aC@vD#R|h`6rEA~7DM$6 z-cQj#ZqyRs$J-Cp~C=*nTo?j z99_7q6O!Swk|@O`r_@Fg(QC9dM6E${6Ri^_!)0|8sHJFi(qtrEG%e9eZOp^~iS}mG zFja*8Hh=0y!5WF5 zjHFpTzw!VcT|*@S1!bB73JY8I|I^}zE)hH zm04VznN=TsV%EcsncJWRIn!@TE2SxDyg_zR$)?e?(P(C6V#g)y663OI_JLt(Qwrm0 z1QD{7NQVUIeK@$&I304-n*nii7Vc|=P{II9+GuMOH)6F;r1Hy(tWTvnGOcdNF5b{padnlDdiR&U#nPY zcT~ssMf7Nro|+`s3pf%FDYDK?pb~G^(LBe8CgSv$AKx2yOWesgd7om8quYupUOY8f ziST38tb)GbqoDdJpkmw@^c#cW5Dzzao+)c#Y5~he#5nGZ4 zf6@zzA4iRF_(4IzqR|5W)??j|J=V>uX#dz_0*0nf!IE<;>{TU70(}E84OA6;P(!8( z7Jpg8419ee&Il^x42A_chG>DQTUA)?$Rx?aKIZP%`COU7U}lB~Fj~W{e4G!1Q<(?^ zCS(IqFmIKYk4Mi#8?+J|LpdSqpdASeunZoiwm=9uK;UBklsKh}?i!+rj=oy5Y+35kSNDA2%$6-%x7>60wk=z>-F>(le}@nEbaj*KAL9hOGB1K$Wnf{^$64Le8l`nl z(KDi%fb9t#q!<|3afQK8_9p`>dC~A~{+~&YTXxq4>YhTsooth0hw!H)k_cfZ z%0PmIka=cAF2Ty?e{zCh5Kt}|vJnWb&P1$VNmLJ(WNLtt%92Gp0uFCgxDgzkh@>&t z$OR+;L#CqL6GQDC;ZVD&-@dpe;^vw>U(>4nD>fbY8O8#9h5sko zTf~kj3=^aT)3J*u{*vv{=F5-C_G|6b#5~2W^P>?Fdq|1c`95WYc5ym8-NRIx(e`*d zQ2_LQ!YN&j_^lI}xS8$D#7)KHchVu>E)E4wdJh~RHrXVrfYu8_R>-Tsk3}EVE($^i z!G-^4TkFQ2#-`MM>*9)<{Jetvy86m+M{D&e&r0X$;x&y8!_^H>tzNL8q_oFh+u+Zs zsPOv-8p?`mhH{#gR#&drRH}0h5==-06OtD&VS>$hw+i_JmAR0$K`zWOav}5)Z7gQM zgmDA)6!aN0$AI3_WknxHa|Jr1Sj5wYh$ZA|PVBO*vFx(kX!)Gw9*bcux(w3dt>P8Q z6^=kfvY-EKIQj$Luz4`L_jkHer%rY77o&9p1FBIMu#5TnAG9-*?NJzbkK%&-q!?$g zT?p=4^EA{~GVDTr%m^t4IfEJ{3*d@mSSPGt#YU4AHsm2J&mG3__I0Dexs21RA3_t z!-FeYT00i4-PGRR_R}Tbl(P5c=Py{0mk;==EiB+lYs>24h3)O_Ygg>#1r={dj+g86 z^YZfR>+r_3V13fUwq?gI#3~VO69O+SZhk6jwkONs!g1 z6mt@ZX-bADpc1}0qV^1S*XV5YR!wNa3s^SSc*Set0GWFti1q@@Lqw@Hq!o$(FR!jHKlr1;y88OM!Rn!OU3z!Hikfh^W<^0aE{1q~X?=ZZX-!S^u8bmY zN{Y8AqtfU1`&HbY17~g>2FOgZbJ7e$5}>6`ivT(>q*-uw-+VaRY&~c_W<4$7Ohxl~ za2B4WTmatWU^r+9&*NaxzP6T*j&&NCdBzIz>+1nRg|z^)4_exW*0ur60ASY~Bs2>RG$lr^gjGY+-L;-U(3+58lQEx2t|p2 z_e6+}xU`c{G`levwpjwwjJ&d8MpBw-(3O|w$xM*@ehj(K2#dS;v;b@x2tGBzK=ULn z6Afz%He&ZBL3aWgTOfuRB(MJ9hZG5~t`ffMq10o`DHLGn#kU1l@O@iiT6iwig z5lxto(I_1kJU=Fh7_Acqnd*1wtI)bC)O`cbjlRUoMAL5TSNU1a^auP$5JH`xtt%B* z7Qo#`;)t1e2G4R4ZgV0J>gWjLkEQ@-pg9>NF?xk1j8s38M9e19jzmVx0)ykPsw7M% zMAjq^3pYAv!4J<`=UwYvP_Zg|z%|;r`ar=!?$AK#`XsR1?G94y6E?vQ*3} z^^SDZ8Pfsj1onz@jiRa6gRoN+3981HMwv_u&Q$#j^(&G5K8qyR^mcRw%GUIULCBW% zROmYE7Yz>|I|e(mv)(lmpr>CW-FCN-lwR327Mdg(bLEF;PRT?LbymVx2 z@#4C=!BrrR#qal?ycO>c-}>p{HSTs#MaAlpjTPk^iiqcAptzC(C{(n5L}tcp^Mq|C9%YWzar*bIj@#R+l96jDx_ z_}U2x97Hw{J8pn(GdLk|XOi})g0|qY z8fXh0hG;wDNoda9p@|eUE-r;Ea!R~Ag>G`|M6xO}Kwd2^t4Q{$LW8iCK^c)9nrJ%v zw3Ev#8yYr*Tbmo#Job$;uh-)Ved~MWez2h`=|WAoe`ldCWvF(ru1-4mTd%LMz~_zr z>OcMd(vVj07_Bs!=IFuIr$ z)B%U3KyfgHh!NN}15WjNYuAMt~ zp1prdYtQ&~y~~#MUU$=QTg7SXu3cx(?i@YTyta4QEw?P|-O5IG~`b&K8KL^xr5zM>~nDMg} z3c~gw|B(=QRkE3}*^ns~T&(p$P=$p~G{`q^VA0 z37-WT)nV|rRO$Vp&0jk+ioY|=9_Cwzhoi7}M1RREu2dqPJO)eb0klVEKGB|Qd|3OI zS|KXZ=H3Naa}pO8)}WY$$7aTUA`DGh%e4w73>bW!$w26dzRD1WKp|loB3(-e&S=NN-nQy=& zV3>myVj#%~Lr*jmQ6xs~0y7{rzByqiZb#hpasL$el{o!cMHcFnqB97gz$k=Z#bPE8 zM03J`Wvk_|6@zl`qH@uj!? z3e#{>!{wLIA3e*RI-4IXj(Rk(T=^(3>~=fV|qbeQ-s zHU`Mb|1aUn!bnboV5{gP3(guaeJ;f+?h1DVxSX}#+GSm1)s)h>wcw{J#Mmlq1cGoe z;-3@n^SnQ+LKV`Z7EcJx!gt^6L})YcLFUo&awEy+St66nsP3@by}W zSRrOK#^A0=tmYU6=Mp3msmNJ#Rdtv3J9pi42Fz;b8SJmzymZ;2Lra$}TYBiwvZZ|M zeY-|Scio5m?p^mDS-yOE?@c%L;-K*?H^$ctiMdkDWI}1`Ft(~xdu0o@55^NF$C-F}h9cD=m4-8*k+tS+Fyza|)hjRjfoG|xAUzRR3 zHV&<6XyAPx1OgT1fm{GGjoG9aGaDqGJ&K>k%$o6uV+JJ$)&${-P$bn1Z&N8dniVs$ zW`ppg+R106xUz*P?Fzv%*#IfQrKE{FkP3uDW=7aWFAPb%JRA%=!IiJtW2NtRmh}(L zjC;$1|8B1B?_ANR4*b$(JhV7}X5{9`N==I|fCElGgs5NxRVXfXW5a5Ur#pE2;%OBP+YhgD{h2|XoKYrn>p32qdJ zPMAmIEkcfq4}tm;bO~P)#M+4fV9Q~hD2CMP3lvk=d?Cf_qn8>YUg1T%YD0zMA?69* zpcz-^Y$oo^f-h}h$L68-_VmGcPhn+dQ?ECB<$z;lqA(D z29`CaVhaY>qJ3qCQwYIQNV&vOXILxDeJ$55UOYU!eEINjXQy>(&n-}?>jt-O9pukM z8*lCI7X2X|iFmA$^$Tk&T&o%e&S6Z~lt|!3Ag~iIvgYI*eWku#->=`SKd3*ZKMev~ zTITi3;0U$~zJ27wtxxMNKpeXA18E^Xjec99@SMQ6lNk6rVL!2UbwKAZ@j3c|=6DiF zp|N)*Q8WYs0k{^a1cGZp5zyVJ`<(6`oo;P&e7>$$w^%oXb0tAim4$?m>+#%#>V%F2 zd2Mq-f5PU3g9sx$ouFR};z<0RxETJ4F4!vMf{~xByIXhnx}T1GNq5h{J;Vbl`Ne1+ zj=$u;juxwZlD4ByiR@D8Uo^8Hnr)p4ZS!r`u3}P9@Ra%=he4If2`yC`ReFfJSF;I^bQ_S z=YwFO18t9ILn^1xld>je#wd|mskU(rvzRkC8swwrswJDc4Uecg+D73t1{TCXVrcj; zqZ7JskMf@AcM)-YOZ0b~?3x^r?+h{B)Q%;Jk)n;_0F&g}ROM#K1PE7&k5SAy7&3zt zaiAs$K#3WkjhM`QUPZ1&2lqovBE`yR0O!+#rjo?R?H4YLj~|gwcVD4AfVnvzBj%=rB!s5Gx`}qcbc5zVl!oIL6s6)#wBo{%Zs|j^!I}Bp z{O731$ckd(@=P0Mz)3%av4K5=tV04(0O~eB{Ly|JPx`^gO}d*#egIkRxtCtz<;Lq0l!8t`Kor5r`D= z&t{pLC0MwLG%iHeCDIKWuRr3YA*GHdk?;q*xUY+GAZEL9*!BAi>SAY7*$fp zX&FZnF@mGi&I=q+r(tG7X-))l(1t<712J0yLx@<&j0AcFe-SJ4oR7q*SH7UQqAt+=SD*jkd?jxfLW z+>-8|(cRtM{pDp#d&=?Gv$VX7`p3mwzk|8XU|W?GA}?u>l9dGb$kaXwdh(HOz!qdd zTh%5jW($SgM9d+)r`m!*$Q4&A^$rFgRH+i2G@7xi_8+ME^9?|*-JOdTb?)v$U_x+X zQ%P}gNz<16zKjFbCEa`XEm_jl>L0GC=<2Gd81}bziTMGnN^zKbRO08D!f3k4^hKW~ajXwlH$lo1o( z_xM>;#B|;yuRYgm8Zk-xX+ANniq&F57jL3iHzgTqQG{*D@SK?7#sR%UJgh4Qp=!9Q z!{`-WbeQmDFIjF3+&+5y@twOr#iO@K!_9-`ecnUA<7v9Crphks>3w5g{QNDZ&cVUF z#tzKqY7bMOd+65$P6UlTEViG*De6H$uj z6AUtn9Iq#6goP~uQ<^l103cA=ay9HL6P5!AgG9X1Bc5LFNpofS3XdLzfqSj=Lh^ER zDA?E^-O2CjU$l62Y+hVa9Ofkn8DC#e%mK_xDSXNlD5-MAfQX@VgkbohFv`>rG_^?a zWTZGYLHTHBzSigxT$E@R0vJKfMc*`F6p)y&LZZVB&gIKbw=Sf2JcNGShQ(ml6XLJC57@O`)fcJ9jijCHw+)D>4D|!)%Kjy zZR?{KxbN87#^_(gJW{IDcK~+@n8`BXQxxE*5)9$T)Y_o|7R3R`Qxow<`s^$xlo22P zPHsjnR*QirHU)R{YGqV{)D+n zWQSFcj4+IvU{NG^HBPDnF-O~&gL|4zDP~6#q!7PExTi=WP&lSpf_RCWuvXHuL{7#& z(nx};y)KL?wDCXf{YuyH@C%23^6a0Md=)~^qJP)@I7&--sBLAZ(N?mT{(Vsn({UP; zF2pzigR%$s>eKXqbXYb-WH8Awv+TZe7@nAO4FH5Lpk2)2=rf_h#6Hr2%jpE7YFv(z zFcTk=4a$=WvO`uZhhXZdBB(`xEQv5zPfmkBI1s4UXKNT;IXqlmU)3pg{0+cxdC|J< zBhlx0&ccS(4bi`-M-9&euNYKP$bTtxofLr3By4xHW>V{fm@n-@(_zF+is*alglrJ5 zD$smz27za4!>OsUCf86?3CrZe;U&YOg#yb;#)lfCe^GguWEZqj*y6}f6E|av69A;O zL5tCwuw$rTLUPkL!!vOnYJgsNo-NJ|iDCDm&dx=>k=wIgQnGM4JL^hvFm2CzTv}sUon!9Eu=0AU!r_LT=ESn1<<1 z(=LP&NF&vn5Fto)mP)E^Ry7PJE9T4oh|mBb&ncw5SwbGqnl$SU0x zuIv=y$`%4ET-K_<>aPlal(ES3dMw4Mvg%b)Xz=nZ5$WPZwJWM16kR=AK+KNYGnuBMYp59u2q#3etSZQJyORTzJ^YQ{VAwol z>?f8+_Bj3>jI*EpP06Ml0}7Oj0N)H`?vG?^CIvJR`7f|~LZ(SWV#l?HUNjs7JYmua zyPF$YkI_Wl;+vpqx)g(vsAdD|b)B;tatsopqD^GFJ4Ycx(mv%gR=)3CjkVK?Cugki zE8bu|f%9{#tlQ|;*Xh(e-YT(YKEeO7rt+;=4CDQRvx96`fe=X%pd(oo!$Ms>&B zw;8TNSG}tX?pu;MyrhqLsWp%?1pAo@)(i2OXnG+AI_%jzm49b!<&rTMGCcB&>O1>S z?q1ol!_jAH3g*-WQ!>c3p(*X#NcsjZcO zhu6UCZIE*k$UkNSP!K%KqQ7$*D5$K~bj@})kCV=&zg{S~B)sKTfy>8ii~O}Y1Xu_; zyfXSc$S+T#cEK7VV$+TA6O%b{Rv4$S-py%&c5xM7uG$o5*$;DvpV@p$x^pAk)5o}) zm`~r4Cu$Jy?Y$$r`St6s=c8y|Dx%kq<9G+(PaDP~4&yP2b|yd;5K$;3Ohoh= zx&lCi1&}OU!r4WH69Fm-F}$54o&H13C&La}E)GnUf($|m0tUhOf;6*Wg)>~iz26zV z{<_g`e{=iw2S(q2|FOs3|I4?(P4fqP4~=Ua`QFJcOLjoAKmZW{T64k=v@xE;R>iP_ zl*dL=F$(i!0}&PxS05JR$KQ(na{d0FZ@yEygTHa5@o)SW(X)I6-}hj=9>MqHS^G!q zf5P~uiWb7Ip?zNiA5xvsLX0lOn4!h9Er0xx=t1s;1ama{A3UR%cl7s0zYj8xZ@OUn z%Yw}<6W_E`oCWN%kkTLzr%f`7F@?R~$cPuA7ZY(%OTmY%2B<@EVwj!An8kA<(*PMl z50q)(mHw)7?5peHCH7?^U&fK@blB@T&r0oHy=2Mi?$o3q-rgn+B^?>+z8_h*_jeC< zZ+Q^?E~CKskkyaMFLZta2rvNEYx@>;?f&YD+Xnm{~YMa;_{2hKX=u?>Z3B+GDFcskdaN`l% zx{3G;NbH0Oa|QaChyw=RI(dYQ0f1H?$$Un?$Wn#RCtP7S@awa`Wp}ux&PC<^2b|*M zjg~A&UANegJW`6a2c86{pq(N z#Y}CI5b@?m>5`w#B|Lv-V0Yt(@p8$JtSy8!?#fY~eb4|$< z!H^BeWfK`y9=Oq|1(2yNvI7x&&H&)ik2zLzw-D|}2C`ssb@=U!qU@BE?4k@VReZX8 zeO-NB{rc{s75!N)9a)kb=P9nu_S6)6jaB2xD+dx6E!wiBW07TGW%9VcBRTqzb&-Ha z?EZ!r?f`s;Zt`iR5`(hBfe3>th6U6QL=V;rLN8*TLiN!GApj{cK+=f^c6?4_CxUr0 zJVFW22&oDbh54rg69x5Dtck*qo188JepCyt;!h7?IG_SmRX6Y;>@70_gHR^mF9p-J z8=dgAI}Jw9M!uoF{m@Y74oAOxpuD+L_t^vWveM}6F5cH$yxnB%+1j(>z|v;_P;*J? z4e>oA^>VFeuS77gfUS|zC9DmGjFT@anIzw*z(~U|L6CEl^=Syd`ZIQjOhtzp;P7=R z%?ZdXkSgs^z^CS1grU(jE8>_PuvOoC*Agfj38Sm3}ckUR@? zN}WU|q;LvjSP`Y1CS)g6Igzg;wI)cphr-1T>u%U-B-ec`F)_sF={WnU76bwds_JVN zEvl)ns?W*6Zb6&3B~y>^oti)}m>UiUbJtYY)irli)>qf&=hs%(RWEGEuC~D8n5aYI zKwdp=BXK~`0`e`D0!N&%@QY9`3kB?^kV6^fd=PAOPagw?Iq5^fuC2j^Cbhz?K#4*` zl(7)&KB8MzkXx*Ti^QD4Ug^krta%Il3jj{0RbOf|{{eGwCU^HAv$mBWyA#jCe4`+SGdx ztr5r(30fyg;GVZTOHfep#Z!6Zb3TA;y3vgz^HvmeX;x9s0!|KDspE)btm3QI(RuuLCT?h50bYTA{RgmI%e@hfHDEc;&B z&&vK!*?*K7)+$wDY601}vbjk83URV$8)j$clprp<`f3VoOz5XnZ)56LyKc6*I@aiX z#k}vQ($vg2xWQ7M50g%~O8>-kz024>=nbdw6!kz1?uVmD!TsL6+p%ZkS?GW0#6 zb0JTY2YOeM2c`1d!qk@sOvuA!L7oQ_F;Sd)IpVQSRHa^43X7{~3d8E5#*-%|>hHxY zUG-4JbXyT74m!)Z+>luIj4qSNMEBe|c%p^YyK#cHY1BbE+hZ3jAwW-*$NlSl6g@Z$LB$69W^)XubvC7=aUW+d)t+ugy(S}_syFyK&#h#_M^(}*Y z`gM+OeqUB#QMoz6SoFk-=C)pUQgKZsMpol)@rFX>}fUM8_h9)`(|PSzmiCs3m|EpgS9C3stBs3@J&4c-%z0 zv$QKw0k;HzTY}4iLZTo@nNUs@fGKzYz$Mm+TpaMpyvayj2w)INV%tq??cb# z!~uUa><)4P;*1KplU$>aiq%Ler{j|#_)8^;DS^CYVOPmWR-rppTJW*J+h{erAMfvf zwIBeE9s=Qu^HYV=mPOj-PF0?>;9~RndYSKJ{_z$*+_Cfcc1P%bn92T-{aPV zHBpd@)I|Eoyzwz&II01v6h)sU@c?AUs=VCXJlxE^H7&sN($Z2=;**_HeRUu=7Z0(^ zJseDT2W-jdiD_7ejc}8US#L?n!Uxj+G1=>y_hZ5gHVt(F;0Se0PYLW337X7D;*tp> z`|Lb+8;y&a%l=q&2|w8V)vw}z^diMO0d8G<9oDjWA;loU6C3!IB$p(Y^5GsN9U1aAK{*9Ka{*74@uEwE- zzN}e0XVehLxe|CX2!#RNLZFHG=gWouc7$l0 z;m2t_V-6lUq-Mp>W<6TiVRXfK>CnznIT=h6ke7mMg>5=ClgBFTjW0nkAwrH=_U z(HI{~D-wQ{lvI+Mh@jf1D5z1;GkuI-3#z83P+=*XFcN7^b%oiL36%-iDNbjK%@Xq0 zIPAGqpU=V=ab@j5&vQAIWS`O zb6JkP|4i)pCh@!k?rMscbs_if1CjgIs~E}SLd#l+usJ1b#={}f+%&t0CJBKy(`(tLR6FX|eO!=$r9Tjy3P-jw85|vM)^4OgVWi(~b zjSRYh9aSL5+B7U^Tn@Wa^^f_5%trCQ9?0@!sYNJ7;$$R8sB@N>6e5%yjZSEeF`*;p zKt9PK12g2y_$lSSczp6K?W{Qh7p0TV1(GTl-@4*Bx8gbikUK>u}^| zS_5o)t904w5@jByJhtezr=$nGq10Trl?s(+Us)sY7j{}1;l&sg8~YN4EXFcnREr{X zKj>;8?x1>{rT9P$LM#)?;pK1Wo_ikIN$aBjb6^jT zAYL$*86_QzJ`jEVsi)NZDD;tX+-xGpt(-lgC{{@ zTZ(y8=8@S_F|{Sui14Bj9+Oc7f=wQ}pCx2*)!ai1AP93$OoAstsIY)UqJ~JJNQ*1H zvG8++_Y^{I4T)O8Vy;22uf|l*kC#f~pyZOQQgV}rD7if`lyz#&@JF)f%1-rJ=F|7y z^~sd4f%oS+Vq35b{m?=X*LF^R3g}2Z8v*u zR{8O1S}mDq+cnGMw>cQsUoFqOrXP)!*EK1n_Cy4>9$L?HqVkl9fWtvDdg!F_& z=a~HmM&%^n3B`~J{I(kkNskd3nEF_HL?MUIP5SvyANXx|H}Wu}sUi*YmS_3afB84w z)XiI-`RSi174tv31y2AxNn@Q^dHxwtlriku)Zca<@i{|(Gnzx+7+%|B57Hnd075BUBiR^298QkDBLQtl(z&8eT-ua@scc@_3PsXXyOwf&=_ zJmH4F$xrR~Q~lVT3qc#D8zH)Z9et42189L>`8&YkCdH(~M4PM;hSWz=!G#|~2RkRS z%jhOp6pUoZ+{cM=3Xwd*tAfy1qKNu9N;AM)!XHhhG}Ve{5Vm!I52c?4j6p12gbW^- zHnB?G*|Qb*-6!@3E6$v$xaS_RCmaE-{w?y3-hqXVqBy^!$P}7mrLYAD*;D);?DQ@& zf+z+LMPDk3esWJM7DP^HQSftuJGC$|gn^2b4=f~t2z1T$k2Re|CF;SVrW87CVqG~z zrKL^*@YVDrm$<2TvV@%*F{R!qFzW_24p}?{rxMG?!Pz5HVBqg2q@=FLR+OOrV|9`* z9{TD!URd37=&Ng^zp3Vt7tRcI2buz{OI|oLxHPvhw{5X>?EWJs`uL^vD^K5l2vH*TvxYx)|J~Hl@ZO=W0iXq4-%RZ==}tGA3ORUB_o5T5W4vd2RE$LmStO^V@V4H?BXT8`O1&tGWjkRF*7Q zSbyb1Nw?v;J^edq-b9`N^uk>Ho&mHbwh)GdYuz8Oy5@b}MYh42dVa0d!+YzYK+oL& zg?68f*5DU1wEMD7yU&-^eu#=>YLC1c`j`P3atpXoDaHCu3d4{q0SbRA)xw|Pzk{_A zUMonZK@d4>q-Zh{5Yf2^tFDeQJs)Psr>Sisk50SLf}zB8&A?QOS*-n$f@&c_t7}G` z`#t+JllGnKWg|E!5%@+TJ`s$fm_%{Ko+4lm33o0XG9p|wk4F%B=29}!)m%HWT6!`? zDR^XqV5kUsEr9c}C|H2PH${q2pty+Wa|5D_#hRoQP`p#D6Lor$q}7mY8}bQAX`Exx zBnVJL5U+-C2WFc<`R{lJg>5fA(XzwSeu6S51}nNMmIwN4Ki{w+qivjGyl;}$wul(- zD?e$-uU}^mX6Dp%@zRR6mgwi|s>igPiiP=mDoZyb^n1||g?>MnQ@W})$rN9WxuZM; z8+_9rfRjI}1V~;lB6mti6WSw1TG-knvRa8Ipgv{l7Dyaj(6;XLA}3Fpt^2I_CdVQSX>@khjc{FWSJSFYaYT@T_0 zQZ-=}=7e zCQTNe5sH@~7#TT_D-vr7l4Ajf4d z87(X#0a{5hi?xqZLd}k(lj?Rl=UflQ*KE)nQ~u>X)O{;2&q-K#96XdoX2j$ zZMxhX{}cDG+`o7K*$vGwSu7bt*leRG5!-p&r0tRoPwY0a#2(U9XgQ&DbzzN6b!iz` z-Lh3}8Vjg_2F$e^hjUf=1o7g+@oc=h42wwPm2B;8d$)9Uc64m)E7JKFe9AqL7S77v z)Vamo_Sws=u)GzvG#BBI>u&7n?p(ZW`@)4Gd0BaFTW+G=*ppFS+?w_2?&6ZRcBJqi z61POP?UJ4O4T3W? z&{BjDd8<^tUC`E4zDl#~ehCKeZ0&+S6EpKZ+TH!T8H=yVw|f_=@Ce=|k!Mz%Om z{-0+GAuA&PTk+ZG1;Cb&e{C`OS56f%p#)zsRzr~u+|@o@bS}%+K3wqKES_<4cWrrE zea7I)-3!Xo>)ZqU!A(nhO1Z}py?4{nuF~i$i4*%yrv|-+UAOEz?JDpUVG(7(LnXym z3OGRy4$&UUTfWBqaYVdaz5heZyC@IZ_V%p%M8nj2Mi;B)MVy^!^M#w2D8< z0n8IQfJv~GZW3YQil5Xc00|6R=`n^R2$V(~gy&L|7d}2p91cpF7n@Z~t~;AN^U$0$ z@iT^&v_?xTN_=)MATRo8nE0$jz>mg>%MV;l1*Gwb^%vuSo}#~_P^0O-YQNo!`>JjD zfUvcuF{PJO{8ZRn4T0r%+Zitd|sc1AYL#Q-`oCp}T5POhQ!CCPhoU6mr{~#T-QP z4S9bM+B1`i3sqP-2}=$vv=d37u*s^sCB;te7BW=2VB1YM>T%T|B({4Hh5>;9F+F6q ztU$O#%zRI@A_3X!{M||{GS;E4H&#R`t|qtJSKan7%(=V5m1MxYQt8ikq-N^d6I-SC z$%u=-yQe+)#fJ~zFRoxuDfzV8PdbUVS=4t3vmta@tN?-NBXqzK14t)?BBus}npPqD zo{J~BnzKs?Qp8wc_(fi@*+5Yu#LaXD;!ogb2D;&dVHOgqDz6?vo}mjFOjNWX;(*YZ z3qcBF73ZbbXVd928MFCZ!wrG&&Z~!a#b}RO&+S@0(oXy? zA^m>!xiS2_U(9DR_gy1jieE@0e4W=9-p!tl_2nOHLpR7P)kAvq9b!xnpa6SXH{193 z>X9B1^b(zb-)#q12v_mjy6U=YWLMnrNp?kngBo_u*cJ8a&r9gB%#A*xha-Gae+h?) zIIOb>9EX1fwnSR`1`ZV15-C#6DI6#tYf-!d7RBD)Sr)}}!lKxVAMJhS@%PB0I7L2t zjIV?&ct``q>?FiGpjaWrM*0L{fl&b`0ilHC#ZXKr?iz{-tkQZjC-J=)_*P6P21-Kg z7{9|oWItKNQ7G9WYC`e5a|zG7GG=_px7$OS0O zL@`{us`C)OAe2woW;~Js^PGVdKh2a;olJxj)}y%Cv!iYlWU>$+pv-DoiBeflyJ_ssWt&1KL~+DJ8b@kBt)PfFP{cYasTPXzQk-cP zjVgL$OYo7yYYrjgy^U~niDmh)0BgrAy0^Cp!4YCnz!@TkF2;BU<&Aqmm%gj|=q(6; zR?;bl24IB{RdgX$1YK#11&K^s4VvdLOA*bFZYx&32xx^1Zv^>9kDrC3^t_c4$nkS- zNFc{x*Z|lL8woNu5o1tN9V&xN#kouTs0Yk06qK)IXVMeJgRpRn9Ks)cux%hZHdls# zjpYvz92+xNq|RiRi=VhaFat%c#Zt{TR<~6ho|kQ2woT;>(P%8|{8DpSb^ff(^99)} z1A@y+RwSUSv~RY*3$*VafluNGDtvaw^l75S@5{swiUbYqV*fkF4|1Avh_B=jU%_sM zuON?H@D=zppc8fBKya?sL-?ZB)5D&N(c(|4hww$Mr)Ow(J%lf!9`F?x9uU3+j|K@} zg0t~uc3TKv9*VWaOlv=?b%4(A!Y>f2dJD?S4DzBI`u{WZ69QO2q8z)1d_Wnz3y2cR z7f$tZv0Mg1=>3xsEKgMzL$qoT#%c}X>Tyx8UCg*-3G0MzLs(Z$&WPsZy~bONCynjs@;Wc^Ca!M-GyIMRc+_jrmI2+7v+0m<@;jgui*;-9f<=mc@VTxhMndvHETrV z$->nGTe})64*ySrFry+K9-?@XP@lDB8)jl)X(C1Ri$+-Ih@{$bYKksZm^yXpI%-&W zh=>Cg{fUE76>J}@5ot6aT`6>pczeWbLjQJnDKtwkK(EFGAK+V~cZ1c@;+wSpV8ezd zAW?tNc>;f(Q3GI@ldK}vCUCPG)%Y+nM1hWxM+=TIFnx0jR_81QHz#dYvjhnap{0LE z5YkTTe_I@aVq#%(!z5*e5)(itP(9XMOL6E_pi^_dXE=Cl%@=hs1D=M}3($d6r?lk^ z_=B{5fwX{Fb>G!R4L~=hpF@ALgiloXzj^N``KM9-8I(_zo(FCVdmit75W@l)?gQ-K zk@sTWjaUVZvgA}V!yJWbrsIGBKGht5l%L{f5tyNi#YEZ=q)C41ciwv#e(1fOoge-) zK#6F|G*OTbgq)z-5f9LJaUa%4_O48HPi=qC-)a9_DF2p_6V&$ii1u@4n)a}N#m7?E zGDS~{VjOt9+J!msJagFGOmG(FAKDOD5<(jxz>16zi};x-WMfs*3JY`iv#D`-mNqAN z@>M;q87-7Bq8|J{AgwduVe1qdt&?u?U`HlTwOImDH1a2uGEGC9kw74#sH;Ix)CuK_ zscY;gX%?Yw0V_Q7jG;!f6xl^8#}wB8@XXQ>dxulqRzsRS$?VR6652R>#fp@4r`;qN zWOG?lDd05qe1JNh^~Y{1>>UY|C8b!NRsoG;!KYYv{p_0|yhL z`F0&fqj0}w+RU-m1@6OONcZtr+y@T)o?=G%XT>!{R{oM`2mFnQA-Nh8Vr-(`j-j_R zU8Z_b&5NS^@>u!56LW%gVBJ}aCF-YkELGc4IBjP4i~FdD?te|aFWNIx9(oqZvG^`H zJ?|F%S#GEDJNm9!9^T&95QV@=VwQ4&6N&ic8IpU+w-2HOsM2z&MKqU2pS5`+4>~er zL_Q@Olte6Rf%Y= z+D5dNi8jQVIibh1Ic-#7P;1%e?RMZdxWw=sa0sU0)}=Ip#5^Rm?!QH9kGZQ7-Jq8XU}o_z?%! z+?|5g&8P)1USr=v=yc?THp7>ca{RmX^qY-VH3;5FZ$3by{(P35{kAm$_eTL!4zbCSugbKNraj)QtKgoLDa*0=F}65F|q~$=eM#ai3ai@ z;ErNC)MinOMBC1Va+`7q0dnaEcC*__a8C8ZqHchN2(^8Sz!Cfqeb+5Ud_)rTQ>-ya zww53zA3`~Rqz6}TkaPu=GYTt<28}a0K?IF+tSo|i$E++^uA8hZ^y6SDs+A>6%}s&D z-HV$6VR6T=K`PS$wEHA>=duH#0G#yeaXyg)bsg;g|KaUTz~j2AbkVaLqaA(fF{IMCngLXAV9y6 zhFnn7G;l#3(tY!C(;*240;F@}^844?XP4^8LrmZAd(M}mI;zsCz1LoQ?KS*sEe@Wc z!6}`e92uij3&2ug9w601)}=uWOY^_m_{p8~#=F=VR}nhuI`DV0 zUh%C5$%-f1NF2k1u-(0o*o(BE7-K- zmdZuEoz?Mc(RfsvKC(V2V+u*TEV+wv*(NUvJo89Vxahee+eTwc5#T3W9fa$|q2!C< zE+WX(EnzpTD36=|f+IuZ;HZQtPu-hfe8DFWzz=`{gVM0~6PjI-FTa4YssM0K@}P4G z8TOeXm-7gd7G?j(C9b@fy(-QJ(Ntf79ox_>EGpX=z3uMDJQeJ9KMpghmf8%E0d;{IY{bxOAk zv$J2yZV04ZEYq*1b6Y!>jAf)V1F{}C0$>+X>HUqUYdp@#l!qay$pJx)4}ws#`s*MU0>y9Nb3{%_T8x2evvK zQ9*L!hWj|2fzmlmCL`CuD^RC4{}S9Rp)EeN0Ov78%)0=nJ;XSVC3GYh`Ah2XiSQEc z`3M+Eq!mJ-pp-X~m)|o2bxY_WO|6`g>2*Z9b@D@91dz=wj<2BPHI-tQc#jV+#Cwb% z$$#HE*nPd*E`WbbrtO$`-@@4A>pFvp9zujL?YTx#xArF^0B5$*MmV%!jP`J8gZ2TY zeVc>a&WQ5Xn6$3~xvP}i2;wG4wC`F#`>u=7zKdy(B?U-6h^hdH0#$J^$S5eT$LDY1 z>hJjl6khH{aYPg~%C98sVtKHN9(NHOdr0%D1qvxzy@G=0Kibv|bUHo~I0{%?mQ5Tzwmzm#AX2edPr! zHIXtByhL52gFR~#czG7?RR_gf;A5A+kKdDG3=LD&UZQ&EZf&c<0nn^ig?<+7YNy1) zo9S~A7c$3Cx*`XeV_G@`1ra3_6flj@Ihj0bI2nazWv}PrTVEo&G{DWsX^iwQ(aAQ$KePGRSJ;Qp#d;;F?Y?$UbQ#cplXWLTLyb z|EP~5YjLqka!@ z%Th;4rE@-`4tW^01(`lQzGhTcVqTuF?cO|ZaTb#7yg+gw$!=R}R@GulDJk@~#nvSr zfTCn)Io?Hb9K5m2l;g?$$s~W1u`9y3ko<*CRe1g#u@k&uLyY`JBb#$h$%I0H4E{N2 zRw|>(;^?=yLt-8sn1*N)M@6E^C68zoe#F|v(-V;?1*6Xi+7+^g%P2CfJ)~r|+d#XE zkV@<<9dIltq@}<3*kkAFFQ}%)yiW7Se6mna%i2>p%j6D=Pc9ZfOti603TGRfI0(@o z44nj*8|H!9{2&6EJ#bQHA*_Z>RVec0cVk9(if509jvptc7N1=neM+oe{_E-KU$Y#Q zb;#Vv_s<73oyY-26<6i%BshqI9k7X^1gENy57aKf<|Ad$ErDH2hXz$7ah*l%-b5d4 zXiiiE8momeB`{_jb99BP6R1*{=?L05QQDwP8YETFLQ&L}<9_p=!+F*e>8>hBY^|I|#JygF8>;rz2IC08HSj7A``98SsHpb(S?@;1vCdt-} zJ%{3k{2c8FKZooZV9d`1q@$Ve=8Qa-_JVvC#SQsc+7T1OBgaH`jU3a;D;m=`)N{m2 z6Z0dV^IYsX6a1WV?HS6QnD9curR<4k0(Jd$6LoZle0JVem=BN5mK=NLgk@}GD`9MG zE5Sx$ed|T+Q?iv7_|(q?E>s}Z^I89*xx-dMc|+3L5Z%W=vUT0ukHU*+I#>UvGA%|? z%%N!sqjRwqbqc60!PYuM&dH~U@Hyg;hSSDH5`Y#jg)7lzF^U)Xt&9( z-P~|7opu%=Xf|_yTYRDxE5?GsW^cT*=-tp$+%!#Kxe3b?UnrOgXp~^GWlnOKB3qAO zbP)G#!3)dkSzWwhY)O2T)A$f95GPbuI975mnjasF#ris6)ZN8$yodMIs7Nv8_{Duk z*pB*JI^h*V;0KE7gy9*NxU9H53H)B=Nu>6t(s@8Z=P)j&KE43oB}U=8qWzhU=f|D{ zPTNP%!SCJpeL9b`-?SU1%yC{M4?})l0RMq;ZkBcfLX7l$`J8+3dwvdL^nZ^xDCU@P zd|_@eJ{$iGF@7xm8ML?X4AzUL)fg?GAM@e!;3xn2O5KlwJ}&K;Q9{*=q2d6Xha|c} zlb0;9rY)>P|L>*df#iTxvK9WL_8oZ!l+w@2vqjHKUzD*7SL>G-* zCzXnVx+FbY9l=~kV{}VLRVPZ=%%bArwoI|NqM{(LsH8e!eAltc^bG^`F1Mq2D8qB> ziB;)q=Q1Z#y=CIAsb{)ZWK1M4{=!srch3k;a$2hsw#ONxT7gKuM%l_P!bz79N|ej| zdI+QvOJ0UXkEoS8>Mf_cC3%_i8)(zusJA39r`rfs+KY)68g~<-*-^pTyqUL4Db4gZ zs4{Rja)3bSNKx6_;o`Yx?kj${_;fL9Iw8)BLM}*brf|fi5}P~vMJw05x>RDbuiO)= zUv$Z|W=}`j_?ptioYkDbxT>Gn?f}Jd;Z1FVKQ@Lb9^EsBi`|1u0Y#>37)69y zxOTQSJ@eKkJCxMH&AO)&D>3{zrnPu3vLf^C@Wh;Pb^<4wHsP2+lE?9h6BDSeIytdr zVrIg2h~7hS8hX<`(KKN{90}rY5D`c945*_i0Mq%(xX_Oe#T|f;D=zba?nbqbHC8}{ z8t{>TuK~ZjIUK-ZGzIA6z2PP*#RoMjDBE1aGX*xw)N{?^G^TTk630=whAP=4`8$HK zL~_z>8+EgB2KzF_&Ym@OA90jcIlJo{>sFRFdGl`Abscxg2zI!F<4vpEeJFm5ZW*;I z*O=TF**p0CI{Euz`U1i6D~gq+X@nw1>J$M-;$M8ENfEr)aT zlV*(+8@v5dpcq4j1zS;>+VB0ux?PjI*0m(-s}rufE}_TrygExg+4<)gc7Bq~Cgms- zo`|Lx1+7%&{SkUx%er0qYCNwe;W`@Qa(zTB*Iz(vsuF(;T2KL99^uY#YHdQ6Eer%y61k6syBxEewVS zv4=nc_hSXXV(B5YPP(>5?-Wh8WJs2BZP3Vr-esgh_)-~9<5o(|dl;8+8KglOZp!I0 zTLy3G@v;+TV7I0+BIfu*lQIhhK2ewTne=viTX&>% zl5n&x=zq7ZJLd2~)Ez2hTRKyECuMN0e`FZYgXF=I(>V-ac;=~GPxjQf4RaRjB#1cWa zv0lNl3JMe?l>lg*azrY=fhac z9G0K8)iPcV&jm2F494UqsHc_F)9CTBl-7+#?793L^mB#<)bM}%9PLGZPGj72d>9V} z?w?D-82ae~wGsoN%M4uxaG@F$=fm)yqrMTw(e@kbd?>;GIkX5f?!)B_8IB;4gMRxm zT{r=M0I!%%ar5b0KL4B+jngKKmnoT|KVt&*5{&W;dL~_-qYD+^F$U=3-~-tu@pe`z2Q4;rQx(wjLwK^0JB~qRU_<~~9=#>t>@T+^q zIV6gw!4IH$8_(SLJ5UIQM4d>2H?4JZhV)r|qA^F8bf zbL{Y);eFufu$wtH%lkSP`(nh%qa1EKI{e7dT8s%5AdeKny#%8G^YejJ3Mdhp!tWggzezACi}DmcjUH?|~6W<7W=9^OiME@)UxFDsgowChIfx#$qZHODU zLoGr>>8D?Q8EqHGfAI^9H2QAz_314lGr9%i!d_>cGLdvj+|$|(^SJt$hG-S3 zDMEz0E#$W>#n91%z*3}|>J}#^wR4SFzt=2gExsPQ=PLZWCv+FQk5}Ej^YG!Fp_a)` zm#cHKWl_eO)i>R=dUfU^yjpYPjcZnCu1!BYJ$*Pmu`)PPSHB|YO~hQ`H=*90SR+a% zgC7j{PhhSE+F_*3VTyu`;Ur4MW2%w|R?U!2UByNW|4=uUFbNX^CLUVlaM}~_L&Rr* zE`tUc0eUVbpHH6RY|{yr=*1xn^;3Grvc>0CZwQ?{5;}4+v|%+G7FF*Fp^N7qk3aU{ zgO44@BEA*cBYuV9WBiaj@aw#!)c|YirD{7AyD|Kt2B<>~ZfQcb%DrGIyJc~5 z)xgPBL#8PePR4-ocfiPEk*M2p0e4$Qgbj~n0~5Xh@G8K%ek@dwy5(S7?yM}xt2(cewm z>prt-`1rO?9UnVByy-J__UYrf%a(0CI65{qdT`V5vfSgCx6QB$;M zR1HZ^m0`1LiDI@k+%Go5mD*0&9=$D{uB?ei*^YcRp9vK8QiMUO^4~C}qYs~W$d8UL#hTZ|R7|!K8Ks|b&Emi#e0PbTs_N22tsli^F zKeEZ3B^l9%?}^g+EOgQc1#POT0*Fo&=xwR9|UP6>F-W3sIu%o!_v&2A=zWK|v&h7=}p%ng`m;}O*3 z;tUxSzebTLBR?e(r@m2;$b~J-`E!&4bzv2gy!>1zm76A?2dBuI#W4Fhn zYlPebuowNPI95gZBBjz!g@tGF?<RWTTX=R6N z?NBf{v3I=J-QlYZ*16ZLt!^3^>hE3atPXlt`Vz`U`)cdPyIloTb91Doyc|iBgtwR$ z&w*!Ls7zEyVQp^M;zYnku99Vv>hwW%S#s*oh;!gjcI0sU645?{EKBf<{1P)xL1F3k z7OH?unNj_Mf|dz1>TZD$^mES2R#!{c^`mQte)xaTQ{~mNYR}QZiQ1BYCwHp0cIA?h zmb<4`&*oK>c!&5rC3%Cj$kncrj^q^VW^yERVSKCzYcYzmnSa#{pG<03E4T7xo5iV~ zj0}xjw=Hy|>J_(t>$&&DUq8aV;%x8)OP{d0IvLq$5 zwdzC=!==I^aNt0s0vM1aUQVf}1|3`%?Pc#-6iPee@Va5RMe@_Z^SKMU%L#Z=lRS+! zn}nlv1nXC>yz$1B_(xZfTiMg-N)+1@%Nu)sWv5nb&8>E^_Q4%HcJ6rKv%7Ze*d@MH z-Z|OaJlR6NG1#X`r#e{h?A% zEbCzDIAq!M7uVNq8Vl1D`6I*ZJA}52&|?U~N*=ia@!P}yY7d3%FC6{V|N6^c#Orf& z_E(}T195pv|31zkbPs~2#d#DoHo}h}p@mi8By&YLD5qA$BK*|Qj09OhPT0tO*$ev! zPA3mFbCgK;~Oh`Te>EX9KU{3Z|~Ndt{&*Qs-)4AJKVMN zKyOXW#PG!6M0M9PY|8`J+|X=q+PN;+bxq%jY*%ezTkl%0x4o->8SxFveL8~)N6T}6 zM}G)>lc%kf*;tv|2x`=3$bB|#!2 z^2eFSxt99$vNb;o9n)_*)|Z##b|p`(5Q5v`PQ5#sJduI(iECs)mSkbqPM9^JsUI#l zMS&vR6qr>4#Dd&q<&UHZ{Cd==%?)$}7N;Q3jpcykUI4&N;A6_HiD7Qv6ZH+U$?_5u z#Sr%|9WvW24-fCzyL9;Nl`UxgI6g+bugCU}jZ)V{@#5hXqe#D}+EdHL?=f~SFjYkq zB%(&x6vP4!!!y4NEl0Z-lkt)QZnnY(UJ%HQi?_lip;ZnTmW{Y5R?T(3HWc#C&ZpMBDJtNc3oZ{Q%bl8dzLc z|KVZQDeC^xWw5=8@~}yaV*Ehd%rm_@)S)Gh-AG=VXxi zt@2h7h6Ve(OyQ^;*t{bxaYoBtjj4(FQyW6h04)JLiMS+bq&2*8-BPab5?MwUI)GxY@MT%_%jW%X<{TlDj- z1H=k31d0l)bP`r=)M~P~Ox;*=F_;mR9-)>bj8g>|6{tdZs9YP1$=yn(IIWO=;?%y- zfsci*UJ+Whb?NrrHxJ$O!V7op7q;lRv8%-s(e;~0?!0b>$4+we4UD}Kdpw(s7Ai8Q zAq7t|iUqO7Hj5f>Y_CuhLY*c?VlsiSs86j?n8m44=t#zZtCt{x_i|?N7JI|MNJ(8t9CDa^T_bfrcFb`M{fA=y))w* zrbq9-dvtok_{_Z@##An-owm#`7z56N-(65ct?N=X)MEB0 z;-J$0)b=&8ol1UV!}N|bf0;H7;-Wa)$ezUyvUfeE{mJ_p{vY+6W2U_f>osPdzQON* z3V%?S-zpN6iGiv0H@Mk1pBhJ#efa%5n_R|{7Q?NQZm#^M*V)NqQq zB%qR`sJW3NTY&+W2URUK0IiuS9}s}A0zUv@s+vW13EV~;VP}_$4QUSCX`cLL%o|X@ zaK82m^GpzrRk_M4t17z(E4yn7)~_EJ*s%k7zaRbRrUCRk&^s&YoBad9jy!R&sIkB5 zhf_a7z2P@4OF>XXPdEzu51y*?qAP`{GVS=cD$h-H$xiK+3~ zXc+=+C?T7Fq@|dUVXCkh@ z=w1pPh~p@aq7Q>lJh;jlMK^m((Z8 z$3tzsEIyv{{&I5Z(5LC|&JYxkeo;riz=gakTp!Rj$!AS9ysgQQ9|kgP(WWD&hE+l{ zs8qtkQrR_D+8dck$SfnLU8N)9#jC_wBP)%yO@x$-OGz0ekxK45_Img|78zom&q}~B zbTwaJ-7!!X?W>cLMCkM4rDEJxJzg=iVSIAkx=E5JS6@9k{beO&R$o0eg*+7OTf}eT zYhW;nM&^xNJlAmH=l`Z!?NSfWe+qvtIu>-Fj7!EO{!;5x+ORbY-1&>0n)2Wre3 zXzOYoC_F+n_SgxJV~yefm}3%ZyJzDZM>BZ%S#p8qc|0T@ihk$cxS7qga2!8Qdl_*G zJp%bvrrm24P>LhGxXL|jkyeT#krEIfUm~FMQH_RbL2t(8OnH7FA6ulXgnGxIq=uoD z+3>0tj$UOPK*9Ba_?`y>N@eW~+)%;$oZ|VgQ(kw3_uu z>-|?fbS?fp^w^Fiqc`mzTbUt7qhHHdIkx}!`kCIry?Y*gWbfYV1~v{3?OVHVXmB_2 zAM%hGZ<9!#e#wvXajXmc$o;aG{(^Il6XzA#V;c^>gDb8X`Zqd`<+#Nx$0?xRf-iu> zx5E#NHLKQk7y4S+1E*ll-fW50R)oJ z9|PEchzmcm*~`Jct&U)}CmV<_j>dRVN+=r!MV9cl=U2_wv+nX0Rp{cSudN^G?;ltn z{eAS;&g%Z!B2T)$_M0tUYVPBOYFOTjUuCxi;`h>r{<@Gi< zS5)#GvG;9=vEy7V*KRd3N$VB>?;0gg3F%zOA?H;X_yvxj$oX2J$*cjZ$;T=j(Bzd@ z%*fAUKNxx+(cT7IQfLOJHG?oI*u(G$ilxQUGX>@iuLhA~o)~(cIl1WXqTdgNL|@1x zfEYHXgz8GeQMl%#KNF2=?wF=2qrQfD<|7}S{U5n#Co5$X1}f*pN}-yH+K2OMK82UE z@>oZdVhW%b##zC1q;lN}@T6dOWzlZLWG)aPsWz$iH3ms+V=Xdj2_znKN>;XhLxr^hH)3HCtsWylB z0ev1h#yd=W9*W!2^K28+ zOSsDF>>``uZ*qd;d+mL6!W4O=?UJCz$HjIO}GU3+KS+t$Re*Z zH3g`&rW>1dsa)*jKN^p#PB8s*i(>(WT ztif;jIeDmEYNIBvfY4BXs$DB@@kze1mzk;>K)baj(H=NS{_595pNV0aRLPjQj1w5GlNjz zMs6YN$1nh3#6k{ICk#PV4xA~-H4^N>z2D851e+r@gZ$4*7en^db2$L%ybGSDO0RAL9fbyjJ`0=tS9u0-x*mVrrH_myL9RPc+0 zUJ?zMltj?l^LR*43`Gsb*c^?GCx%mz-%ow7;Ipab_rV#2AHjHlAHjH7hJ%jTh~Q?C z;UZuS(;=<1A&jg(>}VBtutX6phNE(d7`mNfafw-W@CY4eDhoS9W9u6)sz*GFkzUZ65neytw!oqToqv((Oo+jpb{J7()jKYd`-5I?K!)83ztbR^^ z&&0W`xdNOEjB=nW1@OYyg?z=#=3y-Wv*cS~EeTfyYx!>I-gVQ{>+UswTzkU}*M?fx zbeETRuW4=CBXKQjGWNt?txY>JJ$)oC(c4M5md=afT9%)m*6+faq-o1god#>do0mYO zQZ8Gpbc@ocl#PfEnGD+^4NRU)MkCocrW&N*6^a&zL`P`)y!It|Mnc>YFMvbzeCCC< z5MTIS0$!86P?CbxG9?@=qEbZ^jFd!DTY%1GJyj|;U;$H?X(3#?HyexYlin}k+TIxo z4e#3i!A+~ghLxfca$-r}^;`bbC(~jjL%=NnbEO=rA+d;3Hx|OE(~Gyg z9TW*dALRc)mdD=;y%jp=2ut=;ivANd` zcC5p+k}azgQ=T1ct)b!`lfYD-Wd%|`kyJqw=u#Q4DgD6k}aWiUfDSF6h+B$!v&z!D&M13oo&lYL?+AWew~FXdKOKVL2K* z0d()*wJZJ3Q0SvMJ9poUT0iIhF1`ei*a?j8maU(Nej6>Cx&_alvmxP{~Npj0iZS93kiGXlq$FZB%3#LwaXO@;>LfkjnF=XDt=+nLll5gNZR z<((zO=Ydn$LpDRYhY^|Sfit(J--kxG5j}xgz;cBJWMXF_o>a^=PmPjv9pu22;oTtM zn>UwQc+pLQ5_#0$3-iAJlSMvX(L_zjLl2c!N5B8)UW8&-H#GK%lgGS8Mc!z%*mu0@ zMnNKc$Yn1d?WqM+2{MM}atG#;ptZ#6E5r#s)D<_CM&Z2%Jg<@aF zBOy;qVQ+5dXXa^FU(D2G8#K<|R9~QUb&AK5F^TYk9flp%tzc{voFz$6aya=5vyQhh zdj$@#S6W2klhe`N)1CQlao40cIq}IYV#&FmojUbK{>N5+A-V^{Gx-;Fv7sN25Dm`1 zhe7`W<1Ny@BK?VZRFH(SmPiqT4F`=e8Ob*ed^7Dw$Y3YOIuYwr2e2h_&Friu#fO=? zu|OVTyOu1W{7FMSAANF71pZz}or#X9;){649&T{{1KlGg< z5<0F}5QD{y8o1ZQIxrRw@Mnw-(6C4fI2SU9ST-k1Vo03)qsmK%jNxO%5m{Rcahr$* znP&xYFmMlK6TI0v&{Vy4jk_*b>+5j$j_(~0b`Gs|b*yYUyryq(hyZpY)Jvzp)jeKU z+c#R4;9KbpRy)`B_M5!?I@a-hY+u$3)x7xJR5xl3Sf(mN7^P!rM!l3ZXQZ32<85DZ z7L)D!F<__c@6v^{CoM7V<90D{MVN2QihlEO=GQ?>2 zc(Y&nP+_5-mF+1MD9C#9>E9)mB>9HSM8u$iIH_#1^G$9mI){V2pBXrX@{k8V zZ+n~wt)1Tz{dZBmu?$n)#B6WN#e(Q+ZTHy#A>?GMjgeHHL?KjY6HM1GUJro{-lf6)=ttu9AN@$m96c`%!$s>%GABvv zeOmJhd)?D^)L=1pnRqIqcnQ}_JsHfm2I$Cl{ys(@X=9F0A zXT0)CA5$yOvxwnaq(U1r$brWD+YE9By@*Fc9|kmY;*QXVR*sLa{Lt22yS9et@~a=E zEnRxxz|!H=pZ`2c?BJkL5FyJODE1QAJ*kkb~u}UYH2KzMD4(s z9gZ`M?Ql3jaW?UPx^FtVC-iD)>Wx!asy*T)jwIymVhqpnzFKQ&gk>b#pUfuPtUM$w zWVLKHMOFwYs=7--1fVMMiXdHvBa>cA=A5^`p&Ye~XG8T@t=YG!r**uFnC4rhyCzPa zY-lh4pK|}`Ut$_e$~633#MSQf%k_A<6A)N=&_kennqK;gT_ zi4JUEI-R6(D@5z0zcYRA6pbu?op`OJEnbhYQ5<1~k%|xkV@b%-oM5h&g(9&HOW)0+ zn9uVBlzYH{V37fSiCqlofiqkg;C`v@HR|3wXI}iwaC=)@`|xK@R_d#fYg!6-P_L7N2EId@*p@ zj3p#T5Jig8XTwOyhE|$LICQx;S&38puei-fw2=YEKwI=?BtU->LuiZ)iKNNEA(C+) z3gJXDk-Cs4!8Yi0&D&K15v7YX2*#lNgd{&%J*bg>&%UuEC98dVI;YZp`OCDa&h7rG z(wWiycmMg&{bP&0p_P53{VPM>C8M9DGh5dNV4J-Hd?MM?H_Kp80d1*VvZpZ(h;Tba zDCA@;`^ciWDrcYN6vF9Bsu85lnOhU?qc%Athe2E*t(Wj!5S7Z(jVz^x|UwyLV;KGw4mD9IKQj3 z6EZUICEy5n7-kg=RMfpuDHIlno5jVzvP%Iol}-s@4QJM%yk@GDU|cFmR(mfjXTtz6 zNT5_50T@e>0#x1OxS&y5PO2Sq0(t*~*=9Nj$v%>PsHZ4f8=~b!TrutI7IeN)1+|Y~ z(EoyqYJ-*}PwpUEihp5R9!r-wa>(sB6a1M)*pKlR_6F_qd^+M(90aBo&Iq`g7+-La zGg#?lTn`G-V8YOAToB3-b}oOPk!r_ejZ6ne1f8;2loR{Jc^}%XNAeQDKvh8P65^Oa zyNsVnOac{L*y!TH)g?#9_T6*${?VDzDgSo0+xI-;T|9RGp~IgXU4p&dKiapFbUDZ? zszsAXwPJXGY$Nr?oWd3)PpV<@r9!YMX* zIJ(V4pR687F$ZPg3wMKUfvG{y=Xe{aPlpi{JA&&(c7k%Xy!4^`Vm&*{k)N3$9{lt$ z+(6C4e-eFx^84?1H=1^m!{6WZm#0vIdT{{1ddF3Ne;x4{pKZ2c%qI_C-0LL*!b#Xu z2W4h+n1xsk!UY}$C57K#$Fxe}H0dKqlio5!8PfQP5Wpx+26uVPFo`>|{nDXSC&W#! zhMV5m<0Q{|jh8EX>#STzA$GTMHw!{|t z|F=($w6z&KjGiBaJqC1(a%riJ!+_bwf%X&06Ub6!yK75<{JYraWUW1_rw<#7Y@nGxgMo6|qC7g-edIdZdo6&@liP zy#CecuS!$&lxcDhUrKDrtF|84pKa{vGPGEGA6_D5x5c&=PCbHNL0L#d1swJlpv#hY zHTs>97?x4A7iZ+NrTiV^XKN%^=My|ET6>HaFnH+3m;(@zcsAE#ZEYvN;@kSzGvrv@ zMq`E;r@9BQ3y#X2#4%EeTE>ZJHE>I4K+VDsvfd?1a@@+*IB+;2iiX%+LcrXI$!LF? zL3)@hez%>9-#w0t8W#>LnWbyflTU|EKk?eWi2bYkUJ;??(KkfiaxoMAH{p%KsOH>Z z%2~sBx5;oWhnCE0NO03w%sPuVCuTLo91wgAQy>k)jAUWhDAkq59XEP`K|?sk!;9YD z>bJF)pv`Qn`1;2~AHP29!R;UavH0P2$5*i5qd?V2G`nEVVXC zhlA9lnIQJY^>bqTUpVwa;CF0@=pwuru_Z!EqoagJFO0gy%fc~c?jzx_4PESWwxRdl zwx!2D*ChUkzEX3rN!yJCSm`AHaXWuV(4G)z*^Nv~Vjn&0?MQMG#4Q3C99<|#lKJy8 zm+0QQ7H65itjwR9rq7j**((Z5t3`ELrYj3Pt-dQmt2NRfGUC6B9cuWlh>p5kS{Axy zsW0#c`O%EEPTD}vr-W&z_#;2Q%nzR~f?%{xP3KR6#<%4p=>YzpdqVzB{88+tT1fs7F)-ZHylh!>%di-dKZoUW-_=jxxjtl>X%0WGZ_s$OTrTcGSc*1*Y-+?(e3JO{ z(hkH2#F``=s<7#}(-{ksRDiZaqWY0XI^Zb$#+Sd`@|)jaj6HZxPyBOOP_lA17h6XN zVjG@=&@H^{e*9N(xPzY4)gi4NeT-Ak^(WyUzBU$1f@Z@OSIm-U zp|>zU*vPW6`wE#4!p0$gfq**thg=|>5zJ(S3v^M`AZ6bTK|$LA_jStu#Ilcs#>NOn zFDjxheP`_O;W6>n^l#Sg;4!)}(7z(Lyk2|HaFh3@nCq{^kS~b&BUd0RgJUo`c@!=- zD%@NczRK^$9W|v<4OTdfP0dAF$b3wqZ%`THur|SUJZ)&CZKHUIEQW|lq27Lte6J>O zroU#Q2C?X$q6Wx7#zf8Lnu9gB*4$U~a82Syvd;lxs&PcBK@Hd?09sZ%!j*H+Y^j{7 zJYH!-|JBNH<#Uy&xC;F%E5O+#_$cB;IRT@jj9_~=hf5H;C@ztmx{H}(V1E?=tdE*6 zpdAczT;lBz1W{p$9;XktJo!t0a;s*@>m4VVAuU(1{Z5da)yr^C#a-#BRnGl1eCy}f?4#R(k2kwz@hD|6ZGDj_L`~a zFY9a_;!_(o-?n}I^x;io+XwGmyJ_`D2e*%HJoGK}0n!UUJZ2aYv@V9nL~-<0^*??O zdQ%UfE&2fHoq=jY4cg;C1%SqWN_umV@E`*hFEB8$bR}CL^|QBx>oGI@qQN93LuHj= zSb->Dg`yriq7`JP8t+uo4MByW%OMF4IlD$yHru}?MckI5yr_b9P&sTcXfXInBtrOS ziJ=?jBDIOMon@FCVS5had*QX_{7H%xwp!X-7vQ`Ud4sD~4Gz`U*Vp||d;6YkgF{1u z+xE2E?f2Y6?X9Py!{S>=c^cmk2#k&e8mE?z?A^O!#njLeYMOcOl}F5TmU2!uLMBvc z&l+VW&IbPKL~K1~JJ1OYQLv=oIlRECswy{30!0s{WJW5XCxZ<65CB>wA!Z=d~gaH`pKj0MPTX7=MEi zAsHt(oAguzT~qJ_w4>4{yp{d5sbj^b*{P63`=p$>CGm#9Z?b2NeyWR9gNxjeY_BUy#SR>p=v3<`M<|$At^*OExk!P7x()I# zsefMq`%-Ln5@3-8yqCyLq$A0AnUqX*VInDbnJRs&aB`*18fF4xUM?kF7)V~1G{Rw# z)E?yj5tf0=Dd}BYjNSrU%EF)?pBI(9S~`LWaL9uN+M#gK zy2H)%oJcC${^5_+4`f9D3&-PYYi`c$@6Wt>jXpIo@xVk~Qj)Pqg5eub zhnPL-s?y{w8j?aK}_R=|vtfexuS=RY7l&}9@wf$!PNI|T&D zMLoJ%$yR*IsP&DxnkzEt^gzug)~T?vK<*pfOg==sAP0C&`kB3E?n$_Ul?Nn#RKW90 z2TCsXgIU(jhTYDpBCCrk*akS&b06#SR#sL8lSpyI-q<{_c=5pId-SQ-D=L};UT<^{ zDUnlSVti5e^mO;4DM$cB(e0?83fsO6mCyp(XAKuMH1k#AA_0p4YnaDtl>vw_!%{)rxbTik9j$)c_~`~x2Bohl0+%YI5UHSs-vbi$qPkI`QR5*!wKt6B zSfqCZ<|2*hWLc_IbF)lJ5~ZV?2W(3RWp0R8Kf<0!;wVVKp0&d{KfJW9rKNRvxTSR@ zSX)zye>Jti_kLye89Am8#uU*l3c%PM>73bR+G2mE~u z%aQUk8MV6dkcpm3Rt#fZa122R;}}x#G)tzXCGMq!DeJ&7u#Q=T2NDv`LEMXKgqyy_ zY;OfuFi;cfXw{QLcddqK2!*zc>$B&Y^qWH+vNFr!kqub)HRpe6yUkXBiZs1OF^w^y zg6vQzJK3=JxWWLlLpfoM$zWma$&I*ZKHnkj%;hFVZugL%!YrI1xj8A0mw`kUe-d}v zZ3hn+Pu_IXjW<5^*wGsXL)%A|FCW={bzfhGsCYEHuJ~&+hi<&-t54qefqlpNMn-n- zUNO=TK+p}e6q~eX;9o>-+Bl#ApLp1q5mEHE@q2g;jRcK{g|pe70UM7&)Q~hF2(0;M zh6f5!;5PaRQC8g19@Clf#Pz_^Y&LQjM?-cFm;{OwlqG0(FmjaZT; zzW8OtU?M5_Iy>i87-{lHdKS5GP>-GtLO#mcN!k%nWWd;&mnB5ryZ3oq`OWEzQ-&Mc zRICC7Z`4Gr=rkYto`ZUvTozC|3AhgKBk zW8%YLAz&^;8y{+2mcBTnv#4^JtE{KYS?lO44Rs7Pbmdhxi?wY{g+1j3Ej@wU!n&f> zi<$zZp4Q@8cQ$meQZQw&H~?vxiOOr_yfM;An~(t`@Qgx7#CRr&IEBKT8t3c5=R_=o zNhN1OrDSg${>aEQv-vW~6+q}0YV-hG-=74pd&clro*HbrY11~?NKJovz302P-%ewZ zzMl6V3&$(s`2s0#q<}0K3wN=&U@XKJ7afauVtz2@S)z$a@eXX;Rjh~8DWFOg&b!^< zWM|r_Qy`{#n;ohXxlwf(@dq{~(#cl9l7be9<~#jVM9JGZZLc|=TQjgGBwnA~q;IiL z^hW>4V*tiZ0CI=@a!}?@X)v&9M}y|ja}>_d63(%JlUUrU0K4)Zu^?7b*|1BsErr!O z_z?(%14&3|!$jD|5*V3{3Nq--dVAVz-c`aOO`Y9Z}> zj!07mW=BvFvn;wrycYm1ViErNNtkwrc>=g}{WGU_;@_!L*Ypn^JF;SAWaRLTR}btx z_rLMD_G+K68lUyuR#YXbi;8jpxhZh$-1V8y?A&#@@9NQ!V>gVAT+@GxKH5>`^WpQj z_^$UCmsaIw7iSdZrW5VpRLKDCQb4_G?W0B|d9PBbmnt8+f)C3iGsW2AXkrJhBBEMb z=xCJBgchD`>LGm&acY7bWX_%WZRYPYL7ay(Pt%Y4G9S()!e#yzKaBEBaVSy@dLci@ zP4pu8mFfGuEPcekhQ$5A$QDI|m!b$lSO2Cz32&(=yc8V}1JGvdx_A%gWD{~f!Se9V zu@^&WbvU$0ud?$wDSe)hSqU85^EmxMr(J*V?dP8tp|MAvfBq5POV#J^6lZL0eD+d= z%=i{Hw!Dun6Le{!3pKmsei@K!cKFsfX2;=3&Z!QHGmqej`hj!B`m0n1ignHzdn%8$ z!AJxqj)um6DxU*qJS-@(u;+l;BAZB6<86n3sl7l(TArVw=bGc(hjA849f1P*mmViF z(~*1%ja`w4BujQ{lE3u@p0};=T=DbIV~oJy+mP{!XZFP*GFTocgFyL~Amcc8V2DH- ztYMd_m+&t#b&~}C%N7HN^!AQ(KR%?tc<9`ZJM{KL0yw`9LfG(Zd)z`P+ z;`ZUPWDu9`9yJgZ3gZbYqDJztX(2L8p-i;PR`l%wm}z7YdjsKi2bwO!cr%u8xBBps zK)8P{+&On9-1%H5oEu9V;X$naAgsIYS-R_ijS(j+N#D2tPbYgjHR&k{SU& zN+d;5JoecG`1e`9Mw>QlIDUM?h7IdKh^zR6r=Y+?|3}|duSWZ?DH?Pv@%aZFLxnpX z>JRD9#r5=;8;*Z)J+2jn9#3I`+g)J(d}<(AUQtt1QQomwyC`i>NZK+*nYK*j!6l$= zPxlqmwnoynCJ^?{g#)wbn?~K<+GoS<0i#pWwv%XkCfxsAKM3112ZHv7yFu6{-Jkg;gDm%?_1&+EV|~(sT=+F z;tomP-~hG<*HMn~u1~u~(v}(pGV{tE^S+Ggmc(=;pVSQze4Z{@ZkWaul9DLMJz0U@ zou!LLrMasrI8IiDSkxShb-HeA%snm4%?%)JA8&itNjrR`c* zk4uO5ido7dC+opvQJK&OLr5_(MsM?UPriN_DVTP(h!_9NlbK>E*f!CrzBn{vVS^pySWo@)VVuB zs&HMv@Ve{hmD>^Vf!3XlNGs9R*UE1@B8{+Y5WFP1c62tmRd;EkM}Kfhd(Un;YiiNA=W)rkb>vgzC8!41QnbuH8?Glm>J<{+C+X`8 z80S$G)5!7>k?GYXx3Je|`dI0!ypBjch+I`qM208RXyA8y!wqCUzV87PXVRg=_T?!0 zLAE@9watEM`n@U5z@FO|%C|o48*zKwO$JT1AD2#qO2IVYmMbMzrR35|aA_q-be1k! zB`6j)s^z7+m`02>NWbud{hMd=J6m%F5!(qTZr^KAB!nNj1nX zP2%sgS5-CD6}45BlvH_&zTLAbFV}+}Qt)}l>q0GBpLV~bcq`?4ySq##y+WS6B$?|Z z{ju?D>zJnXIGPcYHUa^@g@}y_+ei;++t3p*3Er{5c)Wx{q)fwZH0U$5eu&rLyV=-eRI_vG>x%{BBzn{qOi09ucKbflJ=B~o#t|GRqBDTbAr`beD~6mw?)6}5v2o|t5uKg)P{h=`kb8a5;}?7p*TwsH_pto{E83eOY%{(q)RhS zWf>wmHyTb=ef$9&ayIRq0d)XR8@6p8vnT2<92(R+q^}A z!s;?dxx2B}!v%drL*?q5^e?s9|p)sT~ai&|JI$qO;LnIvQu zNyz!FtJUH5()(9#aj4~>Ha2ZI;GmuS{*tgD)~5sYx`K&>4GEIF)hvvA85%$3uW9e} zRX6P8ty@)j1zWeb#plD;?dUma-MUosUD<^BsQ!@68dA)8c2R}e$d=A9#5*PlFRNvP zJ~`5d2AEb>4sJIS1~o5-!@3AyI_HdhCt-~)B#R%hx}*ZDt{fh2oGBcz@X7bYf%cAK z_-^ON>qDJRJLN;=lQNe}ny?H0D{?xiX!I42KavAItXR$gt<&>zC`xUV71IPrEjC;^ zYzH9D;hQz8+@w8RIF~Bu1ZI2|rf7k5n=jOH|MT64u5GPCt^47W#p%uYF3)||i4N@U zs1LZx+v-Xd73G#zoUqKf1r~ccS?q;0=e$~60;Iq;QK5FQ9`HPuIkS-6$yGbi_`KS| zuc`x)DoBs~s%n~Vi6lTt07Z2v2G0fo0%i?F0Cxj@B+$TGf0Lu+q7?AU__P_dF)6@B zK4eQPU~?^u{kblmud89GBUIYwsC6Qs;96E$)S0n3eVK(QU-NicTRo+LrbVlZ>I!oM zJkRBH# zLM@j(kgYI}F)sl570((dLkyDi5h4p2M2B zaMBABL4*FJ#CYe5WeY^-{MEsruez$T#gQ=8akT0Oq=k_-W|_4JO6{wqs>;5{_h?&7 zO#6!Gi+pWLc9J9^ak&ZS$O)s|e>RjT6f-oOa^g-%a3@J{G$n}SV~)8O@f@Xzf?OnG zS>|!g!+ob0=uf|ozTy#!d!RJMpVxkLOYPT=%GFuKtJ8)hs;k7MwE6PGzSuhT$|dOy zM5@86#l0-beAT^RPBOF`F$XMH@O=~^h%B!9MOe+mph{$f)VlP-z3i{)=%}u4^;ddZ z+q_70n==sJW@$5`; zuERk=ZIB3xh3^9n3+;pmJPWL64PGIH*~}qKGuhWHRt{eb&{+$yCD5ydf^V6SB|X`0 zFGNMJ!KF(Fw|1;6v`?GZlcGj6t^7N5erjk~GT2aG-=NRFI>aTt_K%IB*;5=UrK-2C z@Z3>q+(ylyR*ttIWg0OB!goFnT!CNvvVmNDghZ)AG~&4$W4eLhLro6gFbe_EHEC!` zo8?SuMNkexs~ZjmDm)j1LFoqgbu@uYl8p@!gGSc8k(`@KG{mami-7i}){Hof0jTwq z^EryV>q>mC!UX;1wz6+uA&TG@AY2aphjWuyPQK%uo!hv=#1#RlGY70r>|VUSY{hyB zDq_@*L>igDVhk2)^38%SJ=&P|2cw2Gs47w&lPUC>vlujjdmS|LG0HL75nh3z&xWfA z1r@G!gd0s_wSleL6iF0LfH|oV?=)H%PTg22$JAD2tis<^shb+ya4+0OrfFIx!>)_+ zIp>!O<%5i%DaO<2h}7YxdNy1+Yjm`c$1vRHh;)Ib!A3F&DXiLyPk>*S5~C7@`*bvR zlga6qbuJ&wP~TSdT{81!@=7?e0dn<4o_p9xpV>0H=vfz!rFCs2c@{y z@j5cTLftToKrN6LALCwWl+hS#q(e8cG=e%BfRU2Um`|V_(N`&qT|q@85VUp8hU<_8 zgPSUhZ`NoIusaf_V;h#P#n*w?E8<(KTv~9VEVUKAW5fql|6348{2kzp&Rli`1C(9}D(6=)bP7-# zjMlOmtV$?$sE z&_X>)pAGSnLSCOTc?Lt?;S7dcHhKc=t%jSrAM4iJPp(ueaP`7 zIU%qi+dyA=dPBAWnUy?C*w|DyatnC(RhsL|-Ve2K7CC3pmKZ>+KE}tsT2f21C)G`h zWn)Z_f}o{iKZm>t=#oi39#ps@D-!5@b}>Nek?_NTh0(!BhEf$I|6noKR&((cs8|hH zuex$_FvO%@HlhMt12V~~NnJwR{rvjxzHsm}qn8qO(ZOHZzZ0Fa|L>8{#Z;#SVouWE zHURqjw67X@)K1TliwhOzC&L<~houkFJ9s;xZ&9&HXqH@RBUuQ|84!xLTu4IE)kz zO#Tsc>C=8EgUx;tFoigHAvlRH5cZ&p-+>|0(Tl7e9K9GZ0((s+jXEGJIuwm8`Vwp2 zibgC&6pffo)eWB_bc3b97traNM5bOC8WA;DO|9m-ka#zDj!YUN8U#iO-g1?225fnr zhdz&m!>J2&N&}uk12j78NW_Ob9FcB(x~p4;T&1owFXUBS9}ci^>usN3i43Ws#t98* zNAuwKxzMp=zQQzTN?B!7&xE)@T0m)?$HJdHIrVlk$|tVQ7+E56E-EQZ{ob|-c2X5Q zL8Yv_60cHOck+2*HDDqkeG|e$! zuhl9Cm1d!1AKwRxlX_Z083XebkS?mYNS&Tcpaq(Wgx+6DJDDOJKA(MNE=8mEk48T2 z)_S4$p_;qJ&S5Q2!B%4mI;@%h&KYK8rjuV3_+5gw8d)Xm0FPNd zILFxRp>qt3R+-P|7{05P$Q75fZ?l|9*7Jz8jl9J9Op7OCXOKnb7M-IpZQ{L|`D14) zj@9TuQoOVQyyVg%Qtojb%u6tX^jT~)LL18M2MR0c#}H7(Jr+@TY3Zl1%Y2w9 z=?CN~CwZlEkv_8uq>++J;6R*x%xn;l*!(e>2(n%3pit~(IT<8tUF0SCg==dWY{c*H) z^Pe~A`w-~s*S=ts!%1nBP!6}9Ej9RapvOSVNh5aw#EGOYpB9S2RH_D(RDlusCMLLW zAlM;;K(S<|8)_hAXO$8YA)O-+mNmp3aB&*E+dV1Pt_@i|6W+oCXIWJ;3G%6vC#{}|zt;IuR#Ux8$#Wmm zkHhEnkdZ*z9udY2T_mVMN`IFMV_1q(#k4V!(lMGKJ(M~QC$P6F1vA3|gejq=H|r2^ z1?A6?LkKj0q(l)toY~+@d?Dyz62s@E&l-NG#>AjD320YFCt&OVG)V*UASF?qjrt;- zbFc99neRZESLP2vCWxHBNgBmzL=begJ#S0@xvdhO&>DD(Cs3(omv)2p5$)63*Y#9` zl9UY}smFIt<1%>ymt)Iu890v1?yul-=4o6QdA+?6uR3>toZB7YuG#PoN4R&EFf@I$ z;inzpnc47H9O2K+hIc!{56y;W9O2KKOvia;Ev73V1mz{vWZsP7W=!3j#?5JU(}J58 zbt7;i+RVRUT(Z(+rtr>`x*5XFkh=LIZoa5)PT}TMwfTTr+|;Uflq4~{4m;Kbcv~aK z%aI#|W}Fpo8@a3)g0&-M6@c_PA{F>i3-!kHcDTh6+2VN{TFw?)+3j6O7ks7b?JkrZ zdZkMo8pz(#HPdyx>qOThUE!|hx@NnQ4~4rN;m%p3o1kph(xq4aZC^_*9`Q^`UtM2! zpKYVDeM>hz^6u>jAMD%?$1+I1V>bLnM`Rzq_p~E&6hDR>k(=>j%n`W*Kc*a!d+;OV zh}@4ceeTp3@qq9tN90l5J@hEu8DIF~Y5Ea4&F`IdgrAydIQ&-pDS67c~f8Bz+gskf2y^UEra)ul3wYRL>v2t{DZ0EWb`+*PHlHYsB(HY#l z>A?O?TY{a3CMK_5d&@0ruU^!>XU0|i_q%qFjm;by8!c?;t8#r}az)Q|BKaUjwesMh z(Xp}7LvgR0>+1%$6_tN}5S=LkgF}JFK;z(0V`F1raJas)v3@x2^|}A2pr*@PTif4?_NRtHMg^2!c|Nc*p|)yF{E-fZtx(Q&#Sptg z`3^QWQI;n&i}Z|Ml%3!bQbpJt@I<>R;2^y+eiARf-}+sac;tu9NB%-J%DZNvdQ1x} zXUs^0n?7zvN{}eo5y`_&!K_L>7^m4WS)~?T(9A`zj^~Z&ws(T3iftZ z%rTmaJ4Y_LNsWRcS|G#**l7x7z>A%ZTyWHciUYNAjv}GayalI$31AlFFPJf_%bf*fwrOX%J1^f= z#(#U~`E;nHv#5cG^6Qjz3cA=(Qx4@39mvAMYqZrfv}8`(iB$@ta%Sd~oq2!kt@hV@ z3yUirSXUZMX)Hj19uYR^ZYT$!qpu^fTCant0-mAj%(OQ&R;2{$;E)eiPLUT=nW4-t z>V|D=b;B+sb=Y$mYup%_38aJ>woFn?jby%~LvX$kCla#6ua8B)FUF5YpGV##^03T) zo0HKn(zqYQ{zkteJsI@RLQUG8MmkjuW7HHJ1u*WEufS3W+~N&py-1DC4XwmYH_$t% zP!f`hlVSIk6tV-b!a>ek$f^ZV&w|)#jM^mFw?M=ott4-#uA!lRkRwH{Tb2$DE#1Nq z(P>0Thnkxw%&RD&8f2 zf~lfWwwn5Xh%&(BIDK2X>f3JgQYR%U+#3PrOukHBE!{+M*)Lwbse4Plt*X`Si z7tO%QG~vH4ty^0LO?v{@?gbB3k8D`@l;*~!rmpT~6BEn2&2OVGYluDk3dgn^r? zUyF$xz!c`kq^;d?_{g;f54ic87Ebn(@oon&?9Zc38xSz3*{D>m>?xRO%jw}iUZn)uw#$5*w?%KDb z@tTAC13M2MIC>ZFAGn}Z6UjY6o0^gJ%=e`VlTMn9fP_M#^9bW|= z^25%o0q51BZeRoE9KiZFqx)+sI=r@P9f+)Uf*%%v4|=p-_AE zL)y2sliF+AhqaGscWa;1zN|ei612OtUu(B(pVa=S{YkqQR^FZ3544xGKWGnWf3N*n zdt3X9_L%ln?Vq$CYENm~uofr4@IS_iyrBI^`>FP#_CK_rX#a^d`xk9i`)BPmR`aa( zaqSn{&$WNmc5A=W-qb#-?ZGPU#oF$}IzEEcJ;dvH1bgDBc0D-Zb?umTlXj!_0qqv; zW>oEbRJ&FCJM8%nYHw(7Y2Olw$VN>TDI!&*Y3H=4NEaCbt#-BZLK6;=Epmhqxgt+E zMLtqJ3q_GA7A2xolnIyij`m-oT)2ftR0yxA6jj29DwNftM%0QrQ7;-qqxP=$OA!!F zqFJzu#y&OK}cAvjO`?jV<(Q|xQXLBsq2u$aZ-9}r#(2ala!>#i9^~Z zZRtsz9FwN*Y1E{&DNV|0L({sg`u+cZXJ=-2RuULUvU6tc>%af&{{Njjcjw+&t=6d9 z)LPY`8r3@0q?*-w)uJ}w-tv;#s9IHr|wq|Sf{NYSwFP?)_T+WfqI8}r+SxqP`z6{q~4<*R*&EtZ0}Q#s`snM z)Cbh#>VxVD^;_yg>ci?u^%3=y`fc^J`l$Mt`W^L*`d#&``nWo(KA}FTKBb;hpH|PS zF;-&4ob@8i1%f1qAaFXG!if2jTlyTTt=FR9O~FQ}K*E7r%=7uA>4m(?Gu6Y4AY z;>@4m%U`dmuc@!A*VH%EN%c+jr|QqtpQ~@FZ>zshf2sZoU-|oMd>!XI>bvT7eDUu4 z_+rr;>a_ZS`Wy8_e6izA^>_GI)!(ZhsZsS0>c{FQ*bU)~`X}|z*xmYH)LHef*zM=% z>fh8k?9=-1>Oa&k)Oq!v>X+)j)PJkD)c>geRsW~Pw51hBdI5Z)IH*IqSeNK2I;=}| znJ(8Ax)LMnX?nVzp{w*&_)_gGJzHO`t1*u~S6`#?XsYMy1^PO@P%qNg>&5y8JR#hu zm+EEuCVjJBu5ZDY38VP(dt4{1&s$%xzG!{PI%&OZy<&Y6vm-BJx8YZ9xAS`nhh@>vWTD#?I3%dV}7mTXmam*PHM~=MKF^Z`Ip0Hc``E zdWYVrZ`Zr@ZheQo6Z;9?t@r4?I*E}^kM7key-)XH_qep)uMg+}eNYeTA$>^Sqlfij zozWxuUVTL0r|-uXuHT{Gso$j^)bG|0>G$Y|^&|Sd`hEIQ{eJzJ{y_1_U^)_sG!<>` zYHycBL&Stl#SI6OJ;OtT#YqW64c)`3dsCq#2gMCTeM5t(1I0-ROV{AD7U^OnRU< z6-skZywUKVHvDfC{?nqcjfT^-QCO>kv2?!^7wYj9Caf(x&^Me)4Gts+d(%Ck_GHgU zCKVdsz<@NGa9yZfgdgCbs2!4pHcN#;SA|54R7k7{ZI%jy90ZyN`vR%KzTyre$B>bu zL*y9ZpuD4hWUwzeJaTX#Ig%+Ka;HMugxau+T8)vUrZ%)qs0~Z7U0@G$P`cgGK_^%!ss1myu}1NYo_~jc^d`8cq-P1xM&w z-sP63e8in9?lLVnVp?#g!)NIcSA3T%e!mkB?G}k2;2^v^Yk1)YvQd$*J{E2uZUiuy zjTSdFb5?OO#bIg3;eq7geu)n`amEsh)|s&0gbgMXgNem!IUTP}m{9B@UfUeZ3=Iw) zF7HjJhEs>rhdC8)7&z3QJy-8X@GlZ1({Y+V=9vjwj>W8ObUbbiDE;qXg7)ipcm}yN34hl2HTQ{ z4kh6s2fKTddeeyBJfd$;!7p6)xC40I+(iVZh`E&b`hI-FY$r-e*I zeHr1iIjS^(b~>EQDxxgqlBfiXh}uL_~}@5fLL!M8t>_k#$Tr5ot1^bQOt+bQOuHp&vE$qlSLe(2pAW zQA0m!=tm8G<3x$5p&vE$qlSLe(2pAWQA0m!=*JBGn4xcOFNv6;A2al0hJMV@$BW){ zb56vJ{4qm6X6VNZ{g|O2GxTGIe$3F18~SlWKW^lY8~SlWAA5B&J#*tpn9d;)H}vC% ze%#QH8~SlWKW^y94gI*GpD^?jhJM1(PZ;_ML*Lw#5(y)J!pNU6^b>}D!q86``Uyin zVdy6e{e+=kW9Ziy`Zb1rjiFy-=+_we&Fv~tW9Ziy`Zb1rjiFy-=+_wfHHN;qRpBFh zqR)CmzuwSqH0j1@XlLJW662{O671w&JamMEDLZW!opQvEg?0(x{TvYXSVX$+Sfqia zLCDe|WNr~Q7B!Cya|eM0t0op{WL6NeXb25(Ba4PKixP{9E8q)7HGzG5(l`f*==!?# z>&r3nTRu2)Fg1*RZn!dYWN3MBY7m{rAf?MG?JDiZ_{B+2-8VEc>;|vkj4XU`czJRl z!^(>{vT|cl=`0Wmr%_RAEGkMx$c>6n)DW#_BSM-R5ur#Lt(W>M#F%3%#F%5Xb=)Wj zMKiT^g0Hqt@YU9dT5IdrNB}4JYwHAmZJpq+trHE_*0FH_PWZ=nhq<|G>!by0>)1GA zwMLFwBS&q03|j8Sxi5%wPd8ut`I_eIe!d>y>i}OffbPe+ALjv_nZPh=ShRrEkEwL@%{8o~~ku z$MrtM`*a`T{kk9Vv>rq~d@F`$X$S+Iat&j);LBD~)B5&KtGeg@;Q?zYM#%@Pl>^Dl zAm&D>7QF=#V0b-Yda9*2b+pg7=5FiQgsZ16;URg7dPuVBo`H0qwH%kEl^7W68Guam zbv@$CJx4@o$)y=c#dAc9FyoWJtWFbVZaOhDvk!A2_hOcVW@A2v*_LCNT_V`WB~24G5 zW6cFHJC%TZ<(Pq551zMSX6bIs{p`ow&AphVc^ETAgg1<Xu(#@y6wOWTQ_F7h;pezL8mBgXkLu00Yjk(^oVX9<{iD%%9vUK z+=jlJi}5t;P@%5}7iFa*smfha?PI9~s~fj}dj(y3qOWy`BxKzd=1j>_{OXb3&;#J= zM~$qY8fO*GML6l-Tf%e~JWpZnbsln@7|q$v16`W)*RUJXY;L??mSNo~Yf*px02?VYnE&_?h)f%up}EoMby@p%=qm)_}7eu*^Zss6J{vWj%}e+ZQln zb;5cLGq&H=TOfHkbW>qf=njrw!|}}=pUd%09G}DSc8*tbyp7{mbG((~vpK$zNv}r;D!LgVDCj1Hz^>OJ1ZLfc5Lk5sLSWQu5dxdO4IyE|oj}(@Qwuq^ zl4GRL>8L$luL0C_K(FSo9BKT!gOrAx)N&P8mA)0JDqW9jgRa4KI%8Ue*g~8kt4!A+ zT%cEQj)HE>0aJzf`vsVPPXhWi;3~78#(ZxjY+(u8)LQgJTXOqFO+8kdwM*a5;a0tq z!!3FThaI|$!_B&r!%ccShb?+HXm8SF&%5-UxNgz(u5E|jhHIPNiffC$5!bDH39g$_ ztAs2{@8SAwdM|Q!>AP`l!$~rAb54?T$adQB{{VU3Je(yAQ-Pi;K(>p1BfwToK1Ka< zNH4%u!O9idfZ(YW_Q6WY{-yt>J}9KARdV6_0oMxO6hEgc_M~JulCQ!llG$^$5qU*w z9%ksTQw!mtFW?muYSD#Bp^XH9QFZ?Xd*u2KRhUS6Sbc z*eYw)_dxxVjIjcq6al}~*KfvMWmkJ6V{)V>7q^xg&?ogX`g<19jRkhXsHKgjC&jg5|- z0+(kYD}H0AAwRAhN3I9-GA4u~Qw4txk7Flui86nqxw%&+4ecBqdyupOTltm!a%sc9 zzztduE$97leolLPAud%4R&<x3xm?j5$KgTZ zHWyC*m5=533Bp4z|Cf`qUk5$p%7?!CDBA2Kj?*|#iJti0@)Y_q?%(;YOg-o^I{h_? z+Bi^7;|=bIb17X|x{$7N`+QI|V+!^^(7uu_>XqqNLm90mcW2W4DYt%n##ex(7V`4# zN%eYC7o7kvCqU~>9B0U?#$LBkjlF`FI%lUS9D5bzr)=%nT#p_1N@LeR?Nelh)Vmdu z1QvY)&ka65u@Xh0zoE(RGp%}q3N5qqGc5>_ltW@&p zDQpz^C#kFu4$4Pq(1sxSZC+4vhRez7xlhi;;y}7ffZ?2AVQh?%(gcn66x}gT@KP6V z{@9p5;!^5SZ_m=u)$KnH2evFu4%Goqm-X4%kE)vkzxb~SS2Wk^`q}#BRwOOIWw#yy zIdUR*T)T3i$j|NrfW@A1Isq+1bG|?S`?FZMX(y^DyxN-am&X@>PA1C+nH|}40E{Mcb4`si z&r&+qZCEk+;7N?1V7a&+8^f3#`4|!6Jb~*|C@*NS z3_FTDj?be!q9@Q{Dnb3zWJBU_2!?+ZIHc!ibIFNdrbQ(majhsAn{|xR$L;s*RIt5hqlW zd`?CUuT!gW*{QK_aci6grv>^u!6NuwXhupnmBr-B6F!XgOg>rYi;&_pY@S+-!lPr4 zQ7PK(D71bOMG02Hs>yCo-TXOH*x^pmy^ym>l{Za)F;ePX&OHZCWS~ zps*Bqpe93fMG2#|aXmyTIdu#Y4svCXG}_E{XE62A0=dv`OqVlGbnOw{<)kw{?n2W0 z=!*I_UyB`|0&02s8>D^gSo%m8COlu#>`QLXfY}lmkKu~4ij}L>zfC zk-(S>GdVciF_sO< zJdzLQc#~Z&VXmgVr5BbGyUMR)+f{zamB_h7TrIh@yn?Gj&xzSF04P>Yf~wEm`C?nO zP(64i&ukYeFU+NVUtnvzNblwT$VXeYU2!?R1$0G!MBPsxIb2;?o<@l$dYbXxcQCp) zcRmXFqW76%XTI8X*^WzD0?-PuliEc)b+4uDOE~=fb_WFZAce zZV}Ro7Xm!tKaojrIB2cqibhWMiq9$JfL{Je90W-iaE z!7wNDakwCS=@NbiW^ysF%ub#0s5?+sDu(ft=lS+Z(e=_H?Sd1!W}nIl!nO&=s`;Np zpSCEZZHJEcPVeLwisiQx<`o_@GhO(Xoa*^o#l*aLY1*9SV)Mfzy$+9pWxk01NqS85 z1Kshs+tHSnj-6uvqWPTcD2TLgmrfMsa_J8b>^ytrUwZMmHucH!%Q~dHT$qn6VSbu8 zhW>*7n-1rkCjIvmjSA3gjO9(#V`|I|Ufx?1Efjgh~M3 zcX-CbWS80WSwj=qm0c+(lz$*{GLeKIQa?d0coFv??sKT0;5(v>81rdRj=xs?a|yao zi4XQLdrZ#LnXNM)cqfbQb9ujf%I@CF4W0{`n|8x`h1ru^$dG-8&*Yyus*C9$9k-mD!~dk^4JQjc`U^$ zr7|4rkynmYsaQLRHCmN80@(d-nza^d<)&lB)C?SJv1+agYrn3-u^p@VW~2OS9Hm$% zB`c-oU=`C`92>DF@ETB?hog*l%Im_)&P7#~u??xOmu?~1C z)<7-8F&n(x1l+WfUN!d8y9HQjN5yNfr(P6TX5yd*JHt^AoBaR*WHUaBq9JRdPV?9<6ZUN=3IBw-#{8j^N zC#ZJexD7aVV0Gb694!cM2ku=s+OhI^H!$6SV>4DE-w9lI;n;%p*>?le9vs`SYHcsL z?Z!c?>3YFM3da=e!bf{7(!Pr|*oW^PXloe9E!chUe&Boujt1<$_ipIv5ge7+H}C^! zg~xHs!mfcIL@PXDeHihNV9&rgSP%I$TI8cRs)=wXM|}aBc@f9W*5|NiU=*t=k3%OfVPCa6?5XxLtnU>ZtFg=4325W1 zIM!hI!mokDujAN?)tIkA+uy*k6}uGv!ditr0H<5CunXV}D@r@QSrP2{R$(<^-?vJu z8GFA?wbo((w`s_kuBRhshMs|(DqV#Yj92NathLw^Zl+a(ec@(VE3o_94OT1mC|F|E zVi&j@ty{5^+ZJm%c4^y+wY%G}CNqZJ+O{L!iFKT-v1?lwAb02;Ry}ra+i9)D4sN%j z)-J3DZO2Y-y8&|t)^pZlN4GmsdKcDtw$sjTz_S-CH`}qlTN3eZtl4abw>`jqxQP9* zp8fC|_QU1uhl|()TiF9|VGpD|D9IAZ1E;YE(tecWF*9)_&|b4(PvniO*c(@%y{e(# zIXG6bH(tx$cq@Bj94$B>HcZ|)o4v7)y)n#wsMzZi`&$`%mtwzC>`~3^QM1^is@bD7 zd(_pSwi>+$t*WeGk6OyU6k%VY)znR}0P>{(`_ejCdnR=8Q^KBe6?@JU_MDmQGp+0= z*I^a)Ah;xNxrx1HJ$uV_*a6{Q^dPj0>3sH_M)sTy*uU~!(B^|U#EV+ki)z@5!t6z* z>_rM|HlKvVPr-|t*mD$nj$+TLX3wc$pIHZ=c>y|k5q>h2{bVuxn3&akGkx2$JxnaAF;kiBI(d&@lbmWAvs z)7e|1>@CySTW(@+X~8~omin#Tto=K< z-?|eTe-^EJ6g|fXbny-JP}D;lh0HUoPe9sP)~CSbjn<3cuN%9XD(I~Uyp)4B?J=>2 zd)R(pe*!IY6usByu--m^Q5IcKSpoIf*je=`TRI`^8Ai^!_wuaNv5*3#}c5eK>peg4q@Rs5WYhQWp4?83&g* zT+UiWDL>P?3bRp^(X*wCDq}bQ3XvW>c<4Pa8>cBFR072@e#c4h8Ay8abp6Ye1I_R8 z@eEIvCwByxFTnnochU><=*DBmFCjjDo1L{o_Co(3K~kZOxDN+*t_^AP;SSK|y==lw^>AgoA^jt6zs-$VKQ9&=H$$1# z+L(`!H>%%stjnHzwBd~ewEoVe501Mm8m-1FCTy-KbWXuV+;MqUvyx*|vP0t?Pon83{sX^KN*CBH%SpQ9Lag+3@CI2_bJS&yNJK^%E`=G1At$;teHPkF=hD029pBEX-4=Bef7Jz07`mfp2JMQMcewh;IOr{;Z4 zra_jM)e1`a{lUT>WoxQXC>G(A=3{blZ228%i8&CIcJn8iV@>dExm{CWL|;@x>e;1E z2z}7I{Pa)JF{8f|$l+cD^~{^DrhTbpX{P@e|DQ^Iu4tEM&K;b>p*QVLdEzA!p4Em7@(@wR7qa zK=x;s8QxvBvLGB0DV@BW{>r>HL)ZZ6+m|_Y@y0&uCYytqcG6Tf?TRo)-x3FCVtaOA zCli|xpOJPlxCka6pVxZ;lI`0kgL4x2CW9smL-?Hb<=%;MXuYIM^U|(`+9`{SBiz0& zD_{x+7h!NDuqou)3?N+pHI9qV^=1ZHpKxO1wfXY!4g0h6Idt8rxV5rxdU&8b2@iMX zu4)6&c*c$w3UfH{faTT(zHvr(o~phHy63nHoVIr7O5CRH>dOp}DN*V}A?_SW{-h9kNl;DZ21Wy=MxC>X}X|5P~^h8&}WfYd-EJw{sK$hXjbrzS-LX8rf zG@Dq084KEXO}>{w-)6ZM$85gRzFXH~c5Vhr7bAW>W-F+)8nYSK;#|PxG)V=>?=Q8o=vbxJ*tXUGbOsPHso0b?;ZqP^(oNAuFO*CPGq;JgNONlz|cUJ^DXc-+~%7(M=fA*OlQu_5BgSSxl#upZ^{eK#S B-RJ-S literal 0 HcmV?d00001 diff --git a/assets/icons/Info.svg b/assets/icons/Info.svg new file mode 100644 index 000000000..93411f2da --- /dev/null +++ b/assets/icons/Info.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/angel.svg b/assets/icons/angel.svg new file mode 100644 index 000000000..7fa8d6c75 --- /dev/null +++ b/assets/icons/angel.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/assets/icons/angry.svg b/assets/icons/angry.svg new file mode 100644 index 000000000..678171ffe --- /dev/null +++ b/assets/icons/angry.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/happy.svg b/assets/icons/happy.svg new file mode 100644 index 000000000..d883c3441 --- /dev/null +++ b/assets/icons/happy.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/assets/icons/laugh.svg b/assets/icons/laugh.svg new file mode 100644 index 000000000..a6e532f0e --- /dev/null +++ b/assets/icons/laugh.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/love.svg b/assets/icons/love.svg new file mode 100644 index 000000000..4d62a5dc3 --- /dev/null +++ b/assets/icons/love.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/icons/tear.svg b/assets/icons/tear.svg new file mode 100644 index 000000000..0d572d65f --- /dev/null +++ b/assets/icons/tear.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/images/Group 8948.png b/assets/images/Group 8948.png new file mode 100644 index 0000000000000000000000000000000000000000..7dcd1b989e019425b365e3c7efc2dd720f577170 GIT binary patch literal 2994 zcmV;j3r+NiP)Zxr6D{Hs)$0X*iJ=hfG9u(G>U@lRs>>$xniCv zg4iu0AXPw`l9s3<5Va_UzyYGvK#R*GkjVIsLIgHAKJ4@P-rIl9v-NV`wa@lmSd#gq z@y*TSpPik5=l^GB&j1VtgTY`h7z_r3!C){L3@WdC_oPjU#FHfs zh_t;9eI`BzJcnKYhVDt1+mCY zVCb5(C=oYmo)38Ozn}%yp%;LmYce2RaG3`Hf)k)0gk!>`%+Zyf0j!2}(%jtag5Fb` zlauoS^Z{&dE`B&Lcu~eqxX($S5?LO97g{ftK|hxH$Gzq!4lY~vV~l@%T3bH7W$g2*{GFfxhwH2mkH^<++qNwm(u-Rm zcxCyu$@zF){{cpVw9G_gpQyaNe9rq9?86s~X@Wsn(O%ULMmgAf(FUOyIogXqSyxxL z93x90P1x=B$;oNN#7Q%h(P%6*o6T2&p-5VkX!YvVBg5fvc}NuCoqrF6Ir+_yXN#m% zHxTCG!^<|f(9pRnJo56|l=zW#X}^y%`nK$wI5 zm$KnVeHJ`5v>j}Z2O)=#CmL_YBmO!N;7qd#tmn-Tk0`&L5{t!tfF1ZbM&AM*K@#T*z) zQjv#)vxAoRVf`YMBgxCb@4IL_bFp2gR0qHBqftAi=O>AD%HsLdd`Z_%;`vm@QCWJS zq(G$2q&|(3+5*|krkN6L-VYNfK+r>CWKEzQ|PoGD&b%fxeixPl54HK;2|#DI!4EDFOv zF{r+BiEX^t*x0xmqle%gLrnk)J?$6SAvJkqkZMzqVVBiGi|TVjhnXSfOEUNJS;mWb z#ppK?W!_2BFAh(f+ z+}oxWun34L7*A4$ zm^@nz4~B^9E8rtcCev*E+ywU!a-;Dkuax-^@@&bBq^wB9r@=ubt1PF2JThD4t5kJk zSV`N;r{A5jJn32-_y9f<3XR3e6j~FX2ruNXcr&+R zG^mvS`NJ`2vx<-^r0mTh%Ci>Uil0x&{Qk+(Fxt-mdZ)~5MI}=2<{ntJ0{d!-2am?iQIVxCfX)4&a#Ce1*H>YN| zV5iiz@g9Ls>#u2)IK&=uB!J;8J!Wu#@*pWf2i#5NmXKo(D$hfAv1@y%?@KDGkwiyh;4%udB8NVf&*Ul7qoE@EzNwO z1Q@zN6D7(LjBi*nOq=moFQAYevm3HX4}Aa4>yRRQ$CfocV6-Va*&^Js@W$VcH;;P_ z7`i|cCHiRM+8f1lyA3dTUB%mYqMF0Q*07*qoM6N<$f<5Y$JOBUy literal 0 HcmV?d00001 diff --git a/assets/images/Organisation_Default_Image.jpeg b/assets/images/Organisation_Default_Image.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..590eb4ca21a9c5f5e8dbf75ea201a603b79e6d68 GIT binary patch literal 18906 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 + + diff --git a/assets/images/comment.svg b/assets/images/comment.svg new file mode 100644 index 000000000..cd248c9fb --- /dev/null +++ b/assets/images/comment.svg @@ -0,0 +1,7 @@ + + + + + + + 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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