├── .github ├── pull_request_template.md └── workflows │ ├── build_apk.yml │ └── ci.yml ├── .gitignore ├── .gradle ├── 6.8 │ ├── fileChanges │ │ └── last-build.bin │ ├── fileHashes │ │ └── fileHashes.lock │ └── gc.properties ├── buildOutputCleanup │ ├── buildOutputCleanup.lock │ └── cache.properties ├── checksums │ └── checksums.lock ├── configuration-cache │ └── gc.properties └── vcs-1 │ └── gc.properties ├── .metadata ├── .vscode └── launch.json ├── README.md ├── analysis_options.yaml ├── android ├── .gitignore ├── app │ ├── build.gradle │ └── src │ │ ├── debug │ │ └── AndroidManifest.xml │ │ ├── main │ │ ├── AndroidManifest.xml │ │ ├── kotlin │ │ │ └── com │ │ │ │ ├── example │ │ │ │ └── hng │ │ │ │ │ └── MainActivity.kt │ │ │ │ └── zuri │ │ │ │ └── chat │ │ │ │ └── zc_app │ │ │ │ └── MainActivity.kt │ │ └── res │ │ │ ├── drawable-hdpi │ │ │ └── splash.png │ │ │ ├── drawable-mdpi │ │ │ └── splash.png │ │ │ ├── drawable-v21 │ │ │ ├── background.png │ │ │ └── launch_background.xml │ │ │ ├── drawable-xhdpi │ │ │ └── splash.png │ │ │ ├── drawable-xxhdpi │ │ │ └── splash.png │ │ │ ├── drawable-xxxhdpi │ │ │ └── splash.png │ │ │ ├── drawable │ │ │ ├── background.png │ │ │ ├── launch_background.xml │ │ │ └── zuri_chat_logo.png │ │ │ ├── mipmap-anydpi-v26 │ │ │ └── ic_launcher.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_adaptive_back.png │ │ │ └── ic_launcher_adaptive_fore.png │ │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_adaptive_back.png │ │ │ └── ic_launcher_adaptive_fore.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_adaptive_back.png │ │ │ └── ic_launcher_adaptive_fore.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_adaptive_back.png │ │ │ └── ic_launcher_adaptive_fore.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_adaptive_back.png │ │ │ └── ic_launcher_adaptive_fore.png │ │ │ ├── values-night │ │ │ └── styles.xml │ │ │ └── values │ │ │ └── styles.xml │ │ └── profile │ │ └── AndroidManifest.xml ├── build.gradle ├── gradle.properties ├── gradle │ └── wrapper │ │ └── gradle-wrapper.properties ├── settings.gradle └── settings_aar.gradle ├── assets ├── background │ ├── bga.png │ └── status.png ├── channel_page │ ├── attach.png │ ├── edit.png │ ├── female.png │ ├── femaleuser.png │ └── light.png ├── fonts │ ├── Lato-Black.ttf │ ├── Lato-BlackItalic.ttf │ ├── Lato-Bold.ttf │ ├── Lato-BoldItalic.ttf │ ├── Lato-Italic.ttf │ ├── Lato-Light.ttf │ ├── Lato-LightItalic.ttf │ ├── Lato-Regular.ttf │ ├── Lato-Thin.ttf │ ├── Lato-ThinItalic.ttf │ └── zap_icon.ttf ├── icons │ ├── Vector.svg │ ├── attachment-outline.png │ ├── back_arrow_icon.png │ ├── cancel.png │ ├── draft_icon.png │ ├── emojiHands │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ └── 6.png │ ├── fluent_camera-16-regular.svg │ ├── heart_icon.png │ ├── home_icon.png │ ├── integrate_icon.png │ ├── invite.png │ ├── lock_icon.png │ ├── lock_icon_shaded.png │ ├── message_icon.png │ ├── pin.png │ ├── svg_icons │ │ ├── Add-description.svg │ │ ├── Channel_Page_Share.svg │ │ ├── Copy-text.svg │ │ ├── Mark_Unread.svg │ │ ├── Reply_In_Thread.svg │ │ ├── Send.svg │ │ ├── Shape.svg │ │ ├── Share_message.svg │ │ ├── Vector (1).svg │ │ ├── active.svg │ │ ├── add-organization.svg │ │ ├── add-people.svg │ │ ├── add_channel.svg │ │ ├── akar-icons_link_chain.svg │ │ ├── archive.svg │ │ ├── at_sign.svg │ │ ├── bell-off.svg │ │ ├── bell.svg │ │ ├── bi_chat-text.svg │ │ ├── bi_pin-angle.svg │ │ ├── bookmark.svg │ │ ├── camera.svg │ │ ├── circle.svg │ │ ├── copy_text.svg │ │ ├── create_msg.svg │ │ ├── default.svg │ │ ├── dm.svg │ │ ├── fluent_camera-16-regular.svg │ │ ├── fluent_navigation-unread-24-regular.svg │ │ ├── fluent_send-24-filled.svg │ │ ├── gg_time.svg │ │ ├── hash_tag.svg │ │ ├── home.svg │ │ ├── integrate.svg │ │ ├── invite.svg │ │ ├── link.svg │ │ ├── lock1.svg │ │ ├── lock_outline.svg │ │ ├── log-out.svg │ │ ├── maximize.svg │ │ ├── members.svg │ │ ├── minimize.svg │ │ ├── notification.svg │ │ ├── paperclip.svg │ │ ├── phone.svg │ │ ├── pin_conversation.svg │ │ ├── pinned_message.svg │ │ ├── plugin.svg │ │ ├── plus.svg │ │ ├── preference.svg │ │ ├── share.svg │ │ ├── smile.svg │ │ ├── threads.svg │ │ ├── toggle_off_sharp.svg │ │ ├── user.svg │ │ ├── you.svg │ │ └── zap.svg │ ├── thread_icon.png │ └── user.png ├── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── Rectangle 138.png │ ├── Rectangle 138a.png │ ├── Rectangle 1922.png │ ├── Rectangle 1923.png │ ├── Rectangle 1924.png │ ├── Rectangle 1925.png │ ├── Rectangle 1931 (1).png │ ├── Rectangle 1931 (2).png │ ├── Rectangle 1931 (3).png │ ├── Rectangle 1931 (4).png │ ├── Rectangle 1931 (5).png │ ├── Rectangle 1931.png │ ├── arrows.png │ ├── avatar.png │ ├── baptist.png │ ├── chimamanda.png │ ├── close_search.png │ ├── file_image.png │ ├── gringo.png │ ├── naisu.png │ ├── nate.png │ ├── onboarding_screen_0.png │ ├── onboarding_screen_1.png │ ├── onboarding_screen_2.png │ ├── status.png │ ├── user.png │ ├── vector.png │ └── voice_search.png ├── language │ ├── ar.json │ ├── de.json │ ├── en.json │ ├── es.json │ ├── he.json │ ├── it.json │ ├── ja.json │ ├── pt.json │ └── zh.json ├── logo │ ├── Google_logo.png │ ├── Zuri_Abstract_logo.dart.png │ ├── Zuri_word_logo.png │ ├── add_logo.png │ ├── hng_logo.png │ ├── new_zuri_logo.png │ ├── splash_image.png │ ├── zuri_app_logo.png │ ├── zuri_app_logo2.png │ ├── zuri_logo.png │ ├── zuri_main_logo.png │ └── zuri_word_and_logo.png └── plugin_icons │ ├── calendar.svg │ ├── chess.svg │ ├── clock.svg │ ├── meeting.svg │ ├── music.svg │ ├── notice.svg │ └── todo.svg ├── flutter ├── git ├── ios ├── .gitignore ├── Flutter │ ├── AppFrameworkInfo.plist │ ├── Debug.xcconfig │ └── Release.xcconfig ├── Podfile ├── Podfile.lock ├── Runner.xcodeproj │ ├── project.pbxproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ ├── IDEWorkspaceChecks.plist │ │ │ └── WorkspaceSettings.xcsettings │ └── xcshareddata │ │ └── xcschemes │ │ └── Runner.xcscheme ├── Runner.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── IDEWorkspaceChecks.plist │ │ └── WorkspaceSettings.xcsettings ├── Runner │ ├── AppDelegate.swift │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ ├── 1024.png │ │ │ ├── 114.png │ │ │ ├── 120.png │ │ │ ├── 180.png │ │ │ ├── 29.png │ │ │ ├── 40.png │ │ │ ├── 57.png │ │ │ ├── 58.png │ │ │ ├── 60.png │ │ │ ├── 80.png │ │ │ ├── 87.png │ │ │ ├── Contents.json │ │ │ ├── Icon-App-1024x1024@1x.png │ │ │ ├── Icon-App-20x20@1x.png │ │ │ ├── Icon-App-20x20@2x.png │ │ │ ├── Icon-App-20x20@3x.png │ │ │ ├── Icon-App-29x29@1x.png │ │ │ ├── Icon-App-29x29@2x.png │ │ │ ├── Icon-App-29x29@3x.png │ │ │ ├── Icon-App-40x40@1x.png │ │ │ ├── Icon-App-40x40@2x.png │ │ │ ├── Icon-App-40x40@3x.png │ │ │ ├── Icon-App-60x60@2x.png │ │ │ ├── Icon-App-60x60@3x.png │ │ │ ├── Icon-App-76x76@1x.png │ │ │ ├── Icon-App-76x76@2x.png │ │ │ └── Icon-App-83.5x83.5@2x.png │ │ ├── LaunchBackground.imageset │ │ │ ├── Contents.json │ │ │ └── background.png │ │ └── LaunchImage.imageset │ │ │ ├── Contents.json │ │ │ ├── LaunchImage.png │ │ │ ├── LaunchImage@2x.png │ │ │ ├── LaunchImage@3x.png │ │ │ └── README.md │ ├── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard │ ├── Info.plist │ └── Runner-Bridging-Header.h └── build │ └── Pods.build │ └── Release-iphonesimulator │ ├── FMDB.build │ └── dgph │ ├── Flutter.build │ └── dgph │ ├── Pods-Runner.build │ └── dgph │ ├── Reachability.build │ └── dgph │ ├── Toast.build │ └── dgph │ ├── connectivity.build │ └── dgph │ ├── flutter_appavailability.build │ └── dgph │ ├── flutter_statusbarcolor_ns.build │ └── dgph │ ├── fluttertoast.build │ └── dgph │ ├── hexcolor.build │ └── dgph │ ├── image_gallery_saver.build │ └── dgph │ ├── modal_progress_hud_nsn.build │ └── dgph │ ├── path_provider.build │ └── dgph │ ├── permission_handler.build │ └── dgph │ ├── shared_preferences.build │ └── dgph │ ├── sqflite.build │ └── dgph │ └── url_launcher.build │ └── dgph ├── lib ├── app │ ├── app.dart │ ├── app.locator.dart │ ├── app.logger.dart │ └── app.router.dart ├── main.dart ├── main_app_view_model.dart ├── models │ ├── add_people_model.dart │ ├── api_response.dart │ ├── channel_members.dart │ ├── channel_model.dart │ ├── channels_search_model.dart │ ├── dm_model.dart │ ├── draft_data_holder_model.dart │ ├── drafted_item_model.dart │ ├── media_model.dart │ ├── message.dart │ ├── message_model.dart │ ├── organization_member_model.dart │ ├── organization_model.dart │ ├── pinned_message_model.dart │ ├── plugin_model.dart │ ├── profile_model.dart │ ├── saved_item_model.dart │ ├── signup_data_model.dart │ ├── start_dm_models.dart │ ├── static_user_model.dart │ ├── todo_model.dart │ ├── user.dart │ ├── user_model.dart │ ├── user_post.dart │ └── user_search_model.dart ├── services │ ├── app_services │ │ ├── app_toast.dart │ │ ├── connectivity_service.dart │ │ ├── deep_link_service.dart │ │ ├── local_storage_services.dart │ │ ├── localization_service.dart │ │ ├── media_service.dart │ │ ├── notification_service.dart │ │ ├── snackbar_service.dart │ │ └── zuri_theme_service.dart │ ├── core_services │ │ └── organization_api_service.dart │ ├── in_review │ │ ├── current_user_profile.dart │ │ ├── jump_to_api.dart │ │ ├── status_service.dart │ │ └── user_service.dart │ └── messaging_services │ │ ├── centrifuge_rtc_service.dart │ │ ├── channels_api_service.dart │ │ └── dms_api_service.dart ├── ui │ ├── nav_pages │ │ ├── dm_page │ │ │ ├── dm_page.dart │ │ │ ├── dm_page_viewmodel.dart │ │ │ ├── dm_search_find_page.dart │ │ │ └── widgets │ │ │ │ ├── dmmessage_read.dart │ │ │ │ └── dmmessage_unread.dart │ │ ├── home_page │ │ │ ├── home_item_model.dart │ │ │ ├── home_page.dart │ │ │ ├── home_page_viewmodel.dart │ │ │ └── widgets │ │ │ │ ├── custom_channel_list_tile.dart │ │ │ │ ├── custom_dm_list_tile.dart │ │ │ │ ├── custom_homepage_section_title.dart │ │ │ │ ├── custom_plugin_list_tile.dart │ │ │ │ ├── home_expanded.dart │ │ │ │ ├── home_list_items.dart │ │ │ │ ├── home_topbar.dart │ │ │ │ └── zuri_logo.dart │ │ ├── nav_bar │ │ │ ├── nav_bar_view.dart │ │ │ └── nav_bar_viewmodel.dart │ │ ├── plugin_page │ │ │ ├── plugin_view.dart │ │ │ ├── plugin_viewmodel.dart │ │ │ └── widgets │ │ │ │ └── icons.dart │ │ └── you_page │ │ │ ├── widgets │ │ │ ├── profile_page_head.dart │ │ │ └── status_form.dart │ │ │ ├── you_page.dart │ │ │ └── you_page_viewmodel.dart │ ├── shared │ │ ├── bottom_sheets │ │ │ ├── custom_user_bottomsheet │ │ │ │ ├── custom_user_bottom_sheet_view.dart │ │ │ │ ├── custom_user_bottom_sheet_viewmodel.dart │ │ │ │ └── widgets │ │ │ │ │ ├── custom_button.dart │ │ │ │ │ ├── custom_profile_tile.dart │ │ │ │ │ └── profile_head.dart │ │ │ ├── edit_message_bottom_sheet │ │ │ │ └── setup_bottom_sheet_ui.dart │ │ │ ├── emoji_picker_bottomsheet │ │ │ │ ├── emoji_picker_bottomsheet_view.dart │ │ │ │ └── emoji_picker_bottomsheet_viewmodel.dart │ │ │ ├── image_picker_bottomsheet │ │ │ │ ├── image_picker_bottom_sheet_view.dart │ │ │ │ └── image_picker_bottomsheet_viewmodel.dart │ │ │ ├── profile_botton_sheet │ │ │ │ ├── custom_user_bottom_sheet_view.dart │ │ │ │ ├── custom_user_bottom_sheet_viewmodel.dart │ │ │ │ └── widgets │ │ │ │ │ ├── custom_button.dart │ │ │ │ │ ├── custom_profile_tile.dart │ │ │ │ │ └── profile_head.dart │ │ │ ├── setup_bottom_sheet_ui.dart │ │ │ ├── sign_out_bottomsheet │ │ │ │ ├── sign_out_bottom_sheet_view.dart │ │ │ │ ├── sign_out_bottom_sheet_viewmodel.dart │ │ │ │ └── widgets │ │ │ │ │ └── work_space_display_info_view.dart │ │ │ ├── thread_options_bottomsheet │ │ │ │ ├── thread_option_bottomsheet_viewmodel.dart │ │ │ │ ├── thread_options_bottomsheet_view.dart │ │ │ │ └── widget │ │ │ │ │ └── recent_emojis.dart │ │ │ └── zuri_chat_bottomsheet.dart │ │ ├── dialogs │ │ │ ├── delete_draft_alert_dialog.dart │ │ │ ├── delete_message.dart │ │ │ ├── dumb_dialogs │ │ │ │ ├── dialogs.dart │ │ │ │ ├── image_source_dialog.dart │ │ │ │ ├── schedule_channel_dialog.dart │ │ │ │ ├── schedule_dialog.dart │ │ │ │ ├── select_language_dialog.dart │ │ │ │ ├── select_theme_dialog.dart │ │ │ │ ├── send_feedback_dialog.dart │ │ │ │ ├── sign_out_dialog.dart │ │ │ │ └── skin_tone_dialog.dart │ │ │ ├── setup_dialog_ui.dart │ │ │ └── smart_dialogs │ │ │ │ └── remind_me_dialog │ │ │ │ ├── remind_me_dialog.dart │ │ │ │ └── remind_me_dialog_viewmodel.dart │ │ ├── dumb_widgets │ │ │ ├── channel_icon.dart │ │ │ ├── channel_tile.dart │ │ │ ├── custom_textfield.dart │ │ │ ├── dm_tile.dart │ │ │ ├── long_button.dart │ │ │ ├── menu_item_tile.dart │ │ │ ├── no_connection_widget.dart │ │ │ ├── ripple.dart │ │ │ ├── search_bar.dart │ │ │ ├── svg_icon.dart │ │ │ ├── text_field.dart │ │ │ ├── unread_count.dart │ │ │ ├── zuri_appbar.dart │ │ │ └── zuri_loader.dart │ │ ├── shared.dart │ │ └── smart_widgets │ │ │ ├── expandable_textfield │ │ │ ├── expandable_textfield_screen.dart │ │ │ └── expandable_textfield_screen_viewmodel.dart │ │ │ ├── text_parser │ │ │ ├── text_parser_view.dart │ │ │ └── text_parser_viewmodel.dart │ │ │ └── thread_card │ │ │ ├── thread_card_view.dart │ │ │ ├── thread_card_viewmodel.dart │ │ │ └── widgets │ │ │ ├── audio_message.dart │ │ │ ├── emojis.dart │ │ │ ├── emojis_list.dart │ │ │ ├── media_files.dart │ │ │ ├── post_files_display.dart │ │ │ ├── post_replies.dart │ │ │ ├── quoted_replies.dart │ │ │ ├── snapshot_links.dart │ │ │ ├── thread_card_channel_main.dart │ │ │ ├── thread_card_detail.dart │ │ │ ├── thread_card_main.dart │ │ │ └── thread_card_post.dart │ └── view │ │ ├── add_people │ │ ├── add_people_view.dart │ │ ├── add_people_viewmodel.dart │ │ └── widgets │ │ │ └── custom_people_list_tile.dart │ │ ├── advanced │ │ ├── advanced_view.dart │ │ └── advanced_viewmodel.dart │ │ ├── all_threads_view │ │ ├── all_thread_view.dart │ │ └── all_thread_viewmodel.dart │ │ ├── channel │ │ ├── add_people │ │ │ ├── channel_add_people_view.dart │ │ │ └── channel_add_people_viewmodel.dart │ │ ├── channel_info │ │ │ ├── channel_info_view.dart │ │ │ ├── channel_info_view_model.dart │ │ │ └── widgets │ │ │ │ ├── custom_app_bar.dart │ │ │ │ ├── edit_button.dart │ │ │ │ ├── fifth_section.dart │ │ │ │ ├── first_section.dart │ │ │ │ ├── fourth_section.dart │ │ │ │ ├── new_row_tile.dart │ │ │ │ ├── second_section.dart │ │ │ │ ├── seventh_section.dart │ │ │ │ ├── sixth_section.dart │ │ │ │ ├── textstyles.dart │ │ │ │ └── third_section.dart │ │ ├── channel_list │ │ │ ├── channels_view.dart │ │ │ └── channels_viewmodel.dart │ │ ├── channel_members │ │ │ ├── channel_members_list.dart │ │ │ └── channel_members_list_model.dart │ │ ├── channel_notification │ │ │ ├── channel_notification_view.dart │ │ │ └── channel_notification_viewmodel.dart │ │ ├── channel_search │ │ │ ├── channel_search_view.dart │ │ │ ├── channel_search_view_model.dart │ │ │ └── widgets │ │ │ │ ├── app_bar_main.dart │ │ │ │ ├── search_result.dart │ │ │ │ └── textfield_style.dart │ │ ├── channel_view │ │ │ ├── channel_page_view.dart │ │ │ ├── channel_page_view.form.dart │ │ │ ├── channel_page_viewmodel.dart │ │ │ └── widgets │ │ │ │ ├── channel_chat.dart │ │ │ │ ├── channel_intro.dart │ │ │ │ ├── check_user.dart │ │ │ │ └── message_tile.dart │ │ ├── edit_channel │ │ │ ├── edit_channel_view.dart │ │ │ ├── edit_channel_view.form.dart │ │ │ ├── edit_channel_view_model.dart │ │ │ └── widgets │ │ │ │ ├── edit_channel_appbar.dart │ │ │ │ ├── edit_channel_headers.dart │ │ │ │ └── edit_channel_text_field.dart │ │ ├── new_channel │ │ │ ├── new_channel.dart │ │ │ ├── new_channel.form.dart │ │ │ └── new_channel_viewmodel.dart │ │ ├── pinned_messages │ │ │ ├── pinned_messages_view.dart │ │ │ └── pinned_messages_viewmodel.dart │ │ ├── share_message │ │ │ ├── share_message_hook.dart │ │ │ ├── share_message_view.dart │ │ │ ├── share_message_viewmodel.dart │ │ │ └── widgets │ │ │ │ ├── select_channel_drop_down.dart │ │ │ │ └── share_message_textfield.dart │ │ ├── shared_widgets.dart │ │ └── widgets │ │ │ └── channel_browser_container.dart │ │ ├── clear_after │ │ ├── clear_after_view.dart │ │ ├── clear_after_viewmodel.dart │ │ └── widget │ │ │ └── date_and_time.dart │ │ ├── clear_notification │ │ ├── clear_notification_view.dart │ │ └── clear_notification_viewmodel.dart │ │ ├── create_channel_view │ │ ├── create_channel_view.dart │ │ ├── create_channel_viewmodel.dart │ │ └── widgets │ │ │ ├── custom_text_field.dart │ │ │ └── custom_text_widget.dart │ │ ├── direct_message │ │ ├── direct_message.dart │ │ ├── direct_message.form.dart │ │ ├── direct_message_text_field_hook.dart │ │ └── direct_message_viewmodel.dart │ │ ├── dm_search │ │ ├── dm_search_view.dart │ │ ├── dm_search_view.form.dart │ │ └── dm_search_viewmodel.dart │ │ ├── dm_user │ │ ├── dm_user_view.dart │ │ ├── dm_user_view.form.dart │ │ ├── dm_user_viewmodel.dart │ │ ├── icons │ │ │ └── zap_icon.dart │ │ └── widgets │ │ │ ├── custom_start_message.dart │ │ │ ├── dm_top_bar.dart │ │ │ ├── group_separator.dart │ │ │ ├── message_view.dart │ │ │ └── online_indicator.dart │ │ ├── do_not_disturb │ │ ├── do_not_disturb_view.dart │ │ └── do_not_disturb_viewmodel.dart │ │ ├── draft │ │ ├── app │ │ │ ├── data.dart │ │ │ └── drafted_item_widget.dart │ │ ├── draft_view.dart │ │ ├── draft_viewmodel.dart │ │ └── drafts.dart │ │ ├── drafted_messages_page │ │ ├── drafted_message_page.dart │ │ ├── drafted_message_page_viewmodel.dart │ │ └── widgets │ │ │ └── app │ │ │ ├── data.dart │ │ │ └── drafted_item_widget.dart │ │ ├── edit_profile │ │ ├── edit_profile_view.dart │ │ ├── edit_profile_viewmodel.dart │ │ └── widget │ │ │ └── edit_profile_body.dart │ │ ├── expandable_textfield │ │ ├── expandable_textfield_screen.dart │ │ ├── expandable_textfield_screen.form.dart │ │ ├── expandable_textfield_screen_viewmodel.dart │ │ └── widget │ │ │ ├── my_textfield.dart │ │ │ └── user_mentions.dart │ │ ├── file_search │ │ ├── file_search_view.dart │ │ ├── file_search_viewmodel.dart │ │ └── widgets │ │ │ ├── file_tile.dart │ │ │ ├── search_bar.dart │ │ │ └── tab_bar.dart │ │ ├── forgot_password │ │ ├── forgot_password_email │ │ │ ├── forgot_password_email_view.dart │ │ │ ├── forgot_password_email_view.form.dart │ │ │ └── forgot_password_email_viewmodel.dart │ │ ├── forgot_password_new_password │ │ │ ├── forgot_password_newview.dart │ │ │ ├── forgot_password_newview.form.dart │ │ │ └── forgot_password_newviewmodel.dart │ │ └── forgot_password_otp │ │ │ ├── forgot_password_otp.form.dart │ │ │ ├── forgot_password_otpview.dart │ │ │ └── forgot_password_otpviewmodel.dart │ │ ├── general_search │ │ ├── general_search_view.dart │ │ ├── general_search_view.form.dart │ │ └── general_search_viewmodel.dart │ │ ├── jump_to_view │ │ ├── jump_to_view.dart │ │ ├── jump_to_view.form.dart │ │ └── jump_to_viewmodel.dart │ │ ├── language_and_region │ │ ├── language_and_region_view.dart │ │ └── language_and_region_viewmodel.dart │ │ ├── login │ │ ├── login_view.dart │ │ ├── login_view.form.dart │ │ └── login_viewmodel.dart │ │ ├── notifications │ │ ├── notifications_view.dart │ │ └── notifications_viewmodel.dart │ │ ├── onboarding │ │ ├── onboading_view.dart │ │ └── onboarding_viewmodel.dart │ │ ├── organization │ │ ├── add_organization │ │ │ ├── add_organization_view.dart │ │ │ └── add_organization_viewmodel.dart │ │ ├── create_organization │ │ │ ├── company.dart │ │ │ ├── create_organization.dart │ │ │ ├── create_organization_viewmodel.dart │ │ │ ├── invite.dart │ │ │ └── project.dart │ │ ├── email_confirmation │ │ │ ├── email_confirmation_view.dart │ │ │ └── email_confirmation_viewmodel.dart │ │ ├── invite_to_organization │ │ │ ├── admin_permissions │ │ │ │ ├── create_invite_link.dart │ │ │ │ ├── invite_link_created.dart │ │ │ │ └── invite_via_email.dart │ │ │ ├── invitation_sent.dart │ │ │ ├── invite_via_contact │ │ │ │ └── import_contact.dart │ │ │ └── invite_via_email │ │ │ │ ├── invite_via_email.dart │ │ │ │ ├── invite_via_email.form.dart │ │ │ │ └── invite_viewmodel.dart │ │ ├── new_email │ │ │ ├── new_email.dart │ │ │ └── new_email_viewmodel.dart │ │ ├── organization_different_email │ │ │ ├── different_email_organization_view.dart │ │ │ └── different_email_organization_viewmodel.dart │ │ ├── organization_settings │ │ │ ├── organization_logo.dart │ │ │ ├── organization_name_url.dart │ │ │ ├── organization_settings_view.dart │ │ │ └── organization_settings_view_model.dart │ │ ├── organization_url │ │ │ ├── organization_url_view.dart │ │ │ └── organization_url_viewmodel.dart │ │ ├── organization_view │ │ │ ├── organization_view.dart │ │ │ └── organization_viewmodel.dart │ │ └── select_email │ │ │ ├── select_email_view.dart │ │ │ └── select_email_viewmodel.dart │ │ ├── otp │ │ ├── otp_view.dart │ │ ├── otp_view.form.dart │ │ └── otp_viewmodel.dart │ │ ├── password_recovery │ │ ├── new_password.dart │ │ ├── recovery_view.dart │ │ └── recovery_viewmodel.dart │ │ ├── plugins │ │ ├── add_plugin_view.dart │ │ └── add_plugin_viewmodel.dart │ │ ├── popup_notification │ │ ├── popup_notification.dart │ │ └── popup_notification_viewmodel.dart │ │ ├── preference │ │ ├── preference_view.dart │ │ └── preference_viewmodel.dart │ │ ├── profile_page │ │ ├── profile_page_view.dart │ │ └── profile_page_viewmodel.dart │ │ ├── saved_items │ │ ├── saved_items_view.dart │ │ ├── saved_items_viewmodel.dart │ │ └── widgets │ │ │ └── saved_item_background.dart │ │ ├── search_messages │ │ ├── message.dart │ │ └── message_viewmodel.dart │ │ ├── set_status │ │ ├── set_status_view.dart │ │ ├── set_status_view.form.dart │ │ ├── set_status_viewmodel.dart │ │ └── widgets │ │ │ ├── status.dart │ │ │ └── statuses.dart │ │ ├── sign_up │ │ ├── sign_up_view.dart │ │ ├── sign_up_view.form.dart │ │ └── sign_up_viewmodel.dart │ │ ├── splashscreen │ │ ├── splashscreen.dart │ │ └── splashscreen_viewmodel.dart │ │ ├── start_dm │ │ ├── start_dm_view.dart │ │ ├── start_dm_view.form.dart │ │ ├── start_dm_viewmodel.dart │ │ └── widgets │ │ │ ├── custom_chip_input.dart │ │ │ └── custom_input_chip.dart │ │ ├── static_pages │ │ └── terms_and_conditions │ │ │ ├── terms_and_conditions_view.dart │ │ │ └── terms_and_conditions_view_model.dart │ │ ├── threads │ │ ├── all_threads │ │ │ ├── threads_view.dart │ │ │ ├── threads_viewmodel.dart │ │ │ └── widgets │ │ │ │ └── thread_card.dart │ │ ├── test_data.dart │ │ └── thread_detail │ │ │ ├── thread_detail_view.dart │ │ │ ├── thread_detail_view.form.dart │ │ │ └── thread_detail_viewmodel.dart │ │ ├── user_search │ │ ├── user_search.dart │ │ ├── user_search_not_found.dart │ │ ├── user_search_view.dart │ │ ├── user_search_viewmodel.dart │ │ └── widget │ │ │ └── custom_dm_list_tile.dart │ │ └── webview_page │ │ ├── web_view_model.dart │ │ └── webview_page.dart └── utilities │ ├── api_handlers │ ├── api.dart │ ├── api_utils.dart │ ├── dio_interceptors.dart │ ├── exceptions.dart │ ├── failures.dart │ └── zuri_api.dart │ ├── constants │ ├── app_constants.dart │ ├── app_strings.dart │ ├── colors.dart │ ├── local_keys.dart │ ├── storage_keys.dart │ ├── text_styles.dart │ └── ui_helpers.dart │ ├── enums.dart │ ├── extensions │ ├── locale_extension.dart │ └── string_extension.dart │ ├── failures.dart │ ├── internationalization │ └── app_localization.dart │ ├── mixins │ ├── close_on_second_back_mixin.dart │ └── validators_mixin.dart │ └── utilities.dart ├── pubspec.lock ├── pubspec.yaml ├── test ├── helpers │ ├── test_constants.dart │ ├── test_helpers.dart │ └── test_helpers.mocks.dart ├── services │ ├── bottom_sheet_service_test.dart │ ├── centrifuge_service_test.dart │ ├── channel_api_service_test.dart │ ├── connectivity_service_test.dart │ ├── dialog_service_test.dart │ ├── dm_api_service.test.dart │ ├── jumpto_api_service_test.dart │ ├── local_storage_services_test.dart │ ├── media_service_test.dart │ ├── navigation_service_test.dart │ ├── snackbar_service_test.dart │ ├── text_parser_test.dart │ ├── theme_service_test.dart │ ├── user_service_test.dart │ └── zuri_api_test.dart └── view_models │ ├── add_people_viewmodel_test.dart │ ├── advanced_viewmodel_test.dart │ ├── channel_add_people_viewmodel_test.dart │ ├── channel_info_view_model_test.dart │ ├── channel_members_list_model_test.dart │ ├── channel_notification_viewmodel_test.dart │ ├── channels_viewmodel_test.dart │ ├── dm_jump_to_viewmodel_test.dart │ ├── dm_user_viewmodel_test.dart │ ├── forgot_password_email_viewmodel_test.dart │ ├── forgot_password_new_viewmodel_test.dart │ ├── forgot_password_otp_viewmodel_test.dart │ ├── login_viewmodel_test.dart │ ├── notifications_viewmodel_test.dart │ ├── otp_viewmodel_test.dart │ ├── plugin_viewmodel_test.dart │ └── you_page_viewmodel_test.dart └── web ├── favicon.png ├── icons ├── Icon-192.png └── Icon-512.png ├── index.html ├── manifest.json └── splash ├── img ├── dark-1x.png ├── dark-2x.png ├── dark-3x.png ├── dark-4x.png ├── light-1x.png ├── light-2x.png ├── light-3x.png └── light-4x.png └── style.css /.github/workflows/build_apk.yml: -------------------------------------------------------------------------------- 1 | name: Build APK based on label 2 | 3 | on: 4 | pull_request: 5 | types: [labeled] 6 | 7 | 8 | jobs: 9 | build: 10 | if: ${{ github.event.label.name == 'Accepted' }} 11 | runs-on: ubuntu-latest 12 | steps: 13 | 14 | - uses: actions/checkout@v2 15 | - uses: actions/setup-java@v1 16 | with: 17 | java-version: '12.x' 18 | 19 | 20 | - uses: subosito/flutter-action@v1 21 | with: 22 | flutter-version: '2.5.2' 23 | 24 | - run: flutter pub get 25 | - run: flutter build apk 26 | 27 | - uses: actions/upload-artifact@v1 28 | with: 29 | name: release-apk 30 | path: build/app/outputs/apk/release/app-release.apk 31 | 32 | - name: Save PR number 33 | run: | 34 | mkdir -p ./pr 35 | echo ${{ github.event.number }} > ./pr/NR 36 | - uses: actions/upload-artifact@v2 37 | with: 38 | name: pr 39 | path: pr/ -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: Flutter workflow 2 | env: 3 | FLUTTER_VERSION: "3.3.8" 4 | FLUTTER_CHANNEL: "stable" 5 | 6 | on: 7 | pull_request: 8 | push: 9 | branches: 10 | - dev 11 | 12 | jobs: 13 | qa: 14 | name: Quality Assurance 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: actions/checkout@v3 18 | - name: Setup Flutter 19 | uses: subosito/flutter-action@v2 20 | with: 21 | channel: ${{ env.FLUTTER_CHANNEL }} 22 | flutter-version: ${{ env.FLUTTER_VERSION }} 23 | - name: Install dependencies 24 | run: flutter pub get 25 | - name: Running the formatter 26 | run: flutter format lib/ 27 | - name: Running the analyzer 28 | run: flutter analyze --no-pub 29 | - name: Running code generation 30 | run: flutter pub run build_runner build --delete-conflicting-outputs 31 | - name: Verifying different changes has not been made 32 | run: git diff --exit-code 33 | # TODO: Uncomment this line when tests are fixed 34 | # - name: Running tests without coverage 35 | # run: flutter test --no-pub 36 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Miscellaneous 2 | *.class 3 | *.log 4 | *.pyc 5 | *.swp 6 | .DS_Store 7 | .atom/ 8 | .buildlog/ 9 | .history 10 | .svn/ 11 | 12 | # IntelliJ related 13 | *.iml 14 | *.ipr 15 | *.iws 16 | .idea/ 17 | 18 | .vscode 19 | .fvm 20 | # The .vscode folder contains launch configuration and tasks you configure in 21 | # VS Code which you may wish to be included in version control, so this line 22 | # is commented out by default. 23 | #.vscode/ 24 | 25 | # Flutter/Dart/Pub related 26 | **/doc/api/ 27 | **/ios/Flutter/.last_build_id 28 | .dart_tool/ 29 | .fvm/flutter_sdk 30 | .vscode/settings.json 31 | .flutter-plugins 32 | .flutter-plugins-dependencies 33 | .packages 34 | pubspec.lock 35 | .pub-cache/ 36 | .pub/ 37 | /build/ 38 | lib/app/app.locator.dart 39 | lib/app/app.router.dart 40 | /test/helpers/test_helpers.mocks.dart 41 | # Web related 42 | lib/generated_plugin_registrant.dart 43 | 44 | # Symbolication related 45 | app.*.symbols 46 | 47 | # Obfuscation related 48 | app.*.map.json 49 | 50 | # Android Studio will place build artifacts here 51 | /android/app/debug 52 | /android/app/profile 53 | /android/app/release 54 | /android/key.properties 55 | /android/app/upload-keystore.jks 56 | /android/app/new-upload-keystore.jks 57 | -------------------------------------------------------------------------------- /.gradle/6.8/fileChanges/last-build.bin: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gradle/6.8/fileHashes/fileHashes.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/.gradle/6.8/fileHashes/fileHashes.lock -------------------------------------------------------------------------------- /.gradle/6.8/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/.gradle/6.8/gc.properties -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/buildOutputCleanup.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/.gradle/buildOutputCleanup/buildOutputCleanup.lock -------------------------------------------------------------------------------- /.gradle/buildOutputCleanup/cache.properties: -------------------------------------------------------------------------------- 1 | #Thu Oct 07 17:10:32 WAT 2021 2 | gradle.version=6.8 3 | -------------------------------------------------------------------------------- /.gradle/checksums/checksums.lock: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/.gradle/checksums/checksums.lock -------------------------------------------------------------------------------- /.gradle/configuration-cache/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/.gradle/configuration-cache/gc.properties -------------------------------------------------------------------------------- /.gradle/vcs-1/gc.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/.gradle/vcs-1/gc.properties -------------------------------------------------------------------------------- /.metadata: -------------------------------------------------------------------------------- 1 | # This file tracks properties of this Flutter project. 2 | # Used by Flutter tool to assess capabilities and perform upgrades etc. 3 | # 4 | # This file should be version controlled and should not be manually edited. 5 | 6 | version: 7 | revision: 02c026b03cd31dd3f867e5faeb7e104cce174c5f 8 | channel: stable 9 | 10 | project_type: app 11 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | 8 | { 9 | "name": "zc_app", 10 | "request": "launch", 11 | "type": "dart" 12 | }, 13 | { 14 | "name": "zc_app (profile mode)", 15 | "request": "launch", 16 | "type": "dart", 17 | "flutterMode": "profile" 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /analysis_options.yaml: -------------------------------------------------------------------------------- 1 | include: package:flutter_lints/flutter.yaml 2 | analyzer: 3 | exclude: 4 | - test/helpers/*.mocks.dart 5 | - lib/models/*.g.dart 6 | - lib/ui/view/**.form.dart 7 | - lib/app/app.logger.dart 8 | errors: 9 | unnecessary_string_interpolations: ignore 10 | overridden_fields: ignore 11 | avoid_function_literals_in_foreach_calls: ignore 12 | todo: ignore 13 | constant_identifier_names: ignore 14 | must_be_immutable: ignore -------------------------------------------------------------------------------- /android/.gitignore: -------------------------------------------------------------------------------- 1 | gradle-wrapper.jar 2 | /.gradle 3 | /captures/ 4 | /gradlew 5 | /gradlew.bat 6 | /local.properties 7 | GeneratedPluginRegistrant.java 8 | 9 | # Remember to never publicly share your keystore. 10 | # See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app 11 | key.properties 12 | -------------------------------------------------------------------------------- /android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/example/hng/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.zuri.chat.app 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/kotlin/com/zuri/chat/zc_app/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.zuri.chat.zc_app 2 | 3 | import io.flutter.embedding.android.FlutterActivity 4 | 5 | class MainActivity: FlutterActivity() { 6 | } 7 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-hdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/drawable-hdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-mdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/drawable-mdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/drawable-v21/background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-v21/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/drawable-xhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/drawable-xxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable-xxxhdpi/splash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/drawable-xxxhdpi/splash.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/drawable/background.png -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/launch_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /android/app/src/main/res/drawable/zuri_chat_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/drawable/zuri_chat_logo.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_adaptive_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/mipmap-hdpi/ic_launcher_adaptive_back.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-hdpi/ic_launcher_adaptive_fore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/mipmap-hdpi/ic_launcher_adaptive_fore.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_adaptive_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/mipmap-mdpi/ic_launcher_adaptive_back.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-mdpi/ic_launcher_adaptive_fore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/mipmap-mdpi/ic_launcher_adaptive_fore.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_adaptive_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/mipmap-xhdpi/ic_launcher_adaptive_back.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xhdpi/ic_launcher_adaptive_fore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/mipmap-xhdpi/ic_launcher_adaptive_fore.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_back.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_fore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_fore.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_adaptive_back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_adaptive_back.png -------------------------------------------------------------------------------- /android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png -------------------------------------------------------------------------------- /android/app/src/main/res/values-night/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 16 | 19 | -------------------------------------------------------------------------------- /android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 16 | 19 | -------------------------------------------------------------------------------- /android/app/src/profile/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | ext.kotlin_version = '1.6.10' 3 | repositories { 4 | google() 5 | mavenCentral() 6 | jcenter() 7 | } 8 | 9 | dependencies { 10 | classpath 'com.android.tools.build:gradle:7.1.2' 11 | classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | google() 18 | mavenCentral() 19 | jcenter() 20 | } 21 | } 22 | 23 | rootProject.buildDir = '../build' 24 | subprojects { 25 | project.buildDir = "${rootProject.buildDir}/${project.name}" 26 | project.evaluationDependsOn(':app') 27 | } 28 | 29 | task clean(type: Delete) { 30 | delete rootProject.buildDir 31 | } 32 | -------------------------------------------------------------------------------- /android/gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx1536M 2 | android.useAndroidX=true 3 | android.enableJetifier=true 4 | -------------------------------------------------------------------------------- /android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /android/settings.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | 3 | def localPropertiesFile = new File(rootProject.projectDir, "local.properties") 4 | def properties = new Properties() 5 | 6 | assert localPropertiesFile.exists() 7 | localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } 8 | 9 | def flutterSdkPath = properties.getProperty("flutter.sdk") 10 | assert flutterSdkPath != null, "flutter.sdk not set in local.properties" 11 | apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" 12 | -------------------------------------------------------------------------------- /android/settings_aar.gradle: -------------------------------------------------------------------------------- 1 | include ':app' 2 | -------------------------------------------------------------------------------- /assets/background/bga.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/background/bga.png -------------------------------------------------------------------------------- /assets/background/status.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/background/status.png -------------------------------------------------------------------------------- /assets/channel_page/attach.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/channel_page/attach.png -------------------------------------------------------------------------------- /assets/channel_page/edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/channel_page/edit.png -------------------------------------------------------------------------------- /assets/channel_page/female.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/channel_page/female.png -------------------------------------------------------------------------------- /assets/channel_page/femaleuser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/channel_page/femaleuser.png -------------------------------------------------------------------------------- /assets/channel_page/light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/channel_page/light.png -------------------------------------------------------------------------------- /assets/fonts/Lato-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/fonts/Lato-Black.ttf -------------------------------------------------------------------------------- /assets/fonts/Lato-BlackItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/fonts/Lato-BlackItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Lato-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/fonts/Lato-Bold.ttf -------------------------------------------------------------------------------- /assets/fonts/Lato-BoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/fonts/Lato-BoldItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Lato-Italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/fonts/Lato-Italic.ttf -------------------------------------------------------------------------------- /assets/fonts/Lato-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/fonts/Lato-Light.ttf -------------------------------------------------------------------------------- /assets/fonts/Lato-LightItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/fonts/Lato-LightItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/Lato-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/fonts/Lato-Regular.ttf -------------------------------------------------------------------------------- /assets/fonts/Lato-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/fonts/Lato-Thin.ttf -------------------------------------------------------------------------------- /assets/fonts/Lato-ThinItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/fonts/Lato-ThinItalic.ttf -------------------------------------------------------------------------------- /assets/fonts/zap_icon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/fonts/zap_icon.ttf -------------------------------------------------------------------------------- /assets/icons/attachment-outline.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/attachment-outline.png -------------------------------------------------------------------------------- /assets/icons/back_arrow_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/back_arrow_icon.png -------------------------------------------------------------------------------- /assets/icons/cancel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/cancel.png -------------------------------------------------------------------------------- /assets/icons/draft_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/draft_icon.png -------------------------------------------------------------------------------- /assets/icons/emojiHands/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/emojiHands/1.png -------------------------------------------------------------------------------- /assets/icons/emojiHands/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/emojiHands/2.png -------------------------------------------------------------------------------- /assets/icons/emojiHands/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/emojiHands/3.png -------------------------------------------------------------------------------- /assets/icons/emojiHands/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/emojiHands/4.png -------------------------------------------------------------------------------- /assets/icons/emojiHands/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/emojiHands/5.png -------------------------------------------------------------------------------- /assets/icons/emojiHands/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/emojiHands/6.png -------------------------------------------------------------------------------- /assets/icons/heart_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/heart_icon.png -------------------------------------------------------------------------------- /assets/icons/home_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/home_icon.png -------------------------------------------------------------------------------- /assets/icons/integrate_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/integrate_icon.png -------------------------------------------------------------------------------- /assets/icons/invite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/invite.png -------------------------------------------------------------------------------- /assets/icons/lock_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/lock_icon.png -------------------------------------------------------------------------------- /assets/icons/lock_icon_shaded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/lock_icon_shaded.png -------------------------------------------------------------------------------- /assets/icons/message_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/message_icon.png -------------------------------------------------------------------------------- /assets/icons/pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/pin.png -------------------------------------------------------------------------------- /assets/icons/svg_icons/Add-description.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/Reply_In_Thread.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/Send.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/Shape.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/Vector (1).svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/active.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/add-organization.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/add-people.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/add_channel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/akar-icons_link_chain.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/archive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/at_sign.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/bookmark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/camera.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/create_msg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/default.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/dm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/fluent_send-24-filled.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/gg_time.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/hash_tag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/home.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/integrate.svg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/svg_icons/integrate.svg -------------------------------------------------------------------------------- /assets/icons/svg_icons/invite.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/link.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/lock1.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/lock_outline.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/log-out.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/maximize.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/members.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/minimize.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/notification.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/paperclip.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/phone.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/smile.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/toggle_off_sharp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/user.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/you.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/icons/svg_icons/zap.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/icons/thread_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/thread_icon.png -------------------------------------------------------------------------------- /assets/icons/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/icons/user.png -------------------------------------------------------------------------------- /assets/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/1.png -------------------------------------------------------------------------------- /assets/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/2.png -------------------------------------------------------------------------------- /assets/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/3.png -------------------------------------------------------------------------------- /assets/images/Rectangle 138.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/Rectangle 138.png -------------------------------------------------------------------------------- /assets/images/Rectangle 138a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/Rectangle 138a.png -------------------------------------------------------------------------------- /assets/images/Rectangle 1922.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/Rectangle 1922.png -------------------------------------------------------------------------------- /assets/images/Rectangle 1923.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/Rectangle 1923.png -------------------------------------------------------------------------------- /assets/images/Rectangle 1924.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/Rectangle 1924.png -------------------------------------------------------------------------------- /assets/images/Rectangle 1925.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/Rectangle 1925.png -------------------------------------------------------------------------------- /assets/images/Rectangle 1931 (1).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/Rectangle 1931 (1).png -------------------------------------------------------------------------------- /assets/images/Rectangle 1931 (2).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/Rectangle 1931 (2).png -------------------------------------------------------------------------------- /assets/images/Rectangle 1931 (3).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/Rectangle 1931 (3).png -------------------------------------------------------------------------------- /assets/images/Rectangle 1931 (4).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/Rectangle 1931 (4).png -------------------------------------------------------------------------------- /assets/images/Rectangle 1931 (5).png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/Rectangle 1931 (5).png -------------------------------------------------------------------------------- /assets/images/Rectangle 1931.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/Rectangle 1931.png -------------------------------------------------------------------------------- /assets/images/arrows.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/arrows.png -------------------------------------------------------------------------------- /assets/images/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/avatar.png -------------------------------------------------------------------------------- /assets/images/baptist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/baptist.png -------------------------------------------------------------------------------- /assets/images/chimamanda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/chimamanda.png -------------------------------------------------------------------------------- /assets/images/close_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/close_search.png -------------------------------------------------------------------------------- /assets/images/file_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/file_image.png -------------------------------------------------------------------------------- /assets/images/gringo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/gringo.png -------------------------------------------------------------------------------- /assets/images/naisu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/naisu.png -------------------------------------------------------------------------------- /assets/images/nate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/nate.png -------------------------------------------------------------------------------- /assets/images/onboarding_screen_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/onboarding_screen_0.png -------------------------------------------------------------------------------- /assets/images/onboarding_screen_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/onboarding_screen_1.png -------------------------------------------------------------------------------- /assets/images/onboarding_screen_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/onboarding_screen_2.png -------------------------------------------------------------------------------- /assets/images/status.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/status.png -------------------------------------------------------------------------------- /assets/images/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/user.png -------------------------------------------------------------------------------- /assets/images/vector.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/vector.png -------------------------------------------------------------------------------- /assets/images/voice_search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/images/voice_search.png -------------------------------------------------------------------------------- /assets/logo/Google_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/logo/Google_logo.png -------------------------------------------------------------------------------- /assets/logo/Zuri_Abstract_logo.dart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/logo/Zuri_Abstract_logo.dart.png -------------------------------------------------------------------------------- /assets/logo/Zuri_word_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/logo/Zuri_word_logo.png -------------------------------------------------------------------------------- /assets/logo/add_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/logo/add_logo.png -------------------------------------------------------------------------------- /assets/logo/hng_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/logo/hng_logo.png -------------------------------------------------------------------------------- /assets/logo/new_zuri_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/logo/new_zuri_logo.png -------------------------------------------------------------------------------- /assets/logo/splash_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/logo/splash_image.png -------------------------------------------------------------------------------- /assets/logo/zuri_app_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/logo/zuri_app_logo.png -------------------------------------------------------------------------------- /assets/logo/zuri_app_logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/logo/zuri_app_logo2.png -------------------------------------------------------------------------------- /assets/logo/zuri_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/logo/zuri_logo.png -------------------------------------------------------------------------------- /assets/logo/zuri_main_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/logo/zuri_main_logo.png -------------------------------------------------------------------------------- /assets/logo/zuri_word_and_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/assets/logo/zuri_word_and_logo.png -------------------------------------------------------------------------------- /assets/plugin_icons/calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /assets/plugin_icons/chess.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /assets/plugin_icons/clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/plugin_icons/meeting.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/plugin_icons/notice.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/plugin_icons/todo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /flutter: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/flutter -------------------------------------------------------------------------------- /git: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/git -------------------------------------------------------------------------------- /ios/.gitignore: -------------------------------------------------------------------------------- 1 | *.mode1v3 2 | *.mode2v3 3 | *.moved-aside 4 | *.pbxuser 5 | *.perspectivev3 6 | **/*sync/ 7 | .sconsign.dblite 8 | .tags* 9 | **/.vagrant/ 10 | **/DerivedData/ 11 | Icon? 12 | **/Pods/ 13 | **/.symlinks/ 14 | profile 15 | xcuserdata 16 | **/.generated/ 17 | Flutter/App.framework 18 | Flutter/Flutter.framework 19 | Flutter/Flutter.podspec 20 | Flutter/Generated.xcconfig 21 | Flutter/ephemeral/ 22 | Flutter/app.flx 23 | Flutter/app.zip 24 | Flutter/flutter_assets/ 25 | Flutter/flutter_export_environment.sh 26 | ServiceDefinitions.json 27 | Runner/GeneratedPluginRegistrant.* 28 | 29 | # Exceptions to above rules. 30 | !default.mode1v3 31 | !default.mode2v3 32 | !default.pbxuser 33 | !default.perspectivev3 34 | -------------------------------------------------------------------------------- /ios/Flutter/AppFrameworkInfo.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | App 9 | CFBundleIdentifier 10 | io.flutter.flutter.app 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | App 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1.0 23 | MinimumOSVersion 24 | 9.0 25 | 26 | 27 | -------------------------------------------------------------------------------- /ios/Flutter/Debug.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Flutter/Release.xcconfig: -------------------------------------------------------------------------------- 1 | #include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" 2 | #include "Generated.xcconfig" 3 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreviewsEnabled 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /ios/Runner/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import Flutter 3 | 4 | @UIApplicationMain 5 | @objc class AppDelegate: FlutterAppDelegate { 6 | override func application( 7 | _ application: UIApplication, 8 | didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? 9 | ) -> Bool { 10 | GeneratedPluginRegistrant.register(with: self) 11 | return super.application(application, didFinishLaunchingWithOptions: launchOptions) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/1024.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/114.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/120.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/180.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/29.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/40.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/57.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/58.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/60.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/80.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/87.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchBackground.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "background.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "author" : "xcode", 19 | "version" : 1 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/LaunchBackground.imageset/background.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "filename" : "LaunchImage.png", 5 | "idiom" : "universal", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "filename" : "LaunchImage@2x.png", 10 | "idiom" : "universal", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "filename" : "LaunchImage@3x.png", 15 | "idiom" : "universal", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "author" : "xcode", 21 | "version" : 1 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png -------------------------------------------------------------------------------- /ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md: -------------------------------------------------------------------------------- 1 | # Launch Screen Assets 2 | 3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory. 4 | 5 | You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. -------------------------------------------------------------------------------- /ios/Runner/Runner-Bridging-Header.h: -------------------------------------------------------------------------------- 1 | #import "GeneratedPluginRegistrant.h" 2 | -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/FMDB.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/Flutter.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/Pods-Runner.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/Reachability.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/Toast.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/connectivity.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/flutter_appavailability.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/flutter_statusbarcolor_ns.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/fluttertoast.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/hexcolor.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/image_gallery_saver.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/modal_progress_hud_nsn.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/path_provider.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/permission_handler.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/shared_preferences.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/sqflite.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /ios/build/Pods.build/Release-iphonesimulator/url_launcher.build/dgph: -------------------------------------------------------------------------------- 1 | DGPH1.04 Feb 25 202123:22:09/UsersjamaaldeenopasinaJavazc_appiosPods -------------------------------------------------------------------------------- /lib/main_app_view_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/widgets.dart'; 2 | import 'package:zurichat/app/app.locator.dart'; 3 | import 'package:zurichat/services/app_services/localization_service.dart'; 4 | import 'package:stacked/stacked.dart'; 5 | 6 | class AppModel extends ReactiveViewModel { 7 | final _localizationService = locator(); 8 | 9 | get localizationsDelegates => _localizationService.localizationsDelegates; 10 | 11 | get appLocale => _localizationService.appLocale; 12 | 13 | void initialise() { 14 | throw Exception("Tester"); 15 | } 16 | 17 | Locale? loadSupportedLocals( 18 | Locale? locale, Iterable supportedLocales) => 19 | _localizationService.loadSupportedLocals(locale, supportedLocales); 20 | 21 | @override 22 | // TODO: implement reactiveServices 23 | List get reactiveServices => [_localizationService]; 24 | } 25 | -------------------------------------------------------------------------------- /lib/models/add_people_model.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | AddPeopleToChannel addPeopleToChannelFromJson(String str) => 4 | AddPeopleToChannel.fromJson(json.decode(str)); 5 | 6 | class AddPeopleToChannel { 7 | String? id; 8 | String? roleId; 9 | String? isAdmin; 10 | 11 | AddPeopleToChannel({ 12 | this.id, 13 | this.roleId, 14 | this.isAdmin, 15 | }); 16 | 17 | factory AddPeopleToChannel.fromJson(Map json) => 18 | AddPeopleToChannel( 19 | id: json["_id"], 20 | roleId: json["role_id"], 21 | isAdmin: json["is_admin"], 22 | ); 23 | } 24 | -------------------------------------------------------------------------------- /lib/models/api_response.dart: -------------------------------------------------------------------------------- 1 | class ApiResponse { 2 | final int? statusCode; 3 | final String? statusMessage; 4 | final dynamic data; 5 | 6 | ApiResponse({this.statusCode, this.statusMessage, this.data}); 7 | 8 | @override 9 | String toString() { 10 | return '$data'; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lib/models/channel_members.dart: -------------------------------------------------------------------------------- 1 | class ChannelMember { 2 | String name; 3 | bool isAdmin; 4 | ChannelMember({ 5 | required this.name, 6 | required this.isAdmin, 7 | }); 8 | 9 | factory ChannelMember.fromJson(Map json) { 10 | return ChannelMember(name: json['_id'], isAdmin: json['is_admin']); 11 | // archived: json['archived'], 12 | //private:json['private'] ); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/models/channel_model.dart: -------------------------------------------------------------------------------- 1 | class ChannelModel { 2 | String id; 3 | String name; 4 | // bool archived; 5 | // bool private; 6 | ChannelModel({ 7 | required this.id, 8 | //required this.archived, 9 | required this.name, 10 | //required this.private 11 | }); 12 | 13 | factory ChannelModel.fromJson(Map json) { 14 | return ChannelModel(id: json['_id'], name: json['name']); 15 | // archived: json['archived'], 16 | //private:json['private'] ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /lib/models/channels_search_model.dart: -------------------------------------------------------------------------------- 1 | class ChannelsSearch { 2 | String? id; 3 | String? slug; 4 | String? name; 5 | int? membersCount; 6 | bool? isPublic; 7 | 8 | // String? private; 9 | 10 | ChannelsSearch( 11 | {this.id, this.slug, this.name, this.isPublic, this.membersCount 12 | // this.private 13 | }); 14 | 15 | factory ChannelsSearch.fromJson(Map json) => ChannelsSearch( 16 | id: json["_id"], 17 | slug: json["slug"], 18 | name: json["name"], 19 | membersCount: json["members"], 20 | isPublic: !json["private"]); 21 | } 22 | -------------------------------------------------------------------------------- /lib/models/draft_data_holder_model.dart: -------------------------------------------------------------------------------- 1 | class DraftDataHolder { 2 | DraftDataHolder(this.text, this.subtitle, this.route, this.time); 3 | 4 | String text; 5 | String subtitle; 6 | Map route; 7 | String time; 8 | } 9 | -------------------------------------------------------------------------------- /lib/models/drafted_item_model.dart: -------------------------------------------------------------------------------- 1 | class DraftedItem { 2 | final String? username, message, time; 3 | 4 | DraftedItem({ 5 | this.username, 6 | this.message, 7 | this.time, 8 | }); 9 | } 10 | -------------------------------------------------------------------------------- /lib/models/media_model.dart: -------------------------------------------------------------------------------- 1 | class Media { 2 | final String path, url; 3 | 4 | Media({required this.path, required this.url}); 5 | } 6 | -------------------------------------------------------------------------------- /lib/models/message.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/utilities/constants/app_strings.dart'; 2 | import 'package:intl/intl.dart'; 3 | 4 | import 'user.dart'; 5 | 6 | class Message { 7 | int id; 8 | User sender; 9 | DateTime time; 10 | String message; 11 | 12 | Message({ 13 | required this.id, 14 | required this.sender, 15 | required this.message, 16 | required this.time, 17 | }); 18 | 19 | String getRelativeTime() { 20 | final now = DateTime.now(); 21 | final today = DateTime(now.year, now.month, now.day); 22 | final yesterday = DateTime(now.year, now.month, now.day - 1); 23 | 24 | final timeToCheck = DateTime( 25 | time.year, 26 | time.month, 27 | time.day, 28 | ); 29 | 30 | if (timeToCheck == today) { 31 | return Today; 32 | } else if (timeToCheck == yesterday) { 33 | return Yesterday; 34 | } else { 35 | return DateFormat.MMMd().format(time); 36 | } 37 | } 38 | 39 | static List responses() { 40 | return [Hello, Cool, Nice, Okay, Yeah, Nope]; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/models/message_model.dart: -------------------------------------------------------------------------------- 1 | class MessageModel { 2 | String message; 3 | List? media; 4 | 5 | MessageModel({required this.message, this.media}); 6 | 7 | Map toJson() => {"content": message, "media": media}; 8 | } 9 | -------------------------------------------------------------------------------- /lib/models/pinned_message_model.dart: -------------------------------------------------------------------------------- 1 | import "package:simple_moment/simple_moment.dart"; 2 | 3 | class PinnedMessage { 4 | String? displayName; 5 | String? channelId; 6 | String? content; 7 | String? moment; 8 | String? id; 9 | 10 | PinnedMessage( 11 | {this.displayName, this.channelId, this.content, this.moment, this.id}); 12 | 13 | Map toJson() => { 14 | 'display_name': displayName, 15 | 'channel_id': channelId, 16 | 'content': content, 17 | 'moment': moment, 18 | 'id': id, 19 | }; 20 | 21 | factory PinnedMessage.fromJson(Map json) => PinnedMessage( 22 | moment: Moment.now().from(DateTime.parse(json['timestamp'])), 23 | channelId: json['channel_id'], 24 | displayName: json['user_id'], 25 | content: json['content'], 26 | id: json['_id'], 27 | ); 28 | 29 | @override 30 | String toString() => content!; 31 | } 32 | -------------------------------------------------------------------------------- /lib/models/plugin_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class PluginModel { 4 | IconData icon; 5 | String name; 6 | String url; 7 | 8 | PluginModel({required this.icon, required this.name, required this.url}); 9 | } 10 | -------------------------------------------------------------------------------- /lib/models/profile_model.dart: -------------------------------------------------------------------------------- 1 | //The profile class of a user 2 | //You could include other properties too 3 | class ProfileModel { 4 | String? imageUrl; 5 | String? userId; 6 | String? firstName; 7 | String? lastName; 8 | String? displayName; 9 | String? email; 10 | String? status; 11 | String? bio; 12 | String? phoneNum; 13 | ProfileModel({ 14 | this.imageUrl, 15 | this.userId, 16 | this.firstName, 17 | this.lastName, 18 | this.displayName, 19 | this.email, 20 | this.status, 21 | this.bio, 22 | this.phoneNum, 23 | }); 24 | factory ProfileModel.fromJson(Map json) { 25 | return ProfileModel( 26 | firstName: json['first_name'], 27 | displayName: json['display_name'], 28 | status: json['bio'], 29 | imageUrl: json['image_url'], 30 | phoneNum: json['phone'], 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/models/saved_item_model.dart: -------------------------------------------------------------------------------- 1 | class SavedItemModel { 2 | final String? channelName; 3 | final String? userID; 4 | final String? displayName; 5 | final String? userImage; 6 | final String? timeStamp; 7 | final String? message; 8 | final String? channelId; 9 | 10 | SavedItemModel(this.channelName, this.userID, this.userImage, this.timeStamp, 11 | this.message, this.channelId, this.displayName); 12 | } 13 | -------------------------------------------------------------------------------- /lib/models/static_user_model.dart: -------------------------------------------------------------------------------- 1 | class StaticUserModel { 2 | String userName; 3 | String userimg; 4 | String time; 5 | String joinInfo; 6 | bool online; 7 | 8 | StaticUserModel({ 9 | required this.userName, 10 | required this.userimg, 11 | required this.joinInfo, 12 | required this.time, 13 | this.online = false, 14 | }); 15 | } 16 | -------------------------------------------------------------------------------- /lib/models/todo_model.dart: -------------------------------------------------------------------------------- 1 | import 'dart:convert'; 2 | 3 | class TodoModel { 4 | int userId; 5 | int id; 6 | String title; 7 | bool status; 8 | TodoModel({ 9 | required this.userId, 10 | required this.id, 11 | required this.title, 12 | required this.status, 13 | }); 14 | 15 | Map toMap() { 16 | return { 17 | 'userId': userId, 18 | 'id': id, 19 | 'title': title, 20 | 'status': status, 21 | }; 22 | } 23 | 24 | factory TodoModel.fromMap(Map map) { 25 | return TodoModel( 26 | userId: map['userId'], 27 | id: map['id'], 28 | title: map['title'], 29 | status: map['status'], 30 | ); 31 | } 32 | 33 | String toJson() => json.encode(toMap()); 34 | 35 | factory TodoModel.fromJson(String source) => 36 | TodoModel.fromMap(json.decode(source)); 37 | } 38 | -------------------------------------------------------------------------------- /lib/models/user.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/utilities/constants/app_strings.dart'; 2 | 3 | class User { 4 | String name; 5 | String username; 6 | String avatar = AvatarTwo; 7 | User(this.name, this.username); 8 | } 9 | -------------------------------------------------------------------------------- /lib/services/app_services/app_toast.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:fluttertoast/fluttertoast.dart'; 3 | 4 | class AppToast { 5 | AppToast._instance(); 6 | static AppToast instance = AppToast._instance(); 7 | 8 | //TODO change colors in this page to assigned theme 9 | //colors to be defined in style.dart file 10 | void success(title, body) { 11 | Fluttertoast.showToast( 12 | msg: title == null ? '$body' : '$title\n\n$body', 13 | backgroundColor: Colors.green, 14 | textColor: Colors.white, 15 | gravity: ToastGravity.BOTTOM, 16 | ); 17 | } 18 | 19 | void message(title, body) { 20 | Fluttertoast.showToast( 21 | msg: title == null ? '$body' : '$title\n\n$body', 22 | backgroundColor: Colors.grey[700], 23 | textColor: Colors.white, 24 | gravity: ToastGravity.BOTTOM, 25 | ); 26 | } 27 | 28 | void error(title, body) { 29 | Fluttertoast.showToast( 30 | msg: title == null ? '$body' : '$title\n\n$body', 31 | backgroundColor: Colors.red, 32 | textColor: Colors.white, 33 | gravity: ToastGravity.BOTTOM, 34 | ); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/services/app_services/deep_link_service.dart: -------------------------------------------------------------------------------- 1 | import 'dart:async'; 2 | 3 | import 'package:zurichat/utilities/utilities.dart'; 4 | import 'package:uni_links/uni_links.dart'; 5 | import 'package:flutter/services.dart' show PlatformException; 6 | 7 | class DeepLinkService { 8 | StreamController deepLinkController = StreamController.broadcast(); 9 | StreamSubscription? _sub; 10 | 11 | Future initUniLinks() async { 12 | // Platform messages may fail, so we use a try/catch PlatformException. 13 | try { 14 | final initialLink = await getInitialLink(); 15 | log.i(initialLink); 16 | 17 | //TODO: parse the uri here 18 | } on PlatformException { 19 | // Handle exception by warning the user their action did not succeed 20 | // return? 21 | } 22 | } 23 | 24 | listen() { 25 | // Attach a listener to the stream 26 | _sub = uriLinkStream.listen((Uri? uri) { 27 | if (uri != null) { 28 | deepLinkController.add('ADD the info herre'); 29 | } 30 | }, onError: (err) { 31 | // Handle exception by warning the user their action did not succeed 32 | }); 33 | } 34 | 35 | Stream get stream => uriLinkStream; 36 | 37 | stopListening() { 38 | _sub?.cancel(); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/services/in_review/status_service.dart: -------------------------------------------------------------------------------- 1 | import 'package:stacked/stacked.dart'; 2 | 3 | class StatusService with ReactiveServiceMixin { 4 | StatusService() { 5 | listenToReactiveValues([_statusText, _statusIcon]); 6 | } 7 | final _statusText = ReactiveValue('What\'s your status'); 8 | final _statusIcon = ReactiveValue('💬'); 9 | String get statusText => _statusText.value; 10 | String get statusIcon => _statusIcon.value; 11 | 12 | void updateStatusText(statusText) { 13 | _statusText.value = statusText; 14 | } 15 | 16 | void updateStatusIcon(statusIcon) { 17 | _statusIcon.value = statusIcon; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/ui/nav_pages/dm_page/dm_page_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/services/app_services/local_storage_services.dart'; 2 | 3 | import '../../../app/app.locator.dart'; 4 | import '../../../app/app.router.dart'; 5 | import 'package:stacked/stacked.dart'; 6 | import 'package:stacked_services/stacked_services.dart'; 7 | 8 | class DmPageViewModel extends FutureViewModel { 9 | final navigationService = locator(); 10 | final storageService = locator(); 11 | 12 | Future getActiveDMs() async { 13 | await Future.delayed(const Duration(seconds: 1)); 14 | return false; 15 | } 16 | 17 | goBack() => navigationService.back(); 18 | 19 | void navigateToDmUserView() { 20 | navigationService.navigateTo(Routes.dmUserView); 21 | } 22 | 23 | void navigateToDmScreen() { 24 | navigationService.navigateTo(Routes.dmScreen); 25 | } 26 | 27 | void navigateToJumpToScreen() { 28 | navigationService.navigateTo(Routes.jumpToView); 29 | } 30 | 31 | @override 32 | Future futureToRun() { 33 | return getActiveDMs(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/ui/nav_pages/home_page/home_item_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/app/app.logger.dart'; 2 | import 'package:zurichat/utilities/enums.dart'; 3 | 4 | class HomeItemModel { 5 | final log = getLogger('HomeItemModel'); 6 | int? unreadCount = 0; 7 | String? name; 8 | String? id; 9 | int? membersCount; 10 | bool public; 11 | 12 | HomeItemModel({ 13 | required HomeItemType type, 14 | this.id, 15 | this.name, 16 | this.unreadCount, 17 | this.membersCount, 18 | this.public = true, 19 | }) { 20 | _type = type; 21 | log.i('i'); 22 | } 23 | 24 | // static HomeItemModel fromMap(map) { 25 | // // return HomeItemModel(); 26 | // } 27 | 28 | HomeItemType _type = HomeItemType.channels; 29 | HomeItemType get type { 30 | if (true) { 31 | //Check the data to return the type 32 | } 33 | return _type; 34 | } 35 | 36 | set type(HomeItemType type) { 37 | _type = type; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /lib/ui/nav_pages/home_page/widgets/custom_channel_list_tile.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/utilities/constants/app_strings.dart'; 3 | import 'package:zurichat/ui/shared/dumb_widgets/unread_count.dart'; 4 | import 'package:zurichat/utilities/constants/text_styles.dart'; 5 | 6 | class CustomChannelListTile extends StatelessWidget { 7 | final String channelName; 8 | final Function()? pressed; 9 | final bool isActive; 10 | final String? data; 11 | 12 | const CustomChannelListTile({ 13 | Key? key, 14 | this.channelName = '', 15 | this.pressed, 16 | this.data, 17 | this.isActive = false, 18 | }) : super(key: key); 19 | 20 | @override 21 | Widget build(BuildContext context) { 22 | return Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ 23 | Text( 24 | '$hash $channelName', 25 | style: isActive 26 | ? AppTextStyle.darkGreySize12 27 | : AppTextStyle.darkGreySize12, 28 | ), 29 | isActive ? UnreadCount(count: int.parse(data!)) : Container() 30 | ]); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /lib/ui/nav_pages/home_page/widgets/custom_homepage_section_title.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import 'package:zurichat/utilities/constants/text_styles.dart'; 4 | 5 | class CustomHomePageSectionTitle extends StatelessWidget { 6 | final String? title; 7 | final void Function()? ontap; 8 | 9 | const CustomHomePageSectionTitle({ 10 | Key? key, 11 | this.title, 12 | this.ontap, 13 | }) : super(key: key); 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | return Row( 18 | mainAxisAlignment: MainAxisAlignment.spaceBetween, 19 | children: [ 20 | GestureDetector( 21 | onTap: ontap, 22 | child: Text( 23 | "$title", 24 | style: AppTextStyle.darkGreySize12, 25 | ), 26 | ), 27 | ], 28 | ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lib/ui/nav_pages/home_page/widgets/zuri_logo.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/utilities/constants/app_strings.dart'; 3 | 4 | import 'package:zurichat/utilities/constants/text_styles.dart'; 5 | 6 | import '../../../../utilities/constants/app_constants.dart'; 7 | 8 | class ZuriLogo extends StatelessWidget { 9 | const ZuriLogo({ 10 | Key? key, 11 | }) : super(key: key); 12 | 13 | @override 14 | Widget build(BuildContext context) { 15 | return Row( 16 | children: [ 17 | const Image( 18 | image: appBarLogo, 19 | fit: BoxFit.cover, 20 | height: 30, 21 | ), 22 | const SizedBox( 23 | width: 5, 24 | ), 25 | Text(zuri, style: AppTextStyle.zuriAppBarWordLogo), 26 | ], 27 | ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lib/ui/nav_pages/nav_bar/nav_bar_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:stacked/stacked.dart'; 2 | 3 | class NavBarViewModel extends IndexTrackingViewModel { 4 | static final NavBarViewModel instance = NavBarViewModel._internal(); 5 | 6 | factory NavBarViewModel() { 7 | return instance; 8 | } 9 | 10 | NavBarViewModel._internal(); 11 | 12 | init() {} 13 | } 14 | -------------------------------------------------------------------------------- /lib/ui/nav_pages/plugin_page/widgets/icons.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | List icons = [ 4 | Icons.task_alt_outlined, 5 | Icons.storefront_outlined, 6 | Icons.warning_amber_outlined, 7 | Icons.sports_score_outlined, 8 | Icons.headset, 9 | Icons.playlist_add_check 10 | ]; 11 | -------------------------------------------------------------------------------- /lib/ui/shared/bottom_sheets/custom_user_bottomsheet/widgets/custom_profile_tile.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../../../../utilities/constants/text_styles.dart'; 4 | 5 | class CustomProfileTile extends StatelessWidget { 6 | const CustomProfileTile( 7 | {Key? key, required this.title, required this.subtitle, this.onPressed}) 8 | : super(key: key); 9 | final String title; 10 | final String subtitle; 11 | final void Function()? onPressed; 12 | @override 13 | Widget build(BuildContext context) { 14 | final bool dark = Theme.of(context).brightness == Brightness.dark; 15 | 16 | return ListTile( 17 | visualDensity: const VisualDensity(horizontal: 0.0, vertical: 0), 18 | horizontalTitleGap: 0, 19 | dense: true, 20 | title: Padding( 21 | padding: const EdgeInsets.only(bottom: 3), 22 | child: Text( 23 | title, 24 | style: dark ? AppTextStyle.whiteSize16 : AppTextStyle.darkGreySize16, 25 | ), 26 | ), 27 | subtitle: Text( 28 | subtitle, 29 | style: dark ? AppTextStyle.whiteSize16 : AppTextStyle.darkGreySize16, 30 | ), 31 | onTap: onPressed, 32 | ); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/ui/shared/bottom_sheets/emoji_picker_bottomsheet/emoji_picker_bottomsheet_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:stacked/stacked.dart'; 2 | 3 | class EmojiPickerBottomSheetViewModel extends BaseViewModel {} 4 | -------------------------------------------------------------------------------- /lib/ui/shared/bottom_sheets/image_picker_bottomsheet/image_picker_bottomsheet_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/app/app.locator.dart'; 2 | import 'package:stacked/stacked.dart'; 3 | import 'package:stacked_services/stacked_services.dart'; 4 | 5 | class ImagePickerBottomSheetViewModel extends FutureViewModel { 6 | final _navigator = locator(); 7 | 8 | void dismissBottomSheet() => _navigator.back(); 9 | 10 | @override 11 | Future futureToRun() async { 12 | Future.delayed(const Duration(seconds: 2)); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /lib/ui/shared/bottom_sheets/profile_botton_sheet/widgets/custom_profile_tile.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/utilities/constants/text_styles.dart'; 3 | 4 | class CustomProfileTile extends StatelessWidget { 5 | const CustomProfileTile( 6 | {Key? key, required this.title, required this.subtitle, this.onPressed}) 7 | : super(key: key); 8 | final String title; 9 | final String subtitle; 10 | final void Function()? onPressed; 11 | @override 12 | Widget build(BuildContext context) { 13 | return ListTile( 14 | title: Text( 15 | title, 16 | style: AppTextStyle.darkGreySize16, 17 | ), 18 | subtitle: Text( 19 | subtitle, 20 | style: AppTextStyle.darkGreySize16, 21 | ), 22 | onTap: onPressed, 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/ui/shared/bottom_sheets/thread_options_bottomsheet/thread_option_bottomsheet_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:stacked/stacked.dart'; 2 | 3 | class ThreadOptionsBottomSheetViewModel extends BaseViewModel {} 4 | -------------------------------------------------------------------------------- /lib/ui/shared/bottom_sheets/thread_options_bottomsheet/widget/recent_emojis.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../../../../utilities/constants/colors.dart'; 4 | 5 | class RecentEmojis extends StatelessWidget { 6 | const RecentEmojis(this.text, {Key? key}) : super(key: key); 7 | final String text; 8 | @override 9 | Widget build(BuildContext context) { 10 | return Container( 11 | height: 50, 12 | width: 50, 13 | decoration: const BoxDecoration( 14 | shape: BoxShape.circle, 15 | color: AppColors.greyBackgroundColor, 16 | ), 17 | child: Align( 18 | alignment: Alignment.center, 19 | child: Text( 20 | text, 21 | style: const TextStyle(fontSize: 25), 22 | )), 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/ui/shared/dumb_widgets/channel_icon.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../../utilities/constants/colors.dart'; 4 | import '../../../utilities/enums.dart'; 5 | 6 | class ChannelIcon extends StatelessWidget { 7 | const ChannelIcon({required this.channelType, this.color, Key? key}) 8 | : super(key: key); 9 | 10 | final ChannelType channelType; 11 | final Color? color; 12 | @override 13 | Widget build(BuildContext context) { 14 | switch (channelType) { 15 | case ChannelType.private: 16 | return Icon( 17 | Icons.lock, 18 | size: 14, 19 | color: color, 20 | ); 21 | case ChannelType.public: 22 | return Icon( 23 | Icons.tag, 24 | size: 14, 25 | color: color, 26 | ); 27 | 28 | case ChannelType.personal: 29 | return Icon( 30 | Icons.circle, 31 | size: 14, 32 | color: color ?? AppColors.zuriPrimaryColor, 33 | ); 34 | 35 | default: 36 | return const Icon(null); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /lib/ui/shared/dumb_widgets/ripple.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | ///Adds ripple to the main widget 4 | ///Note: if a color is set to the child it won't work 5 | class Ripple extends StatelessWidget { 6 | final double radius; 7 | final Color? splashColor; 8 | final Function()? onTap; 9 | final Widget? child; 10 | 11 | const Ripple({ 12 | Key? key, 13 | this.radius = 5, 14 | this.splashColor, 15 | this.onTap, 16 | required this.child, 17 | }) : super(key: key); 18 | 19 | @override 20 | Widget build(BuildContext context) { 21 | return Material( 22 | type: MaterialType.transparency, 23 | child: InkWell( 24 | onTap: () async { 25 | await Future.delayed(const Duration(milliseconds: 200)); 26 | final func = onTap ?? () {}; 27 | func(); 28 | }, 29 | borderRadius: BorderRadius.circular(radius), 30 | splashColor: splashColor ?? Colors.grey[300], 31 | child: child ?? Container(), 32 | ), 33 | ); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/ui/shared/dumb_widgets/unread_count.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/utilities/constants/colors.dart'; 3 | import 'package:zurichat/utilities/constants/text_styles.dart'; 4 | 5 | class UnreadCount extends StatelessWidget { 6 | final int count; 7 | const UnreadCount({Key? key, required this.count}) : super(key: key); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return Container( 12 | height: 24, 13 | width: 24, 14 | decoration: BoxDecoration( 15 | borderRadius: BorderRadius.circular(4), 16 | color: AppColors.unreadMessageColor, 17 | ), 18 | child: Center( 19 | child: Text( 20 | count.toString(), 21 | style: AppTextStyle.whiteSize12, 22 | ), 23 | ), 24 | ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/ui/shared/shared.dart: -------------------------------------------------------------------------------- 1 | export 'package:zurichat/utilities/constants/colors.dart'; 2 | export 'package:zurichat/utilities/constants/app_constants.dart'; 3 | export 'package:zurichat/utilities/constants/ui_helpers.dart'; 4 | -------------------------------------------------------------------------------- /lib/ui/shared/smart_widgets/text_parser/text_parser_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_parsed_text/flutter_parsed_text.dart'; 3 | import 'package:zurichat/utilities/constants/text_styles.dart'; 4 | import 'package:stacked/stacked.dart'; 5 | 6 | import 'text_parser_viewmodel.dart'; 7 | 8 | class TextParser extends StatelessWidget { 9 | const TextParser(this.text, {Key? key}) : super(key: key); 10 | final String? text; 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return ViewModelBuilder.reactive( 15 | builder: (context, model, child) => ParsedText( 16 | text: "$text", 17 | style: AppTextStyle.lightGreySize14.copyWith( 18 | color: Theme.of(context).textTheme.bodyText1!.color, 19 | ), 20 | parse: model.parse, 21 | ), 22 | viewModelBuilder: () => TextParserViewModel(), 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/ui/shared/smart_widgets/thread_card/widgets/audio_message.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/models/user_post.dart'; 3 | 4 | class AudioMessage extends StatelessWidget { 5 | const AudioMessage({Key? key, required this.postAudioFiles}) 6 | : super(key: key); 7 | final List? postAudioFiles; 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return Container( 12 | padding: const EdgeInsets.only(top: 10), 13 | ); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /lib/ui/shared/smart_widgets/thread_card/widgets/media_files.dart: -------------------------------------------------------------------------------- 1 | import 'package:cached_network_image/cached_network_image.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:zurichat/models/user_post.dart'; 4 | 5 | class MediaFiles extends StatelessWidget { 6 | const MediaFiles({Key? key, required this.postMediaFiles}) : super(key: key); 7 | final List? postMediaFiles; 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return Padding( 12 | padding: const EdgeInsets.only(top: 10), 13 | child: Wrap( 14 | spacing: 5, 15 | runSpacing: 5, 16 | children: [ 17 | for (PostFiles postMediaFile in postMediaFiles!) 18 | InkWell( 19 | onTap: () {}, 20 | child: CachedNetworkImage(imageUrl: "${postMediaFile.srcLink}")) 21 | ], 22 | ), 23 | ); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /lib/ui/view/add_people/add_people_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:stacked/stacked.dart'; 2 | import 'package:stacked_services/stacked_services.dart'; 3 | 4 | import '../../../app/app.locator.dart'; 5 | 6 | class AddPeopleViewModel extends BaseViewModel { 7 | final navigator = locator(); 8 | 9 | void goBack() { 10 | navigator.back(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /lib/ui/view/all_threads_view/all_thread_view.dart: -------------------------------------------------------------------------------- 1 | // import 'package:flutter/material.dart'; 2 | -------------------------------------------------------------------------------- /lib/ui/view/all_threads_view/all_thread_viewmodel.dart: -------------------------------------------------------------------------------- 1 | // import 'package:flutter/material.dart'; 2 | -------------------------------------------------------------------------------- /lib/ui/view/channel/channel_info/widgets/custom_app_bar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_screenutil/flutter_screenutil.dart'; 3 | import 'package:zurichat/utilities/constants/app_strings.dart'; 4 | import 'package:zurichat/utilities/constants/colors.dart'; 5 | 6 | import 'package:zurichat/utilities/constants/text_styles.dart'; 7 | 8 | Widget customAppBar(model) { 9 | return AppBar( 10 | leading: IconButton( 11 | icon: Icon( 12 | Icons.clear, 13 | size: 24.sp, 14 | ), 15 | onPressed: () => model.navigateBack(), 16 | ), 17 | actions: [ 18 | Icon( 19 | Icons.star, 20 | color: AppColors.zuriPrimaryColor, 21 | size: 24.sp, 22 | ) 23 | ], 24 | backgroundColor: Colors.white, 25 | title: Text( 26 | ChannelInfo, 27 | style: AppTextStyle.darkGreySize16Bold, 28 | ), 29 | ); 30 | } 31 | -------------------------------------------------------------------------------- /lib/ui/view/channel/channel_info/widgets/edit_button.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:flutter/material.dart'; 3 | import 'package:zurichat/utilities/constants/app_strings.dart'; 4 | import 'package:zurichat/utilities/constants/text_styles.dart'; 5 | 6 | import '../channel_info_view_model.dart'; 7 | 8 | class EditButton extends StatelessWidget { 9 | final ChannelInfoViewModel model; 10 | const EditButton({Key? key, required this.model}) : super(key: key); 11 | 12 | @override 13 | Widget build(BuildContext context) { 14 | return Container( 15 | //height: 48, 16 | width: MediaQuery.of(context).size.width, 17 | alignment: Alignment.center, 18 | //margin: const EdgeInsets.only(right: 5, left: 5, bottom: 15), 19 | /*decoration: BoxDecoration( 20 | borderRadius: BorderRadius.circular(2), 21 | border: Border.all(width: 1.0, color: AppColors.borderColor)),*/ 22 | child: Padding( 23 | padding: const EdgeInsets.all(16.0), 24 | child: Text( 25 | Edit, 26 | style: AppTextStyle.darkGreySize16Bold, 27 | ), 28 | ), 29 | ); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/ui/view/channel/channel_info/widgets/fourth_section.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_screenutil/flutter_screenutil.dart'; 3 | import 'package:zurichat/utilities/constants/app_strings.dart'; 4 | import 'package:zurichat/ui/view/channel/channel_info/channel_info_view_model.dart'; 5 | import 'new_row_tile.dart'; 6 | 7 | class FourthSection extends StatelessWidget { 8 | const FourthSection(this.model, {Key? key}) : super(key: key); 9 | final ChannelInfoViewModel model; 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return InkWell( 14 | onTap: model.navigateToPinnedMessages, 15 | child: Card( 16 | elevation: 2, 17 | child: Container( 18 | height: 53.h, 19 | width: double.infinity, 20 | alignment: Alignment.center, 21 | padding: EdgeInsets.fromLTRB(18.w, 16.h, 0, 16), 22 | decoration: BoxDecoration( 23 | borderRadius: BorderRadius.circular(6.r), 24 | ), 25 | child: const NewRowTile( 26 | icon: Icons.push_pin_outlined, text: PinnedMessages)), 27 | ), 28 | ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lib/ui/view/channel/channel_info/widgets/new_row_tile.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_screenutil/flutter_screenutil.dart'; 3 | 4 | import 'package:zurichat/utilities/constants/text_styles.dart'; 5 | 6 | class NewRowTile extends StatelessWidget { 7 | const NewRowTile({ 8 | Key? key, 9 | this.icon, 10 | this.text, 11 | }) : super(key: key); 12 | 13 | final IconData? icon; 14 | final String? text; 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | return Row( 19 | children: [ 20 | Icon( 21 | icon, 22 | color: Theme.of(context).textTheme.bodyText1!.color, 23 | size: 24.sp, 24 | ), 25 | SizedBox(width: 24.23.w), 26 | Text( 27 | "$text", 28 | style: AppTextStyle.darkGreySize14Bold.copyWith( 29 | color: Theme.of(context).textTheme.bodyText1!.color, 30 | ), 31 | ), 32 | ], 33 | ); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/ui/view/channel/channel_notification/channel_notification_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/utilities/constants/app_strings.dart'; 2 | import 'package:stacked/stacked.dart'; 3 | 4 | class ChannelNotificationViewModel extends BaseViewModel { 5 | String? value = New; 6 | 7 | void toggleOptions(String? val) { 8 | value = val; 9 | notifyListeners(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/ui/view/channel/channel_search/channel_search_view_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:stacked/stacked.dart'; 2 | 3 | class ChannelSearchViewModel extends BaseViewModel {} 4 | -------------------------------------------------------------------------------- /lib/ui/view/channel/channel_search/widgets/app_bar_main.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/utilities/constants/app_strings.dart'; 3 | 4 | import 'textfield_style.dart'; 5 | 6 | Widget appBarMain() { 7 | return AppBar( 8 | actions: [ 9 | GestureDetector( 10 | onTap: () {}, 11 | child: Padding( 12 | padding: const EdgeInsets.symmetric(horizontal: 35.0, vertical: 19), 13 | child: Text( 14 | Done, 15 | style: greenTextStyle(), 16 | ), 17 | ), 18 | ) 19 | ], 20 | backgroundColor: Colors.white, 21 | title: Text( 22 | TeamSocrates, 23 | style: headerStyle(), 24 | ), 25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /lib/ui/view/channel/channel_search/widgets/textfield_style.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:google_fonts/google_fonts.dart'; 3 | import 'package:zurichat/utilities/constants/colors.dart'; 4 | 5 | InputDecoration textFormFields(String hintText) { 6 | return InputDecoration( 7 | hintText: hintText, 8 | hintStyle: GoogleFonts.lato( 9 | fontSize: 14, 10 | color: const Color( 11 | 0xFFA1A9B3, 12 | )), 13 | focusedBorder: const OutlineInputBorder( 14 | borderSide: BorderSide(color: Color(0xFF7B8794)), 15 | ), 16 | enabledBorder: const OutlineInputBorder( 17 | borderSide: BorderSide(color: Color(0xFF7B8794)), 18 | )); 19 | } 20 | 21 | TextStyle headerStyle() { 22 | return GoogleFonts.lato( 23 | fontSize: 20, fontWeight: FontWeight.w800, color: Colors.black); 24 | } 25 | 26 | TextStyle nameStyle() { 27 | return GoogleFonts.lato( 28 | fontSize: 16, fontWeight: FontWeight.w600, color: AppColors.blackColor); 29 | } 30 | 31 | TextStyle greenTextStyle() { 32 | return GoogleFonts.lato( 33 | fontSize: 16, 34 | fontWeight: FontWeight.w800, 35 | color: AppColors.zuriPrimaryColor, 36 | ); 37 | } 38 | -------------------------------------------------------------------------------- /lib/ui/view/channel/channel_view/widgets/message_tile.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/utilities/constants/colors.dart'; 3 | 4 | import 'package:zurichat/utilities/constants/text_styles.dart'; 5 | 6 | class MessageTile extends StatelessWidget { 7 | final String message, avatar, name, time; 8 | 9 | const MessageTile( 10 | {required this.message, 11 | required this.avatar, 12 | required this.name, 13 | required this.time, 14 | Key? key}) 15 | : super(key: key); 16 | 17 | @override 18 | Widget build(BuildContext context) => ListTile( 19 | leading: Image.asset(avatar), 20 | subtitle: Text(message), 21 | title: Row( 22 | children: [ 23 | Text( 24 | name, 25 | //TODO use App TextStyle 26 | style: const TextStyle( 27 | fontWeight: FontWeight.w700, 28 | color: AppColors.deepBlackColor, 29 | ), 30 | ), 31 | const SizedBox(width: 10), 32 | Text( 33 | time, 34 | style: AppTextStyle.lightGreySize12, 35 | ), 36 | ], 37 | ), 38 | ); 39 | } 40 | -------------------------------------------------------------------------------- /lib/ui/view/channel/edit_channel/widgets/edit_channel_headers.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/cupertino.dart'; 2 | import 'package:zurichat/utilities/constants/colors.dart'; 3 | 4 | import 'package:zurichat/utilities/constants/text_styles.dart'; 5 | 6 | class TextHeader extends StatelessWidget { 7 | final String headerText; 8 | const TextHeader({ 9 | Key? key, 10 | required this.headerText, 11 | }) : super(key: key); 12 | @override 13 | Widget build(BuildContext context) { 14 | return Container( 15 | width: double.infinity, 16 | color: AppColors.zuriBGLightgrey, 17 | height: 48, 18 | child: Padding( 19 | padding: const EdgeInsets.only(left: 25.0), 20 | child: Align( 21 | alignment: Alignment.centerLeft, 22 | child: Text( 23 | headerText, 24 | style: AppTextStyle.darkGreySize14, 25 | ), 26 | ), 27 | ), 28 | ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /lib/ui/view/channel/edit_channel/widgets/edit_channel_text_field.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/utilities/constants/colors.dart'; 3 | 4 | class TextBox extends StatelessWidget { 5 | final String hint; 6 | final TextEditingController controller; 7 | final Function(String)? onChanged; 8 | 9 | const TextBox({ 10 | Key? key, 11 | required this.hint, 12 | required this.controller, 13 | required this.onChanged, 14 | }) : super(key: key); 15 | @override 16 | Widget build(BuildContext context) { 17 | return SizedBox( 18 | height: 192, 19 | child: TextField( 20 | //maxLines: 9, 21 | controller: controller, 22 | onChanged: onChanged, 23 | decoration: InputDecoration( 24 | border: InputBorder.none, 25 | hintText: hint, 26 | hintStyle: const TextStyle(color: AppColors.zuriDarkGrey), 27 | contentPadding: const EdgeInsets.fromLTRB(25.0, 16.0, 25.0, 16.0), 28 | fillColor: Colors.white, 29 | filled: true, 30 | ), 31 | ), 32 | ); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /lib/ui/view/channel/pinned_messages/pinned_messages_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/app/app.locator.dart'; 2 | import 'package:zurichat/models/pinned_message_model.dart'; 3 | import 'package:zurichat/services/messaging_services/channels_api_service.dart'; 4 | import 'package:zurichat/services/app_services/local_storage_services.dart'; 5 | import 'package:zurichat/utilities/constants/storage_keys.dart'; 6 | import 'package:stacked/stacked.dart'; 7 | import 'package:stacked_services/stacked_services.dart'; 8 | 9 | class PinnedMessagesViewModel extends BaseViewModel { 10 | final _storageService = locator(); 11 | final _channelsApiService = locator(); 12 | final _navigationService = locator(); 13 | 14 | String? get channelId => 15 | _storageService.getString(StorageKeys.currentChannelId); 16 | 17 | late List pinnedMessages = []; 18 | 19 | void navigateBack() => _navigationService.back(); 20 | 21 | void fetchPinnedMessages() async { 22 | setBusy(true); 23 | 24 | pinnedMessages = [ 25 | ...(await _channelsApiService.getChannelPinnedMessages(channelId!)) 26 | .reversed 27 | ]; 28 | 29 | setBusy(false); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/ui/view/channel/share_message/widgets/share_message_textfield.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/utilities/constants/colors.dart'; 3 | import 'package:zurichat/utilities/constants/text_styles.dart'; 4 | 5 | class ShareMessageTextField extends StatelessWidget { 6 | final TextEditingController controller; 7 | final ValueChanged? onChanged; 8 | final String? hintText; 9 | 10 | const ShareMessageTextField( 11 | {Key? key, 12 | required this.controller, 13 | required this.onChanged, 14 | this.hintText}) 15 | : super(key: key); 16 | 17 | @override 18 | Widget build(BuildContext context) { 19 | return TextField( 20 | onChanged: onChanged, 21 | controller: controller, 22 | decoration: InputDecoration( 23 | labelText: '', 24 | floatingLabelBehavior: FloatingLabelBehavior.always, 25 | focusedBorder: const UnderlineInputBorder( 26 | borderSide: BorderSide(color: AppColors.zuriPrimaryColor)), 27 | enabledBorder: const UnderlineInputBorder( 28 | borderSide: BorderSide(color: AppColors.dividerColor)), 29 | hintText: hintText, 30 | hintStyle: AppTextStyle.lightGreySize16), 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/ui/view/channel/shared_widgets.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:google_fonts/google_fonts.dart'; 3 | 4 | class SearchField extends StatelessWidget { 5 | final ValueChanged? onChanged; 6 | final String? labelText; 7 | 8 | static const OUTLINE = OutlineInputBorder( 9 | borderSide: BorderSide( 10 | color: Color(0xFF7B8794), 11 | width: 0.2, 12 | ), 13 | ); 14 | 15 | const SearchField({this.onChanged, this.labelText, Key? key}) 16 | : super(key: key); 17 | 18 | @override 19 | Widget build(BuildContext context) => TextField( 20 | cursorColor: const Color(0xFF7B8794), 21 | decoration: InputDecoration( 22 | labelStyle: GoogleFonts.lato(color: const Color(0xFF727272)), 23 | contentPadding: const EdgeInsets.fromLTRB(12.0, 16.0, 12.0, 16.0), 24 | alignLabelWithHint: true, 25 | enabledBorder: OUTLINE, 26 | focusedBorder: OUTLINE, 27 | labelText: labelText, 28 | border: OUTLINE, 29 | ), 30 | onChanged: onChanged, 31 | style: GoogleFonts.lato( 32 | color: const Color(0xFF7B8794), 33 | fontSize: 16.0, 34 | ), 35 | ); 36 | } 37 | -------------------------------------------------------------------------------- /lib/ui/view/clear_after/clear_after_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/app/app.locator.dart'; 3 | import 'package:zurichat/utilities/constants/app_strings.dart'; 4 | import 'package:stacked/stacked.dart'; 5 | import 'package:stacked_services/stacked_services.dart'; 6 | 7 | class ClearAfterViewModel extends BaseViewModel { 8 | final _navigationService = locator(); 9 | DateTime selectedDate = DateTime.now(); 10 | TimeOfDay selectedTime = TimeOfDay.now(); 11 | bool lastIndex = false; 12 | 13 | List clearAfterTimes = [ 14 | DontClear, 15 | ThirtyMins, 16 | OneHour, 17 | FourHours, 18 | Today, 19 | ThisWeek, 20 | ChooseDate, 21 | ClearAfter, 22 | ]; 23 | int? currentValue = 0; 24 | 25 | void exitPage() { 26 | _navigationService.back(); 27 | } 28 | 29 | void changeTime(int? value) { 30 | currentValue = value; 31 | currentValue == clearAfterTimes.length - 1 32 | ? lastIndex = true 33 | : lastIndex = false; 34 | notifyListeners(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /lib/ui/view/clear_notification/clear_notification_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/app/app.locator.dart'; 2 | import 'package:stacked/stacked.dart'; 3 | import 'package:stacked_services/stacked_services.dart'; 4 | 5 | class ClearNotificationViewModel extends BaseViewModel { 6 | final _navigationService = locator(); 7 | 8 | navigateBack() { 9 | _navigationService.back(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/ui/view/create_channel_view/create_channel_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/app/app.locator.dart'; 2 | import 'package:stacked/stacked.dart'; 3 | import 'package:stacked_services/stacked_services.dart'; 4 | 5 | class CreateChannelViewModel extends BaseViewModel { 6 | final _navigationService = locator(); 7 | 8 | navigateBack() { 9 | _navigationService.back(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /lib/ui/view/create_channel_view/widgets/custom_text_field.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/utilities/constants/colors.dart'; 3 | 4 | class CustomTextField extends StatelessWidget { 5 | const CustomTextField({Key? key}) : super(key: key); 6 | @override 7 | Widget build(BuildContext context) { 8 | return TextFormField( 9 | decoration: const InputDecoration( 10 | enabledBorder: UnderlineInputBorder( 11 | borderSide: BorderSide(color: AppColors.greyishColor, width: 0.5), 12 | ), 13 | focusedBorder: UnderlineInputBorder( 14 | borderSide: BorderSide(color: AppColors.greyishColor, width: 1), 15 | ), 16 | ), 17 | ); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /lib/ui/view/create_channel_view/widgets/custom_text_widget.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../../../utilities/constants/colors.dart'; 4 | 5 | class CustomTextWidget extends StatelessWidget { 6 | final String text; 7 | final double fontSize; 8 | final FontWeight fontWeight; 9 | final Color color; 10 | final double? padding; 11 | final TextDecoration decoration; 12 | 13 | const CustomTextWidget( 14 | {Key? key, 15 | this.text = '', 16 | this.fontSize = 16.0, 17 | this.fontWeight = FontWeight.normal, 18 | this.color = AppColors.deepBlackColor, 19 | this.padding, 20 | this.decoration = TextDecoration.none}) 21 | : super(key: key); 22 | 23 | @override 24 | Widget build(BuildContext context) { 25 | return Padding( 26 | padding: EdgeInsets.symmetric(horizontal: padding ?? 0), 27 | child: Text( 28 | text, 29 | style: TextStyle( 30 | fontSize: fontSize, 31 | fontWeight: fontWeight, 32 | color: color, 33 | decoration: decoration), 34 | ), 35 | ); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /lib/ui/view/direct_message/direct_message_text_field_hook.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:flutter_hooks/flutter_hooks.dart'; 3 | import 'package:zurichat/utilities/constants/app_strings.dart'; 4 | import 'package:stacked_hooks/stacked_hooks.dart'; 5 | 6 | import 'direct_message_viewmodel.dart'; 7 | 8 | class TextFieldHook extends HookViewModelWidget { 9 | const TextFieldHook({Key? key}) : super(key: key, reactive: true); 10 | 11 | @override 12 | Widget buildViewModelWidget( 13 | BuildContext context, DirectMessageViewModel viewModel) { 14 | var controller = useTextEditingController(); 15 | return TextField( 16 | controller: controller, 17 | decoration: const InputDecoration( 18 | hintText: WriteMsgHint, 19 | hintStyle: TextStyle(color: Colors.black54), 20 | ), 21 | onEditingComplete: () => controller.clearComposing(), 22 | ); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/ui/view/direct_message/direct_message_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/app/app.locator.dart'; 2 | import 'package:stacked/stacked.dart'; 3 | import 'package:stacked_services/stacked_services.dart'; 4 | 5 | class DirectMessageViewModel extends FormViewModel { 6 | final _navigationService = locator(); 7 | 8 | navigateBack() { 9 | _navigationService.back(); 10 | } 11 | 12 | @override 13 | void setFormStatus() { 14 | // TODO: implement setFormStatus 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/ui/view/dm_search/dm_search_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/app/app.locator.dart'; 2 | import 'package:stacked/stacked.dart'; 3 | import 'package:stacked_services/stacked_services.dart'; 4 | 5 | class DmSearchViewModel extends IndexTrackingViewModel { 6 | static final DmSearchViewModel instance = DmSearchViewModel._internal(); 7 | final _navigationService = locator(); 8 | 9 | factory DmSearchViewModel() { 10 | return instance; 11 | } 12 | 13 | navigateBack() { 14 | _navigationService.back(); 15 | } 16 | 17 | DmSearchViewModel._internal(); 18 | 19 | init() {} 20 | } 21 | -------------------------------------------------------------------------------- /lib/ui/view/dm_user/icons/zap_icon.dart: -------------------------------------------------------------------------------- 1 | /// Flutter icons MyFlutterApp 2 | /// Copyright (C) 2021 by original authors @ fluttericon.com, fontello.com 3 | /// This font was generated by FlutterIcon.com, which is derived from Fontello. 4 | /// 5 | /// To use this font, place it in your fonts/ directory and include the 6 | /// following in your pubspec.yaml 7 | /// 8 | /// flutter: 9 | /// fonts: 10 | /// - family: MyFlutterApp 11 | /// fonts: 12 | /// - asset: fonts/MyFlutterApp.ttf 13 | /// 14 | /// 15 | /// 16 | import 'package:flutter/widgets.dart'; 17 | 18 | class AppIcons { 19 | AppIcons._(); 20 | 21 | static const _kFontFam = 'ZapIcon'; 22 | static const String? _kFontPkg = null; 23 | 24 | static const IconData shapezap = 25 | IconData(0xe800, fontFamily: _kFontFam, fontPackage: _kFontPkg); 26 | } 27 | -------------------------------------------------------------------------------- /lib/ui/view/dm_user/widgets/custom_start_message.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/utilities/constants/app_strings.dart'; 3 | import 'package:zurichat/utilities/constants/colors.dart'; 4 | 5 | class StartMessage extends StatelessWidget { 6 | final String? userName; 7 | 8 | const StartMessage( 9 | String username, { 10 | Key? key, 11 | //TODO assign to app_strings.dart 12 | this.userName = 'OyinkanUA', 13 | }) : super(key: key); 14 | 15 | @override 16 | Widget build(BuildContext context) { 17 | return RichText( 18 | text: TextSpan( 19 | text: CustomStartMsg1, 20 | style: const TextStyle( 21 | color: Color(0xFF808080), 22 | fontSize: 13.0, 23 | fontWeight: FontWeight.w400, 24 | ), 25 | children: [ 26 | TextSpan( 27 | text: '$userName. ', 28 | style: const TextStyle(color: AppColors.zuriPrimaryColor), 29 | ), 30 | const TextSpan( 31 | text: CustomStartMsgTwo, 32 | ) 33 | ], 34 | ), 35 | ); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /lib/ui/view/dm_user/widgets/online_indicator.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/utilities/constants/colors.dart'; 3 | 4 | class OnlineIndicator extends StatelessWidget { 5 | const OnlineIndicator(int i, {Key? key}) : super(key: key); 6 | @override 7 | Widget build(BuildContext context) { 8 | return const Padding( 9 | padding: EdgeInsets.all(5.0), 10 | child: Icon( 11 | Icons.circle, 12 | color: AppColors.zuriPrimaryColor, 13 | size: 8, 14 | ), 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/ui/view/do_not_disturb/do_not_disturb_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/utilities/constants/app_strings.dart'; 2 | import 'package:stacked/stacked.dart'; 3 | import 'package:stacked_services/stacked_services.dart'; 4 | 5 | import '../../../app/app.locator.dart'; 6 | 7 | class DoNotDisturbViewModel extends BaseViewModel { 8 | final _navigationService = locator(); 9 | List doNotDisturbTimes = [ 10 | ThirtyMins, 11 | OneHour, 12 | TwoHours, 13 | UntilTomorrow, 14 | Custom, 15 | ]; 16 | int? currentValue = 0; 17 | 18 | void exitPage() { 19 | _navigationService.back(); 20 | } 21 | 22 | void changeTime(int? value) { 23 | currentValue = value; 24 | notifyListeners(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /lib/ui/view/draft/app/data.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/models/drafted_item_model.dart'; 2 | import 'package:zurichat/utilities/constants/app_strings.dart'; 3 | 4 | double mySize = 0.0; 5 | double kPadding = mySize * 0.025; 6 | 7 | List draftedList = [ 8 | DraftedItem( 9 | username: OyinkanUA, 10 | message: Okay, 11 | time: SampleDate, 12 | ), 13 | DraftedItem( 14 | username: AbdSalam, 15 | message: NoWahala, 16 | time: SampleDate, 17 | ), 18 | DraftedItem( 19 | username: TeamSocrates, 20 | message: Cool, 21 | time: SampleDate, 22 | ), 23 | ]; 24 | -------------------------------------------------------------------------------- /lib/ui/view/drafted_messages_page/drafted_message_page_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/app/app.locator.dart'; 2 | import 'package:stacked/stacked.dart'; 3 | import 'package:stacked_services/stacked_services.dart'; 4 | 5 | class DraftedMessagePageModel extends BaseViewModel { 6 | //String _title = 'Home View'; 7 | //String get title => _title; 8 | final _navigationService = locator(); 9 | 10 | navigateBack() { 11 | _navigationService.back(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/ui/view/drafted_messages_page/widgets/app/data.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/models/drafted_item_model.dart'; 2 | import 'package:zurichat/utilities/constants/app_strings.dart'; 3 | 4 | double mySize = 0.0; 5 | double kPadding = mySize * 0.025; 6 | 7 | List draftedList = [ 8 | DraftedItem( 9 | username: OyinkanUA, 10 | message: Okay, 11 | time: SampleDate, 12 | ), 13 | DraftedItem( 14 | username: AbdSalam, 15 | message: Okay, 16 | time: SampleDate, 17 | ), 18 | DraftedItem( 19 | username: Quwaysim, 20 | message: NoWahala, 21 | time: SampleDate, 22 | ), 23 | ]; 24 | -------------------------------------------------------------------------------- /lib/ui/view/expandable_textfield/widget/user_mentions.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/utilities/constants/text_styles.dart'; 3 | import 'package:zurichat/utilities/extensions/string_extension.dart'; 4 | 5 | class UserMentions extends StatelessWidget { 6 | final String membersList; 7 | final String name; 8 | const UserMentions({Key? key, required this.membersList, required this.name}) 9 | : super(key: key); 10 | 11 | @override 12 | Widget build(BuildContext context) { 13 | return Padding( 14 | padding: const EdgeInsets.all(8.0), 15 | child: Row( 16 | children: [ 17 | Image.asset( 18 | 'assets/images/chimamanda.png', 19 | ), 20 | const SizedBox(width: 16.0), 21 | Text(membersList.capitalize(), 22 | style: AppTextStyle.darkGreySize16Bold), 23 | const SizedBox(width: 16.0), 24 | Align( 25 | alignment: name == '-' ? Alignment.center : Alignment.centerLeft, 26 | child: Text(name, style: AppTextStyle.lightGreySize16)) 27 | ], 28 | ), 29 | ); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/ui/view/file_search/file_search_viewmodel.dart: -------------------------------------------------------------------------------- 1 | // ignore_for_file: unused_import 2 | 3 | import 'package:flutter/material.dart'; 4 | import 'package:stacked/stacked.dart'; 5 | 6 | class FileSearchViewModel extends BaseViewModel {} 7 | -------------------------------------------------------------------------------- /lib/ui/view/file_search/widgets/file_tile.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../../shared/shared.dart'; 4 | 5 | // File List Tile 6 | class CustomFileListTile extends StatelessWidget { 7 | final String? imagelink; 8 | final String? fileName; 9 | final String? subtitle; 10 | const CustomFileListTile({ 11 | Key? key, 12 | this.imagelink, 13 | this.fileName, 14 | this.subtitle, 15 | }) : super(key: key); 16 | 17 | @override 18 | Widget build(BuildContext context) { 19 | return ListTile( 20 | leading: Image.asset("$imagelink"), 21 | title: Text( 22 | "$fileName", 23 | style: const TextStyle( 24 | fontWeight: FontWeight.w500, 25 | color: AppColors.blackColor, 26 | fontSize: 14, 27 | ), 28 | ), 29 | subtitle: Text( 30 | "$subtitle", 31 | style: const TextStyle( 32 | fontWeight: FontWeight.w400, 33 | color: AppColors.greyColor, 34 | fontSize: 12, 35 | ), 36 | ), 37 | ); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /lib/ui/view/file_search/widgets/tab_bar.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/utilities/constants/text_styles.dart'; 3 | 4 | import '../../../shared/shared.dart'; 5 | 6 | // tab bar 7 | class CustomTabBar extends StatelessWidget { 8 | final String? tab1; 9 | final String? tab2; 10 | const CustomTabBar({ 11 | Key? key, 12 | this.tab1, 13 | this.tab2, 14 | }) : super(key: key); 15 | 16 | @override 17 | Widget build(BuildContext context) { 18 | return Container( 19 | color: AppColors.whiteColor, 20 | padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 5), 21 | child: DefaultTabController( 22 | length: 2, 23 | child: TabBar( 24 | indicatorColor: AppColors.zuriPrimaryColor, 25 | tabs: [ 26 | Tab(child: Text("$tab1", style: AppTextStyle.darkGreySize16)), 27 | Tab(child: Text("$tab2", style: AppTextStyle.darkGreySize16)), 28 | ], 29 | ), 30 | ), 31 | ); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/ui/view/notifications/notifications_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/app/app.locator.dart'; 2 | import 'package:stacked/stacked.dart'; 3 | import 'package:stacked_services/stacked_services.dart'; 4 | 5 | class NotificationsViewModel extends BaseViewModel { 6 | final _navigationService = locator(); 7 | bool vibrate = true; 8 | bool light = true; 9 | bool inAppNotification = true; 10 | bool notifyOnKeyword = true; 11 | 12 | goBack() => _navigationService.back(); 13 | 14 | void toggleVibrate(bool value) { 15 | vibrate = value; 16 | notifyListeners(); 17 | } 18 | 19 | void toggleLight(bool value) { 20 | light = value; 21 | notifyListeners(); 22 | } 23 | 24 | void toggleInAppNotification(bool value) { 25 | inAppNotification = value; 26 | notifyListeners(); 27 | } 28 | 29 | void toggleNotifyOnKeyword(bool value) { 30 | notifyOnKeyword = value; 31 | notifyListeners(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /lib/ui/view/onboarding/onboarding_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:stacked/stacked.dart'; 3 | import 'package:stacked_services/stacked_services.dart'; 4 | 5 | import '../../../app/app.locator.dart'; 6 | import '../../../app/app.router.dart'; 7 | 8 | class OnboardingViewModel extends BaseViewModel { 9 | final navigator = locator(); 10 | int currentIndex = 0; 11 | 12 | navigateToNext() { 13 | navigator.navigateTo(Routes.signUpView); 14 | } 15 | 16 | final PageController? controller = PageController(); 17 | 18 | void animateToPage(int index) { 19 | controller?.animateToPage(index + 1, 20 | duration: const Duration(milliseconds: 300), curve: Curves.easeOut); 21 | 22 | notifyListeners(); 23 | } 24 | 25 | void setCurrentIndex(int value) { 26 | currentIndex = value; 27 | notifyListeners(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /lib/ui/view/organization/add_organization/add_organization_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:stacked/stacked.dart'; 2 | import 'package:stacked_services/stacked_services.dart'; 3 | 4 | import '../../../../app/app.locator.dart'; 5 | import '../../../../app/app.router.dart'; 6 | import '../../../../utilities/enums.dart'; 7 | 8 | class AddOrganizationViewModel extends BaseViewModel { 9 | final _navigationService = locator(); 10 | void back() => _navigationService.back(); 11 | void navigateToSelectEmail(OrganizationSwitchMethod method) { 12 | _navigationService.navigateTo( 13 | Routes.selectEmail, 14 | arguments: SelectEmailArguments(method: method), 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /lib/ui/view/organization/invite_to_organization/admin_permissions/invite_link_created.dart: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /lib/ui/view/organization/new_email/new_email_viewmodel.dart: -------------------------------------------------------------------------------- 1 | // import 'package:flutter/material.dart'; 2 | import 'package:stacked/stacked.dart'; 3 | 4 | class NewEmailViewModel extends BaseViewModel { 5 | bool isEmpty = true; 6 | bool get title => isEmpty; 7 | String _text = ''; 8 | String get text => _text; 9 | 10 | // Color buttonColor = ; 11 | // Color get buttonColors => buttonColor; 12 | 13 | void updateString(String value) { 14 | if (value.trim().isEmpty) { 15 | isEmpty = true; 16 | } else { 17 | isEmpty = false; 18 | } 19 | _text = value.trim(); 20 | notifyListeners(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/ui/view/password_recovery/recovery_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:stacked/stacked.dart'; 2 | 3 | class ForgotPassViewModel extends BaseViewModel {} 4 | -------------------------------------------------------------------------------- /lib/ui/view/plugins/add_plugin_view.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:stacked/stacked.dart'; 3 | 4 | import 'add_plugin_viewmodel.dart'; 5 | 6 | class AddPluginView extends StatelessWidget { 7 | const AddPluginView({Key? key}) : super(key: key); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return ViewModelBuilder.reactive( 12 | builder: (context, model, child) => const Scaffold(), 13 | viewModelBuilder: () => AddPluginViewModel(), 14 | ); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /lib/ui/view/plugins/add_plugin_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:stacked/stacked.dart'; 2 | 3 | class AddPluginViewModel extends BaseViewModel {} 4 | -------------------------------------------------------------------------------- /lib/ui/view/popup_notification/popup_notification_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:stacked/stacked.dart'; 2 | 3 | class PopupNotificationViewModel extends BaseViewModel { 4 | String title = 'Integrate'; 5 | String notiText = '1 min ago'; 6 | String notiText2 = 'BrodaDEemi'; 7 | String notiText4 = 'You are missing notifications?'; 8 | String notiText3 = 'Reply'; 9 | String profileImage = 'assets/background/appBarLogo.png'; 10 | String profileImage2 = 'assets/background/appBarLogo.png'; 11 | } 12 | -------------------------------------------------------------------------------- /lib/ui/view/search_messages/message_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:stacked/stacked.dart'; 2 | 3 | class MessageViewModel extends BaseViewModel {} 4 | -------------------------------------------------------------------------------- /lib/ui/view/set_status/widgets/status.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | import '../../../shared/dumb_widgets/menu_item_tile.dart'; 4 | import '../../../../utilities/constants/colors.dart'; 5 | 6 | class Status extends StatelessWidget { 7 | const Status( 8 | {Key? key, 9 | required this.status, 10 | required this.duration, 11 | required this.icon, 12 | this.onPressed}) 13 | : super(key: key); 14 | final String status; 15 | final String duration; 16 | final IconData icon; 17 | final void Function()? onPressed; 18 | 19 | @override 20 | Widget build(BuildContext context) { 21 | return Padding( 22 | padding: const EdgeInsets.only(left: 10), 23 | child: MenuItemTile( 24 | onPressed: onPressed, 25 | topBorder: false, 26 | icon: Icon(icon), 27 | text: Text.rich( 28 | TextSpan( 29 | text: status, 30 | style: const TextStyle(fontWeight: FontWeight.bold), 31 | children: [ 32 | TextSpan( 33 | text: ' - $duration', 34 | style: const TextStyle(color: AppColors.greyishColor), 35 | ) 36 | ], 37 | ), 38 | ), 39 | ), 40 | ); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/ui/view/set_status/widgets/statuses.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | 3 | class Statuses extends StatelessWidget { 4 | const Statuses({Key? key, required this.title, required this.children}) 5 | : super(key: key); 6 | final String title; 7 | final List children; 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | var columnChildren = [ 12 | Padding( 13 | padding: const EdgeInsets.all(10), 14 | child: Text('$title'), 15 | ), 16 | const Divider(), 17 | ]; 18 | columnChildren += children; 19 | return Column( 20 | crossAxisAlignment: CrossAxisAlignment.start, 21 | children: columnChildren, 22 | ); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lib/ui/view/splashscreen/splashscreen.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/utilities/constants/app_strings.dart'; 3 | import 'package:stacked/stacked.dart'; 4 | import 'splashscreen_viewmodel.dart'; 5 | 6 | class Splashview extends StatelessWidget { 7 | const Splashview({Key? key}) : super(key: key); 8 | 9 | @override 10 | Widget build(BuildContext context) { 11 | return ViewModelBuilder.reactive( 12 | viewModelBuilder: () => SplashscreenViewModel(), 13 | onModelReady: (model) => model.init(), 14 | builder: (context, model, child) => Scaffold( 15 | body: Center( 16 | child: Column( 17 | mainAxisAlignment: MainAxisAlignment.center, 18 | children: const [ 19 | Image( 20 | image: AssetImage(SplashScreen), 21 | ), 22 | ], 23 | ), 24 | ), 25 | ), 26 | ); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /lib/ui/view/static_pages/terms_and_conditions/terms_and_conditions_view_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/app/app.locator.dart'; 2 | import 'package:stacked/stacked.dart'; 3 | import 'package:stacked_services/stacked_services.dart'; 4 | 5 | class TermsAndConditionsViewModel extends BaseViewModel { 6 | final navigator = locator(); 7 | popNavigation() => navigator.popRepeated(1); 8 | } 9 | -------------------------------------------------------------------------------- /lib/ui/view/threads/all_threads/threads_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:stacked/stacked.dart'; 2 | import 'package:stacked_services/stacked_services.dart'; 3 | 4 | import '../../../../app/app.locator.dart'; 5 | import '../../../../app/app.router.dart'; 6 | import '../../../../models/user_post.dart'; 7 | import '../test_data.dart'; 8 | 9 | class ThreadsViewModel extends BaseViewModel { 10 | final _navigationService = locator(); 11 | 12 | List userPosts = userPost; 13 | 14 | void initialise() { 15 | refreshThreadsPage(); 16 | 17 | notifyListeners(); 18 | } 19 | 20 | Future refreshThreadsPage() async { 21 | notifyListeners(); 22 | await Future.delayed( 23 | const Duration(seconds: 5), 24 | ); 25 | } 26 | 27 | void exitPage() { 28 | _navigationService.back(); 29 | } 30 | 31 | Future navigateToThread(UserPost? userPost) async { 32 | _navigationService.navigateTo(Routes.threadDetailView, 33 | arguments: ThreadDetailViewArguments(userPost: userPost)); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/ui/view/user_search/user_search_viewmodel.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/app/app.locator.dart'; 2 | import 'package:zurichat/app/app.router.dart'; 3 | import 'package:zurichat/utilities/enums.dart'; 4 | import 'package:stacked/stacked.dart'; 5 | import 'package:stacked_services/stacked_services.dart'; 6 | 7 | class UserSearchViewModel extends BaseViewModel { 8 | final _bottomSheetService = locator(); 9 | final _navigationService = locator(); 10 | void viewProfile() async { 11 | //TODO correctly implement functions 12 | 13 | await _bottomSheetService.showCustomSheet( 14 | variant: BottomSheetType.user, 15 | isScrollControlled: true, 16 | ); 17 | } 18 | 19 | void navigateToDirectMessage(String? userName) { 20 | _navigationService.navigateTo(Routes.directMessage); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lib/ui/view/user_search/widget/custom_dm_list_tile.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/material.dart'; 2 | import 'package:zurichat/ui/view/user_search/user_search_viewmodel.dart'; 3 | import 'package:stacked/stacked.dart'; 4 | 5 | class CustomDMListTile extends ViewModelWidget { 6 | final String? imagelink; 7 | final String? userName; 8 | const CustomDMListTile({ 9 | Key? key, 10 | this.imagelink, 11 | this.userName, 12 | }) : super(key: key); 13 | @override 14 | Widget build(BuildContext context, UserSearchViewModel viewModel) { 15 | return InkWell( 16 | onTap: () => viewModel.navigateToDirectMessage(userName), 17 | child: Row( 18 | children: [ 19 | CircleAvatar( 20 | backgroundImage: AssetImage("$imagelink"), 21 | radius: 20.0, 22 | ), 23 | const SizedBox(width: 8), 24 | TextButton( 25 | onPressed: viewModel.viewProfile, 26 | child: Text( 27 | "$userName", 28 | style: const TextStyle( 29 | fontWeight: FontWeight.w700, 30 | color: Colors.black, 31 | fontSize: 15, 32 | ), 33 | ), 34 | ) 35 | ], 36 | ), 37 | ); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /lib/ui/view/webview_page/web_view_model.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/app/app.locator.dart'; 2 | import 'package:stacked/stacked.dart'; 3 | import 'package:stacked_services/stacked_services.dart'; 4 | 5 | class WebViewModel extends BaseViewModel { 6 | final navigation = locator(); 7 | bool isLoading = false; 8 | 9 | int progressValue = 0; 10 | 11 | goBack() => navigation.back(); 12 | 13 | void updateValue(int progress) { 14 | progressValue = progress; 15 | notifyListeners(); 16 | } 17 | 18 | void startLoading() { 19 | isLoading = true; 20 | notifyListeners(); 21 | } 22 | 23 | void stopLoading() { 24 | isLoading = false; 25 | notifyListeners(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /lib/utilities/api_handlers/api_utils.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/dio.dart'; 2 | 3 | import '../../models/api_response.dart'; 4 | 5 | class ApiUtils { 6 | static ApiResponse toApiResponse(Response res) { 7 | return ApiResponse( 8 | statusCode: res.statusCode, 9 | statusMessage: res.statusMessage, 10 | data: res.data, 11 | ); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /lib/utilities/api_handlers/dio_interceptors.dart: -------------------------------------------------------------------------------- 1 | import 'package:dio/dio.dart'; 2 | import 'package:zurichat/app/app.logger.dart'; 3 | 4 | class DioInterceptor implements Interceptor { 5 | final log = getLogger("DioInterceptor"); 6 | 7 | @override 8 | void onError(DioError err, ErrorInterceptorHandler handler) { 9 | log.i('ENDPOINT: ${err.requestOptions.uri}'); 10 | log.i('STATUSCODE: ${err.error}'); 11 | log.i('MESSAGE: ${err.response?.data ?? err.message}'); 12 | handler.next(err); 13 | } 14 | 15 | @override 16 | void onRequest(RequestOptions options, RequestInterceptorHandler handler) { 17 | log.i('METHOD: ${options.method}'); 18 | log.i('ENDPOINT: ${options.uri}'); 19 | //log.i('HEADERS: ' + options.headers.toString()); 20 | log.i('DATA: ${options.data ?? options.queryParameters}'); 21 | handler.next(options); 22 | } 23 | 24 | @override 25 | void onResponse(Response response, ResponseInterceptorHandler handler) { 26 | log.i('ENDPOINT: ${response.requestOptions.uri}'); 27 | log.i('STATUSCODE: ${response.statusCode}'); 28 | log.i('DATA: ${response.data}'); 29 | handler.next(response); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/utilities/api_handlers/exceptions.dart: -------------------------------------------------------------------------------- 1 | class ServerException implements Exception { 2 | final String errorMessage; 3 | ServerException({required this.errorMessage}); 4 | } 5 | 6 | class InputException implements Exception { 7 | final String errorMessage; 8 | InputException({required this.errorMessage}); 9 | } 10 | 11 | class UnauthorisedException implements Exception { 12 | final String errorMessage; 13 | UnauthorisedException({required this.errorMessage}); 14 | } 15 | 16 | class NetworkException implements Exception { 17 | final String errorMessage; 18 | NetworkException({required this.errorMessage}); 19 | } 20 | 21 | class UnknownException implements Exception { 22 | final String errorMessage; 23 | UnknownException({required this.errorMessage}); 24 | } 25 | -------------------------------------------------------------------------------- /lib/utilities/api_handlers/failures.dart: -------------------------------------------------------------------------------- 1 | abstract class Failure {} 2 | 3 | class ServerFailure implements Failure { 4 | final String? error; 5 | ServerFailure({this.error}); 6 | } 7 | 8 | class InputFailure implements Failure { 9 | final String? errorMessage; 10 | InputFailure({required this.errorMessage}); 11 | } 12 | 13 | class BadAuthFailure implements Failure { 14 | final String? errorMessage; 15 | BadAuthFailure({this.errorMessage}); 16 | } 17 | 18 | class NetworkFailure implements Failure {} 19 | 20 | class UnknownFailure implements Failure {} 21 | -------------------------------------------------------------------------------- /lib/utilities/enums.dart: -------------------------------------------------------------------------------- 1 | enum ConnectivityStatus { wifi, mobile, online, offline } 2 | 3 | enum DialogType { 4 | skinTone, 5 | selectLanguage, 6 | feedback, 7 | themeMode, 8 | deleteChannel, 9 | deleteMessage, 10 | signOut, 11 | remindMe, 12 | deleteDraft, 13 | scheduleMessageDm, 14 | scheduleMessageChannel, 15 | imageSource, 16 | } 17 | 18 | enum ChannelType { private, public, personal } 19 | 20 | enum CustomUserProfileButtonType { normal, icon } 21 | 22 | enum ThreadCardType { threadMain, threadDetail, threadPost, threadChannelMain } 23 | 24 | enum PostFileType { text, app } 25 | 26 | enum BottomSheetType { 27 | user, 28 | emojiPicker, 29 | floatingBox, 30 | threadOptions, 31 | signOut, 32 | imagePicker 33 | } 34 | 35 | enum HomeListType { 36 | unreads, 37 | channels, 38 | messages, 39 | } 40 | 41 | enum OrganizationSwitchMethod { 42 | create, 43 | signIn, 44 | join, 45 | } 46 | 47 | /// The type of snackbar to show 48 | enum SnackbarType { 49 | success, 50 | failure, 51 | } 52 | 53 | enum HomeItemType { 54 | channels, 55 | dm, 56 | } 57 | -------------------------------------------------------------------------------- /lib/utilities/extensions/locale_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter/widgets.dart'; 2 | import 'package:zurichat/utilities/constants/app_strings.dart'; 3 | import 'package:zurichat/services/app_services/localization_service.dart'; 4 | 5 | extension LocaleExtension on Locale { 6 | String getLanguageName() { 7 | String localeName = toString(); 8 | if (toString().trim() == '') { 9 | localeName = LocalizationService().appLocale.toString(); 10 | } 11 | 12 | switch (localeName) { 13 | case 'en_US': 14 | return EnglishUS; 15 | case 'de_DE': 16 | return DeutschDE; 17 | case 'ar_SA': 18 | return ArabicSA; 19 | case 'zh_HK': 20 | return Mandarin; 21 | case 'es_ES': 22 | return Spanish; 23 | case 'ja_JP': 24 | return Japanese; 25 | case 'he_IL': 26 | return Hebrew; 27 | case 'it_IT': 28 | return Italian; 29 | case 'pt_BR': 30 | return PortugueseBrazil; 31 | default: 32 | return LocalizationService().appLocale.toString(); 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /lib/utilities/extensions/string_extension.dart: -------------------------------------------------------------------------------- 1 | import 'package:intl/intl.dart'; 2 | 3 | extension StringExtension on String { 4 | bool validateEmail() { 5 | const emailPattern = 6 | r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'; 7 | 8 | final regExp = RegExp(emailPattern); 9 | 10 | return regExp.hasMatch(trim()); 11 | } 12 | 13 | bool strip() { 14 | return replaceAll(RegExp(r'\s+'), '').isEmpty; 15 | } 16 | 17 | String turnStringToDate(String format) { 18 | return DateFormat(format).format(DateTime.parse(this)).toString(); 19 | } 20 | 21 | bool validateLink() { 22 | const urlPattern = 23 | r'^((?:.|\n)*?)((http:\/\/www\.|https:\/\/www\.|http:\/\/|https:\/\/)?[a-z0-9]+([\-\.]{1}[a-z0-9]+)([-A-Z0-9.]+)(/[-A-Z0-9+&@#/%=~_|!:,.;]*)?(\?[A-Z0-9+&@#/%=~_|!:‌​,.;]*)?)'; 24 | 25 | final regExp = RegExp(urlPattern); 26 | 27 | return regExp.hasMatch(this); 28 | } 29 | 30 | String get initials { 31 | return split(' ').map((e) => e.split('').first.toUpperCase()).join(); 32 | } 33 | 34 | String capitalize() { 35 | return "${this[0].toUpperCase()}${substring(1)}"; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /lib/utilities/failures.dart: -------------------------------------------------------------------------------- 1 | abstract class Failure {} 2 | 3 | class ServerFailure implements Failure { 4 | final String? error; 5 | ServerFailure({this.error}); 6 | } 7 | 8 | class InputFailure implements Failure { 9 | final String? errorMessage; 10 | InputFailure({required this.errorMessage}); 11 | } 12 | 13 | class BadAuthFailure implements Failure { 14 | final String? errorMessage; 15 | BadAuthFailure({this.errorMessage}); 16 | } 17 | 18 | class NetworkFailure implements Failure {} 19 | 20 | class UnknownFailure implements Failure {} 21 | -------------------------------------------------------------------------------- /lib/utilities/mixins/close_on_second_back_mixin.dart: -------------------------------------------------------------------------------- 1 | import 'package:zurichat/utilities/constants/app_strings.dart'; 2 | 3 | import '../../services/app_services/app_toast.dart'; 4 | 5 | mixin CustomWillPopScopeMixin { 6 | static bool _secondBack = false; 7 | static const secondTapDurationSpace = Duration(seconds: 2); 8 | Future onSecondBackPop() async { 9 | if (!_secondBack) { 10 | AppToast.instance.message(null, 'Press back again to close $appName'); 11 | _secondBack = true; 12 | Future.delayed(secondTapDurationSpace, () => _secondBack = false); 13 | return false; 14 | } else { 15 | return true; 16 | } 17 | } 18 | 19 | Future delayAndPop() async { 20 | AppToast.instance.message(null, 'Closing $appName'); 21 | return Future.delayed(secondTapDurationSpace, () => true); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lib/utilities/utilities.dart: -------------------------------------------------------------------------------- 1 | import 'package:cached_network_image/cached_network_image.dart'; 2 | import 'package:flutter/widgets.dart'; 3 | import 'package:url_launcher/url_launcher.dart'; 4 | import 'package:zurichat/app/app.logger.dart'; 5 | 6 | import 'constants/app_constants.dart'; 7 | import 'extensions/string_extension.dart'; 8 | 9 | final log = getLogger('Utilities'); 10 | 11 | ImageProvider makeNetworkImage(String? link) { 12 | return link == null || !link.validateLink() 13 | ? const CachedNetworkImageProvider(defaultNetworkImage) 14 | : CachedNetworkImageProvider(link); 15 | } 16 | 17 | Future openUrl(String? url) async { 18 | if (url != null && url.validateLink()) { 19 | // final canOpen = await canLaunch(url); 20 | // if (canOpen) await launch(url); 21 | } 22 | } 23 | 24 | void showProgress(received, total) { 25 | if (total != -1) { 26 | log.i((received / total * 100).toStringAsFixed(0) + '%'); 27 | } 28 | } 29 | 30 | bool nullListChecker(List? list) { 31 | if (list == null) { 32 | return true; 33 | } else { 34 | return false; 35 | } 36 | } 37 | 38 | Future launcher(String url) { 39 | return launchUrl(Uri.parse(url)); 40 | } 41 | 42 | Future canLaunchUrl(String url) async { 43 | return await canLaunchUrl(url); 44 | } 45 | -------------------------------------------------------------------------------- /test/helpers/test_constants.dart: -------------------------------------------------------------------------------- 1 | import 'dart:io'; 2 | 3 | File? fileMock = File('image_path'); 4 | const String token_string = "my token"; 5 | const String pluginId_string = "plugin id"; 6 | const String memberId_string = "my member id"; 7 | const String orgId_string = "my org id"; 8 | -------------------------------------------------------------------------------- /test/services/bottom_sheet_service_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:zurichat/ui/shared/smart_widgets/thread_card/thread_card_viewmodel.dart'; 3 | import 'package:zurichat/utilities/enums.dart'; 4 | import 'package:mockito/mockito.dart'; 5 | import '../helpers/test_helpers.dart'; 6 | 7 | void main() { 8 | group('BottomSheetServiceTest -', () { 9 | setUp(() => registerServices()); 10 | tearDown(() => unregisterServices()); 11 | group('Show bottom sheet', () { 12 | test('When called, a customBottomSheet is shown', () async { 13 | var service = getAndRegisterBottomSheetServiceMock(); 14 | var model = ThreadCardViewModel(); 15 | await model.viewProfile(); 16 | verify(service.showCustomSheet( 17 | variant: BottomSheetType.user, 18 | isScrollControlled: true, 19 | )); 20 | }); 21 | }); 22 | }); 23 | } 24 | -------------------------------------------------------------------------------- /test/services/centrifuge_service_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:mockito/mockito.dart'; 3 | import '../helpers/test_helpers.dart'; 4 | 5 | void main() { 6 | group('CentrifugeServiceTest -', () { 7 | final centrifugeService = getAndRegisterCentrifugeServiceMock(); 8 | 9 | group('Centrifuge connection -', () { 10 | test( 11 | 'When called it should subscribe to a channel and return a stream of events', 12 | () { 13 | centrifugeService.subscribe("channelSocketID"); 14 | verify(centrifugeService.subscribe("channelSocketID")); 15 | }); 16 | }); 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /test/services/channel_api_service_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | 3 | void main() { 4 | group('ChannelApiServiceTest -', () {}); 5 | } 6 | -------------------------------------------------------------------------------- /test/services/connectivity_service_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:mockito/mockito.dart'; 3 | 4 | import '../helpers/test_helpers.dart'; 5 | 6 | void main() { 7 | group('ConnectivityServiceTest -', () { 8 | setUp(() => registerServices()); 9 | tearDown(() => unregisterServices()); 10 | 11 | group('Online Connection Test', () { 12 | test(' if wifi or mobile hotspot is on, then connection comes online', 13 | () async { 14 | var connectivity = getAndRegisterConnectivityServiceMock(); 15 | connectivity.initialize(); 16 | await connectivity.checkConnection().whenComplete(() => true); 17 | verify(connectivity.checkConnection().whenComplete(() => true)); 18 | }); 19 | }); 20 | 21 | group('Offline Connection Test', () { 22 | test(' if wifi or mobile hotspot is off, then connection goes offline', 23 | () async { 24 | var connectivity = getAndRegisterConnectivityServiceMock(); 25 | connectivity.initialize(); 26 | await connectivity.checkConnection().whenComplete(() => false); 27 | verify(connectivity.checkConnection().whenComplete(() => false)); 28 | }); 29 | }); 30 | }); 31 | } -------------------------------------------------------------------------------- /test/services/dialog_service_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:zurichat/ui/view/channel/channel_info/channel_info_view_model.dart'; 3 | import 'package:zurichat/utilities/enums.dart'; 4 | import 'package:mockito/mockito.dart'; 5 | import '../helpers/test_helpers.dart'; 6 | 7 | void main() { 8 | group('DialogServiceTest -', () { 9 | setUp(() => registerServices()); 10 | tearDown(() => unregisterServices()); 11 | group('Show dialog', () { 12 | test('When called, it verifies if a customDialog is shown on the screen', 13 | () async { 14 | var service = getAndRegisterDialogServiceMock(); 15 | var model = ChannelInfoViewModel(); 16 | await model.showDialog(); 17 | verify(service.showCustomDialog( 18 | variant: DialogType.deleteChannel, 19 | )); 20 | }); 21 | }); 22 | }); 23 | } 24 | -------------------------------------------------------------------------------- /test/services/dm_api_service.test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | 3 | void main() { 4 | group('DmApiServiceTest -', () {}); 5 | } 6 | -------------------------------------------------------------------------------- /test/services/jumpto_api_service_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | 3 | void main() { 4 | group('JumptoApiServiceTest -', () {}); 5 | } 6 | -------------------------------------------------------------------------------- /test/services/media_service_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:mockito/mockito.dart'; 3 | import '../helpers/test_constants.dart'; 4 | import '../helpers/test_helpers.dart'; 5 | 6 | void main() { 7 | group('MediaServiceTest -', () { 8 | setUp(() => registerServices()); 9 | tearDown(() => unregisterServices()); 10 | 11 | group('Media upload -', () { 12 | final mediaService = getAndRegisterMediaServiceMock(); 13 | test('When called it should upload an image and return image address', 14 | () async { 15 | mediaService.uploadImage(fileMock, pluginId_string); 16 | verify(mediaService.uploadImage(fileMock, pluginId_string)); 17 | }); 18 | }); 19 | }); 20 | } 21 | -------------------------------------------------------------------------------- /test/services/navigation_service_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:zurichat/app/app.router.dart'; 3 | import 'package:zurichat/ui/view/login/login_viewmodel.dart'; 4 | import 'package:mockito/mockito.dart'; 5 | 6 | import '../helpers/test_helpers.dart'; 7 | 8 | void main() { 9 | group('NavigationServiceTest -', () { 10 | setUp(() => registerServices()); 11 | tearDown(() => unregisterServices()); 12 | group('LoginViewModel Navigation', () { 13 | test('When called, the app should navigate to the forgot password view', 14 | () async { 15 | final navigation = getAndRegisterNavigationServiceMock(); 16 | var model = LoginViewModel(); 17 | model.navigateToForgotPasswordScreen(); 18 | verify(navigation.navigateTo(Routes.forgotPasswordEmailView)); 19 | }); 20 | }); 21 | }); 22 | } 23 | -------------------------------------------------------------------------------- /test/services/snackbar_service_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:centrifuge/centrifuge.dart'; 2 | import 'package:flutter_test/flutter_test.dart'; 3 | import 'package:mockito/mockito.dart'; 4 | import 'package:zurichat/utilities/enums.dart'; 5 | 6 | import '../helpers/test_helpers.dart'; 7 | 8 | void main() { 9 | group('SnackbarServiceTest -', () { 10 | setUp(() => registerServices()); 11 | tearDown(() => unregisterServices()); 12 | group('Custom Snackbar', () { 13 | test('When called, a customSnackBar is shown', () async { 14 | var snackbar = getAndRegisterSnackbarServiceMock(); 15 | await snackbar.showCustomSnackBar( 16 | message: 17 | Error.custom(401, 'Could not create workspace', true).toString(), 18 | variant: SnackbarType.failure, 19 | ); 20 | 21 | verify(snackbar.showCustomSnackBar( 22 | message: 23 | Error.custom(401, 'Could not create workspace', true).toString(), 24 | variant: SnackbarType.failure, 25 | )); 26 | }); 27 | }); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /test/services/theme_service_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:mockito/mockito.dart'; 3 | 4 | import '../helpers/test_helpers.dart'; 5 | 6 | void main() { 7 | group('ThemeServiceTest -', () { 8 | setUp(() => registerServices()); 9 | tearDown(() => unregisterServices()); 10 | 11 | group('Theme services test', () { 12 | test('Test if theme switching is working correctly', () async { 13 | var themeService = getAndRegisterThemeServiceMock(); 14 | await themeService.selectThemeAtIndex(0).whenComplete(() => true); 15 | verify(themeService.selectThemeAtIndex(0).whenComplete(() => true)); 16 | }); 17 | }); 18 | }); 19 | } 20 | -------------------------------------------------------------------------------- /test/services/user_service_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:zurichat/app/app.locator.dart'; 3 | import 'package:zurichat/services/in_review/user_service.dart'; 4 | 5 | void main() { 6 | group('UserServiceTest -', () { 7 | setUpAll(() { 8 | setupLocator(); 9 | }); 10 | group('User services', () { 11 | test('When called, it sets value to the workspace Id', () { 12 | final userService = UserService(); 13 | userService.setCurrentOrganizationId('currentOrgId'); 14 | expect(userService.currentOrgId, 'currentOrgId'); 15 | }); 16 | test("When called, it sets value to the authToken, userId and userEmail.", 17 | () { 18 | final userService = UserService(); 19 | userService.setUserAndToken( 20 | authToken: 'authToken', 21 | userId: 'user1234', 22 | userEmail: 'Zuri@gmail.com'); 23 | expect(userService.authToken, 'authToken'); 24 | expect(userService.userId, 'user1234'); 25 | expect(userService.userEmail, 'Zuri@gmail.com'); 26 | }); 27 | }); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /test/services/zuri_api_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | 3 | void main() { 4 | group('ZuriApiTest -', () {}); 5 | } 6 | -------------------------------------------------------------------------------- /test/view_models/add_people_viewmodel_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:mockito/mockito.dart'; 3 | import 'package:zurichat/ui/view/add_people/add_people_viewmodel.dart'; 4 | 5 | import '../helpers/test_helpers.dart'; 6 | 7 | void main() { 8 | group('AddPeopleViewModelTest -', () { 9 | setUp(() => registerServices()); 10 | tearDown(() => unregisterServices()); 11 | group('goBack -', () { 12 | test('When called, it takes the user to the previous page', () { 13 | final navigationService = getAndRegisterNavigationServiceMock(); 14 | final model = AddPeopleViewModel(); 15 | model.goBack(); 16 | verify(navigationService.back()); 17 | }); 18 | }); 19 | }); 20 | } 21 | -------------------------------------------------------------------------------- /test/view_models/channel_members_list_model_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:zurichat/ui/view/channel/channel_members/channel_members_list_model.dart'; 3 | import 'package:mockito/mockito.dart'; 4 | import '../helpers/test_helpers.dart'; 5 | 6 | void main() { 7 | group('Channel Members', () { 8 | setUp(() => registerServices()); 9 | tearDown(() => unregisterServices()); 10 | group('Navigation for Channel Members', () { 11 | test( 12 | 'When called, it verifies if the current route is popped back to the previous screen', 13 | () async { 14 | var navigationService = getAndRegisterNavigationServiceMock(); 15 | var model = ChannelMembersModel(); 16 | model.goBack(); 17 | verify(navigationService.back()); 18 | }); 19 | }); 20 | }); 21 | } 22 | -------------------------------------------------------------------------------- /test/view_models/channel_notification_viewmodel_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:zurichat/ui/view/channel/channel_notification/channel_notification_viewmodel.dart'; 3 | import '../helpers/test_helpers.dart'; 4 | 5 | // This is a test setup 6 | void main() { 7 | group('ChannelNotificationViewModelTest -', () { 8 | setUp(() => registerServices()); 9 | tearDown(() => unregisterServices()); 10 | group('toggleOptions -', () { 11 | test( 12 | 'When toggleOptions is called and a string value is entered, should be true.', 13 | () { 14 | final model = ChannelNotificationViewModel(); 15 | model.toggleOptions('val'); 16 | expect(model.value, 'val'); 17 | }); 18 | }); 19 | }); 20 | } 21 | -------------------------------------------------------------------------------- /test/view_models/channels_viewmodel_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:zurichat/models/channel_members.dart'; 3 | import 'package:zurichat/models/channel_model.dart'; 4 | import 'package:zurichat/ui/view/channel/channel_list/channels_viewmodel.dart'; 5 | 6 | import '../helpers/test_helpers.dart'; 7 | 8 | // This is a test setup 9 | void main() { 10 | group('ChannelListViewModelTest -', () { 11 | setUp(() => registerServices()); 12 | tearDown(() => unregisterServices()); 13 | group('channelsList -', () { 14 | test('Check ChannelModel List is empty', () { 15 | final model = ChannelListViewModel(); 16 | model.channelsList; 17 | expect(model.channelsList, []); 18 | }); 19 | }); 20 | 21 | group('membersList -', () { 22 | test('Check ChannelMembermodel List is empty', () { 23 | final model = ChannelListViewModel(); 24 | model.membersList; 25 | expect(model.membersList, []); 26 | }); 27 | }); 28 | }); 29 | } 30 | -------------------------------------------------------------------------------- /test/view_models/dm_jump_to_viewmodel_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:zurichat/ui/view/jump_to_view/jump_to_viewmodel.dart'; 3 | 4 | import '../helpers/test_helpers.dart'; 5 | 6 | //TODO test properly 7 | void main() { 8 | group('JumpToViewModelTest -', () { 9 | setUp(() => registerServices()); 10 | tearDown(() => unregisterServices()); 11 | group('initialise -', () { 12 | test('users list initializes with empty', () async {}); 13 | 14 | test('channels list initializes with empty', () async {}); 15 | }); 16 | 17 | group('api calls -', () { 18 | test('When called, check if users list is not empty', () async { 19 | final model = JumpToViewModel(); 20 | 21 | //TODO write test properly 22 | await model.fetchUsers(); 23 | expect(model.userSearch.isNotEmpty, true); 24 | }); 25 | 26 | test('When called, check if channels list is not empty', () async { 27 | final model = JumpToViewModel(); 28 | 29 | 30 | //TODO write test properly 31 | await model.fetchChannels(); 32 | expect(model.allChannelsSearch.isNotEmpty, true); 33 | }); 34 | }); 35 | }); 36 | } 37 | -------------------------------------------------------------------------------- /test/view_models/dm_user_viewmodel_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:zurichat/ui/view/dm_user/dm_user_viewmodel.dart'; 3 | import 'package:mockito/mockito.dart'; 4 | import '../helpers/test_helpers.dart'; 5 | 6 | void main() { 7 | group('dmUserViewModelTest -', () { 8 | setUp(() => registerServices()); 9 | tearDown(() => unregisterServices()); 10 | 11 | group('initialise -', () { 12 | test('hasClickedMessageField initializes with false', () async { 13 | final model = DmUserViewModel(); 14 | expect(model.hasClickedMessageField, false); 15 | }); 16 | test('hasClickedMessageField is true', () async { 17 | final model = DmUserViewModel(); 18 | model.onTapMessageField(); 19 | expect(model.hasClickedMessageField, true); 20 | }); 21 | }); 22 | 23 | group('navigation -', () { 24 | test( 25 | 'When called, verify that the current screen is popped from the stack', 26 | () { 27 | var model = DmUserViewModel(); 28 | var service = getAndRegisterNavigationServiceMock(); 29 | model.popScreen(); 30 | verify(service.popRepeated(1)); 31 | }); 32 | }); 33 | }); 34 | } 35 | -------------------------------------------------------------------------------- /test/view_models/forgot_password_email_viewmodel_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:zurichat/ui/view/forgot_password/forgot_password_email/forgot_password_email_viewmodel.dart'; 3 | import 'package:mockito/mockito.dart'; 4 | import '../helpers/test_helpers.dart'; 5 | 6 | void main() { 7 | group('forgetPasswordEmailViewModelTest -', () { 8 | group('initialise -', () { 9 | setUp(() => registerServices()); 10 | tearDown(() => unregisterServices()); 11 | test('when called, check if user inputed email is valid', () async { 12 | var model = ForgotPasswordEmailViewModel(); 13 | var valid = model.emailValidation('abcd@xyz.com'); 14 | expect(valid, true); 15 | }); 16 | 17 | test('when called,check if navigates to otp view', () { 18 | final model = ForgotPasswordEmailViewModel(); 19 | verify(model.navigateToForgotPasswordOtpView()); 20 | }); 21 | }); 22 | }); 23 | } 24 | -------------------------------------------------------------------------------- /test/view_models/forgot_password_new_viewmodel_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:zurichat/app/app.router.dart'; 3 | import 'package:zurichat/ui/view/forgot_password/forgot_password_new_password/forgot_password_newviewmodel.dart'; 4 | import 'package:mockito/mockito.dart'; 5 | 6 | import '../helpers/test_helpers.dart'; 7 | 8 | void main() { 9 | group('Forgot password New ViewModel Test -', () { 10 | group('initialise/navigation -', () { 11 | setUp(() => registerServices()); 12 | tearDown(() => unregisterServices()); 13 | test('when called, check if new password is valid', () { 14 | final model = ForgotPasswordNewViewModel(); 15 | var valid = model.passValidation("Test1234"); 16 | expect(valid, true); 17 | }); 18 | 19 | test('when called navigate to login view if password is valid', () { 20 | final service = getAndRegisterNavigationServiceMock(); 21 | final model = ForgotPasswordNewViewModel(); 22 | model.passValidation("Test1234"); 23 | verify(service.navigateTo(Routes.loginView)); 24 | }); 25 | }); 26 | }); 27 | } 28 | -------------------------------------------------------------------------------- /test/view_models/forgot_password_otp_viewmodel_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:zurichat/app/app.router.dart'; 3 | import 'package:mockito/mockito.dart'; 4 | 5 | import '../helpers/test_helpers.dart'; 6 | 7 | void main() { 8 | group('Forgot Password OTP ViewModel Test -', () { 9 | setUp(() => registerServices()); 10 | tearDown(() => unregisterServices()); 11 | group('initialise/navigation -', () { 12 | test('when called, verify navigate to Forgot password new ', () { 13 | final service = getAndRegisterNavigationServiceMock(); 14 | verify(service.navigateTo(Routes.forgotPasswordNewView)); 15 | }); 16 | }); 17 | }); 18 | } 19 | -------------------------------------------------------------------------------- /test/view_models/notifications_viewmodel_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:zurichat/ui/view/notifications/notifications_viewmodel.dart'; 3 | import '../helpers/test_helpers.dart'; 4 | 5 | void main() { 6 | group('notificationsViewModelTest -', () { 7 | setUp(() => registerServices()); 8 | tearDown(() => unregisterServices()); 9 | final model = NotificationsViewModel(); 10 | 11 | group('test functions -', () { 12 | test('When called, checks if vibrate field changes value', () { 13 | model.toggleVibrate(false); 14 | expect(model.vibrate, false); 15 | }); 16 | 17 | test('When called, checks if light field changes value', () { 18 | model.toggleLight(false); 19 | expect(model.light, false); 20 | }); 21 | 22 | test('When called, checks if inAppNotification field changes value', () { 23 | model.toggleInAppNotification(false); 24 | expect(model.inAppNotification, false); 25 | }); 26 | 27 | test('When called, checks if notifyOnKeyword field changes value', () { 28 | model.toggleNotifyOnKeyword(false); 29 | expect(model.notifyOnKeyword, false); 30 | }); 31 | }); 32 | }); 33 | } 34 | -------------------------------------------------------------------------------- /test/view_models/otp_viewmodel_test.dart: -------------------------------------------------------------------------------- 1 | import 'package:flutter_test/flutter_test.dart'; 2 | import 'package:zurichat/app/app.router.dart'; 3 | import 'package:zurichat/ui/view/otp/otp_viewmodel.dart'; 4 | import 'package:mockito/mockito.dart'; 5 | 6 | import '../helpers/test_helpers.dart'; 7 | 8 | void main() { 9 | group('OTP viewmodel -', () { 10 | setUp(() => registerServices()); 11 | tearDown(() => unregisterServices()); 12 | group('initialize -', () { 13 | test('when called navigate to login view', () { 14 | final service = getAndRegisterNavigationServiceMock(); 15 | final model = OTPViewModel(); 16 | model.navigateLogin; 17 | verify(service.navigateTo(Routes.loginView)); 18 | }); 19 | 20 | test('when called, loading indicator is disabled', () { 21 | final model = OTPViewModel(); 22 | var load = model.isLoading; 23 | expect(load, false); 24 | }); 25 | }); 26 | }); 27 | } 28 | -------------------------------------------------------------------------------- /web/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/web/favicon.png -------------------------------------------------------------------------------- /web/icons/Icon-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/web/icons/Icon-192.png -------------------------------------------------------------------------------- /web/icons/Icon-512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/web/icons/Icon-512.png -------------------------------------------------------------------------------- /web/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hng", 3 | "short_name": "hng", 4 | "start_url": ".", 5 | "display": "standalone", 6 | "background_color": "#0175C2", 7 | "theme_color": "#0175C2", 8 | "description": "A new Flutter project.", 9 | "orientation": "portrait-primary", 10 | "prefer_related_applications": false, 11 | "icons": [ 12 | { 13 | "src": "icons/Icon-192.png", 14 | "sizes": "192x192", 15 | "type": "image/png" 16 | }, 17 | { 18 | "src": "icons/Icon-512.png", 19 | "sizes": "512x512", 20 | "type": "image/png" 21 | } 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /web/splash/img/dark-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/web/splash/img/dark-1x.png -------------------------------------------------------------------------------- /web/splash/img/dark-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/web/splash/img/dark-2x.png -------------------------------------------------------------------------------- /web/splash/img/dark-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/web/splash/img/dark-3x.png -------------------------------------------------------------------------------- /web/splash/img/dark-4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/web/splash/img/dark-4x.png -------------------------------------------------------------------------------- /web/splash/img/light-1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/web/splash/img/light-1x.png -------------------------------------------------------------------------------- /web/splash/img/light-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/web/splash/img/light-2x.png -------------------------------------------------------------------------------- /web/splash/img/light-3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/web/splash/img/light-3x.png -------------------------------------------------------------------------------- /web/splash/img/light-4x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zurichat/zc_app/0a354bb3cc9cced03b258a615ca326f88767a55e/web/splash/img/light-4x.png -------------------------------------------------------------------------------- /web/splash/style.css: -------------------------------------------------------------------------------- 1 | body, html { 2 | margin:0; 3 | height:100%; 4 | background: #ffffff; 5 | 6 | background-size: 100% 100%; 7 | } 8 | 9 | .center { 10 | margin: 0; 11 | position: absolute; 12 | top: 50%; 13 | left: 50%; 14 | -ms-transform: translate(-50%, -50%); 15 | transform: translate(-50%, -50%); 16 | } 17 | 18 | .contain { 19 | display:block; 20 | width:100%; height:100%; 21 | object-fit: contain; 22 | } 23 | 24 | .stretch { 25 | display:block; 26 | width:100%; height:100%; 27 | } 28 | 29 | .cover { 30 | display:block; 31 | width:100%; height:100%; 32 | object-fit: cover; 33 | } 34 | 35 | @media (prefers-color-scheme: dark) { 36 | body { 37 | margin:0; 38 | height:100%; 39 | background: #ffffff; 40 | 41 | background-size: 100% 100%; 42 | } 43 | } 44 | --------------------------------------------------------------------------------