Merge branch 'master' of https://gitlab.com/Cloud_Solution/mohemm-flutter-app into sultan-dev
@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="21.279" height="22.831" viewBox="0 0 21.279 22.831">
|
||||
<path id="Path_4751" data-name="Path 4751" d="M19.767,15.891c-1.379-1.18-2.779-1.894-4.141-.716l-.813.712c-.6.517-1.7,2.931-5.98-1.99S7.1,8.215,7.7,7.7l.818-.713c1.355-1.181.844-2.667-.134-4.2l-.59-.927C6.809.34,5.739-.662,4.381.517l-.734.642A6.892,6.892,0,0,0,.96,5.719c-.49,3.241,1.056,6.953,4.6,11.026s7,6.121,10.281,6.085a6.91,6.91,0,0,0,4.888-2.024l.737-.642c1.355-1.178.513-2.377-.867-3.559Z" transform="translate(-0.872 0)" fill="#2bb8a6"/>
|
||||
</svg>
|
After Width: | Height: | Size: 557 B |
@ -0,0 +1,54 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||
<path style="fill:#E2E5E7;" d="M128,0c-17.6,0-32,14.4-32,32v448c0,17.6,14.4,32,32,32h320c17.6,0,32-14.4,32-32V128L352,0H128z"/>
|
||||
<path style="fill:#B0B7BD;" d="M384,128h96L352,0v96C352,113.6,366.4,128,384,128z"/>
|
||||
<polygon style="fill:#CAD1D8;" points="480,224 384,128 480,128 "/>
|
||||
<path style="fill:#50BEE8;" d="M416,416c0,8.8-7.2,16-16,16H48c-8.8,0-16-7.2-16-16V256c0-8.8,7.2-16,16-16h352c8.8,0,16,7.2,16,16
|
||||
V416z"/>
|
||||
<g>
|
||||
<path style="fill:#FFFFFF;" d="M92.576,384c-4.224,0-8.832-2.32-8.832-7.936v-72.656c0-4.608,4.608-7.936,8.832-7.936h29.296
|
||||
c58.464,0,57.168,88.528,1.136,88.528H92.576z M100.64,311.072v57.312h21.232c34.544,0,36.064-57.312,0-57.312H100.64z"/>
|
||||
<path style="fill:#FFFFFF;" d="M228,385.28c-23.664,1.024-48.24-14.72-48.24-46.064c0-31.472,24.56-46.944,48.24-46.944
|
||||
c22.384,1.136,45.792,16.624,45.792,46.944C273.792,369.552,250.384,385.28,228,385.28z M226.592,308.912
|
||||
c-14.336,0-29.936,10.112-29.936,30.32c0,20.096,15.616,30.336,29.936,30.336c14.72,0,30.448-10.24,30.448-30.336
|
||||
C257.04,319.008,241.312,308.912,226.592,308.912z"/>
|
||||
<path style="fill:#FFFFFF;" d="M288.848,339.088c0-24.688,15.488-45.92,44.912-45.92c11.136,0,19.968,3.328,29.296,11.392
|
||||
c3.456,3.184,3.84,8.816,0.384,12.4c-3.456,3.056-8.704,2.688-11.776-0.384c-5.232-5.504-10.608-7.024-17.904-7.024
|
||||
c-19.696,0-29.152,13.952-29.152,29.552c0,15.872,9.328,30.448,29.152,30.448c7.296,0,14.08-2.96,19.968-8.192
|
||||
c3.952-3.072,9.456-1.552,11.76,1.536c2.048,2.816,3.056,7.552-1.408,12.016c-8.96,8.336-19.696,10-30.336,10
|
||||
C302.8,384.912,288.848,363.776,288.848,339.088z"/>
|
||||
</g>
|
||||
<path style="fill:#CAD1D8;" d="M400,432H96v16h304c8.8,0,16-7.2,16-16v-16C416,424.8,408.8,432,400,432z"/>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||
<path style="fill:#E2E5E7;" d="M128,0c-17.6,0-32,14.4-32,32v448c0,17.6,14.4,32,32,32h320c17.6,0,32-14.4,32-32V128L352,0H128z"/>
|
||||
<path style="fill:#B0B7BD;" d="M384,128h96L352,0v96C352,113.6,366.4,128,384,128z"/>
|
||||
<polygon style="fill:#CAD1D8;" points="480,224 384,128 480,128 "/>
|
||||
<path style="fill:#F15642;" d="M416,416c0,8.8-7.2,16-16,16H48c-8.8,0-16-7.2-16-16V256c0-8.8,7.2-16,16-16h352c8.8,0,16,7.2,16,16
|
||||
V416z"/>
|
||||
<g>
|
||||
<path style="fill:#FFFFFF;" d="M105.456,303.152c0-4.224,3.328-8.832,8.688-8.832h29.552c16.64,0,31.616,11.136,31.616,32.48
|
||||
c0,20.224-14.976,31.488-31.616,31.488h-21.36v16.896c0,5.632-3.568,8.816-8.176,8.816c-4.224,0-8.688-3.184-8.688-8.816v-72.032
|
||||
H105.456z M122.336,310.432v31.872h21.36c8.576,0,15.36-7.568,15.36-15.504c0-8.944-6.784-16.368-15.36-16.368H122.336z"/>
|
||||
<path style="fill:#FFFFFF;" d="M191.616,303.152c0-4.224,3.328-8.832,8.704-8.832h29.552c16.64,0,31.616,11.136,31.616,32.48
|
||||
c0,20.224-14.976,31.488-31.616,31.488h-21.36v16.896c0,5.632-3.584,8.816-8.192,8.816c-4.224,0-8.704-3.184-8.704-8.816V303.152z
|
||||
M208.496,310.432v31.872h21.36c8.576,0,15.36-7.568,15.36-15.504c0-8.944-6.784-16.368-15.36-16.368H208.496z"/>
|
||||
<path style="fill:#FFFFFF;" d="M301.68,311.472h-22.368c-11.136,0-11.136-16.368,0-16.368h60.496c11.392,0,11.392,16.368,0,16.368
|
||||
h-21.232v64.608c0,11.12-16.896,11.392-16.896,0V311.472z"/>
|
||||
</g>
|
||||
<path style="fill:#CAD1D8;" d="M400,432H96v16h304c8.8,0,16-7.2,16-16v-16C416,424.8,408.8,432,400,432z"/>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||
<path style="fill:#E2E5E7;" d="M128,0c-17.6,0-32,14.4-32,32v448c0,17.6,14.4,32,32,32h320c17.6,0,32-14.4,32-32V128L352,0H128z"/>
|
||||
<path style="fill:#B0B7BD;" d="M384,128h96L352,0v96C352,113.6,366.4,128,384,128z"/>
|
||||
<polygon style="fill:#CAD1D8;" points="480,224 384,128 480,128 "/>
|
||||
<path style="fill:#576D7E;" d="M416,416c0,8.8-7.2,16-16,16H48c-8.8,0-16-7.2-16-16V256c0-8.8,7.2-16,16-16h352c8.8,0,16,7.2,16,16
|
||||
V416z"/>
|
||||
<g>
|
||||
<path style="fill:#FFFFFF;" d="M132.784,311.472H110.4c-11.136,0-11.136-16.368,0-16.368h60.512c11.392,0,11.392,16.368,0,16.368
|
||||
h-21.248v64.592c0,11.12-16.896,11.392-16.896,0v-64.592H132.784z"/>
|
||||
<path style="fill:#FFFFFF;" d="M224.416,326.176l22.272-27.888c6.656-8.688,19.568,2.432,12.288,10.752
|
||||
c-7.68,9.088-15.728,18.944-23.424,29.024l26.112,32.496c7.024,9.6-7.04,18.816-13.952,9.344l-23.536-30.192l-23.152,30.832
|
||||
c-6.528,9.328-20.992-1.152-13.68-9.856l25.696-32.624c-8.048-10.096-15.856-19.936-23.664-29.024
|
||||
c-8.064-9.6,6.912-19.44,12.784-10.48L224.416,326.176z"/>
|
||||
<path style="fill:#FFFFFF;" d="M298.288,311.472H275.92c-11.136,0-11.136-16.368,0-16.368h60.496c11.392,0,11.392,16.368,0,16.368
|
||||
h-21.232v64.592c0,11.12-16.896,11.392-16.896,0V311.472z"/>
|
||||
</g>
|
||||
<path style="fill:#CAD1D8;" d="M400,432H96v16h304c8.8,0,16-7.2,16-16v-16C416,424.8,408.8,432,400,432z"/>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="27.826" height="17.898" viewBox="0 0 27.826 17.898">
|
||||
<g id="video-call" transform="translate(-10 -18)">
|
||||
<rect id="Rectangle_17475" data-name="Rectangle 17475" width="21.057" height="17.898" rx="3" transform="translate(10 18)" fill="#2bb8a6"/>
|
||||
<path id="Path_4752" data-name="Path 4752" d="M50.692,21.633V34.282a.635.635,0,0,1-.316.55.622.622,0,0,1-.316.082.638.638,0,0,1-.316-.082L45,32.1V23.815l4.743-2.732a.66.66,0,0,1,.632,0A.635.635,0,0,1,50.692,21.633Z" transform="translate(-12.866 -1.104)" fill="#2bb8a6"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 585 B |
@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||
<path style="fill:#E2E5E7;" d="M128,0c-17.6,0-32,14.4-32,32v448c0,17.6,14.4,32,32,32h320c17.6,0,32-14.4,32-32V128L352,0H128z"/>
|
||||
<path style="fill:#B0B7BD;" d="M384,128h96L352,0v96C352,113.6,366.4,128,384,128z"/>
|
||||
<polygon style="fill:#CAD1D8;" points="480,224 384,128 480,128 "/>
|
||||
<path style="fill:#84BD5A;" d="M416,416c0,8.8-7.2,16-16,16H48c-8.8,0-16-7.2-16-16V256c0-8.8,7.2-16,16-16h352c8.8,0,16,7.2,16,16
|
||||
V416z"/>
|
||||
<g>
|
||||
<path style="fill:#FFFFFF;" d="M144.336,326.192l22.256-27.888c6.656-8.704,19.584,2.416,12.288,10.736
|
||||
c-7.664,9.088-15.728,18.944-23.408,29.04l26.096,32.496c7.04,9.6-7.024,18.8-13.936,9.328l-23.552-30.192l-23.152,30.848
|
||||
c-6.528,9.328-20.992-1.152-13.696-9.856l25.712-32.624c-8.064-10.112-15.872-19.952-23.664-29.04
|
||||
c-8.048-9.6,6.912-19.44,12.8-10.464L144.336,326.192z"/>
|
||||
<path style="fill:#FFFFFF;" d="M197.36,303.152c0-4.224,3.584-7.808,8.064-7.808c4.096,0,7.552,3.6,7.552,7.808v64.096h34.8
|
||||
c12.528,0,12.8,16.752,0,16.752H205.44c-4.48,0-8.064-3.184-8.064-7.792v-73.056H197.36z"/>
|
||||
<path style="fill:#FFFFFF;" d="M272.032,314.672c2.944-24.832,40.416-29.296,58.08-15.728c8.704,7.024-0.512,18.16-8.192,12.528
|
||||
c-9.472-6-30.96-8.816-33.648,4.464c-3.456,20.992,52.192,8.976,51.296,43.008c-0.896,32.496-47.968,33.248-65.632,18.672
|
||||
c-4.24-3.456-4.096-9.072-1.792-12.544c3.328-3.312,7.024-4.464,11.392-0.88c10.48,7.152,37.488,12.528,39.392-5.648
|
||||
C321.28,339.632,268.064,351.008,272.032,314.672z"/>
|
||||
</g>
|
||||
<path style="fill:#CAD1D8;" d="M400,432H96v16h304c8.8,0,16-7.2,16-16v-16C416,424.8,408.8,432,400,432z"/>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.0 KiB |
@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||
<path style="fill:#E2E5E7;" d="M128,0c-17.6,0-32,14.4-32,32v448c0,17.6,14.4,32,32,32h320c17.6,0,32-14.4,32-32V128L352,0H128z"/>
|
||||
<path style="fill:#B0B7BD;" d="M384,128h96L352,0v96C352,113.6,366.4,128,384,128z"/>
|
||||
<polygon style="fill:#CAD1D8;" points="480,224 384,128 480,128 "/>
|
||||
<path style="fill:#84BD5A;" d="M416,416c0,8.8-7.2,16-16,16H48c-8.8,0-16-7.2-16-16V256c0-8.8,7.2-16,16-16h352c8.8,0,16,7.2,16,16
|
||||
V416z"/>
|
||||
<g>
|
||||
<path style="fill:#FFFFFF;" d="M132.64,384c-8.064,0-11.264-7.792-6.656-13.296l45.552-60.512h-37.76
|
||||
c-11.12,0-10.224-15.712,0-15.712h51.568c9.712,0,12.528,9.184,5.632,16.624l-43.632,56.656h41.584
|
||||
c10.24,0,11.52,16.256-1.008,16.256h-55.28V384z"/>
|
||||
<path style="fill:#FFFFFF;" d="M212.048,303.152c0-10.496,16.896-10.88,16.896,0v73.04c0,10.608-16.896,10.88-16.896,0V303.152z"/>
|
||||
<path style="fill:#FFFFFF;" d="M251.616,303.152c0-4.224,3.328-8.832,8.704-8.832h29.552c16.64,0,31.616,11.136,31.616,32.48
|
||||
c0,20.224-14.976,31.488-31.616,31.488h-21.36v16.896c0,5.632-3.584,8.816-8.192,8.816c-4.224,0-8.704-3.184-8.704-8.816
|
||||
L251.616,303.152L251.616,303.152z M268.496,310.432v31.872h21.36c8.576,0,15.36-7.568,15.36-15.504
|
||||
c0-8.944-6.784-16.368-15.36-16.368H268.496z"/>
|
||||
</g>
|
||||
<path style="fill:#CAD1D8;" d="M400,432H96v16h304c8.8,0,16-7.2,16-16v-16C416,424.8,408.8,432,400,432z"/>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
@ -0,0 +1,37 @@
|
||||
//
|
||||
// Generated file. Do not edit.
|
||||
//
|
||||
|
||||
// ignore_for_file: directives_ordering
|
||||
// ignore_for_file: lines_longer_than_80_chars
|
||||
// ignore_for_file: depend_on_referenced_packages
|
||||
|
||||
import 'package:file_picker/_internal/file_picker_web.dart';
|
||||
import 'package:firebase_core_web/firebase_core_web.dart';
|
||||
import 'package:firebase_messaging_web/firebase_messaging_web.dart';
|
||||
import 'package:fluttertoast/fluttertoast_web.dart';
|
||||
import 'package:geolocator_web/geolocator_web.dart';
|
||||
import 'package:google_maps_flutter_web/google_maps_flutter_web.dart';
|
||||
import 'package:image_picker_for_web/image_picker_for_web.dart';
|
||||
import 'package:shared_preferences_web/shared_preferences_web.dart';
|
||||
import 'package:url_launcher_web/url_launcher_web.dart';
|
||||
import 'package:video_player_web/video_player_web.dart';
|
||||
import 'package:wakelock_web/wakelock_web.dart';
|
||||
|
||||
import 'package:flutter_web_plugins/flutter_web_plugins.dart';
|
||||
|
||||
// ignore: public_member_api_docs
|
||||
void registerPlugins(Registrar registrar) {
|
||||
FilePickerWeb.registerWith(registrar);
|
||||
FirebaseCoreWeb.registerWith(registrar);
|
||||
FirebaseMessagingWeb.registerWith(registrar);
|
||||
FluttertoastWebPlugin.registerWith(registrar);
|
||||
GeolocatorPlugin.registerWith(registrar);
|
||||
GoogleMapsPlugin.registerWith(registrar);
|
||||
ImagePickerPlugin.registerWith(registrar);
|
||||
SharedPreferencesPlugin.registerWith(registrar);
|
||||
UrlLauncherPlugin.registerWith(registrar);
|
||||
VideoPlayerPlugin.registerWith(registrar);
|
||||
WakelockWeb.registerWith(registrar);
|
||||
registrar.registerMessageHandler();
|
||||
}
|
@ -0,0 +1,117 @@
|
||||
class IncomingCallData {
|
||||
String? callerID;
|
||||
String? receiverID;
|
||||
String? msgID;
|
||||
String? notfID;
|
||||
String? notificationForeground;
|
||||
String? count;
|
||||
String? message;
|
||||
String? appointmentNo;
|
||||
String? title;
|
||||
String? projectID;
|
||||
String? notificationType;
|
||||
String? background;
|
||||
String? doctorname;
|
||||
String? clinicname;
|
||||
String? speciality;
|
||||
String? appointmentdate;
|
||||
String? appointmenttime;
|
||||
String? type;
|
||||
String? sessionId;
|
||||
String? identity;
|
||||
String? name;
|
||||
String? videoUrl;
|
||||
String? picture;
|
||||
String? token;
|
||||
String? isCall;
|
||||
String? sound;
|
||||
String? server;
|
||||
String? isWebRTC;
|
||||
|
||||
IncomingCallData(
|
||||
{this.msgID,
|
||||
this.notfID,
|
||||
this.notificationForeground,
|
||||
this.count,
|
||||
this.message,
|
||||
this.appointmentNo,
|
||||
this.title,
|
||||
this.projectID,
|
||||
this.notificationType,
|
||||
this.background,
|
||||
this.doctorname,
|
||||
this.clinicname,
|
||||
this.speciality,
|
||||
this.appointmentdate,
|
||||
this.appointmenttime,
|
||||
this.type,
|
||||
this.sessionId,
|
||||
this.identity,
|
||||
this.name,
|
||||
this.videoUrl,
|
||||
this.picture,
|
||||
this.isCall,
|
||||
this.sound});
|
||||
|
||||
IncomingCallData.fromJson(Map<String, dynamic> json) {
|
||||
callerID = json['callerID'];
|
||||
receiverID = json['PatientID'];
|
||||
msgID = json['msgID'];
|
||||
notfID = json['notfID'];
|
||||
notificationForeground = json['notification_foreground'];
|
||||
count = json['count'];
|
||||
message = json['message'];
|
||||
appointmentNo = json['AppointmentNo'];
|
||||
title = json['title'];
|
||||
projectID = json['ProjectID'];
|
||||
notificationType = json['NotificationType'];
|
||||
background = json['background'];
|
||||
doctorname = json['doctorname'];
|
||||
clinicname = json['clinicname'];
|
||||
speciality = json['speciality'];
|
||||
appointmentdate = json['appointmentdate'];
|
||||
appointmenttime = json['appointmenttime'];
|
||||
type = json['type'];
|
||||
sessionId = json['session_id'];
|
||||
token = json['token'];
|
||||
identity = json['identity'];
|
||||
name = json['name'];
|
||||
videoUrl = json['videoUrl'];
|
||||
picture = json['picture'];
|
||||
isCall = json['is_call'];
|
||||
sound = json['sound'];
|
||||
server = json['server'];
|
||||
isWebRTC = json['is_webrtc'] ?? "true";
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
Map<String, dynamic> data = Map<String, dynamic>();
|
||||
data['msgID'] = this.msgID;
|
||||
data['notfID'] = this.notfID;
|
||||
data['notification_foreground'] = this.notificationForeground;
|
||||
data['count'] = this.count;
|
||||
data['message'] = this.message;
|
||||
data['AppointmentNo'] = this.appointmentNo;
|
||||
data['title'] = this.title;
|
||||
data['ProjectID'] = this.projectID;
|
||||
data['NotificationType'] = this.notificationType;
|
||||
data['background'] = this.background;
|
||||
data['doctorname'] = this.doctorname;
|
||||
data['clinicname'] = this.clinicname;
|
||||
data['speciality'] = this.speciality;
|
||||
data['appointmentdate'] = this.appointmentdate;
|
||||
data['appointmenttime'] = this.appointmenttime;
|
||||
data['type'] = this.type;
|
||||
data['session_id'] = this.sessionId;
|
||||
data['token'] = this.token;
|
||||
data['identity'] = this.identity;
|
||||
data['name'] = this.name;
|
||||
data['videoUrl'] = this.videoUrl;
|
||||
data['picture'] = this.picture;
|
||||
data['is_call'] = this.isCall;
|
||||
data['sound'] = this.sound;
|
||||
data['server'] = this.server;
|
||||
data['is_webrtc'] = this.isWebRTC;
|
||||
return data;
|
||||
}
|
||||
}
|
@ -0,0 +1,25 @@
|
||||
import 'dart:convert';
|
||||
|
||||
ChatUnreadCovnCountModel chatUnreadCovnCountModelFromJson(String str) => ChatUnreadCovnCountModel.fromJson(json.decode(str));
|
||||
|
||||
String chatUnreadCovnCountModelToJson(ChatUnreadCovnCountModel data) => json.encode(data.toJson());
|
||||
|
||||
class ChatUnreadCovnCountModel {
|
||||
ChatUnreadCovnCountModel({
|
||||
this.singleChatCount,
|
||||
this.groupChatCount,
|
||||
});
|
||||
|
||||
int? singleChatCount;
|
||||
int? groupChatCount;
|
||||
|
||||
factory ChatUnreadCovnCountModel.fromJson(Map<String, dynamic> json) => ChatUnreadCovnCountModel(
|
||||
singleChatCount: json["singleChatCount"] == null ? null : json["singleChatCount"],
|
||||
groupChatCount: json["groupChatCount"] == null ? null : json["groupChatCount"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"singleChatCount": singleChatCount == null ? null : singleChatCount,
|
||||
"groupChatCount": groupChatCount == null ? null : groupChatCount,
|
||||
};
|
||||
}
|
@ -0,0 +1,53 @@
|
||||
// To parse this JSON data, do
|
||||
//
|
||||
// final favoriteChatUser = favoriteChatUserFromJson(jsonString);
|
||||
|
||||
import 'dart:convert';
|
||||
|
||||
class FavoriteChatUser {
|
||||
FavoriteChatUser({
|
||||
this.response,
|
||||
this.errorResponses,
|
||||
});
|
||||
|
||||
Response? response;
|
||||
dynamic? errorResponses;
|
||||
|
||||
factory FavoriteChatUser.fromRawJson(String str) => FavoriteChatUser.fromJson(json.decode(str));
|
||||
|
||||
String toRawJson() => json.encode(toJson());
|
||||
|
||||
factory FavoriteChatUser.fromJson(Map<String, dynamic> json) => FavoriteChatUser(
|
||||
response: json["response"] == null ? null : Response.fromJson(json["response"]),
|
||||
errorResponses: json["errorResponses"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"response": response == null ? null : response!.toJson(),
|
||||
"errorResponses": errorResponses,
|
||||
};
|
||||
}
|
||||
|
||||
class Response {
|
||||
Response({
|
||||
this.targetUserId,
|
||||
this.isFav,
|
||||
});
|
||||
|
||||
int? targetUserId;
|
||||
bool? isFav;
|
||||
|
||||
factory Response.fromRawJson(String str) => Response.fromJson(json.decode(str));
|
||||
|
||||
String toRawJson() => json.encode(toJson());
|
||||
|
||||
factory Response.fromJson(Map<String, dynamic> json) => Response(
|
||||
targetUserId: json["targetUserId"] == null ? null : json["targetUserId"],
|
||||
isFav: json["isFav"] == null ? null : json["isFav"],
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
"targetUserId": targetUserId == null ? null : targetUserId,
|
||||
"isFav": isFav == null ? null : isFav,
|
||||
};
|
||||
}
|
@ -0,0 +1,379 @@
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:camera/camera.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||
import 'package:mohem_flutter_app/classes/utils.dart';
|
||||
import 'package:mohem_flutter_app/models/chat/call.dart';
|
||||
|
||||
class IncomingCall extends StatefulWidget {
|
||||
IncomingCallData incomingCallData;
|
||||
bool? isVideoCall;
|
||||
|
||||
IncomingCall({Key? key, required this.incomingCallData, this.isVideoCall}) : super(key: key);
|
||||
|
||||
@override
|
||||
_IncomingCallState createState() => _IncomingCallState();
|
||||
}
|
||||
|
||||
class _IncomingCallState extends State<IncomingCall> with SingleTickerProviderStateMixin {
|
||||
AnimationController? _animationController;
|
||||
CameraController? _controller;
|
||||
Future<void>? _initializeControllerFuture;
|
||||
bool isCameraReady = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_animationController = AnimationController(
|
||||
vsync: this,
|
||||
duration: const Duration(
|
||||
milliseconds: 500,
|
||||
),
|
||||
);
|
||||
//_runAnimation();
|
||||
// connectSignaling();
|
||||
WidgetsBinding.instance.addPostFrameCallback(
|
||||
(_) => _runAnimation(),
|
||||
);
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: FutureBuilder<void>(
|
||||
future: _initializeControllerFuture,
|
||||
builder: (BuildContext context, AsyncSnapshot<void> snapshot) {
|
||||
if (snapshot.connectionState == ConnectionState.done) {
|
||||
return Stack(
|
||||
alignment: FractionalOffset.center,
|
||||
children: <Widget>[
|
||||
if (widget.isVideoCall!)
|
||||
Positioned.fill(
|
||||
child: AspectRatio(
|
||||
aspectRatio: _controller!.value.aspectRatio,
|
||||
child: CameraPreview(
|
||||
_controller!,
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned.fill(
|
||||
child: ClipRect(
|
||||
child: BackdropFilter(
|
||||
filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: MyColors.grey57Color.withOpacity(
|
||||
0.7,
|
||||
),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
children: <Widget>[
|
||||
Container(
|
||||
margin: const EdgeInsets.all(21.0),
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
Image.asset(
|
||||
"assets/images/logos/main_mohemm_logo.png",
|
||||
height: 70,
|
||||
width: 70,
|
||||
),
|
||||
Container(
|
||||
margin: const EdgeInsets.only(
|
||||
left: 10.0,
|
||||
right: 10.0,
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: const <Widget>[
|
||||
Text(
|
||||
"Aamir Saleem Ahmad",
|
||||
style: TextStyle(
|
||||
fontSize: 21,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: MyColors.white,
|
||||
letterSpacing: -1.26,
|
||||
height: 23 / 12,
|
||||
),
|
||||
),
|
||||
Text(
|
||||
"Calling...",
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Color(
|
||||
0xffC6C6C6,
|
||||
),
|
||||
letterSpacing: -0.48,
|
||||
height: 23 / 24,
|
||||
),
|
||||
),
|
||||
SizedBox(
|
||||
height: 2,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
// Container(
|
||||
// margin: const EdgeInsets.all(21.0),
|
||||
// width: MediaQuery.of(context).size.width,
|
||||
// decoration: cardRadius(15.0, color: MyColors.black, elevation: null),
|
||||
// child: Column(
|
||||
// crossAxisAlignment: CrossAxisAlignment.start,
|
||||
// mainAxisSize: MainAxisSize.min,
|
||||
// children: [
|
||||
// Container(
|
||||
// padding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 6.0),
|
||||
// child: Text(
|
||||
// "TranslationBase.of(context).appoInfo",
|
||||
// style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.white, letterSpacing: -0.64, height: 23 / 12),
|
||||
// ),
|
||||
// ),
|
||||
// Container(
|
||||
// padding: const EdgeInsets.only(left: 16.0, right: 16.0),
|
||||
// child: Text(
|
||||
// "widget.incomingCallData.appointmentdate + widget.incomingCallData.appointmenttime",
|
||||
// style: TextStyle(fontSize: 12.0, letterSpacing: -0.48, color: Color(0xff8E8E8E), fontWeight: FontWeight.w600),
|
||||
// ),
|
||||
// ),
|
||||
// Container(
|
||||
// padding: const EdgeInsets.only(left: 16.0, right: 16.0, bottom: 21.0),
|
||||
// child: Text(
|
||||
// "widget.incomingCallData.clinicname",
|
||||
// style: TextStyle(fontSize: 12.0, letterSpacing: -0.48, color: Color(0xff8E8E8E), fontWeight: FontWeight.w600),
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
const Spacer(),
|
||||
Container(
|
||||
margin: const EdgeInsets.only(
|
||||
bottom: 70.0,
|
||||
left: 49,
|
||||
right: 49,
|
||||
),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
RotationTransition(
|
||||
turns: Tween(
|
||||
begin: 0.0,
|
||||
end: -.1,
|
||||
)
|
||||
.chain(
|
||||
CurveTween(
|
||||
curve: Curves.elasticIn,
|
||||
),
|
||||
)
|
||||
.animate(
|
||||
_animationController!,
|
||||
),
|
||||
child: RawMaterialButton(
|
||||
onPressed: () {
|
||||
_submit();
|
||||
},
|
||||
elevation: 2.0,
|
||||
fillColor: MyColors.green2DColor,
|
||||
padding: const EdgeInsets.all(
|
||||
15.0,
|
||||
),
|
||||
shape: const CircleBorder(),
|
||||
child: const Icon(
|
||||
Icons.call,
|
||||
color: MyColors.white,
|
||||
size: 35.0,
|
||||
),
|
||||
),
|
||||
),
|
||||
RawMaterialButton(
|
||||
onPressed: () {
|
||||
backToHome();
|
||||
},
|
||||
elevation: 2.0,
|
||||
fillColor: MyColors.redA3Color,
|
||||
padding: const EdgeInsets.all(
|
||||
15.0,
|
||||
),
|
||||
shape: const CircleBorder(),
|
||||
child: const Icon(
|
||||
Icons.call_end,
|
||||
color: MyColors.white,
|
||||
size: 35.0,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
} else {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _runAnimation() async {
|
||||
List<CameraDescription> cameras = await availableCameras();
|
||||
CameraDescription firstCamera = cameras[1];
|
||||
_controller = CameraController(
|
||||
firstCamera,
|
||||
ResolutionPreset.medium,
|
||||
);
|
||||
_initializeControllerFuture = _controller!.initialize();
|
||||
setState(() {});
|
||||
// setAudioFile();
|
||||
for (int i = 0; i < 100; i++) {
|
||||
await _animationController!.forward();
|
||||
await _animationController!.reverse();
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _submit() async {
|
||||
try {
|
||||
// backToHome();
|
||||
// final roomModel = RoomModel(name: widget.incomingCallData.name, token: widget.incomingCallData.sessionId, identity: widget.incomingCallData.identity);
|
||||
await _controller?.dispose();
|
||||
|
||||
// changeCallStatusAPI(4);
|
||||
|
||||
// if (_session != null && _signaling != null) {
|
||||
// await Navigator.of(context).pushReplacement(
|
||||
// MaterialPageRoute(
|
||||
// // fullscreenDialog: true,
|
||||
// builder: (BuildContext context) {
|
||||
// // if (widget.incomingCallData.isWebRTC == "true") {
|
||||
// return StartVideoCall(signaling: _signaling, session: _session);
|
||||
//
|
||||
// // else {
|
||||
// // return OpenTokConnectCallPage(apiKey: OPENTOK_API_KEY, sessionId: widget.incomingCallData.sessionId, token: widget.incomingCallData.token);
|
||||
// // }
|
||||
//
|
||||
// // return VideoCallWebPage(receiverId: widget.incomingCallData.receiverID, callerId: widget.incomingCallData.callerID); // Web WebRTC VideoCall
|
||||
//
|
||||
// // return CallHomePage(receiverId: widget.incomingCallData.receiverID, callerId: widget.incomingCallData.callerID); // App WebRTC VideoCall
|
||||
// },
|
||||
// ),
|
||||
// );
|
||||
// } else {
|
||||
// // Invalid Params/Data
|
||||
// Utils.showToast("Failed to establish connection with server");
|
||||
// }
|
||||
} catch (err) {
|
||||
print(err);
|
||||
// await PlatformExceptionAlertDialog(
|
||||
// exception: err,
|
||||
// ).show(context);
|
||||
|
||||
Utils.showToast(err.toString());
|
||||
}
|
||||
}
|
||||
|
||||
// void changeCallStatusAPI(int sessionStatus) {
|
||||
// LiveCareService service = new LiveCareService();
|
||||
// service.endCallAPI(widget.incomingCallData.sessionId, sessionStatus, context).then((res) {}).catchError((err) {
|
||||
// print(err);
|
||||
// });
|
||||
// }
|
||||
|
||||
void backToHome() async {
|
||||
// final connected = await signaling.declineCall(widget.incomingCallData.callerID, widget.incomingCallData.receiverID);
|
||||
// LandingPage.isOpenCallPage = false;
|
||||
// _signaling
|
||||
_animationController!.dispose();
|
||||
// player.stop();
|
||||
// changeCallStatusAPI(3);
|
||||
// _signaling.bye(_session, callRejected: true);
|
||||
// _signaling.callDisconnected(_session, callRejected: true);
|
||||
Navigator.of(context).pop();
|
||||
}
|
||||
|
||||
//
|
||||
// void disposeAudioResources() async {
|
||||
// await player.dispose();
|
||||
// }
|
||||
//
|
||||
// void setAudioFile() async {
|
||||
// player.stop();
|
||||
// await player.setVolume(1.0); // full volume
|
||||
// try {
|
||||
// await player.setAsset('assets/sounds/ring_60Sec.mp3').then((value) {
|
||||
// player.setLoopMode(LoopMode.one); // loop ring sound
|
||||
// player.play();
|
||||
// }).catchError((err) {
|
||||
// print("Error: $err");
|
||||
// });
|
||||
// } catch (e) {
|
||||
// print("Error: $e");
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// void connectSignaling({@required bool iAmCaller = false}) async {
|
||||
// print("----------------- + Signaling Connection Started ---------------------------");
|
||||
// var caller = widget.incomingCallData.callerID;
|
||||
// var receiver = widget.incomingCallData.receiverID;
|
||||
// var host = widget.incomingCallData.server;
|
||||
//
|
||||
// var selfRole = iAmCaller ? "Caller" : "Receiver";
|
||||
// var selfId = iAmCaller ? caller : receiver;
|
||||
// var selfUser = SocketUser(id: selfId, name: "$selfRole-$selfId", userAgent: DeviceInfo.userAgent, moreInfo: {});
|
||||
//
|
||||
// var remoteRole = !iAmCaller ? "Caller" : "Receiver";
|
||||
// var remoteId = !iAmCaller ? caller : receiver;
|
||||
// var remoteUser = SocketUser(id: remoteId, name: "$remoteRole-$remoteId", userAgent: DeviceInfo.userAgent, moreInfo: {});
|
||||
//
|
||||
// var sessionId = "$caller-$receiver";
|
||||
// _session = SessionOneToOne(id: sessionId, local_user: selfUser, remote_user: remoteUser);
|
||||
//
|
||||
// _signaling = Signaling(host, session: _session);
|
||||
// await _signaling.connect();
|
||||
//
|
||||
// if (_signaling.state == SignalingState.Open) {
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
|
||||
BoxDecoration cardRadius(double radius, {required Color color, double? elevation}) {
|
||||
return BoxDecoration(
|
||||
shape: BoxShape.rectangle,
|
||||
color: color ?? Colors.white,
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(radius),
|
||||
),
|
||||
boxShadow: <BoxShadow>[
|
||||
BoxShadow(
|
||||
color: const Color(
|
||||
0xff000000,
|
||||
).withOpacity(
|
||||
.05,
|
||||
),
|
||||
//spreadRadius: 5,
|
||||
blurRadius: elevation ?? 27,
|
||||
offset: const Offset(
|
||||
-2,
|
||||
3,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,428 @@
|
||||
import 'dart:ui';
|
||||
|
||||
import 'package:camera/camera.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||
import 'package:mohem_flutter_app/classes/utils.dart';
|
||||
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||
import 'package:mohem_flutter_app/models/chat/call.dart';
|
||||
|
||||
class OutGoingCall extends StatefulWidget {
|
||||
IncomingCallData OutGoingCallData;
|
||||
bool? isVideoCall;
|
||||
|
||||
OutGoingCall({Key? key, required this.OutGoingCallData, this.isVideoCall}) : super(key: key);
|
||||
|
||||
@override
|
||||
_OutGoingCallState createState() => _OutGoingCallState();
|
||||
}
|
||||
|
||||
class _OutGoingCallState extends State<OutGoingCall> with SingleTickerProviderStateMixin {
|
||||
AnimationController? _animationController;
|
||||
CameraController? _controller;
|
||||
Future<void>? _initializeControllerFuture;
|
||||
bool isCameraReady = false;
|
||||
bool isMicOff = false;
|
||||
bool isLoudSpeaker = false;
|
||||
bool isCamOff = false;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
_animationController = AnimationController(
|
||||
vsync: this,
|
||||
duration: const Duration(
|
||||
milliseconds: 500,
|
||||
),
|
||||
);
|
||||
//_runAnimation();
|
||||
// connectSignaling();
|
||||
WidgetsBinding.instance.addPostFrameCallback(
|
||||
(_) => _runAnimation(),
|
||||
);
|
||||
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
body: FutureBuilder<void>(
|
||||
future: _initializeControllerFuture,
|
||||
builder: (BuildContext context, AsyncSnapshot<void> snapshot) {
|
||||
if (snapshot.connectionState == ConnectionState.done) {
|
||||
return Stack(
|
||||
alignment: FractionalOffset.center,
|
||||
children: <Widget>[
|
||||
if (widget.isVideoCall!)
|
||||
Positioned.fill(
|
||||
child: AspectRatio(
|
||||
aspectRatio: _controller!.value.aspectRatio,
|
||||
child: CameraPreview(
|
||||
_controller!,
|
||||
),
|
||||
),
|
||||
),
|
||||
Positioned.fill(
|
||||
child: ClipRect(
|
||||
child: BackdropFilter(
|
||||
filter: ImageFilter.blur(sigmaX: 10.0, sigmaY: 10.0),
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: MyColors.grey57Color.withOpacity(
|
||||
0.7,
|
||||
),
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
children: <Widget>[
|
||||
40.height,
|
||||
Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: <Widget>[
|
||||
Container(
|
||||
margin: const EdgeInsets.all(21.0),
|
||||
child: Container(
|
||||
margin: const EdgeInsets.only(
|
||||
left: 10.0,
|
||||
right: 10.0,
|
||||
),
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceAround,
|
||||
children: <Widget>[
|
||||
SvgPicture.asset(
|
||||
"assets/images/user.svg",
|
||||
height: 70,
|
||||
width: 70,
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
10.height,
|
||||
const Text(
|
||||
"Aamir Saleem Ahmad",
|
||||
style: TextStyle(
|
||||
fontSize: 21,
|
||||
fontWeight: FontWeight.bold,
|
||||
color: MyColors.white,
|
||||
letterSpacing: -1.26,
|
||||
height: 23 / 12,
|
||||
),
|
||||
),
|
||||
const Text(
|
||||
"Ringing...",
|
||||
style: TextStyle(
|
||||
fontSize: 16,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: Color(
|
||||
0xffC6C6C6,
|
||||
),
|
||||
letterSpacing: -0.48,
|
||||
height: 23 / 24,
|
||||
),
|
||||
),
|
||||
const SizedBox(
|
||||
height: 2,
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
// Container(
|
||||
// margin: const EdgeInsets.all(21.0),
|
||||
// width: MediaQuery.of(context).size.width,
|
||||
// decoration: cardRadius(15.0, color: MyColors.black, elevation: null),
|
||||
// child: Column(
|
||||
// crossAxisAlignment: CrossAxisAlignment.start,
|
||||
// mainAxisSize: MainAxisSize.min,
|
||||
// children: [
|
||||
// Container(
|
||||
// padding: const EdgeInsets.fromLTRB(16.0, 16.0, 16.0, 6.0),
|
||||
// child: Text(
|
||||
// "TranslationBase.of(context).appoInfo",
|
||||
// style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: MyColors.white, letterSpacing: -0.64, height: 23 / 12),
|
||||
// ),
|
||||
// ),
|
||||
// Container(
|
||||
// padding: const EdgeInsets.only(left: 16.0, right: 16.0),
|
||||
// child: Text(
|
||||
// "widget.OutGoingCallData.appointmentdate + widget.OutGoingCallData.appointmenttime",
|
||||
// style: TextStyle(fontSize: 12.0, letterSpacing: -0.48, color: Color(0xff8E8E8E), fontWeight: FontWeight.w600),
|
||||
// ),
|
||||
// ),
|
||||
// Container(
|
||||
// padding: const EdgeInsets.only(left: 16.0, right: 16.0, bottom: 21.0),
|
||||
// child: Text(
|
||||
// "widget.OutGoingCallData.clinicname",
|
||||
// style: TextStyle(fontSize: 12.0, letterSpacing: -0.48, color: Color(0xff8E8E8E), fontWeight: FontWeight.w600),
|
||||
// ),
|
||||
// ),
|
||||
// ],
|
||||
// ),
|
||||
// ),
|
||||
const Spacer(),
|
||||
Container(
|
||||
margin: const EdgeInsets.only(
|
||||
bottom: 70.0,
|
||||
left: 49,
|
||||
right: 49,
|
||||
),
|
||||
child: Row(
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: <Widget>[
|
||||
if (widget.isVideoCall!)
|
||||
RawMaterialButton(
|
||||
onPressed: () {
|
||||
_camOff();
|
||||
},
|
||||
elevation: 2.0,
|
||||
fillColor: isCamOff ? MyColors.green2DColor : Colors.grey,
|
||||
padding: const EdgeInsets.all(
|
||||
15.0,
|
||||
),
|
||||
shape: const CircleBorder(),
|
||||
child: Icon(
|
||||
isCamOff ? Icons.videocam_off : Icons.videocam,
|
||||
color: MyColors.white,
|
||||
size: 35.0,
|
||||
),
|
||||
)
|
||||
else
|
||||
RawMaterialButton(
|
||||
onPressed: () {
|
||||
_loudOn();
|
||||
},
|
||||
elevation: 2.0,
|
||||
fillColor: isLoudSpeaker ? MyColors.green2DColor : Colors.grey,
|
||||
padding: const EdgeInsets.all(
|
||||
15.0,
|
||||
),
|
||||
shape: const CircleBorder(),
|
||||
child: const Icon(
|
||||
Icons.volume_up,
|
||||
color: MyColors.white,
|
||||
size: 35.0,
|
||||
),
|
||||
),
|
||||
RawMaterialButton(
|
||||
onPressed: () {
|
||||
_micOff();
|
||||
},
|
||||
elevation: 2.0,
|
||||
fillColor: isMicOff ? MyColors.green2DColor : Colors.grey,
|
||||
padding: const EdgeInsets.all(
|
||||
15.0,
|
||||
),
|
||||
shape: const CircleBorder(),
|
||||
child: Icon(
|
||||
isMicOff ? Icons.mic_off : Icons.mic,
|
||||
color: MyColors.white,
|
||||
size: 35.0,
|
||||
),
|
||||
),
|
||||
RawMaterialButton(
|
||||
onPressed: () {
|
||||
backToHome();
|
||||
},
|
||||
elevation: 2.0,
|
||||
fillColor: MyColors.redA3Color,
|
||||
padding: const EdgeInsets.all(
|
||||
15.0,
|
||||
),
|
||||
shape: const CircleBorder(),
|
||||
child: const Icon(
|
||||
Icons.call_end,
|
||||
color: MyColors.white,
|
||||
size: 35.0,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
} else {
|
||||
return const Center(
|
||||
child: CircularProgressIndicator(),
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _runAnimation() async {
|
||||
List<CameraDescription> cameras = await availableCameras();
|
||||
CameraDescription firstCamera = cameras[1];
|
||||
_controller = CameraController(
|
||||
firstCamera,
|
||||
ResolutionPreset.medium,
|
||||
);
|
||||
_initializeControllerFuture = _controller!.initialize();
|
||||
setState(() {});
|
||||
// setAudioFile();
|
||||
for (int i = 0; i < 100; i++) {
|
||||
await _animationController!.forward();
|
||||
await _animationController!.reverse();
|
||||
}
|
||||
}
|
||||
|
||||
void _micOff() {
|
||||
setState(() {
|
||||
isMicOff = !isMicOff;
|
||||
});
|
||||
}
|
||||
|
||||
void _camOff() {
|
||||
setState(() {
|
||||
isCamOff = !isCamOff;
|
||||
});
|
||||
}
|
||||
|
||||
void _loudOn() {
|
||||
setState(() {
|
||||
isLoudSpeaker = !isLoudSpeaker;
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> _submit() async {
|
||||
try {
|
||||
// backToHome();
|
||||
// final roomModel = RoomModel(name: widget.OutGoingCallData.name, token: widget.OutGoingCallData.sessionId, identity: widget.OutGoingCallData.identity);
|
||||
await _controller?.dispose();
|
||||
|
||||
// changeCallStatusAPI(4);
|
||||
|
||||
// if (_session != null && _signaling != null) {
|
||||
// await Navigator.of(context).pushReplacement(
|
||||
// MaterialPageRoute(
|
||||
// // fullscreenDialog: true,
|
||||
// builder: (BuildContext context) {
|
||||
// // if (widget.OutGoingCallData.isWebRTC == "true") {
|
||||
// return StartVideoCall(signaling: _signaling, session: _session);
|
||||
//
|
||||
// // else {
|
||||
// // return OpenTokConnectCallPage(apiKey: OPENTOK_API_KEY, sessionId: widget.OutGoingCallData.sessionId, token: widget.OutGoingCallData.token);
|
||||
// // }
|
||||
//
|
||||
// // return VideoCallWebPage(receiverId: widget.OutGoingCallData.receiverID, callerId: widget.OutGoingCallData.callerID); // Web WebRTC VideoCall
|
||||
//
|
||||
// // return CallHomePage(receiverId: widget.OutGoingCallData.receiverID, callerId: widget.OutGoingCallData.callerID); // App WebRTC VideoCall
|
||||
// },
|
||||
// ),
|
||||
// );
|
||||
// } else {
|
||||
// // Invalid Params/Data
|
||||
// Utils.showToast("Failed to establish connection with server");
|
||||
// }
|
||||
} catch (err) {
|
||||
print(err);
|
||||
// await PlatformExceptionAlertDialog(
|
||||
// exception: err,
|
||||
// ).show(context);
|
||||
|
||||
Utils.showToast(err.toString());
|
||||
}
|
||||
}
|
||||
|
||||
// void changeCallStatusAPI(int sessionStatus) {
|
||||
// LiveCareService service = new LiveCareService();
|
||||
// service.endCallAPI(widget.OutGoingCallData.sessionId, sessionStatus, context).then((res) {}).catchError((err) {
|
||||
// print(err);
|
||||
// });
|
||||
// }
|
||||
|
||||
void backToHome() async {
|
||||
// final connected = await signaling.declineCall(widget.OutGoingCallData.callerID, widget.OutGoingCallData.receiverID);
|
||||
// LandingPage.isOpenCallPage = false;
|
||||
// _signaling
|
||||
_animationController!.dispose();
|
||||
// player.stop();
|
||||
// changeCallStatusAPI(3);
|
||||
// _signaling.bye(_session, callRejected: true);
|
||||
// _signaling.callDisconnected(_session, callRejected: true);
|
||||
Navigator.of(context).pop();
|
||||
}
|
||||
|
||||
//
|
||||
// void disposeAudioResources() async {
|
||||
// await player.dispose();
|
||||
// }
|
||||
//
|
||||
// void setAudioFile() async {
|
||||
// player.stop();
|
||||
// await player.setVolume(1.0); // full volume
|
||||
// try {
|
||||
// await player.setAsset('assets/sounds/ring_60Sec.mp3').then((value) {
|
||||
// player.setLoopMode(LoopMode.one); // loop ring sound
|
||||
// player.play();
|
||||
// }).catchError((err) {
|
||||
// print("Error: $err");
|
||||
// });
|
||||
// } catch (e) {
|
||||
// print("Error: $e");
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// void connectSignaling({@required bool iAmCaller = false}) async {
|
||||
// print("----------------- + Signaling Connection Started ---------------------------");
|
||||
// var caller = widget.OutGoingCallData.callerID;
|
||||
// var receiver = widget.OutGoingCallData.receiverID;
|
||||
// var host = widget.OutGoingCallData.server;
|
||||
//
|
||||
// var selfRole = iAmCaller ? "Caller" : "Receiver";
|
||||
// var selfId = iAmCaller ? caller : receiver;
|
||||
// var selfUser = SocketUser(id: selfId, name: "$selfRole-$selfId", userAgent: DeviceInfo.userAgent, moreInfo: {});
|
||||
//
|
||||
// var remoteRole = !iAmCaller ? "Caller" : "Receiver";
|
||||
// var remoteId = !iAmCaller ? caller : receiver;
|
||||
// var remoteUser = SocketUser(id: remoteId, name: "$remoteRole-$remoteId", userAgent: DeviceInfo.userAgent, moreInfo: {});
|
||||
//
|
||||
// var sessionId = "$caller-$receiver";
|
||||
// _session = SessionOneToOne(id: sessionId, local_user: selfUser, remote_user: remoteUser);
|
||||
//
|
||||
// _signaling = Signaling(host, session: _session);
|
||||
// await _signaling.connect();
|
||||
//
|
||||
// if (_signaling.state == SignalingState.Open) {
|
||||
// return;
|
||||
// }
|
||||
// }
|
||||
|
||||
BoxDecoration cardRadius(double radius, {required Color color, double? elevation}) {
|
||||
return BoxDecoration(
|
||||
shape: BoxShape.rectangle,
|
||||
color: color ?? Colors.white,
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(radius),
|
||||
),
|
||||
boxShadow: <BoxShadow>[
|
||||
BoxShadow(
|
||||
color: const Color(
|
||||
0xff000000,
|
||||
).withOpacity(
|
||||
.05,
|
||||
),
|
||||
//spreadRadius: 5,
|
||||
blurRadius: elevation ?? 27,
|
||||
offset: const Offset(
|
||||
-2,
|
||||
3,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
@ -1,109 +1,397 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:mohem_flutter_app/api/chat/chat_provider_model.dart';
|
||||
import 'package:mohem_flutter_app/app_state/app_state.dart';
|
||||
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
|
||||
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
||||
import 'package:mohem_flutter_app/models/chat/call.dart';
|
||||
import 'package:mohem_flutter_app/ui/chat/call/chat_outgoing_call_screen.dart';
|
||||
import 'package:mohem_flutter_app/ui/chat/chat_bubble.dart';
|
||||
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
|
||||
import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:pull_to_refresh/pull_to_refresh.dart';
|
||||
import 'package:swipe_to/swipe_to.dart';
|
||||
|
||||
class ChatDetailScreen extends StatefulWidget {
|
||||
// ignore: prefer_const_constructors_in_immutables
|
||||
ChatDetailScreen({Key? key}) : super(key: key);
|
||||
|
||||
class ChatDetailScreen extends StatelessWidget {
|
||||
@override
|
||||
State<ChatDetailScreen> createState() => _ChatDetailScreenState();
|
||||
}
|
||||
|
||||
class _ChatDetailScreenState extends State<ChatDetailScreen> {
|
||||
dynamic userDetails;
|
||||
late ChatProviderModel data;
|
||||
final RefreshController _rc = RefreshController(initialRefresh: false);
|
||||
|
||||
ChatDetailScreen({Key? key}) : super(key: key);
|
||||
void getMoreChat() async {
|
||||
if (userDetails != null) {
|
||||
data.paginationVal = data.paginationVal + 10;
|
||||
if (userDetails != null)
|
||||
data.getSingleUserChatHistory(
|
||||
senderUID: AppState().chatDetails!.response!.id!.toInt(),
|
||||
receiverUID: userDetails["targetUser"].id,
|
||||
loadMore: true,
|
||||
isNewChat: false,
|
||||
);
|
||||
}
|
||||
await Future.delayed(
|
||||
const Duration(
|
||||
milliseconds: 1000,
|
||||
),
|
||||
);
|
||||
_rc.loadComplete();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
userDetails = ModalRoute
|
||||
.of(context)!
|
||||
.settings
|
||||
.arguments;
|
||||
userDetails = ModalRoute.of(context)!.settings.arguments;
|
||||
data = Provider.of<ChatProviderModel>(context, listen: false);
|
||||
data.getSingleUserChatHistory(senderUID: AppState().chatDetails!.response!.id.toString(), receiverUID: userDetails["targetUser"].id, pagination: "0");
|
||||
Timer(const Duration(seconds: 1), () => data.scrollDown());
|
||||
if (userDetails != null)
|
||||
data.getSingleUserChatHistory(
|
||||
senderUID: AppState().chatDetails!.response!.id!.toInt(),
|
||||
receiverUID: userDetails["targetUser"].id,
|
||||
loadMore: false,
|
||||
isNewChat: userDetails["isNewChat"],
|
||||
);
|
||||
|
||||
return Scaffold(
|
||||
backgroundColor: const Color(0xFFF8F8F8),
|
||||
appBar: AppBarWidget(context, title: userDetails["targetUser"].userName, showHomeButton: false, image: userDetails["targetUser"].image),
|
||||
appBar: AppBarWidget(context,
|
||||
title: userDetails["targetUser"].userName.toString().replaceAll(".", " ").capitalizeFirstofEach,
|
||||
showHomeButton: false,
|
||||
image: userDetails["targetUser"].image,
|
||||
actions: [
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
makeCall("AUDIO");
|
||||
},
|
||||
icon: SvgPicture.asset(
|
||||
"assets/icons/chat/call.svg",
|
||||
width: 22,
|
||||
height: 22,
|
||||
),
|
||||
),
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
makeCall("VIDEO");
|
||||
},
|
||||
icon: SvgPicture.asset(
|
||||
"assets/icons/chat/video_call.svg",
|
||||
width: 20,
|
||||
height: 20,
|
||||
),
|
||||
),
|
||||
10.width,
|
||||
]),
|
||||
body: Consumer<ChatProviderModel>(
|
||||
builder: (BuildContext context, ChatProviderModel m, Widget? child) {
|
||||
return (m.isLoading
|
||||
? ChatHomeShimmer()
|
||||
: Column(
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
child: ListView.builder(
|
||||
controller: m.scrollController,
|
||||
shrinkWrap: true,
|
||||
itemCount: m.userChatHistory.length,
|
||||
padding: const EdgeInsets.symmetric(vertical: 10),
|
||||
itemBuilder: (BuildContext context, int i) {
|
||||
i == 0 ? m.logger.d(m.userChatHistory.length) : "";
|
||||
return ChatBubble(
|
||||
text: m.userChatHistory[i].contant.toString(),
|
||||
isSeen: m.userChatHistory[i].isSeen == true ? true : false,
|
||||
isCurrentUser: m.userChatHistory[i].currentUserId == AppState().chatDetails!.response!.id ? true : false,
|
||||
isDelivered: m.userChatHistory[i].currentUserId == AppState().chatDetails!.response!.id && m.userChatHistory[i].isDelivered == true ? true : false,
|
||||
dateTime: m.userChatHistory[i].createdDate.toString(),
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
Card(
|
||||
margin: EdgeInsets.zero,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 10),
|
||||
child: TextField(
|
||||
controller: m.message,
|
||||
decoration: InputDecoration(
|
||||
hintText: LocaleKeys.typeheretoreply.tr(),
|
||||
hintStyle: const TextStyle(color: MyColors.grey98Color),
|
||||
border: InputBorder.none,
|
||||
focusedBorder: InputBorder.none,
|
||||
enabledBorder: InputBorder.none,
|
||||
errorBorder: InputBorder.none,
|
||||
disabledBorder: InputBorder.none,
|
||||
contentPadding: const EdgeInsets.symmetric(vertical: 10, horizontal: 15),
|
||||
suffixIcon: SizedBox(
|
||||
width: 100,
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.end,
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
children: [
|
||||
IconButton(
|
||||
icon: const Icon(
|
||||
Icons.attach_file_rounded,
|
||||
size: 27,
|
||||
color: MyColors.lightGreenColor,
|
||||
children: <Widget>[
|
||||
Expanded(
|
||||
flex: 2,
|
||||
child: SmartRefresher(
|
||||
enablePullDown: false,
|
||||
enablePullUp: true,
|
||||
onLoading: () {
|
||||
getMoreChat();
|
||||
},
|
||||
header: const MaterialClassicHeader(
|
||||
color: MyColors.gradiantEndColor,
|
||||
),
|
||||
controller: _rc,
|
||||
reverse: true,
|
||||
child: ListView.builder(
|
||||
controller: m.scrollController,
|
||||
shrinkWrap: true,
|
||||
physics: const BouncingScrollPhysics(),
|
||||
reverse: true,
|
||||
itemCount: m.userChatHistory.length,
|
||||
padding: const EdgeInsets.only(top: 20),
|
||||
itemBuilder: (BuildContext context, int i) {
|
||||
return SwipeTo(
|
||||
iconColor: MyColors.lightGreenColor,
|
||||
child: ChatBubble(
|
||||
text: m.userChatHistory[i].contant.toString(),
|
||||
replyText: m.userChatHistory[i].userChatReplyResponse != null ? m.userChatHistory[i].userChatReplyResponse!.contant.toString() : "",
|
||||
isSeen: m.userChatHistory[i].isSeen == true ? true : false,
|
||||
isCurrentUser: m.userChatHistory[i].currentUserId == AppState().chatDetails!.response!.id ? true : false,
|
||||
isDelivered: m.userChatHistory[i].currentUserId == AppState().chatDetails!.response!.id && m.userChatHistory[i].isDelivered == true ? true : false,
|
||||
dateTime: m.dateFormte(m.userChatHistory[i].createdDate!),
|
||||
isReplied: m.userChatHistory[i].userChatReplyResponse != null ? true : false,
|
||||
userName: AppState().chatDetails!.response!.userName == m.userChatHistory[i].currentUserName.toString() ? "You" : m.userChatHistory[i].currentUserName.toString(),
|
||||
),
|
||||
onRightSwipe: () {
|
||||
m.chatReply(
|
||||
m.userChatHistory[i],
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
),
|
||||
if (m.isMsgReply)
|
||||
Row(
|
||||
children: <Widget>[
|
||||
Container(
|
||||
height: 80,
|
||||
color: MyColors.textMixColor,
|
||||
width: 6,
|
||||
),
|
||||
Expanded(
|
||||
child: Container(
|
||||
height: 80,
|
||||
color: MyColors.black.withOpacity(0.10),
|
||||
child: ListTile(
|
||||
title: (AppState().chatDetails!.response!.userName == m.repliedMsg.first.currentUserName.toString()
|
||||
? "You"
|
||||
: m.repliedMsg.first.currentUserName.toString().replaceAll(".", " "))
|
||||
.toText14(color: MyColors.lightGreenColor),
|
||||
subtitle: (m.repliedMsg.isNotEmpty ? m.repliedMsg.first.contant! : "").toText12(
|
||||
color: MyColors.white,
|
||||
maxLine: 2,
|
||||
),
|
||||
trailing: GestureDetector(
|
||||
onTap: m.closeMe,
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
color: MyColors.white.withOpacity(0.5),
|
||||
borderRadius: const BorderRadius.all(
|
||||
Radius.circular(20),
|
||||
),
|
||||
),
|
||||
child: const Icon(
|
||||
Icons.close,
|
||||
size: 23,
|
||||
color: MyColors.white,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
onPressed: () {},
|
||||
),
|
||||
IconButton(
|
||||
icon: SvgPicture.asset(
|
||||
"assets/icons/chat/chat_send_icon.svg",
|
||||
height: 26,
|
||||
width: 35,
|
||||
),
|
||||
],
|
||||
),
|
||||
if (m.isFileSelected && m.sFileType == ".png" || m.sFileType == ".jpeg" || m.sFileType == ".jpg")
|
||||
Card(
|
||||
margin: EdgeInsets.zero,
|
||||
elevation: 0,
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.only(
|
||||
left: 20,
|
||||
right: 20,
|
||||
top: 20,
|
||||
bottom: 0,
|
||||
),
|
||||
child: Card(
|
||||
margin: EdgeInsets.zero,
|
||||
shape: RoundedRectangleBorder(
|
||||
borderRadius: BorderRadius.circular(0),
|
||||
),
|
||||
elevation: 0,
|
||||
child: Container(
|
||||
height: 200,
|
||||
decoration: BoxDecoration(
|
||||
image: DecorationImage(
|
||||
image: FileImage(
|
||||
m.selectedFile,
|
||||
),
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
borderRadius: const BorderRadius.all(
|
||||
Radius.circular(0),
|
||||
),
|
||||
),
|
||||
child: const SizedBox(
|
||||
width: double.infinity,
|
||||
height: 200,
|
||||
),
|
||||
onPressed: () {
|
||||
m.sendChatMessage(m.message.text, userDetails["targetUser"].id, userDetails["targetUser"].userName);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
Card(
|
||||
margin: EdgeInsets.zero,
|
||||
child: TextField(
|
||||
controller: m.message,
|
||||
decoration: InputDecoration(
|
||||
hintText: m.isFileSelected ? m.selectedFile.path.split("/").last : LocaleKeys.typeheretoreply.tr(),
|
||||
hintStyle: TextStyle(
|
||||
color: m.isFileSelected ? MyColors.darkTextColor : MyColors.grey98Color,
|
||||
fontSize: 14,
|
||||
),
|
||||
border: InputBorder.none,
|
||||
focusedBorder: InputBorder.none,
|
||||
enabledBorder: InputBorder.none,
|
||||
errorBorder: InputBorder.none,
|
||||
disabledBorder: InputBorder.none,
|
||||
contentPadding: EdgeInsets.only(
|
||||
left: m.sFileType.isNotEmpty ? 10 : 20,
|
||||
right: m.sFileType.isNotEmpty ? 0 : 5,
|
||||
top: 20,
|
||||
bottom: 20,
|
||||
),
|
||||
prefixIcon: m.sFileType.isNotEmpty
|
||||
? Row(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
mainAxisAlignment: MainAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
SvgPicture.asset(
|
||||
m.getType(m.sFileType),
|
||||
height: 30,
|
||||
width: 25,
|
||||
alignment: Alignment.center,
|
||||
fit: BoxFit.cover,
|
||||
).paddingOnly(left: 20),
|
||||
],
|
||||
)
|
||||
: null,
|
||||
suffixIcon: SizedBox(
|
||||
width: 96,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
crossAxisAlignment: CrossAxisAlignment.center, // added line
|
||||
children: <Widget>[
|
||||
if (m.sFileType.isNotEmpty)
|
||||
IconButton(
|
||||
padding: EdgeInsets.zero,
|
||||
alignment: Alignment.centerRight,
|
||||
icon: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
children: <Widget>[
|
||||
Container(
|
||||
decoration: const BoxDecoration(
|
||||
color: MyColors.redA3Color,
|
||||
borderRadius: BorderRadius.all(
|
||||
Radius.circular(20),
|
||||
),
|
||||
),
|
||||
child: const Icon(
|
||||
Icons.close,
|
||||
size: 15,
|
||||
color: MyColors.white,
|
||||
),
|
||||
),
|
||||
("Clear")
|
||||
.toText11(
|
||||
color: MyColors.redA3Color,
|
||||
)
|
||||
.paddingOnly(
|
||||
left: 4,
|
||||
),
|
||||
],
|
||||
),
|
||||
onPressed: () async {
|
||||
m.removeAttachment();
|
||||
},
|
||||
),
|
||||
if (m.sFileType.isEmpty)
|
||||
RotationTransition(
|
||||
turns: const AlwaysStoppedAnimation(45 / 360),
|
||||
child: IconButton(
|
||||
padding: EdgeInsets.zero,
|
||||
alignment: Alignment.topRight,
|
||||
icon: const Icon(
|
||||
Icons.attach_file_rounded,
|
||||
size: 26,
|
||||
color: MyColors.grey3AColor,
|
||||
),
|
||||
onPressed: () async {
|
||||
m.selectImageToUpload(context);
|
||||
},
|
||||
),
|
||||
),
|
||||
IconButton(
|
||||
alignment: Alignment.centerRight,
|
||||
padding: EdgeInsets.zero,
|
||||
icon: SvgPicture.asset(
|
||||
"assets/icons/chat/chat_send_icon.svg",
|
||||
height: 26,
|
||||
width: 26,
|
||||
),
|
||||
onPressed: () {
|
||||
m.sendChatMessage(
|
||||
userDetails["targetUser"].id,
|
||||
userDetails["targetUser"].userName,
|
||||
context,
|
||||
);
|
||||
},
|
||||
)
|
||||
],
|
||||
),
|
||||
).paddingOnly(
|
||||
right: 20,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
));
|
||||
],
|
||||
));
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void makeCall(String callType) async {
|
||||
// final server = await SelectionDialog(
|
||||
// context,
|
||||
// title: "Select Server",
|
||||
// items: ["https://livecareturn.hmg.com:8086", "https://104.197.179.1:8086"]
|
||||
// ).show();
|
||||
|
||||
Map<String, String> json = {
|
||||
"callerID": "9920",
|
||||
"PatientID": "1231755",
|
||||
"msgID": "123",
|
||||
"notfID": "123",
|
||||
"notification_foreground": "true",
|
||||
"count": "1",
|
||||
"message": "Doctor is calling ",
|
||||
"AppointmentNo": "123",
|
||||
"title": "Rayyan Hospital",
|
||||
"ProjectID": "123",
|
||||
"NotificationType": "10",
|
||||
"background": "1",
|
||||
"doctorname": "Dr Sulaiman Al Habib",
|
||||
"clinicname": "ENT Clinic",
|
||||
"speciality": "Speciality",
|
||||
"appointmentdate": "Sun, 15th Dec, 2019",
|
||||
"appointmenttime": "09:00",
|
||||
"type": "video",
|
||||
"session_id":
|
||||
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImN0eSI6InR3aWxpby1mcGE7dj0xIn0.eyJqdGkiOiJTS2I2NjYyOWMzN2ZhOTM3YjFjNDI2Zjg1MTgyNWFmN2M0LTE1OTg3NzQ1MDYiLCJpc3MiOiJTS2I2NjYyOWMzN2ZhOTM3YjFjNDI2Zjg1MTgyNWFmN2M0Iiwic3ViIjoiQUNhYWQ1YTNmOGM2NGZhNjczNTY3NTYxNTc0N2YyNmMyYiIsImV4cCI6MTU5ODc3ODEwNiwiZ3JhbnRzIjp7ImlkZW50aXR5IjoiSGFyb29uMSIsInZpZGVvIjp7InJvb20iOiJTbWFsbERhaWx5U3RhbmR1cCJ9fX0.7XUS5uMQQJfkrBZu9EjQ6STL6R7iXkso6BtO1HmrQKk",
|
||||
"identity": "Haroon1",
|
||||
"name": "SmallDailyStandup",
|
||||
"videoUrl": "video",
|
||||
"picture": "video",
|
||||
"is_call": "true",
|
||||
"is_webrtc": "true",
|
||||
// "server": "https://192.168.8.163:8086",
|
||||
"server": "https://livecareturn.hmg.com:8086",
|
||||
};
|
||||
|
||||
IncomingCallData incomingCallData = IncomingCallData.fromJson(json);
|
||||
await Navigator.push(
|
||||
context,
|
||||
MaterialPageRoute(
|
||||
builder: (BuildContext context) => OutGoingCall(
|
||||
isVideoCall: callType == "VIDEO" ? true : false,
|
||||
OutGoingCallData: incomingCallData,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -1,179 +1,132 @@
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:mohem_flutter_app/api/chat/chat_provider_model.dart';
|
||||
import 'package:mohem_flutter_app/app_state/app_state.dart';
|
||||
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||
import 'package:mohem_flutter_app/config/routes.dart';
|
||||
import 'package:mohem_flutter_app/extensions/int_extensions.dart';
|
||||
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
|
||||
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
||||
import 'package:mohem_flutter_app/ui/chat/chat_home_screen.dart';
|
||||
import 'package:mohem_flutter_app/ui/chat/favorite_users_screen.dart';
|
||||
import 'package:mohem_flutter_app/ui/screens/items_for_sale/fragments/items_for_sale.dart';
|
||||
import 'package:mohem_flutter_app/ui/screens/items_for_sale/fragments/my_posted_ads_fragment.dart';
|
||||
import 'package:mohem_flutter_app/widgets/app_bar_widget.dart';
|
||||
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
|
||||
import 'package:mohem_flutter_app/widgets/bottom_sheets/search_employee_bottom_sheet.dart';
|
||||
import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class ChatHomeScreen extends StatefulWidget {
|
||||
const ChatHomeScreen({Key? key}) : super(key: key);
|
||||
class ChatHome extends StatefulWidget {
|
||||
const ChatHome({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
State<ChatHomeScreen> createState() => _ChatHomeScreenState();
|
||||
State<ChatHome> createState() => _ChatHomeState();
|
||||
}
|
||||
|
||||
class _ChatHomeScreenState extends State<ChatHomeScreen> {
|
||||
TextEditingController search = new TextEditingController();
|
||||
class _ChatHomeState extends State<ChatHome> {
|
||||
int tabIndex = 0;
|
||||
PageController controller = PageController();
|
||||
late ChatProviderModel data;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
// TODO: implement initState
|
||||
super.initState();
|
||||
data = Provider.of<ChatProviderModel>(context, listen: false);
|
||||
data.getUserAutoLoginToken().whenComplete(() {
|
||||
data.getUserAutoLoginToken().then((Object? value) {
|
||||
data.getUserRecentChats();
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
data.clearAll();
|
||||
if (data.hubConInitialized) {
|
||||
data.hubConnection.stop();
|
||||
}
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: Colors.white,
|
||||
appBar: AppBarWidget(context, title: LocaleKeys.mychats.tr(), showHomeButton: false),
|
||||
body: Consumer<ChatProviderModel>(builder: (BuildContext context, ChatProviderModel m, Widget? child) {
|
||||
return m.isLoading
|
||||
? ChatHomeShimmer()
|
||||
: ListView(
|
||||
shrinkWrap: true,
|
||||
physics: const AlwaysScrollableScrollPhysics(),
|
||||
children: [
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 20),
|
||||
child: TextField(
|
||||
onChanged: (String val) {
|
||||
m.filter(val);
|
||||
},
|
||||
decoration: InputDecoration(
|
||||
border: InputBorder.none,
|
||||
focusedBorder: InputBorder.none,
|
||||
enabledBorder: OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(5),
|
||||
borderSide: const BorderSide(
|
||||
color: Color(0xFFE5E5E5),
|
||||
),
|
||||
),
|
||||
errorBorder: InputBorder.none,
|
||||
disabledBorder: InputBorder.none,
|
||||
contentPadding: const EdgeInsets.symmetric(horizontal: 15, vertical: 10),
|
||||
hintText: "Search from chat",
|
||||
hintStyle: const TextStyle(color: MyColors.lightTextColor, fontStyle: FontStyle.italic),
|
||||
filled: true,
|
||||
fillColor: const Color(0xFFF7F7F7),
|
||||
),
|
||||
),
|
||||
),
|
||||
if (m.searchedChats != null)
|
||||
ListView.separated(
|
||||
itemCount: m.searchedChats!.length,
|
||||
padding: const EdgeInsets.only(top: 0),
|
||||
shrinkWrap: true,
|
||||
physics: const NeverScrollableScrollPhysics(),
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return ListTile(
|
||||
leading: Stack(
|
||||
children: [
|
||||
SvgPicture.asset(
|
||||
"assets/images/user.svg",
|
||||
height: 48,
|
||||
width: 48,
|
||||
),
|
||||
Positioned(
|
||||
right: 5,
|
||||
bottom: 1,
|
||||
child: Container(
|
||||
width: 10,
|
||||
height: 10,
|
||||
decoration: BoxDecoration(
|
||||
color: m.searchedChats![index].userStatus == 1 ? MyColors.green2DColor : Colors.red,
|
||||
borderRadius: const BorderRadius.all(
|
||||
Radius.circular(10),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
title: (m.searchedChats![index].userName ?? "").toText14(color: MyColors.darkTextColor),
|
||||
subtitle: (m.searchedChats![index].isTyping == true ? "Typing ..." : "").toText11(color: MyColors.normalTextColor),
|
||||
trailing: ("Today").toText10(color: MyColors.lightTextColor),
|
||||
minVerticalPadding: 0,
|
||||
onTap: () {
|
||||
Navigator.pushNamed(
|
||||
context,
|
||||
AppRoutes.chatDetailed,
|
||||
arguments: {"targetUser": m.searchedChats![index]},
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
separatorBuilder: (BuildContext context, int index) => const Padding(
|
||||
padding: EdgeInsets.only(right: 10, left: 70),
|
||||
child: Divider(
|
||||
color: Color(0xFFE5E5E5),
|
||||
),
|
||||
),
|
||||
),
|
||||
// if (searchedUsersList == null) Utils.getNoChatWidget(context),
|
||||
backgroundColor: MyColors.white,
|
||||
appBar: AppBarWidget(
|
||||
context,
|
||||
title: LocaleKeys.chat.tr(),
|
||||
showHomeButton: true,
|
||||
),
|
||||
body: Column(
|
||||
children: <Widget>[
|
||||
Container(
|
||||
padding: const EdgeInsets.only(left: 21, right: 21, top: 16, bottom: 16),
|
||||
decoration: const BoxDecoration(
|
||||
borderRadius: BorderRadius.only(
|
||||
bottomLeft: Radius.circular(25),
|
||||
bottomRight: Radius.circular(25),
|
||||
),
|
||||
gradient: LinearGradient(
|
||||
transform: GradientRotation(.83),
|
||||
begin: Alignment.topRight,
|
||||
end: Alignment.bottomLeft,
|
||||
colors: <Color>[
|
||||
MyColors.gradiantEndColor,
|
||||
MyColors.gradiantStartColor,
|
||||
],
|
||||
);
|
||||
}),
|
||||
floatingActionButton: FloatingActionButton(
|
||||
child: Container(
|
||||
width: 60,
|
||||
height: 60,
|
||||
decoration: const BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
gradient: LinearGradient(
|
||||
transform: GradientRotation(.46),
|
||||
begin: Alignment.topRight,
|
||||
end: Alignment.bottomLeft,
|
||||
colors: [
|
||||
MyColors.gradiantEndColor,
|
||||
MyColors.gradiantStartColor,
|
||||
),
|
||||
),
|
||||
child: Row(
|
||||
children: <Widget>[
|
||||
myTab(LocaleKeys.mychats.tr(), 0),
|
||||
myTab(LocaleKeys.favorite.tr(), 1),
|
||||
],
|
||||
),
|
||||
),
|
||||
child: const Icon(
|
||||
Icons.add,
|
||||
size: 30,
|
||||
color: MyColors.white,
|
||||
),
|
||||
),
|
||||
onPressed: () async {
|
||||
// var userData = await ChatApiClient()
|
||||
// .getChatMemberFromSearch("aamir.muhammad", 36239);
|
||||
showMyBottomSheet(
|
||||
context,
|
||||
callBackFunc: (){},
|
||||
child: SearchEmployeeBottomSheet(
|
||||
title: LocaleKeys.searchForEmployee.tr(),
|
||||
apiMode: LocaleKeys.delegate.tr(),
|
||||
fromChat: true,
|
||||
onSelectEmployee: (_selectedEmployee) {
|
||||
// Navigator.pop(context);
|
||||
// selectedReplacementEmployee = _selectedEmployee;
|
||||
setState(() {});
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
PageView(
|
||||
controller: controller,
|
||||
physics: const NeverScrollableScrollPhysics(),
|
||||
onPageChanged: (int pageIndex) {
|
||||
setState(() {
|
||||
tabIndex = pageIndex;
|
||||
});
|
||||
},
|
||||
children: <Widget>[
|
||||
ChatHomeScreen(),
|
||||
ChatFavoriteUsersScreen(),
|
||||
],
|
||||
).expanded,
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Widget myTab(String title, int index) {
|
||||
bool isSelected = (index == tabIndex);
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
title.toText12(
|
||||
color: isSelected ? MyColors.white : MyColors.white.withOpacity(.74),
|
||||
isCenter: true,
|
||||
),
|
||||
4.height,
|
||||
Container(
|
||||
height: 8,
|
||||
width: 8,
|
||||
decoration: BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
color: isSelected ? MyColors.white : Colors.transparent,
|
||||
),
|
||||
).onPress(() {
|
||||
setState(() {
|
||||
// showFabOptions = true;
|
||||
});
|
||||
})
|
||||
],
|
||||
).onPress(() {
|
||||
controller.jumpToPage(index);
|
||||
}).expanded;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,268 @@
|
||||
import 'package:easy_localization/easy_localization.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:mohem_flutter_app/api/chat/chat_provider_model.dart';
|
||||
import 'package:mohem_flutter_app/app_state/app_state.dart';
|
||||
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||
import 'package:mohem_flutter_app/config/routes.dart';
|
||||
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||
import 'package:mohem_flutter_app/generated/locale_keys.g.dart';
|
||||
import 'package:mohem_flutter_app/widgets/bottom_sheet.dart';
|
||||
import 'package:mohem_flutter_app/widgets/bottom_sheets/search_employee_bottom_sheet.dart';
|
||||
import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class ChatHomeScreen extends StatefulWidget {
|
||||
@override
|
||||
State<ChatHomeScreen> createState() => _ChatHomeScreenState();
|
||||
}
|
||||
|
||||
class _ChatHomeScreenState extends State<ChatHomeScreen> {
|
||||
TextEditingController search = TextEditingController();
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
super.dispose();
|
||||
search.clear();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: MyColors.white,
|
||||
body: Consumer<ChatProviderModel>(
|
||||
builder: (BuildContext context, ChatProviderModel m, Widget? child) {
|
||||
return m.isLoading
|
||||
? ChatHomeShimmer()
|
||||
: ListView(
|
||||
shrinkWrap: true,
|
||||
physics: const AlwaysScrollableScrollPhysics(),
|
||||
children: <Widget>[
|
||||
Padding(
|
||||
padding: const EdgeInsets.symmetric(
|
||||
vertical: 20,
|
||||
horizontal: 20,
|
||||
),
|
||||
child: TextField(
|
||||
controller: m.search,
|
||||
onChanged: (String val) {
|
||||
m.filter(val);
|
||||
},
|
||||
decoration: InputDecoration(
|
||||
border: fieldBorder(
|
||||
radius: 5,
|
||||
color: 0xFFE5E5E5,
|
||||
),
|
||||
focusedBorder: fieldBorder(
|
||||
radius: 5,
|
||||
color: 0xFFE5E5E5,
|
||||
),
|
||||
enabledBorder: fieldBorder(
|
||||
radius: 5,
|
||||
color: 0xFFE5E5E5,
|
||||
),
|
||||
contentPadding: const EdgeInsets.symmetric(
|
||||
horizontal: 15,
|
||||
vertical: 10,
|
||||
),
|
||||
hintText: LocaleKeys.searchfromchat.tr(),
|
||||
hintStyle: const TextStyle(
|
||||
color: MyColors.lightTextColor,
|
||||
fontStyle: FontStyle.italic,
|
||||
),
|
||||
filled: true,
|
||||
fillColor: const Color(
|
||||
0xFFF7F7F7,
|
||||
),
|
||||
suffixIcon: m.search.text.isNotEmpty
|
||||
? IconButton(
|
||||
onPressed: () {
|
||||
m.clearSelections();
|
||||
},
|
||||
icon: const Icon(
|
||||
Icons.clear,
|
||||
size: 22,
|
||||
),
|
||||
color: MyColors.redA3Color,
|
||||
)
|
||||
: null,
|
||||
),
|
||||
),
|
||||
),
|
||||
if (m.searchedChats != null)
|
||||
ListView.separated(
|
||||
itemCount: m.searchedChats!.length,
|
||||
padding: const EdgeInsets.only(
|
||||
bottom: 80,
|
||||
),
|
||||
shrinkWrap: true,
|
||||
physics: const NeverScrollableScrollPhysics(),
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return SizedBox(
|
||||
height: 55,
|
||||
child: ListTile(
|
||||
leading: Stack(
|
||||
children: <Widget>[
|
||||
SvgPicture.asset(
|
||||
"assets/images/user.svg",
|
||||
height: 48,
|
||||
width: 48,
|
||||
),
|
||||
Positioned(
|
||||
right: 5,
|
||||
bottom: 1,
|
||||
child: Container(
|
||||
width: 10,
|
||||
height: 10,
|
||||
decoration: BoxDecoration(
|
||||
color: m.searchedChats![index].userStatus == 1 ? MyColors.green2DColor : Colors.red,
|
||||
borderRadius: const BorderRadius.all(
|
||||
Radius.circular(10),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
title: (m.searchedChats![index].userName!.replaceFirst(".", " ").capitalizeFirstofEach ?? "").toText14(color: MyColors.darkTextColor),
|
||||
// subtitle: (m.searchedChats![index].isTyping == true ? "Typing ..." : "").toText11(color: MyColors.normalTextColor),
|
||||
trailing: SizedBox(
|
||||
width: 60,
|
||||
child: Row(
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
mainAxisAlignment: MainAxisAlignment.end,
|
||||
mainAxisSize: MainAxisSize.max,
|
||||
children: <Widget>[
|
||||
// if (m.searchedChats![index].unreadMessageCount != null)
|
||||
// Flexible(
|
||||
// child: Container(
|
||||
// padding: EdgeInsets.zero,
|
||||
// alignment: Alignment.centerRight,
|
||||
// width: 18,
|
||||
// height: 18,
|
||||
// decoration: const BoxDecoration(
|
||||
// color: MyColors.redColor,
|
||||
// borderRadius: BorderRadius.all(
|
||||
// Radius.circular(20),
|
||||
// ),
|
||||
// ),
|
||||
// child: (m.searchedChats![index].unreadMessageCount!.toString())
|
||||
// .toText10(
|
||||
// color: MyColors.white,
|
||||
// )
|
||||
// .center,
|
||||
// ),
|
||||
// ),
|
||||
Flexible(
|
||||
child: IconButton(
|
||||
alignment: Alignment.centerRight,
|
||||
padding: EdgeInsets.zero,
|
||||
icon: Icon(
|
||||
m.searchedChats![index].isFav != null && m.searchedChats![index].isFav == false ? Icons.star_sharp : Icons.star_sharp,
|
||||
),
|
||||
color: m.searchedChats![index].isFav != null && m.searchedChats![index].isFav == true ? MyColors.yellowColor : MyColors.grey35Color,
|
||||
onPressed: () {
|
||||
if (m.searchedChats![index].isFav == null || m.searchedChats![index].isFav == false) {
|
||||
m.favoriteUser(
|
||||
userID: AppState().chatDetails!.response!.id!,
|
||||
targetUserID: m.searchedChats![index].id!,
|
||||
);
|
||||
} else if (m.searchedChats![index].isFav == true) {
|
||||
m.unFavoriteUser(
|
||||
userID: AppState().chatDetails!.response!.id!,
|
||||
targetUserID: m.searchedChats![index].id!,
|
||||
);
|
||||
} else {
|
||||
m.favoriteUser(
|
||||
userID: AppState().chatDetails!.response!.id!,
|
||||
targetUserID: m.searchedChats![index].id!,
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
),
|
||||
minVerticalPadding: 0,
|
||||
onTap: () {
|
||||
Navigator.pushNamed(
|
||||
context,
|
||||
AppRoutes.chatDetailed,
|
||||
arguments: {"targetUser": m.searchedChats![index], "isNewChat": false},
|
||||
).then((Object? value) {
|
||||
m.clearSelections();
|
||||
m.notifyListeners();
|
||||
});
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
separatorBuilder: (BuildContext context, int index) => const Padding(
|
||||
padding: EdgeInsets.only(
|
||||
right: 10,
|
||||
left: 70,
|
||||
),
|
||||
child: Divider(
|
||||
color: Color(
|
||||
0xFFE5E5E5,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
floatingActionButton: FloatingActionButton(
|
||||
child: Container(
|
||||
width: 60,
|
||||
height: 60,
|
||||
decoration: const BoxDecoration(
|
||||
shape: BoxShape.circle,
|
||||
gradient: LinearGradient(
|
||||
transform: GradientRotation(.46),
|
||||
begin: Alignment.topRight,
|
||||
end: Alignment.bottomLeft,
|
||||
colors: [
|
||||
MyColors.gradiantEndColor,
|
||||
MyColors.gradiantStartColor,
|
||||
],
|
||||
),
|
||||
),
|
||||
child: const Icon(
|
||||
Icons.add,
|
||||
size: 30,
|
||||
color: MyColors.white,
|
||||
),
|
||||
),
|
||||
onPressed: () async {
|
||||
showMyBottomSheet(
|
||||
context,
|
||||
callBackFunc: () {},
|
||||
child: SearchEmployeeBottomSheet(
|
||||
title: LocaleKeys.searchForEmployee.tr(),
|
||||
apiMode: LocaleKeys.delegate.tr(),
|
||||
fromChat: true,
|
||||
onSelectEmployee: (_selectedEmployee) {},
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
OutlineInputBorder fieldBorder({required double radius, required int color}) {
|
||||
return OutlineInputBorder(
|
||||
borderRadius: BorderRadius.circular(
|
||||
radius,
|
||||
),
|
||||
borderSide: BorderSide(
|
||||
color: Color(
|
||||
color,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
@ -0,0 +1,114 @@
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.dart';
|
||||
import 'package:mohem_flutter_app/api/chat/chat_provider_model.dart';
|
||||
import 'package:mohem_flutter_app/app_state/app_state.dart';
|
||||
import 'package:mohem_flutter_app/classes/colors.dart';
|
||||
import 'package:mohem_flutter_app/classes/utils.dart';
|
||||
import 'package:mohem_flutter_app/config/routes.dart';
|
||||
import 'package:mohem_flutter_app/extensions/string_extensions.dart';
|
||||
import 'package:mohem_flutter_app/extensions/widget_extensions.dart';
|
||||
import 'package:mohem_flutter_app/widgets/shimmer/dashboard_shimmer_widget.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class ChatFavoriteUsersScreen extends StatelessWidget {
|
||||
const ChatFavoriteUsersScreen({Key? key}) : super(key: key);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: MyColors.white,
|
||||
body: Consumer<ChatProviderModel>(
|
||||
builder: (BuildContext context, ChatProviderModel m, Widget? child) {
|
||||
if (m.isLoading) {
|
||||
return ChatHomeShimmer();
|
||||
} else {
|
||||
return m.favUsersList != null && m.favUsersList.isNotEmpty
|
||||
? ListView.separated(
|
||||
itemCount: m.favUsersList!.length,
|
||||
padding: const EdgeInsets.only(top: 20),
|
||||
shrinkWrap: true,
|
||||
physics: const NeverScrollableScrollPhysics(),
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return SizedBox(
|
||||
height: 55,
|
||||
child: ListTile(
|
||||
leading: Stack(
|
||||
children: <Widget>[
|
||||
SvgPicture.asset(
|
||||
"assets/images/user.svg",
|
||||
height: 48,
|
||||
width: 48,
|
||||
),
|
||||
Positioned(
|
||||
right: 5,
|
||||
bottom: 1,
|
||||
child: Container(
|
||||
width: 10,
|
||||
height: 10,
|
||||
decoration: BoxDecoration(
|
||||
color: m.favUsersList![index].userStatus == 1 ? MyColors.green2DColor : Colors.red,
|
||||
borderRadius: const BorderRadius.all(
|
||||
Radius.circular(10),
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
),
|
||||
title: (m.favUsersList![index].userName!.replaceFirst(".", " ").capitalizeFirstofEach ?? "").toText14(
|
||||
color: MyColors.darkTextColor,
|
||||
),
|
||||
trailing: IconButton(
|
||||
alignment: Alignment.centerRight,
|
||||
padding: EdgeInsets.zero,
|
||||
icon: Icon(
|
||||
m.favUsersList![index].isFav! ? Icons.star : Icons.star_border,
|
||||
),
|
||||
color: m.favUsersList![index].isFav! ? MyColors.yellowColor : MyColors.grey35Color,
|
||||
onPressed: () {
|
||||
if (m.favUsersList![index].isFav!)
|
||||
m.unFavoriteUser(
|
||||
userID: AppState().chatDetails!.response!.id!,
|
||||
targetUserID: m.favUsersList![index].id!,
|
||||
);
|
||||
},
|
||||
),
|
||||
minVerticalPadding: 0,
|
||||
onTap: () {
|
||||
Navigator.pushNamed(
|
||||
context,
|
||||
AppRoutes.chatDetailed,
|
||||
arguments: {"targetUser": m.favUsersList![index], "isNewChat": false},
|
||||
).then(
|
||||
(Object? value) {
|
||||
m.clearSelections();
|
||||
},
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
separatorBuilder: (BuildContext context, int index) => const Padding(
|
||||
padding: EdgeInsets.only(
|
||||
right: 10,
|
||||
left: 70,
|
||||
),
|
||||
child: Divider(
|
||||
color: Color(
|
||||
0xFFE5E5E5,
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
: Column(
|
||||
children: <Widget>[
|
||||
Utils.getNoDataWidget(context).expanded,
|
||||
],
|
||||
);
|
||||
}
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|