Showing preview only (425K chars total). Download the full file or copy to clipboard to get everything.
Repository: mogohary99/Flutter-WhatsApp-Clone-Clean-Architecture
Branch: master
Commit: 29d469a24f89
Files: 210
Total size: 364.8 KB
Directory structure:
gitextract_ue6w1k4a/
├── .gitignore
├── .metadata
├── README.md
├── analysis_options.yaml
├── android/
│ ├── .gitignore
│ ├── app/
│ │ ├── build.gradle
│ │ ├── google-services.json
│ │ └── src/
│ │ ├── debug/
│ │ │ └── AndroidManifest.xml
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin/
│ │ │ │ └── mogohary99/
│ │ │ │ └── whatsapp_flutter_clone/
│ │ │ │ └── MainActivity.kt
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ └── launch_background.xml
│ │ │ ├── drawable-v21/
│ │ │ │ └── launch_background.xml
│ │ │ ├── values/
│ │ │ │ └── styles.xml
│ │ │ └── values-night/
│ │ │ └── styles.xml
│ │ └── profile/
│ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle/
│ │ └── wrapper/
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ └── settings.gradle
├── ios/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── LaunchImage.imageset/
│ │ │ ├── Contents.json
│ │ │ └── README.md
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ └── Runner-Bridging-Header.h
│ ├── 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
├── lib/
│ ├── config/
│ │ └── agora_config.dart
│ ├── core/
│ │ ├── enums/
│ │ │ └── messge_type.dart
│ │ ├── error/
│ │ │ ├── exceptions.dart
│ │ │ └── failure.dart
│ │ ├── extensions/
│ │ │ ├── extensions.dart
│ │ │ └── time_extension.dart
│ │ ├── functions/
│ │ │ ├── app_dialogs.dart
│ │ │ ├── date_converter.dart
│ │ │ └── navigator.dart
│ │ ├── network/
│ │ │ └── cache_helper.dart
│ │ ├── services/
│ │ │ └── services_locator.dart
│ │ ├── shared/
│ │ │ ├── bloc_observer.dart
│ │ │ ├── commen.dart
│ │ │ ├── message_replay.dart
│ │ │ └── pop_up_menu_item_model.dart
│ │ ├── usecase/
│ │ │ └── base_use_case.dart
│ │ └── utils/
│ │ ├── constants/
│ │ │ ├── assets_manager.dart
│ │ │ ├── font_manager.dart
│ │ │ ├── strings_manager.dart
│ │ │ └── values_manager.dart
│ │ ├── routes/
│ │ │ └── routes_manager.dart
│ │ └── thems/
│ │ ├── my_colors.dart
│ │ ├── styles_manager.dart
│ │ └── theme_manager.dart
│ ├── features/
│ │ ├── data/
│ │ │ ├── data_source/
│ │ │ │ ├── auth/
│ │ │ │ │ ├── local/
│ │ │ │ │ │ └── auth_local_data_source.dart
│ │ │ │ │ └── remote/
│ │ │ │ │ └── auth_remote_data_source.dart
│ │ │ │ ├── call/
│ │ │ │ │ └── call_data_source.dart
│ │ │ │ ├── chat/
│ │ │ │ │ ├── local/
│ │ │ │ │ │ └── chat_local_data_source.dart
│ │ │ │ │ └── remote/
│ │ │ │ │ └── chat_remote_data_source.dart
│ │ │ │ ├── firebase_storage_remote_data_source.dart
│ │ │ │ └── select_contact/
│ │ │ │ ├── local/
│ │ │ │ │ └── get_contacts_local_data_source.dart
│ │ │ │ └── remote/
│ │ │ │ └── select_contact_remote_data_source.dart
│ │ │ ├── models/
│ │ │ │ ├── call_model.dart
│ │ │ │ ├── contact_chat_model.dart
│ │ │ │ ├── message_model.dart
│ │ │ │ └── user_model.dart
│ │ │ └── repository/
│ │ │ ├── auth_repository.dart
│ │ │ ├── call_repository.dart
│ │ │ ├── chat_repository.dart
│ │ │ └── select_contact_Repository.dart
│ │ ├── domain/
│ │ │ ├── entities/
│ │ │ │ ├── call.dart
│ │ │ │ ├── contact_chat.dart
│ │ │ │ ├── message.dart
│ │ │ │ └── user.dart
│ │ │ ├── repository/
│ │ │ │ ├── base_auth_repository.dart
│ │ │ │ ├── base_call_repository.dart
│ │ │ │ ├── base_chat_repository.dart
│ │ │ │ └── base_select_contact_repository.dart
│ │ │ └── usecases/
│ │ │ ├── auth/
│ │ │ │ ├── get_cached_local_current_uid_usecase.dart
│ │ │ │ ├── get_current_uid_usecase.dart
│ │ │ │ ├── get_current_user_usecase.dart
│ │ │ │ ├── get_user_by_id_usecase.dart
│ │ │ │ ├── save_userdata_to_firebase_usecase.dart
│ │ │ │ ├── set_user_state_usecase.dart
│ │ │ │ ├── sign_in_with_phone_number_usecase.dart
│ │ │ │ ├── signout_usecase.dart
│ │ │ │ ├── update_profile_pic_usecase.dart
│ │ │ │ └── verify_otp_usecase.dart
│ │ │ ├── call/
│ │ │ │ ├── call_stream_usecase.dart
│ │ │ │ ├── end_call_usecase.dart
│ │ │ │ └── make_call_usecase.dart
│ │ │ ├── chat/
│ │ │ │ ├── get_chat_messages_usecase.dart
│ │ │ │ ├── get_contacts_chat_usecase.dart
│ │ │ │ ├── get_num_of_message_not_seen_usecase.dart
│ │ │ │ ├── send_file_message_usecase.dart
│ │ │ │ ├── send_gif_message_usecase.dart
│ │ │ │ ├── send_text_message_usecase.dart
│ │ │ │ └── set_chat_message_seen_usecase.dart
│ │ │ └── select_contact/
│ │ │ ├── get_all_contacts_usecase.dart
│ │ │ ├── get_contact_name_usecase.dart
│ │ │ ├── get_contacts_not_on_whats_usecase.dart
│ │ │ └── get_contacts_on_whats_usecase.dart
│ │ └── presentation/
│ │ ├── components/
│ │ │ ├── contact_profile_pic_dialog.dart
│ │ │ ├── custom_list_tile.dart
│ │ │ ├── custom_network_image.dart
│ │ │ ├── custom_pop_up_menu_button.dart
│ │ │ ├── custom_text.dart
│ │ │ ├── default_button.dart
│ │ │ ├── loader.dart
│ │ │ ├── my_cached_net_image.dart
│ │ │ └── update_profile_pic_model_bottom_sheet.dart
│ │ ├── controllers/
│ │ │ ├── auth_cubit/
│ │ │ │ ├── auth_cubit.dart
│ │ │ │ └── auth_state.dart
│ │ │ ├── bottom_chat_cubit/
│ │ │ │ ├── bottom_chat_cubit.dart
│ │ │ │ └── bottom_chat_state.dart
│ │ │ ├── call_cubit/
│ │ │ │ ├── call_cubit.dart
│ │ │ │ └── call_state.dart
│ │ │ ├── chat_background_cubit/
│ │ │ │ ├── chat_background_cubit.dart
│ │ │ │ └── chat_background_state.dart
│ │ │ ├── chat_cubit/
│ │ │ │ ├── chat_cubit.dart
│ │ │ │ └── chat_state.dart
│ │ │ └── select_contact_cubit/
│ │ │ ├── select_contact_cubit.dart
│ │ │ └── select_contact_state.dart
│ │ └── views/
│ │ ├── calls/
│ │ │ ├── call_pickup_screen.dart
│ │ │ ├── call_screen.dart
│ │ │ └── calls_page.dart
│ │ ├── camera/
│ │ │ ├── camera_screen.dart
│ │ │ ├── components/
│ │ │ │ ├── camera_appbar.dart
│ │ │ │ ├── image_view_top_row_icons.dart
│ │ │ │ ├── select_image_from_gallery_button.dart
│ │ │ │ ├── sending_image_video_bottom_roww_widget.dart
│ │ │ │ └── video_view_top_row_widget.dart
│ │ │ ├── sending_image_view_page.dart
│ │ │ └── sending_video_view_page.dart
│ │ ├── chat/
│ │ │ ├── chat_screen.dart
│ │ │ └── components/
│ │ │ ├── bottom_field/
│ │ │ │ ├── attchment_pop_up.dart
│ │ │ │ ├── bottom_chat_field.dart
│ │ │ │ ├── bottom_chat_with_icon.dart
│ │ │ │ ├── emoji_picker_widget.dart
│ │ │ │ ├── recording_mic.dart
│ │ │ │ ├── recording_mic_widget.dart
│ │ │ │ └── timer.dart
│ │ │ ├── chat_appbar.dart
│ │ │ ├── message/
│ │ │ │ ├── first_message_small_curved_bubble.dart
│ │ │ │ ├── message_replay_card.dart
│ │ │ │ ├── message_replay_preview.dart
│ │ │ │ ├── messages_list.dart
│ │ │ │ ├── my_message_card.dart
│ │ │ │ └── sender_message_card.dart
│ │ │ └── message_content/
│ │ │ ├── audio_player_widget.dart
│ │ │ ├── image_widget.dart
│ │ │ ├── message_content.dart
│ │ │ ├── text_widget.dart
│ │ │ ├── time_sent_widget.dart
│ │ │ └── video_palyer_widget.dart
│ │ ├── contacts_chat/
│ │ │ ├── components/
│ │ │ │ └── chat_contact_card.dart
│ │ │ └── contacts_chat_page.dart
│ │ ├── login/
│ │ │ ├── components/
│ │ │ │ ├── landing_image.dart
│ │ │ │ ├── login_appbar.dart
│ │ │ │ ├── login_profile_pic.dart
│ │ │ │ ├── privacy_policy_link_and_terms_of_service.dart
│ │ │ │ └── sign_out_button.dart
│ │ │ ├── login_landing_screen.dart
│ │ │ ├── login_loading_screen.dart
│ │ │ ├── login_otp_screen.dart
│ │ │ ├── login_profile_info_screen.dart
│ │ │ └── login_screen.dart
│ │ ├── main_layout/
│ │ │ ├── components/
│ │ │ │ ├── fab.dart
│ │ │ │ └── sliver_appbar_actions.dart
│ │ │ └── main_layout_screen.dart
│ │ ├── select_contact/
│ │ │ ├── components/
│ │ │ │ ├── contacts_not_on_whatsapp_list.dart
│ │ │ │ ├── contacts_on_whatsapp_list.dart
│ │ │ │ ├── new_group_contact_community_buttons_List.dart
│ │ │ │ └── select_contact_appbar.dart
│ │ │ └── select_contact_screen.dart
│ │ ├── sender_profile/
│ │ │ ├── components/
│ │ │ │ ├── body.dart
│ │ │ │ ├── encryption_container.dart
│ │ │ │ ├── notification_container.dart
│ │ │ │ ├── phone_and_name.dart
│ │ │ │ ├── sender_profile_icons.dart
│ │ │ │ ├── sender_user_profile_appbar.dart
│ │ │ │ └── status_container.dart
│ │ │ └── sender_profile_page.dart
│ │ ├── settings/
│ │ │ ├── components/
│ │ │ │ ├── about_card.dart
│ │ │ │ ├── name_card.dart
│ │ │ │ ├── phone_card.dart
│ │ │ │ ├── profile_card.dart
│ │ │ │ ├── profile_pic_circle_card.dart
│ │ │ │ ├── setting_bottom_text.dart
│ │ │ │ └── settings_item_card.dart
│ │ │ ├── profile_screen.dart
│ │ │ └── settings_screen.dart
│ │ ├── splash/
│ │ │ ├── components/
│ │ │ │ ├── bottom_text.dart
│ │ │ │ └── splash_icon.dart
│ │ │ └── splash_screen.dart
│ │ ├── status/
│ │ │ └── status_page.dart
│ │ └── wallpaper/
│ │ └── wallpaper_screen.dart
│ ├── info.dart
│ └── main.dart
├── pubspec.yaml
└── test/
└── widget_test.dart
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Miscellaneous
*.class
*.log
*.pyc
*.swp
.DS_Store
.atom/
.buildlog/
.history
.svn/
migrate_working_dir/
# IntelliJ related
*.iml
*.ipr
*.iws
.idea/
# The .vscode folder contains launch configuration and tasks you configure in
# VS Code which you may wish to be included in version control, so this line
# is commented out by default.
#.vscode/
# Flutter/Dart/Pub related
**/doc/api/
**/ios/Flutter/.last_build_id
.dart_tool/
.flutter-plugins
.flutter-plugins-dependencies
.packages
.pub-cache/
.pub/
/build/
# Symbolication related
app.*.symbols
# Obfuscation related
app.*.map.json
# Android Studio will place build artifacts here
/android/app/debug
/android/app/profile
/android/app/release
================================================
FILE: .metadata
================================================
# This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc.
#
# This file should be version controlled.
version:
revision: e5c8614e789b1d3f7ef8d9a77295b884b5b396e0
channel: master
project_type: app
# Tracks metadata for the flutter migrate command
migration:
platforms:
- platform: root
create_revision: e5c8614e789b1d3f7ef8d9a77295b884b5b396e0
base_revision: e5c8614e789b1d3f7ef8d9a77295b884b5b396e0
- platform: android
create_revision: e5c8614e789b1d3f7ef8d9a77295b884b5b396e0
base_revision: e5c8614e789b1d3f7ef8d9a77295b884b5b396e0
- platform: ios
create_revision: e5c8614e789b1d3f7ef8d9a77295b884b5b396e0
base_revision: e5c8614e789b1d3f7ef8d9a77295b884b5b396e0
# User provided section
# List of Local paths (relative to this file) that should be
# ignored by the migrate tool.
#
# Files that are not part of the templates will be ignored by default.
unmanaged_files:
- 'lib/main.dart'
- 'ios/Runner.xcodeproj/project.pbxproj'
================================================
FILE: README.md
================================================
# Flutter-WhatsApp-Clone-Clean-Architecture
WhatsApp Clone with Flutter, Firebase, Bloc, Clean Code & Clean Architecture🔥🔥❤️
## [Watch it on YouTube](https://www.youtube.com/watch?v=INxbhrOeiuk)
## Some of the cool features applied in the project:
- Flutter bloc(cubit)
- Enhanced clean architecture.
- Firebase Firestore, Firebase Storage, and Firebase Auth.
- Real-Time Changes from Firebase using Streams.
- Phone Number Authentication
- 1-1 Chatting with Contacts Only
- Text, Image, GIF, Audio(Recording), Video & Emoji Sharing
- Online/Offline Status
- Seen Message
- Replying to Messages
- Auto Scroll on New Messages
- Custom gallery & camera & video display
Now, I am working on the status and video calling.
## Getting Started
This project is a starting point for a Flutter application.
A few resources to get you started if this is your first Flutter project:
- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab)
- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook)
For help getting started with Flutter development, view the
[online documentation](https://docs.flutter.dev/), which offers tutorials,
samples, guidance on mobile development, and a full API reference.
================================================
FILE: analysis_options.yaml
================================================
# This file configures the analyzer, which statically analyzes Dart code to
# check for errors, warnings, and lints.
#
# The issues identified by the analyzer are surfaced in the UI of Dart-enabled
# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be
# invoked from the command line by running `flutter analyze`.
# The following line activates a set of recommended lints for Flutter apps,
# packages, and plugins designed to encourage good coding practices.
include: package:flutter_lints/flutter.yaml
linter:
# The lint rules applied to this project can be customized in the
# section below to disable rules from the `package:flutter_lints/flutter.yaml`
# included above or to enable additional rules. A list of all available lints
# and their documentation is published at
# https://dart-lang.github.io/linter/lints/index.html.
#
# Instead of disabling a lint rule for the entire project in the
# section below, it can also be suppressed for a single line of code
# or a specific dart file by using the `// ignore: name_of_lint` and
# `// ignore_for_file: name_of_lint` syntax on the line or in the file
# producing the lint.
rules:
# avoid_print: false # Uncomment to disable the `avoid_print` rule
# prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule
# Additional information about this file can be found at
# https://dart.dev/guides/language/analysis-options
================================================
FILE: android/.gitignore
================================================
gradle-wrapper.jar
/.gradle
/captures/
/gradlew
/gradlew.bat
/local.properties
GeneratedPluginRegistrant.java
# Remember to never publicly share your keystore.
# See https://flutter.dev/docs/deployment/android#reference-the-keystore-from-the-app
key.properties
**/*.keystore
**/*.jks
================================================
FILE: android/app/build.gradle
================================================
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
apply plugin: 'com.google.gms.google-services'
android {
// compileSdkVersion flutter.compileSdkVersion
compileSdkVersion 33
ndkVersion flutter.ndkVersion
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
applicationId "mogohary99.whatsapp_flutter_clone"
// You can update the following values to match your application needs.
// For more information, see: https://docs.flutter.dev/deployment/android#reviewing-the-gradle-build-configuration.
minSdkVersion 21
targetSdkVersion flutter.targetSdkVersion
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
multiDexEnabled true
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
}
flutter {
source '../..'
}
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:multidex:2.0.1'
implementation platform('com.google.firebase:firebase-bom:31.0.2')
}
================================================
FILE: android/app/google-services.json
================================================
{
"project_info": {
"project_number": "528108582188",
"project_id": "whatsapp-8d793",
"storage_bucket": "whatsapp-8d793.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:528108582188:android:6544c1493d3433f4f26889",
"android_client_info": {
"package_name": "mogohary99.whatsapp_flutter_clone"
}
},
"oauth_client": [
{
"client_id": "528108582188-0d3v7bqfv5vtdhc08th823se96cgsqk0.apps.googleusercontent.com",
"client_type": 1,
"android_info": {
"package_name": "mogohary99.whatsapp_flutter_clone",
"certificate_hash": "09199a03d91f7c6cd3061042942deb2c3f3a93d0"
}
},
{
"client_id": "528108582188-nveih6hahfhv7sh0cep1kdj8rjgm1loa.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyBa-_MafiWD6xzy9aAgoK1hfQ6yjp3u_zg"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "528108582188-nveih6hahfhv7sh0cep1kdj8rjgm1loa.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}
================================================
FILE: android/app/src/debug/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mogohary99.whatsapp_flutter_clone">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
================================================
FILE: android/app/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mogohary99.whatsapp_flutter_clone">
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- The Agora SDK requires Bluetooth permissions in case users are using Bluetooth devices.-->
<uses-permission android:name="android.permission.BLUETOOTH" />
<application
android:label="whatsapp_flutter_clone"
android:name="${applicationName}"
android:icon="@mipmap/ic_launcher">
<activity
android:name=".MainActivity"
android:exported="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize">
<!-- Specifies an Android theme to apply to this Activity as soon as
the Android process has started. This theme is visible to the user
while the Flutter UI initializes. After that, this theme continues
to determine the Window background behind the Flutter UI. -->
<meta-data
android:name="io.flutter.embedding.android.NormalTheme"
android:resource="@style/NormalTheme"
/>
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity
android:name="com.yalantis.ucrop.UCropActivity"
android:screenOrientation="portrait"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>
<!-- Don't delete the meta-data below.
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
<meta-data
android:name="flutterEmbedding"
android:value="2" />
</application>
</manifest>
================================================
FILE: android/app/src/main/kotlin/mogohary99/whatsapp_flutter_clone/MainActivity.kt
================================================
package mogohary99.whatsapp_flutter_clone
import io.flutter.embedding.android.FlutterActivity
class MainActivity: FlutterActivity() {
}
================================================
FILE: android/app/src/main/res/drawable/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/white" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
================================================
FILE: android/app/src/main/res/drawable-v21/launch_background.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<!-- Modify this file to customize your launch splash screen -->
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="?android:colorBackground" />
<!-- You can insert your own image assets here -->
<!-- <item>
<bitmap
android:gravity="center"
android:src="@mipmap/launch_image" />
</item> -->
</layer-list>
================================================
FILE: android/app/src/main/res/values/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>
================================================
FILE: android/app/src/main/res/values-night/styles.xml
================================================
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
<!-- Show a splash screen on the activity. Automatically removed when
the Flutter engine draws its first frame -->
<item name="android:windowBackground">@drawable/launch_background</item>
</style>
<!-- Theme applied to the Android Window as soon as the process has started.
This theme determines the color of the Android Window while your
Flutter UI initializes, as well as behind your Flutter UI while its
running.
This Theme is only used starting with V2 of Flutter's Android embedding. -->
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
<item name="android:windowBackground">?android:colorBackground</item>
</style>
</resources>
================================================
FILE: android/app/src/profile/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="mogohary99.whatsapp_flutter_clone">
<!-- The INTERNET permission is required for development. Specifically,
the Flutter tool needs it to communicate with the running application
to allow setting breakpoints, to provide hot reload, etc.
-->
<uses-permission android:name="android.permission.INTERNET"/>
</manifest>
================================================
FILE: android/build.gradle
================================================
buildscript {
ext.kotlin_version = '1.7.10'
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:7.2.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
classpath 'com.google.gms:google-services:4.3.13'
}
}
allprojects {
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
task clean(type: Delete) {
delete rootProject.buildDir
}
================================================
FILE: android/gradle/wrapper/gradle-wrapper.properties
================================================
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-all.zip
================================================
FILE: android/gradle.properties
================================================
org.gradle.jvmargs=-Xmx1536M
android.useAndroidX=true
android.enableJetifier=true
================================================
FILE: android/settings.gradle
================================================
include ':app'
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
def properties = new Properties()
assert localPropertiesFile.exists()
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
def flutterSdkPath = properties.getProperty("flutter.sdk")
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
================================================
FILE: ios/.gitignore
================================================
**/dgph
*.mode1v3
*.mode2v3
*.moved-aside
*.pbxuser
*.perspectivev3
**/*sync/
.sconsign.dblite
.tags*
**/.vagrant/
**/DerivedData/
Icon?
**/Pods/
**/.symlinks/
profile
xcuserdata
**/.generated/
Flutter/App.framework
Flutter/Flutter.framework
Flutter/Flutter.podspec
Flutter/Generated.xcconfig
Flutter/ephemeral/
Flutter/app.flx
Flutter/app.zip
Flutter/flutter_assets/
Flutter/flutter_export_environment.sh
ServiceDefinitions.json
Runner/GeneratedPluginRegistrant.*
# Exceptions to above rules.
!default.mode1v3
!default.mode2v3
!default.pbxuser
!default.perspectivev3
================================================
FILE: ios/Flutter/AppFrameworkInfo.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>CFBundleExecutable</key>
<string>App</string>
<key>CFBundleIdentifier</key>
<string>io.flutter.flutter.app</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>App</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0</string>
<key>MinimumOSVersion</key>
<string>11.0</string>
</dict>
</plist>
================================================
FILE: ios/Flutter/Debug.xcconfig
================================================
#include "Generated.xcconfig"
================================================
FILE: ios/Flutter/Release.xcconfig
================================================
#include "Generated.xcconfig"
================================================
FILE: ios/Runner/AppDelegate.swift
================================================
import UIKit
import Flutter
@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
override func application(
_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool {
GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions)
}
}
================================================
FILE: ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "20x20",
"idiom" : "iphone",
"filename" : "Icon-App-20x20@3x.png",
"scale" : "3x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-App-29x29@3x.png",
"scale" : "3x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-App-40x40@3x.png",
"scale" : "3x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@2x.png",
"scale" : "2x"
},
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-App-60x60@3x.png",
"scale" : "3x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@1x.png",
"scale" : "1x"
},
{
"size" : "20x20",
"idiom" : "ipad",
"filename" : "Icon-App-20x20@2x.png",
"scale" : "2x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@1x.png",
"scale" : "1x"
},
{
"size" : "29x29",
"idiom" : "ipad",
"filename" : "Icon-App-29x29@2x.png",
"scale" : "2x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@1x.png",
"scale" : "1x"
},
{
"size" : "40x40",
"idiom" : "ipad",
"filename" : "Icon-App-40x40@2x.png",
"scale" : "2x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@1x.png",
"scale" : "1x"
},
{
"size" : "76x76",
"idiom" : "ipad",
"filename" : "Icon-App-76x76@2x.png",
"scale" : "2x"
},
{
"size" : "83.5x83.5",
"idiom" : "ipad",
"filename" : "Icon-App-83.5x83.5@2x.png",
"scale" : "2x"
},
{
"size" : "1024x1024",
"idiom" : "ios-marketing",
"filename" : "Icon-App-1024x1024@1x.png",
"scale" : "1x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"filename" : "LaunchImage.png",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "LaunchImage@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md
================================================
# Launch Screen Assets
You can customize the launch screen with your own desired assets by replacing the image files in this directory.
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.
================================================
FILE: ios/Runner/Base.lproj/LaunchScreen.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="12121" systemVersion="16G29" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="12089"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Ydg-fD-yQy"/>
<viewControllerLayoutGuide type="bottom" id="xbc-2k-c8Z"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" image="LaunchImage" translatesAutoresizingMaskIntoConstraints="NO" id="YRO-k0-Ey4">
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="1a2-6s-vTC"/>
<constraint firstItem="YRO-k0-Ey4" firstAttribute="centerY" secondItem="Ze5-6b-2t3" secondAttribute="centerY" id="4X2-HB-R7a"/>
</constraints>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
<resources>
<image name="LaunchImage" width="168" height="185"/>
</resources>
</document>
================================================
FILE: ios/Runner/Base.lproj/Main.storyboard
================================================
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15F34" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
<!--Flutter View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="FlutterViewController" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/>
<viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>
================================================
FILE: ios/Runner/Info.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
<string>Whatsapp Flutter Clone</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>whatsapp_flutter_clone</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>$(FLUTTER_BUILD_NAME)</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>$(FLUTTER_BUILD_NUMBER)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>UIMainStoryboardFile</key>
<string>Main</string>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
<key>CADisableMinimumFrameDurationOnPhone</key>
<true/>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
</dict>
</plist>
================================================
FILE: ios/Runner/Runner-Bridging-Header.h
================================================
#import "GeneratedPluginRegistrant.h"
================================================
FILE: ios/Runner.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; };
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
9705A1C41CF9048500538489 /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = "<group>"; };
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = "<group>"; };
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = "<group>"; };
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = "<group>"; };
74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = "<group>"; };
9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = "<group>"; };
9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = "<group>"; };
97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
97C146EB1CF9000F007C117D /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
9740EEB11CF90186004384FC /* Flutter */ = {
isa = PBXGroup;
children = (
3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
9740EEB21CF90195004384FC /* Debug.xcconfig */,
7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
9740EEB31CF90195004384FC /* Generated.xcconfig */,
);
name = Flutter;
sourceTree = "<group>";
};
97C146E51CF9000F007C117D = {
isa = PBXGroup;
children = (
9740EEB11CF90186004384FC /* Flutter */,
97C146F01CF9000F007C117D /* Runner */,
97C146EF1CF9000F007C117D /* Products */,
);
sourceTree = "<group>";
};
97C146EF1CF9000F007C117D /* Products */ = {
isa = PBXGroup;
children = (
97C146EE1CF9000F007C117D /* Runner.app */,
);
name = Products;
sourceTree = "<group>";
};
97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup;
children = (
97C146FA1CF9000F007C117D /* Main.storyboard */,
97C146FD1CF9000F007C117D /* Assets.xcassets */,
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
97C147021CF9000F007C117D /* Info.plist */,
1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */,
);
path = Runner;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
97C146ED1CF9000F007C117D /* Runner */ = {
isa = PBXNativeTarget;
buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
buildPhases = (
9740EEB61CF901F6004384FC /* Run Script */,
97C146EA1CF9000F007C117D /* Sources */,
97C146EB1CF9000F007C117D /* Frameworks */,
97C146EC1CF9000F007C117D /* Resources */,
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
);
buildRules = (
);
dependencies = (
);
name = Runner;
productName = Runner;
productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
LastUpgradeCheck = 1300;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
CreatedOnToolsVersion = 7.3.1;
LastSwiftMigration = 1100;
};
};
};
buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 97C146E51CF9000F007C117D;
productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
97C146ED1CF9000F007C117D /* Runner */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
97C146EC1CF9000F007C117D /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Thin Binary";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin";
};
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
);
name = "Run Script";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
97C146EA1CF9000F007C117D /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXVariantGroup section */
97C146FA1CF9000F007C117D /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C146FB1CF9000F007C117D /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
97C147001CF9000F007C117D /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
249021D3217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Profile;
};
249021D4217E4FDB00AE95B9 /* Profile */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = mogohary99.whatsappFlutterClone;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Profile;
};
97C147031CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
97C147041CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 11.0;
MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos;
SUPPORTED_PLATFORMS = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
97C147061CF9000F007C117D /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = mogohary99.whatsappFlutterClone;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Debug;
};
97C147071CF9000F007C117D /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_MODULES = YES;
CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
ENABLE_BITCODE = NO;
INFOPLIST_FILE = Runner/Info.plist;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = mogohary99.whatsappFlutterClone;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h";
SWIFT_VERSION = 5.0;
VERSIONING_SYSTEM = "apple-generic";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147031CF9000F007C117D /* Debug */,
97C147041CF9000F007C117D /* Release */,
249021D3217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
isa = XCConfigurationList;
buildConfigurations = (
97C147061CF9000F007C117D /* Debug */,
97C147071CF9000F007C117D /* Release */,
249021D4217E4FDB00AE95B9 /* Profile */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 97C146E61CF9000F007C117D /* Project object */;
}
================================================
FILE: ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
================================================
FILE: ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
================================================
FILE: ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>
================================================
FILE: ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1300"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</MacroExpansion>
<Testables>
</Testables>
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Profile"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "97C146ED1CF9000F007C117D"
BuildableName = "Runner.app"
BlueprintName = "Runner"
ReferencedContainer = "container:Runner.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
================================================
FILE: ios/Runner.xcworkspace/contents.xcworkspacedata
================================================
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:Runner.xcodeproj">
</FileRef>
</Workspace>
================================================
FILE: ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
================================================
FILE: ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings
================================================
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>PreviewsEnabled</key>
<false/>
</dict>
</plist>
================================================
FILE: lib/config/agora_config.dart
================================================
class AgoraConfig{
static const String token = '';
static const String appId = '97bc1546a8174ed0a7a7c9acdfca61f5';
static const String appCertificate = '56cae9b6d2854e0a833f11c5ccc61cbe';
}
================================================
FILE: lib/core/enums/messge_type.dart
================================================
enum MessageType{
text('text'),
image('image'),
gif('gif'),
video('video'),
audio('audio'),
location('location'),
contact('contact'),
poll('poll');
const MessageType(this.type);
final String type;
}
extension ConvertMessage on String{
MessageType toEnum(){
switch(this){
case 'text':
return MessageType.text;
case 'image':
return MessageType.image;
case 'gif':
return MessageType.gif;
case 'video':
return MessageType.video;
case 'audio':
return MessageType.audio;
case 'location':
return MessageType.location;
case 'contact':
return MessageType.contact;
case 'poll':
return MessageType.poll;
default:
return MessageType.text;
}
}
}
================================================
FILE: lib/core/error/exceptions.dart
================================================
class LocalDatabaseException implements Exception {
final String message;
const LocalDatabaseException({
required this.message,
});
}
class CachedException implements Exception {
final String message;
const CachedException({
required this.message,
});
}
================================================
FILE: lib/core/error/failure.dart
================================================
import 'package:equatable/equatable.dart';
abstract class Failure extends Equatable {
final String message;
const Failure(this.message);
@override
List<Object> get props => [message];
}
class ServerFailure extends Failure{
const ServerFailure(super.message);
}
class LocalDatabaseFailure extends Failure{
const LocalDatabaseFailure(super.message);
}
class CachedFailure extends Failure{
const CachedFailure(super.message);
}
================================================
FILE: lib/core/extensions/extensions.dart
================================================
import 'package:flutter/material.dart';
extension ContextExtension on BuildContext {
MediaQueryData get mediaQuery => MediaQuery.of(this);
TextTheme get textTheme => Theme.of(this).textTheme;
ThemeData get theme => Theme.of(this);
ColorScheme get colorScheme => Theme.of(this).colorScheme;
}
extension MediaQueryExtension on BuildContext {
Size get size => mediaQuery.size;
double height(double value) => mediaQuery.size.height * value;
double width(double value) => mediaQuery.size.width * value;
}
extension TextThemeExtension on BuildContext {
TextStyle? get displayLarge => textTheme.displayLarge;
TextStyle? get displayMedium => textTheme.displayMedium;
TextStyle? get displaySmall => textTheme.displaySmall;
TextStyle? get headlineLarge => textTheme.headlineLarge;
TextStyle? get headlineMedium => textTheme.headlineMedium;
TextStyle? get headlineSmall => textTheme.headlineSmall;
TextStyle? get titleLarge => textTheme.titleLarge;
TextStyle? get titleMedium => textTheme.titleMedium;
TextStyle? get titleSmall => textTheme.titleSmall;
TextStyle? get bodyLarge => textTheme.bodyLarge;
TextStyle? get bodyMedium => textTheme.bodyMedium;
TextStyle? get bodySmall => textTheme.bodySmall;
TextStyle? get labelLarge => textTheme.labelLarge;
TextStyle? get labelSmall => textTheme.labelSmall;
}
================================================
FILE: lib/core/extensions/time_extension.dart
================================================
import '/core/functions/date_converter.dart';
extension DateUtil on DateTime {
String get lastSeen {
return 'last seen ${DateConverter.getLastSeenDayTime(this)} at ${DateConverter.dateConverterHoursAmPmMode(this)}';
}
String get amPmMode{
return DateConverter.dateConverterHoursAmPmMode(this);
}
String get chatDayTime{
return DateConverter.getChatDayTime(this);
}
String get chatContactTime{
return DateConverter.getChatContactTime(this);
}
bool isSameDay(DateTime day2){
return DateConverter.isSameDay(this, day2);
}
}
================================================
FILE: lib/core/functions/app_dialogs.dart
================================================
import 'package:flutter/material.dart';
import '/core/extensions/extensions.dart';
import '../utils/constants/strings_manager.dart';
import '../utils/constants/values_manager.dart';
import 'navigator.dart';
class AppDialogs {
static Future<void> permissionDialog(
BuildContext context, {
required VoidCallback onContinuePressed,
required String contentText,
}) {
return _showMyDialog(
context: context,
contentPadding: EdgeInsets.zero,
borderRadius: AppSize.s8,
content: Column(
children: [
Container(
width: double.infinity,
height: AppSize.s120,
decoration: BoxDecoration(
//color: AppColors.primary,
color: context.colorScheme.secondaryContainer,
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(AppSize.s8),
topRight: Radius.circular(AppSize.s8),
),
),
child: const Icon(
Icons.phone,
color: Colors.white,
size: 50,
),
),
Padding(
padding: const EdgeInsets.symmetric(
horizontal: AppPadding.p28,
vertical: AppPadding.p28,
),
child: Text(
contentText,
//style: Theme.of(context).textTheme.bodyLarge,
style: context.titleSmall!.copyWith(
height: 1.5,
),
),
)
],
),
actions: <Widget>[
TextButton(
child: const Text(
'Not Now',
),
onPressed: () {
navigatePop(context);
},
),
TextButton(
onPressed: onContinuePressed,
child: const Text(
'Continue',
),
),
],
);
}
static Future<void> submitPhoneDialog({
required BuildContext context,
required String phoneNumber,
required VoidCallback okPressed,
}) {
return _showMyDialog(
context: context,
actionSpacer: true,
borderRadius: 3,
contentPadding: const EdgeInsets.only(
top: AppPadding.p20,
right: AppPadding.p20,
left: AppPadding.p20,
),
content: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Text(AppStrings.youEnteredThePhoneNum),
Padding(
padding: const EdgeInsets.symmetric(
vertical: AppPadding.p20,
),
child: Text(
phoneNumber,
style: context.titleMedium,
),
),
const Text(AppStrings.isThisOk),
],
),
actions: <Widget>[
TextButton(
child: Text(
AppStrings.edit,
style: TextStyle(
color: context.colorScheme.secondary,
fontWeight: FontWeight.w500,
),
),
onPressed: () {
Navigator.of(context).pop();
},
),
TextButton(
onPressed: okPressed,
child: Text(
AppStrings.ok,
style: TextStyle(
color: context.colorScheme.secondary,
fontWeight: FontWeight.w500,
),
),
),
],
);
}
}
Future<void> _showMyDialog({
required BuildContext context,
double borderRadius = 0,
required Widget content,
required List<Widget> actions,
bool actionSpacer = false,
EdgeInsetsGeometry? contentPadding,
}) async {
return showDialog<void>(
context: context,
barrierDismissible: false, // user must tap button!
builder: (BuildContext context) {
return AlertDialog(
contentPadding: contentPadding,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.all(
Radius.circular(borderRadius),
),
),
content: SingleChildScrollView(
child: content,
),
actions: actions,
actionsAlignment: actionSpacer
? MainAxisAlignment.spaceBetween
: MainAxisAlignment.end,
);
},
);
}
================================================
FILE: lib/core/functions/date_converter.dart
================================================
class DateConverter{
static String getChatContactTime(DateTime dateTime){
DateTime now = DateTime.now();
DateTime yesterday = now.subtract(const Duration(days: 1));
DateTime localDateTime = dateTime.toLocal();
if (localDateTime.day == now.day && localDateTime.month == now.month && localDateTime.year == now.year) {
return dateConverterHoursAmPmMode(dateTime);
}
else if (localDateTime.day == yesterday.day && localDateTime.month == yesterday.month && localDateTime.year == yesterday.year) {
return 'Yesterday';
}else{
return dateConverterMonthNum(dateTime.toString());
}
}
static String getChatDayTime(DateTime dateTime){
DateTime now = DateTime.now();
DateTime yesterday = now.subtract(const Duration(days: 1));
DateTime localDateTime = dateTime.toLocal();
if (localDateTime.day == now.day && localDateTime.month == now.month && localDateTime.year == now.year) {
return 'Today';
}
else if (localDateTime.day == yesterday.day && localDateTime.month == yesterday.month && localDateTime.year == yesterday.year) {
return 'Yesterday';
}else{
return dateConverterMonth(dateTime.toString());
}
}
static String getLastSeenDayTime(DateTime dateTime){
DateTime now = DateTime.now();
DateTime yesterday = now.subtract(const Duration(days: 1));
DateTime localDateTime = dateTime.toLocal();
if (localDateTime.day == now.day && localDateTime.month == now.month && localDateTime.year == now.year) {
return 'today';
}
else if (localDateTime.day == yesterday.day && localDateTime.month == yesterday.month && localDateTime.year == yesterday.year) {
return 'yesterday';
}else{
return dateConverterMonthNum(dateTime.toString());
}
}
static bool isSameDay(DateTime nowTime,DateTime priviesTime){
DateTime now = nowTime.toLocal();
DateTime privies = priviesTime.toLocal();
if(now.day ==privies.day && now.month == privies.month && now.year == privies.year){
return true;
}
return false;
}
//2022-12-07 12:01:17.696
static String dateConverterHoursAmPmMode(DateTime dateTime){
String string = dateTime.toString();
int i = 0;
String s = "";
int mode = int.parse(string[11] + string[12]);
List<String> duration = ['am', 'pm'];
if(mode > 11) {
if(mode != 12) mode -= 12;
mode < 10 ? s += '0$mode' : s += '$mode' ;
for (i = 13; i < 16; ++i) {
s += string.split('')[i];
}
s += ' ${duration[1]}';
}
else{
for (i = 11; i < 16; ++i) {
s += string.split('')[i];
}
s += ' ${duration[0]}';
}
return s;
}
//2022-12-07 12:01:17.696
static String dateConverterMonth(String string){
int i = 0;
String s = "";
String monthNum = string.split('')[5] + string.split('')[6];
String dayNum = string.split('')[8] + string.split('')[9];
List <String> m = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
List <String> mN = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];
for (i = 0; i < 12; ++i) {
if (monthNum == mN[i]) {
s = '$dayNum ${m[i]} ';
break;
}
}
for (i = 0; i < 4; ++i) {
s += string.split('')[i];
}
return s;
}
static String dateConverterMonthNum(String string){
int i = 0;
String s = "";
String monthNum = string.split('')[5] + string.split('')[6];
String dayNum = string.split('')[8] + string.split('')[9];
List <String> m = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
List <String> mN = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];
for (i = 0; i < 12; ++i) {
if (monthNum == mN[i]) {
s = '$dayNum/${mN[i]}/';
break;
}
}
for (i = 2; i < 4; ++i) {
s += string.split('')[i];
}
return s;
}
static String dateConverterOnly(String string) {
String s = "";
s = string.split("T")[0];
return s;
}
static String dateConverterSince(String string){
String s = "";
int apiDay = int.parse(string.split("")[8] + string.split("")[9]);
int currentDay = DateTime.now().day;
if(currentDay == apiDay) s = "Today";
else if(currentDay == apiDay + 1) s = "Yesterday";
else if(currentDay > apiDay + 1) s = "Since ${currentDay - apiDay} days";
return s;
}
static String dateConverterHours24Mode(String string){
int i = 0;
String s = "";
for (i = 11; i < 16; ++i) {
s += string.split('')[i];
}
return s;
}
}
================================================
FILE: lib/core/functions/navigator.dart
================================================
import 'package:flutter/material.dart';
void navigatePop(
BuildContext context,
) {
Navigator.of(context).pop();
}
void navigateAndRemove(
BuildContext context,
String routeName, {
Object? arguments,
}) {
Navigator.of(context).pushNamedAndRemoveUntil(
routeName,
arguments: arguments,
(route) => false,
);
}
Future<dynamic> navigateTo(
BuildContext context,
String routeName, {
Object? arguments,
}) {
return Navigator.of(context).pushNamed(
routeName,
arguments: arguments,
);
}
void navigateAndReplace(
BuildContext context,
String routeName, {
Object? arguments,
}) {
Navigator.of(context).pushReplacementNamed(
routeName,
arguments: arguments,
);
}
================================================
FILE: lib/core/network/cache_helper.dart
================================================
import 'package:shared_preferences/shared_preferences.dart';
class CacheHelper {
final SharedPreferences _sharedPreferences;
CacheHelper(this._sharedPreferences);
dynamic getData({required String key}) {
return _sharedPreferences.get(key);
}
Future<bool> saveData({
required String key,
required dynamic value,
}) async {
if (value is String) return await _sharedPreferences.setString(key, value);
if (value is double) return await _sharedPreferences.setDouble(key, value);
if (value is bool) return await _sharedPreferences.setBool(key, value);
return await _sharedPreferences.setInt(key, value);
}
void removeData({required String key})async{
await _sharedPreferences.remove(key);
}
}
================================================
FILE: lib/core/services/services_locator.dart
================================================
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:get_it/get_it.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:whatsapp_flutter_clone/features/data/data_source/call/call_data_source.dart';
import 'package:whatsapp_flutter_clone/features/data/repository/call_repository.dart';
import 'package:whatsapp_flutter_clone/features/domain/repository/base_call_repository.dart';
import 'package:whatsapp_flutter_clone/features/domain/usecases/call/call_stream_usecase.dart';
import 'package:whatsapp_flutter_clone/features/domain/usecases/call/end_call_usecase.dart';
import 'package:whatsapp_flutter_clone/features/domain/usecases/call/make_call_usecase.dart';
import 'package:whatsapp_flutter_clone/features/presentation/controllers/call_cubit/call_cubit.dart';
import 'package:whatsapp_flutter_clone/features/presentation/controllers/chat_background_cubit/chat_background_cubit.dart';
import '../../features/data/data_source/auth/local/auth_local_data_source.dart';
import '../../features/data/data_source/auth/remote/auth_remote_data_source.dart';
import '../../features/data/data_source/chat/remote/chat_remote_data_source.dart';
import '../../features/data/data_source/select_contact/local/get_contacts_local_data_source.dart';
import '../../features/data/data_source/select_contact/remote/select_contact_remote_data_source.dart';
import '../../features/data/repository/auth_repository.dart';
import '../../features/data/repository/chat_repository.dart';
import '../../features/data/repository/select_contact_Repository.dart';
import '../../features/domain/repository/base_auth_repository.dart';
import '../../features/domain/repository/base_chat_repository.dart';
import '../../features/domain/repository/base_select_contact_repository.dart';
import '../../features/domain/usecases/auth/get_cached_local_current_uid_usecase.dart';
import '../../features/domain/usecases/auth/get_current_uid_usecase.dart';
import '../../features/domain/usecases/auth/get_current_user_usecase.dart';
import '../../features/domain/usecases/auth/get_user_by_id_usecase.dart';
import '../../features/domain/usecases/auth/save_userdata_to_firebase_usecase.dart';
import '../../features/domain/usecases/auth/set_user_state_usecase.dart';
import '../../features/domain/usecases/auth/sign_in_with_phone_number_usecase.dart';
import '../../features/domain/usecases/auth/signout_usecase.dart';
import '../../features/domain/usecases/auth/update_profile_pic_usecase.dart';
import '../../features/domain/usecases/auth/verify_otp_usecase.dart';
import '../../features/domain/usecases/chat/get_chat_messages_usecase.dart';
import '../../features/domain/usecases/chat/get_contacts_chat_usecase.dart';
import '../../features/domain/usecases/chat/get_num_of_message_not_seen_usecase.dart';
import '../../features/domain/usecases/chat/send_file_message_usecase.dart';
import '../../features/domain/usecases/chat/send_gif_message_usecase.dart';
import '../../features/domain/usecases/chat/send_text_message_usecase.dart';
import '../../features/domain/usecases/chat/set_chat_message_seen_usecase.dart';
import '../../features/domain/usecases/select_contact/get_all_contacts_usecase.dart';
import '../../features/domain/usecases/select_contact/get_contacts_not_on_whats_usecase.dart';
import '../../features/domain/usecases/select_contact/get_contacts_on_whats_usecase.dart';
import '../../features/presentation/controllers/auth_cubit/auth_cubit.dart';
import '../../features/presentation/controllers/bottom_chat_cubit/bottom_chat_cubit.dart';
import '../../features/presentation/controllers/chat_cubit/chat_cubit.dart';
import '../../features/presentation/controllers/select_contact_cubit/select_contact_cubit.dart';
import '../network/cache_helper.dart';
final sl = GetIt.instance;
Future<void> init() async {
///shared prefs
final sharedPref = await SharedPreferences.getInstance();
sl.registerLazySingleton<SharedPreferences>(() => sharedPref);
sl.registerLazySingleton<CacheHelper>(() => CacheHelper(sl()));
///cubit
sl.registerFactory(
() => AuthCubit(sl(), sl(), sl(), sl(), sl(), sl(), sl(), sl(), sl()));
sl.registerFactory(() => SelectContactCubit(sl(), sl(), sl()));
sl.registerFactory(() => ChatCubit(sl(), sl(), sl(), sl(), sl(), sl(),sl()));
sl.registerLazySingleton(() => BottomChatCubit());
sl.registerLazySingleton(() => ChatBackgroundCubit());
sl.registerLazySingleton(() => CallCubit(sl(), sl(), sl()));
///use case
/////////auth
sl.registerLazySingleton(() => SignInWithPhoneNumberUseCase(sl()));
sl.registerLazySingleton(() => VerifyOtpUseCase(sl()));
sl.registerLazySingleton(() => SaveUserDataToFirebaseUseCase(sl()));
sl.registerLazySingleton(() => GetCurrentUidUseCase(sl()));
sl.registerLazySingleton(() => SignOutUseCase(sl()));
sl.registerLazySingleton(() => GetCachedLocalCurrentUidUseCase(sl()));
sl.registerLazySingleton(() => GetUserByIdUseCase(sl()));
sl.registerLazySingleton(() => SetUserStateUseCase(sl()));
sl.registerLazySingleton(() => GetCurrentUserUseCase(sl()));
sl.registerLazySingleton(() => UpdateProfilePicUseCase(sl()));
////////select contact
sl.registerLazySingleton(() => GetAllContactsUseCase(sl()));
sl.registerLazySingleton(() => GetContactsOnWhatsUseCase(sl()));
sl.registerLazySingleton(() => GetContactsNotOnWhatsUseCase(sl()));
///////chat
sl.registerLazySingleton(() => SendTextMessageUseCase(sl()));
sl.registerLazySingleton(() => GetContactsChatUseCase(sl()));
sl.registerLazySingleton(() => GetChatMessagesUseCase(sl()));
sl.registerLazySingleton(() => SetChatMessageSeenUseCase(sl()));
sl.registerLazySingleton(() => SendGifMessageUseCase(sl()));
sl.registerLazySingleton(() => SendFileMessageUseCase(sl()));
sl.registerLazySingleton(() => GetNumberOfMessageNotSeenUseCase(sl()));
// sl.registerLazySingleton(() => GetContactNameUseCase(sl()));
/////call
sl.registerLazySingleton(() => CallStreamUseCase(sl()));
sl.registerLazySingleton(() => EndCallUseCase(sl()));
sl.registerLazySingleton(() => MakeCallUseCase(sl()));
///repository
sl.registerLazySingleton<BaseAuthRepository>(
() => AuthRepository(localDataSource: sl(), remoteDataSource: sl()),
);
sl.registerLazySingleton<BaseSelectContactRepository>(
() => SelectContactRepository(sl(), sl()),
);
sl.registerLazySingleton<BaseChatRepository>(() => ChatRepository(sl()));
sl.registerLazySingleton<BaseCallRepository>(() => CallRepository(sl()));
///remote data source
sl.registerLazySingleton<BaseAuthRemoteDataSource>(
() => AuthRemoteDataSource(
auth: sl(),
firestore: sl(),
firebaseStorage: sl(),
),
);
sl.registerLazySingleton<BaseSelectContactsRemoteDataSource>(
() => SelectContactsRemoteDataSource(sl(), sl()),
);
sl.registerLazySingleton<BaseChatRemoteDataSource>(
() => ChatRemoteDataSource(sl(), sl(), sl()),
);
sl.registerLazySingleton(() => CallDataSource(sl(), sl()));
/// local data source
sl.registerLazySingleton<BaseAuthLocalDataSource>(
() => AuthLocalDataSource(sharedPreferences: sl()),
);
sl.registerLazySingleton<BaseSelectContactsLocalDataSource>(
() => SelectContactsLocalDataSource(),
);
//External
final auth = FirebaseAuth.instance;
final firestore = FirebaseFirestore.instance;
final firebaseStorage = FirebaseStorage.instance;
sl.registerLazySingleton(() => auth);
sl.registerLazySingleton(() => firestore);
sl.registerLazySingleton(() => firebaseStorage);
}
================================================
FILE: lib/core/shared/bloc_observer.dart
================================================
import 'package:flutter/foundation.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class MyBlocObserver extends BlocObserver {
@override
void onCreate(BlocBase bloc) {
super.onCreate(bloc);
if (kDebugMode) {
print('onCreate -- ${bloc.runtimeType}');
}
}
@override
void onChange(BlocBase bloc, Change change) {
super.onChange(bloc, change);
if (kDebugMode) {
print('onChange -- ${bloc.runtimeType}, $change');
}
}
@override
void onError(BlocBase bloc, Object error, StackTrace stackTrace) {
if (kDebugMode) {
print('onError -- ${bloc.runtimeType}, $error');
}
super.onError(bloc, error, stackTrace);
}
@override
void onClose(BlocBase bloc) {
super.onClose(bloc);
if (kDebugMode) {
print('onClose -- ${bloc.runtimeType}');
}
}
}
================================================
FILE: lib/core/shared/commen.dart
================================================
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:giphy_get/giphy_get.dart';
import 'package:image_cropper/image_cropper.dart';
import 'package:image_picker/image_picker.dart';
void showSnackBar({
required BuildContext context,
required String content,
}) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(
content: Text(content),
),
);
}
Future<File?> pickImageFromGallery(BuildContext context) async {
File? image;
try {
final pickedImage =
await ImagePicker().pickImage(source: ImageSource.gallery);
if (pickedImage != null) {
image = File(pickedImage.path);
}
} catch (e) {
showSnackBar(
context: context,
content: e.toString(),
);
}
return image;
}
Future<GiphyGif?> pickGif(BuildContext context) async {
GiphyGif? gif;
try {
gif = await GiphyGet.getGif(
context: context,
apiKey: 'GmpyPrPF9RVZ1LJY1iAe6O8MTWrBpNob',
);
} catch (e) {
showSnackBar(context: context, content: e.toString());
}
return gif;
}
Future<CroppedFile?> cropImage(String path)async{
return ImageCropper().cropImage(
sourcePath: path,
aspectRatioPresets: Platform.isAndroid
? [
CropAspectRatioPreset.square,
CropAspectRatioPreset.ratio3x2,
CropAspectRatioPreset.original,
CropAspectRatioPreset.ratio4x3,
CropAspectRatioPreset.ratio16x9
]
: [
CropAspectRatioPreset.original,
CropAspectRatioPreset.square,
CropAspectRatioPreset.ratio3x2,
CropAspectRatioPreset.ratio4x3,
CropAspectRatioPreset.ratio5x3,
CropAspectRatioPreset.ratio5x4,
CropAspectRatioPreset.ratio7x5,
CropAspectRatioPreset.ratio16x9
],
aspectRatio: const CropAspectRatio(
ratioX: 1.0,
ratioY: 1.0,
),
compressQuality: 100,
maxWidth: 400,
maxHeight: 400,
compressFormat: ImageCompressFormat.jpg,
cropStyle: CropStyle.rectangle,
uiSettings: [
AndroidUiSettings(
toolbarColor: Colors.teal,
toolbarTitle: "Profile Image",
statusBarColor: Colors.teal,
backgroundColor: Colors.white,
hideBottomControls: true,
lockAspectRatio: false,
initAspectRatio: CropAspectRatioPreset.square,
toolbarWidgetColor: Colors.white
),
],
);
}
================================================
FILE: lib/core/shared/message_replay.dart
================================================
import 'package:equatable/equatable.dart';
import '/core/enums/messge_type.dart';
class MessageReplay extends Equatable {
final String message;
final bool isMe;
final MessageType messageType;
final String repliedTo;
const MessageReplay( {
required this.message,
required this.isMe,
required this.messageType,
required this.repliedTo,
});
@override
List<Object?> get props => [
message,
isMe,
messageType,
repliedTo,
];
}
================================================
FILE: lib/core/shared/pop_up_menu_item_model.dart
================================================
import 'package:equatable/equatable.dart';
import 'package:flutter/animation.dart';
class PopUpMenuItemModel extends Equatable{
final String name;
final VoidCallback onTap;
const PopUpMenuItemModel({required this.name, required this.onTap,});
@override
List<Object?> get props => [name,onTap];
}
================================================
FILE: lib/core/usecase/base_use_case.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import '../error/failure.dart';
abstract class BaseUseCase<T, Parameters>{
Future<Either<Failure ,T>> call(Parameters parameters);
}
abstract class StreamBaseUseCase<T, Parameters>{
Stream<T> call(Parameters parameters);
}
class NoParameters extends Equatable{
const NoParameters();
@override
List<Object?> get props => [];
}
================================================
FILE: lib/core/utils/constants/assets_manager.dart
================================================
const String imgPath = 'assets/images';
class AppImage{
static const String landingImg = '$imgPath/bg.png';
static const String genericProfileImage = '$imgPath/user3.png';
static const String qrCode = '$imgPath/qr-code.png';
static const String chatBackground = '$imgPath/chat-bg.png';
static const String chatBackground2 = '$imgPath/wall1.jpg';
static const String chatBackground3 = '$imgPath/wall2.jpg';
static const String chatBackgroundDark = '$imgPath/chat-bg-dark.png';
static const String splashLightImg = '$imgPath/splash_light.png';
static const String trashContainerImg = '$imgPath/trash_container.png';
static const String trashCoverImg = '$imgPath/trash_cover.png';
}
================================================
FILE: lib/core/utils/constants/font_manager.dart
================================================
import 'package:flutter/material.dart';
class FontConstants {
static const String fontFamily = "Montserrat";
}
class FontWeightManager {
static const FontWeight light = FontWeight.w300;
static const FontWeight regular = FontWeight.w400;
static const FontWeight medium = FontWeight.w500;
static const FontWeight semiBold = FontWeight.w600;
static const FontWeight bold = FontWeight.w700;
}
class FontSize {
static const double s12 = 12.0;
static const double s14 = 14.0;
static const double s16 = 16.0;
static const double s17 = 17.0;
static const double s18 = 18.0;
static const double s20 = 20.0;
static const double s22 = 22.0;
static const double s26 = 26.0;
static const double s28 = 28.0;
}
================================================
FILE: lib/core/utils/constants/strings_manager.dart
================================================
class AppStrings {
static const String appName = "WhatsApp ";
static const String noRouteFound = "noRouteFound";
//landing screen
static const String welcomeToWhatsApp = 'Welcome to WhatsApp';
static const String readOur = 'Read our ';
static const String privacyPolicy = 'Privacy Policy';
static const String tapAgreeAnd = '. Tap "Agree And Continue" to accept the ';
static const String termsOfService = 'Terms of Service';
static const String agreeAndContinue = 'AGREE AND CONTINUE';
//login screen
static const String enterYourPhoneNumber = 'Enter your phone number';
static const String whatsAppWillNeed =
'WhatsApp will need to verify your phone number.';
static const String whatIsMyNumber = 'What\'s my number?';
static const String phoneNumber = 'Phone number';
static const String carrierChargesMayApply = 'Carrier charges may apply';
static const String next = 'NEXT';
static const String pickCountry = 'Choose a country';
//alert dialog
static const String toRetrieveYourPhone =
'To retrieve your phone number, WhatsApp needs permissions to make and manage your calls. Without this permission, WhatsApp will be unable to retrieve your phone number from the SIM.';
static const String youEnteredThePhoneNum = 'You entered the phone number:';
static const String isThisOk =
'Is this OK, or would you like to edit the number?';
static const String edit = 'EDIT';
static const String ok = 'OK';
//otp screen
static const String verifyingYourNumber = 'Verifying Your Number';
static const String waitingToDetectSms =
'Waiting to automatically detect an sms sent to';
static const String wrongNumber = 'Wrong number?';
static const String enter6DigitCode = 'Enter 6-digit code';
static const String resendSms = 'Resend SMS';
//login profile info
static const String profileInfo = 'Profile info';
static const String pleaseProvideYourName =
'Please provide your name and an optional profile photo';
static const String typeYourNameHere = 'Type your name here';
static const String profilePhoto = 'Profile photo';
static const String camera = 'Camera';
static const String gallery = 'Gallery';
//login loading screen
static const String initializing = 'Initializing...';
static const String pleaseWaitAMoment = 'Please wait a moment';
/////
static const String heyThere = 'Hey there! I am using WhatsApp.';
// select contact
static const String selectContact = 'Select contact';
static const String contacts = 'contacts';
static const String newGroup = 'New group';
static const String newContact = 'New contact';
static const String newCommunity = 'New Community';
static const String contactsOnWhatsApp = 'Contacts on WhatsApp';
static const String inviteToWhatsApp = 'Invite to WhatsApp';
static const String inviteAFriend = 'Invite a friend';
static const String refresh = 'Refresh';
static const String help = 'Help';
static const String invite = 'Invite';
/// Main Layout screen
static const String chats = 'CHATS';
static const String calls = 'Calls';
static const String status = 'Status';
static const String newBroadcast = 'New broadcast';
static const String linkedDevices = 'Linked devices';
static const String starredMessage = 'Starred message';
static const String settings = 'Settings';
//chat
static const String viewContact = 'View contact';
static const String mediaLinksAndDocs = 'Media, links, and docs';
static const String search = 'Search';
static const String muteNotifications = 'Mute notifications';
static const String disappearingMessages = 'Disappearing messages';
static const String wallpaper = 'Wallpaper';
static const String more = 'More';
static const String report = 'Report';
static const String block = 'Block';
static const String clearChat = 'Clear chat';
//status
static const String statusPrivacy = 'Status privacy';
//call
static const String clearCallLog = 'Clear call log';
//setting and profile
static const String profile = 'Profile';
static const String name = 'Name';
static const String phone = 'Phone';
static const String about = 'About';
static const String thisIsNotYourUser =
'This is not your username or pin. This name will be visible to your WhatsApp contacts.';
//sender profile
static const String muteNotification = 'Mute Notifications';
static const String customNotification = 'Custom Notifications';
static const String mediaVisibility = 'Media visibility';
static const String encryption = 'Encryption';
static const String messagesAndCallsAre = 'Messages and calls are end-to-end encrypted. Tap to verify.';
static const String disappearingMessage = 'Disappearing Messages';
static const String off = 'Off';
static const String call = 'Call';
static const String video = 'Video';
}
================================================
FILE: lib/core/utils/constants/values_manager.dart
================================================
class AppMargin {
static const double m8 = 8.0;
static const double m12 = 12.0;
static const double m14 = 14.0;
static const double m16 = 16.0;
static const double m18 = 18.0;
static const double m20 = 20.0;
}
class AppPadding {
static const double p2 = 2.0;
static const double p8 = 8.0;
static const double p10 = 10.0;
static const double p12 = 12.0;
static const double p14 = 14.0;
static const double p16 = 16.0;
static const double p18 = 18.0;
static const double p20 = 20.0;
static const double p28 = 28.0;
static const double p100 = 100.0;
}
class AppSize {
static const double s0 = 0;
static const double s1 = 1;
static const int s2 = 2;
static const double s1_5 = 1.5;
static const double s4 = 4.0;
static const double s8 = 8.0;
static const double s12 = 12.0;
static const double s14 = 14.0;
static const double s16 = 16.0;
static const double s18 = 18.0;
static const double s20 = 20.0;
static const double s28 = 28.0;
static const double s40 = 40.0;
static const double s60 = 60.0;
static const double s80 = 80.0;
static const double s90 = 90.0;
static const double s100 = 100.0;
static const double s120 = 120.0;
static const double s140 = 140.0;
static const double s160 = 160.0;
static const double s190 = 190.0;
}
================================================
FILE: lib/core/utils/routes/routes_manager.dart
================================================
import 'package:flutter/material.dart';
import 'package:whatsapp_flutter_clone/features/domain/entities/call.dart';
import 'package:whatsapp_flutter_clone/features/presentation/views/calls/call_screen.dart';
import 'package:whatsapp_flutter_clone/features/presentation/views/wallpaper/wallpaper_screen.dart';
import '../../../features/domain/entities/user.dart';
import '../../../features/presentation/views/camera/camera_screen.dart';
import '../../../features/presentation/views/camera/sending_image_view_page.dart';
import '../../../features/presentation/views/camera/sending_video_view_page.dart';
import '../../../features/presentation/views/chat/chat_screen.dart';
import '../../../features/presentation/views/login/login_landing_screen.dart';
import '../../../features/presentation/views/login/login_loading_screen.dart';
import '../../../features/presentation/views/login/login_otp_screen.dart';
import '../../../features/presentation/views/login/login_profile_info_screen.dart';
import '../../../features/presentation/views/login/login_screen.dart';
import '../../../features/presentation/views/main_layout/main_layout_screen.dart';
import '../../../features/presentation/views/select_contact/select_contact_screen.dart';
import '../../../features/presentation/views/sender_profile/sender_profile_page.dart';
import '../../../features/presentation/views/settings/profile_screen.dart';
import '../../../features/presentation/views/settings/settings_screen.dart';
import '../../../features/presentation/views/splash/splash_screen.dart';
import '../constants/strings_manager.dart';
class Routes {
static const String splashRoute = '/';
static const String landingRoute = '/landing';
static const String loginRoute = '/login';
static const String otpRoute = '/otp';
static const String loginProfileInfoRoute = '/login-profile';
static const String loginLoadingRoute = '/login-loading';
static const String mainLayoutRoute = '/main-layout';
static const String selectContactRoute = '/select-contact';
static const String settingsRoute = '/settings';
static const String chatRoute = '/chat';
static const String cameraRoute = '/camera';
static const String sendingImageViewRoute = '/sending-image-view';
static const String sendingVideoViewRoute = '/sending-video-view';
static const String profileRoute = '/profile';
static const String senderUserProfileRoute = '/sender-profile';
static const String wallpaperRoute = '/wallpaper';
static const String callRoute = '/call-route';
}
class AppRoutes {
static Route<dynamic> onGenerateRoute(RouteSettings settings) {
switch (settings.name) {
case Routes.splashRoute:
return MaterialPageRoute(
builder: (_) => const SplashScreen(),
);
case Routes.landingRoute:
return MaterialPageRoute(
builder: (_) => const LandingScreen(),
);
case Routes.loginRoute:
return MaterialPageRoute(
builder: (_) => const LoginScreen(),
);
case Routes.otpRoute:
final phoneNumber = settings.arguments as String;
return MaterialPageRoute(
builder: (_) => OtpScreen(phoneNumber: phoneNumber),
);
case Routes.loginProfileInfoRoute:
return MaterialPageRoute(
builder: (_) => const LoginProfileInfoScreen(),
);
case Routes.loginLoadingRoute:
return MaterialPageRoute(
builder: (_) => const LoginLoadingScreen(),
);
case Routes.mainLayoutRoute:
return MaterialPageRoute(
builder: (_) => const MainLayoutScreen(),
);
case Routes.selectContactRoute:
return MaterialPageRoute(
builder: (_) => const SelectContactScreen(),
);
case Routes.settingsRoute:
return MaterialPageRoute(
builder: (_) => SettingsScreen(),
);
case Routes.chatRoute:
final arguments =settings.arguments as Map<String,dynamic>;
final String name =arguments['name'];
final String uId = arguments['uId'];
return MaterialPageRoute(
builder: (_) => ChatScreen(name: name,uId: uId,),
);
case Routes.cameraRoute:
final arguments =settings.arguments as Map<String,dynamic>;
//final String name =arguments['name'];
final String uId = arguments['uId'];
return MaterialPageRoute(
builder: (_) => CameraScreen(receiverId: uId),
);
case Routes.sendingImageViewRoute:
final arguments =settings.arguments as Map<String,dynamic>;
//final String name =arguments['name'];
final String uId = arguments['uId'];
final String path = arguments['path'];
return MaterialPageRoute(
builder: (_) => SendingImageViewPage(path: path,receiverId: uId),
);
case Routes.sendingVideoViewRoute:
final arguments =settings.arguments as Map<String,dynamic>;
//final String name =arguments['name'];
final String uId = arguments['uId'];
final String path = arguments['path'];
return MaterialPageRoute(
builder: (_) => SendingVideoViewPage(path: path,receiverId: uId),
);
case Routes.profileRoute:
final argument = settings.arguments as UserEntity;
return MaterialPageRoute(
builder: (_) => ProfileScreen(user: argument),
);
case Routes.senderUserProfileRoute:
final argument = settings.arguments as UserEntity;
return MaterialPageRoute(
builder: (_) => SenderUserProfilePage(user: argument),
);
case Routes.wallpaperRoute:
return MaterialPageRoute(
builder: (_) => const WallpaperScreen(),
);
case Routes.callRoute:
final arguments =settings.arguments as Map<String,dynamic>;
final Call call = arguments['call'];
final String channelId = arguments['channelId'];
return MaterialPageRoute(
builder: (_) => CallScreen(call: call,channelId: channelId),
);
default:
return unDefinedRoute();
}
}
static Route<dynamic> unDefinedRoute() {
return MaterialPageRoute(
builder: (_) => Scaffold(
appBar: AppBar(
title: const Text(
AppStrings.noRouteFound,
),
),
body: const Center(
child: Text(
AppStrings.noRouteFound,
),
),
),
);
}
}
================================================
FILE: lib/core/utils/thems/my_colors.dart
================================================
import 'package:flutter/material.dart';
class MyColors {
/// Base Colors
final Color black = Colors.black;
final Color black1 = const Color(0xFF121212);
final Color black2 = const Color(0xFF18171d); // 900
final Color black3 = const Color(0xFF242329); // 900
final Color onyx = const Color(0xFF45444B); // 900
final Color textBlack = const Color(0XFF4F5054);
final Color grey = Colors.grey;
final Color abbey = const Color(0xFF464648);
final Color dimGray = const Color(0xFF666666);
final Color textIconColorGray = Colors.grey[300]!;
final Color white = Colors.white;
final Color white1 = const Color(0xFFFAFAFA);
final Color white2 = const Color(0xFFECECF4);
final Color transparent = Colors.transparent;
final Color shadow = const Color.fromRGBO(33, 22, 156, 0.1);
final Color blackLight= const Color(0XFF646464);
final Color secondary = const Color(0XFF128C7E); //primary
final Color primary = const Color(0XFF008069); //primary2
final Color primary1 = const Color(0XFF1EBEA5); //primaryLight1
final Color lightGreen = const Color(0XFF25D366);
final Color teaGreen = const Color(0XFFDCF8C6);
final Color checkMarkBlue = const Color(0XFF34B7F1);
final Color round = const Color(0XFF25D167);//coloo
final Color timeBackgroundColor = const Color(0XFFF0F2F4);
}
abstract class IColors {
MyColors get _colors;
Color? scaffoldBackgroundColor;
Color? appBarColor;
Color? primaryColor;
//Color? tabBarColor;
//Color? tapBarSelectedColor;
//Color? tapBarNormalColor;
Brightness? brightness;
ColorScheme? colorScheme;
}
class LightColors implements IColors {
@override
final MyColors _colors = MyColors();
@override
ColorScheme? colorScheme;
@override
Color? appBarColor;
@override
Color? scaffoldBackgroundColor;
@override
Brightness? brightness;
@override
Color? primaryColor;
LightColors() {
appBarColor = _colors.white;
scaffoldBackgroundColor = _colors.white;
primaryColor = _colors.primary;
colorScheme = ColorScheme(
brightness: Brightness.light,
primary: _colors.primary,
//to appbar
onPrimary: _colors.white1,
//to text on appbar
primaryContainer: _colors.white2,
// to other text on appbar,action icon
secondary: _colors.secondary,
secondaryContainer: _colors.primary1,
//to fab
onSecondary: _colors.white1,
error: _colors.black,
onError: _colors.white1,
background: _colors.white1,
onBackground: _colors.black1,
onSecondaryContainer: _colors.lightGreen,//landing image
surface: _colors.teaGreen,
onSurface: _colors.dimGray,
surfaceVariant: _colors.timeBackgroundColor,
onSurfaceVariant: _colors.blackLight,
onInverseSurface: _colors.grey,
onTertiary: _colors.checkMarkBlue,
onTertiaryContainer: _colors.onyx,
onPrimaryContainer: _colors.round
);
brightness = Brightness.light;
}
}
================================================
FILE: lib/core/utils/thems/styles_manager.dart
================================================
import 'package:flutter/material.dart';
import '../constants/font_manager.dart';
TextStyle _getTextStyle(double fontSize, FontWeight fontWeight, Color color) {
return TextStyle(
fontSize: fontSize,
fontFamily: FontConstants.fontFamily,
color: color,
fontWeight: fontWeight,
);
}
// regular style
TextStyle getRegularStyle({
double fontSize = FontSize.s12,
required Color color,
}) {
return _getTextStyle(
fontSize,
FontWeightManager.regular,
color,
);
}
// medium style
TextStyle getMediumStyle({
double fontSize = FontSize.s12,
required Color color,
}) {
return _getTextStyle(
fontSize,
FontWeightManager.medium,
color,
);
}
// medium style
TextStyle getLightStyle({
double fontSize = FontSize.s12,
required Color color,
}) {
return _getTextStyle(
fontSize,
FontWeightManager.light,
color,
);
}
// bold style
TextStyle getBoldStyle({
double fontSize = FontSize.s12,
required Color color,
}) {
return _getTextStyle(
fontSize,
FontWeightManager.bold,
color,
);
}
// semibold style
TextStyle getSemiBoldStyle({
double fontSize = FontSize.s12,
required Color color,
}) {
return _getTextStyle(
fontSize,
FontWeightManager.semiBold,
color,
);
}
================================================
FILE: lib/core/utils/thems/theme_manager.dart
================================================
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import '/core/utils/thems/styles_manager.dart';
import 'my_colors.dart';
import '../constants/font_manager.dart';
import '../constants/values_manager.dart';
ThemeData createTheme(IColors iColors) => ThemeData(
scaffoldBackgroundColor: iColors.scaffoldBackgroundColor,
primaryColor: iColors.primaryColor,
colorScheme: iColors.colorScheme,
brightness: iColors.brightness,
textTheme: _textTheme(iColors),
appBarTheme: _appBarTheme(iColors),
popupMenuTheme: _popupMenuThemeData(iColors),
tabBarTheme: tabBarTheme(),
textButtonTheme: _textButtonThemeData(iColors),
elevatedButtonTheme: _elevatedButtonThemeData(iColors),
inputDecorationTheme: _inputDecorationTheme(iColors),
dividerColor: iColors.colorScheme!.secondaryContainer,
progressIndicatorTheme: ProgressIndicatorThemeData(
color: iColors.primaryColor,
),
);
TextTheme _textTheme(IColors iColors) {
return TextTheme(
displayLarge: getSemiBoldStyle(
color: iColors.colorScheme!.secondary,
fontSize: FontSize.s20,
),
//for appbar
headlineLarge: getBoldStyle(
color: iColors.colorScheme!.onPrimary,
fontSize: 18,
),
bodySmall: getRegularStyle(
color: iColors.colorScheme!.primaryContainer,
fontSize: 13
),
//for list tile title
headlineMedium: getMediumStyle(
//color: AppColors.textBlack,
color: iColors.colorScheme!.onSurface,
fontSize: FontSize.s17,
),
labelLarge: getBoldStyle(
color: iColors.colorScheme!.onPrimary,
fontSize: 14,
),
//for list tile subtitle
bodyMedium: getMediumStyle(
color: iColors.colorScheme!.onInverseSurface,
fontSize: FontSize.s14,
),
//for time card
displaySmall: TextStyle(
color: iColors.colorScheme!.onSurfaceVariant,
fontSize: 16,
fontWeight: FontWeight.w500
),
//////////////////////////////////////////////login
titleLarge: getMediumStyle(
color: iColors.colorScheme!.onSurface,
fontSize: FontSize.s17,
),
titleMedium: getMediumStyle(
color: iColors.colorScheme!.onInverseSurface,
fontSize: FontSize.s14,
),
titleSmall: getSemiBoldStyle(
//color: AppColors.blackLight,
color: iColors.colorScheme!.onSurfaceVariant,
fontSize: FontSize.s14,
)
);
}
AppBarTheme _appBarTheme(IColors colors) {
return AppBarTheme(
color: colors.colorScheme!.primary,
elevation: 0,
systemOverlayStyle: SystemUiOverlayStyle(
statusBarColor: colors.colorScheme!.primary,
statusBarIconBrightness: Brightness.light,
),
titleTextStyle: TextStyle(
color: colors.colorScheme!.onPrimary,
fontSize: AppSize.s20,
fontWeight: FontWeightManager.semiBold,
),
actionsIconTheme: IconThemeData(
color: colors.colorScheme!.primaryContainer,
size: FontSize.s26,
),
);
}
TabBarTheme tabBarTheme() {
return const TabBarTheme(
labelStyle: TextStyle(
fontSize: FontSize.s14,
fontWeight: FontWeightManager.bold,
),
);
}
TextButtonThemeData _textButtonThemeData(IColors colors) {
return TextButtonThemeData(
style: TextButton.styleFrom(
textStyle: TextStyle(
color: colors.colorScheme!.secondary,
fontWeight: FontWeightManager.medium,
),
),
);
}
PopupMenuThemeData _popupMenuThemeData(IColors iColors) {
return PopupMenuThemeData(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(3),
),
textStyle: TextStyle(
color: iColors.colorScheme!.onSurface,
fontWeight: FontWeightManager.medium,
fontSize: FontSize.s17,
),
);
}
InputDecorationTheme _inputDecorationTheme(IColors iColors) {
return InputDecorationTheme(
hintStyle: TextStyle(
color: iColors.colorScheme!.onInverseSurface,
),
focusedBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: iColors.colorScheme!.secondary,
width: 2,
),
),
enabledBorder: UnderlineInputBorder(
borderSide: BorderSide(
color: iColors.colorScheme!.secondary,
width: 2,
),
),
);
}
ElevatedButtonThemeData _elevatedButtonThemeData(IColors iColors) {
return ElevatedButtonThemeData(
style: ElevatedButton.styleFrom(
backgroundColor: iColors.colorScheme!.secondary,
textStyle: TextStyle(
color: iColors.colorScheme!.onSecondary,
fontWeight: FontWeightManager.medium,
),
padding: const EdgeInsets.symmetric(
horizontal: AppSize.s20,
vertical: AppSize.s14,
),
),
);
}
================================================
FILE: lib/features/data/data_source/auth/local/auth_local_data_source.dart
================================================
import 'package:shared_preferences/shared_preferences.dart';
abstract class BaseAuthLocalDataSource {
Future<void> setUserLoggedIn(String uid);
Future<void> removeUser(String uid);
String? getUser();
}
class AuthLocalDataSource extends BaseAuthLocalDataSource {
final SharedPreferences sharedPreferences;
AuthLocalDataSource({required this.sharedPreferences});
@override
Future<void> setUserLoggedIn(String uid) {
return sharedPreferences.setString('uid', uid);
}
@override
Future<void> removeUser(String uid) {
return sharedPreferences.remove(uid);
}
@override
String? getUser() {
return sharedPreferences.getString('uid');
}
}
================================================
FILE: lib/features/data/data_source/auth/remote/auth_remote_data_source.dart
================================================
import 'dart:io';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/foundation.dart';
import '../../../../../core/utils/constants/strings_manager.dart';
import '../../../../domain/usecases/auth/sign_in_with_phone_number_usecase.dart';
import '../../../../domain/usecases/auth/verify_otp_usecase.dart';
import '../../../../domain/usecases/auth/save_userdata_to_firebase_usecase.dart';
import '../../../models/user_model.dart';
abstract class BaseAuthRemoteDataSource {
Future<void> signInWithPhoneNumber(
SignInWithPhoneNumberParameters parameters);
Future<void> verifyOtp(VerifyOtpParameters parameters);
Future<void> saveUserDataToFirebase(UserDataParameters parameters);
Future<String> getCurrentUid();
Future<void> signOut();
Future<UserModel> getCurrentUser();
Stream<UserModel> getUserById(String uId);
Future<void> setUserState(bool isOnline);
Future<void> updateProfilePic(String path);
}
class AuthRemoteDataSource extends BaseAuthRemoteDataSource {
final FirebaseAuth auth;
final FirebaseFirestore firestore;
final FirebaseStorage firebaseStorage;
String _verificationId = '';
AuthRemoteDataSource({
required this.auth,
required this.firestore,
required this.firebaseStorage,
});
@override
Future<String> getCurrentUid() async => auth.currentUser!.uid;
@override
Future<void> signOut() async => await auth.signOut();
@override
Future<void> signInWithPhoneNumber(
SignInWithPhoneNumberParameters parameters) async {
await auth.verifyPhoneNumber(
phoneNumber: parameters.phoneNumber,
verificationCompleted: (AuthCredential credential) async {
await auth.signInWithCredential(credential);
if (kDebugMode) {
print("phone verified : Token ${credential.token}");
}
},
verificationFailed: (e) {
throw Exception(e.message);
},
codeSent: (String verificationId, int? resendToken) {
_verificationId = verificationId;
},
codeAutoRetrievalTimeout: (String verificationId) {
//_verificationId = verificationId;
if (kDebugMode) {
print("time out :$verificationId");
}
},
timeout: const Duration(minutes: 1),
);
}
@override
Future<void> verifyOtp(VerifyOtpParameters parameters) async {
PhoneAuthCredential credential = PhoneAuthProvider.credential(
verificationId: _verificationId,
smsCode: parameters.smsOtpCode,
);
await auth.signInWithCredential(credential);
}
@override
Future<void> saveUserDataToFirebase(UserDataParameters parameters) async {
String uId = await getCurrentUid();
String photoUrl = '';
if (parameters.profilePic != null) {
photoUrl = await _storeFileToFirebase(
'profilePic/$uId',
parameters.profilePic!,
);
}
var user = UserModel(
name: parameters.name,
uId: uId,
status: AppStrings.heyThere,
profilePic: photoUrl,
phoneNumber: auth.currentUser!.phoneNumber!,
isOnline: true,
groupId: const [],
lastSeen: DateTime.now(),
);
var userDoc = await firestore.collection('users').doc(uId).get();
if (userDoc.exists) {
await firestore.collection('users').doc(uId).update(user.toMap());
} else {
await firestore.collection('users').doc(uId).set(user.toMap());
}
}
Future<String> _storeFileToFirebase(String path, File file) async {
UploadTask uploadTask = firebaseStorage.ref().child(path).putFile(file);
TaskSnapshot snap = await uploadTask;
String downloadUrl = await snap.ref.getDownloadURL();
return downloadUrl;
}
Future<void> _deleteFileFromFirebase(String path)async{
return await firebaseStorage.refFromURL(path).delete();
}
@override
Future<UserModel> getCurrentUser() async {
var userData =
await firestore.collection('users').doc(await getCurrentUid()).get();
UserModel user = UserModel.fromMap(userData.data()!);
return user;
}
@override
Stream<UserModel> getUserById(String uId) {
print('doneee');
return firestore.collection('users').doc(uId).snapshots().map(
(event){
return UserModel.fromMap(event.data()!);
},
);
}
@override
Future<void> setUserState(bool isOnline) async {
await firestore.collection('users').doc(auth.currentUser!.uid).update({
'isOnline': isOnline,
'lastSeen': DateTime.now().millisecondsSinceEpoch,
});
}
@override
Future<void> updateProfilePic(String path)async {
String uId = auth.currentUser!.uid;
//firstly delete previus image
var userData = await firestore.collection('users').doc(uId).get();
UserModel user = UserModel.fromMap(userData.data()!);
if(user.profilePic.isNotEmpty){
await _deleteFileFromFirebase(user.profilePic);
}
//then upload new image
String photoUrl = await _storeFileToFirebase(
'profilePic/$uId',
File(path),
);
await firestore.collection('users').doc(auth.currentUser!.uid).update({
'profilePic': photoUrl,
});
}
}
================================================
FILE: lib/features/data/data_source/call/call_data_source.dart
================================================
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:uuid/uuid.dart';
import '../../../../core/functions/navigator.dart';
import '../../../../core/utils/routes/routes_manager.dart';
import '/features/data/models/call_model.dart';
import '../../../domain/usecases/call/end_call_usecase.dart';
import '../../../domain/usecases/call/make_call_usecase.dart';
import '../../models/user_model.dart';
abstract class BaseCallDataSource {
Future<CallModel> makeCall(MakeCallParameters parameters);
Future<void> endCall(EndCallParameters parameters);
Stream<DocumentSnapshot> callStream();
}
class CallDataSource extends BaseCallDataSource {
final FirebaseFirestore _firestore;
final FirebaseAuth _auth;
CallDataSource(this._firestore, this._auth);
Future<UserModel> _currentUser() async {
var userDataMap =
await _firestore.collection('users').doc(_auth.currentUser!.uid).get();
UserModel user = UserModel.fromMap(userDataMap.data()!);
return user;
}
@override
Stream<DocumentSnapshot> callStream() =>
_firestore.collection('call').doc(_auth.currentUser!.uid).snapshots();
@override
Future<void> endCall(EndCallParameters parameters) async {
await _firestore.collection('call').doc(parameters.callerId).delete();
await _firestore.collection('call').doc(parameters.receiverId).delete();
}
@override
Future<CallModel> makeCall(MakeCallParameters parameters)async {
String callId = const Uuid().v1();
UserModel currentUser = await _currentUser();
CallModel senderCallData = CallModel(
callerId: currentUser.uId,
callerName: currentUser.name,
callerPic: currentUser.profilePic,
receiverId: parameters.receiverId,
receiverName: parameters.receiverName,
receiverPic: parameters.receiverPic,
callId: callId,
hasDialled: true,
);
CallModel receiverCallData = CallModel(
callerId: currentUser.uId,
callerName: currentUser.name,
callerPic: currentUser.profilePic,
receiverId: parameters.receiverId,
receiverName: parameters.receiverName,
receiverPic: parameters.receiverPic,
callId: callId,
hasDialled: false,
);
await _firestore
.collection('call')
.doc(senderCallData.callerId)
.set(senderCallData.toMap());
await _firestore
.collection('call')
.doc(senderCallData.receiverId)
.set(receiverCallData.toMap());
return senderCallData;
}
}
================================================
FILE: lib/features/data/data_source/chat/local/chat_local_data_source.dart
================================================
import 'package:flutter/cupertino.dart';
import 'package:giphy_get/giphy_get.dart';
abstract class BaseChatLocalDataSource{
Future<GiphyGif?> pickGif(BuildContext context);
}
class ChatLocalDataSource extends BaseChatLocalDataSource{
@override
Future<GiphyGif?> pickGif(BuildContext context)async {
GiphyGif? gif;
gif = await GiphyGet.getGif(
context: context,
apiKey: 'GmpyPrPF9RVZ1LJY1iAe6O8MTWrBpNob',
);
return gif;
}
}
================================================
FILE: lib/features/data/data_source/chat/remote/chat_remote_data_source.dart
================================================
import 'dart:io';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:uuid/uuid.dart';
import '../../../../../core/enums/messge_type.dart';
import '../../../../../core/shared/message_replay.dart';
import '../../../../domain/usecases/chat/get_chat_messages_usecase.dart';
import '../../../../domain/usecases/chat/send_file_message_usecase.dart';
import '../../../../domain/usecases/chat/send_gif_message_usecase.dart';
import '../../../../domain/usecases/chat/send_text_message_usecase.dart';
import '../../../../domain/usecases/chat/set_chat_message_seen_usecase.dart';
import '../../../models/contact_chat_model.dart';
import '../../../models/message_model.dart';
import '../../../models/user_model.dart';
abstract class BaseChatRemoteDataSource {
Future<void> sendTextMessage(TextMessageParameters parameters);
Future<void> sendFileMessage(FileMessageParameters parameters);
Future<void> sendGifMessage(GifMessageParameters parameters);
Stream<List<MessageModel>> getChatMessages(
GetChatMessagesParameters parameters);
Stream<List<ContactChatModel>> getContactsChat(Map<String, dynamic> map);
Future<void> setChatMessageSeen(SetChatMessageSeenParameters parameters);
Stream<int> getNumOfMessageNotSeen(String senderId);
}
class ChatRemoteDataSource extends BaseChatRemoteDataSource {
final FirebaseFirestore _firestore;
final FirebaseAuth _auth;
final FirebaseStorage firebaseStorage;
ChatRemoteDataSource(this._firestore, this._auth, this.firebaseStorage);
Future<UserModel> _currentUser() async {
var userDataMap =
await _firestore.collection('users').doc(_auth.currentUser!.uid).get();
UserModel user = UserModel.fromMap(userDataMap.data()!);
return user;
}
@override
Future<void> sendTextMessage(TextMessageParameters parameters) async {
UserModel receiverUserData;
var timeSent = DateTime.now();
var messageId = const Uuid().v1();
var userDataMap =
await _firestore.collection('users').doc(parameters.receiverId).get();
receiverUserData = UserModel.fromMap(userDataMap.data()!);
UserModel senderUser = await _currentUser();
/// this is bad to call sender user here i will refactor it.
_saveDataToContactsSubCollection(
senderUser,
receiverUserData,
parameters.text,
timeSent,
);
_saveMessageToMessageSubCollection(
senderId: senderUser.uId,
receiverId: parameters.receiverId,
text: parameters.text,
timeSent: timeSent,
messageId: messageId,
messageType: MessageType.text,
messageReplay: parameters.messageReplay,
senderUserName: senderUser.name,
);
}
void _saveDataToContactsSubCollection(
UserModel senderUserData,
UserModel receiverUserData,
String text,
DateTime timeSent,
) async {
// users -> receiver user id => chats -> current user id -> set data
ContactChatModel receiverChatContact = ContactChatModel(
name: senderUserData.name,
profilePic: senderUserData.profilePic,
contactId: senderUserData.uId,
lastMessage: text,
timeSent: timeSent,
phoneNumber: senderUserData.phoneNumber,
);
await _firestore
.collection('users')
.doc(receiverUserData.uId)
.collection('chats')
.doc(senderUserData.uId)
.set(receiverChatContact.toMAp());
// users -> current user id => chats -> receiver user id -> set data
ContactChatModel senderChatContact = ContactChatModel(
name: receiverUserData.name,
profilePic: receiverUserData.profilePic,
contactId: receiverUserData.uId,
lastMessage: text,
timeSent: timeSent,
phoneNumber: receiverUserData.phoneNumber,
);
await _firestore
.collection('users')
.doc(senderUserData.uId)
.collection('chats')
.doc(receiverUserData.uId)
.set(senderChatContact.toMAp());
}
void _saveMessageToMessageSubCollection({
required String senderId,
required String receiverId,
required String text,
required DateTime timeSent,
required String messageId,
required MessageType messageType,
required MessageReplay? messageReplay,
required String senderUserName,
}) async {
MessageModel message = MessageModel(
senderId: senderId,
receiverId: receiverId,
text: text,
messageId: messageId,
timeSent: timeSent,
isSeen: false,
messageType: messageType,
repliedMessage: messageReplay == null ? '' : messageReplay.message,
senderName: senderUserName,
repliedTo: messageReplay == null
? ''
: messageReplay.isMe
? senderUserName
: messageReplay.repliedTo,
repliedMessageType:
messageReplay == null ? MessageType.text : messageReplay.messageType,
);
// users -> sender id -> chats -> receiver id -> messages ->message id ->store message
await _firestore
.collection('users')
.doc(senderId)
.collection('chats')
.doc(receiverId)
.collection('messages')
.doc(messageId)
.set(message.toMap());
// users -> receiver id -> chats -> sender id -> messages ->message id ->store message
await _firestore
.collection('users')
.doc(receiverId)
.collection('chats')
.doc(senderId)
.collection('messages')
.doc(messageId)
.set(message.toMap());
}
@override
Future<void> sendFileMessage(FileMessageParameters parameters) async {
DateTime timeSent = DateTime.now();
String messageId = const Uuid().v1();
UserModel senderUser = await _currentUser();
var fileUrl = await _storeFileToFirebase(
'chat/${parameters.messageType.type}/${senderUser.uId}/${parameters.receiverId}/$messageId}',
parameters.file,
);
UserModel receiverUserData;
var userDataMap =
await _firestore.collection('users').doc(parameters.receiverId).get();
receiverUserData = UserModel.fromMap(userDataMap.data()!);
String contactMessage;
switch (parameters.messageType) {
case MessageType.image:
contactMessage = '📷 Photo';
break;
case MessageType.video:
contactMessage = '🎥 Video';
break;
case MessageType.audio:
contactMessage = '🎙️ Audio';
break;
case MessageType.gif:
contactMessage = 'Gif';
break;
default:
contactMessage = 'Other';
}
_saveDataToContactsSubCollection(
senderUser,
receiverUserData,
contactMessage,
timeSent,
);
_saveMessageToMessageSubCollection(
senderId: senderUser.uId,
receiverId: parameters.receiverId,
text: fileUrl,
timeSent: timeSent,
messageId: messageId,
messageType: parameters.messageType,
messageReplay: parameters.messageReplay,
senderUserName: senderUser.name
);
}
Future<String> _storeFileToFirebase(String path, File file) async {
UploadTask uploadTask = firebaseStorage.ref().child(path).putFile(file);
TaskSnapshot snap = await uploadTask;
String downloadUrl = await snap.ref.getDownloadURL();
return downloadUrl;
}
@override
Future<void> sendGifMessage(GifMessageParameters parameters) async {
UserModel receiverUserData;
var timeSent = DateTime.now();
var messageId = const Uuid().v1();
var userDataMap =
await _firestore.collection('users').doc(parameters.receiverId).get();
receiverUserData = UserModel.fromMap(userDataMap.data()!);
UserModel senderUser = await _currentUser();
_saveDataToContactsSubCollection(
senderUser,
receiverUserData,
'Gif',
timeSent,
);
_saveMessageToMessageSubCollection(
senderId: senderUser.uId,
receiverId: parameters.receiverId,
text: parameters.gifUrl,
timeSent: timeSent,
messageId: messageId,
messageType: MessageType.gif,
senderUserName: senderUser.name,
messageReplay: parameters.messageReplay
);
}
@override
Stream<List<MessageModel>> getChatMessages(
GetChatMessagesParameters parameters) {
return _firestore
.collection('users')
.doc(_auth.currentUser!.uid)
.collection('chats')
.doc(parameters.receiverId)
.collection('messages')
.orderBy('timeSent')
.snapshots()
.map((event) {
List<MessageModel> messages = [];
for (var document in event.docs) {
messages.add(MessageModel.fromMap(document.data()));
}
return messages;
});
}
@override
Stream<List<ContactChatModel>> getContactsChat(Map<String, dynamic> map) {
return _firestore
.collection('users')
.doc(_auth.currentUser!.uid)
.collection('chats')
.orderBy('timeSent', descending: true)
.snapshots()
.asyncMap((event) async{
List<ContactChatModel> contacts = [];
for (var document in event.docs) {
ContactChatModel contactChat =
ContactChatModel.fromMap(document.data());
var userData = await _firestore
.collection('users')
.doc(contactChat.contactId)
.get();
var user = UserModel.fromMap(userData.data()!);
contacts.add(
ContactChatModel(
name: map.containsKey(contactChat.contactId)
? map[contactChat.contactId]['name']
: user.name,
profilePic: user.profilePic,
contactId: user.uId,
lastMessage: contactChat.lastMessage,
timeSent: contactChat.timeSent,
phoneNumber: contactChat.phoneNumber,
),
);
}
return contacts;
});
}
@override
Stream<int> getNumOfMessageNotSeen(String senderId){
return _firestore
.collection('users')
.doc(_auth.currentUser!.uid)
.collection('chats')
.doc(senderId)
.collection('messages')
.orderBy('timeSent')
.snapshots()
.map((event) {
int num= 0;
for (var document in event.docs) {
MessageModel message = MessageModel.fromMap(document.data());
if(message.senderId == senderId){
if(!message.isSeen){
num++;
}
}
}
return num;
});
}
@override
Future<void> setChatMessageSeen(
SetChatMessageSeenParameters parameters) async {
await _firestore
.collection('users')
.doc(_auth.currentUser!.uid)
.collection('chats')
.doc(parameters.receiverId)
.collection('messages')
.doc(parameters.messageId)
.update({
'isSeen': true,
});
// users -> receiver id -> chats -> sender id -> messages ->message id ->store message
await _firestore
.collection('users')
.doc(parameters.receiverId)
.collection('chats')
.doc(_auth.currentUser!.uid)
.collection('messages')
.doc(parameters.messageId)
.update({
'isSeen': true,
});
}
}
================================================
FILE: lib/features/data/data_source/firebase_storage_remote_data_source.dart
================================================
import 'dart:io';
import 'package:firebase_storage/firebase_storage.dart';
abstract class BaseFirebaseStorageRemoteDataSource{
Future<String> storeFileToFirebase(String path, File file);
}
class FirebaseStorageRemoteDataSource extends BaseFirebaseStorageRemoteDataSource{
final FirebaseStorage firebaseStorage;
FirebaseStorageRemoteDataSource(this.firebaseStorage);
@override
Future<String> storeFileToFirebase(String path, File file) async{
UploadTask uploadTask =firebaseStorage.ref().child(path).putFile(file);
TaskSnapshot snap = await uploadTask;
String downloadUrl = await snap.ref.getDownloadURL();
return downloadUrl;
}
}
================================================
FILE: lib/features/data/data_source/select_contact/local/get_contacts_local_data_source.dart
================================================
import 'package:flutter_contacts/flutter_contacts.dart';
import '/core/error/exceptions.dart';
abstract class BaseSelectContactsLocalDataSource{
Future<List<Contact>> getContacts();
}
class SelectContactsLocalDataSource extends BaseSelectContactsLocalDataSource{
@override
Future<List<Contact>> getContacts()async {
if(await FlutterContacts.requestPermission()){
return await FlutterContacts.getContacts(withProperties: true,);
}else{
throw(const CachedException(message: 'Not Allowed to get contacts'));
}
}
}
================================================
FILE: lib/features/data/data_source/select_contact/remote/select_contact_remote_data_source.dart
================================================
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_contacts/contact.dart';
import '/features/data/models/user_model.dart';
abstract class BaseSelectContactsRemoteDataSource {
Future<void> getAllContacts(List<Contact> contacts);
Future<Map<String, dynamic>> contactsOnWhatsApp();
Future<List<Contact>> contactsNotOnWhatsApp();
// Future<String> getContactName(ContactNameParameters parameters);
}
class SelectContactsRemoteDataSource
extends BaseSelectContactsRemoteDataSource {
final FirebaseFirestore firestore;
final FirebaseAuth _auth;
SelectContactsRemoteDataSource(this.firestore, this._auth);
List<Contact> _contactsNotOnWhatsApp = [];
Map<String, dynamic> contactsOnWhatsAppMap = {};
@override
Future<List<Contact>> contactsNotOnWhatsApp() async => _contactsNotOnWhatsApp;
@override
Future<Map<String, dynamic>> contactsOnWhatsApp() async =>
contactsOnWhatsAppMap;
@override
Future<void> getAllContacts(List<Contact> contacts) async {
_contactsNotOnWhatsApp = [];
//contactsOnWhatsAppMap = {};
Map<String, dynamic> allContacts;
var userCollection = await firestore.collection('users').get();
String phoneNum;
bool numFound = false;
for (int i = 0; i < contacts.length; i++) {
numFound = false;
phoneNum = contacts[i].phones.isNotEmpty
? contacts[i].phones[0].number.replaceAll(' ', '')
: '';
/*
if (userCollection.docs
.where((element) => element.data().containsValue(phoneNum))
.isNotEmpty) {
print(phoneNum);
}
*/
for (var document in userCollection.docs) {
var userData = UserModel.fromMap(document.data());
if (phoneNum == userData.phoneNumber &&
userData.uId != _auth.currentUser!.uid) {
contactsOnWhatsAppMap.addAll({
userData.uId : {
'uId': userData.uId,
'profilePic': userData.profilePic,
'status': userData.status,
'name': contacts[i].displayName,
}
});
numFound = true;
break;
}
}
if (!numFound) _contactsNotOnWhatsApp.add(contacts[i]);
}
}
/*
@override
Future<String> getContactName(ContactNameParameters parameters) async {
if (contactsOnWhatsAppMap.containsKey(parameters.uId)) {
return contactsOnWhatsAppMap[parameters.uId]['name'];
}
var user = await firestore.collection('users').doc(parameters.uId).get();
var userData = UserModel.fromMap(user.data()!);
return userData.phoneNumber;
}
*/
}
================================================
FILE: lib/features/data/models/call_model.dart
================================================
import '../../domain/entities/call.dart';
class CallModel extends Call {
const CallModel({
required super.callerId,
required super.callerName,
required super.callerPic,
required super.receiverId,
required super.receiverName,
required super.receiverPic,
required super.callId,
required super.hasDialled,
});
Map<String, dynamic> toMap() {
return {
'callerId': callerId,
'callerName': callerName,
'callerPic': callerPic,
'receiverId': receiverId,
'receiverName': receiverName,
'receiverPic': receiverPic,
'callId': callId,
'hasDialled': hasDialled,
};
}
factory CallModel.fromMap(Map<String, dynamic> map) {
return CallModel(
callerId: map['callerId'] ?? '',
callerName: map['callerName'] ?? '',
callerPic: map['callerPic'] ?? '',
receiverId: map['receiverId'] ?? '',
receiverName: map['receiverName'] ?? '',
receiverPic: map['receiverPic'] ?? '',
callId: map['callId'] ?? '',
hasDialled: map['hasDialled'] ?? false,
);
}
}
================================================
FILE: lib/features/data/models/contact_chat_model.dart
================================================
import '../../domain/entities/contact_chat.dart';
class ContactChatModel extends ContactChat {
const ContactChatModel({
required super.name,
required super.profilePic,
required super.contactId,
required super.lastMessage,
required super.timeSent,
required super.phoneNumber,
});
Map<String, dynamic> toMAp() => {
'name': name,
'profilePic': profilePic,
'contactId': contactId,
'lastMessage': lastMessage,
'timeSent': timeSent.millisecondsSinceEpoch,
'phoneNumber' : phoneNumber,
};
factory ContactChatModel.fromMap(Map<String, dynamic> map) =>
ContactChatModel(
name: map['name'],
profilePic: map['profilePic'],
contactId: map['contactId'],
lastMessage: map['lastMessage'],
timeSent: DateTime.fromMillisecondsSinceEpoch(map['timeSent']),
phoneNumber: map['phoneNumber'],
);
}
================================================
FILE: lib/features/data/models/message_model.dart
================================================
import 'package:whatsapp_flutter_clone/core/enums/messge_type.dart';
import 'package:whatsapp_flutter_clone/features/domain/entities/message.dart';
class MessageModel extends Message {
const MessageModel({
required super.senderId,
required super.receiverId,
required super.text,
required super.messageId,
required super.timeSent,
required super.isSeen,
required super.messageType,
required super.repliedMessage,
required super.repliedTo,
required super.repliedMessageType,
required super.senderName,
});
Map<String, dynamic> toMap() => {
'senderId': senderId,
'receiverId': receiverId,
'text': text,
'messageId': messageId,
'timeSent': timeSent.millisecondsSinceEpoch,
'isSeen': isSeen,
'messageType': messageType.type,
'repliedMessage': repliedMessage,
'repliedTo': repliedTo,
'repliedMessageType': repliedMessageType.type,
'senderName': senderName,
};
factory MessageModel.fromMap(Map<String, dynamic> map) => MessageModel(
senderId: map['senderId'],
receiverId: map['receiverId'],
text: map['text'],
messageId: map['messageId'],
timeSent: DateTime.fromMillisecondsSinceEpoch(map['timeSent']),
isSeen: map['isSeen'],
messageType: (map['messageType'] as String).toEnum(),
repliedMessage: map['repliedMessage'],
repliedTo: map['repliedTo'],
repliedMessageType: (map['repliedMessageType'] as String).toEnum(),
senderName: map['senderName'],
);
}
================================================
FILE: lib/features/data/models/user_model.dart
================================================
import '../../domain/entities/user.dart';
class UserModel extends UserEntity {
const UserModel({
required super.name,
required super.uId,
required super.status,
required super.profilePic,
required super.phoneNumber,
required super.isOnline,
required super.groupId,
required super.lastSeen,
});
Map<String, dynamic> toMap() {
return {
'name': name,
'uId': uId,
'status': status,
'profilePic': profilePic,
'phoneNumber': phoneNumber,
'isOnline': isOnline,
'groupId': groupId,
'lastSeen': lastSeen.millisecondsSinceEpoch,
};
}
factory UserModel.fromMap(Map<String, dynamic> map) {
return UserModel(
name: map['name'] ?? '',
uId: map['uId'] ?? '',
status: map['status'] ?? '',
profilePic: map['profilePic'] ?? '',
phoneNumber: map['phoneNumber'],
isOnline: map['isOnline'] ?? false,
groupId: List<String>.from(map['groupId']),
lastSeen: DateTime.fromMillisecondsSinceEpoch(map['lastSeen']),
);
}
}
================================================
FILE: lib/features/data/repository/auth_repository.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:firebase_auth/firebase_auth.dart';
import '/features/data/models/user_model.dart';
import '/features/domain/entities/user.dart';
import '../../../core/error/exceptions.dart';
import '../../../core/error/failure.dart';
import '../../domain/repository/base_auth_repository.dart';
import '../../domain/usecases/auth/save_userdata_to_firebase_usecase.dart';
import '../../domain/usecases/auth/sign_in_with_phone_number_usecase.dart';
import '../../domain/usecases/auth/verify_otp_usecase.dart';
import '../data_source/auth/local/auth_local_data_source.dart';
import '../data_source/auth/remote/auth_remote_data_source.dart';
class AuthRepository extends BaseAuthRepository {
final BaseAuthRemoteDataSource remoteDataSource;
final BaseAuthLocalDataSource localDataSource;
AuthRepository({
required this.remoteDataSource,
required this.localDataSource,
});
@override
Future<Either<Failure, void>> signInWithPhoneNumber(
SignInWithPhoneNumberParameters parameters,
) async {
final result = await remoteDataSource.signInWithPhoneNumber(parameters);
try {
return Right(result);
} on FirebaseAuthException catch (failure) {
return Left(ServerFailure(failure.message!));
}
}
@override
Future<Either<Failure, void>> verifyOtp(
VerifyOtpParameters parameters) async {
final result = await remoteDataSource.verifyOtp(parameters);
try {
return Right(result);
} on FirebaseAuthException catch (failure) {
return Left(ServerFailure(failure.message!));
}
}
@override
Future<Either<Failure, void>> saveUserDataToFirebase(
UserDataParameters parameters) async {
final result = await remoteDataSource.saveUserDataToFirebase(parameters);
localDataSource.setUserLoggedIn(await remoteDataSource.getCurrentUid());
try {
return Right(result);
} on FirebaseAuthException catch (failure) {
return Left(ServerFailure(failure.message!));
}
}
@override
Future<Either<Failure, String>> getCurrentUid() async {
final result = await remoteDataSource.getCurrentUid();
//final result = await _getUid();
try {
return Right(result);
} on FirebaseAuthException catch (failure) {
return Left(ServerFailure(failure.message!));
}
}
@override
Future<Either<Failure, void>> signOut() async {
final result = await remoteDataSource.signOut();
await localDataSource.removeUser(localDataSource.getUser()!);
try {
return Right(result);
} on FirebaseAuthException catch (failure) {
return Left(ServerFailure(failure.message!));
}
}
@override
Future<Either<Failure, String>> getCachedLocalCurrentUid() async {
final result = await localDataSource.getUser();
try {
return Right(result!);
} on CachedException catch (failure) {
return Left(CachedFailure(failure.message));
}
}
@override
Future<Either<Failure, UserModel>> getCurrentUser() async {
final result = await remoteDataSource.getCurrentUser();
try {
return Right(result);
} on FirebaseAuthException catch (failure) {
return Left(ServerFailure(failure.message!));
}
}
@override
Future<Either<Failure, void>> setUserState(bool isOnline) async {
final result = await remoteDataSource.setUserState(isOnline);
try {
return Right(result);
} on FirebaseAuthException catch (failure) {
return Left(ServerFailure(failure.message!));
}
}
@override
Stream<UserEntity> getUserById(String uId) {
return remoteDataSource.getUserById(uId);
}
@override
Future<Either<Failure, void>> updateProfilePic(String path) async {
final result = await remoteDataSource.updateProfilePic(path);
try {
return Right(result);
} on FirebaseAuthException catch (failure) {
return Left(ServerFailure(failure.message!));
}
}
}
================================================
FILE: lib/features/data/repository/call_repository.dart
================================================
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:dartz/dartz.dart';
import 'package:whatsapp_flutter_clone/features/domain/entities/call.dart';
import '../../../core/error/failure.dart';
import '../../domain/repository/base_call_repository.dart';
import '../../domain/usecases/call/end_call_usecase.dart';
import '../../domain/usecases/call/make_call_usecase.dart';
import '../data_source/call/call_data_source.dart';
class CallRepository extends BaseCallRepository{
final CallDataSource _callDataSource;
CallRepository(this._callDataSource);
@override
Stream<DocumentSnapshot<Object?>> callStream() => _callDataSource.callStream();
@override
Future<Either<Failure, void>> endCall(EndCallParameters parameters) async{
final result = await _callDataSource.endCall(parameters);
try{
return Right(result);
}on FirebaseException catch(failure){
return Left(ServerFailure(failure.message!));
}
}
@override
Future<Either<Failure, Call>> makeCall(MakeCallParameters parameters)async {
final result = await _callDataSource.makeCall(parameters);
try{
return Right(result);
}on FirebaseException catch(failure){
return Left(ServerFailure(failure.message!));
}
}
}
================================================
FILE: lib/features/data/repository/chat_repository.dart
================================================
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:dartz/dartz.dart';
import '../../../core/error/failure.dart';
import '../../domain/entities/contact_chat.dart';
import '../../domain/entities/message.dart';
import '../../domain/repository/base_chat_repository.dart';
import '../../domain/usecases/chat/get_chat_messages_usecase.dart';
import '../../domain/usecases/chat/send_file_message_usecase.dart';
import '../../domain/usecases/chat/send_gif_message_usecase.dart';
import '../../domain/usecases/chat/send_text_message_usecase.dart';
import '../../domain/usecases/chat/set_chat_message_seen_usecase.dart';
import '../data_source/chat/remote/chat_remote_data_source.dart';
class ChatRepository extends BaseChatRepository {
final BaseChatRemoteDataSource _remoteDataSource;
//final BaseSelectContactRepository _selectContactRepository;
ChatRepository(this._remoteDataSource);
@override
Stream<List<Message>> getChatMessages(GetChatMessagesParameters parameters) {
return _remoteDataSource.getChatMessages(parameters);
}
@override
Stream<List<ContactChat>> getContactsChat(Map<String,dynamic> map) {
return _remoteDataSource.getContactsChat(map);
}
@override
Future<Either<Failure, void>> sendFileMessage(FileMessageParameters parameters)async {
final result = await _remoteDataSource.sendFileMessage(parameters);
try{
return Right(result);
}on FirebaseException catch(failure){
return Left(ServerFailure(failure.message!));
}
}
@override
Future<Either<Failure, void>> sendTextMessage(TextMessageParameters parameters) async {
final result = await _remoteDataSource.sendTextMessage(parameters);
try{
return Right(result);
}on FirebaseException catch(failure){
return Left(ServerFailure(failure.message!));
}
}
@override
Future<Either<Failure, void>> setChatMessageSeen(SetChatMessageSeenParameters parameters)async {
final result = await _remoteDataSource.setChatMessageSeen(parameters);
try{
return Right(result);
}on FirebaseException catch(failure){
return Left(ServerFailure(failure.message!));
}
}
@override
Future<Either<Failure, void>> sendGifMessage(GifMessageParameters parameters)async {
final result = await _remoteDataSource.sendGifMessage(parameters);
try{
return Right(result);
}on FirebaseException catch(failure){
return Left(ServerFailure(failure.message!));
}
}
@override
Stream<int> getNumOfMessageNotSeen(String senderId) {
return _remoteDataSource.getNumOfMessageNotSeen(senderId);
}
}
================================================
FILE: lib/features/data/repository/select_contact_Repository.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:flutter_contacts/contact.dart';
import '../../../core/error/exceptions.dart';
import '../../../core/error/failure.dart';
import '../../domain/repository/base_select_contact_repository.dart';
import '../data_source/select_contact/local/get_contacts_local_data_source.dart';
import '../data_source/select_contact/remote/select_contact_remote_data_source.dart';
class SelectContactRepository extends BaseSelectContactRepository{
final BaseSelectContactsRemoteDataSource remoteDataSource;
final BaseSelectContactsLocalDataSource localDataSource;
SelectContactRepository(this.remoteDataSource, this.localDataSource);
@override
Future<Either<Failure, void>> getAllContacts() async{
final result = await remoteDataSource.getAllContacts(await localDataSource.getContacts());
try{
return Right(result);
}on CachedException catch(failure){
return Left(CachedFailure(failure.message));
}on FirebaseAuthException catch(failure){
return Left(ServerFailure(failure.message!));
}
}
@override
Future<Either<Failure, List<Contact>>> getContactsNotOnWhatsApp()async {
final result = await remoteDataSource.contactsNotOnWhatsApp();
try{
return Right(result);
}on FirebaseAuthException catch(failure){
return Left(ServerFailure(failure.message!));
}
}
@override
Future<Either<Failure, Map<String,dynamic>>> getContactsOnWhatsApp()async {
final result = await remoteDataSource.contactsOnWhatsApp();
try{
return Right(result);
}on FirebaseAuthException catch(failure){
return Left(ServerFailure(failure.message!));
}
}
/*
@override
Future<Either<Failure, String>> getContactName(ContactNameParameters parameters)async {
final result = await remoteDataSource.getContactName(parameters);
try{
return Right(result);
}on CachedException catch(failure){
return Left(CachedFailure(failure.message));
}
}
*/
}
================================================
FILE: lib/features/domain/entities/call.dart
================================================
import 'package:equatable/equatable.dart';
class Call extends Equatable {
final String callerId;
final String callerName;
final String callerPic;
final String receiverId;
final String receiverName;
final String receiverPic;
final String callId;
final bool hasDialled;
const Call({
required this.callerId,
required this.callerName,
required this.callerPic,
required this.receiverId,
required this.receiverName,
required this.receiverPic,
required this.callId,
required this.hasDialled,
});
@override
List<Object?> get props => [
callerId,
callerName,
callerPic,
receiverId,
receiverName,
receiverPic,
callId,
hasDialled,
];
}
================================================
FILE: lib/features/domain/entities/contact_chat.dart
================================================
import 'package:equatable/equatable.dart';
class ContactChat extends Equatable {
final String name;
final String profilePic;
final String contactId;
final String lastMessage;
final DateTime timeSent;
final String phoneNumber;
const ContactChat({
required this.name,
required this.profilePic,
required this.contactId,
required this.lastMessage,
required this.timeSent,
required this.phoneNumber,
});
@override
List<Object?> get props => [
name,
profilePic,
contactId,
lastMessage,
timeSent,
phoneNumber,
];
}
================================================
FILE: lib/features/domain/entities/message.dart
================================================
import 'package:equatable/equatable.dart';
import '../../../core/enums/messge_type.dart';
class Message extends Equatable {
final String senderId;
final String receiverId;
final String senderName;
final String text;
final String messageId;
final DateTime timeSent;
final bool isSeen;
final MessageType messageType;
//replay message
final String repliedMessage;
final String repliedTo;
final MessageType repliedMessageType;
const Message({
required this.senderId,
required this.receiverId,
required this.text,
required this.messageId,
required this.timeSent,
required this.isSeen,
required this.messageType,
required this.repliedMessage,
required this.repliedTo,
required this.repliedMessageType,
required this.senderName,
});
@override
List<Object?> get props => [
senderId,
receiverId,
text,
messageId,
timeSent,
isSeen,
messageType,
repliedMessage,
repliedTo,
repliedMessageType,
senderName,
];
}
================================================
FILE: lib/features/domain/entities/user.dart
================================================
import 'package:equatable/equatable.dart';
class UserEntity extends Equatable {
final String name;
final String uId;
final String status;
final String profilePic;
final String phoneNumber;
final bool isOnline;
final List<String> groupId;
final DateTime lastSeen;
const UserEntity({
required this.name,
required this.uId,
required this.status,
required this.profilePic,
required this.phoneNumber,
required this.isOnline,
required this.groupId,
required this.lastSeen,
});
@override
List<Object?> get props => [
name,
uId,
status,
profilePic,
phoneNumber,
isOnline,
groupId,
lastSeen,
];
}
================================================
FILE: lib/features/domain/repository/base_auth_repository.dart
================================================
import 'package:dartz/dartz.dart';
import '../../../core/error/failure.dart';
import '../entities/user.dart';
import '../usecases/auth/save_userdata_to_firebase_usecase.dart';
import '../usecases/auth/sign_in_with_phone_number_usecase.dart';
import '../usecases/auth/verify_otp_usecase.dart';
abstract class BaseAuthRepository{
Future<Either<Failure, void>> signInWithPhoneNumber(SignInWithPhoneNumberParameters parameters);
Future<Either<Failure, void>> verifyOtp(VerifyOtpParameters parameters);
Future<Either<Failure,void>> saveUserDataToFirebase(UserDataParameters parameters);
Future<Either<Failure,String>> getCurrentUid();
Future<Either<Failure,String>> getCachedLocalCurrentUid();
Future<Either<Failure,void>> signOut();
Future<Either<Failure,UserEntity>> getCurrentUser();
Stream<UserEntity> getUserById(String uId);
Future<Either<Failure,void>> setUserState(bool isOnline);
Future<Either<Failure,void>> updateProfilePic(String path);
}
================================================
FILE: lib/features/domain/repository/base_call_repository.dart
================================================
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:dartz/dartz.dart';
import 'package:whatsapp_flutter_clone/features/domain/entities/call.dart';
import '../../../core/error/failure.dart';
import '../usecases/call/end_call_usecase.dart';
import '../usecases/call/make_call_usecase.dart';
abstract class BaseCallRepository{
Future<Either<Failure,Call>> makeCall(MakeCallParameters parameters);
Future<Either<Failure,void>> endCall(EndCallParameters parameters);
Stream<DocumentSnapshot> callStream();
}
================================================
FILE: lib/features/domain/repository/base_chat_repository.dart
================================================
import 'package:dartz/dartz.dart';
import '../../../core/error/failure.dart';
import '../entities/contact_chat.dart';
import '../entities/message.dart';
import '../usecases/chat/get_chat_messages_usecase.dart';
import '../usecases/chat/send_file_message_usecase.dart';
import '../usecases/chat/send_gif_message_usecase.dart';
import '../usecases/chat/send_text_message_usecase.dart';
import '../usecases/chat/set_chat_message_seen_usecase.dart';
abstract class BaseChatRepository{
Future<Either<Failure,void>> sendTextMessage(TextMessageParameters parameters);
Future<Either<Failure,void>> sendFileMessage(FileMessageParameters parameters);
Future<Either<Failure,void>> sendGifMessage(GifMessageParameters parameters);
Stream<List<ContactChat>> getContactsChat(Map<String,dynamic> map);
Stream<List<Message>> getChatMessages(GetChatMessagesParameters parameters);
Future<Either<Failure,void>> setChatMessageSeen(SetChatMessageSeenParameters parameters);
Stream<int> getNumOfMessageNotSeen(String senderId);
}
================================================
FILE: lib/features/domain/repository/base_select_contact_repository.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:flutter_contacts/contact.dart';
import '../../../core/error/failure.dart';
import '../usecases/select_contact/get_contact_name_usecase.dart';
abstract class BaseSelectContactRepository{
Future<Either<Failure,void>> getAllContacts();
Future<Either<Failure,List<Contact>>> getContactsNotOnWhatsApp();
Future<Either<Failure,Map<String,dynamic>>> getContactsOnWhatsApp();
//Future<Either<Failure,String>> getContactName(ContactNameParameters parameters);
}
================================================
FILE: lib/features/domain/usecases/auth/get_cached_local_current_uid_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import '../../../../core/error/failure.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../repository/base_auth_repository.dart';
class GetCachedLocalCurrentUidUseCase extends BaseUseCase<String , NoParameters>{
final BaseAuthRepository baseFirebaseRepository;
GetCachedLocalCurrentUidUseCase(this.baseFirebaseRepository);
@override
Future<Either<Failure, String>> call(NoParameters parameters)async {
return await baseFirebaseRepository.getCachedLocalCurrentUid();
}
}
================================================
FILE: lib/features/domain/usecases/auth/get_current_uid_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import '../../../../core/error/failure.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../repository/base_auth_repository.dart';
class GetCurrentUidUseCase extends BaseUseCase<String, NoParameters>{
final BaseAuthRepository baseFirebaseRepository;
GetCurrentUidUseCase(this.baseFirebaseRepository);
@override
Future<Either<Failure, String>> call(NoParameters parameters) async{
return await baseFirebaseRepository.getCurrentUid();
}
}
================================================
FILE: lib/features/domain/usecases/auth/get_current_user_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:whatsapp_flutter_clone/core/error/failure.dart';
import 'package:whatsapp_flutter_clone/core/usecase/base_use_case.dart';
import 'package:whatsapp_flutter_clone/features/domain/entities/user.dart';
import 'package:whatsapp_flutter_clone/features/domain/repository/base_auth_repository.dart';
class GetCurrentUserUseCase extends BaseUseCase<UserEntity,NoParameters>{
final BaseAuthRepository _authRepository;
GetCurrentUserUseCase(this._authRepository);
@override
Future<Either<Failure, UserEntity>> call(NoParameters parameters) async{
return await _authRepository.getCurrentUser();
}
}
================================================
FILE: lib/features/domain/usecases/auth/get_user_by_id_usecase.dart
================================================
import '../../../../core/usecase/base_use_case.dart';
import '../../entities/user.dart';
import '../../repository/base_auth_repository.dart';
class GetUserByIdUseCase extends StreamBaseUseCase<UserEntity, String> {
final BaseAuthRepository _baseAuthRepository;
GetUserByIdUseCase(this._baseAuthRepository);
@override
Stream<UserEntity> call(String parameters) {
return _baseAuthRepository.getUserById(parameters);
}
}
================================================
FILE: lib/features/domain/usecases/auth/save_userdata_to_firebase_usecase.dart
================================================
import 'dart:io';
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import '../../../../core/error/failure.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../repository/base_auth_repository.dart';
class SaveUserDataToFirebaseUseCase extends BaseUseCase<void ,UserDataParameters>{
final BaseAuthRepository baseFirebaseRepository;
SaveUserDataToFirebaseUseCase(this.baseFirebaseRepository);
@override
Future<Either<Failure, void>> call(UserDataParameters parameters) async{
return await baseFirebaseRepository.saveUserDataToFirebase(parameters);
}
}
class UserDataParameters extends Equatable {
final String name;
final File? profilePic;
const UserDataParameters({required this.name, this.profilePic});
@override
List<Object?> get props => [
name,
profilePic,
];
}
================================================
FILE: lib/features/domain/usecases/auth/set_user_state_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import '../../../../core/error/failure.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../repository/base_auth_repository.dart';
class SetUserStateUseCase extends BaseUseCase<void , bool>{
final BaseAuthRepository _baseAuthRepository;
SetUserStateUseCase(this._baseAuthRepository);
@override
Future<Either<Failure, void>> call(bool parameters) async{
return await _baseAuthRepository.setUserState(parameters);
}
}
================================================
FILE: lib/features/domain/usecases/auth/sign_in_with_phone_number_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import '../../../../core/error/failure.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../repository/base_auth_repository.dart';
class SignInWithPhoneNumberUseCase extends BaseUseCase<void, SignInWithPhoneNumberParameters> {
final BaseAuthRepository baseFirebaseRepository;
SignInWithPhoneNumberUseCase(this.baseFirebaseRepository);
@override
Future<Either<Failure, void>> call(SignInWithPhoneNumberParameters parameters) async{
return await baseFirebaseRepository.signInWithPhoneNumber(parameters);
}
}
class SignInWithPhoneNumberParameters extends Equatable {
final String phoneNumber;
const SignInWithPhoneNumberParameters({required this.phoneNumber});
@override
List<Object> get props => [phoneNumber];
}
================================================
FILE: lib/features/domain/usecases/auth/signout_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import '../../../../core/error/failure.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../repository/base_auth_repository.dart';
class SignOutUseCase extends BaseUseCase<void,NoParameters>{
final BaseAuthRepository baseFirebaseRepository;
SignOutUseCase(this.baseFirebaseRepository);
@override
Future<Either<Failure, void>> call(NoParameters parameters)async {
return await baseFirebaseRepository.signOut();
}
}
================================================
FILE: lib/features/domain/usecases/auth/update_profile_pic_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:whatsapp_flutter_clone/core/error/failure.dart';
import 'package:whatsapp_flutter_clone/core/usecase/base_use_case.dart';
import 'package:whatsapp_flutter_clone/features/domain/repository/base_auth_repository.dart';
class UpdateProfilePicUseCase extends BaseUseCase<void,String>{
final BaseAuthRepository _baseAuthRepository;
UpdateProfilePicUseCase(this._baseAuthRepository);
@override
Future<Either<Failure, void>> call(String parameters)async {
return await _baseAuthRepository.updateProfilePic(parameters);
}
}
================================================
FILE: lib/features/domain/usecases/auth/verify_otp_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import '../../../../core/error/failure.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../repository/base_auth_repository.dart';
class VerifyOtpUseCase extends BaseUseCase<void, VerifyOtpParameters> {
final BaseAuthRepository baseFirebaseRepository;
VerifyOtpUseCase(this.baseFirebaseRepository);
@override
Future<Either<Failure, void>> call(VerifyOtpParameters parameters)async {
return await baseFirebaseRepository.verifyOtp(parameters);
}
}
class VerifyOtpParameters extends Equatable {
final String smsOtpCode;
const VerifyOtpParameters({required this.smsOtpCode});
@override
List<Object> get props => [smsOtpCode];
}
================================================
FILE: lib/features/domain/usecases/call/call_stream_usecase.dart
================================================
import 'package:cloud_firestore/cloud_firestore.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../repository/base_call_repository.dart';
class CallStreamUseCase extends StreamBaseUseCase<DocumentSnapshot,NoParameters>{
final BaseCallRepository _baseCallRepository;
CallStreamUseCase(this._baseCallRepository);
@override
Stream<DocumentSnapshot> call(NoParameters parameters) {
return _baseCallRepository.callStream();
}
}
================================================
FILE: lib/features/domain/usecases/call/end_call_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import '../../../../core/error/failure.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../repository/base_call_repository.dart';
class EndCallUseCase extends BaseUseCase<void, EndCallParameters> {
final BaseCallRepository _baseCallRepository;
EndCallUseCase(this._baseCallRepository);
@override
Future<Either<Failure, void>> call(EndCallParameters parameters) async {
return await _baseCallRepository.endCall(parameters);
}
}
class EndCallParameters extends Equatable {
final String callerId;
final String receiverId;
const EndCallParameters({
required this.callerId,
required this.receiverId,
});
@override
List<Object?> get props => [
callerId,
receiverId,
];
}
================================================
FILE: lib/features/domain/usecases/call/make_call_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter/cupertino.dart';
import 'package:whatsapp_flutter_clone/features/domain/entities/call.dart';
import '../../../../core/error/failure.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../repository/base_call_repository.dart';
class MakeCallUseCase extends BaseUseCase<Call, MakeCallParameters> {
final BaseCallRepository _baseCallRepository;
MakeCallUseCase(this._baseCallRepository);
@override
Future<Either<Failure, Call>> call(MakeCallParameters parameters) async {
return await _baseCallRepository.makeCall(parameters);
}
}
class MakeCallParameters extends Equatable {
final String receiverId;
final String receiverName;
final String receiverPic;
const MakeCallParameters({
required this.receiverId,
required this.receiverName,
required this.receiverPic,
});
@override
List<Object?> get props => [
receiverId,
receiverName,
receiverPic,
];
}
================================================
FILE: lib/features/domain/usecases/chat/get_chat_messages_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import '../../../../core/error/failure.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../entities/message.dart';
import '../../repository/base_chat_repository.dart';
/*
class GetChatMessagesUseCase extends StreamBaseUseCase<List<Message>, NoParameters>{
final BaseChatRepository _baseChatRepository;
GetChatMessagesUseCase(this._baseChatRepository);
@override
Stream<Either<Failure, List<Message>>> call(NoParameters parameters) {
return _baseChatRepository.getChatMessages();
}
}
*/
class GetChatMessagesUseCase extends StreamBaseUseCase<List<Message>, GetChatMessagesParameters>{
final BaseChatRepository _baseChatRepository;
GetChatMessagesUseCase(this._baseChatRepository);
@override
Stream<List<Message>> call(GetChatMessagesParameters parameters) {
return _baseChatRepository.getChatMessages(parameters);
}
}
class GetChatMessagesParameters extends Equatable {
final String receiverId;
const GetChatMessagesParameters(
{required this.receiverId,});
@override
List<Object?> get props => [
receiverId,
];
}
================================================
FILE: lib/features/domain/usecases/chat/get_contacts_chat_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import '../../../../core/error/failure.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../entities/contact_chat.dart';
import '../../repository/base_chat_repository.dart';
class GetContactsChatUseCase extends StreamBaseUseCase<List<ContactChat>,Map<String,dynamic> >{
final BaseChatRepository _baseChatRepository;
GetContactsChatUseCase(this._baseChatRepository);
@override
Stream<List<ContactChat>> call(Map<String,dynamic> parameters) {
return _baseChatRepository.getContactsChat(parameters);
}
}
================================================
FILE: lib/features/domain/usecases/chat/get_num_of_message_not_seen_usecase.dart
================================================
import '../../../../core/usecase/base_use_case.dart';
import '../../repository/base_chat_repository.dart';
class GetNumberOfMessageNotSeenUseCase extends StreamBaseUseCase<int,String>{
final BaseChatRepository _baseChatRepository;
GetNumberOfMessageNotSeenUseCase(this._baseChatRepository);
@override
Stream<int> call(String parameters) {
return _baseChatRepository.getNumOfMessageNotSeen(parameters);
}
}
================================================
FILE: lib/features/domain/usecases/chat/send_file_message_usecase.dart
================================================
import 'dart:io';
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import 'package:whatsapp_flutter_clone/core/enums/messge_type.dart';
import 'package:whatsapp_flutter_clone/core/error/failure.dart';
import 'package:whatsapp_flutter_clone/core/shared/message_replay.dart';
import 'package:whatsapp_flutter_clone/core/usecase/base_use_case.dart';
import 'package:whatsapp_flutter_clone/features/domain/repository/base_chat_repository.dart';
class SendFileMessageUseCase extends BaseUseCase<void, FileMessageParameters> {
final BaseChatRepository _baseChatRepository;
SendFileMessageUseCase(this._baseChatRepository);
@override
Future<Either<Failure, void>> call(FileMessageParameters parameters) async {
return await _baseChatRepository.sendFileMessage(parameters);
}
}
class FileMessageParameters extends Equatable {
final String receiverId;
final MessageType messageType;
final File file;
final MessageReplay? messageReplay;
const FileMessageParameters({
required this.receiverId,
required this.messageType,
required this.file,
this.messageReplay,
});
@override
List<Object?> get props => [
receiverId,
messageType,
file,
messageReplay,
];
}
================================================
FILE: lib/features/domain/usecases/chat/send_gif_message_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import 'package:whatsapp_flutter_clone/core/error/failure.dart';
import 'package:whatsapp_flutter_clone/core/shared/message_replay.dart';
import 'package:whatsapp_flutter_clone/features/domain/repository/base_chat_repository.dart';
import '../../../../core/usecase/base_use_case.dart';
class SendGifMessageUseCase extends BaseUseCase<void, GifMessageParameters> {
final BaseChatRepository _baseChatRepository;
SendGifMessageUseCase(this._baseChatRepository);
@override
Future<Either<Failure, void>> call(GifMessageParameters parameters) async {
return await _baseChatRepository.sendGifMessage(parameters);
}
}
class GifMessageParameters extends Equatable {
final String receiverId;
final String gifUrl;
final MessageReplay? messageReplay;
const GifMessageParameters({
required this.receiverId,
required this.gifUrl,
this.messageReplay,
});
@override
List<Object?> get props => [
receiverId,
gifUrl,
messageReplay,
];
}
================================================
FILE: lib/features/domain/usecases/chat/send_text_message_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import 'package:whatsapp_flutter_clone/core/shared/message_replay.dart';
import '../../../../core/error/failure.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../repository/base_chat_repository.dart';
class SendTextMessageUseCase extends BaseUseCase<void, TextMessageParameters> {
final BaseChatRepository _baseChatRepository;
SendTextMessageUseCase(this._baseChatRepository);
@override
Future<Either<Failure, void>> call(TextMessageParameters parameters) async {
return await _baseChatRepository.sendTextMessage(parameters);
}
}
class TextMessageParameters extends Equatable {
final String text;
final String receiverId;
final MessageReplay? messageReplay;
//final UserModel senderUser;
const TextMessageParameters({
required this.receiverId,
required this.text,
this.messageReplay,
});
@override
List<Object?> get props => [
text,
receiverId,
messageReplay,
//senderUser,
];
}
================================================
FILE: lib/features/domain/usecases/chat/set_chat_message_seen_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import 'package:whatsapp_flutter_clone/core/error/failure.dart';
import 'package:whatsapp_flutter_clone/core/usecase/base_use_case.dart';
import 'package:whatsapp_flutter_clone/features/domain/repository/base_chat_repository.dart';
class SetChatMessageSeenUseCase extends BaseUseCase<void,SetChatMessageSeenParameters>{
final BaseChatRepository _baseChatRepository;
SetChatMessageSeenUseCase(this._baseChatRepository);
@override
Future<Either<Failure, void>> call(SetChatMessageSeenParameters parameters)async {
return await _baseChatRepository.setChatMessageSeen(parameters);
}
}
class SetChatMessageSeenParameters extends Equatable{
final String receiverId;
final String messageId;
const SetChatMessageSeenParameters({required this.receiverId, required this.messageId});
@override
List<Object?> get props => [receiverId,messageId,];
}
================================================
FILE: lib/features/domain/usecases/select_contact/get_all_contacts_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import '../../../../core/error/failure.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../repository/base_select_contact_repository.dart';
class GetAllContactsUseCase extends BaseUseCase<void, NoParameters>{
final BaseSelectContactRepository _baseSelectContactRepository;
GetAllContactsUseCase(this._baseSelectContactRepository);
@override
Future<Either<Failure, void>> call(NoParameters parameters)async {
return await _baseSelectContactRepository.getAllContacts();
}
}
================================================
FILE: lib/features/domain/usecases/select_contact/get_contact_name_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:equatable/equatable.dart';
import 'package:whatsapp_flutter_clone/core/error/failure.dart';
import 'package:whatsapp_flutter_clone/core/usecase/base_use_case.dart';
import 'package:whatsapp_flutter_clone/features/domain/repository/base_select_contact_repository.dart';
/*
class GetContactNameUseCase extends BaseUseCase<String, ContactNameParameters>{
final BaseSelectContactRepository _selectContactRepository;
GetContactNameUseCase(this._selectContactRepository);
@override
Future<Either<Failure, String>> call(ContactNameParameters parameters)async {
return await _selectContactRepository.getContactName(parameters);
}
}
class ContactNameParameters extends Equatable{
final String uId;
const ContactNameParameters(this.uId);
@override
List<Object?> get props => [uId];
}
*/
================================================
FILE: lib/features/domain/usecases/select_contact/get_contacts_not_on_whats_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import 'package:flutter_contacts/contact.dart';
import 'package:whatsapp_flutter_clone/core/error/failure.dart';
import 'package:whatsapp_flutter_clone/core/usecase/base_use_case.dart';
import 'package:whatsapp_flutter_clone/features/domain/repository/base_select_contact_repository.dart';
class GetContactsNotOnWhatsUseCase extends BaseUseCase<List<Contact>, NoParameters>{
final BaseSelectContactRepository _baseSelectContactRepository;
GetContactsNotOnWhatsUseCase(this._baseSelectContactRepository);
@override
Future<Either<Failure, List<Contact>>> call(NoParameters parameters) async{
return await _baseSelectContactRepository.getContactsNotOnWhatsApp();
}
}
================================================
FILE: lib/features/domain/usecases/select_contact/get_contacts_on_whats_usecase.dart
================================================
import 'package:dartz/dartz.dart';
import '../../../../core/error/failure.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../repository/base_select_contact_repository.dart';
class GetContactsOnWhatsUseCase extends BaseUseCase<Map<String,dynamic>, NoParameters>{
final BaseSelectContactRepository _baseSelectContactRepository;
GetContactsOnWhatsUseCase(this._baseSelectContactRepository);
@override
Future<Either<Failure, Map<String,dynamic>>> call(NoParameters parameters)async {
return await _baseSelectContactRepository.getContactsOnWhatsApp();
}
}
================================================
FILE: lib/features/presentation/components/contact_profile_pic_dialog.dart
================================================
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import '/core/extensions/extensions.dart';
import '../../../core/utils/constants/assets_manager.dart';
import '../../domain/entities/contact_chat.dart';
Future<void> showContactProfilePicDialog(
BuildContext context, {
required ContactChat contact,
}) {
return showDialog(
context: context,
builder: (context) {
return AlertDialog(
scrollable: true,
contentPadding: EdgeInsets.zero,
alignment: Alignment.topCenter,
content: Stack(
children: [
Hero(
tag: contact.contactId,
child: CachedNetworkImage(
width: 400,
height: 300,
imageUrl: contact.profilePic,
placeholder: (context, url) => Stack(
children: [
Image.asset(AppImage.genericProfileImage),
const Align(
alignment: Alignment.center,
child: CircularProgressIndicator(),
)
],
),
errorWidget: (context, url, error) => Image.asset(
AppImage.genericProfileImage,
),
//height: 180.0,
fit: BoxFit.cover,
),
),
Positioned(
top: 0,
right: 0,
left: 0,
child: Container(
padding: const EdgeInsets.symmetric(
vertical: 8,
horizontal: 8,
),
color: Colors.black26,
child: Text(
contact.name,
style: const TextStyle(
color: Colors.white,
fontSize: 20,
),
),
),
)
],
),
actionsAlignment: MainAxisAlignment.spaceBetween,
actionsPadding: const EdgeInsets.symmetric(vertical: 5, horizontal: 5),
actions: [
IconButton(
onPressed: () {},
icon: Icon(
Icons.message,
color: context.colorScheme.secondary,
size: 25,
),
),
IconButton(
onPressed: () {},
icon: Icon(
Icons.call,
color: context.colorScheme.primary,
size: 25,
),
),
IconButton(
onPressed: () {},
icon: Icon(
Icons.videocam,
color: context.colorScheme.primary,
size: 25,
),
),
IconButton(
onPressed: () {},
icon: Icon(
Icons.info_outline_rounded,
color: context.colorScheme.primary,
size: 25,
),
),
],
);
},
);
}
================================================
FILE: lib/features/presentation/components/custom_list_tile.dart
================================================
import 'package:flutter/material.dart';
import '/core/extensions/extensions.dart';
import '../../../core/utils/constants/assets_manager.dart';
class CustomListTile extends StatelessWidget {
final Widget? leading;
final String title;
final String? subTitle;
final String? time;
final Widget? titleButton;
final int numOfMessageNotSeen;
final VoidCallback onTap;
final VoidCallback? onLeadingTap;
const CustomListTile({
super.key,
this.leading,
required this.title,
this.subTitle,
this.time,
this.numOfMessageNotSeen = 0,
this.titleButton,
required this.onTap,
this.onLeadingTap,
});
@override
Widget build(BuildContext context) {
return ListTile(
onTap: onTap,
leading: leading ??
InkWell(
onTap: onLeadingTap,
child: CircleAvatar(
radius: 20,
backgroundColor: Colors.white,
child: Image.asset(AppImage.genericProfileImage),
),
),
title: Row(
children: [
Expanded(
child: Text(
title,
//style: context.headlineSmall,
style: context.headlineMedium,
overflow: TextOverflow.ellipsis,
maxLines: 1,
),
),
if (time != null)
Text(
time!,
style: numOfMessageNotSeen>0
? context.labelLarge!.copyWith(color: context.colorScheme.onPrimaryContainer)
: context.bodyMedium,
),
if (titleButton != null)
SizedBox(
height: 40,
child: titleButton!,
),
],
),
subtitle: subTitle != null
? Padding(
padding: const EdgeInsets.only(top: 3),
child: Row(
children: [
//Icon(Icons.done_all,size: 20,),
Expanded(
child: Text(
subTitle!,
style: context.bodyMedium,
overflow: TextOverflow.ellipsis,
maxLines: 1,
),
),
if ( numOfMessageNotSeen >0 )
CircleAvatar(
minRadius: 12,
backgroundColor: context.colorScheme.onPrimaryContainer,
child: Padding(
padding: const EdgeInsets.all(4.0),
child: Text(
numOfMessageNotSeen.toString(),
style: context.labelLarge,
),
),
),
],
),
)
: null,
);
}
}
================================================
FILE: lib/features/presentation/components/custom_network_image.dart
================================================
import 'package:flutter/material.dart';
import '../../../core/utils/constants/assets_manager.dart';
class CustomNetworkImage extends StatelessWidget {
final String imageUrl;
const CustomNetworkImage({super.key, required this.imageUrl});
@override
Widget build(BuildContext context) {
return ClipOval(
child: CircleAvatar(
backgroundColor: Colors.white,
backgroundImage: const AssetImage(AppImage.genericProfileImage),
child: Image.network(
imageUrl ?? '',
errorBuilder: ((context, error, stackTrace) => const SizedBox()),
),
),
);
}
}
================================================
FILE: lib/features/presentation/components/custom_pop_up_menu_button.dart
================================================
import 'package:flutter/material.dart';
import '../../../../../core/shared/pop_up_menu_item_model.dart';
class CustomPopUpMenuButton extends StatelessWidget {
final List<PopUpMenuItemModel> buttons;
const CustomPopUpMenuButton({
super.key, required this.buttons,
});
@override
Widget build(BuildContext context) {
return PopupMenuButton(
icon: const Icon(Icons.more_vert),
onSelected: (value){
buttons[value].onTap();
},
itemBuilder: (context) {
return buttons.map((e) {
int index = buttons.indexOf(e);
return PopupMenuItem(
value: index,
child: FittedBox(
fit: BoxFit.fill,
child: Text(e.name),
),
);
}).toList();
},
);
}
}
================================================
FILE: lib/features/presentation/components/custom_text.dart
================================================
import 'package:flutter/material.dart';
class CustomText extends StatelessWidget {
final String text;
final TextTheme textStyle;
const CustomText({super.key, required this.text, required this.textStyle});
@override
Widget build(BuildContext context) {
ThemeData theme =Theme.of(context);
return Text(
text,
style: theme.textTheme.bodyMedium
);
}
}
================================================
FILE: lib/features/presentation/components/default_button.dart
================================================
import 'package:flutter/material.dart';
class DefaultButton extends StatelessWidget {
final String text;
final VoidCallback onPress;
final double? width;
const DefaultButton({
super.key,
required this.text,
required this.onPress,
this.width,
});
@override
Widget build(BuildContext context) {
return SizedBox(
width: width,
child: ElevatedButton(
onPressed: onPress,
child: Text(text),
),
);
}
}
================================================
FILE: lib/features/presentation/components/loader.dart
================================================
import 'package:flutter/material.dart';
class Loader extends StatelessWidget {
const Loader({super.key});
@override
Widget build(BuildContext context) {
return const Center(
child: CircularProgressIndicator(),
);
}
}
================================================
FILE: lib/features/presentation/components/my_cached_net_image.dart
================================================
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import '../../../core/utils/constants/assets_manager.dart';
class MyCachedNetImage extends StatelessWidget {
final String imageUrl;
final double radius;
const MyCachedNetImage({
super.key,
required this.imageUrl,
required this.radius,
});
@override
Widget build(BuildContext context) {
return ClipOval(
child: CachedNetworkImage(
imageUrl: imageUrl,
width: radius * 2,
height: radius * 2,
placeholder: (context, url) => Stack(
children: [
Image.asset(AppImage.genericProfileImage),
const Align(
alignment: Alignment.center,
child: CircularProgressIndicator(),
)
],
),
errorWidget: (context, url, error) =>
Image.asset(AppImage.genericProfileImage),
//height: 180.0,
fit: BoxFit.cover,
),
);
}
}
================================================
FILE: lib/features/presentation/components/update_profile_pic_model_bottom_sheet.dart
================================================
import 'dart:io';
import 'package:flutter/material.dart';
import '../controllers/auth_cubit/auth_cubit.dart';
import '/core/extensions/extensions.dart';
import '../../../core/functions/navigator.dart';
import '../../../core/shared/commen.dart';
import '../../../core/utils/constants/font_manager.dart';
import '../../../core/utils/constants/strings_manager.dart';
Future<void> showUpdateProfilePicModelBottomSheet(BuildContext context) {
return showModalBottomSheet(
context: context,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(10),
topRight: Radius.circular(10),
),
),
builder: (context) {
return Padding(
padding: const EdgeInsets.all(20.0),
child: Column(
mainAxisSize: MainAxisSize.min,
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
AppStrings.profilePhoto,
style: context.titleLarge,
),
Row(
children: [
PickProfileImage(
onTap: () {},
icon: Icons.photo_camera,
name: AppStrings.camera,
),
const SizedBox(width: 40),
PickProfileImage(
onTap: () {
selectImageFromGallery(context);
},
icon: Icons.photo,
name: AppStrings.gallery,
),
],
)
],
),
);
},
);
}
void selectImageFromGallery(BuildContext context) async {
File? image = await pickImageFromGallery(context);
if(image != null){
cropImage(image.path).then((value) {
if(value != null) {
AuthCubit.get(context).updateProfilePic(value.path);
}
navigatePop(context);
});
}
}
class PickProfileImage extends StatelessWidget {
final VoidCallback onTap;
final String name;
final IconData icon;
const PickProfileImage({
super.key,
required this.onTap,
required this.name,
required this.icon,
});
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
GestureDetector(
onTap: onTap,
child: Container(
padding: const EdgeInsets.all(12),
margin: const EdgeInsets.only(
bottom: 10,
top: 30,
),
decoration: BoxDecoration(
shape: BoxShape.circle,
border: Border.all(
color: Colors.grey.shade200,
),
),
child: Icon(
icon,
color: context.colorScheme.secondary,
),
),
),
Text(
name,
style: context.titleMedium!.copyWith(
fontWeight: FontWeightManager.regular,
),
),
],
);
}
}
================================================
FILE: lib/features/presentation/controllers/auth_cubit/auth_cubit.dart
================================================
import 'dart:io';
import 'package:country_picker/country_picker.dart';
import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import '../../../../core/usecase/base_use_case.dart';
import '../../../domain/entities/user.dart';
import '../../../domain/usecases/auth/get_cached_local_current_uid_usecase.dart';
import '../../../domain/usecases/auth/get_current_user_usecase.dart';
import '../../../domain/usecases/auth/get_user_by_id_usecase.dart';
import '../../../domain/usecases/auth/save_userdata_to_firebase_usecase.dart';
import '../../../domain/usecases/auth/set_user_state_usecase.dart';
import '../../../domain/usecases/auth/signout_usecase.dart';
import '../../../domain/usecases/auth/sign_in_with_phone_number_usecase.dart';
import '../../../domain/usecases/auth/update_profile_pic_usecase.dart';
import '../../../domain/usecases/auth/verify_otp_usecase.dart';
part 'auth_state.dart';
class AuthCubit extends Cubit<AuthState> {
final SignInWithPhoneNumberUseCase _signInWithPhoneNumberUseCase;
final VerifyOtpUseCase _verifyOtpUseCase;
final SaveUserDataToFirebaseUseCase _saveUserDataToFirebaseUseCase;
final SignOutUseCase _signOutUseCase;
final GetCachedLocalCurrentUidUseCase _cachedLocalCurrentUid;
final GetUserByIdUseCase _getUserByIdUseCase;
final SetUserStateUseCase _setUserStateUseCase;
final GetCurrentUserUseCase _getCurrentUserUseCase;
final UpdateProfilePicUseCase _updateProfilePicUseCase;
AuthCubit(
this._signInWithPhoneNumberUseCase,
this._verifyOtpUseCase,
this._saveUserDataToFirebaseUseCase,
this._signOutUseCase,
this._cachedLocalCurrentUid,
this._getUserByIdUseCase,
this._setUserStateUseCase,
this._getCurrentUserUseCase,
this._updateProfilePicUseCase,
) : super(AuthInitial());
static AuthCubit get(context) => BlocProvider.of(context);
Country? country;
void setCountry(Country myCountry) {
country = myCountry;
emit(SetCountrySuccessState());
}
Future<void> signInWithPhoneNumber({required String phoneNumber}) async {
emit(SignInLoadingState());
final result = await _signInWithPhoneNumberUseCase(
SignInWithPhoneNumberParameters(
phoneNumber: phoneNumber,
),
);
result.fold(
(l) {
emit(SignInErrorState());
},
(r) => emit(SignInSuccessState()),
);
}
Future<void> verifyOtp({required String smsOtpCode}) async {
emit(VerifyOtpLoadingState());
final result = await _verifyOtpUseCase(
VerifyOtpParameters(
smsOtpCode: smsOtpCode,
),
);
result.fold(
(l) => emit(VerifyOtpErrorState()),
(r) => emit(VerifyOtpSuccessState()),
);
}
Future<void> saveUserDataToFirebase({
required String name,
File? profilePic,
}) async {
emit(SaveUserDataToFirebaseLoadingState());
final result = await _saveUserDataToFirebaseUseCase(UserDataParameters(
name: name,
profilePic: profilePic,
));
result.fold(
(l) => emit(SaveUserDataToFirebaseErrorState()),
(r) => emit(SaveUserDataToFirebaseSuccessState()),
);
}
Future<void> signOut() async {
emit(SignOutLoadingState());
final result = await _signOutUseCase(const NoParameters());
result.fold(
(l) => emit(SignOutErrorState()),
(r) => emit(SignOutSuccessState()),
);
}
UserEntity? userEntity;
Future<void> getCurrentUser() async {
emit(GetCurrentUserLoadingState());
final result = await _getCurrentUserUseCase(const NoParameters());
result.fold(
(l) => emit(GetCurrentUserErrorState()),
(r) {
userEntity = r;
emit(GetCurrentUserSuccessState());
},
);
}
Future<void> getCachedCurrentUid() async {
final result = await _cachedLocalCurrentUid(const NoParameters());
result.fold(
(l) => emit(GetCurrentLocalErrorState()),
(r) => emit(GetCurrentLocalSuccessState(r)),
);
}
Stream<UserEntity> getUserById(String uId) {
return _getUserByIdUseCase(uId);
}
Future<void> setUserState(bool isOnline) async {
final result = await _setUserStateUseCase(isOnline);
result.fold(
(l) => emit(SetUserStateErrorState()),
(r) => emit(SetUserStateSuccessState()),
);
}
Future<void> updateProfilePic(String path) async {
emit(UpdateProfilePicLoadingState());
final result = await _updateProfilePicUseCase(path);
result.fold(
(l) => emit(UpdateProfilePicErrorState()),
(r) => emit(UpdateProfilePicSuccessState()),
);
}
}
================================================
FILE: lib/features/presentation/controllers/auth_cubit/auth_state.dart
================================================
part of 'auth_cubit.dart';
abstract class AuthState extends Equatable {
const AuthState();
}
class AuthInitial extends AuthState {
@override
List<Object> get props => [];
}
class SetCountrySuccessState extends AuthState{
@override
List<Object?> get props => [];
}
class SignInLoadingState extends AuthState{
@override
List<Object?> get props => [];
}
class SignInSuccessState extends AuthState{
@override
List<Object?> get props => [];
}
class SignInErrorState extends AuthState{
@override
List<Object?> get props => [];
}
class VerifyOtpLoadingState extends AuthState{
@override
List<Object?> get props => [];
}
class VerifyOtpSuccessState extends AuthState{
@override
List<Object?> get props => [];
}
class VerifyOtpErrorState extends AuthState{
@override
List<Object?> get props => [];
}
class SaveUserDataToFirebaseLoadingState extends AuthState{
@override
List<Object?> get props => [];
}
class SaveUserDataToFirebaseSuccessState extends AuthState{
@override
List<Object?> get props => [];
}
class SaveUserDataToFirebaseErrorState extends AuthState{
@override
List<Object?> get props => [];
}
class SignOutLoadingState extends AuthState{
@override
List<Object?> get props => [];
}
class SignOutSuccessState extends AuthState{
@override
List<Object?> get props => [];
}
class SignOutErrorState extends AuthState{
@override
List<Object?> get props => [];
}
class GetCurrentLocalSuccessState extends AuthState{
final String uId;
const GetCurrentLocalSuccessState(this.uId);
@override
List<Object?> get props => [uId];
}
class GetCurrentLocalErrorState extends AuthState{
@override
List<Object?> get props => [];
}
class SetUserStateErrorState extends AuthState{
@override
List<Object?> get props => [];
}
class SetUserStateSuccessState extends AuthState{
@override
List<Object?> get props => [];
}
/////get current user
class GetCurrentUserLoadingState extends AuthState{
@override
List<Object?> get props => [];
}
class GetCurrentUserErrorState extends AuthState{
@override
List<Object?> get props => [];
}
class GetCurrentUserSuccessState extends AuthState{
@override
List<Object?> get props => [];
}
//update profile pic
class UpdateProfilePicLoading
gitextract_ue6w1k4a/
├── .gitignore
├── .metadata
├── README.md
├── analysis_options.yaml
├── android/
│ ├── .gitignore
│ ├── app/
│ │ ├── build.gradle
│ │ ├── google-services.json
│ │ └── src/
│ │ ├── debug/
│ │ │ └── AndroidManifest.xml
│ │ ├── main/
│ │ │ ├── AndroidManifest.xml
│ │ │ ├── kotlin/
│ │ │ │ └── mogohary99/
│ │ │ │ └── whatsapp_flutter_clone/
│ │ │ │ └── MainActivity.kt
│ │ │ └── res/
│ │ │ ├── drawable/
│ │ │ │ └── launch_background.xml
│ │ │ ├── drawable-v21/
│ │ │ │ └── launch_background.xml
│ │ │ ├── values/
│ │ │ │ └── styles.xml
│ │ │ └── values-night/
│ │ │ └── styles.xml
│ │ └── profile/
│ │ └── AndroidManifest.xml
│ ├── build.gradle
│ ├── gradle/
│ │ └── wrapper/
│ │ └── gradle-wrapper.properties
│ ├── gradle.properties
│ └── settings.gradle
├── ios/
│ ├── .gitignore
│ ├── Flutter/
│ │ ├── AppFrameworkInfo.plist
│ │ ├── Debug.xcconfig
│ │ └── Release.xcconfig
│ ├── Runner/
│ │ ├── AppDelegate.swift
│ │ ├── Assets.xcassets/
│ │ │ ├── AppIcon.appiconset/
│ │ │ │ └── Contents.json
│ │ │ └── LaunchImage.imageset/
│ │ │ ├── Contents.json
│ │ │ └── README.md
│ │ ├── Base.lproj/
│ │ │ ├── LaunchScreen.storyboard
│ │ │ └── Main.storyboard
│ │ ├── Info.plist
│ │ └── Runner-Bridging-Header.h
│ ├── 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
├── lib/
│ ├── config/
│ │ └── agora_config.dart
│ ├── core/
│ │ ├── enums/
│ │ │ └── messge_type.dart
│ │ ├── error/
│ │ │ ├── exceptions.dart
│ │ │ └── failure.dart
│ │ ├── extensions/
│ │ │ ├── extensions.dart
│ │ │ └── time_extension.dart
│ │ ├── functions/
│ │ │ ├── app_dialogs.dart
│ │ │ ├── date_converter.dart
│ │ │ └── navigator.dart
│ │ ├── network/
│ │ │ └── cache_helper.dart
│ │ ├── services/
│ │ │ └── services_locator.dart
│ │ ├── shared/
│ │ │ ├── bloc_observer.dart
│ │ │ ├── commen.dart
│ │ │ ├── message_replay.dart
│ │ │ └── pop_up_menu_item_model.dart
│ │ ├── usecase/
│ │ │ └── base_use_case.dart
│ │ └── utils/
│ │ ├── constants/
│ │ │ ├── assets_manager.dart
│ │ │ ├── font_manager.dart
│ │ │ ├── strings_manager.dart
│ │ │ └── values_manager.dart
│ │ ├── routes/
│ │ │ └── routes_manager.dart
│ │ └── thems/
│ │ ├── my_colors.dart
│ │ ├── styles_manager.dart
│ │ └── theme_manager.dart
│ ├── features/
│ │ ├── data/
│ │ │ ├── data_source/
│ │ │ │ ├── auth/
│ │ │ │ │ ├── local/
│ │ │ │ │ │ └── auth_local_data_source.dart
│ │ │ │ │ └── remote/
│ │ │ │ │ └── auth_remote_data_source.dart
│ │ │ │ ├── call/
│ │ │ │ │ └── call_data_source.dart
│ │ │ │ ├── chat/
│ │ │ │ │ ├── local/
│ │ │ │ │ │ └── chat_local_data_source.dart
│ │ │ │ │ └── remote/
│ │ │ │ │ └── chat_remote_data_source.dart
│ │ │ │ ├── firebase_storage_remote_data_source.dart
│ │ │ │ └── select_contact/
│ │ │ │ ├── local/
│ │ │ │ │ └── get_contacts_local_data_source.dart
│ │ │ │ └── remote/
│ │ │ │ └── select_contact_remote_data_source.dart
│ │ │ ├── models/
│ │ │ │ ├── call_model.dart
│ │ │ │ ├── contact_chat_model.dart
│ │ │ │ ├── message_model.dart
│ │ │ │ └── user_model.dart
│ │ │ └── repository/
│ │ │ ├── auth_repository.dart
│ │ │ ├── call_repository.dart
│ │ │ ├── chat_repository.dart
│ │ │ └── select_contact_Repository.dart
│ │ ├── domain/
│ │ │ ├── entities/
│ │ │ │ ├── call.dart
│ │ │ │ ├── contact_chat.dart
│ │ │ │ ├── message.dart
│ │ │ │ └── user.dart
│ │ │ ├── repository/
│ │ │ │ ├── base_auth_repository.dart
│ │ │ │ ├── base_call_repository.dart
│ │ │ │ ├── base_chat_repository.dart
│ │ │ │ └── base_select_contact_repository.dart
│ │ │ └── usecases/
│ │ │ ├── auth/
│ │ │ │ ├── get_cached_local_current_uid_usecase.dart
│ │ │ │ ├── get_current_uid_usecase.dart
│ │ │ │ ├── get_current_user_usecase.dart
│ │ │ │ ├── get_user_by_id_usecase.dart
│ │ │ │ ├── save_userdata_to_firebase_usecase.dart
│ │ │ │ ├── set_user_state_usecase.dart
│ │ │ │ ├── sign_in_with_phone_number_usecase.dart
│ │ │ │ ├── signout_usecase.dart
│ │ │ │ ├── update_profile_pic_usecase.dart
│ │ │ │ └── verify_otp_usecase.dart
│ │ │ ├── call/
│ │ │ │ ├── call_stream_usecase.dart
│ │ │ │ ├── end_call_usecase.dart
│ │ │ │ └── make_call_usecase.dart
│ │ │ ├── chat/
│ │ │ │ ├── get_chat_messages_usecase.dart
│ │ │ │ ├── get_contacts_chat_usecase.dart
│ │ │ │ ├── get_num_of_message_not_seen_usecase.dart
│ │ │ │ ├── send_file_message_usecase.dart
│ │ │ │ ├── send_gif_message_usecase.dart
│ │ │ │ ├── send_text_message_usecase.dart
│ │ │ │ └── set_chat_message_seen_usecase.dart
│ │ │ └── select_contact/
│ │ │ ├── get_all_contacts_usecase.dart
│ │ │ ├── get_contact_name_usecase.dart
│ │ │ ├── get_contacts_not_on_whats_usecase.dart
│ │ │ └── get_contacts_on_whats_usecase.dart
│ │ └── presentation/
│ │ ├── components/
│ │ │ ├── contact_profile_pic_dialog.dart
│ │ │ ├── custom_list_tile.dart
│ │ │ ├── custom_network_image.dart
│ │ │ ├── custom_pop_up_menu_button.dart
│ │ │ ├── custom_text.dart
│ │ │ ├── default_button.dart
│ │ │ ├── loader.dart
│ │ │ ├── my_cached_net_image.dart
│ │ │ └── update_profile_pic_model_bottom_sheet.dart
│ │ ├── controllers/
│ │ │ ├── auth_cubit/
│ │ │ │ ├── auth_cubit.dart
│ │ │ │ └── auth_state.dart
│ │ │ ├── bottom_chat_cubit/
│ │ │ │ ├── bottom_chat_cubit.dart
│ │ │ │ └── bottom_chat_state.dart
│ │ │ ├── call_cubit/
│ │ │ │ ├── call_cubit.dart
│ │ │ │ └── call_state.dart
│ │ │ ├── chat_background_cubit/
│ │ │ │ ├── chat_background_cubit.dart
│ │ │ │ └── chat_background_state.dart
│ │ │ ├── chat_cubit/
│ │ │ │ ├── chat_cubit.dart
│ │ │ │ └── chat_state.dart
│ │ │ └── select_contact_cubit/
│ │ │ ├── select_contact_cubit.dart
│ │ │ └── select_contact_state.dart
│ │ └── views/
│ │ ├── calls/
│ │ │ ├── call_pickup_screen.dart
│ │ │ ├── call_screen.dart
│ │ │ └── calls_page.dart
│ │ ├── camera/
│ │ │ ├── camera_screen.dart
│ │ │ ├── components/
│ │ │ │ ├── camera_appbar.dart
│ │ │ │ ├── image_view_top_row_icons.dart
│ │ │ │ ├── select_image_from_gallery_button.dart
│ │ │ │ ├── sending_image_video_bottom_roww_widget.dart
│ │ │ │ └── video_view_top_row_widget.dart
│ │ │ ├── sending_image_view_page.dart
│ │ │ └── sending_video_view_page.dart
│ │ ├── chat/
│ │ │ ├── chat_screen.dart
│ │ │ └── components/
│ │ │ ├── bottom_field/
│ │ │ │ ├── attchment_pop_up.dart
│ │ │ │ ├── bottom_chat_field.dart
│ │ │ │ ├── bottom_chat_with_icon.dart
│ │ │ │ ├── emoji_picker_widget.dart
│ │ │ │ ├── recording_mic.dart
│ │ │ │ ├── recording_mic_widget.dart
│ │ │ │ └── timer.dart
│ │ │ ├── chat_appbar.dart
│ │ │ ├── message/
│ │ │ │ ├── first_message_small_curved_bubble.dart
│ │ │ │ ├── message_replay_card.dart
│ │ │ │ ├── message_replay_preview.dart
│ │ │ │ ├── messages_list.dart
│ │ │ │ ├── my_message_card.dart
│ │ │ │ └── sender_message_card.dart
│ │ │ └── message_content/
│ │ │ ├── audio_player_widget.dart
│ │ │ ├── image_widget.dart
│ │ │ ├── message_content.dart
│ │ │ ├── text_widget.dart
│ │ │ ├── time_sent_widget.dart
│ │ │ └── video_palyer_widget.dart
│ │ ├── contacts_chat/
│ │ │ ├── components/
│ │ │ │ └── chat_contact_card.dart
│ │ │ └── contacts_chat_page.dart
│ │ ├── login/
│ │ │ ├── components/
│ │ │ │ ├── landing_image.dart
│ │ │ │ ├── login_appbar.dart
│ │ │ │ ├── login_profile_pic.dart
│ │ │ │ ├── privacy_policy_link_and_terms_of_service.dart
│ │ │ │ └── sign_out_button.dart
│ │ │ ├── login_landing_screen.dart
│ │ │ ├── login_loading_screen.dart
│ │ │ ├── login_otp_screen.dart
│ │ │ ├── login_profile_info_screen.dart
│ │ │ └── login_screen.dart
│ │ ├── main_layout/
│ │ │ ├── components/
│ │ │ │ ├── fab.dart
│ │ │ │ └── sliver_appbar_actions.dart
│ │ │ └── main_layout_screen.dart
│ │ ├── select_contact/
│ │ │ ├── components/
│ │ │ │ ├── contacts_not_on_whatsapp_list.dart
│ │ │ │ ├── contacts_on_whatsapp_list.dart
│ │ │ │ ├── new_group_contact_community_buttons_List.dart
│ │ │ │ └── select_contact_appbar.dart
│ │ │ └── select_contact_screen.dart
│ │ ├── sender_profile/
│ │ │ ├── components/
│ │ │ │ ├── body.dart
│ │ │ │ ├── encryption_container.dart
│ │ │ │ ├── notification_container.dart
│ │ │ │ ├── phone_and_name.dart
│ │ │ │ ├── sender_profile_icons.dart
│ │ │ │ ├── sender_user_profile_appbar.dart
│ │ │ │ └── status_container.dart
│ │ │ └── sender_profile_page.dart
│ │ ├── settings/
│ │ │ ├── components/
│ │ │ │ ├── about_card.dart
│ │ │ │ ├── name_card.dart
│ │ │ │ ├── phone_card.dart
│ │ │ │ ├── profile_card.dart
│ │ │ │ ├── profile_pic_circle_card.dart
│ │ │ │ ├── setting_bottom_text.dart
│ │ │ │ └── settings_item_card.dart
│ │ │ ├── profile_screen.dart
│ │ │ └── settings_screen.dart
│ │ ├── splash/
│ │ │ ├── components/
│ │ │ │ ├── bottom_text.dart
│ │ │ │ └── splash_icon.dart
│ │ │ └── splash_screen.dart
│ │ ├── status/
│ │ │ └── status_page.dart
│ │ └── wallpaper/
│ │ └── wallpaper_screen.dart
│ ├── info.dart
│ └── main.dart
├── pubspec.yaml
└── test/
└── widget_test.dart
SYMBOL INDEX (673 symbols across 168 files)
FILE: lib/config/agora_config.dart
class AgoraConfig (line 1) | class AgoraConfig{
FILE: lib/core/enums/messge_type.dart
type MessageType (line 1) | enum MessageType{
function toEnum (line 16) | MessageType toEnum()
FILE: lib/core/error/exceptions.dart
class LocalDatabaseException (line 2) | class LocalDatabaseException implements Exception {
class CachedException (line 10) | class CachedException implements Exception {
FILE: lib/core/error/failure.dart
class Failure (line 3) | abstract class Failure extends Equatable {
class ServerFailure (line 12) | class ServerFailure extends Failure{
class LocalDatabaseFailure (line 16) | class LocalDatabaseFailure extends Failure{
class CachedFailure (line 21) | class CachedFailure extends Failure{
FILE: lib/core/extensions/extensions.dart
function height (line 15) | double height(double value)
function width (line 17) | double width(double value)
FILE: lib/core/extensions/time_extension.dart
function isSameDay (line 16) | bool isSameDay(DateTime day2)
FILE: lib/core/functions/app_dialogs.dart
class AppDialogs (line 8) | class AppDialogs {
method permissionDialog (line 9) | Future<void> permissionDialog(
method submitPhoneDialog (line 71) | Future<void> submitPhoneDialog({
function _showMyDialog (line 129) | Future<void> _showMyDialog({
FILE: lib/core/functions/date_converter.dart
class DateConverter (line 2) | class DateConverter{
method getChatContactTime (line 4) | String getChatContactTime(DateTime dateTime)
method getChatDayTime (line 19) | String getChatDayTime(DateTime dateTime)
method getLastSeenDayTime (line 33) | String getLastSeenDayTime(DateTime dateTime)
method isSameDay (line 48) | bool isSameDay(DateTime nowTime,DateTime priviesTime)
method dateConverterHoursAmPmMode (line 58) | String dateConverterHoursAmPmMode(DateTime dateTime)
method dateConverterMonth (line 90) | String dateConverterMonth(String string)
method dateConverterMonthNum (line 113) | String dateConverterMonthNum(String string)
method dateConverterOnly (line 136) | String dateConverterOnly(String string)
method dateConverterSince (line 142) | String dateConverterSince(String string)
method dateConverterHours24Mode (line 154) | String dateConverterHours24Mode(String string)
FILE: lib/core/functions/navigator.dart
function navigatePop (line 3) | void navigatePop(
function navigateAndRemove (line 9) | void navigateAndRemove(
function navigateTo (line 21) | Future<dynamic> navigateTo(
function navigateAndReplace (line 32) | void navigateAndReplace(
FILE: lib/core/network/cache_helper.dart
class CacheHelper (line 3) | class CacheHelper {
method getData (line 8) | dynamic getData({required String key})
method saveData (line 12) | Future<bool> saveData({
method removeData (line 22) | void removeData({required String key})
FILE: lib/core/services/services_locator.dart
function init (line 54) | Future<void> init()
FILE: lib/core/shared/bloc_observer.dart
class MyBlocObserver (line 4) | class MyBlocObserver extends BlocObserver {
method onCreate (line 6) | void onCreate(BlocBase bloc)
method onChange (line 14) | void onChange(BlocBase bloc, Change change)
method onError (line 22) | void onError(BlocBase bloc, Object error, StackTrace stackTrace)
method onClose (line 30) | void onClose(BlocBase bloc)
FILE: lib/core/shared/commen.dart
function showSnackBar (line 8) | void showSnackBar({
function pickImageFromGallery (line 19) | Future<File?> pickImageFromGallery(BuildContext context)
function pickGif (line 36) | Future<GiphyGif?> pickGif(BuildContext context)
function cropImage (line 51) | Future<CroppedFile?> cropImage(String path)
FILE: lib/core/shared/message_replay.dart
class MessageReplay (line 4) | class MessageReplay extends Equatable {
FILE: lib/core/shared/pop_up_menu_item_model.dart
class PopUpMenuItemModel (line 4) | class PopUpMenuItemModel extends Equatable{
FILE: lib/core/usecase/base_use_case.dart
class BaseUseCase (line 6) | abstract class BaseUseCase<T, Parameters>{
method call (line 7) | Future<Either<Failure ,T>> call(Parameters parameters)
class StreamBaseUseCase (line 10) | abstract class StreamBaseUseCase<T, Parameters>{
method call (line 11) | Stream<T> call(Parameters parameters)
class NoParameters (line 16) | class NoParameters extends Equatable{
FILE: lib/core/utils/constants/assets_manager.dart
class AppImage (line 2) | class AppImage{
FILE: lib/core/utils/constants/font_manager.dart
class FontConstants (line 3) | class FontConstants {
class FontWeightManager (line 7) | class FontWeightManager {
class FontSize (line 15) | class FontSize {
FILE: lib/core/utils/constants/strings_manager.dart
class AppStrings (line 1) | class AppStrings {
FILE: lib/core/utils/constants/values_manager.dart
class AppMargin (line 1) | class AppMargin {
class AppPadding (line 10) | class AppPadding {
class AppSize (line 23) | class AppSize {
FILE: lib/core/utils/routes/routes_manager.dart
class Routes (line 24) | class Routes {
class AppRoutes (line 44) | class AppRoutes {
method onGenerateRoute (line 45) | Route<dynamic> onGenerateRoute(RouteSettings settings)
method unDefinedRoute (line 140) | Route<dynamic> unDefinedRoute()
FILE: lib/core/utils/thems/my_colors.dart
class MyColors (line 3) | class MyColors {
class IColors (line 34) | abstract class IColors {
class LightColors (line 49) | class LightColors implements IColors {
FILE: lib/core/utils/thems/styles_manager.dart
function _getTextStyle (line 5) | TextStyle _getTextStyle(double fontSize, FontWeight fontWeight, Color co...
function getRegularStyle (line 15) | TextStyle getRegularStyle({
function getMediumStyle (line 27) | TextStyle getMediumStyle({
function getLightStyle (line 39) | TextStyle getLightStyle({
function getBoldStyle (line 51) | TextStyle getBoldStyle({
function getSemiBoldStyle (line 63) | TextStyle getSemiBoldStyle({
FILE: lib/core/utils/thems/theme_manager.dart
function createTheme (line 9) | ThemeData createTheme(IColors iColors)
function _textTheme (line 27) | TextTheme _textTheme(IColors iColors)
function _appBarTheme (line 81) | AppBarTheme _appBarTheme(IColors colors)
function tabBarTheme (line 101) | TabBarTheme tabBarTheme()
function _textButtonThemeData (line 110) | TextButtonThemeData _textButtonThemeData(IColors colors)
function _popupMenuThemeData (line 121) | PopupMenuThemeData _popupMenuThemeData(IColors iColors)
function _inputDecorationTheme (line 134) | InputDecorationTheme _inputDecorationTheme(IColors iColors)
function _elevatedButtonThemeData (line 154) | ElevatedButtonThemeData _elevatedButtonThemeData(IColors iColors)
FILE: lib/features/data/data_source/auth/local/auth_local_data_source.dart
class BaseAuthLocalDataSource (line 3) | abstract class BaseAuthLocalDataSource {
method setUserLoggedIn (line 4) | Future<void> setUserLoggedIn(String uid)
method removeUser (line 6) | Future<void> removeUser(String uid)
method getUser (line 8) | String? getUser()
class AuthLocalDataSource (line 11) | class AuthLocalDataSource extends BaseAuthLocalDataSource {
method setUserLoggedIn (line 17) | Future<void> setUserLoggedIn(String uid)
method removeUser (line 22) | Future<void> removeUser(String uid)
method getUser (line 27) | String? getUser()
FILE: lib/features/data/data_source/auth/remote/auth_remote_data_source.dart
class BaseAuthRemoteDataSource (line 14) | abstract class BaseAuthRemoteDataSource {
method signInWithPhoneNumber (line 15) | Future<void> signInWithPhoneNumber(
method verifyOtp (line 18) | Future<void> verifyOtp(VerifyOtpParameters parameters)
method saveUserDataToFirebase (line 20) | Future<void> saveUserDataToFirebase(UserDataParameters parameters)
method getCurrentUid (line 22) | Future<String> getCurrentUid()
method signOut (line 24) | Future<void> signOut()
method getCurrentUser (line 26) | Future<UserModel> getCurrentUser()
method getUserById (line 28) | Stream<UserModel> getUserById(String uId)
method setUserState (line 30) | Future<void> setUserState(bool isOnline)
method updateProfilePic (line 31) | Future<void> updateProfilePic(String path)
class AuthRemoteDataSource (line 34) | class AuthRemoteDataSource extends BaseAuthRemoteDataSource {
method getCurrentUid (line 48) | Future<String> getCurrentUid()
method signOut (line 51) | Future<void> signOut()
method signInWithPhoneNumber (line 54) | Future<void> signInWithPhoneNumber(
method verifyOtp (line 81) | Future<void> verifyOtp(VerifyOtpParameters parameters)
method saveUserDataToFirebase (line 90) | Future<void> saveUserDataToFirebase(UserDataParameters parameters)
method _storeFileToFirebase (line 119) | Future<String> _storeFileToFirebase(String path, File file)
method _deleteFileFromFirebase (line 126) | Future<void> _deleteFileFromFirebase(String path)
method getCurrentUser (line 131) | Future<UserModel> getCurrentUser()
method getUserById (line 139) | Stream<UserModel> getUserById(String uId)
method setUserState (line 149) | Future<void> setUserState(bool isOnline)
method updateProfilePic (line 157) | Future<void> updateProfilePic(String path)
FILE: lib/features/data/data_source/call/call_data_source.dart
class BaseCallDataSource (line 12) | abstract class BaseCallDataSource {
method makeCall (line 13) | Future<CallModel> makeCall(MakeCallParameters parameters)
method endCall (line 14) | Future<void> endCall(EndCallParameters parameters)
method callStream (line 15) | Stream<DocumentSnapshot> callStream()
class CallDataSource (line 18) | class CallDataSource extends BaseCallDataSource {
method _currentUser (line 24) | Future<UserModel> _currentUser()
method callStream (line 32) | Stream<DocumentSnapshot> callStream()
method endCall (line 36) | Future<void> endCall(EndCallParameters parameters)
method makeCall (line 42) | Future<CallModel> makeCall(MakeCallParameters parameters)
FILE: lib/features/data/data_source/chat/local/chat_local_data_source.dart
class BaseChatLocalDataSource (line 4) | abstract class BaseChatLocalDataSource{
method pickGif (line 5) | Future<GiphyGif?> pickGif(BuildContext context)
class ChatLocalDataSource (line 8) | class ChatLocalDataSource extends BaseChatLocalDataSource{
method pickGif (line 10) | Future<GiphyGif?> pickGif(BuildContext context)
FILE: lib/features/data/data_source/chat/remote/chat_remote_data_source.dart
class BaseChatRemoteDataSource (line 19) | abstract class BaseChatRemoteDataSource {
method sendTextMessage (line 20) | Future<void> sendTextMessage(TextMessageParameters parameters)
method sendFileMessage (line 22) | Future<void> sendFileMessage(FileMessageParameters parameters)
method sendGifMessage (line 24) | Future<void> sendGifMessage(GifMessageParameters parameters)
method getChatMessages (line 26) | Stream<List<MessageModel>> getChatMessages(
method getContactsChat (line 29) | Stream<List<ContactChatModel>> getContactsChat(Map<String, dynamic> map)
method setChatMessageSeen (line 31) | Future<void> setChatMessageSeen(SetChatMessageSeenParameters parameters)
method getNumOfMessageNotSeen (line 32) | Stream<int> getNumOfMessageNotSeen(String senderId)
class ChatRemoteDataSource (line 35) | class ChatRemoteDataSource extends BaseChatRemoteDataSource {
method _currentUser (line 42) | Future<UserModel> _currentUser()
method sendTextMessage (line 50) | Future<void> sendTextMessage(TextMessageParameters parameters)
method _saveDataToContactsSubCollection (line 78) | void _saveDataToContactsSubCollection(
method _saveMessageToMessageSubCollection (line 117) | void _saveMessageToMessageSubCollection({
method sendFileMessage (line 166) | Future<void> sendFileMessage(FileMessageParameters parameters)
method _storeFileToFirebase (line 216) | Future<String> _storeFileToFirebase(String path, File file)
method sendGifMessage (line 224) | Future<void> sendGifMessage(GifMessageParameters parameters)
method getChatMessages (line 251) | Stream<List<MessageModel>> getChatMessages(
method getContactsChat (line 271) | Stream<List<ContactChatModel>> getContactsChat(Map<String, dynamic> map)
method getNumOfMessageNotSeen (line 306) | Stream<int> getNumOfMessageNotSeen(String senderId)
method setChatMessageSeen (line 330) | Future<void> setChatMessageSeen(
FILE: lib/features/data/data_source/firebase_storage_remote_data_source.dart
class BaseFirebaseStorageRemoteDataSource (line 5) | abstract class BaseFirebaseStorageRemoteDataSource{
method storeFileToFirebase (line 6) | Future<String> storeFileToFirebase(String path, File file)
class FirebaseStorageRemoteDataSource (line 9) | class FirebaseStorageRemoteDataSource extends BaseFirebaseStorageRemoteD...
method storeFileToFirebase (line 15) | Future<String> storeFileToFirebase(String path, File file)
FILE: lib/features/data/data_source/select_contact/local/get_contacts_local_data_source.dart
class BaseSelectContactsLocalDataSource (line 4) | abstract class BaseSelectContactsLocalDataSource{
method getContacts (line 5) | Future<List<Contact>> getContacts()
class SelectContactsLocalDataSource (line 8) | class SelectContactsLocalDataSource extends BaseSelectContactsLocalDataS...
method getContacts (line 10) | Future<List<Contact>> getContacts()
FILE: lib/features/data/data_source/select_contact/remote/select_contact_remote_data_source.dart
class BaseSelectContactsRemoteDataSource (line 8) | abstract class BaseSelectContactsRemoteDataSource {
method getAllContacts (line 9) | Future<void> getAllContacts(List<Contact> contacts)
method contactsOnWhatsApp (line 11) | Future<Map<String, dynamic>> contactsOnWhatsApp()
method contactsNotOnWhatsApp (line 13) | Future<List<Contact>> contactsNotOnWhatsApp()
class SelectContactsRemoteDataSource (line 18) | class SelectContactsRemoteDataSource
method contactsNotOnWhatsApp (line 30) | Future<List<Contact>> contactsNotOnWhatsApp()
method contactsOnWhatsApp (line 33) | Future<Map<String, dynamic>> contactsOnWhatsApp()
method getAllContacts (line 37) | Future<void> getAllContacts(List<Contact> contacts)
FILE: lib/features/data/models/call_model.dart
class CallModel (line 3) | class CallModel extends Call {
method toMap (line 15) | Map<String, dynamic> toMap()
FILE: lib/features/data/models/contact_chat_model.dart
class ContactChatModel (line 3) | class ContactChatModel extends ContactChat {
method toMAp (line 13) | Map<String, dynamic> toMAp()
FILE: lib/features/data/models/message_model.dart
class MessageModel (line 4) | class MessageModel extends Message {
method toMap (line 19) | Map<String, dynamic> toMap()
FILE: lib/features/data/models/user_model.dart
class UserModel (line 3) | class UserModel extends UserEntity {
method toMap (line 15) | Map<String, dynamic> toMap()
FILE: lib/features/data/repository/auth_repository.dart
class AuthRepository (line 15) | class AuthRepository extends BaseAuthRepository {
method signInWithPhoneNumber (line 25) | Future<Either<Failure, void>> signInWithPhoneNumber(
method verifyOtp (line 37) | Future<Either<Failure, void>> verifyOtp(
method saveUserDataToFirebase (line 48) | Future<Either<Failure, void>> saveUserDataToFirebase(
method getCurrentUid (line 60) | Future<Either<Failure, String>> getCurrentUid()
method signOut (line 71) | Future<Either<Failure, void>> signOut()
method getCachedLocalCurrentUid (line 82) | Future<Either<Failure, String>> getCachedLocalCurrentUid()
method getCurrentUser (line 92) | Future<Either<Failure, UserModel>> getCurrentUser()
method setUserState (line 102) | Future<Either<Failure, void>> setUserState(bool isOnline)
method getUserById (line 112) | Stream<UserEntity> getUserById(String uId)
method updateProfilePic (line 117) | Future<Either<Failure, void>> updateProfilePic(String path)
FILE: lib/features/data/repository/call_repository.dart
class CallRepository (line 11) | class CallRepository extends BaseCallRepository{
method callStream (line 17) | Stream<DocumentSnapshot<Object?>> callStream()
method endCall (line 20) | Future<Either<Failure, void>> endCall(EndCallParameters parameters)
method makeCall (line 30) | Future<Either<Failure, Call>> makeCall(MakeCallParameters parameters)
FILE: lib/features/data/repository/chat_repository.dart
class ChatRepository (line 15) | class ChatRepository extends BaseChatRepository {
method getChatMessages (line 22) | Stream<List<Message>> getChatMessages(GetChatMessagesParameters parame...
method getContactsChat (line 27) | Stream<List<ContactChat>> getContactsChat(Map<String,dynamic> map)
method sendFileMessage (line 32) | Future<Either<Failure, void>> sendFileMessage(FileMessageParameters pa...
method sendTextMessage (line 42) | Future<Either<Failure, void>> sendTextMessage(TextMessageParameters pa...
method setChatMessageSeen (line 52) | Future<Either<Failure, void>> setChatMessageSeen(SetChatMessageSeenPar...
method sendGifMessage (line 62) | Future<Either<Failure, void>> sendGifMessage(GifMessageParameters para...
method getNumOfMessageNotSeen (line 73) | Stream<int> getNumOfMessageNotSeen(String senderId)
FILE: lib/features/data/repository/select_contact_Repository.dart
class SelectContactRepository (line 11) | class SelectContactRepository extends BaseSelectContactRepository{
method getAllContacts (line 18) | Future<Either<Failure, void>> getAllContacts()
method getContactsNotOnWhatsApp (line 30) | Future<Either<Failure, List<Contact>>> getContactsNotOnWhatsApp()
method getContactsOnWhatsApp (line 40) | Future<Either<Failure, Map<String,dynamic>>> getContactsOnWhatsApp()
FILE: lib/features/domain/entities/call.dart
class Call (line 3) | class Call extends Equatable {
FILE: lib/features/domain/entities/contact_chat.dart
class ContactChat (line 3) | class ContactChat extends Equatable {
FILE: lib/features/domain/entities/message.dart
class Message (line 5) | class Message extends Equatable {
FILE: lib/features/domain/entities/user.dart
class UserEntity (line 3) | class UserEntity extends Equatable {
FILE: lib/features/domain/repository/base_auth_repository.dart
class BaseAuthRepository (line 9) | abstract class BaseAuthRepository{
method signInWithPhoneNumber (line 10) | Future<Either<Failure, void>> signInWithPhoneNumber(SignInWithPhoneNum...
method verifyOtp (line 11) | Future<Either<Failure, void>> verifyOtp(VerifyOtpParameters parameters)
method saveUserDataToFirebase (line 12) | Future<Either<Failure,void>> saveUserDataToFirebase(UserDataParameters...
method getCurrentUid (line 13) | Future<Either<Failure,String>> getCurrentUid()
method getCachedLocalCurrentUid (line 14) | Future<Either<Failure,String>> getCachedLocalCurrentUid()
method signOut (line 15) | Future<Either<Failure,void>> signOut()
method getCurrentUser (line 16) | Future<Either<Failure,UserEntity>> getCurrentUser()
method getUserById (line 17) | Stream<UserEntity> getUserById(String uId)
method setUserState (line 18) | Future<Either<Failure,void>> setUserState(bool isOnline)
method updateProfilePic (line 19) | Future<Either<Failure,void>> updateProfilePic(String path)
FILE: lib/features/domain/repository/base_call_repository.dart
class BaseCallRepository (line 9) | abstract class BaseCallRepository{
method makeCall (line 10) | Future<Either<Failure,Call>> makeCall(MakeCallParameters parameters)
method endCall (line 11) | Future<Either<Failure,void>> endCall(EndCallParameters parameters)
method callStream (line 12) | Stream<DocumentSnapshot> callStream()
FILE: lib/features/domain/repository/base_chat_repository.dart
class BaseChatRepository (line 12) | abstract class BaseChatRepository{
method sendTextMessage (line 13) | Future<Either<Failure,void>> sendTextMessage(TextMessageParameters par...
method sendFileMessage (line 14) | Future<Either<Failure,void>> sendFileMessage(FileMessageParameters par...
method sendGifMessage (line 15) | Future<Either<Failure,void>> sendGifMessage(GifMessageParameters param...
method getContactsChat (line 16) | Stream<List<ContactChat>> getContactsChat(Map<String,dynamic> map)
method getChatMessages (line 17) | Stream<List<Message>> getChatMessages(GetChatMessagesParameters parame...
method setChatMessageSeen (line 18) | Future<Either<Failure,void>> setChatMessageSeen(SetChatMessageSeenPara...
method getNumOfMessageNotSeen (line 19) | Stream<int> getNumOfMessageNotSeen(String senderId)
FILE: lib/features/domain/repository/base_select_contact_repository.dart
class BaseSelectContactRepository (line 7) | abstract class BaseSelectContactRepository{
method getAllContacts (line 8) | Future<Either<Failure,void>> getAllContacts()
method getContactsNotOnWhatsApp (line 9) | Future<Either<Failure,List<Contact>>> getContactsNotOnWhatsApp()
method getContactsOnWhatsApp (line 10) | Future<Either<Failure,Map<String,dynamic>>> getContactsOnWhatsApp()
FILE: lib/features/domain/usecases/auth/get_cached_local_current_uid_usecase.dart
class GetCachedLocalCurrentUidUseCase (line 7) | class GetCachedLocalCurrentUidUseCase extends BaseUseCase<String , NoPar...
method call (line 12) | Future<Either<Failure, String>> call(NoParameters parameters)
FILE: lib/features/domain/usecases/auth/get_current_uid_usecase.dart
class GetCurrentUidUseCase (line 7) | class GetCurrentUidUseCase extends BaseUseCase<String, NoParameters>{
method call (line 12) | Future<Either<Failure, String>> call(NoParameters parameters)
FILE: lib/features/domain/usecases/auth/get_current_user_usecase.dart
class GetCurrentUserUseCase (line 7) | class GetCurrentUserUseCase extends BaseUseCase<UserEntity,NoParameters>{
method call (line 12) | Future<Either<Failure, UserEntity>> call(NoParameters parameters)
FILE: lib/features/domain/usecases/auth/get_user_by_id_usecase.dart
class GetUserByIdUseCase (line 5) | class GetUserByIdUseCase extends StreamBaseUseCase<UserEntity, String> {
method call (line 11) | Stream<UserEntity> call(String parameters)
FILE: lib/features/domain/usecases/auth/save_userdata_to_firebase_usecase.dart
class SaveUserDataToFirebaseUseCase (line 11) | class SaveUserDataToFirebaseUseCase extends BaseUseCase<void ,UserDataPa...
method call (line 16) | Future<Either<Failure, void>> call(UserDataParameters parameters)
class UserDataParameters (line 22) | class UserDataParameters extends Equatable {
FILE: lib/features/domain/usecases/auth/set_user_state_usecase.dart
class SetUserStateUseCase (line 7) | class SetUserStateUseCase extends BaseUseCase<void , bool>{
method call (line 12) | Future<Either<Failure, void>> call(bool parameters)
FILE: lib/features/domain/usecases/auth/sign_in_with_phone_number_usecase.dart
class SignInWithPhoneNumberUseCase (line 8) | class SignInWithPhoneNumberUseCase extends BaseUseCase<void, SignInWithP...
method call (line 13) | Future<Either<Failure, void>> call(SignInWithPhoneNumberParameters par...
class SignInWithPhoneNumberParameters (line 19) | class SignInWithPhoneNumberParameters extends Equatable {
FILE: lib/features/domain/usecases/auth/signout_usecase.dart
class SignOutUseCase (line 7) | class SignOutUseCase extends BaseUseCase<void,NoParameters>{
method call (line 12) | Future<Either<Failure, void>> call(NoParameters parameters)
FILE: lib/features/domain/usecases/auth/update_profile_pic_usecase.dart
class UpdateProfilePicUseCase (line 6) | class UpdateProfilePicUseCase extends BaseUseCase<void,String>{
method call (line 11) | Future<Either<Failure, void>> call(String parameters)
FILE: lib/features/domain/usecases/auth/verify_otp_usecase.dart
class VerifyOtpUseCase (line 8) | class VerifyOtpUseCase extends BaseUseCase<void, VerifyOtpParameters> {
method call (line 14) | Future<Either<Failure, void>> call(VerifyOtpParameters parameters)
class VerifyOtpParameters (line 19) | class VerifyOtpParameters extends Equatable {
FILE: lib/features/domain/usecases/call/call_stream_usecase.dart
class CallStreamUseCase (line 6) | class CallStreamUseCase extends StreamBaseUseCase<DocumentSnapshot,NoPar...
method call (line 11) | Stream<DocumentSnapshot> call(NoParameters parameters)
FILE: lib/features/domain/usecases/call/end_call_usecase.dart
class EndCallUseCase (line 8) | class EndCallUseCase extends BaseUseCase<void, EndCallParameters> {
method call (line 14) | Future<Either<Failure, void>> call(EndCallParameters parameters)
class EndCallParameters (line 19) | class EndCallParameters extends Equatable {
FILE: lib/features/domain/usecases/call/make_call_usecase.dart
class MakeCallUseCase (line 10) | class MakeCallUseCase extends BaseUseCase<Call, MakeCallParameters> {
method call (line 16) | Future<Either<Failure, Call>> call(MakeCallParameters parameters)
class MakeCallParameters (line 21) | class MakeCallParameters extends Equatable {
FILE: lib/features/domain/usecases/chat/get_chat_messages_usecase.dart
class GetChatMessagesUseCase (line 21) | class GetChatMessagesUseCase extends StreamBaseUseCase<List<Message>, Ge...
method call (line 27) | Stream<List<Message>> call(GetChatMessagesParameters parameters)
class GetChatMessagesParameters (line 33) | class GetChatMessagesParameters extends Equatable {
FILE: lib/features/domain/usecases/chat/get_contacts_chat_usecase.dart
class GetContactsChatUseCase (line 8) | class GetContactsChatUseCase extends StreamBaseUseCase<List<ContactChat>...
method call (line 13) | Stream<List<ContactChat>> call(Map<String,dynamic> parameters)
FILE: lib/features/domain/usecases/chat/get_num_of_message_not_seen_usecase.dart
class GetNumberOfMessageNotSeenUseCase (line 5) | class GetNumberOfMessageNotSeenUseCase extends StreamBaseUseCase<int,Str...
method call (line 10) | Stream<int> call(String parameters)
FILE: lib/features/domain/usecases/chat/send_file_message_usecase.dart
class SendFileMessageUseCase (line 11) | class SendFileMessageUseCase extends BaseUseCase<void, FileMessageParame...
method call (line 17) | Future<Either<Failure, void>> call(FileMessageParameters parameters)
class FileMessageParameters (line 22) | class FileMessageParameters extends Equatable {
FILE: lib/features/domain/usecases/chat/send_gif_message_usecase.dart
class SendGifMessageUseCase (line 9) | class SendGifMessageUseCase extends BaseUseCase<void, GifMessageParamete...
method call (line 15) | Future<Either<Failure, void>> call(GifMessageParameters parameters)
class GifMessageParameters (line 20) | class GifMessageParameters extends Equatable {
FILE: lib/features/domain/usecases/chat/send_text_message_usecase.dart
class SendTextMessageUseCase (line 9) | class SendTextMessageUseCase extends BaseUseCase<void, TextMessageParame...
method call (line 15) | Future<Either<Failure, void>> call(TextMessageParameters parameters)
class TextMessageParameters (line 20) | class TextMessageParameters extends Equatable {
FILE: lib/features/domain/usecases/chat/set_chat_message_seen_usecase.dart
class SetChatMessageSeenUseCase (line 7) | class SetChatMessageSeenUseCase extends BaseUseCase<void,SetChatMessageS...
method call (line 12) | Future<Either<Failure, void>> call(SetChatMessageSeenParameters parame...
class SetChatMessageSeenParameters (line 18) | class SetChatMessageSeenParameters extends Equatable{
FILE: lib/features/domain/usecases/select_contact/get_all_contacts_usecase.dart
class GetAllContactsUseCase (line 7) | class GetAllContactsUseCase extends BaseUseCase<void, NoParameters>{
method call (line 12) | Future<Either<Failure, void>> call(NoParameters parameters)
FILE: lib/features/domain/usecases/select_contact/get_contacts_not_on_whats_usecase.dart
class GetContactsNotOnWhatsUseCase (line 7) | class GetContactsNotOnWhatsUseCase extends BaseUseCase<List<Contact>, No...
method call (line 12) | Future<Either<Failure, List<Contact>>> call(NoParameters parameters)
FILE: lib/features/domain/usecases/select_contact/get_contacts_on_whats_usecase.dart
class GetContactsOnWhatsUseCase (line 7) | class GetContactsOnWhatsUseCase extends BaseUseCase<Map<String,dynamic>,...
method call (line 12) | Future<Either<Failure, Map<String,dynamic>>> call(NoParameters paramet...
FILE: lib/features/presentation/components/contact_profile_pic_dialog.dart
function showContactProfilePicDialog (line 8) | Future<void> showContactProfilePicDialog(
FILE: lib/features/presentation/components/custom_list_tile.dart
class CustomListTile (line 6) | class CustomListTile extends StatelessWidget {
method build (line 29) | Widget build(BuildContext context)
FILE: lib/features/presentation/components/custom_network_image.dart
class CustomNetworkImage (line 5) | class CustomNetworkImage extends StatelessWidget {
method build (line 10) | Widget build(BuildContext context)
FILE: lib/features/presentation/components/custom_pop_up_menu_button.dart
class CustomPopUpMenuButton (line 5) | class CustomPopUpMenuButton extends StatelessWidget {
method build (line 12) | Widget build(BuildContext context)
FILE: lib/features/presentation/components/custom_text.dart
class CustomText (line 3) | class CustomText extends StatelessWidget {
method build (line 9) | Widget build(BuildContext context)
FILE: lib/features/presentation/components/default_button.dart
class DefaultButton (line 3) | class DefaultButton extends StatelessWidget {
method build (line 16) | Widget build(BuildContext context)
FILE: lib/features/presentation/components/loader.dart
class Loader (line 3) | class Loader extends StatelessWidget {
method build (line 7) | Widget build(BuildContext context)
FILE: lib/features/presentation/components/my_cached_net_image.dart
class MyCachedNetImage (line 6) | class MyCachedNetImage extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
FILE: lib/features/presentation/components/update_profile_pic_model_bottom_sheet.dart
function showUpdateProfilePicModelBottomSheet (line 12) | Future<void> showUpdateProfilePicModelBottomSheet(BuildContext context)
function selectImageFromGallery (line 57) | void selectImageFromGallery(BuildContext context)
class PickProfileImage (line 69) | class PickProfileImage extends StatelessWidget {
method build (line 82) | Widget build(BuildContext context)
FILE: lib/features/presentation/controllers/auth_cubit/auth_cubit.dart
class AuthCubit (line 21) | class AuthCubit extends Cubit<AuthState> {
method get (line 44) | AuthCubit get(context)
method setCountry (line 48) | void setCountry(Country myCountry)
method signInWithPhoneNumber (line 53) | Future<void> signInWithPhoneNumber({required String phoneNumber})
method verifyOtp (line 68) | Future<void> verifyOtp({required String smsOtpCode})
method saveUserDataToFirebase (line 81) | Future<void> saveUserDataToFirebase({
method signOut (line 96) | Future<void> signOut()
method getCurrentUser (line 107) | Future<void> getCurrentUser()
method getCachedCurrentUid (line 119) | Future<void> getCachedCurrentUid()
method getUserById (line 127) | Stream<UserEntity> getUserById(String uId)
method setUserState (line 131) | Future<void> setUserState(bool isOnline)
method updateProfilePic (line 139) | Future<void> updateProfilePic(String path)
FILE: lib/features/presentation/controllers/auth_cubit/auth_state.dart
class AuthState (line 3) | abstract class AuthState extends Equatable {
class AuthInitial (line 7) | class AuthInitial extends AuthState {
class SetCountrySuccessState (line 12) | class SetCountrySuccessState extends AuthState{
class SignInLoadingState (line 18) | class SignInLoadingState extends AuthState{
class SignInSuccessState (line 23) | class SignInSuccessState extends AuthState{
class SignInErrorState (line 28) | class SignInErrorState extends AuthState{
class VerifyOtpLoadingState (line 33) | class VerifyOtpLoadingState extends AuthState{
class VerifyOtpSuccessState (line 38) | class VerifyOtpSuccessState extends AuthState{
class VerifyOtpErrorState (line 43) | class VerifyOtpErrorState extends AuthState{
class SaveUserDataToFirebaseLoadingState (line 48) | class SaveUserDataToFirebaseLoadingState extends AuthState{
class SaveUserDataToFirebaseSuccessState (line 53) | class SaveUserDataToFirebaseSuccessState extends AuthState{
class SaveUserDataToFirebaseErrorState (line 58) | class SaveUserDataToFirebaseErrorState extends AuthState{
class SignOutLoadingState (line 63) | class SignOutLoadingState extends AuthState{
class SignOutSuccessState (line 68) | class SignOutSuccessState extends AuthState{
class SignOutErrorState (line 73) | class SignOutErrorState extends AuthState{
class GetCurrentLocalSuccessState (line 79) | class GetCurrentLocalSuccessState extends AuthState{
class GetCurrentLocalErrorState (line 87) | class GetCurrentLocalErrorState extends AuthState{
class SetUserStateErrorState (line 92) | class SetUserStateErrorState extends AuthState{
class SetUserStateSuccessState (line 97) | class SetUserStateSuccessState extends AuthState{
class GetCurrentUserLoadingState (line 102) | class GetCurrentUserLoadingState extends AuthState{
class GetCurrentUserErrorState (line 107) | class GetCurrentUserErrorState extends AuthState{
class GetCurrentUserSuccessState (line 112) | class GetCurrentUserSuccessState extends AuthState{
class UpdateProfilePicLoadingState (line 117) | class UpdateProfilePicLoadingState extends AuthState{
class UpdateProfilePicErrorState (line 122) | class UpdateProfilePicErrorState extends AuthState{
class UpdateProfilePicSuccessState (line 127) | class UpdateProfilePicSuccessState extends AuthState{
FILE: lib/features/presentation/controllers/bottom_chat_cubit/bottom_chat_cubit.dart
class BottomChatCubit (line 7) | class BottomChatCubit extends Cubit<BottomChatState> {
method get (line 10) | BottomChatCubit get(context)
method showEmojiContainer (line 16) | void showEmojiContainer()
method hideEmojiContainer (line 21) | void hideEmojiContainer()
method toggleEmojiKeyboard (line 26) | void toggleEmojiKeyboard(FocusNode focusNode)
method onTextFieldValChanged (line 36) | void onTextFieldValChanged(String val)
FILE: lib/features/presentation/controllers/bottom_chat_cubit/bottom_chat_state.dart
class BottomChatState (line 3) | abstract class BottomChatState extends Equatable {
class BottomChatInitial (line 7) | class BottomChatInitial extends BottomChatState {
class ShowEmojiContainerState (line 12) | class ShowEmojiContainerState extends BottomChatState {
class HideEmojiContainerState (line 17) | class HideEmojiContainerState extends BottomChatState {
class ToggleEmojiKeyboardState (line 22) | class ToggleEmojiKeyboardState extends BottomChatState {
class IsShowSendButtonFalseState (line 28) | class IsShowSendButtonFalseState extends BottomChatState {
class IsShowSendButtonTrueState (line 33) | class IsShowSendButtonTrueState extends BottomChatState {
FILE: lib/features/presentation/controllers/call_cubit/call_cubit.dart
class CallCubit (line 13) | class CallCubit extends Cubit<CallState> {
method get (line 24) | CallCubit get(context)
method callStream (line 26) | Stream<DocumentSnapshot> callStream()
method makeCall (line 29) | Future<void> makeCall({
method endCall (line 48) | Future<void> endCall({
FILE: lib/features/presentation/controllers/call_cubit/call_state.dart
class CallState (line 3) | abstract class CallState extends Equatable {
class CallInitial (line 7) | class CallInitial extends CallState {
class MakeCallLoadingState (line 12) | class MakeCallLoadingState extends CallState {
class MakeCallSuccessState (line 17) | class MakeCallSuccessState extends CallState {
class MakeCallErrorState (line 25) | class MakeCallErrorState extends CallState {
class EndCallLoadingState (line 30) | class EndCallLoadingState extends CallState {
class EndCallSuccessState (line 35) | class EndCallSuccessState extends CallState {
class EndCallErrorState (line 40) | class EndCallErrorState extends CallState {
FILE: lib/features/presentation/controllers/chat_background_cubit/chat_background_cubit.dart
class ChatBackgroundCubit (line 7) | class ChatBackgroundCubit extends Cubit<ChatBackgroundState> {
method get (line 9) | ChatBackgroundCubit get(context)
method changeBackground (line 13) | void changeBackground(String image)
FILE: lib/features/presentation/controllers/chat_background_cubit/chat_background_state.dart
class ChatBackgroundState (line 3) | abstract class ChatBackgroundState extends Equatable {
class ChatBackgroundInitial (line 7) | class ChatBackgroundInitial extends ChatBackgroundState {
class ChangeBackgroundLoadingState (line 12) | class ChangeBackgroundLoadingState extends ChatBackgroundState {
class ChangeBackgroundSuccessState (line 17) | class ChangeBackgroundSuccessState extends ChatBackgroundState {
FILE: lib/features/presentation/controllers/chat_cubit/chat_cubit.dart
class ChatCubit (line 20) | class ChatCubit extends Cubit<ChatState> {
method get (line 41) | ChatCubit get(context)
method onMessageSwipe (line 45) | void onMessageSwipe({
method cancelReplay (line 61) | void cancelReplay()
method sendTextMessage (line 68) | Future<void> sendTextMessage({
method sendGifMessage (line 87) | Future<void> sendGifMessage({
method sendFileMessage (line 105) | Future<void> sendFileMessage({
method getContactsChat (line 128) | Stream<List<ContactChat>> getContactsChat(Map<String, dynamic> map)
method getChatMessages (line 132) | Stream<List<Message>> getChatMessages(String receiverId)
method setChatMessageSeen (line 143) | Future<void> setChatMessageSeen({
method numOfMessageNotSeen (line 160) | Stream<int> numOfMessageNotSeen(String senderId)
FILE: lib/features/presentation/controllers/chat_cubit/chat_state.dart
class ChatState (line 3) | abstract class ChatState extends Equatable {
class ChatInitial (line 7) | class ChatInitial extends ChatState {
class SendMessageLoadingState (line 12) | class SendMessageLoadingState extends ChatState{
class SendMessageSuccessState (line 17) | class SendMessageSuccessState extends ChatState{
class SendMessageErrorState (line 22) | class SendMessageErrorState extends ChatState{
class GetContactNameErrorState (line 27) | class GetContactNameErrorState extends ChatState{
class GetContactNameSuccessState (line 31) | class GetContactNameSuccessState extends ChatState{
class MessageSwipeLoadingState (line 37) | class MessageSwipeLoadingState extends ChatState{
class MessageSwipeState (line 41) | class MessageSwipeState extends ChatState{
class CancelReplayState (line 46) | class CancelReplayState extends ChatState{
FILE: lib/features/presentation/controllers/select_contact_cubit/select_contact_cubit.dart
class SelectContactCubit (line 12) | class SelectContactCubit extends Cubit<SelectContactState> {
method get (line 23) | SelectContactCubit get(context)
method getAllContacts (line 25) | Future<void> getAllContacts()
method getContactsNotOnWhatsApp (line 37) | Future<void> getContactsNotOnWhatsApp()
method getContactsOnWhatsApp (line 54) | Future<void> getContactsOnWhatsApp()
FILE: lib/features/presentation/controllers/select_contact_cubit/select_contact_state.dart
class SelectContactState (line 3) | abstract class SelectContactState extends Equatable {
class SelectContactInitial (line 7) | class SelectContactInitial extends SelectContactState {
class GetAllContactsLoadingState (line 12) | class GetAllContactsLoadingState extends SelectContactState {
class GetAllContactsSuccessState (line 17) | class GetAllContactsSuccessState extends SelectContactState {
class GetAllContactsErrorState (line 22) | class GetAllContactsErrorState extends SelectContactState {
class GetContactsNotOnWhatsLoadingState (line 27) | class GetContactsNotOnWhatsLoadingState extends SelectContactState {
class GetContactsNotOnWhatsSuccessState (line 32) | class GetContactsNotOnWhatsSuccessState extends SelectContactState {
class GetContactsNotOnWhatsErrorState (line 37) | class GetContactsNotOnWhatsErrorState extends SelectContactState {
class GetContactsOnWhatsLoadingState (line 42) | class GetContactsOnWhatsLoadingState extends SelectContactState {
class GetContactsOnWhatsSuccessState (line 47) | class GetContactsOnWhatsSuccessState extends SelectContactState {
class GetContactsOnWhatsErrorState (line 52) | class GetContactsOnWhatsErrorState extends SelectContactState {
FILE: lib/features/presentation/views/calls/call_pickup_screen.dart
class CallPickupScreen (line 10) | class CallPickupScreen extends StatelessWidget {
method build (line 16) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/calls/call_screen.dart
class CallScreen (line 7) | class CallScreen extends StatefulWidget {
method createState (line 14) | State<CallScreen> createState()
class _CallScreenState (line 17) | class _CallScreenState extends State<CallScreen> {
method initState (line 22) | void initState()
method initAgora (line 34) | void initAgora()
method build (line 38) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/calls/calls_page.dart
class CallsPage (line 3) | class CallsPage extends StatelessWidget {
method build (line 7) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/camera/camera_screen.dart
class CameraScreen (line 12) | class CameraScreen extends StatefulWidget {
method createState (line 17) | State<CameraScreen> createState()
class _CameraScreenState (line 20) | class _CameraScreenState extends State<CameraScreen> {
method initState (line 28) | void initState()
method build (line 35) | Widget build(BuildContext context)
method cameraIcon (line 122) | Icon cameraIcon()
method toggleFlash (line 136) | void toggleFlash()
method toggleCameraFront (line 145) | void toggleCameraFront()
method takePhoto (line 155) | void takePhoto(BuildContext context)
method dispose (line 167) | void dispose()
FILE: lib/features/presentation/views/camera/components/camera_appbar.dart
class CameraAppBar (line 6) | class CameraAppBar extends StatelessWidget implements PreferredSizeWidget {
method build (line 17) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/camera/components/image_view_top_row_icons.dart
class ImageViewTopRowIcons (line 5) | class ImageViewTopRowIcons extends StatelessWidget {
method build (line 12) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/camera/components/select_image_from_gallery_button.dart
class SelectImageFromGalleryButton (line 9) | class SelectImageFromGalleryButton extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
method selectImageFromGallery (line 34) | void selectImageFromGallery(BuildContext context)
FILE: lib/features/presentation/views/camera/components/sending_image_video_bottom_roww_widget.dart
class SendingImageVideoBottomRowWidget (line 6) | class SendingImageVideoBottomRowWidget extends StatelessWidget {
method build (line 14) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/camera/components/video_view_top_row_widget.dart
class VideoViewTopRowWidget (line 5) | class VideoViewTopRowWidget extends StatelessWidget {
method build (line 11) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/camera/sending_image_view_page.dart
class SendingImageViewPage (line 11) | class SendingImageViewPage extends StatefulWidget {
method createState (line 22) | State<SendingImageViewPage> createState()
class _SendingImageViewPageState (line 25) | class _SendingImageViewPageState extends State<SendingImageViewPage> {
method build (line 27) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/camera/sending_video_view_page.dart
class SendingVideoViewPage (line 11) | class SendingVideoViewPage extends StatefulWidget {
method createState (line 22) | State<SendingVideoViewPage> createState()
class _SendingVideoViewPageState (line 25) | class _SendingVideoViewPageState extends State<SendingVideoViewPage> {
method initState (line 29) | void initState()
method build (line 39) | Widget build(BuildContext context)
method playPauseButton (line 80) | Align playPauseButton()
method dispose (line 104) | void dispose()
FILE: lib/features/presentation/views/chat/chat_screen.dart
class ChatScreen (line 11) | class ChatScreen extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/chat/components/bottom_field/attchment_pop_up.dart
class AttchementPopUp (line 4) | class AttchementPopUp extends StatelessWidget {
method build (line 10) | Widget build(BuildContext context)
class AttchmentCard (line 106) | class AttchmentCard extends StatelessWidget {
method build (line 121) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/chat/components/bottom_field/bottom_chat_field.dart
class BottomChatField (line 13) | class BottomChatField extends StatelessWidget {
method build (line 32) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/chat/components/bottom_field/bottom_chat_with_icon.dart
class BottomChatWithIcon (line 11) | class BottomChatWithIcon extends StatefulWidget {
method createState (line 20) | State<BottomChatWithIcon> createState()
class _BottomChatWithIconState (line 23) | class _BottomChatWithIconState extends State<BottomChatWithIcon> {
method initState (line 28) | void initState()
method build (line 38) | Widget build(BuildContext context)
method selectGif (line 122) | void selectGif(ChatCubit cubit)
method sendGifMessage (line 127) | void sendGifMessage(GiphyGif? gif, ChatCubit cubit)
method dispose (line 137) | void dispose()
FILE: lib/features/presentation/views/chat/components/bottom_field/emoji_picker_widget.dart
class EmojiPickerWidget (line 7) | class EmojiPickerWidget extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/chat/components/bottom_field/recording_mic.dart
class RecordingMic (line 12) | class RecordingMic extends StatefulWidget {
method createState (line 17) | State<RecordingMic> createState()
class _RecordingMicState (line 20) | class _RecordingMicState extends State<RecordingMic> {
method initState (line 24) | void initState()
method build (line 30) | Widget build(BuildContext context)
method startRecording (line 61) | void startRecording()
method cancelRecord (line 67) | void cancelRecord()
method stopRecording (line 71) | void stopRecording()
method dispose (line 81) | void dispose()
FILE: lib/features/presentation/views/chat/components/bottom_field/recording_mic_widget.dart
class RecordingMicWidget (line 9) | class RecordingMicWidget extends StatefulWidget {
method createState (line 28) | _RecordingMicWidgetState createState()
class _RecordingMicWidgetState (line 31) | class _RecordingMicWidgetState extends State<RecordingMicWidget>
method initState (line 65) | void initState()
method build (line 171) | Widget build(BuildContext context)
method longPressUpdate (line 427) | void longPressUpdate(LongPressMoveUpdateDetails longPressData)
method resetMicPosition (line 502) | void resetMicPosition()
method dispose (line 510) | void dispose()
FILE: lib/features/presentation/views/chat/components/bottom_field/timer.dart
class TimerWidget (line 6) | class TimerWidget extends StatefulWidget {
method createState (line 10) | _TimerWidgetState createState()
class _TimerWidgetState (line 13) | class _TimerWidgetState extends State<TimerWidget> {
method initState (line 18) | void initState()
method startTimer (line 23) | void startTimer()
method addTimer (line 27) | void addTimer()
method build (line 37) | Widget build(BuildContext context)
method twoDigits (line 38) | String twoDigits(int n)
method dispose (line 51) | void dispose()
FILE: lib/features/presentation/views/chat/components/chat_appbar.dart
class ChatAppBar (line 16) | class ChatAppBar extends StatelessWidget implements PreferredSizeWidget {
method build (line 27) | Widget build(BuildContext context)
method _buttons (line 132) | List<PopUpMenuItemModel> _buttons(context)
class CustomAppBar (line 169) | class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
method build (line 173) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/chat/components/message/first_message_small_curved_bubble.dart
class FirstMessageSmallCurvedBubble (line 6) | class FirstMessageSmallCurvedBubble extends StatelessWidget {
method build (line 15) | Widget build(BuildContext context)
class MyCustomClipper (line 29) | class MyCustomClipper extends CustomClipper<Path> {
method getClip (line 35) | Path getClip(Size size)
method myCustomRightPath (line 42) | Path myCustomRightPath(Path path, Size size)
method senderCustomLeftPath (line 52) | Path senderCustomLeftPath(Path path, Size size)
method shouldReclip (line 64) | bool shouldReclip(covariant CustomClipper<Path> oldClipper)
FILE: lib/features/presentation/views/chat/components/message/message_replay_card.dart
class ReplayMessageCard (line 6) | class ReplayMessageCard extends StatelessWidget {
method build (line 24) | Widget build(BuildContext context)
class ReplayMessageContent (line 82) | class ReplayMessageContent extends StatelessWidget {
method build (line 94) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/chat/components/message/message_replay_preview.dart
class MessageReplayPreview (line 6) | class MessageReplayPreview extends StatelessWidget {
method build (line 15) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/chat/components/message/messages_list.dart
class MessagesList (line 12) | class MessagesList extends StatefulWidget {
method createState (line 21) | State<MessagesList> createState()
class _MessagesListState (line 24) | class _MessagesListState extends State<MessagesList> {
method scrollToBottom (line 28) | void scrollToBottom()
method dispose (line 37) | void dispose()
method build (line 43) | Widget build(BuildContext context)
class ChatTimeCard (line 112) | class ChatTimeCard extends StatelessWidget {
method build (line 121) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/chat/components/message/my_message_card.dart
class MyMessageCard (line 11) | class MyMessageCard extends StatelessWidget {
method build (line 22) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/chat/components/message/sender_message_card.dart
class SenderMessageCard (line 11) | class SenderMessageCard extends StatelessWidget {
method build (line 22) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/chat/components/message_content/audio_player_widget.dart
class AudioPlayerWidget (line 7) | class AudioPlayerWidget extends StatefulWidget {
method createState (line 18) | State<AudioPlayerWidget> createState()
class _AudioPlayerWidgetState (line 21) | class _AudioPlayerWidgetState extends State<AudioPlayerWidget> {
method initAudio (line 28) | void initAudio()
method pauseAudio (line 44) | void pauseAudio()
method stopAudio (line 48) | void stopAudio()
method seekAudio (line 52) | void seekAudio(Duration durationToSeek)
method build (line 57) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/chat/components/message_content/image_widget.dart
class ImageWidget (line 7) | class ImageWidget extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/chat/components/message_content/message_content.dart
class MessageContent (line 10) | class MessageContent extends StatelessWidget {
method build (line 21) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/chat/components/message_content/text_widget.dart
class TextWidget (line 7) | class TextWidget extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/chat/components/message_content/time_sent_widget.dart
class TimeSentWidget (line 7) | class TimeSentWidget extends StatelessWidget {
method build (line 20) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/chat/components/message_content/video_palyer_widget.dart
class VideoPlayerItem (line 7) | class VideoPlayerItem extends StatefulWidget {
method createState (line 18) | _VideoPlayerItemState createState()
class _VideoPlayerItemState (line 21) | class _VideoPlayerItemState extends State<VideoPlayerItem> {
method initState (line 26) | void initState()
method dispose (line 36) | void dispose()
method build (line 42) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/contacts_chat/components/chat_contact_card.dart
class ChatContactCard (line 12) | class ChatContactCard extends StatelessWidget {
method build (line 23) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/contacts_chat/contacts_chat_page.dart
class ContactsChatPage (line 8) | class ContactsChatPage extends StatelessWidget {
method build (line 12) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/login/components/landing_image.dart
class LandingImage (line 6) | class LandingImage extends StatelessWidget {
method build (line 10) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/login/components/login_appbar.dart
class LoginAppBar (line 6) | class LoginAppBar extends StatelessWidget implements PreferredSizeWidget {
method build (line 17) | Widget build(BuildContext context)
method _brightness (line 31) | Brightness _brightness(BuildContext context)
FILE: lib/features/presentation/views/login/components/login_profile_pic.dart
class LoginProfilePic (line 7) | class LoginProfilePic extends StatelessWidget {
method build (line 13) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/login/components/privacy_policy_link_and_terms_of_service.dart
class PrivacyPolicyLinkAndTermsOfService (line 8) | class PrivacyPolicyLinkAndTermsOfService extends StatelessWidget {
method build (line 12) | Widget build(BuildContext context)
method buildTextSpanBlueButton (line 50) | TextSpan buildTextSpanBlueButton({
FILE: lib/features/presentation/views/login/components/sign_out_button.dart
class SignOutButton (line 9) | class SignOutButton extends StatelessWidget {
method build (line 15) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/login/login_landing_screen.dart
class LandingScreen (line 13) | class LandingScreen extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/login/login_loading_screen.dart
class LoginLoadingScreen (line 13) | class LoginLoadingScreen extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/login/login_otp_screen.dart
class OtpScreen (line 14) | class OtpScreen extends StatefulWidget {
method createState (line 20) | State<OtpScreen> createState()
class _OtpScreenState (line 23) | class _OtpScreenState extends State<OtpScreen> {
method initState (line 26) | void initState()
method dispose (line 35) | void dispose()
method build (line 40) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/login/login_profile_info_screen.dart
class LoginProfileInfoScreen (line 14) | class LoginProfileInfoScreen extends StatefulWidget {
method createState (line 18) | State<LoginProfileInfoScreen> createState()
class _LoginProfileInfoScreenState (line 21) | class _LoginProfileInfoScreenState extends State<LoginProfileInfoScreen> {
method build (line 25) | Widget build(BuildContext context)
method dispose (line 102) | void dispose()
FILE: lib/features/presentation/views/login/login_screen.dart
class LoginScreen (line 15) | class LoginScreen extends StatefulWidget {
method createState (line 19) | State<LoginScreen> createState()
class _LoginScreenState (line 22) | class _LoginScreenState extends State<LoginScreen> {
method build (line 28) | Widget build(BuildContext context)
method dispose (line 205) | void dispose()
FILE: lib/features/presentation/views/main_layout/components/fab.dart
class FAB (line 6) | class FAB extends StatelessWidget {
method build (line 13) | Widget build(BuildContext context)
class CallsFAB (line 28) | class CallsFAB extends StatelessWidget {
method build (line 34) | Widget build(BuildContext context)
class ChatsFAB (line 42) | class ChatsFAB extends StatelessWidget {
method build (line 48) | Widget build(BuildContext context)
class StatusTwoFAB (line 58) | class StatusTwoFAB extends StatelessWidget {
method build (line 64) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/main_layout/components/sliver_appbar_actions.dart
function buildMainLayoutSliverAppBarActions (line 9) | List<Widget> buildMainLayoutSliverAppBarActions(
function actionButtons (line 42) | List<Widget> actionButtons(
function _chatPopUpMenuItem (line 60) | List<PopUpMenuItemModel> _chatPopUpMenuItem(BuildContext context)
function _statusPopUpMenuItem (line 83) | List<PopUpMenuItemModel> _statusPopUpMenuItem(BuildContext context)
function _callPopUpMenuItem (line 94) | List<PopUpMenuItemModel> _callPopUpMenuItem(BuildContext context)
FILE: lib/features/presentation/views/main_layout/main_layout_screen.dart
class MainLayoutScreen (line 11) | class MainLayoutScreen extends StatefulWidget {
method createState (line 15) | State<MainLayoutScreen> createState()
class _MainLayoutScreenState (line 18) | class _MainLayoutScreenState extends State<MainLayoutScreen>
method initState (line 25) | void initState()
method changeActions (line 33) | void changeActions()
method didChangeAppLifecycleState (line 42) | void didChangeAppLifecycleState(AppLifecycleState state)
method build (line 58) | Widget build(BuildContext context)
method dispose (line 103) | void dispose()
FILE: lib/features/presentation/views/select_contact/components/contacts_not_on_whatsapp_list.dart
class ContactsNotOnWhatsAppList (line 9) | class ContactsNotOnWhatsAppList extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/select_contact/components/contacts_on_whatsapp_list.dart
class ContactsOnWhatsAppList (line 8) | class ContactsOnWhatsAppList extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/select_contact/components/new_group_contact_community_buttons_List.dart
class NewGroupContactCommunityButtonsList (line 9) | class NewGroupContactCommunityButtonsList extends StatelessWidget {
method build (line 13) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/select_contact/components/select_contact_appbar.dart
class SelectContactAppBar (line 11) | class SelectContactAppBar extends StatelessWidget
method build (line 23) | Widget build(BuildContext context)
method _buttons (line 62) | List<PopUpMenuItemModel> _buttons(context)
FILE: lib/features/presentation/views/select_contact/select_contact_screen.dart
class SelectContactScreen (line 11) | class SelectContactScreen extends StatelessWidget {
method build (line 15) | Widget build(BuildContext context)
class SmallText (line 58) | class SmallText extends StatelessWidget {
method build (line 67) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/sender_profile/components/body.dart
class Body (line 7) | class Body extends StatelessWidget {
method build (line 13) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/sender_profile/components/encryption_container.dart
class EncryptionContainer (line 6) | class EncryptionContainer extends StatelessWidget {
method build (line 12) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/sender_profile/components/notification_container.dart
class NotificationContainer (line 6) | class NotificationContainer extends StatelessWidget {
method build (line 12) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/sender_profile/components/phone_and_name.dart
class PhoneAndName (line 5) | class PhoneAndName extends StatelessWidget {
method build (line 16) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/sender_profile/components/sender_profile_icons.dart
class SenderProfileIcons (line 6) | class SenderProfileIcons extends StatelessWidget {
method build (line 12) | Widget build(BuildContext context)
class ButtonWidget (line 27) | class ButtonWidget extends StatelessWidget {
method build (line 35) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/sender_profile/components/sender_user_profile_appbar.dart
class SenderUserProfilePageAppBar (line 12) | class SenderUserProfilePageAppBar extends SliverPersistentHeaderDelegate {
method build (line 46) | Widget build(
method displayProfilePicture (line 98) | Widget displayProfilePicture(
method displayName (line 112) | Widget displayName(double relativeFullScrollOffset)
method shouldRebuild (line 142) | bool shouldRebuild(SenderUserProfilePageAppBar oldDelegate)
FILE: lib/features/presentation/views/sender_profile/components/status_container.dart
class StatusContainer (line 5) | class StatusContainer extends StatelessWidget {
method build (line 14) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/sender_profile/sender_profile_page.dart
class SenderUserProfilePage (line 9) | class SenderUserProfilePage extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/settings/components/about_card.dart
class AboutCard (line 7) | class AboutCard extends StatelessWidget {
method build (line 16) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/settings/components/name_card.dart
class NameCard (line 8) | class NameCard extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/settings/components/phone_card.dart
class PhoneCard (line 7) | class PhoneCard extends StatelessWidget {
method build (line 16) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/settings/components/profile_card.dart
class ProfileCard (line 11) | class ProfileCard extends StatelessWidget {
method build (line 15) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/settings/components/profile_pic_circle_card.dart
class ProfilePicCircleCard (line 9) | class ProfilePicCircleCard extends StatelessWidget {
method build (line 18) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/settings/components/setting_bottom_text.dart
class SettingBottomText (line 5) | class SettingBottomText extends StatelessWidget {
method build (line 11) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/settings/components/settings_item_card.dart
class SettingsItemCard (line 5) | class SettingsItemCard extends StatelessWidget {
method build (line 14) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/settings/profile_screen.dart
class ProfileScreen (line 11) | class ProfileScreen extends StatelessWidget {
method build (line 17) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/settings/settings_screen.dart
class SettingsScreen (line 8) | class SettingsScreen extends StatelessWidget {
method build (line 12) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/splash/components/bottom_text.dart
class BottomText (line 4) | class BottomText extends StatelessWidget {
method build (line 10) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/splash/components/splash_icon.dart
class SplashIcon (line 5) | class SplashIcon extends StatelessWidget {
method build (line 11) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/splash/splash_screen.dart
class SplashScreen (line 13) | class SplashScreen extends StatefulWidget {
method createState (line 17) | State<SplashScreen> createState()
class _SplashScreenState (line 20) | class _SplashScreenState extends State<SplashScreen> {
method initState (line 34) | void initState()
method build (line 40) | Widget build(BuildContext context)
method dispose (line 59) | void dispose()
FILE: lib/features/presentation/views/status/status_page.dart
class StatusPage (line 3) | class StatusPage extends StatelessWidget {
method build (line 7) | Widget build(BuildContext context)
FILE: lib/features/presentation/views/wallpaper/wallpaper_screen.dart
class WallpaperScreen (line 6) | class WallpaperScreen extends StatelessWidget {
method build (line 10) | Widget build(BuildContext context)
FILE: lib/main.dart
function main (line 20) | Future<void> main()
class MyApp (line 29) | class MyApp extends StatelessWidget {
method build (line 33) | Widget build(BuildContext context)
FILE: test/widget_test.dart
function main (line 13) | void main()
Condensed preview — 210 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (407K chars).
[
{
"path": ".gitignore",
"chars": 701,
"preview": "# Miscellaneous\n*.class\n*.log\n*.pyc\n*.swp\n.DS_Store\n.atom/\n.buildlog/\n.history\n.svn/\nmigrate_working_dir/\n\n# IntelliJ re"
},
{
"path": ".metadata",
"chars": 1076,
"preview": "# This file tracks properties of this Flutter project.\n# Used by Flutter tool to assess capabilities and perform upgrade"
},
{
"path": "README.md",
"chars": 1239,
"preview": "# Flutter-WhatsApp-Clone-Clean-Architecture\n WhatsApp Clone with Flutter, Firebase, Bloc, Clean Code & Clean Architectur"
},
{
"path": "analysis_options.yaml",
"chars": 1453,
"preview": "# This file configures the analyzer, which statically analyzes Dart code to\n# check for errors, warnings, and lints.\n#\n#"
},
{
"path": "android/.gitignore",
"chars": 285,
"preview": "gradle-wrapper.jar\n/.gradle\n/captures/\n/gradlew\n/gradlew.bat\n/local.properties\nGeneratedPluginRegistrant.java\n\n# Remembe"
},
{
"path": "android/app/build.gradle",
"chars": 2420,
"preview": "def localProperties = new Properties()\ndef localPropertiesFile = rootProject.file('local.properties')\nif (localPropertie"
},
{
"path": "android/app/google-services.json",
"chars": 1337,
"preview": "{\n \"project_info\": {\n \"project_number\": \"528108582188\",\n \"project_id\": \"whatsapp-8d793\",\n \"storage_bucket\": \"w"
},
{
"path": "android/app/src/debug/AndroidManifest.xml",
"chars": 426,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"mogohary99.whatsapp_flutter_clone\">\n "
},
{
"path": "android/app/src/main/AndroidManifest.xml",
"chars": 2647,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"mogohary99.whatsapp_flutter_clone\">\n "
},
{
"path": "android/app/src/main/kotlin/mogohary99/whatsapp_flutter_clone/MainActivity.kt",
"chars": 138,
"preview": "package mogohary99.whatsapp_flutter_clone\n\nimport io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity: Flut"
},
{
"path": "android/app/src/main/res/drawable/launch_background.xml",
"chars": 434,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
},
{
"path": "android/app/src/main/res/drawable-v21/launch_background.xml",
"chars": 438,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- Modify this file to customize your launch splash screen -->\n<layer-list xmln"
},
{
"path": "android/app/src/main/res/values/styles.xml",
"chars": 996,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <!-- Theme applied to the Android Window while the process is sta"
},
{
"path": "android/app/src/main/res/values-night/styles.xml",
"chars": 995,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<resources>\n <!-- Theme applied to the Android Window while the process is sta"
},
{
"path": "android/app/src/profile/AndroidManifest.xml",
"chars": 426,
"preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n package=\"mogohary99.whatsapp_flutter_clone\">\n "
},
{
"path": "android/build.gradle",
"chars": 693,
"preview": "buildscript {\n ext.kotlin_version = '1.7.10'\n repositories {\n google()\n mavenCentral()\n }\n\n de"
},
{
"path": "android/gradle/wrapper/gradle-wrapper.properties",
"chars": 200,
"preview": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dist"
},
{
"path": "android/gradle.properties",
"chars": 82,
"preview": "org.gradle.jvmargs=-Xmx1536M\nandroid.useAndroidX=true\nandroid.enableJetifier=true\n"
},
{
"path": "android/settings.gradle",
"chars": 462,
"preview": "include ':app'\n\ndef localPropertiesFile = new File(rootProject.projectDir, \"local.properties\")\ndef properties = new Prop"
},
{
"path": "ios/.gitignore",
"chars": 569,
"preview": "**/dgph\n*.mode1v3\n*.mode2v3\n*.moved-aside\n*.pbxuser\n*.perspectivev3\n**/*sync/\n.sconsign.dblite\n.tags*\n**/.vagrant/\n**/De"
},
{
"path": "ios/Flutter/AppFrameworkInfo.plist",
"chars": 774,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Flutter/Debug.xcconfig",
"chars": 30,
"preview": "#include \"Generated.xcconfig\"\n"
},
{
"path": "ios/Flutter/Release.xcconfig",
"chars": 30,
"preview": "#include \"Generated.xcconfig\"\n"
},
{
"path": "ios/Runner/AppDelegate.swift",
"chars": 404,
"preview": "import UIKit\nimport Flutter\n\n@UIApplicationMain\n@objc class AppDelegate: FlutterAppDelegate {\n override func applicatio"
},
{
"path": "ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json",
"chars": 2519,
"preview": "{\n \"images\" : [\n {\n \"size\" : \"20x20\",\n \"idiom\" : \"iphone\",\n \"filename\" : \"Icon-App-20x20@2x.png\",\n "
},
{
"path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json",
"chars": 391,
"preview": "{\n \"images\" : [\n {\n \"idiom\" : \"universal\",\n \"filename\" : \"LaunchImage.png\",\n \"scale\" : \"1x\"\n },\n "
},
{
"path": "ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md",
"chars": 336,
"preview": "# Launch Screen Assets\n\nYou can customize the launch screen with your own desired assets by replacing the image files in"
},
{
"path": "ios/Runner/Base.lproj/LaunchScreen.storyboard",
"chars": 2377,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "ios/Runner/Base.lproj/Main.storyboard",
"chars": 1605,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard"
},
{
"path": "ios/Runner/Info.plist",
"chars": 1734,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner/Runner-Bridging-Header.h",
"chars": 38,
"preview": "#import \"GeneratedPluginRegistrant.h\"\n"
},
{
"path": "ios/Runner.xcodeproj/project.pbxproj",
"chars": 18613,
"preview": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 54;\n\tobjects = {\n\n/* Begin PBXBuildFile section *"
},
{
"path": "ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
"chars": 135,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"self:\">\n </FileRef"
},
{
"path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
"chars": 226,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme",
"chars": 3185,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n LastUpgradeVersion = \"1300\"\n version = \"1.3\">\n <BuildAction\n "
},
{
"path": "ios/Runner.xcworkspace/contents.xcworkspacedata",
"chars": 152,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n version = \"1.0\">\n <FileRef\n location = \"group:Runner.xcodepr"
},
{
"path": "ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
"chars": 238,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings",
"chars": 226,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/P"
},
{
"path": "lib/config/agora_config.dart",
"chars": 195,
"preview": "class AgoraConfig{\n static const String token = '';\n static const String appId = '97bc1546a8174ed0a7a7c9acdfca61f5';\n "
},
{
"path": "lib/core/enums/messge_type.dart",
"chars": 780,
"preview": "enum MessageType{\n text('text'),\n image('image'),\n gif('gif'),\n video('video'),\n audio('audio'),\n location('location'),\n"
},
{
"path": "lib/core/error/exceptions.dart",
"chars": 278,
"preview": "\nclass LocalDatabaseException implements Exception {\n final String message;\n\n const LocalDatabaseException({\n requi"
},
{
"path": "lib/core/error/failure.dart",
"chars": 446,
"preview": "import 'package:equatable/equatable.dart';\n\nabstract class Failure extends Equatable {\n final String message;\n\n const "
},
{
"path": "lib/core/extensions/extensions.dart",
"chars": 1358,
"preview": "import 'package:flutter/material.dart';\n\nextension ContextExtension on BuildContext {\n MediaQueryData get mediaQuery =>"
},
{
"path": "lib/core/extensions/time_extension.dart",
"chars": 561,
"preview": "import '/core/functions/date_converter.dart';\n\nextension DateUtil on DateTime {\n String get lastSeen {\n return 'last"
},
{
"path": "lib/core/functions/app_dialogs.dart",
"chars": 4215,
"preview": "import 'package:flutter/material.dart';\nimport '/core/extensions/extensions.dart';\n\nimport '../utils/constants/strings_m"
},
{
"path": "lib/core/functions/date_converter.dart",
"chars": 4668,
"preview": "\nclass DateConverter{\n\n static String getChatContactTime(DateTime dateTime){\n DateTime now = DateTime.now();\n Dat"
},
{
"path": "lib/core/functions/navigator.dart",
"chars": 720,
"preview": "import 'package:flutter/material.dart';\n\nvoid navigatePop(\n BuildContext context,\n) {\n Navigator.of(context).pop();\n}\n"
},
{
"path": "lib/core/network/cache_helper.dart",
"chars": 741,
"preview": "import 'package:shared_preferences/shared_preferences.dart';\n\nclass CacheHelper {\n final SharedPreferences _sharedPrefe"
},
{
"path": "lib/core/services/services_locator.dart",
"chars": 7635,
"preview": "import 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:firebase_auth/firebase_auth.dart';\nimport 'packag"
},
{
"path": "lib/core/shared/bloc_observer.dart",
"chars": 834,
"preview": "import 'package:flutter/foundation.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\n\nclass MyBlocObserver extends"
},
{
"path": "lib/core/shared/commen.dart",
"chars": 2340,
"preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:giphy_get/giphy_get.dart';\nimport 'package:im"
},
{
"path": "lib/core/shared/message_replay.dart",
"chars": 490,
"preview": "import 'package:equatable/equatable.dart';\nimport '/core/enums/messge_type.dart';\n\nclass MessageReplay extends Equatable"
},
{
"path": "lib/core/shared/pop_up_menu_item_model.dart",
"chars": 308,
"preview": "import 'package:equatable/equatable.dart';\nimport 'package:flutter/animation.dart';\n\nclass PopUpMenuItemModel extends Eq"
},
{
"path": "lib/core/usecase/base_use_case.dart",
"chars": 419,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\n\nimport '../error/failure.dart';\n\nabstract"
},
{
"path": "lib/core/utils/constants/assets_manager.dart",
"chars": 699,
"preview": "const String imgPath = 'assets/images';\nclass AppImage{\n static const String landingImg = '$imgPath/bg.png';\n static c"
},
{
"path": "lib/core/utils/constants/font_manager.dart",
"chars": 729,
"preview": "import 'package:flutter/material.dart';\n\nclass FontConstants {\n static const String fontFamily = \"Montserrat\";\n}\n\nclass"
},
{
"path": "lib/core/utils/constants/strings_manager.dart",
"chars": 4886,
"preview": "class AppStrings {\n static const String appName = \"WhatsApp \";\n static const String noRouteFound = \"noRouteFound\";\n\n "
},
{
"path": "lib/core/utils/constants/values_manager.dart",
"chars": 1306,
"preview": "class AppMargin {\n static const double m8 = 8.0;\n static const double m12 = 12.0;\n static const double m14 = 14.0;\n "
},
{
"path": "lib/core/utils/routes/routes_manager.dart",
"chars": 6465,
"preview": "import 'package:flutter/material.dart';\nimport 'package:whatsapp_flutter_clone/features/domain/entities/call.dart';\nimpo"
},
{
"path": "lib/core/utils/thems/my_colors.dart",
"chars": 2965,
"preview": "import 'package:flutter/material.dart';\n\nclass MyColors {\n /// Base Colors\n final Color black = Colors.black;\n final "
},
{
"path": "lib/core/utils/thems/styles_manager.dart",
"chars": 1267,
"preview": "import 'package:flutter/material.dart';\n\nimport '../constants/font_manager.dart';\n\nTextStyle _getTextStyle(double fontSi"
},
{
"path": "lib/core/utils/thems/theme_manager.dart",
"chars": 4776,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nimport '/core/utils/thems/styles_manage"
},
{
"path": "lib/features/data/data_source/auth/local/auth_local_data_source.dart",
"chars": 677,
"preview": "import 'package:shared_preferences/shared_preferences.dart';\n\nabstract class BaseAuthLocalDataSource {\n Future<void> se"
},
{
"path": "lib/features/data/data_source/auth/remote/auth_remote_data_source.dart",
"chars": 5244,
"preview": "import 'dart:io';\n\nimport 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:firebase_auth/firebase_auth.da"
},
{
"path": "lib/features/data/data_source/call/call_data_source.dart",
"chars": 2539,
"preview": "import 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:firebase_auth/firebase_auth.dart';\nimport 'packag"
},
{
"path": "lib/features/data/data_source/chat/local/chat_local_data_source.dart",
"chars": 473,
"preview": "import 'package:flutter/cupertino.dart';\nimport 'package:giphy_get/giphy_get.dart';\n\nabstract class BaseChatLocalDataSou"
},
{
"path": "lib/features/data/data_source/chat/remote/chat_remote_data_source.dart",
"chars": 11208,
"preview": "import 'dart:io';\n\nimport 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:firebase_auth/firebase_auth.da"
},
{
"path": "lib/features/data/data_source/firebase_storage_remote_data_source.dart",
"chars": 663,
"preview": "import 'dart:io';\n\nimport 'package:firebase_storage/firebase_storage.dart';\n\nabstract class BaseFirebaseStorageRemoteDat"
},
{
"path": "lib/features/data/data_source/select_contact/local/get_contacts_local_data_source.dart",
"chars": 539,
"preview": "import 'package:flutter_contacts/flutter_contacts.dart';\nimport '/core/error/exceptions.dart';\n\nabstract class BaseSelec"
},
{
"path": "lib/features/data/data_source/select_contact/remote/select_contact_remote_data_source.dart",
"chars": 2674,
"preview": "import 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:firebase_auth/firebase_auth.dart';\nimport 'packag"
},
{
"path": "lib/features/data/models/call_model.dart",
"chars": 1081,
"preview": "import '../../domain/entities/call.dart';\n\nclass CallModel extends Call {\n const CallModel({\n required super.callerI"
},
{
"path": "lib/features/data/models/contact_chat_model.dart",
"chars": 925,
"preview": "import '../../domain/entities/contact_chat.dart';\n\nclass ContactChatModel extends ContactChat {\n const ContactChatModel"
},
{
"path": "lib/features/data/models/message_model.dart",
"chars": 1588,
"preview": "import 'package:whatsapp_flutter_clone/core/enums/messge_type.dart';\nimport 'package:whatsapp_flutter_clone/features/dom"
},
{
"path": "lib/features/data/models/user_model.dart",
"chars": 1053,
"preview": "import '../../domain/entities/user.dart';\n\nclass UserModel extends UserEntity {\n const UserModel({\n required super.n"
},
{
"path": "lib/features/data/repository/auth_repository.dart",
"chars": 3924,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:firebase_auth/firebase_auth.dart';\n\nimport '/features/data/models/use"
},
{
"path": "lib/features/data/repository/call_repository.dart",
"chars": 1257,
"preview": "import 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:dartz/dartz.dart';\nimport 'package:whatsapp_flutt"
},
{
"path": "lib/features/data/repository/chat_repository.dart",
"chars": 2612,
"preview": "import 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:dartz/dartz.dart';\n\nimport '../../../core/error/f"
},
{
"path": "lib/features/data/repository/select_contact_Repository.dart",
"chars": 2042,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:firebase_auth/firebase_auth.dart';\nimport 'package:flutter_contacts/c"
},
{
"path": "lib/features/domain/entities/call.dart",
"chars": 754,
"preview": "import 'package:equatable/equatable.dart';\n\nclass Call extends Equatable {\n final String callerId;\n final String calle"
},
{
"path": "lib/features/domain/entities/contact_chat.dart",
"chars": 605,
"preview": "import 'package:equatable/equatable.dart';\n\nclass ContactChat extends Equatable {\n final String name;\n final String pr"
},
{
"path": "lib/features/domain/entities/message.dart",
"chars": 1025,
"preview": "import 'package:equatable/equatable.dart';\n\nimport '../../../core/enums/messge_type.dart';\n\nclass Message extends Equata"
},
{
"path": "lib/features/domain/entities/user.dart",
"chars": 681,
"preview": "import 'package:equatable/equatable.dart';\n\nclass UserEntity extends Equatable {\n final String name;\n final String uId"
},
{
"path": "lib/features/domain/repository/base_auth_repository.dart",
"chars": 967,
"preview": "import 'package:dartz/dartz.dart';\n\nimport '../../../core/error/failure.dart';\nimport '../entities/user.dart';\nimport '."
},
{
"path": "lib/features/domain/repository/base_call_repository.dart",
"chars": 523,
"preview": "import 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:dartz/dartz.dart';\nimport 'package:whatsapp_flutt"
},
{
"path": "lib/features/domain/repository/base_chat_repository.dart",
"chars": 1024,
"preview": "import 'package:dartz/dartz.dart';\n\nimport '../../../core/error/failure.dart';\nimport '../entities/contact_chat.dart';\ni"
},
{
"path": "lib/features/domain/repository/base_select_contact_repository.dart",
"chars": 505,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:flutter_contacts/contact.dart';\n\nimport '../../../core/error/failure."
},
{
"path": "lib/features/domain/usecases/auth/get_cached_local_current_uid_usecase.dart",
"chars": 545,
"preview": "import 'package:dartz/dartz.dart';\n\nimport '../../../../core/error/failure.dart';\nimport '../../../../core/usecase/base_"
},
{
"path": "lib/features/domain/usecases/auth/get_current_uid_usecase.dart",
"chars": 511,
"preview": "import 'package:dartz/dartz.dart';\n\nimport '../../../../core/error/failure.dart';\nimport '../../../../core/usecase/base_"
},
{
"path": "lib/features/domain/usecases/auth/get_current_user_usecase.dart",
"chars": 653,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:whatsapp_flutter_clone/core/error/failure.dart';\nimport 'package:what"
},
{
"path": "lib/features/domain/usecases/auth/get_user_by_id_usecase.dart",
"chars": 435,
"preview": "import '../../../../core/usecase/base_use_case.dart';\nimport '../../entities/user.dart';\nimport '../../repository/base_a"
},
{
"path": "lib/features/domain/usecases/auth/save_userdata_to_firebase_usecase.dart",
"chars": 871,
"preview": "import 'dart:io';\n\nimport 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\n\nimport '../../../../co"
},
{
"path": "lib/features/domain/usecases/auth/set_user_state_usecase.dart",
"chars": 490,
"preview": "import 'package:dartz/dartz.dart';\n\nimport '../../../../core/error/failure.dart';\nimport '../../../../core/usecase/base_"
},
{
"path": "lib/features/domain/usecases/auth/sign_in_with_phone_number_usecase.dart",
"chars": 838,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\n\nimport '../../../../core/error/failure.da"
},
{
"path": "lib/features/domain/usecases/auth/signout_usecase.dart",
"chars": 488,
"preview": "import 'package:dartz/dartz.dart';\n\nimport '../../../../core/error/failure.dart';\nimport '../../../../core/usecase/base_"
},
{
"path": "lib/features/domain/usecases/auth/update_profile_pic_usecase.dart",
"chars": 582,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:whatsapp_flutter_clone/core/error/failure.dart';\nimport 'package:what"
},
{
"path": "lib/features/domain/usecases/auth/verify_otp_usecase.dart",
"chars": 753,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\n\nimport '../../../../core/error/failure.da"
},
{
"path": "lib/features/domain/usecases/call/call_stream_usecase.dart",
"chars": 463,
"preview": "import 'package:cloud_firestore/cloud_firestore.dart';\n\nimport '../../../../core/usecase/base_use_case.dart';\nimport '.."
},
{
"path": "lib/features/domain/usecases/call/end_call_usecase.dart",
"chars": 829,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\n\nimport '../../../../core/error/failure.da"
},
{
"path": "lib/features/domain/usecases/call/make_call_usecase.dart",
"chars": 1045,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\nimport 'package:flutter/cupertino.dart';\ni"
},
{
"path": "lib/features/domain/usecases/chat/get_chat_messages_usecase.dart",
"chars": 1173,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\n\nimport '../../../../core/error/failure.da"
},
{
"path": "lib/features/domain/usecases/chat/get_contacts_chat_usecase.dart",
"chars": 575,
"preview": "import 'package:dartz/dartz.dart';\n\nimport '../../../../core/error/failure.dart';\nimport '../../../../core/usecase/base_"
},
{
"path": "lib/features/domain/usecases/chat/get_num_of_message_not_seen_usecase.dart",
"chars": 422,
"preview": "\nimport '../../../../core/usecase/base_use_case.dart';\nimport '../../repository/base_chat_repository.dart';\n\nclass GetNu"
},
{
"path": "lib/features/domain/usecases/chat/send_file_message_usecase.dart",
"chars": 1260,
"preview": "import 'dart:io';\n\nimport 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\nimport 'package:whatsap"
},
{
"path": "lib/features/domain/usecases/chat/send_gif_message_usecase.dart",
"chars": 1070,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\nimport 'package:whatsapp_flutter_clone/cor"
},
{
"path": "lib/features/domain/usecases/chat/send_text_message_usecase.dart",
"chars": 1070,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\nimport 'package:whatsapp_flutter_clone/cor"
},
{
"path": "lib/features/domain/usecases/chat/set_chat_message_seen_usecase.dart",
"chars": 944,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\nimport 'package:whatsapp_flutter_clone/cor"
},
{
"path": "lib/features/domain/usecases/select_contact/get_all_contacts_usecase.dart",
"chars": 545,
"preview": "import 'package:dartz/dartz.dart';\n\nimport '../../../../core/error/failure.dart';\nimport '../../../../core/usecase/base_"
},
{
"path": "lib/features/domain/usecases/select_contact/get_contact_name_usecase.dart",
"chars": 856,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:equatable/equatable.dart';\nimport 'package:whatsapp_flutter_clone/cor"
},
{
"path": "lib/features/domain/usecases/select_contact/get_contacts_not_on_whats_usecase.dart",
"chars": 715,
"preview": "import 'package:dartz/dartz.dart';\nimport 'package:flutter_contacts/contact.dart';\nimport 'package:whatsapp_flutter_clon"
},
{
"path": "lib/features/domain/usecases/select_contact/get_contacts_on_whats_usecase.dart",
"chars": 591,
"preview": "import 'package:dartz/dartz.dart';\n\nimport '../../../../core/error/failure.dart';\nimport '../../../../core/usecase/base_"
},
{
"path": "lib/features/presentation/components/contact_profile_pic_dialog.dart",
"chars": 3002,
"preview": "import 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/material.dart';\n\nimport '/core/"
},
{
"path": "lib/features/presentation/components/custom_list_tile.dart",
"chars": 2810,
"preview": "import 'package:flutter/material.dart';\n\nimport '/core/extensions/extensions.dart';\nimport '../../../core/utils/constant"
},
{
"path": "lib/features/presentation/components/custom_network_image.dart",
"chars": 620,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../core/utils/constants/assets_manager.dart';\n\nclass CustomNetwor"
},
{
"path": "lib/features/presentation/components/custom_pop_up_menu_button.dart",
"chars": 798,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../../../core/shared/pop_up_menu_item_model.dart';\n\nclass CustomP"
},
{
"path": "lib/features/presentation/components/custom_text.dart",
"chars": 386,
"preview": "import 'package:flutter/material.dart';\n\nclass CustomText extends StatelessWidget {\n final String text;\n final TextThe"
},
{
"path": "lib/features/presentation/components/default_button.dart",
"chars": 473,
"preview": "import 'package:flutter/material.dart';\n\nclass DefaultButton extends StatelessWidget {\n final String text;\n final Void"
},
{
"path": "lib/features/presentation/components/loader.dart",
"chars": 241,
"preview": "import 'package:flutter/material.dart';\n\nclass Loader extends StatelessWidget {\n const Loader({super.key});\n\n @overrid"
},
{
"path": "lib/features/presentation/components/my_cached_net_image.dart",
"chars": 1010,
"preview": "import 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/material.dart';\n\nimport '../../"
},
{
"path": "lib/features/presentation/components/update_profile_pic_model_bottom_sheet.dart",
"chars": 3060,
"preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\n\nimport '../controllers/auth_cubit/auth_cubit.dart';\nimport '"
},
{
"path": "lib/features/presentation/controllers/auth_cubit/auth_cubit.dart",
"chars": 4560,
"preview": "import 'dart:io';\n\nimport 'package:country_picker/country_picker.dart';\nimport 'package:equatable/equatable.dart';\nimpor"
},
{
"path": "lib/features/presentation/controllers/auth_cubit/auth_state.dart",
"chars": 2542,
"preview": "part of 'auth_cubit.dart';\n\nabstract class AuthState extends Equatable {\n const AuthState();\n}\n\nclass AuthInitial exten"
},
{
"path": "lib/features/presentation/controllers/bottom_chat_cubit/bottom_chat_cubit.dart",
"chars": 1085,
"preview": "import 'package:equatable/equatable.dart';\nimport 'package:flutter/cupertino.dart';\nimport 'package:flutter_bloc/flutter"
},
{
"path": "lib/features/presentation/controllers/bottom_chat_cubit/bottom_chat_state.dart",
"chars": 733,
"preview": "part of 'bottom_chat_cubit.dart';\n\nabstract class BottomChatState extends Equatable {\n const BottomChatState();\n}\n\nclas"
},
{
"path": "lib/features/presentation/controllers/call_cubit/call_cubit.dart",
"chars": 1811,
"preview": "import 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:equatable/equatable.dart';\nimport 'package:flutte"
},
{
"path": "lib/features/presentation/controllers/call_cubit/call_state.dart",
"chars": 809,
"preview": "part of 'call_cubit.dart';\n\nabstract class CallState extends Equatable {\n const CallState();\n}\n\nclass CallInitial exten"
},
{
"path": "lib/features/presentation/controllers/chat_background_cubit/chat_background_cubit.dart",
"chars": 613,
"preview": "import 'package:equatable/equatable.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\nimport 'package:whatsapp_flu"
},
{
"path": "lib/features/presentation/controllers/chat_background_cubit/chat_background_state.dart",
"chars": 456,
"preview": "part of 'chat_background_cubit.dart';\n\nabstract class ChatBackgroundState extends Equatable {\n const ChatBackgroundStat"
},
{
"path": "lib/features/presentation/controllers/chat_cubit/chat_cubit.dart",
"chars": 4674,
"preview": "import 'dart:io';\n\nimport 'package:equatable/equatable.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\n\nimport '"
},
{
"path": "lib/features/presentation/controllers/chat_cubit/chat_state.dart",
"chars": 961,
"preview": "part of 'chat_cubit.dart';\n\nabstract class ChatState extends Equatable {\n const ChatState();\n}\n\nclass ChatInitial exten"
},
{
"path": "lib/features/presentation/controllers/select_contact_cubit/select_contact_cubit.dart",
"chars": 2175,
"preview": "import 'package:equatable/equatable.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\nimport 'package:flutter_cont"
},
{
"path": "lib/features/presentation/controllers/select_contact_cubit/select_contact_state.dart",
"chars": 1309,
"preview": "part of 'select_contact_cubit.dart';\n\nabstract class SelectContactState extends Equatable {\n const SelectContactState()"
},
{
"path": "lib/features/presentation/views/calls/call_pickup_screen.dart",
"chars": 3914,
"preview": "import 'package:cloud_firestore/cloud_firestore.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter/s"
},
{
"path": "lib/features/presentation/views/calls/call_screen.dart",
"chars": 1262,
"preview": "import 'package:agora_uikit/agora_uikit.dart';\nimport 'package:flutter/material.dart';\nimport 'package:whatsapp_flutter_"
},
{
"path": "lib/features/presentation/views/calls/calls_page.dart",
"chars": 233,
"preview": "import 'package:flutter/material.dart';\n\nclass CallsPage extends StatelessWidget {\n const CallsPage({super.key});\n\n @o"
},
{
"path": "lib/features/presentation/views/camera/camera_screen.dart",
"chars": 5347,
"preview": "import 'package:camera/camera.dart';\nimport 'package:flutter/material.dart';\n\nimport '../../../../core/functions/navigat"
},
{
"path": "lib/features/presentation/views/camera/components/camera_appbar.dart",
"chars": 1038,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\n\nimport '../../../../../core/functions/n"
},
{
"path": "lib/features/presentation/views/camera/components/image_view_top_row_icons.dart",
"chars": 1531,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../../../core/functions/navigator.dart';\n\nclass ImageViewTopRowIc"
},
{
"path": "lib/features/presentation/views/camera/components/select_image_from_gallery_button.dart",
"chars": 1147,
"preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\n\nimport '../../../../../core/functions/navigator.dart';\nimpor"
},
{
"path": "lib/features/presentation/views/camera/components/sending_image_video_bottom_roww_widget.dart",
"chars": 2291,
"preview": "import 'package:flutter/material.dart';\n\nimport '/core/extensions/extensions.dart';\nimport '../../../../../core/utils/co"
},
{
"path": "lib/features/presentation/views/camera/components/video_view_top_row_widget.dart",
"chars": 1235,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../../../core/functions/navigator.dart';\n\nclass VideoViewTopRowWi"
},
{
"path": "lib/features/presentation/views/camera/sending_image_view_page.dart",
"chars": 1991,
"preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\n\nimport '../../../../core/enums/messge_type.dart';\nimport '.."
},
{
"path": "lib/features/presentation/views/camera/sending_video_view_page.dart",
"chars": 2970,
"preview": "import 'dart:io';\n\nimport 'package:flutter/material.dart';\nimport 'package:video_player/video_player.dart';\n\nimport '../"
},
{
"path": "lib/features/presentation/views/chat/chat_screen.dart",
"chars": 1601,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\nimport 'package:whatsapp_flutte"
},
{
"path": "lib/features/presentation/views/chat/components/bottom_field/attchment_pop_up.dart",
"chars": 4127,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_contacts/flutter_contacts.dart';\n\nclass AttchementPopUp "
},
{
"path": "lib/features/presentation/views/chat/components/bottom_field/bottom_chat_field.dart",
"chars": 5178,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\nimport 'package:whatsapp_flutte"
},
{
"path": "lib/features/presentation/views/chat/components/bottom_field/bottom_chat_with_icon.dart",
"chars": 4682,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\nimport 'package:giphy_get/giphy"
},
{
"path": "lib/features/presentation/views/chat/components/bottom_field/emoji_picker_widget.dart",
"chars": 2194,
"preview": "import 'package:emoji_picker_flutter/emoji_picker_flutter.dart';\nimport 'package:flutter/material.dart';\n\nimport '/core/"
},
{
"path": "lib/features/presentation/views/chat/components/bottom_field/recording_mic.dart",
"chars": 2212,
"preview": "import 'dart:io';\n\nimport 'package:audio_waveforms/audio_waveforms.dart';\nimport 'package:flutter/material.dart';\nimport"
},
{
"path": "lib/features/presentation/views/chat/components/bottom_field/recording_mic_widget.dart",
"chars": 15658,
"preview": "import 'dart:math';\n\nimport 'package:flutter/material.dart';\nimport 'package:shimmer/shimmer.dart';\nimport '/core/extens"
},
{
"path": "lib/features/presentation/views/chat/components/bottom_field/timer.dart",
"chars": 1210,
"preview": "import 'dart:async';\n\nimport 'package:flutter/material.dart';\n\n/// This widget shows the count-up timer\nclass TimerWidge"
},
{
"path": "lib/features/presentation/views/chat/components/chat_appbar.dart",
"chars": 5791,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\nimport 'package:whatsapp_flutte"
},
{
"path": "lib/features/presentation/views/chat/components/message/first_message_small_curved_bubble.dart",
"chars": 1441,
"preview": "import 'package:flutter/material.dart';\n\nimport '/core/extensions/extensions.dart';\n\n\nclass FirstMessageSmallCurvedBubbl"
},
{
"path": "lib/features/presentation/views/chat/components/message/message_replay_card.dart",
"chars": 4098,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../../../../core/enums/messge_type.dart';\nimport '../../../../con"
},
{
"path": "lib/features/presentation/views/chat/components/message/message_replay_preview.dart",
"chars": 966,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../../../../core/shared/message_replay.dart';\nimport 'message_rep"
},
{
"path": "lib/features/presentation/views/chat/components/message/messages_list.dart",
"chars": 4425,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter/scheduler.dart';\n\nimport '/core/extensions/extensions.da"
},
{
"path": "lib/features/presentation/views/chat/components/message/my_message_card.dart",
"chars": 3121,
"preview": "import 'package:flutter/material.dart';\nimport 'package:swipe_to/swipe_to.dart';\n\nimport '/core/extensions/extensions.da"
},
{
"path": "lib/features/presentation/views/chat/components/message/sender_message_card.dart",
"chars": 3046,
"preview": "import 'package:flutter/material.dart';\nimport 'package:swipe_to/swipe_to.dart';\n\nimport '../../../../../../core/extensi"
},
{
"path": "lib/features/presentation/views/chat/components/message_content/audio_player_widget.dart",
"chars": 4490,
"preview": "import 'package:audioplayers/audioplayers.dart';\nimport 'package:flutter/material.dart';\nimport 'package:whatsapp_flutte"
},
{
"path": "lib/features/presentation/views/chat/components/message_content/image_widget.dart",
"chars": 1200,
"preview": "import 'package:cached_network_image/cached_network_image.dart';\nimport 'package:flutter/material.dart';\nimport 'package"
},
{
"path": "lib/features/presentation/views/chat/components/message_content/message_content.dart",
"chars": 996,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../../../../core/enums/messge_type.dart';\nimport '../../../../../"
},
{
"path": "lib/features/presentation/views/chat/components/message_content/text_widget.dart",
"chars": 941,
"preview": "import 'package:flutter/material.dart';\n\nimport '/features/presentation/views/chat/components/message_content/time_sent_"
},
{
"path": "lib/features/presentation/views/chat/components/message_content/time_sent_widget.dart",
"chars": 1086,
"preview": "import 'package:flutter/material.dart';\n\nimport '/core/extensions/extensions.dart';\nimport '/core/extensions/time_extens"
},
{
"path": "lib/features/presentation/views/chat/components/message_content/video_palyer_widget.dart",
"chars": 2364,
"preview": "import 'package:cached_video_player/cached_video_player.dart';\nimport 'package:flutter/material.dart';\nimport 'package:w"
},
{
"path": "lib/features/presentation/views/contacts_chat/components/chat_contact_card.dart",
"chars": 1803,
"preview": "import 'package:flutter/material.dart';\n\nimport '/core/extensions/time_extension.dart';\nimport '../../../../../core/func"
},
{
"path": "lib/features/presentation/views/contacts_chat/contacts_chat_page.dart",
"chars": 1018,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../domain/entities/contact_chat.dart';\nimport '../../components/l"
},
{
"path": "lib/features/presentation/views/login/components/landing_image.dart",
"chars": 450,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../../../core/extensions/extensions.dart';\nimport '../../../../.."
},
{
"path": "lib/features/presentation/views/login/components/login_appbar.dart",
"chars": 1017,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport '/core/extensions/extensions.dart"
},
{
"path": "lib/features/presentation/views/login/components/login_profile_pic.dart",
"chars": 657,
"preview": "import 'package:flutter/material.dart';\n\nimport '/core/extensions/extensions.dart';\nimport '../../../components/update_p"
},
{
"path": "lib/features/presentation/views/login/components/privacy_policy_link_and_terms_of_service.dart",
"chars": 1994,
"preview": "import 'package:flutter/gestures.dart';\nimport 'package:flutter/material.dart';\n\nimport '../../../../../core/extensions/"
},
{
"path": "lib/features/presentation/views/login/components/sign_out_button.dart",
"chars": 864,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\n\nimport '../../../../../core/fu"
},
{
"path": "lib/features/presentation/views/login/login_landing_screen.dart",
"chars": 1494,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../../core/extensions/extensions.dart';\nimport '../../../../core/"
},
{
"path": "lib/features/presentation/views/login/login_loading_screen.dart",
"chars": 2175,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\n\nimport '../../../../core/exten"
},
{
"path": "lib/features/presentation/views/login/login_otp_screen.dart",
"chars": 5197,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\nimport 'package:sms_autofill/sm"
},
{
"path": "lib/features/presentation/views/login/login_profile_info_screen.dart",
"chars": 3709,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\n\nimport '/core/extensions/exten"
},
{
"path": "lib/features/presentation/views/login/login_screen.dart",
"chars": 8494,
"preview": "import 'package:country_picker/country_picker.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_blo"
},
{
"path": "lib/features/presentation/views/main_layout/components/fab.dart",
"chars": 1769,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../../../core/functions/navigator.dart';\nimport '../../../../../c"
},
{
"path": "lib/features/presentation/views/main_layout/components/sliver_appbar_actions.dart",
"chars": 2692,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../../../core/functions/navigator.dart';\nimport '../../../../../c"
},
{
"path": "lib/features/presentation/views/main_layout/main_layout_screen.dart",
"chars": 3312,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../../core/utils/constants/strings_manager.dart';\nimport '../../c"
},
{
"path": "lib/features/presentation/views/select_contact/components/contacts_not_on_whatsapp_list.dart",
"chars": 1240,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_contacts/contact.dart';\n\nimport '../../../../../core/ext"
},
{
"path": "lib/features/presentation/views/select_contact/components/contacts_on_whatsapp_list.dart",
"chars": 1295,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../../../core/functions/navigator.dart';\nimport '../../../../../c"
},
{
"path": "lib/features/presentation/views/select_contact/components/new_group_contact_community_buttons_List.dart",
"chars": 1845,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_contacts/flutter_contacts.dart';\n\nimport '/core/extensio"
},
{
"path": "lib/features/presentation/views/select_contact/components/select_contact_appbar.dart",
"chars": 2752,
"preview": "import 'package:flutter/foundation.dart';\nimport 'package:flutter/material.dart';\nimport 'package:flutter_contacts/flutt"
},
{
"path": "lib/features/presentation/views/select_contact/select_contact_screen.dart",
"chars": 2340,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\n\nimport '../../../../core/utils"
},
{
"path": "lib/features/presentation/views/sender_profile/components/body.dart",
"chars": 688,
"preview": "import 'package:flutter/material.dart';\n\nimport 'status_container.dart';\nimport 'encryption_container.dart';\nimport 'not"
},
{
"path": "lib/features/presentation/views/sender_profile/components/encryption_container.dart",
"chars": 1309,
"preview": "import 'package:flutter/material.dart';\n\nimport '/core/extensions/extensions.dart';\nimport '../../../../../core/utils/co"
},
{
"path": "lib/features/presentation/views/sender_profile/components/notification_container.dart",
"chars": 1455,
"preview": "import 'package:flutter/material.dart';\n\nimport '/core/extensions/extensions.dart';\nimport '../../../../../core/utils/co"
},
{
"path": "lib/features/presentation/views/sender_profile/components/phone_and_name.dart",
"chars": 674,
"preview": "import 'package:flutter/material.dart';\n\nimport '/core/extensions/extensions.dart';\n\nclass PhoneAndName extends Stateles"
},
{
"path": "lib/features/presentation/views/sender_profile/components/sender_profile_icons.dart",
"chars": 1286,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../../../core/utils/constants/strings_manager.dart';\nimport '/cor"
},
{
"path": "lib/features/presentation/views/sender_profile/components/sender_user_profile_appbar.dart",
"chars": 4259,
"preview": "import 'dart:math';\n\nimport 'package:flutter/material.dart';\nimport 'package:flutter/services.dart';\nimport 'package:wha"
},
{
"path": "lib/features/presentation/views/sender_profile/components/status_container.dart",
"chars": 836,
"preview": "import 'package:flutter/material.dart';\n\nimport '/core/extensions/extensions.dart';\n\nclass StatusContainer extends State"
},
{
"path": "lib/features/presentation/views/sender_profile/sender_profile_page.dart",
"chars": 1253,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../domain/entities/user.dart';\nimport 'components/body.dart';\nimp"
},
{
"path": "lib/features/presentation/views/settings/components/about_card.dart",
"chars": 837,
"preview": "import 'package:flutter/material.dart';\n\nimport '/core/extensions/extensions.dart';\nimport '../../../../../core/utils/co"
},
{
"path": "lib/features/presentation/views/settings/components/name_card.dart",
"chars": 1321,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../../../core/utils/constants/strings_manager.dart';\nimport '/cor"
},
{
"path": "lib/features/presentation/views/settings/components/phone_card.dart",
"chars": 657,
"preview": "import 'package:flutter/material.dart';\n\nimport '/core/extensions/extensions.dart';\nimport '../../../../../core/utils/co"
},
{
"path": "lib/features/presentation/views/settings/components/profile_card.dart",
"chars": 2571,
"preview": "import 'package:flutter/material.dart';\n\nimport '/core/extensions/extensions.dart';\nimport '../../../../../core/function"
},
{
"path": "lib/features/presentation/views/settings/components/profile_pic_circle_card.dart",
"chars": 1775,
"preview": "import 'package:flutter/material.dart';\nimport 'package:flutter_bloc/flutter_bloc.dart';\nimport 'package:whatsapp_flutte"
},
{
"path": "lib/features/presentation/views/settings/components/setting_bottom_text.dart",
"chars": 695,
"preview": "import 'package:flutter/material.dart';\n\nimport '/core/extensions/extensions.dart';\n\nclass SettingBottomText extends Sta"
},
{
"path": "lib/features/presentation/views/settings/components/settings_item_card.dart",
"chars": 1135,
"preview": "import 'package:flutter/material.dart';\n\nimport '/core/extensions/extensions.dart';\n\nclass SettingsItemCard extends Stat"
},
{
"path": "lib/features/presentation/views/settings/profile_screen.dart",
"chars": 997,
"preview": "import 'package:flutter/material.dart';\n\nimport '../../../../core/utils/constants/strings_manager.dart';\nimport '../../."
}
]
// ... and 10 more files (download for full content)
About this extraction
This page contains the full source code of the mogohary99/Flutter-WhatsApp-Clone-Clean-Architecture GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 210 files (364.8 KB), approximately 90.0k tokens, and a symbol index with 673 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.