├── .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 |
4 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/Reply_In_Thread.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/Send.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/Shape.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/Vector (1).svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/active.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/add-organization.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/add-people.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/add_channel.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/akar-icons_link_chain.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/archive.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/at_sign.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/bookmark.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/camera.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/circle.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/create_msg.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/default.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/dm.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/fluent_send-24-filled.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/gg_time.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/hash_tag.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/home.svg:
--------------------------------------------------------------------------------
1 |
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 |
5 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/link.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/lock1.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/lock_outline.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/log-out.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/maximize.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/members.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/minimize.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/notification.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/paperclip.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/phone.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/plus.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/smile.svg:
--------------------------------------------------------------------------------
1 |
7 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/toggle_off_sharp.svg:
--------------------------------------------------------------------------------
1 |
18 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/user.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/you.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/icons/svg_icons/zap.svg:
--------------------------------------------------------------------------------
1 |
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 |
7 |
--------------------------------------------------------------------------------
/assets/plugin_icons/chess.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/assets/plugin_icons/clock.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/plugin_icons/meeting.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/plugin_icons/notice.svg:
--------------------------------------------------------------------------------
1 |
5 |
--------------------------------------------------------------------------------
/assets/plugin_icons/todo.svg:
--------------------------------------------------------------------------------
1 |
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.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/Flutter.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/Pods-Runner.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/Reachability.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/Toast.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/connectivity.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/flutter_appavailability.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/flutter_statusbarcolor_ns.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/fluttertoast.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/hexcolor.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/image_gallery_saver.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/modal_progress_hud_nsn.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/path_provider.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/permission_handler.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/shared_preferences.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/sqflite.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/ios/build/Pods.build/Release-iphonesimulator/url_launcher.build/dgph:
--------------------------------------------------------------------------------
1 | DGPH1.04Feb 25 202123:22:09 / Users jamaaldeenopasina Java zc_app ios Pods
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------